diff --git a/library/download-manager/build.gradle.kts b/library/download-manager/build.gradle.kts index c5f1888384..e18aed6798 100644 --- a/library/download-manager/build.gradle.kts +++ b/library/download-manager/build.gradle.kts @@ -1,6 +1,5 @@ plugins { id("godtools.library-conventions") - kotlin("kapt") alias(libs.plugins.ksp) } @@ -8,7 +7,6 @@ android { namespace = "org.cru.godtools.downloadmanager" configureCompose(project) - buildFeatures.dataBinding = true testOptions.unitTests.all { // enable spyk mocks for java.io.File @@ -28,7 +26,6 @@ dependencies { api(libs.androidx.work.ktx) implementation(libs.gtoSupport.androidx.work) - implementation(libs.gtoSupport.compat) implementation(libs.gtoSupport.dagger) implementation(libs.gtoSupport.kotlin.coroutines) diff --git a/library/sync/src/main/kotlin/org/cru/godtools/sync/task/ToolSyncTasks.kt b/library/sync/src/main/kotlin/org/cru/godtools/sync/task/ToolSyncTasks.kt index 1610e10ba0..65e0e1db12 100644 --- a/library/sync/src/main/kotlin/org/cru/godtools/sync/task/ToolSyncTasks.kt +++ b/library/sync/src/main/kotlin/org/cru/godtools/sync/task/ToolSyncTasks.kt @@ -175,7 +175,7 @@ internal class ToolSyncTasks @Inject internal constructor( try { viewsApi.submitViews(views).isSuccessful .also { if (it) toolsRepository.updateToolViews(code, 0 - views.quantity) } - } catch (ignored: IOException) { + } catch (_: IOException) { false } } diff --git a/ui/article-aem-renderer/src/main/kotlin/org/cru/godtools/article/aem/ui/AemArticleActivity.kt b/ui/article-aem-renderer/src/main/kotlin/org/cru/godtools/article/aem/ui/AemArticleActivity.kt index 1b2bdbec53..918c0e458b 100644 --- a/ui/article-aem-renderer/src/main/kotlin/org/cru/godtools/article/aem/ui/AemArticleActivity.kt +++ b/ui/article-aem-renderer/src/main/kotlin/org/cru/godtools/article/aem/ui/AemArticleActivity.kt @@ -9,6 +9,7 @@ import androidx.annotation.MainThread import androidx.core.net.toUri import androidx.fragment.app.commit import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.asLiveData import androidx.lifecycle.distinctUntilChanged import androidx.lifecycle.lifecycleScope import androidx.lifecycle.map @@ -67,6 +68,13 @@ class AemArticleActivity : setupDataModel() } + override fun onBindingChanged() { + super.onBindingChanged() + binding.manifest = viewModel.manifest.asLiveData() + binding.loadingProgress = viewModel.downloadProgress.asLiveData() + binding.loadingState = activeToolLoadingStateLiveData + } + override fun onStart() { super.onStart() loadFragmentIfNeeded() diff --git a/ui/article-renderer/src/main/kotlin/org/cru/godtools/article/ui/ArticlesActivity.kt b/ui/article-renderer/src/main/kotlin/org/cru/godtools/article/ui/ArticlesActivity.kt index 05a93bb425..7326a797b2 100644 --- a/ui/article-renderer/src/main/kotlin/org/cru/godtools/article/ui/ArticlesActivity.kt +++ b/ui/article-renderer/src/main/kotlin/org/cru/godtools/article/ui/ArticlesActivity.kt @@ -39,6 +39,13 @@ class ArticlesActivity : setupFragments() } + override fun onBindingChanged() { + super.onBindingChanged() + binding.manifest = viewModel.manifest.asLiveData() + binding.loadingProgress = viewModel.downloadProgress.asLiveData() + binding.loadingState = activeToolLoadingStateLiveData + } + override fun onOptionsItemSelected(item: MenuItem) = when (item.itemId) { android.R.id.home if (supportFragmentManager.backStackEntryCount > 0) -> { supportFragmentManager.popBackStack() diff --git a/ui/base-tool/build.gradle.kts b/ui/base-tool/build.gradle.kts index 777749dbb6..08395b219f 100644 --- a/ui/base-tool/build.gradle.kts +++ b/ui/base-tool/build.gradle.kts @@ -48,6 +48,7 @@ dependencies { implementation(libs.gtoSupport.androidx.recyclerview) implementation(libs.gtoSupport.animation) implementation(libs.gtoSupport.base) + implementation(libs.gtoSupport.compat) implementation(libs.gtoSupport.dagger) implementation(libs.gtoSupport.eventbus) implementation(libs.gtoSupport.kotlin.coroutines) diff --git a/ui/base-tool/src/main/kotlin/org/cru/godtools/base/tool/activity/BaseToolActivity.kt b/ui/base-tool/src/main/kotlin/org/cru/godtools/base/tool/activity/BaseToolActivity.kt index c205d877e0..06fbe382ad 100644 --- a/ui/base-tool/src/main/kotlin/org/cru/godtools/base/tool/activity/BaseToolActivity.kt +++ b/ui/base-tool/src/main/kotlin/org/cru/godtools/base/tool/activity/BaseToolActivity.kt @@ -7,7 +7,6 @@ import android.view.MenuItem import android.view.View import android.view.WindowManager import androidx.activity.viewModels -import androidx.annotation.CallSuper import androidx.annotation.LayoutRes import androidx.annotation.MainThread import androidx.annotation.StringRes @@ -68,7 +67,6 @@ import org.cru.godtools.shared.tool.parser.model.navBarColor import org.cru.godtools.shared.tool.parser.model.shareable.ShareableImage import org.cru.godtools.shared.tool.parser.model.tips.Tip import org.cru.godtools.sync.GodToolsSyncService -import org.cru.godtools.tool.BR import org.cru.godtools.tool.R import org.cru.godtools.tool.databinding.ToolGenericFragmentActivityBinding import org.greenrobot.eventbus.Subscribe @@ -110,15 +108,6 @@ abstract class BaseToolActivity(@LayoutRes contentLayoutId: Int eventBus.register(this, this) } - @CallSuper - override fun onBindingChanged() { - (binding as? ViewDataBinding)?.apply { - setVariable(BR.manifest, viewModel.manifest.asLiveData()) - setVariable(BR.loadingProgress, viewModel.downloadProgress.asLiveData()) - setVariable(BR.loadingState, activeToolLoadingStateLiveData) - } - } - override fun onSetupActionBar() { super.onSetupActionBar() setupToolbar() diff --git a/library/download-manager/src/main/kotlin/org/cru/godtools/downloadmanager/databinding/ProgressBarBindingAdapter.kt b/ui/base-tool/src/main/kotlin/org/cru/godtools/base/tool/databinding/adapters/ProgressBarBindingAdapter.kt similarity index 91% rename from library/download-manager/src/main/kotlin/org/cru/godtools/downloadmanager/databinding/ProgressBarBindingAdapter.kt rename to ui/base-tool/src/main/kotlin/org/cru/godtools/base/tool/databinding/adapters/ProgressBarBindingAdapter.kt index b51c371a4d..fb3d712033 100644 --- a/library/download-manager/src/main/kotlin/org/cru/godtools/downloadmanager/databinding/ProgressBarBindingAdapter.kt +++ b/ui/base-tool/src/main/kotlin/org/cru/godtools/base/tool/databinding/adapters/ProgressBarBindingAdapter.kt @@ -1,4 +1,4 @@ -package org.cru.godtools.downloadmanager.databinding +package org.cru.godtools.base.tool.databinding.adapters import android.view.View import android.widget.ProgressBar diff --git a/ui/base-tool/src/main/kotlin/org/cru/godtools/base/tool/ui/settings/ShareablesAdapter.kt b/ui/base-tool/src/main/kotlin/org/cru/godtools/base/tool/ui/settings/ShareablesAdapter.kt index 9e89a7ae44..2fda576074 100644 --- a/ui/base-tool/src/main/kotlin/org/cru/godtools/base/tool/ui/settings/ShareablesAdapter.kt +++ b/ui/base-tool/src/main/kotlin/org/cru/godtools/base/tool/ui/settings/ShareablesAdapter.kt @@ -9,8 +9,8 @@ import org.ccci.gto.android.common.androidx.recyclerview.adapter.SimpleDataBindi import org.cru.godtools.base.tool.databinding.ToolSettingsSheetCallbacks import org.cru.godtools.shared.tool.parser.model.shareable.Shareable import org.cru.godtools.shared.tool.parser.model.shareable.ShareableImage -import org.cru.godtools.tool.BR import org.cru.godtools.tool.R +import org.cru.godtools.tool.databinding.ToolSettingsItemShareableImageBinding class ShareablesAdapter(lifecycleOwner: LifecycleOwner, private val callbacks: ToolSettingsSheetCallbacks) : SimpleDataBindingAdapter(lifecycleOwner) { @@ -32,10 +32,14 @@ class ShareablesAdapter(lifecycleOwner: LifecycleOwner, private val callbacks: T override fun onViewDataBindingCreated(binding: ViewDataBinding, viewType: Int) { super.onViewDataBindingCreated(binding, viewType) - binding.setVariable(BR.callbacks, callbacks) + when (binding) { + is ToolSettingsItemShareableImageBinding -> binding.callbacks = callbacks + } } override fun onBindViewDataBinding(binding: ViewDataBinding, position: Int) { - binding.setVariable(BR.item, getItem(position)) + when (binding) { + is ToolSettingsItemShareableImageBinding -> binding.item = getItem(position) as? ShareableImage + } } } diff --git a/ui/base-tool/src/main/kotlin/org/cru/godtools/base/tool/ui/share/OtherActionsAdapter.kt b/ui/base-tool/src/main/kotlin/org/cru/godtools/base/tool/ui/share/OtherActionsAdapter.kt index bb4d9cba7c..2f20203ec9 100644 --- a/ui/base-tool/src/main/kotlin/org/cru/godtools/base/tool/ui/share/OtherActionsAdapter.kt +++ b/ui/base-tool/src/main/kotlin/org/cru/godtools/base/tool/ui/share/OtherActionsAdapter.kt @@ -7,7 +7,6 @@ import androidx.databinding.ViewDataBinding import androidx.lifecycle.LifecycleOwner import org.ccci.gto.android.common.androidx.recyclerview.adapter.SimpleDataBindingAdapter import org.cru.godtools.base.tool.ui.share.model.ShareItem -import org.cru.godtools.tool.BR class OtherActionsAdapter( lifecycleOwner: LifecycleOwner, @@ -24,11 +23,9 @@ class OtherActionsAdapter( override fun getItemViewType(position: Int) = items[position].actionLayout!! override fun onCreateViewDataBinding(parent: ViewGroup, viewType: Int): ViewDataBinding = - DataBindingUtil.inflate(LayoutInflater.from(parent.context), viewType, parent, false).also { - it.setVariable(BR.callbacks, callbacks) - } + DataBindingUtil.inflate(LayoutInflater.from(parent.context), viewType, parent, false) override fun onBindViewDataBinding(binding: ViewDataBinding, position: Int) { - binding.setVariable(BR.item, items[position]) + items[position].bindTo(binding, callbacks) } } diff --git a/ui/base-tool/src/main/kotlin/org/cru/godtools/base/tool/ui/share/ShareAppsAdapter.kt b/ui/base-tool/src/main/kotlin/org/cru/godtools/base/tool/ui/share/ShareAppsAdapter.kt index b0cad5f164..5d2f8cf3ba 100644 --- a/ui/base-tool/src/main/kotlin/org/cru/godtools/base/tool/ui/share/ShareAppsAdapter.kt +++ b/ui/base-tool/src/main/kotlin/org/cru/godtools/base/tool/ui/share/ShareAppsAdapter.kt @@ -6,8 +6,9 @@ import android.view.ViewGroup import androidx.databinding.DataBindingUtil import androidx.databinding.ViewDataBinding import org.ccci.gto.android.common.androidx.recyclerview.adapter.SimpleDataBindingAdapter -import org.cru.godtools.tool.BR import org.cru.godtools.tool.R +import org.cru.godtools.tool.databinding.ToolShareItemAppBinding +import org.cru.godtools.tool.databinding.ToolShareItemMoreBinding internal class ShareAppsAdapter(private val items: List, private val callbacks: Callbacks) : SimpleDataBindingAdapter() { @@ -24,14 +25,23 @@ internal class ShareAppsAdapter(private val items: List, private va override fun onCreateViewDataBinding(parent: ViewGroup, viewType: Int) = DataBindingUtil.inflate(LayoutInflater.from(parent.context), viewType, parent, false).also { - it.setVariable(BR.callbacks, callbacks) + when (it) { + is ToolShareItemAppBinding -> it.callbacks = callbacks + is ToolShareItemMoreBinding -> it.callbacks = callbacks + } } override fun onBindViewDataBinding(binding: ViewDataBinding, position: Int) { - binding.setVariable(BR.info, items.getOrNull(position)) + when (binding) { + is ToolShareItemAppBinding -> binding.info = items.getOrNull(position) + is ToolShareItemMoreBinding -> Unit + } } override fun onViewDataBindingRecycled(binding: ViewDataBinding) { - binding.setVariable(BR.info, null) + when (binding) { + is ToolShareItemAppBinding -> binding.info = null + is ToolShareItemMoreBinding -> Unit + } } } diff --git a/ui/base-tool/src/main/kotlin/org/cru/godtools/base/tool/ui/share/model/ShareItem.kt b/ui/base-tool/src/main/kotlin/org/cru/godtools/base/tool/ui/share/model/ShareItem.kt index f4d467a6bd..440f9d150c 100644 --- a/ui/base-tool/src/main/kotlin/org/cru/godtools/base/tool/ui/share/model/ShareItem.kt +++ b/ui/base-tool/src/main/kotlin/org/cru/godtools/base/tool/ui/share/model/ShareItem.kt @@ -4,7 +4,9 @@ import android.app.Activity import android.content.Intent import android.os.Parcelable import androidx.annotation.LayoutRes +import androidx.databinding.ViewDataBinding import org.ccci.gto.android.common.base.Ordered +import org.cru.godtools.base.tool.ui.share.OtherActionsAdapter.Callbacks interface ShareItem : Parcelable, @@ -13,6 +15,7 @@ interface ShareItem : @get:LayoutRes val actionLayout: Int? get() = null + fun bindTo(binding: ViewDataBinding, callbacks: Callbacks?) = Unit fun triggerAction(activity: Activity) val isValid get() = true diff --git a/ui/base-tool/src/main/kotlin/org/cru/godtools/base/tool/ui/shareable/model/ShareableImageShareItem.kt b/ui/base-tool/src/main/kotlin/org/cru/godtools/base/tool/ui/shareable/model/ShareableImageShareItem.kt index af46c4bf65..e2eb7f5be1 100644 --- a/ui/base-tool/src/main/kotlin/org/cru/godtools/base/tool/ui/shareable/model/ShareableImageShareItem.kt +++ b/ui/base-tool/src/main/kotlin/org/cru/godtools/base/tool/ui/shareable/model/ShareableImageShareItem.kt @@ -3,6 +3,7 @@ package org.cru.godtools.base.tool.ui.shareable.model import android.app.Activity import android.content.Context import android.content.Intent +import androidx.databinding.ViewDataBinding import androidx.fragment.app.FragmentActivity import dagger.assisted.Assisted import dagger.assisted.AssistedFactory @@ -16,10 +17,12 @@ import org.ccci.gto.android.common.base.Ordered import org.cru.godtools.base.ToolFileSystem import org.cru.godtools.base.tool.model.getFileBlocking import org.cru.godtools.base.tool.model.shareable.buildShareIntent +import org.cru.godtools.base.tool.ui.share.OtherActionsAdapter import org.cru.godtools.base.tool.ui.share.model.ShareItem import org.cru.godtools.base.tool.ui.shareable.ShareableImageBottomSheetDialogFragment import org.cru.godtools.shared.tool.parser.model.shareable.ShareableImage import org.cru.godtools.tool.R +import org.cru.godtools.tool.databinding.ToolShareItemShareableImageBinding @Parcelize class ShareableImageShareItem( @@ -48,6 +51,11 @@ class ShareableImageShareItem( } override val actionLayout get() = R.layout.tool_share_item_shareable_image + override fun bindTo(binding: ViewDataBinding, callbacks: OtherActionsAdapter.Callbacks?) { + require(binding is ToolShareItemShareableImageBinding) + binding.callbacks = callbacks + binding.item = this + } override val order get() = Ordered.LOWEST_PRECEDENCE diff --git a/ui/base/src/main/kotlin/org/cru/godtools/base/ui/Activities.kt b/ui/base/src/main/kotlin/org/cru/godtools/base/ui/Activities.kt index 3a4e3410ce..707a57f797 100644 --- a/ui/base/src/main/kotlin/org/cru/godtools/base/ui/Activities.kt +++ b/ui/base/src/main/kotlin/org/cru/godtools/base/ui/Activities.kt @@ -31,10 +31,6 @@ fun Activity.startDashboardActivity() = startActivity(createDashboardIntent()) private fun Context.createDashboardIntent() = Intent().setClassName(this, ACTIVITY_CLASS_DASHBOARD) // endregion DashboardActivity -// region AppLanguageActivity -fun Context.startAppLanguageActivity() = startActivity(createCircuitActivityIntent(AppLanguageScreen)) -// endregion AppLanguageActivity - // region ArticlesActivity private const val ACTIVITY_CLASS_ARTICLES = "org.cru.godtools.article.ui.ArticlesActivity" diff --git a/ui/cyoa-renderer/src/main/kotlin/org/cru/godtools/tool/cyoa/ui/CyoaActivity.kt b/ui/cyoa-renderer/src/main/kotlin/org/cru/godtools/tool/cyoa/ui/CyoaActivity.kt index eeb2db4ee4..2fabbf5ae6 100644 --- a/ui/cyoa-renderer/src/main/kotlin/org/cru/godtools/tool/cyoa/ui/CyoaActivity.kt +++ b/ui/cyoa-renderer/src/main/kotlin/org/cru/godtools/tool/cyoa/ui/CyoaActivity.kt @@ -9,6 +9,7 @@ import androidx.annotation.VisibleForTesting import androidx.fragment.app.FragmentManager.POP_BACK_STACK_INCLUSIVE import androidx.fragment.app.commit import androidx.lifecycle.asFlow +import androidx.lifecycle.asLiveData import dagger.hilt.android.AndroidEntryPoint import java.util.Locale import kotlinx.coroutines.flow.combine @@ -133,6 +134,9 @@ class CyoaActivity : // endregion Intent Processing private fun setupBinding() { + binding.manifest = viewModel.manifest.asLiveData() + binding.loadingProgress = viewModel.downloadProgress.asLiveData() + binding.loadingState = activeToolLoadingStateLiveData binding.activeLocale = dataModel.activeLocale binding.visibleLocales = dataModel.visibleLocales } diff --git a/ui/tract-renderer/src/main/kotlin/org/cru/godtools/tract/activity/TractActivity.kt b/ui/tract-renderer/src/main/kotlin/org/cru/godtools/tract/activity/TractActivity.kt index f781f0c0ed..b5adb0b0c0 100644 --- a/ui/tract-renderer/src/main/kotlin/org/cru/godtools/tract/activity/TractActivity.kt +++ b/ui/tract-renderer/src/main/kotlin/org/cru/godtools/tract/activity/TractActivity.kt @@ -280,6 +280,9 @@ class TractActivity : override val languageToggle get() = binding.languageToggle private fun setupBinding() { + binding.manifest = viewModel.manifest.asLiveData() + binding.loadingProgress = viewModel.downloadProgress.asLiveData() + binding.loadingState = activeToolLoadingStateLiveData binding.activeLocale = dataModel.activeLocale binding.visibleLocales = dataModel.visibleLocales } diff --git a/ui/tract-renderer/src/main/kotlin/org/cru/godtools/tract/ui/share/model/LiveShareItem.kt b/ui/tract-renderer/src/main/kotlin/org/cru/godtools/tract/ui/share/model/LiveShareItem.kt index 9597317e42..c63da73aa7 100644 --- a/ui/tract-renderer/src/main/kotlin/org/cru/godtools/tract/ui/share/model/LiveShareItem.kt +++ b/ui/tract-renderer/src/main/kotlin/org/cru/godtools/tract/ui/share/model/LiveShareItem.kt @@ -1,14 +1,22 @@ package org.cru.godtools.tract.ui.share.model import android.app.Activity +import androidx.databinding.ViewDataBinding import kotlinx.parcelize.Parcelize +import org.cru.godtools.base.tool.ui.share.OtherActionsAdapter import org.cru.godtools.base.tool.ui.share.model.ShareItem import org.cru.godtools.tool.tract.R +import org.cru.godtools.tool.tract.databinding.TractShareItemLiveShareBinding import org.cru.godtools.tract.activity.TractActivity @Parcelize class LiveShareItem : ShareItem { override val actionLayout get() = R.layout.tract_share_item_live_share + override fun bindTo(binding: ViewDataBinding, callbacks: OtherActionsAdapter.Callbacks?) { + require(binding is TractShareItemLiveShareBinding) + binding.callbacks = callbacks + binding.item = this + } override fun triggerAction(activity: Activity) { (activity as? TractActivity)?.showLiveShareTutorial()