From 393d4e621644112fbf146ed0442416518d8e22e8 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 28 Jan 2021 19:19:23 +0000 Subject: [PATCH 01/10] Bump deps.hilt from 2.30.1-alpha to 2.31.2-alpha Bumps `deps.hilt` from 2.30.1-alpha to 2.31.2-alpha. Updates `hilt-android-gradle-plugin` from 2.30.1-alpha to 2.31.2-alpha - [Release notes](https://github.com/google/dagger/releases) - [Changelog](https://github.com/google/dagger/blob/master/CHANGELOG.md) - [Commits](https://github.com/google/dagger/commits) Updates `hilt-android` from 2.30.1-alpha to 2.31.2-alpha - [Release notes](https://github.com/google/dagger/releases) - [Changelog](https://github.com/google/dagger/blob/master/CHANGELOG.md) - [Commits](https://github.com/google/dagger/commits) Updates `hilt-compiler` from 2.30.1-alpha to 2.31.2-alpha - [Release notes](https://github.com/google/dagger/releases) - [Changelog](https://github.com/google/dagger/blob/master/CHANGELOG.md) - [Commits](https://github.com/google/dagger/commits) Updates `hilt-android-testing` from 2.30.1-alpha to 2.31.2-alpha - [Release notes](https://github.com/google/dagger/releases) - [Changelog](https://github.com/google/dagger/blob/master/CHANGELOG.md) - [Commits](https://github.com/google/dagger/commits) Signed-off-by: dependabot-preview[bot] --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index d12128a49c..ae09de09c0 100644 --- a/build.gradle +++ b/build.gradle @@ -18,7 +18,7 @@ buildscript { gtoSupport : '3.7.2-SNAPSHOT', guava : '30.1-android', hamcrest : '2.2', - hilt : '2.30.1-alpha', + hilt : '2.31.2-alpha', jacoco : '0.8.6', jsoup : '1.13.1', junit : '4.13.1', From 0f77805e4a4dee5e831be1a4b42d0f2c576cfbd6 Mon Sep 17 00:00:00 2001 From: Daniel Frett Date: Tue, 19 Jan 2021 15:12:54 -0500 Subject: [PATCH 02/10] switch ViewModel in analytics module to use dagger hilt directly --- library/analytics/build.gradle | 3 --- .../cru/godtools/analytics/LaunchTrackingViewModel.kt | 9 +++++---- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/library/analytics/build.gradle b/library/analytics/build.gradle index 99f29b17ec..7c63e93567 100644 --- a/library/analytics/build.gradle +++ b/library/analytics/build.gradle @@ -30,8 +30,6 @@ dependencies { implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:${deps.kotlinCoroutines}" - implementation "androidx.hilt:hilt-lifecycle-viewmodel:${deps.androidX.hilt}" - implementation "com.google.firebase:firebase-core:${deps.firebase.core}" implementation "com.google.firebase:firebase-messaging:${deps.firebase.messaging}" implementation "com.google.firebase:firebase-perf:${deps.firebase.perf}" @@ -56,7 +54,6 @@ dependencies { testImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-test:${deps.kotlinCoroutines}" - kapt "androidx.hilt:hilt-compiler:${deps.androidX.hilt}" kapt "com.google.dagger:dagger-compiler:${deps.dagger}" kapt "com.google.dagger:hilt-compiler:${deps.hilt}" kapt "org.greenrobot:eventbus-annotation-processor:${deps.eventbus}" diff --git a/library/analytics/src/main/java/org/cru/godtools/analytics/LaunchTrackingViewModel.kt b/library/analytics/src/main/java/org/cru/godtools/analytics/LaunchTrackingViewModel.kt index 47c2715732..0ce07879f0 100644 --- a/library/analytics/src/main/java/org/cru/godtools/analytics/LaunchTrackingViewModel.kt +++ b/library/analytics/src/main/java/org/cru/godtools/analytics/LaunchTrackingViewModel.kt @@ -1,17 +1,18 @@ package org.cru.godtools.analytics -import androidx.hilt.Assisted -import androidx.hilt.lifecycle.ViewModelInject import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel +import dagger.hilt.android.lifecycle.HiltViewModel +import javax.inject.Inject import org.cru.godtools.analytics.model.LaunchAnalyticsActionEvent import org.cru.godtools.base.Settings import org.greenrobot.eventbus.EventBus -class LaunchTrackingViewModel @ViewModelInject constructor( +@HiltViewModel +class LaunchTrackingViewModel @Inject constructor( private val eventBus: EventBus, private val settings: Settings, - @Assisted private val state: SavedStateHandle + private val state: SavedStateHandle ) : ViewModel() { private var launchTracked: Boolean get() = state.get("launchTracked") ?: false From f32cd4c280c7939eed31e4c7f46d86fcfad99ab1 Mon Sep 17 00:00:00 2001 From: Daniel Frett Date: Tue, 19 Jan 2021 15:16:48 -0500 Subject: [PATCH 03/10] utilize Hilt ViewModel support for the base-tool module --- ui/base-tool/build.gradle | 2 -- .../base/tool/activity/BaseSingleToolActivityDataModel.kt | 6 ++++-- .../base/tool/viewmodel/LatestPublishedManifestDataModel.kt | 6 ++++-- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/ui/base-tool/build.gradle b/ui/base-tool/build.gradle index e038512671..bf5b401028 100644 --- a/ui/base-tool/build.gradle +++ b/ui/base-tool/build.gradle @@ -24,7 +24,6 @@ dependencies { implementation "androidx.constraintlayout:constraintlayout:${deps.androidX.constraintLayout}" implementation "androidx.core:core-ktx:${deps.androidX.core}" implementation "androidx.fragment:fragment-ktx:${deps.androidX.fragment}" - implementation "androidx.hilt:hilt-lifecycle-viewmodel:${deps.androidX.hilt}" implementation "androidx.lifecycle:lifecycle-livedata-ktx:${deps.androidX.lifecycle}" implementation "org.ccci.gto.android:gto-support-androidx-databinding:${deps.gtoSupport}" @@ -47,7 +46,6 @@ dependencies { implementation "com.squareup.picasso:picasso:${deps.picasso}" implementation "jp.wasabeef:picasso-transformations:${deps.picassoTransforms}" - kapt "androidx.hilt:hilt-compiler:${deps.androidX.hilt}" kapt "com.google.auto.value:auto-value:${deps.autoValue}" kapt "com.google.dagger:dagger-compiler:${deps.dagger}" kapt "com.google.dagger:hilt-compiler:${deps.hilt}" diff --git a/ui/base-tool/src/main/java/org/cru/godtools/base/tool/activity/BaseSingleToolActivityDataModel.kt b/ui/base-tool/src/main/java/org/cru/godtools/base/tool/activity/BaseSingleToolActivityDataModel.kt index 028176ed90..a6754eef9a 100644 --- a/ui/base-tool/src/main/java/org/cru/godtools/base/tool/activity/BaseSingleToolActivityDataModel.kt +++ b/ui/base-tool/src/main/java/org/cru/godtools/base/tool/activity/BaseSingleToolActivityDataModel.kt @@ -1,6 +1,7 @@ package org.cru.godtools.base.tool.activity -import androidx.hilt.lifecycle.ViewModelInject +import dagger.hilt.android.lifecycle.HiltViewModel +import javax.inject.Inject import org.ccci.gto.android.common.androidx.lifecycle.emptyLiveData import org.ccci.gto.android.common.androidx.lifecycle.switchCombineWith import org.cru.godtools.base.tool.service.ManifestManager @@ -8,7 +9,8 @@ import org.cru.godtools.base.tool.viewmodel.LatestPublishedManifestDataModel import org.cru.godtools.download.manager.GodToolsDownloadManager import org.keynote.godtools.android.db.GodToolsDao -internal class BaseSingleToolActivityDataModel @ViewModelInject constructor( +@HiltViewModel +internal class BaseSingleToolActivityDataModel @Inject constructor( manifestManager: ManifestManager, private val dao: GodToolsDao, private val downloadManager: GodToolsDownloadManager diff --git a/ui/base-tool/src/main/java/org/cru/godtools/base/tool/viewmodel/LatestPublishedManifestDataModel.kt b/ui/base-tool/src/main/java/org/cru/godtools/base/tool/viewmodel/LatestPublishedManifestDataModel.kt index 3784358d3a..9c1377412d 100644 --- a/ui/base-tool/src/main/java/org/cru/godtools/base/tool/viewmodel/LatestPublishedManifestDataModel.kt +++ b/ui/base-tool/src/main/java/org/cru/godtools/base/tool/viewmodel/LatestPublishedManifestDataModel.kt @@ -1,14 +1,16 @@ package org.cru.godtools.base.tool.viewmodel -import androidx.hilt.lifecycle.ViewModelInject import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel +import dagger.hilt.android.lifecycle.HiltViewModel import java.util.Locale +import javax.inject.Inject import org.ccci.gto.android.common.androidx.lifecycle.emptyLiveData import org.ccci.gto.android.common.androidx.lifecycle.switchCombineWith import org.cru.godtools.base.tool.service.ManifestManager -open class LatestPublishedManifestDataModel @ViewModelInject constructor(manifestManager: ManifestManager) : +@HiltViewModel +open class LatestPublishedManifestDataModel @Inject constructor(manifestManager: ManifestManager) : ViewModel() { val toolCode = MutableLiveData() val locale = MutableLiveData() From bf127703a7c97741b6f2e5ab8dde11f73d6f6ccb Mon Sep 17 00:00:00 2001 From: Daniel Frett Date: Tue, 19 Jan 2021 15:20:25 -0500 Subject: [PATCH 04/10] update AemArticleViewModel to utilize HiltViewModel --- ui/article-aem-renderer/build.gradle | 2 -- .../org/cru/godtools/article/aem/ui/AemArticleViewModel.kt | 6 ++++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ui/article-aem-renderer/build.gradle b/ui/article-aem-renderer/build.gradle index 57cae4bbc1..e4c4fe7dc4 100644 --- a/ui/article-aem-renderer/build.gradle +++ b/ui/article-aem-renderer/build.gradle @@ -32,7 +32,6 @@ dependencies { implementation "androidx.core:core-ktx:${deps.androidX.core}" implementation "androidx.fragment:fragment-ktx:${deps.androidX.fragment}" - implementation "androidx.hilt:hilt-lifecycle-viewmodel:${deps.androidX.hilt}" implementation "androidx.lifecycle:lifecycle-extensions:${deps.androidX.lifecycle}" implementation "androidx.lifecycle:lifecycle-livedata-ktx:${deps.androidX.lifecycle}" api "androidx.room:room-runtime:${deps.androidX.room}" @@ -59,7 +58,6 @@ dependencies { testImplementation "androidx.arch.core:core-testing:${deps.androidX.archCore}" testImplementation "androidx.room:room-testing:${deps.androidX.room}" - kapt "androidx.hilt:hilt-compiler:${deps.androidX.hilt}" kapt "androidx.room:room-compiler:${deps.androidX.room}" kapt "com.google.dagger:dagger-compiler:${deps.dagger}" kapt "com.google.dagger:hilt-compiler:${deps.hilt}" diff --git a/ui/article-aem-renderer/src/main/java/org/cru/godtools/article/aem/ui/AemArticleViewModel.kt b/ui/article-aem-renderer/src/main/java/org/cru/godtools/article/aem/ui/AemArticleViewModel.kt index cca56cf708..928f924c7f 100644 --- a/ui/article-aem-renderer/src/main/java/org/cru/godtools/article/aem/ui/AemArticleViewModel.kt +++ b/ui/article-aem-renderer/src/main/java/org/cru/godtools/article/aem/ui/AemArticleViewModel.kt @@ -8,16 +8,18 @@ import android.os.Build import android.view.ContextThemeWrapper import android.view.ViewGroup import android.webkit.WebView -import androidx.hilt.lifecycle.ViewModelInject import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.MutableLiveData import androidx.lifecycle.distinctUntilChanged import androidx.lifecycle.switchMap +import dagger.hilt.android.lifecycle.HiltViewModel +import javax.inject.Inject import org.ccci.gto.android.common.androidx.lifecycle.observe import org.cru.godtools.article.aem.R import org.cru.godtools.article.aem.db.ArticleDao -internal class AemArticleViewModel @ViewModelInject constructor( +@HiltViewModel +internal class AemArticleViewModel @Inject constructor( application: Application, private val articleDao: ArticleDao, private val webViewClient: ArticleWebViewClient From a83b387ee8a2a7fd281cad55781a809f44442f37 Mon Sep 17 00:00:00 2001 From: Daniel Frett Date: Tue, 19 Jan 2021 15:23:33 -0500 Subject: [PATCH 05/10] utilize HiltViewModel in article-renderer --- ui/article-renderer/build.gradle | 2 -- .../org/cru/godtools/article/ui/articles/ArticlesFragment.kt | 5 +++-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/ui/article-renderer/build.gradle b/ui/article-renderer/build.gradle index e27f709b77..2902b1a61e 100644 --- a/ui/article-renderer/build.gradle +++ b/ui/article-renderer/build.gradle @@ -15,7 +15,6 @@ dependencies { implementation "androidx.concurrent:concurrent-futures-ktx:${deps.androidX.concurrent}" implementation "androidx.fragment:fragment-ktx:${deps.androidX.fragment}" - implementation "androidx.hilt:hilt-lifecycle-viewmodel:${deps.androidX.hilt}" implementation "androidx.lifecycle:lifecycle-extensions:${deps.androidX.lifecycle}" implementation "androidx.lifecycle:lifecycle-livedata-ktx:${deps.androidX.lifecycle}" implementation "androidx.constraintlayout:constraintlayout:${deps.androidX.constraintLayout}" @@ -34,7 +33,6 @@ dependencies { implementation "com.google.guava:guava:${deps.guava}" implementation "com.louiscad.splitties:splitties-fragmentargs:${deps.splitties}" - kapt "androidx.hilt:hilt-compiler:${deps.androidX.hilt}" kapt "com.google.dagger:dagger-compiler:${deps.dagger}" kapt "com.google.dagger:hilt-compiler:${deps.hilt}" } diff --git a/ui/article-renderer/src/main/java/org/cru/godtools/article/ui/articles/ArticlesFragment.kt b/ui/article-renderer/src/main/java/org/cru/godtools/article/ui/articles/ArticlesFragment.kt index dbd0e18a52..e18f93a797 100644 --- a/ui/article-renderer/src/main/java/org/cru/godtools/article/ui/articles/ArticlesFragment.kt +++ b/ui/article-renderer/src/main/java/org/cru/godtools/article/ui/articles/ArticlesFragment.kt @@ -3,11 +3,11 @@ package org.cru.godtools.article.ui.articles import android.os.Bundle import androidx.concurrent.futures.await import androidx.fragment.app.viewModels -import androidx.hilt.lifecycle.ViewModelInject import androidx.lifecycle.MutableLiveData import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.DividerItemDecoration import dagger.hilt.android.AndroidEntryPoint +import dagger.hilt.android.lifecycle.HiltViewModel import java.util.Locale import javax.inject.Inject import kotlinx.coroutines.Dispatchers @@ -111,7 +111,8 @@ class ArticlesFragment : BaseToolFragment, ArticlesAdap // endregion View Logic } -class ArticlesFragmentDataModel @ViewModelInject constructor( +@HiltViewModel +class ArticlesFragmentDataModel @Inject constructor( manifestManager: ManifestManager, private val articleDao: ArticleDao ) : LatestPublishedManifestDataModel(manifestManager) { From e21698600b02f90ea7998f23f3e2dd894f8094f0 Mon Sep 17 00:00:00 2001 From: Daniel Frett Date: Tue, 19 Jan 2021 15:28:40 -0500 Subject: [PATCH 06/10] utilize HiltViewModel in tract-renderer module --- ui/tract-renderer/build.gradle | 2 -- .../org/cru/godtools/tract/activity/ModalActivity.kt | 5 +++-- .../godtools/tract/activity/TractActivityDataModel.kt | 9 +++++---- .../godtools/tract/liveshare/TractPublisherController.kt | 9 +++++---- .../tract/liveshare/TractSubscriberController.kt | 6 ++++-- .../tract/ui/tips/TipBottomSheetDialogFragment.kt | 5 +++-- 6 files changed, 20 insertions(+), 16 deletions(-) diff --git a/ui/tract-renderer/build.gradle b/ui/tract-renderer/build.gradle index fbd8d5f136..e6fd5d13d7 100644 --- a/ui/tract-renderer/build.gradle +++ b/ui/tract-renderer/build.gradle @@ -35,7 +35,6 @@ dependencies { implementation "androidx.cardview:cardview:${deps.androidX.cardView}" implementation "androidx.constraintlayout:constraintlayout:${deps.androidX.constraintLayout}" implementation "androidx.fragment:fragment-ktx:${deps.androidX.activity}" - implementation "androidx.hilt:hilt-lifecycle-viewmodel:${deps.androidX.hilt}" api "androidx.lifecycle:lifecycle-common-java8:${deps.androidX.lifecycle}" implementation "androidx.lifecycle:lifecycle-livedata-ktx:${deps.androidX.lifecycle}" implementation "com.google.android.instantapps:instantapps:${deps.androidInstantApps}" @@ -64,7 +63,6 @@ dependencies { implementation "com.tinder.statemachine:statemachine:${deps.tinderStateMachine}" implementation "jp.wasabeef:picasso-transformations:${deps.picassoTransforms}" - kapt "androidx.hilt:hilt-compiler:${deps.androidX.hilt}" kapt "com.google.dagger:dagger-compiler:${deps.dagger}" kapt "com.google.dagger:hilt-compiler:${deps.hilt}" kapt "org.greenrobot:eventbus-annotation-processor:${deps.eventbus}" diff --git a/ui/tract-renderer/src/main/java/org/cru/godtools/tract/activity/ModalActivity.kt b/ui/tract-renderer/src/main/java/org/cru/godtools/tract/activity/ModalActivity.kt index 53c3256406..387988be29 100644 --- a/ui/tract-renderer/src/main/java/org/cru/godtools/tract/activity/ModalActivity.kt +++ b/ui/tract-renderer/src/main/java/org/cru/godtools/tract/activity/ModalActivity.kt @@ -7,10 +7,10 @@ import androidx.activity.viewModels import androidx.annotation.MainThread import androidx.appcompat.widget.Toolbar import androidx.core.app.ActivityOptionsCompat -import androidx.hilt.lifecycle.ViewModelInject import androidx.lifecycle.MutableLiveData import androidx.lifecycle.distinctUntilChanged import dagger.hilt.android.AndroidEntryPoint +import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject import org.ccci.gto.android.common.androidx.lifecycle.combineWith import org.ccci.gto.android.common.util.os.getLocale @@ -98,7 +98,8 @@ class ModalActivity : BaseActivity(R.layout.tract_mod } } -class ModalActivityDataModel @ViewModelInject constructor(manifestManager: ManifestManager) : +@HiltViewModel +class ModalActivityDataModel @Inject constructor(manifestManager: ManifestManager) : LatestPublishedManifestDataModel(manifestManager) { val pageId = MutableLiveData() val modalId = MutableLiveData() diff --git a/ui/tract-renderer/src/main/java/org/cru/godtools/tract/activity/TractActivityDataModel.kt b/ui/tract-renderer/src/main/java/org/cru/godtools/tract/activity/TractActivityDataModel.kt index fa1804a355..5d6af363d2 100644 --- a/ui/tract-renderer/src/main/java/org/cru/godtools/tract/activity/TractActivityDataModel.kt +++ b/ui/tract-renderer/src/main/java/org/cru/godtools/tract/activity/TractActivityDataModel.kt @@ -2,8 +2,6 @@ package org.cru.godtools.tract.activity import androidx.annotation.VisibleForTesting import androidx.collection.LruCache -import androidx.hilt.Assisted -import androidx.hilt.lifecycle.ViewModelInject import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.SavedStateHandle @@ -11,7 +9,9 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.distinctUntilChanged import androidx.lifecycle.map import androidx.lifecycle.switchMap +import dagger.hilt.android.lifecycle.HiltViewModel import java.util.Locale +import javax.inject.Inject import javax.inject.Named import org.ccci.gto.android.common.androidx.lifecycle.ImmutableLiveData import org.ccci.gto.android.common.androidx.lifecycle.combineWith @@ -37,12 +37,13 @@ import org.keynote.godtools.android.db.GodToolsDao private const val STATE_ACTIVE_LOCALE = "activeLocale" private const val STATE_LIVE_SHARE_TUTORIAL_SHOWN = "liveShareTutorialShown" -class TractActivityDataModel @ViewModelInject constructor( +@HiltViewModel +class TractActivityDataModel @Inject constructor( private val dao: GodToolsDao, private val downloadManager: GodToolsDownloadManager, private val manifestManager: ManifestManager, @Named(IS_CONNECTED_LIVE_DATA) private val isConnected: LiveData, - @Assisted private val savedState: SavedStateHandle + private val savedState: SavedStateHandle ) : ViewModel() { val tool = MutableLiveData() val isInitialSyncFinished = MutableLiveData(false) diff --git a/ui/tract-renderer/src/main/java/org/cru/godtools/tract/liveshare/TractPublisherController.kt b/ui/tract-renderer/src/main/java/org/cru/godtools/tract/liveshare/TractPublisherController.kt index 4c400d1c35..9c91b2e4cc 100644 --- a/ui/tract-renderer/src/main/java/org/cru/godtools/tract/liveshare/TractPublisherController.kt +++ b/ui/tract-renderer/src/main/java/org/cru/godtools/tract/liveshare/TractPublisherController.kt @@ -1,14 +1,14 @@ package org.cru.godtools.tract.liveshare -import androidx.hilt.Assisted -import androidx.hilt.lifecycle.ViewModelInject import androidx.lifecycle.MutableLiveData import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.tinder.StateMachine import com.tinder.scarlet.WebSocket +import dagger.hilt.android.lifecycle.HiltViewModel import java.util.UUID +import javax.inject.Inject import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.Job import kotlinx.coroutines.channels.consumeEach @@ -26,11 +26,12 @@ import timber.log.Timber private const val TAG = "TractPublisherContrller" +@HiltViewModel @OptIn(ExperimentalCoroutinesApi::class) -class TractPublisherController @ViewModelInject constructor( +class TractPublisherController @Inject constructor( private val service: TractShareService, private val referenceLifecycle: ReferenceLifecycle, - @Assisted private val savedStateHandle: SavedStateHandle + private val savedStateHandle: SavedStateHandle ) : ViewModel() { private val channelId: String get() = savedStateHandle[PARAM_CHANNEL_ID] diff --git a/ui/tract-renderer/src/main/java/org/cru/godtools/tract/liveshare/TractSubscriberController.kt b/ui/tract-renderer/src/main/java/org/cru/godtools/tract/liveshare/TractSubscriberController.kt index 2d316d0614..67988cc1b5 100644 --- a/ui/tract-renderer/src/main/java/org/cru/godtools/tract/liveshare/TractSubscriberController.kt +++ b/ui/tract-renderer/src/main/java/org/cru/godtools/tract/liveshare/TractSubscriberController.kt @@ -1,11 +1,12 @@ package org.cru.godtools.tract.liveshare -import androidx.hilt.lifecycle.ViewModelInject import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.tinder.StateMachine import com.tinder.scarlet.WebSocket +import dagger.hilt.android.lifecycle.HiltViewModel +import javax.inject.Inject import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.Job @@ -23,8 +24,9 @@ import timber.log.Timber private const val TAG = "TractSubscribrControllr" +@HiltViewModel @OptIn(ExperimentalCoroutinesApi::class) -class TractSubscriberController @ViewModelInject internal constructor( +class TractSubscriberController @Inject internal constructor( private val service: TractShareService, private val referenceLifecycle: ReferenceLifecycle ) : ViewModel() { diff --git a/ui/tract-renderer/src/main/java/org/cru/godtools/tract/ui/tips/TipBottomSheetDialogFragment.kt b/ui/tract-renderer/src/main/java/org/cru/godtools/tract/ui/tips/TipBottomSheetDialogFragment.kt index bf77e20e2b..0cf85251b6 100644 --- a/ui/tract-renderer/src/main/java/org/cru/godtools/tract/ui/tips/TipBottomSheetDialogFragment.kt +++ b/ui/tract-renderer/src/main/java/org/cru/godtools/tract/ui/tips/TipBottomSheetDialogFragment.kt @@ -6,7 +6,6 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.viewModels -import androidx.hilt.lifecycle.ViewModelInject import androidx.lifecycle.MutableLiveData import androidx.lifecycle.distinctUntilChanged import androidx.lifecycle.map @@ -14,6 +13,7 @@ import androidx.viewpager2.widget.ViewPager2 import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetDialog import dagger.hilt.android.AndroidEntryPoint +import dagger.hilt.android.lifecycle.HiltViewModel import java.util.Locale import javax.inject.Inject import kotlinx.coroutines.GlobalScope @@ -141,7 +141,8 @@ class TipBottomSheetDialogFragment() : BaseBottomSheetDialogFragment Date: Tue, 19 Jan 2021 15:38:12 -0500 Subject: [PATCH 07/10] utilize HiltViewModel in app module --- app/build.gradle | 2 -- .../godtools/ui/languages/LanguageSettingsFragment.kt | 6 ++++-- .../godtools/ui/languages/LanguagesFragmentViewModel.kt | 9 +++++---- .../cru/godtools/ui/profile/GlobalActivityFragment.kt | 6 ++++-- .../ui/tooldetails/ToolDetailsFragmentDataModel.kt | 6 ++++-- .../cru/godtools/ui/tools/ToolsAdapterToolViewModel.kt | 6 ++++-- .../org/cru/godtools/ui/tools/ToolsFragmentDataModel.kt | 6 ++++-- 7 files changed, 25 insertions(+), 16 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index c166112d75..41419adbb7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -165,7 +165,6 @@ dependencies { implementation "androidx.constraintlayout:constraintlayout:${deps.androidX.constraintLayout}" implementation "androidx.fragment:fragment-ktx:${deps.androidX.fragment}" - implementation "androidx.hilt:hilt-lifecycle-viewmodel:${deps.androidX.hilt}" implementation "androidx.lifecycle:lifecycle-extensions:${deps.androidX.lifecycle}" implementation "androidx.lifecycle:lifecycle-livedata-ktx:${deps.androidX.lifecycle}" implementation "androidx.swiperefreshlayout:swiperefreshlayout:${deps.androidX.swipeRefreshLayout}" @@ -216,7 +215,6 @@ dependencies { debugImplementation 'com.facebook.soloader:soloader:0.9.0' debugImplementation "com.squareup.leakcanary:leakcanary-android:${deps.leakcanary}" - kapt "androidx.hilt:hilt-compiler:${deps.androidX.hilt}" kapt "com.google.dagger:dagger-compiler:${deps.dagger}" kapt "com.google.dagger:hilt-compiler:${deps.hilt}" kapt "org.greenrobot:eventbus-annotation-processor:${deps.eventbus}" diff --git a/app/src/main/java/org/cru/godtools/ui/languages/LanguageSettingsFragment.kt b/app/src/main/java/org/cru/godtools/ui/languages/LanguageSettingsFragment.kt index 52261463d7..61774e71a3 100644 --- a/app/src/main/java/org/cru/godtools/ui/languages/LanguageSettingsFragment.kt +++ b/app/src/main/java/org/cru/godtools/ui/languages/LanguageSettingsFragment.kt @@ -2,10 +2,11 @@ package org.cru.godtools.ui.languages import android.os.Bundle import androidx.fragment.app.viewModels -import androidx.hilt.lifecycle.ViewModelInject import androidx.lifecycle.ViewModel import androidx.lifecycle.switchMap import dagger.hilt.android.AndroidEntryPoint +import dagger.hilt.android.lifecycle.HiltViewModel +import javax.inject.Inject import org.ccci.gto.android.common.androidx.lifecycle.orEmpty import org.ccci.gto.android.common.db.findLiveData import org.cru.godtools.R @@ -34,7 +35,8 @@ class LanguageSettingsFragment : override fun editParallelLanguage() = requireActivity().startLanguageSelectionActivity(false) } -class LanguageSettingsFragmentDataModel @ViewModelInject constructor(dao: GodToolsDao, settings: Settings) : +@HiltViewModel +class LanguageSettingsFragmentDataModel @Inject constructor(dao: GodToolsDao, settings: Settings) : ViewModel() { val primaryLanguage = settings.primaryLanguageLiveData.switchMap { dao.findLiveData(it) } val parallelLanguage = diff --git a/app/src/main/java/org/cru/godtools/ui/languages/LanguagesFragmentViewModel.kt b/app/src/main/java/org/cru/godtools/ui/languages/LanguagesFragmentViewModel.kt index 6f50f8535f..4f28048df6 100644 --- a/app/src/main/java/org/cru/godtools/ui/languages/LanguagesFragmentViewModel.kt +++ b/app/src/main/java/org/cru/godtools/ui/languages/LanguagesFragmentViewModel.kt @@ -1,17 +1,17 @@ package org.cru.godtools.ui.languages import android.content.Context -import androidx.hilt.Assisted -import androidx.hilt.lifecycle.ViewModelInject import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel import androidx.lifecycle.distinctUntilChanged import androidx.lifecycle.switchMap +import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.qualifiers.ApplicationContext import java.text.Collator import java.util.Locale +import javax.inject.Inject import org.ccci.gto.android.common.androidx.lifecycle.combineWith import org.ccci.gto.android.common.db.Query import org.ccci.gto.android.common.db.getAsLiveData @@ -23,11 +23,12 @@ import org.keynote.godtools.android.db.GodToolsDao private const val KEY_QUERY = "query" private const val KEY_IS_SEARCH_VIEW_OPEN = "isSearchViewOpen" -class LanguagesFragmentViewModel @ViewModelInject constructor( +@HiltViewModel +class LanguagesFragmentViewModel @Inject constructor( @ApplicationContext context: Context, dao: GodToolsDao, settings: Settings, - @Assisted private val savedState: SavedStateHandle + private val savedState: SavedStateHandle ) : ViewModel() { val isPrimary = MutableLiveData(true) diff --git a/app/src/main/java/org/cru/godtools/ui/profile/GlobalActivityFragment.kt b/app/src/main/java/org/cru/godtools/ui/profile/GlobalActivityFragment.kt index 89364fbdab..51ff8b59d8 100644 --- a/app/src/main/java/org/cru/godtools/ui/profile/GlobalActivityFragment.kt +++ b/app/src/main/java/org/cru/godtools/ui/profile/GlobalActivityFragment.kt @@ -2,9 +2,10 @@ package org.cru.godtools.ui.profile import android.os.Bundle import androidx.fragment.app.viewModels -import androidx.hilt.lifecycle.ViewModelInject import androidx.lifecycle.ViewModel import dagger.hilt.android.AndroidEntryPoint +import dagger.hilt.android.lifecycle.HiltViewModel +import javax.inject.Inject import org.ccci.gto.android.common.db.findLiveData import org.ccci.gto.android.common.sync.swiperefreshlayout.widget.SwipeRefreshSyncHelper import org.cru.godtools.R @@ -28,6 +29,7 @@ class GlobalActivityFragment : } } -class GlobalActivityFragmentViewModel @ViewModelInject constructor(dao: GodToolsDao) : ViewModel() { +@HiltViewModel +class GlobalActivityFragmentViewModel @Inject constructor(dao: GodToolsDao) : ViewModel() { val globalActivity = dao.findLiveData(1) } diff --git a/app/src/main/java/org/cru/godtools/ui/tooldetails/ToolDetailsFragmentDataModel.kt b/app/src/main/java/org/cru/godtools/ui/tooldetails/ToolDetailsFragmentDataModel.kt index d18679bee7..0e43fe0781 100644 --- a/app/src/main/java/org/cru/godtools/ui/tooldetails/ToolDetailsFragmentDataModel.kt +++ b/app/src/main/java/org/cru/godtools/ui/tooldetails/ToolDetailsFragmentDataModel.kt @@ -1,12 +1,13 @@ package org.cru.godtools.ui.tooldetails -import androidx.hilt.lifecycle.ViewModelInject import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.distinctUntilChanged import androidx.lifecycle.map import androidx.lifecycle.switchMap +import dagger.hilt.android.lifecycle.HiltViewModel +import javax.inject.Inject import org.ccci.gto.android.common.androidx.lifecycle.emptyLiveData import org.ccci.gto.android.common.androidx.lifecycle.orEmpty import org.ccci.gto.android.common.androidx.lifecycle.switchCombineWith @@ -23,7 +24,8 @@ import org.cru.godtools.shortcuts.GodToolsShortcutManager import org.keynote.godtools.android.db.Contract.TranslationTable import org.keynote.godtools.android.db.GodToolsDao -class ToolDetailsFragmentDataModel @ViewModelInject constructor( +@HiltViewModel +class ToolDetailsFragmentDataModel @Inject constructor( private val dao: GodToolsDao, private val downloadManager: GodToolsDownloadManager, manifestManager: ManifestManager, diff --git a/app/src/main/java/org/cru/godtools/ui/tools/ToolsAdapterToolViewModel.kt b/app/src/main/java/org/cru/godtools/ui/tools/ToolsAdapterToolViewModel.kt index f8a6e64d12..5c5b325066 100644 --- a/app/src/main/java/org/cru/godtools/ui/tools/ToolsAdapterToolViewModel.kt +++ b/app/src/main/java/org/cru/godtools/ui/tools/ToolsAdapterToolViewModel.kt @@ -1,11 +1,12 @@ package org.cru.godtools.ui.tools -import androidx.hilt.lifecycle.ViewModelInject import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.distinctUntilChanged import androidx.lifecycle.map import androidx.lifecycle.switchMap +import dagger.hilt.android.lifecycle.HiltViewModel +import javax.inject.Inject import org.ccci.gto.android.common.androidx.lifecycle.combineWith import org.ccci.gto.android.common.androidx.lifecycle.emptyLiveData import org.ccci.gto.android.common.androidx.lifecycle.orEmpty @@ -21,7 +22,8 @@ import org.keynote.godtools.android.db.Contract.AttachmentTable import org.keynote.godtools.android.db.Contract.ToolTable import org.keynote.godtools.android.db.GodToolsDao -class ToolsAdapterToolViewModel @ViewModelInject constructor( +@HiltViewModel +class ToolsAdapterToolViewModel @Inject constructor( private val dao: GodToolsDao, private val downloadManager: GodToolsDownloadManager, settings: Settings diff --git a/app/src/main/java/org/cru/godtools/ui/tools/ToolsFragmentDataModel.kt b/app/src/main/java/org/cru/godtools/ui/tools/ToolsFragmentDataModel.kt index 30bd20754e..ad319cc4cc 100644 --- a/app/src/main/java/org/cru/godtools/ui/tools/ToolsFragmentDataModel.kt +++ b/app/src/main/java/org/cru/godtools/ui/tools/ToolsFragmentDataModel.kt @@ -1,11 +1,12 @@ package org.cru.godtools.ui.tools -import androidx.hilt.lifecycle.ViewModelInject import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.distinctUntilChanged import androidx.lifecycle.switchMap +import dagger.hilt.android.lifecycle.HiltViewModel import java.util.Locale +import javax.inject.Inject import org.ccci.gto.android.common.androidx.lifecycle.combineWith import org.ccci.gto.android.common.db.Query import org.ccci.gto.android.common.db.getAsLiveData @@ -20,7 +21,8 @@ import org.cru.godtools.widget.BannerType import org.keynote.godtools.android.db.Contract.ToolTable import org.keynote.godtools.android.db.GodToolsDao -class ToolsFragmentDataModel @ViewModelInject constructor(private val dao: GodToolsDao, settings: Settings) : +@HiltViewModel +class ToolsFragmentDataModel @Inject constructor(private val dao: GodToolsDao, settings: Settings) : ViewModel() { val mode = MutableLiveData(MODE_ADDED) From 041bca6b975c604544da40848d2d554c4649596d Mon Sep 17 00:00:00 2001 From: Daniel Frett Date: Tue, 19 Jan 2021 15:39:55 -0500 Subject: [PATCH 08/10] remove unused andoridx.hilt dependency --- build.gradle | 1 - 1 file changed, 1 deletion(-) diff --git a/build.gradle b/build.gradle index ae09de09c0..5b7ef9c853 100644 --- a/build.gradle +++ b/build.gradle @@ -59,7 +59,6 @@ buildscript { core : '1.3.2', databinding : deps.gradleAndroidPlugin, fragment : '1.2.5', - hilt : '1.0.0-alpha02', lifecycle : '2.2.0', loader : '1.1.0', multidex : '2.0.1', From ffd34f440bf819ca62b0440aee6f835ecbcf540a Mon Sep 17 00:00:00 2001 From: Daniel Frett Date: Fri, 29 Jan 2021 10:18:05 -0500 Subject: [PATCH 09/10] we don't use the viewModel mock at all in the test --- .../cru/godtools/databinding/ToolsListItemToolBindingTest.kt | 3 --- 1 file changed, 3 deletions(-) diff --git a/app/src/test/java/org/cru/godtools/databinding/ToolsListItemToolBindingTest.kt b/app/src/test/java/org/cru/godtools/databinding/ToolsListItemToolBindingTest.kt index 0596b4d6cc..79aabe1e49 100644 --- a/app/src/test/java/org/cru/godtools/databinding/ToolsListItemToolBindingTest.kt +++ b/app/src/test/java/org/cru/godtools/databinding/ToolsListItemToolBindingTest.kt @@ -17,7 +17,6 @@ import org.cru.godtools.model.Language import org.cru.godtools.model.Tool import org.cru.godtools.model.Translation import org.cru.godtools.ui.tools.ToolsAdapterCallbacks -import org.cru.godtools.ui.tools.ToolsAdapterToolViewModel import org.junit.Assert.assertEquals import org.junit.Assert.assertFalse import org.junit.Assert.assertTrue @@ -33,7 +32,6 @@ import org.robolectric.annotation.Config class ToolsListItemToolBindingTest { private lateinit var binding: ToolsListItemToolBinding private lateinit var callbacks: ToolsAdapterCallbacks - private lateinit var viewModel: ToolsAdapterToolViewModel private val tool = Tool().apply { type = Tool.Type.TRACT code = "test" @@ -56,7 +54,6 @@ class ToolsListItemToolBindingTest { fun createBinding() { val activityController = Robolectric.buildActivity(MainActivity::class.java) callbacks = mock() - viewModel = mock() binding = ToolsListItemToolBinding.inflate(LayoutInflater.from(activityController.get()), null, false) binding.lifecycleOwner = activityController.get() From 4d5ffe2357e3dd65b6bb5b519ffb721367d01707 Mon Sep 17 00:00:00 2001 From: Daniel Frett Date: Fri, 29 Jan 2021 10:21:57 -0500 Subject: [PATCH 10/10] consolidate the ToolAdapterToolViewModels into a single ViewModel --- .../org/cru/godtools/ui/tools/ToolsAdapter.kt | 20 +++-- .../ui/tools/ToolsAdapterToolViewModel.kt | 73 ------------------- .../ui/tools/ToolsAdapterViewModel.kt | 65 +++++++++++++++++ 3 files changed, 74 insertions(+), 84 deletions(-) delete mode 100644 app/src/main/java/org/cru/godtools/ui/tools/ToolsAdapterToolViewModel.kt create mode 100644 app/src/main/java/org/cru/godtools/ui/tools/ToolsAdapterViewModel.kt diff --git a/app/src/main/java/org/cru/godtools/ui/tools/ToolsAdapter.kt b/app/src/main/java/org/cru/godtools/ui/tools/ToolsAdapter.kt index e70641d0e5..42d474115e 100644 --- a/app/src/main/java/org/cru/godtools/ui/tools/ToolsAdapter.kt +++ b/app/src/main/java/org/cru/godtools/ui/tools/ToolsAdapter.kt @@ -17,16 +17,16 @@ import org.ccci.gto.android.common.recyclerview.advrecyclerview.draggable.Simple import org.cru.godtools.databinding.ToolsListItemToolBinding import org.cru.godtools.model.Tool -private const val VIEW_MODEL_KEY_PREFIX = - "org.cru.godtools.ui.tools.ToolsAdapter:org.cru.godtools.ui.tools.ToolsAdapterToolViewModel" private typealias VH = DataBindingDraggableItemViewHolder -class ToolsAdapter(lifecycleOwner: LifecycleOwner, private val viewModelProvider: ViewModelProvider) : +class ToolsAdapter(lifecycleOwner: LifecycleOwner, viewModelProvider: ViewModelProvider) : SimpleDataBindingDraggableItemAdapter(lifecycleOwner), Observer> { init { setHasStableIds(true) } + private val viewModel = viewModelProvider.get(ToolsAdapterViewModel::class.java) + val callbacks = ObservableField() private var tools: List? = null set(value) { @@ -54,16 +54,14 @@ class ToolsAdapter(lifecycleOwner: LifecycleOwner, private val viewModelProvider override fun onBindViewDataBinding(binding: ToolsListItemToolBinding, position: Int) { val tool = getItem(position) - val code = tool?.code - val viewModel = viewModelProvider.get("$VIEW_MODEL_KEY_PREFIX:$code", ToolsAdapterToolViewModel::class.java) - .also { it.toolCode.value = code } + val toolViewModel = tool?.code?.let { viewModel.getToolViewModel(it) } binding.tool = tool - binding.setDownloadProgress(viewModel.downloadProgress) - binding.setBanner(viewModel.banner) - binding.primaryTranslation = viewModel.firstTranslation - binding.parallelTranslation = viewModel.parallelTranslation - binding.parallelLanguage = viewModel.parallelLanguage + binding.setDownloadProgress(toolViewModel?.downloadProgress) + binding.setBanner(toolViewModel?.banner) + binding.primaryTranslation = toolViewModel?.firstTranslation + binding.parallelTranslation = toolViewModel?.parallelTranslation + binding.parallelLanguage = toolViewModel?.parallelLanguage } override fun onDetachedFromRecyclerView(recyclerView: RecyclerView) { diff --git a/app/src/main/java/org/cru/godtools/ui/tools/ToolsAdapterToolViewModel.kt b/app/src/main/java/org/cru/godtools/ui/tools/ToolsAdapterToolViewModel.kt deleted file mode 100644 index 5c5b325066..0000000000 --- a/app/src/main/java/org/cru/godtools/ui/tools/ToolsAdapterToolViewModel.kt +++ /dev/null @@ -1,73 +0,0 @@ -package org.cru.godtools.ui.tools - -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -import androidx.lifecycle.distinctUntilChanged -import androidx.lifecycle.map -import androidx.lifecycle.switchMap -import dagger.hilt.android.lifecycle.HiltViewModel -import javax.inject.Inject -import org.ccci.gto.android.common.androidx.lifecycle.combineWith -import org.ccci.gto.android.common.androidx.lifecycle.emptyLiveData -import org.ccci.gto.android.common.androidx.lifecycle.orEmpty -import org.ccci.gto.android.common.androidx.lifecycle.switchCombineWith -import org.ccci.gto.android.common.db.Query -import org.ccci.gto.android.common.db.findLiveData -import org.ccci.gto.android.common.db.getAsLiveData -import org.cru.godtools.base.Settings -import org.cru.godtools.download.manager.GodToolsDownloadManager -import org.cru.godtools.model.Attachment -import org.cru.godtools.model.Language -import org.keynote.godtools.android.db.Contract.AttachmentTable -import org.keynote.godtools.android.db.Contract.ToolTable -import org.keynote.godtools.android.db.GodToolsDao - -@HiltViewModel -class ToolsAdapterToolViewModel @Inject constructor( - private val dao: GodToolsDao, - private val downloadManager: GodToolsDownloadManager, - settings: Settings -) : ViewModel() { - internal val toolCode = MutableLiveData() - private val distinctToolCode = toolCode.distinctUntilChanged() - - val banner = distinctToolCode.switchMap { - it?.let { - Query.select() - .join(AttachmentTable.SQL_JOIN_TOOL) - .where( - ToolTable.FIELD_CODE.eq(it) - .and(ToolTable.FIELD_BANNER.eq(AttachmentTable.FIELD_ID)) - .and(AttachmentTable.SQL_WHERE_DOWNLOADED) - ) - .limit(1) - .getAsLiveData(dao) - }.orEmpty() - }.map { it?.firstOrNull() } - - private val primaryTranslation = distinctToolCode.switchCombineWith(settings.primaryLanguageLiveData) { c, l -> - dao.getLatestTranslationLiveData(c, l) - } - private val defaultTranslation = - distinctToolCode.switchMap { dao.getLatestTranslationLiveData(it, Settings.defaultLanguage) } - internal val firstTranslation = primaryTranslation.combineWith(defaultTranslation) { p, d -> p ?: d } - internal val parallelTranslation = distinctToolCode.switchCombineWith(settings.parallelLanguageLiveData) { c, l -> - dao.getLatestTranslationLiveData(c, l) - } - - internal val parallelLanguage = parallelTranslation.switchMap { t -> - t?.languageCode?.let { dao.findLiveData(it) }.orEmpty() - } - - internal val downloadProgress = distinctToolCode.switchCombineWith( - primaryTranslation, defaultTranslation, parallelTranslation - ) { code, primary, default, parallel -> - when { - code == null -> emptyLiveData() - primary != null -> downloadManager.getDownloadProgressLiveData(code, primary.languageCode) - default != null -> downloadManager.getDownloadProgressLiveData(code, default.languageCode) - parallel != null -> downloadManager.getDownloadProgressLiveData(code, parallel.languageCode) - else -> emptyLiveData() - } - } -} diff --git a/app/src/main/java/org/cru/godtools/ui/tools/ToolsAdapterViewModel.kt b/app/src/main/java/org/cru/godtools/ui/tools/ToolsAdapterViewModel.kt new file mode 100644 index 0000000000..2dcb4b847d --- /dev/null +++ b/app/src/main/java/org/cru/godtools/ui/tools/ToolsAdapterViewModel.kt @@ -0,0 +1,65 @@ +package org.cru.godtools.ui.tools + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.map +import androidx.lifecycle.switchMap +import dagger.hilt.android.lifecycle.HiltViewModel +import javax.inject.Inject +import org.ccci.gto.android.common.androidx.lifecycle.combineWith +import org.ccci.gto.android.common.androidx.lifecycle.emptyLiveData +import org.ccci.gto.android.common.androidx.lifecycle.orEmpty +import org.ccci.gto.android.common.androidx.lifecycle.switchCombineWith +import org.ccci.gto.android.common.db.Query +import org.ccci.gto.android.common.db.findLiveData +import org.ccci.gto.android.common.db.getAsLiveData +import org.cru.godtools.base.Settings +import org.cru.godtools.download.manager.GodToolsDownloadManager +import org.cru.godtools.model.Attachment +import org.cru.godtools.model.Language +import org.keynote.godtools.android.db.Contract.AttachmentTable +import org.keynote.godtools.android.db.Contract.ToolTable +import org.keynote.godtools.android.db.GodToolsDao + +@HiltViewModel +class ToolsAdapterViewModel @Inject constructor( + private val dao: GodToolsDao, + private val downloadManager: GodToolsDownloadManager, + private val settings: Settings +) : ViewModel() { + private val toolViewModels = mutableMapOf() + fun getToolViewModel(tool: String) = toolViewModels.getOrPut(tool) { ToolViewModel(tool) } + + inner class ToolViewModel(private val tool: String) { + val banner = Query.select() + .join(AttachmentTable.SQL_JOIN_TOOL) + .where( + ToolTable.FIELD_CODE.eq(tool) + .and(ToolTable.FIELD_BANNER.eq(AttachmentTable.FIELD_ID)) + .and(AttachmentTable.SQL_WHERE_DOWNLOADED) + ) + .limit(1) + .getAsLiveData(dao) + .map { it.firstOrNull() } + + private val primaryTranslation = + settings.primaryLanguageLiveData.switchMap { dao.getLatestTranslationLiveData(tool, it) } + private val defaultTranslation = dao.getLatestTranslationLiveData(tool, Settings.defaultLanguage) + internal val firstTranslation = primaryTranslation.combineWith(defaultTranslation) { p, d -> p ?: d } + internal val parallelTranslation = + settings.parallelLanguageLiveData.switchMap { dao.getLatestTranslationLiveData(tool, it) } + + internal val parallelLanguage = parallelTranslation.switchMap { t -> + t?.languageCode?.let { dao.findLiveData(it) }.orEmpty() + } + + internal val downloadProgress = + primaryTranslation.switchCombineWith(defaultTranslation, parallelTranslation) { prim, def, para -> + when { + prim != null -> downloadManager.getDownloadProgressLiveData(tool, prim.languageCode) + def != null -> downloadManager.getDownloadProgressLiveData(tool, def.languageCode) + para != null -> downloadManager.getDownloadProgressLiveData(tool, para.languageCode) + else -> emptyLiveData() + } + } + } +}