From d8216fa7306f5d3b61164e552814c91477072227 Mon Sep 17 00:00:00 2001 From: Aitor Viana Date: Mon, 8 Mar 2021 09:21:46 +0100 Subject: [PATCH 1/2] Refactor the ViewModelFactory to use multibindings --- .../app/bookmarks/ui/BookmarksViewModel.kt | 37 +++ .../app/brokensite/BrokenSiteViewModel.kt | 35 +++ .../app/browser/BrowserTabViewModel.kt | 124 +++++++++ .../app/browser/BrowserViewModel.kt | 48 ++++ .../feedback/ui/common/FeedbackViewModel.kt | 35 +++ .../InitialFeedbackFragmentViewModel.kt | 29 +++ .../BrokenSiteNegativeFeedbackViewModel.kt | 29 +++ ...ShareOpenEndedNegativeFeedbackViewModel.kt | 29 +++ .../PositiveFeedbackLandingViewModel.kt | 29 +++ .../ui/FireproofWebsitesViewModel.kt | 41 +++ .../duckduckgo/app/global/ViewModelFactory.kt | 242 +----------------- .../ui/GlobalPrivacyControlViewModel.kt | 35 +++ .../app/icon/ui/ChangeIconViewModel.kt | 37 +++ .../duckduckgo/app/launch/LaunchViewModel.kt | 35 +++ .../ui/LocationPermissionsViewModel.kt | 41 +++ .../app/onboarding/ui/OnboardingViewModel.kt | 38 +++ .../ui/page/DefaultBrowserPageViewModel.kt | 37 +++ .../privacy/ui/PrivacyDashboardViewModel.kt | 37 +++ .../privacy/ui/PrivacyPracticesViewModel.kt | 29 +++ .../app/privacy/ui/ScorecardViewModel.kt | 31 +++ .../privacy/ui/TrackerNetworksViewModel.kt | 29 +++ .../app/privacy/ui/WhitelistViewModel.kt | 33 +++ .../app/settings/SettingsViewModel.kt | 41 +++ .../app/survey/ui/SurveyViewModel.kt | 37 +++ .../app/systemsearch/SystemSearchViewModel.kt | 40 +++ .../app/tabs/ui/TabSwitcherViewModel.kt | 36 +++ .../ui/AddWidgetInstructionsViewModel.kt | 29 +++ .../view_model/ViewModelFactoryPlugin.kt | 35 +++ 28 files changed, 1042 insertions(+), 236 deletions(-) create mode 100644 common/src/main/java/com/duckduckgo/app/global/plugins/view_model/ViewModelFactoryPlugin.kt diff --git a/app/src/main/java/com/duckduckgo/app/bookmarks/ui/BookmarksViewModel.kt b/app/src/main/java/com/duckduckgo/app/bookmarks/ui/BookmarksViewModel.kt index b550a3f36744..39841b13f2fd 100644 --- a/app/src/main/java/com/duckduckgo/app/bookmarks/ui/BookmarksViewModel.kt +++ b/app/src/main/java/com/duckduckgo/app/bookmarks/ui/BookmarksViewModel.kt @@ -28,9 +28,46 @@ import com.duckduckgo.app.bookmarks.ui.EditBookmarkDialogFragment.EditBookmarkLi import com.duckduckgo.app.browser.favicon.FaviconManager import com.duckduckgo.app.global.DispatcherProvider import com.duckduckgo.app.global.SingleLiveEvent +import com.duckduckgo.app.global.plugins.view_model.ViewModelFactoryPlugin +import com.duckduckgo.di.scopes.AppObjectGraph +import com.squareup.anvil.annotations.ContributesTo +import dagger.Module +import dagger.Provides +import dagger.multibindings.IntoSet import io.reactivex.schedulers.Schedulers import kotlinx.coroutines.NonCancellable import kotlinx.coroutines.launch +import javax.inject.Singleton + +@Module +@ContributesTo(AppObjectGraph::class) +class BookmarksViewModelFactoryModule { + @Provides + @Singleton + @IntoSet + fun provideBookmarksViewModelFactory( + dao: BookmarksDao, + faviconManager: FaviconManager, + dispatcherProvider: DispatcherProvider + ): ViewModelFactoryPlugin { + return BookmarksViewModelFactory(dao, faviconManager, dispatcherProvider) + } +} + +private class BookmarksViewModelFactory( + private val dao: BookmarksDao, + private val faviconManager: FaviconManager, + private val dispatcherProvider: DispatcherProvider +) : ViewModelFactoryPlugin { + override fun create(modelClass: Class): T? { + with(modelClass) { + return when { + isAssignableFrom(BookmarksViewModel::class.java) -> (BookmarksViewModel(dao, faviconManager, dispatcherProvider) as T) + else -> null + } + } + } +} class BookmarksViewModel( val dao: BookmarksDao, diff --git a/app/src/main/java/com/duckduckgo/app/brokensite/BrokenSiteViewModel.kt b/app/src/main/java/com/duckduckgo/app/brokensite/BrokenSiteViewModel.kt index 891732a0ee44..ccd9d9d52fc1 100644 --- a/app/src/main/java/com/duckduckgo/app/brokensite/BrokenSiteViewModel.kt +++ b/app/src/main/java/com/duckduckgo/app/brokensite/BrokenSiteViewModel.kt @@ -27,7 +27,42 @@ import com.duckduckgo.app.brokensite.model.BrokenSiteCategory.* import com.duckduckgo.app.global.SingleLiveEvent import com.duckduckgo.app.global.absoluteString import com.duckduckgo.app.global.isMobileSite +import com.duckduckgo.app.global.plugins.view_model.ViewModelFactoryPlugin import com.duckduckgo.app.statistics.pixels.Pixel +import com.duckduckgo.di.scopes.AppObjectGraph +import com.squareup.anvil.annotations.ContributesTo +import dagger.Module +import dagger.Provides +import dagger.multibindings.IntoSet +import javax.inject.Singleton + +@Module +@ContributesTo(AppObjectGraph::class) +class BrokenSiteViewModelFactoryModule { + @Provides + @Singleton + @IntoSet + fun provideBrokenSiteViewModelFactory( + pixel: Pixel, + brokenSiteSender: BrokenSiteSender + ): ViewModelFactoryPlugin { + return BrokenSiteViewModelFactory(pixel, brokenSiteSender) + } +} + +private class BrokenSiteViewModelFactory( + private val pixel: Pixel, + private val brokenSiteSender: BrokenSiteSender +) : ViewModelFactoryPlugin { + override fun create(modelClass: Class): T? { + with(modelClass) { + return when { + isAssignableFrom(BrokenSiteViewModel::class.java) -> (BrokenSiteViewModel(pixel, brokenSiteSender) as T) + else -> null + } + } + } +} class BrokenSiteViewModel(private val pixel: Pixel, private val brokenSiteSender: BrokenSiteSender) : ViewModel() { diff --git a/app/src/main/java/com/duckduckgo/app/browser/BrowserTabViewModel.kt b/app/src/main/java/com/duckduckgo/app/browser/BrowserTabViewModel.kt index e30f5709f01c..a8b6144eddfd 100644 --- a/app/src/main/java/com/duckduckgo/app/browser/BrowserTabViewModel.kt +++ b/app/src/main/java/com/duckduckgo/app/browser/BrowserTabViewModel.kt @@ -38,6 +38,7 @@ import com.duckduckgo.app.autocomplete.api.AutoComplete.AutoCompleteResult import com.duckduckgo.app.autocomplete.api.AutoComplete.AutoCompleteSuggestion import com.duckduckgo.app.autocomplete.api.AutoComplete.AutoCompleteSuggestion.AutoCompleteBookmarkSuggestion import com.duckduckgo.app.autocomplete.api.AutoComplete.AutoCompleteSuggestion.AutoCompleteSearchSuggestion +import com.duckduckgo.app.autocomplete.api.AutoCompleteApi import com.duckduckgo.app.bookmarks.db.BookmarkEntity import com.duckduckgo.app.bookmarks.db.BookmarksDao import com.duckduckgo.app.bookmarks.ui.EditBookmarkDialogFragment.EditBookmarkListener @@ -61,6 +62,7 @@ import com.duckduckgo.app.browser.model.BasicAuthenticationCredentials import com.duckduckgo.app.browser.model.BasicAuthenticationRequest import com.duckduckgo.app.browser.model.LongPressTarget import com.duckduckgo.app.browser.omnibar.OmnibarEntryConverter +import com.duckduckgo.app.browser.omnibar.QueryUrlConverter import com.duckduckgo.app.browser.session.WebViewSessionStorage import com.duckduckgo.app.browser.ui.HttpAuthenticationDialogFragment.HttpAuthenticationListener import com.duckduckgo.app.cta.ui.* @@ -73,6 +75,7 @@ import com.duckduckgo.app.global.model.Site import com.duckduckgo.app.global.model.SiteFactory import com.duckduckgo.app.global.model.domain import com.duckduckgo.app.global.model.domainMatchesUrl +import com.duckduckgo.app.global.plugins.view_model.ViewModelFactoryPlugin import com.duckduckgo.app.global.useourapp.UseOurAppDetector import com.duckduckgo.app.global.useourapp.UseOurAppDetector.Companion.USE_OUR_APP_SHORTCUT_TITLE import com.duckduckgo.app.global.useourapp.UseOurAppDetector.Companion.USE_OUR_APP_SHORTCUT_URL @@ -100,7 +103,12 @@ import com.duckduckgo.app.tabs.model.TabEntity import com.duckduckgo.app.tabs.model.TabRepository import com.duckduckgo.app.trackerdetection.model.TrackingEvent import com.duckduckgo.app.usage.search.SearchCountDao +import com.duckduckgo.di.scopes.AppObjectGraph import com.jakewharton.rxrelay2.PublishRelay +import com.squareup.anvil.annotations.ContributesTo +import dagger.Module +import dagger.Provides +import dagger.multibindings.IntoSet import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.disposables.Disposable import io.reactivex.schedulers.Schedulers @@ -109,6 +117,122 @@ import timber.log.Timber import java.io.File import java.util.* import java.util.concurrent.TimeUnit +import javax.inject.Singleton + +@Module +@ContributesTo(AppObjectGraph::class) +class BrowserTabViewModelFactoryModule { + @Provides + @Singleton + @IntoSet + fun proideBrowserTabViewModelFactory( + statisticsUpdater: StatisticsUpdater, + queryUrlConverter: QueryUrlConverter, + duckDuckGoUrlDetector: DuckDuckGoUrlDetector, + siteFactory: SiteFactory, + tabRepository: TabRepository, + userWhitelistDao: UserWhitelistDao, + networkLeaderboardDao: NetworkLeaderboardDao, + bookmarksDao: BookmarksDao, + fireproofWebsiteRepository: FireproofWebsiteRepository, + locationPermissionsRepository: LocationPermissionsRepository, + geoLocationPermissions: GeoLocationPermissions, + navigationAwareLoginDetector: NavigationAwareLoginDetector, + autoCompleteApi: AutoCompleteApi, + appSettingsPreferencesStore: SettingsDataStore, + longPressHandler: LongPressHandler, + webViewSessionStorage: WebViewSessionStorage, + specialUrlDetector: SpecialUrlDetector, + faviconManager: FaviconManager, + addToHomeCapabilityDetector: AddToHomeCapabilityDetector, + ctaViewModel: CtaViewModel, + searchCountDao: SearchCountDao, + pixel: Pixel, + dispatchers: DispatcherProvider = DefaultDispatcherProvider(), + userEventsStore: UserEventsStore, + notificationDao: NotificationDao, + useOurAppDetector: UseOurAppDetector, + variantManager: VariantManager, + fileDownloader: FileDownloader, + globalPrivacyControl: GlobalPrivacyControl, + fireproofDialogsEventHandler: FireproofDialogsEventHandler + ): ViewModelFactoryPlugin { + return BrowserTabViewModelFactory( + statisticsUpdater, + queryUrlConverter, + duckDuckGoUrlDetector, + siteFactory, + tabRepository, + userWhitelistDao, + networkLeaderboardDao, + bookmarksDao, + fireproofWebsiteRepository, + locationPermissionsRepository, + geoLocationPermissions, + navigationAwareLoginDetector, + autoCompleteApi, + appSettingsPreferencesStore, + longPressHandler, + webViewSessionStorage, + specialUrlDetector, + faviconManager, + addToHomeCapabilityDetector, + ctaViewModel, + searchCountDao, + pixel, + dispatchers, + userEventsStore, + notificationDao, + useOurAppDetector, + variantManager, + fileDownloader, + globalPrivacyControl, + fireproofDialogsEventHandler + ) + } +} + +private class BrowserTabViewModelFactory( + private val statisticsUpdater: StatisticsUpdater, + private val queryUrlConverter: OmnibarEntryConverter, + private val duckDuckGoUrlDetector: DuckDuckGoUrlDetector, + private val siteFactory: SiteFactory, + private val tabRepository: TabRepository, + private val userWhitelistDao: UserWhitelistDao, + private val networkLeaderboardDao: NetworkLeaderboardDao, + private val bookmarksDao: BookmarksDao, + private val fireproofWebsiteRepository: FireproofWebsiteRepository, + private val locationPermissionsRepository: LocationPermissionsRepository, + private val geoLocationPermissions: GeoLocationPermissions, + private val navigationAwareLoginDetector: NavigationAwareLoginDetector, + private val autoComplete: AutoComplete, + private val appSettingsPreferencesStore: SettingsDataStore, + private val longPressHandler: LongPressHandler, + private val webViewSessionStorage: WebViewSessionStorage, + private val specialUrlDetector: SpecialUrlDetector, + private val faviconManager: FaviconManager, + private val addToHomeCapabilityDetector: AddToHomeCapabilityDetector, + private val ctaViewModel: CtaViewModel, + private val searchCountDao: SearchCountDao, + private val pixel: Pixel, + private val dispatchers: DispatcherProvider = DefaultDispatcherProvider(), + private val userEventsStore: UserEventsStore, + private val notificationDao: NotificationDao, + private val useOurAppDetector: UseOurAppDetector, + private val variantManager: VariantManager, + private val fileDownloader: FileDownloader, + private val globalPrivacyControl: GlobalPrivacyControl, + private val fireproofDialogsEventHandler: FireproofDialogsEventHandler +) : ViewModelFactoryPlugin { + override fun create(modelClass: Class): T? { + with(modelClass) { + return when { + isAssignableFrom(BrowserTabViewModel::class.java) -> BrowserTabViewModel(statisticsUpdater, queryUrlConverter, duckDuckGoUrlDetector, siteFactory, tabRepository, userWhitelistDao, networkLeaderboardDao, bookmarksDao, fireproofWebsiteRepository, locationPermissionsRepository, geoLocationPermissions, navigationAwareLoginDetector, autoComplete, appSettingsPreferencesStore, longPressHandler, webViewSessionStorage, specialUrlDetector, faviconManager, addToHomeCapabilityDetector, ctaViewModel, searchCountDao, pixel, dispatchers, userEventsStore, notificationDao, useOurAppDetector, variantManager, fileDownloader, globalPrivacyControl, fireproofDialogsEventHandler) as T + else -> null + } + } + } +} class BrowserTabViewModel( private val statisticsUpdater: StatisticsUpdater, diff --git a/app/src/main/java/com/duckduckgo/app/browser/BrowserViewModel.kt b/app/src/main/java/com/duckduckgo/app/browser/BrowserViewModel.kt index 84bae806e0fc..35b9f469f61f 100644 --- a/app/src/main/java/com/duckduckgo/app/browser/BrowserViewModel.kt +++ b/app/src/main/java/com/duckduckgo/app/browser/BrowserViewModel.kt @@ -24,6 +24,7 @@ import androidx.lifecycle.ViewModel import com.duckduckgo.app.browser.BrowserViewModel.Command.DisplayMessage import com.duckduckgo.app.browser.BrowserViewModel.Command.Refresh import com.duckduckgo.app.browser.omnibar.OmnibarEntryConverter +import com.duckduckgo.app.browser.omnibar.QueryUrlConverter import com.duckduckgo.app.browser.rating.ui.AppEnjoymentDialogFragment import com.duckduckgo.app.browser.rating.ui.GiveFeedbackDialogFragment import com.duckduckgo.app.browser.rating.ui.RateAppDialogFragment @@ -32,6 +33,7 @@ import com.duckduckgo.app.global.ApplicationClearDataState import com.duckduckgo.app.global.DefaultDispatcherProvider import com.duckduckgo.app.global.DispatcherProvider import com.duckduckgo.app.global.SingleLiveEvent +import com.duckduckgo.app.global.plugins.view_model.ViewModelFactoryPlugin import com.duckduckgo.app.global.rating.AppEnjoymentPromptEmitter import com.duckduckgo.app.global.rating.AppEnjoymentPromptOptions import com.duckduckgo.app.global.rating.AppEnjoymentUserEventRecorder @@ -41,12 +43,58 @@ import com.duckduckgo.app.privacy.ui.PrivacyDashboardActivity.Companion.RELOAD_R import com.duckduckgo.app.statistics.pixels.Pixel import com.duckduckgo.app.tabs.model.TabEntity import com.duckduckgo.app.tabs.model.TabRepository +import com.duckduckgo.di.scopes.AppObjectGraph +import com.squareup.anvil.annotations.ContributesTo +import dagger.Module +import dagger.Provides +import dagger.multibindings.IntoSet import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import timber.log.Timber +import javax.inject.Singleton import kotlin.coroutines.CoroutineContext +@Module +@ContributesTo(AppObjectGraph::class) +class BrowserViewModelFactoryModule { + @Provides + @Singleton + @IntoSet + fun provideBrowserViewModelFactory( + tabRepository: TabRepository, + queryUrlConverter: QueryUrlConverter, + dataClearer: DataClearer, + appEnjoymentPromptEmitter: AppEnjoymentPromptEmitter, + appEnjoymentUserEventRecorder: AppEnjoymentUserEventRecorder, + dispatchers: DispatcherProvider = DefaultDispatcherProvider(), + pixel: Pixel, + useOurAppDetector: UseOurAppDetector + ): ViewModelFactoryPlugin { + return BrowserViewModelFactory(tabRepository, queryUrlConverter, dataClearer, appEnjoymentPromptEmitter, appEnjoymentUserEventRecorder, dispatchers, pixel, useOurAppDetector) + } +} + +private class BrowserViewModelFactory( + val tabRepository: TabRepository, + val queryUrlConverter: OmnibarEntryConverter, + val dataClearer: DataClearer, + val appEnjoymentPromptEmitter: AppEnjoymentPromptEmitter, + val appEnjoymentUserEventRecorder: AppEnjoymentUserEventRecorder, + val dispatchers: DispatcherProvider = DefaultDispatcherProvider(), + val pixel: Pixel, + val useOurAppDetector: UseOurAppDetector +) : ViewModelFactoryPlugin { + override fun create(modelClass: Class): T? { + with(modelClass) { + return when { + isAssignableFrom(BrowserViewModel::class.java) -> BrowserViewModel(tabRepository, queryUrlConverter, dataClearer, appEnjoymentPromptEmitter, appEnjoymentUserEventRecorder, dispatchers, pixel, useOurAppDetector) as T + else -> null + } + } + } +} + class BrowserViewModel( private val tabRepository: TabRepository, private val queryUrlConverter: OmnibarEntryConverter, diff --git a/app/src/main/java/com/duckduckgo/app/feedback/ui/common/FeedbackViewModel.kt b/app/src/main/java/com/duckduckgo/app/feedback/ui/common/FeedbackViewModel.kt index 2f7016c5b358..9ee295042e15 100644 --- a/app/src/main/java/com/duckduckgo/app/feedback/ui/common/FeedbackViewModel.kt +++ b/app/src/main/java/com/duckduckgo/app/feedback/ui/common/FeedbackViewModel.kt @@ -25,12 +25,47 @@ import com.duckduckgo.app.feedback.ui.negative.FeedbackType import com.duckduckgo.app.feedback.ui.negative.FeedbackType.MainReason import com.duckduckgo.app.feedback.ui.negative.FeedbackType.SubReason import com.duckduckgo.app.global.SingleLiveEvent +import com.duckduckgo.app.global.plugins.view_model.ViewModelFactoryPlugin import com.duckduckgo.app.playstore.PlayStoreUtils +import com.duckduckgo.di.scopes.AppObjectGraph +import com.squareup.anvil.annotations.ContributesTo +import dagger.Module +import dagger.Provides +import dagger.multibindings.IntoSet import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import timber.log.Timber +import javax.inject.Singleton + +@Module +@ContributesTo(AppObjectGraph::class) +class FeedbackViewModelFactoryModule { + @Provides + @Singleton + @IntoSet + fun provideFeedbackViewModelFactory( + playStoreUtils: PlayStoreUtils, + feedbackSubmitter: FeedbackSubmitter + ): ViewModelFactoryPlugin { + return FeedbackViewModelFactory(playStoreUtils, feedbackSubmitter) + } +} + +private class FeedbackViewModelFactory( + private val playStoreUtils: PlayStoreUtils, + private val feedbackSubmitter: FeedbackSubmitter +) : ViewModelFactoryPlugin { + override fun create(modelClass: Class): T? { + with(modelClass) { + return when { + isAssignableFrom(FeedbackViewModel::class.java) -> (FeedbackViewModel(playStoreUtils, feedbackSubmitter) as T) + else -> null + } + } + } +} class FeedbackViewModel(private val playStoreUtils: PlayStoreUtils, private val feedbackSubmitter: FeedbackSubmitter) : ViewModel() { diff --git a/app/src/main/java/com/duckduckgo/app/feedback/ui/initial/InitialFeedbackFragmentViewModel.kt b/app/src/main/java/com/duckduckgo/app/feedback/ui/initial/InitialFeedbackFragmentViewModel.kt index 39f4084ee2ed..9f771dc1689b 100644 --- a/app/src/main/java/com/duckduckgo/app/feedback/ui/initial/InitialFeedbackFragmentViewModel.kt +++ b/app/src/main/java/com/duckduckgo/app/feedback/ui/initial/InitialFeedbackFragmentViewModel.kt @@ -19,6 +19,35 @@ package com.duckduckgo.app.feedback.ui.initial import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import com.duckduckgo.app.feedback.ui.common.ViewState +import com.duckduckgo.app.global.plugins.view_model.ViewModelFactoryPlugin +import com.duckduckgo.di.scopes.AppObjectGraph +import com.squareup.anvil.annotations.ContributesTo +import dagger.Module +import dagger.Provides +import dagger.multibindings.IntoSet +import javax.inject.Singleton + +@Module +@ContributesTo(AppObjectGraph::class) +class InitialFeedbackFragmentViewModelFactoryModule { + @Provides + @Singleton + @IntoSet + fun provideInitialFeedbackFragmentViewModelFactory(): ViewModelFactoryPlugin { + return InitialFeedbackFragmentViewModelFactory() + } +} + +private class InitialFeedbackFragmentViewModelFactory() : ViewModelFactoryPlugin { + override fun create(modelClass: Class): T? { + with(modelClass) { + return when { + isAssignableFrom(InitialFeedbackFragmentViewModel::class.java) -> (InitialFeedbackFragmentViewModel() as T) + else -> null + } + } + } +} class InitialFeedbackFragmentViewModel : ViewModel() { diff --git a/app/src/main/java/com/duckduckgo/app/feedback/ui/negative/brokensite/BrokenSiteNegativeFeedbackViewModel.kt b/app/src/main/java/com/duckduckgo/app/feedback/ui/negative/brokensite/BrokenSiteNegativeFeedbackViewModel.kt index 643bc677f8ed..1a7502ad87b0 100644 --- a/app/src/main/java/com/duckduckgo/app/feedback/ui/negative/brokensite/BrokenSiteNegativeFeedbackViewModel.kt +++ b/app/src/main/java/com/duckduckgo/app/feedback/ui/negative/brokensite/BrokenSiteNegativeFeedbackViewModel.kt @@ -18,6 +18,35 @@ package com.duckduckgo.app.feedback.ui.negative.brokensite import androidx.lifecycle.ViewModel import com.duckduckgo.app.global.SingleLiveEvent +import com.duckduckgo.app.global.plugins.view_model.ViewModelFactoryPlugin +import com.duckduckgo.di.scopes.AppObjectGraph +import com.squareup.anvil.annotations.ContributesTo +import dagger.Module +import dagger.Provides +import dagger.multibindings.IntoSet +import javax.inject.Singleton + +@Module +@ContributesTo(AppObjectGraph::class) +class BrokenSiteNegativeFeedbackViewModelFactoryModule { + @Provides + @Singleton + @IntoSet + fun provideBrokenSiteNegativeFeedbackViewModelFactory(): ViewModelFactoryPlugin { + return BrokenSiteNegativeFeedbackViewModelFactory() + } +} + +private class BrokenSiteNegativeFeedbackViewModelFactory() : ViewModelFactoryPlugin { + override fun create(modelClass: Class): T? { + with(modelClass) { + return when { + isAssignableFrom(BrokenSiteNegativeFeedbackViewModel::class.java) -> (BrokenSiteNegativeFeedbackViewModel() as T) + else -> null + } + } + } +} class BrokenSiteNegativeFeedbackViewModel : ViewModel() { diff --git a/app/src/main/java/com/duckduckgo/app/feedback/ui/negative/openended/ShareOpenEndedNegativeFeedbackViewModel.kt b/app/src/main/java/com/duckduckgo/app/feedback/ui/negative/openended/ShareOpenEndedNegativeFeedbackViewModel.kt index 8b9e7c93fd12..e9bb78aee266 100644 --- a/app/src/main/java/com/duckduckgo/app/feedback/ui/negative/openended/ShareOpenEndedNegativeFeedbackViewModel.kt +++ b/app/src/main/java/com/duckduckgo/app/feedback/ui/negative/openended/ShareOpenEndedNegativeFeedbackViewModel.kt @@ -20,6 +20,35 @@ import androidx.lifecycle.ViewModel import com.duckduckgo.app.feedback.ui.negative.FeedbackType.MainReason import com.duckduckgo.app.feedback.ui.negative.FeedbackType.SubReason import com.duckduckgo.app.global.SingleLiveEvent +import com.duckduckgo.app.global.plugins.view_model.ViewModelFactoryPlugin +import com.duckduckgo.di.scopes.AppObjectGraph +import com.squareup.anvil.annotations.ContributesTo +import dagger.Module +import dagger.Provides +import dagger.multibindings.IntoSet +import javax.inject.Singleton + +@Module +@ContributesTo(AppObjectGraph::class) +class ShareOpenEndedNegativeFeedbackViewModelFactoryModule { + @Provides + @Singleton + @IntoSet + fun provideShareOpenEndedNegativeFeedbackViewModelFactory(): ViewModelFactoryPlugin { + return ShareOpenEndedNegativeFeedbackViewModelFactory() + } +} + +private class ShareOpenEndedNegativeFeedbackViewModelFactory() : ViewModelFactoryPlugin { + override fun create(modelClass: Class): T? { + with(modelClass) { + return when { + isAssignableFrom(ShareOpenEndedNegativeFeedbackViewModel::class.java) -> (ShareOpenEndedNegativeFeedbackViewModel() as T) + else -> null + } + } + } +} class ShareOpenEndedNegativeFeedbackViewModel : ViewModel() { diff --git a/app/src/main/java/com/duckduckgo/app/feedback/ui/positive/initial/PositiveFeedbackLandingViewModel.kt b/app/src/main/java/com/duckduckgo/app/feedback/ui/positive/initial/PositiveFeedbackLandingViewModel.kt index 8a4b72fb89ac..6902440b922b 100644 --- a/app/src/main/java/com/duckduckgo/app/feedback/ui/positive/initial/PositiveFeedbackLandingViewModel.kt +++ b/app/src/main/java/com/duckduckgo/app/feedback/ui/positive/initial/PositiveFeedbackLandingViewModel.kt @@ -18,6 +18,35 @@ package com.duckduckgo.app.feedback.ui.positive.initial import androidx.lifecycle.ViewModel import com.duckduckgo.app.global.SingleLiveEvent +import com.duckduckgo.app.global.plugins.view_model.ViewModelFactoryPlugin +import com.duckduckgo.di.scopes.AppObjectGraph +import com.squareup.anvil.annotations.ContributesTo +import dagger.Module +import dagger.Provides +import dagger.multibindings.IntoSet +import javax.inject.Singleton + +@Module +@ContributesTo(AppObjectGraph::class) +class PositiveFeedbackLandingViewModelFactoryModule { + @Provides + @Singleton + @IntoSet + fun providePositiveFeedbackLandingViewModelFactory(): ViewModelFactoryPlugin { + return PositiveFeedbackLandingViewModelFactory() + } +} + +private class PositiveFeedbackLandingViewModelFactory() : ViewModelFactoryPlugin { + override fun create(modelClass: Class): T? { + with(modelClass) { + return when { + isAssignableFrom(PositiveFeedbackLandingViewModel::class.java) -> (PositiveFeedbackLandingViewModel() as T) + else -> null + } + } + } +} class PositiveFeedbackLandingViewModel : ViewModel() { diff --git a/app/src/main/java/com/duckduckgo/app/fire/fireproofwebsite/ui/FireproofWebsitesViewModel.kt b/app/src/main/java/com/duckduckgo/app/fire/fireproofwebsite/ui/FireproofWebsitesViewModel.kt index d7bffa002944..0c7dfec68978 100644 --- a/app/src/main/java/com/duckduckgo/app/fire/fireproofwebsite/ui/FireproofWebsitesViewModel.kt +++ b/app/src/main/java/com/duckduckgo/app/fire/fireproofwebsite/ui/FireproofWebsitesViewModel.kt @@ -25,10 +25,51 @@ import com.duckduckgo.app.global.DispatcherProvider import com.duckduckgo.app.global.SingleLiveEvent import com.duckduckgo.app.global.events.db.UserEventKey import com.duckduckgo.app.global.events.db.UserEventsStore +import com.duckduckgo.app.global.plugins.view_model.ViewModelFactoryPlugin import com.duckduckgo.app.settings.db.SettingsDataStore import com.duckduckgo.app.statistics.pixels.Pixel import com.duckduckgo.app.statistics.pixels.Pixel.PixelName.* +import com.duckduckgo.di.scopes.AppObjectGraph +import com.squareup.anvil.annotations.ContributesTo +import dagger.Module +import dagger.Provides +import dagger.multibindings.IntoSet import kotlinx.coroutines.launch +import javax.inject.Singleton + +@Module +@ContributesTo(AppObjectGraph::class) +class FireproofWebsitesViewModelFactoryModule { + @Provides + @Singleton + @IntoSet + fun provideFireproofWebsitesViewModelFactory( + fireproofWebsiteRepository: FireproofWebsiteRepository, + dispatcherProvider: DispatcherProvider, + pixel: Pixel, + settingsDataStore: SettingsDataStore, + userEventsStore: UserEventsStore + ): ViewModelFactoryPlugin { + return FireproofWebsitesViewModelFactory(fireproofWebsiteRepository, dispatcherProvider, pixel, settingsDataStore, userEventsStore) + } +} + +private class FireproofWebsitesViewModelFactory( + private val fireproofWebsiteRepository: FireproofWebsiteRepository, + private val dispatcherProvider: DispatcherProvider, + private val pixel: Pixel, + private val settingsDataStore: SettingsDataStore, + private val userEventsStore: UserEventsStore +) : ViewModelFactoryPlugin { + override fun create(modelClass: Class): T? { + with(modelClass) { + return when { + isAssignableFrom(FireproofWebsitesViewModel::class.java) -> (FireproofWebsitesViewModel(fireproofWebsiteRepository, dispatcherProvider, pixel, settingsDataStore, userEventsStore) as T) + else -> null + } + } + } +} class FireproofWebsitesViewModel( private val fireproofWebsiteRepository: FireproofWebsiteRepository, diff --git a/app/src/main/java/com/duckduckgo/app/global/ViewModelFactory.kt b/app/src/main/java/com/duckduckgo/app/global/ViewModelFactory.kt index c0edcbba70e9..378c93a3a555 100644 --- a/app/src/main/java/com/duckduckgo/app/global/ViewModelFactory.kt +++ b/app/src/main/java/com/duckduckgo/app/global/ViewModelFactory.kt @@ -18,247 +18,17 @@ package com.duckduckgo.app.global import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider -import com.duckduckgo.app.autocomplete.api.AutoCompleteApi -import com.duckduckgo.app.bookmarks.db.BookmarksDao -import com.duckduckgo.app.bookmarks.ui.BookmarksViewModel -import com.duckduckgo.app.brokensite.BrokenSiteViewModel -import com.duckduckgo.app.brokensite.api.BrokenSiteSender -import com.duckduckgo.app.browser.* -import com.duckduckgo.app.browser.addtohome.AddToHomeCapabilityDetector -import com.duckduckgo.app.browser.defaultbrowsing.DefaultBrowserDetector -import com.duckduckgo.app.browser.downloader.FileDownloader -import com.duckduckgo.app.browser.favicon.FaviconManager -import com.duckduckgo.app.browser.logindetection.FireproofDialogsEventHandler -import com.duckduckgo.app.browser.logindetection.NavigationAwareLoginDetector -import com.duckduckgo.app.browser.omnibar.QueryUrlConverter -import com.duckduckgo.app.browser.session.WebViewSessionStorage -import com.duckduckgo.app.cta.db.DismissedCtaDao -import com.duckduckgo.app.cta.ui.CtaViewModel -import com.duckduckgo.app.feedback.api.FeedbackSubmitter -import com.duckduckgo.app.feedback.ui.common.FeedbackViewModel -import com.duckduckgo.app.feedback.ui.initial.InitialFeedbackFragmentViewModel -import com.duckduckgo.app.feedback.ui.negative.brokensite.BrokenSiteNegativeFeedbackViewModel -import com.duckduckgo.app.feedback.ui.negative.openended.ShareOpenEndedNegativeFeedbackViewModel -import com.duckduckgo.app.feedback.ui.positive.initial.PositiveFeedbackLandingViewModel -import com.duckduckgo.app.fire.FireAnimationLoader -import com.duckduckgo.app.fire.DataClearer -import com.duckduckgo.app.fire.fireproofwebsite.data.FireproofWebsiteRepository -import com.duckduckgo.app.fire.fireproofwebsite.ui.FireproofWebsitesViewModel -import com.duckduckgo.app.global.install.AppInstallStore -import com.duckduckgo.app.global.model.SiteFactory -import com.duckduckgo.app.global.rating.AppEnjoymentPromptEmitter -import com.duckduckgo.app.global.rating.AppEnjoymentUserEventRecorder -import com.duckduckgo.app.global.events.db.UserEventsStore -import com.duckduckgo.app.global.useourapp.UseOurAppDetector -import com.duckduckgo.app.globalprivacycontrol.GlobalPrivacyControl -import com.duckduckgo.app.globalprivacycontrol.ui.GlobalPrivacyControlViewModel -import com.duckduckgo.app.icon.api.IconModifier -import com.duckduckgo.app.icon.ui.ChangeIconViewModel -import com.duckduckgo.app.launch.LaunchViewModel -import com.duckduckgo.app.notification.db.NotificationDao -import com.duckduckgo.app.location.GeoLocationPermissions -import com.duckduckgo.app.location.data.LocationPermissionsRepository -import com.duckduckgo.app.location.ui.LocationPermissionsViewModel -import com.duckduckgo.app.onboarding.store.UserStageStore -import com.duckduckgo.app.onboarding.ui.OnboardingPageManager -import com.duckduckgo.app.onboarding.ui.OnboardingViewModel -import com.duckduckgo.app.onboarding.ui.page.DefaultBrowserPageViewModel -import com.duckduckgo.app.playstore.PlayStoreUtils -import com.duckduckgo.app.privacy.db.NetworkLeaderboardDao -import com.duckduckgo.app.privacy.db.UserWhitelistDao -import com.duckduckgo.app.privacy.ui.* -import com.duckduckgo.app.referral.AppInstallationReferrerStateListener -import com.duckduckgo.app.settings.SettingsViewModel -import com.duckduckgo.app.settings.db.SettingsDataStore -import com.duckduckgo.app.statistics.VariantManager -import com.duckduckgo.app.statistics.api.StatisticsUpdater -import com.duckduckgo.app.statistics.pixels.Pixel -import com.duckduckgo.app.statistics.store.StatisticsDataStore -import com.duckduckgo.app.survey.db.SurveyDao -import com.duckduckgo.app.survey.ui.SurveyViewModel -import com.duckduckgo.app.systemsearch.DeviceAppLookup -import com.duckduckgo.app.systemsearch.SystemSearchViewModel -import com.duckduckgo.app.tabs.model.TabRepository -import com.duckduckgo.app.tabs.ui.TabSwitcherViewModel -import com.duckduckgo.app.usage.search.SearchCountDao -import com.duckduckgo.app.widget.ui.AddWidgetInstructionsViewModel +import com.duckduckgo.app.global.plugins.view_model.ViewModelFactoryPluginPoint import javax.inject.Inject -@Suppress("UNCHECKED_CAST") class ViewModelFactory @Inject constructor( - private val statisticsUpdater: StatisticsUpdater, - private val statisticsStore: StatisticsDataStore, - private val userStageStore: UserStageStore, - private val appInstallStore: AppInstallStore, - private val queryUrlConverter: QueryUrlConverter, - private val duckDuckGoUrlDetector: DuckDuckGoUrlDetector, - private val tabRepository: TabRepository, - private val siteFactory: SiteFactory, - private val userWhitelistDao: UserWhitelistDao, - private val networkLeaderboardDao: NetworkLeaderboardDao, - private val bookmarksDao: BookmarksDao, - private val fireproofWebsiteRepository: FireproofWebsiteRepository, - private val locationPermissionsRepository: LocationPermissionsRepository, - private val geoLocationPermissions: GeoLocationPermissions, - private val navigationAwareLoginDetector: NavigationAwareLoginDetector, - private val surveyDao: SurveyDao, - private val autoCompleteApi: AutoCompleteApi, - private val deviceAppLookup: DeviceAppLookup, - private val appSettingsPreferencesStore: SettingsDataStore, - private val webViewLongPressHandler: LongPressHandler, - private val defaultBrowserDetector: DefaultBrowserDetector, - private val variantManager: VariantManager, - private val brokenSiteSender: BrokenSiteSender, - private val webViewSessionStorage: WebViewSessionStorage, - private val specialUrlDetector: SpecialUrlDetector, - private val faviconManager: FaviconManager, - private val addToHomeCapabilityDetector: AddToHomeCapabilityDetector, - private val pixel: Pixel, - private val dataClearer: DataClearer, - private val ctaViewModel: CtaViewModel, - private val appEnjoymentPromptEmitter: AppEnjoymentPromptEmitter, - private val searchCountDao: SearchCountDao, - private val appEnjoymentUserEventRecorder: AppEnjoymentUserEventRecorder, - private val playStoreUtils: PlayStoreUtils, - private val feedbackSubmitter: FeedbackSubmitter, - private val onboardingPageManager: OnboardingPageManager, - private val appInstallationReferrerStateListener: AppInstallationReferrerStateListener, - private val appIconModifier: IconModifier, - private val userEventsStore: UserEventsStore, - private val notificationDao: NotificationDao, - private val userOurAppDetector: UseOurAppDetector, - private val dismissedCtaDao: DismissedCtaDao, - private val fileDownloader: FileDownloader, - private val dispatcherProvider: DispatcherProvider, - private val fireAnimationLoader: FireAnimationLoader, - private val globalPrivacyControl: GlobalPrivacyControl, - private val fireproofDialogsEventHandler: FireproofDialogsEventHandler + private val viewModelFactoryPluginPoint: ViewModelFactoryPluginPoint ) : ViewModelProvider.NewInstanceFactory() { - override fun create(modelClass: Class) = - with(modelClass) { - when { - isAssignableFrom(LaunchViewModel::class.java) -> LaunchViewModel(userStageStore, appInstallationReferrerStateListener) - isAssignableFrom(SystemSearchViewModel::class.java) -> SystemSearchViewModel(userStageStore, autoCompleteApi, deviceAppLookup, pixel) - isAssignableFrom(OnboardingViewModel::class.java) -> onboardingViewModel() - isAssignableFrom(BrowserViewModel::class.java) -> browserViewModel() - isAssignableFrom(BrowserTabViewModel::class.java) -> browserTabViewModel() - isAssignableFrom(TabSwitcherViewModel::class.java) -> TabSwitcherViewModel(tabRepository, webViewSessionStorage) - isAssignableFrom(PrivacyDashboardViewModel::class.java) -> privacyDashboardViewModel() - isAssignableFrom(ScorecardViewModel::class.java) -> ScorecardViewModel(userWhitelistDao) - isAssignableFrom(TrackerNetworksViewModel::class.java) -> TrackerNetworksViewModel() - isAssignableFrom(PrivacyPracticesViewModel::class.java) -> PrivacyPracticesViewModel() - isAssignableFrom(WhitelistViewModel::class.java) -> WhitelistViewModel(userWhitelistDao) - isAssignableFrom(FeedbackViewModel::class.java) -> FeedbackViewModel(playStoreUtils, feedbackSubmitter) - isAssignableFrom(BrokenSiteViewModel::class.java) -> BrokenSiteViewModel(pixel, brokenSiteSender) - isAssignableFrom(SurveyViewModel::class.java) -> SurveyViewModel(surveyDao, statisticsStore, appInstallStore) - isAssignableFrom(AddWidgetInstructionsViewModel::class.java) -> AddWidgetInstructionsViewModel() - isAssignableFrom(SettingsViewModel::class.java) -> settingsViewModel() - isAssignableFrom(BookmarksViewModel::class.java) -> BookmarksViewModel(bookmarksDao, faviconManager, dispatcherProvider) - isAssignableFrom(InitialFeedbackFragmentViewModel::class.java) -> InitialFeedbackFragmentViewModel() - isAssignableFrom(PositiveFeedbackLandingViewModel::class.java) -> PositiveFeedbackLandingViewModel() - isAssignableFrom(ShareOpenEndedNegativeFeedbackViewModel::class.java) -> ShareOpenEndedNegativeFeedbackViewModel() - isAssignableFrom(BrokenSiteNegativeFeedbackViewModel::class.java) -> BrokenSiteNegativeFeedbackViewModel() - isAssignableFrom(DefaultBrowserPageViewModel::class.java) -> defaultBrowserPage() - isAssignableFrom(ChangeIconViewModel::class.java) -> changeAppIconViewModel() - isAssignableFrom(FireproofWebsitesViewModel::class.java) -> fireproofWebsiteViewModel() - isAssignableFrom(LocationPermissionsViewModel::class.java) -> locationPermissionsViewModel() - isAssignableFrom(GlobalPrivacyControlViewModel::class.java) -> globalPrivacyControlViewModel() + override fun create(modelClass: Class): T { + val viewModel = viewModelFactoryPluginPoint.getPlugins().mapNotNull { it.create(modelClass) }.first() as T + ?: throw IllegalArgumentException("Unknown ViewModel class: ${modelClass.name}") - else -> throw IllegalArgumentException("Unknown ViewModel class: ${modelClass.name}") - } - } as T - - private fun defaultBrowserPage() = DefaultBrowserPageViewModel(defaultBrowserDetector, pixel, appInstallStore) - - private fun onboardingViewModel() = OnboardingViewModel(userStageStore, onboardingPageManager, dispatcherProvider) - - private fun settingsViewModel(): SettingsViewModel { - return SettingsViewModel( - appSettingsPreferencesStore, - defaultBrowserDetector, - variantManager, - fireAnimationLoader, - pixel - ) - } - - private fun privacyDashboardViewModel(): PrivacyDashboardViewModel { - return PrivacyDashboardViewModel( - userWhitelistDao, - networkLeaderboardDao, - pixel - ) - } - - private fun browserViewModel(): BrowserViewModel { - return BrowserViewModel( - tabRepository = tabRepository, - queryUrlConverter = queryUrlConverter, - dataClearer = dataClearer, - appEnjoymentPromptEmitter = appEnjoymentPromptEmitter, - appEnjoymentUserEventRecorder = appEnjoymentUserEventRecorder, - useOurAppDetector = userOurAppDetector, - pixel = pixel - ) + return viewModel } - - private fun browserTabViewModel(): ViewModel = BrowserTabViewModel( - statisticsUpdater = statisticsUpdater, - queryUrlConverter = queryUrlConverter, - duckDuckGoUrlDetector = duckDuckGoUrlDetector, - siteFactory = siteFactory, - tabRepository = tabRepository, - userWhitelistDao = userWhitelistDao, - networkLeaderboardDao = networkLeaderboardDao, - bookmarksDao = bookmarksDao, - fireproofWebsiteRepository = fireproofWebsiteRepository, - locationPermissionsRepository = locationPermissionsRepository, - geoLocationPermissions = geoLocationPermissions, - navigationAwareLoginDetector = navigationAwareLoginDetector, - autoComplete = autoCompleteApi, - appSettingsPreferencesStore = appSettingsPreferencesStore, - longPressHandler = webViewLongPressHandler, - webViewSessionStorage = webViewSessionStorage, - specialUrlDetector = specialUrlDetector, - faviconManager = faviconManager, - addToHomeCapabilityDetector = addToHomeCapabilityDetector, - ctaViewModel = ctaViewModel, - searchCountDao = searchCountDao, - pixel = pixel, - userEventsStore = userEventsStore, - notificationDao = notificationDao, - useOurAppDetector = userOurAppDetector, - variantManager = variantManager, - fileDownloader = fileDownloader, - globalPrivacyControl = globalPrivacyControl, - fireproofDialogsEventHandler = fireproofDialogsEventHandler - ) - - private fun changeAppIconViewModel() = - ChangeIconViewModel(settingsDataStore = appSettingsPreferencesStore, appIconModifier = appIconModifier, pixel = pixel) - - private fun fireproofWebsiteViewModel() = - FireproofWebsitesViewModel( - fireproofWebsiteRepository = fireproofWebsiteRepository, - dispatcherProvider = dispatcherProvider, - pixel = pixel, - settingsDataStore = appSettingsPreferencesStore, - userEventsStore = userEventsStore - ) - - private fun locationPermissionsViewModel() = - LocationPermissionsViewModel( - locationPermissionsRepository = locationPermissionsRepository, - geoLocationPermissions = geoLocationPermissions, - dispatcherProvider = dispatcherProvider, - settingsDataStore = appSettingsPreferencesStore, - pixel = pixel - ) - - private fun globalPrivacyControlViewModel() = - GlobalPrivacyControlViewModel( - settingsDataStore = appSettingsPreferencesStore, - pixel = pixel - ) } diff --git a/app/src/main/java/com/duckduckgo/app/globalprivacycontrol/ui/GlobalPrivacyControlViewModel.kt b/app/src/main/java/com/duckduckgo/app/globalprivacycontrol/ui/GlobalPrivacyControlViewModel.kt index 82162b1e1edc..4eb54fbf0010 100644 --- a/app/src/main/java/com/duckduckgo/app/globalprivacycontrol/ui/GlobalPrivacyControlViewModel.kt +++ b/app/src/main/java/com/duckduckgo/app/globalprivacycontrol/ui/GlobalPrivacyControlViewModel.kt @@ -18,9 +18,44 @@ package com.duckduckgo.app.globalprivacycontrol.ui import androidx.lifecycle.* import com.duckduckgo.app.global.SingleLiveEvent +import com.duckduckgo.app.global.plugins.view_model.ViewModelFactoryPlugin import com.duckduckgo.app.settings.db.SettingsDataStore import com.duckduckgo.app.statistics.pixels.Pixel import com.duckduckgo.app.statistics.pixels.Pixel.PixelName.* +import com.duckduckgo.di.scopes.AppObjectGraph +import com.squareup.anvil.annotations.ContributesTo +import dagger.Module +import dagger.Provides +import dagger.multibindings.IntoSet +import javax.inject.Singleton + +@Module +@ContributesTo(AppObjectGraph::class) +class GlobalPrivacyControlViewModelFactoryModule { + @Provides + @Singleton + @IntoSet + fun provideGlobalPrivacyControlViewModelFactory( + pixel: Pixel, + settingsDataStore: SettingsDataStore + ): ViewModelFactoryPlugin { + return GlobalPrivacyControlViewModelFactory(pixel, settingsDataStore) + } +} + +private class GlobalPrivacyControlViewModelFactory( + private val pixel: Pixel, + private val settingsDataStore: SettingsDataStore +) : ViewModelFactoryPlugin { + override fun create(modelClass: Class): T? { + with(modelClass) { + return when { + isAssignableFrom(GlobalPrivacyControlViewModel::class.java) -> (GlobalPrivacyControlViewModel(pixel, settingsDataStore) as T) + else -> null + } + } + } +} class GlobalPrivacyControlViewModel( private val pixel: Pixel, diff --git a/app/src/main/java/com/duckduckgo/app/icon/ui/ChangeIconViewModel.kt b/app/src/main/java/com/duckduckgo/app/icon/ui/ChangeIconViewModel.kt index 577b16f663da..7571923f36c7 100644 --- a/app/src/main/java/com/duckduckgo/app/icon/ui/ChangeIconViewModel.kt +++ b/app/src/main/java/com/duckduckgo/app/icon/ui/ChangeIconViewModel.kt @@ -19,11 +19,48 @@ package com.duckduckgo.app.icon.ui import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import com.duckduckgo.app.global.SingleLiveEvent +import com.duckduckgo.app.global.plugins.view_model.ViewModelFactoryPlugin import com.duckduckgo.app.icon.api.AppIcon import com.duckduckgo.app.icon.api.IconModifier import com.duckduckgo.app.settings.db.SettingsDataStore import com.duckduckgo.app.statistics.pixels.Pixel +import com.duckduckgo.di.scopes.AppObjectGraph +import com.squareup.anvil.annotations.ContributesTo +import dagger.Module +import dagger.Provides +import dagger.multibindings.IntoSet import javax.inject.Inject +import javax.inject.Singleton + +@Module +@ContributesTo(AppObjectGraph::class) +class ChangeIconViewModelFactoryModule { + @Provides + @Singleton + @IntoSet + fun provideChangeIconViewModelFactory( + settingsDataStore: SettingsDataStore, + appIconModifier: IconModifier, + pixel: Pixel + ): ViewModelFactoryPlugin { + return ChangeIconViewModelFactory(settingsDataStore, appIconModifier, pixel) + } +} + +private class ChangeIconViewModelFactory( + private val settingsDataStore: SettingsDataStore, + private val appIconModifier: IconModifier, + private val pixel: Pixel +) : ViewModelFactoryPlugin { + override fun create(modelClass: Class): T? { + with(modelClass) { + return when { + isAssignableFrom(ChangeIconViewModel::class.java) -> (ChangeIconViewModel(settingsDataStore, appIconModifier, pixel) as T) + else -> null + } + } + } +} class ChangeIconViewModel @Inject constructor( private val settingsDataStore: SettingsDataStore, diff --git a/app/src/main/java/com/duckduckgo/app/launch/LaunchViewModel.kt b/app/src/main/java/com/duckduckgo/app/launch/LaunchViewModel.kt index ed5265de0403..58b58d7507ff 100644 --- a/app/src/main/java/com/duckduckgo/app/launch/LaunchViewModel.kt +++ b/app/src/main/java/com/duckduckgo/app/launch/LaunchViewModel.kt @@ -18,12 +18,47 @@ package com.duckduckgo.app.launch import androidx.lifecycle.ViewModel import com.duckduckgo.app.global.SingleLiveEvent +import com.duckduckgo.app.global.plugins.view_model.ViewModelFactoryPlugin import com.duckduckgo.app.onboarding.store.UserStageStore import com.duckduckgo.app.onboarding.store.isNewUser import com.duckduckgo.app.referral.AppInstallationReferrerStateListener import com.duckduckgo.app.referral.AppInstallationReferrerStateListener.Companion.MAX_REFERRER_WAIT_TIME_MS +import com.duckduckgo.di.scopes.AppObjectGraph +import com.squareup.anvil.annotations.ContributesTo +import dagger.Module +import dagger.Provides +import dagger.multibindings.IntoSet import kotlinx.coroutines.withTimeoutOrNull import timber.log.Timber +import javax.inject.Singleton + +@Module +@ContributesTo(AppObjectGraph::class) +class LaunchViewModelFactoryModule { + @Provides + @Singleton + @IntoSet + fun provideLaunchViewModelFactory( + userStageStore: UserStageStore, + appInstallationReferrerStateListener: AppInstallationReferrerStateListener + ): ViewModelFactoryPlugin { + return LaunchViewModelFactory(userStageStore, appInstallationReferrerStateListener) + } +} + +private class LaunchViewModelFactory( + private val userStageStore: UserStageStore, + private val appInstallationReferrerStateListener: AppInstallationReferrerStateListener +) : ViewModelFactoryPlugin { + override fun create(modelClass: Class): T? { + with(modelClass) { + return when { + isAssignableFrom(LaunchViewModel::class.java) -> (LaunchViewModel(userStageStore, appInstallationReferrerStateListener) as T) + else -> null + } + } + } +} class LaunchViewModel( private val userStageStore: UserStageStore, diff --git a/app/src/main/java/com/duckduckgo/app/location/ui/LocationPermissionsViewModel.kt b/app/src/main/java/com/duckduckgo/app/location/ui/LocationPermissionsViewModel.kt index f72d47f82750..f30412e9f481 100644 --- a/app/src/main/java/com/duckduckgo/app/location/ui/LocationPermissionsViewModel.kt +++ b/app/src/main/java/com/duckduckgo/app/location/ui/LocationPermissionsViewModel.kt @@ -20,13 +20,54 @@ import androidx.lifecycle.* import androidx.lifecycle.Observer import com.duckduckgo.app.global.DispatcherProvider import com.duckduckgo.app.global.SingleLiveEvent +import com.duckduckgo.app.global.plugins.view_model.ViewModelFactoryPlugin import com.duckduckgo.app.location.GeoLocationPermissions import com.duckduckgo.app.location.data.LocationPermissionEntity import com.duckduckgo.app.location.data.LocationPermissionType import com.duckduckgo.app.location.data.LocationPermissionsRepository import com.duckduckgo.app.settings.db.SettingsDataStore import com.duckduckgo.app.statistics.pixels.Pixel +import com.duckduckgo.di.scopes.AppObjectGraph +import com.squareup.anvil.annotations.ContributesTo +import dagger.Module +import dagger.Provides +import dagger.multibindings.IntoSet import kotlinx.coroutines.launch +import javax.inject.Singleton + +@Module +@ContributesTo(AppObjectGraph::class) +class LocationPermissionsViewModelFactoryModule { + @Provides + @Singleton + @IntoSet + fun provideLocationPermissionsViewModelFactory( + locationPermissionsRepository: LocationPermissionsRepository, + geoLocationPermissions: GeoLocationPermissions, + dispatcherProvider: DispatcherProvider, + settingsDataStore: SettingsDataStore, + pixel: Pixel + ): ViewModelFactoryPlugin { + return LocationPermissionsViewModelFactory(locationPermissionsRepository, geoLocationPermissions, dispatcherProvider, settingsDataStore, pixel) + } +} + +private class LocationPermissionsViewModelFactory( + private val locationPermissionsRepository: LocationPermissionsRepository, + private val geoLocationPermissions: GeoLocationPermissions, + private val dispatcherProvider: DispatcherProvider, + private val settingsDataStore: SettingsDataStore, + private val pixel: Pixel +) : ViewModelFactoryPlugin { + override fun create(modelClass: Class): T? { + with(modelClass) { + return when { + isAssignableFrom(LocationPermissionsViewModel::class.java) -> (LocationPermissionsViewModel(locationPermissionsRepository, geoLocationPermissions, dispatcherProvider, settingsDataStore, pixel) as T) + else -> null + } + } + } +} class LocationPermissionsViewModel( private val locationPermissionsRepository: LocationPermissionsRepository, diff --git a/app/src/main/java/com/duckduckgo/app/onboarding/ui/OnboardingViewModel.kt b/app/src/main/java/com/duckduckgo/app/onboarding/ui/OnboardingViewModel.kt index 6468a9a72cea..55d9d0061af5 100644 --- a/app/src/main/java/com/duckduckgo/app/onboarding/ui/OnboardingViewModel.kt +++ b/app/src/main/java/com/duckduckgo/app/onboarding/ui/OnboardingViewModel.kt @@ -19,10 +19,48 @@ package com.duckduckgo.app.onboarding.ui import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.duckduckgo.app.global.DispatcherProvider +import com.duckduckgo.app.global.plugins.view_model.ViewModelFactoryPlugin import com.duckduckgo.app.onboarding.store.AppStage import com.duckduckgo.app.onboarding.store.UserStageStore import com.duckduckgo.app.onboarding.ui.page.OnboardingPageFragment +import com.duckduckgo.di.scopes.AppObjectGraph +import com.squareup.anvil.annotations.ContributesTo +import dagger.Module +import dagger.Provides +import dagger.multibindings.IntoSet import kotlinx.coroutines.launch +import javax.inject.Singleton + +@Module +@ContributesTo(AppObjectGraph::class) +class OnboardingViewModelFactoryModule { + @Provides + @Singleton + @IntoSet + fun provideOnboardingViewModelFactory( + userStageStore: UserStageStore, + pageLayoutManager: OnboardingPageManager, + dispatchers: DispatcherProvider + ): ViewModelFactoryPlugin { + return OnboardingViewModelFactory(userStageStore, pageLayoutManager, dispatchers) + } +} + +private class OnboardingViewModelFactory( + private val userStageStore: UserStageStore, + private val pageLayoutManager: OnboardingPageManager, + private val dispatchers: DispatcherProvider +) : ViewModelFactoryPlugin { + override fun create(modelClass: Class): T? { + with(modelClass) { + return when { + isAssignableFrom(OnboardingViewModel::class.java) -> (OnboardingViewModel(userStageStore, pageLayoutManager, dispatchers) as T) + else -> null + } + } + } + +} class OnboardingViewModel( private val userStageStore: UserStageStore, diff --git a/app/src/main/java/com/duckduckgo/app/onboarding/ui/page/DefaultBrowserPageViewModel.kt b/app/src/main/java/com/duckduckgo/app/onboarding/ui/page/DefaultBrowserPageViewModel.kt index 2e5113345e15..698aaa34cb24 100644 --- a/app/src/main/java/com/duckduckgo/app/onboarding/ui/page/DefaultBrowserPageViewModel.kt +++ b/app/src/main/java/com/duckduckgo/app/onboarding/ui/page/DefaultBrowserPageViewModel.kt @@ -21,7 +21,44 @@ import androidx.lifecycle.ViewModel import com.duckduckgo.app.browser.defaultbrowsing.DefaultBrowserDetector import com.duckduckgo.app.global.SingleLiveEvent import com.duckduckgo.app.global.install.AppInstallStore +import com.duckduckgo.app.global.plugins.view_model.ViewModelFactoryPlugin import com.duckduckgo.app.statistics.pixels.Pixel +import com.duckduckgo.di.scopes.AppObjectGraph +import com.squareup.anvil.annotations.ContributesTo +import dagger.Module +import dagger.Provides +import dagger.multibindings.IntoSet +import javax.inject.Singleton + +@Module +@ContributesTo(AppObjectGraph::class) +class DefaultBrowserPageViewModelFactoryModule { + @Provides + @Singleton + @IntoSet + fun provideDefaultBrowserPageViewModelFactory( + defaultBrowserDetector: DefaultBrowserDetector, + pixel: Pixel, + installStore: AppInstallStore + ): ViewModelFactoryPlugin { + return DefaultBrowserPageViewModelFactory(defaultBrowserDetector, pixel, installStore) + } +} + +private class DefaultBrowserPageViewModelFactory( + private val defaultBrowserDetector: DefaultBrowserDetector, + private val pixel: Pixel, + private val installStore: AppInstallStore +) : ViewModelFactoryPlugin { + override fun create(modelClass: Class): T? { + with(modelClass) { + return when { + isAssignableFrom(DefaultBrowserPageViewModel::class.java) -> (DefaultBrowserPageViewModel(defaultBrowserDetector, pixel, installStore) as T) + else -> null + } + } + } +} class DefaultBrowserPageViewModel( private val defaultBrowserDetector: DefaultBrowserDetector, diff --git a/app/src/main/java/com/duckduckgo/app/privacy/ui/PrivacyDashboardViewModel.kt b/app/src/main/java/com/duckduckgo/app/privacy/ui/PrivacyDashboardViewModel.kt index 62e7a9c256cd..5dc62963fe70 100644 --- a/app/src/main/java/com/duckduckgo/app/privacy/ui/PrivacyDashboardViewModel.kt +++ b/app/src/main/java/com/duckduckgo/app/privacy/ui/PrivacyDashboardViewModel.kt @@ -24,6 +24,7 @@ import com.duckduckgo.app.global.DispatcherProvider import com.duckduckgo.app.global.SingleLiveEvent import com.duckduckgo.app.global.model.Site import com.duckduckgo.app.global.model.domain +import com.duckduckgo.app.global.plugins.view_model.ViewModelFactoryPlugin import com.duckduckgo.app.privacy.db.NetworkLeaderboardDao import com.duckduckgo.app.privacy.db.NetworkLeaderboardEntry import com.duckduckgo.app.privacy.db.UserWhitelistDao @@ -35,9 +36,45 @@ import com.duckduckgo.app.privacy.ui.PrivacyDashboardViewModel.Command.LaunchMan import com.duckduckgo.app.privacy.ui.PrivacyDashboardViewModel.Command.LaunchReportBrokenSite import com.duckduckgo.app.statistics.pixels.Pixel import com.duckduckgo.app.statistics.pixels.Pixel.PixelName.* +import com.duckduckgo.di.scopes.AppObjectGraph +import com.squareup.anvil.annotations.ContributesTo +import dagger.Module +import dagger.Provides +import dagger.multibindings.IntoSet import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch import kotlinx.coroutines.withContext +import javax.inject.Singleton + +@Module +@ContributesTo(AppObjectGraph::class) +class PrivacyDashboardViewModelFactoryModule { + @Provides + @Singleton + @IntoSet + fun providePrivacyDashboardViewModelFactory( + userWhitelistDao: UserWhitelistDao, + networkLeaderboardDao: NetworkLeaderboardDao, + pixel: Pixel + ): ViewModelFactoryPlugin { + return PrivacyDashboardViewModelFactory(userWhitelistDao, networkLeaderboardDao, pixel) + } +} + +private class PrivacyDashboardViewModelFactory( + private val userWhitelistDao: UserWhitelistDao, + private val networkLeaderboardDao: NetworkLeaderboardDao, + private val pixel: Pixel +) : ViewModelFactoryPlugin { + override fun create(modelClass: Class): T? { + with(modelClass) { + return when { + isAssignableFrom(PrivacyDashboardViewModel::class.java) -> PrivacyDashboardViewModel(userWhitelistDao, networkLeaderboardDao, pixel) as T + else -> null + } + } + } +} class PrivacyDashboardViewModel( private val userWhitelistDao: UserWhitelistDao, diff --git a/app/src/main/java/com/duckduckgo/app/privacy/ui/PrivacyPracticesViewModel.kt b/app/src/main/java/com/duckduckgo/app/privacy/ui/PrivacyPracticesViewModel.kt index 36f62223c365..9dccc5158b21 100644 --- a/app/src/main/java/com/duckduckgo/app/privacy/ui/PrivacyPracticesViewModel.kt +++ b/app/src/main/java/com/duckduckgo/app/privacy/ui/PrivacyPracticesViewModel.kt @@ -20,8 +20,37 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import com.duckduckgo.app.global.model.Site import com.duckduckgo.app.global.model.domain +import com.duckduckgo.app.global.plugins.view_model.ViewModelFactoryPlugin import com.duckduckgo.app.privacy.model.PrivacyPractices import com.duckduckgo.app.privacy.model.PrivacyPractices.Summary.UNKNOWN +import com.duckduckgo.di.scopes.AppObjectGraph +import com.squareup.anvil.annotations.ContributesTo +import dagger.Module +import dagger.Provides +import dagger.multibindings.IntoSet +import javax.inject.Singleton + +@Module +@ContributesTo(AppObjectGraph::class) +class PrivacyPracticesViewModelFactoryModule { + @Provides + @Singleton + @IntoSet + fun providePrivacyPracticesViewModelFactory(): ViewModelFactoryPlugin { + return PrivacyPracticesViewModelFactory() + } +} + +private class PrivacyPracticesViewModelFactory() : ViewModelFactoryPlugin { + override fun create(modelClass: Class): T? { + with(modelClass) { + return when { + isAssignableFrom(PrivacyPracticesViewModel::class.java) -> (PrivacyPracticesViewModel() as T) + else -> null + } + } + } +} class PrivacyPracticesViewModel : ViewModel() { diff --git a/app/src/main/java/com/duckduckgo/app/privacy/ui/ScorecardViewModel.kt b/app/src/main/java/com/duckduckgo/app/privacy/ui/ScorecardViewModel.kt index f954f34df179..38f9e82b257b 100644 --- a/app/src/main/java/com/duckduckgo/app/privacy/ui/ScorecardViewModel.kt +++ b/app/src/main/java/com/duckduckgo/app/privacy/ui/ScorecardViewModel.kt @@ -23,13 +23,44 @@ import com.duckduckgo.app.global.DefaultDispatcherProvider import com.duckduckgo.app.global.DispatcherProvider import com.duckduckgo.app.global.model.Site import com.duckduckgo.app.global.model.domain +import com.duckduckgo.app.global.plugins.view_model.ViewModelFactoryPlugin import com.duckduckgo.app.privacy.db.UserWhitelistDao import com.duckduckgo.app.privacy.model.HttpsStatus import com.duckduckgo.app.privacy.model.PrivacyGrade import com.duckduckgo.app.privacy.model.PrivacyPractices import com.duckduckgo.app.privacy.model.PrivacyPractices.Summary.UNKNOWN +import com.duckduckgo.di.scopes.AppObjectGraph +import com.squareup.anvil.annotations.ContributesTo +import dagger.Module +import dagger.Provides +import dagger.multibindings.IntoSet import kotlinx.coroutines.launch import kotlinx.coroutines.withContext +import javax.inject.Singleton + +@Module +@ContributesTo(AppObjectGraph::class) +class ScorecardViewModelFactoryModule { + @Provides + @Singleton + @IntoSet + fun provideScorecardViewModelFactory(userWhitelistDao: UserWhitelistDao): ViewModelFactoryPlugin { + return ScorecardViewModelFactory(userWhitelistDao) + } +} + +private class ScorecardViewModelFactory( + private val userWhitelistDao: UserWhitelistDao, +) : ViewModelFactoryPlugin { + override fun create(modelClass: Class): T? { + with(modelClass) { + return when { + isAssignableFrom(ScorecardViewModel::class.java) -> ScorecardViewModel(userWhitelistDao) as T + else -> null + } + } + } +} class ScorecardViewModel( private val userWhitelistDao: UserWhitelistDao, diff --git a/app/src/main/java/com/duckduckgo/app/privacy/ui/TrackerNetworksViewModel.kt b/app/src/main/java/com/duckduckgo/app/privacy/ui/TrackerNetworksViewModel.kt index 6644b30abdb1..8b5b3beb5190 100644 --- a/app/src/main/java/com/duckduckgo/app/privacy/ui/TrackerNetworksViewModel.kt +++ b/app/src/main/java/com/duckduckgo/app/privacy/ui/TrackerNetworksViewModel.kt @@ -22,10 +22,39 @@ import androidx.lifecycle.ViewModel import com.duckduckgo.app.global.baseHost import com.duckduckgo.app.global.model.Site import com.duckduckgo.app.global.model.domain +import com.duckduckgo.app.global.plugins.view_model.ViewModelFactoryPlugin import com.duckduckgo.app.trackerdetection.model.Entity import com.duckduckgo.app.trackerdetection.model.TdsEntity import com.duckduckgo.app.trackerdetection.model.TrackingEvent +import com.duckduckgo.di.scopes.AppObjectGraph +import com.squareup.anvil.annotations.ContributesTo +import dagger.Module +import dagger.Provides +import dagger.multibindings.IntoSet import java.util.* +import javax.inject.Singleton + +@Module +@ContributesTo(AppObjectGraph::class) +class TrackerNetworksViewModelFactoryModule { + @Provides + @Singleton + @IntoSet + fun provideTrackerNetworksViewModelFactory(): ViewModelFactoryPlugin { + return TrackerNetworksViewModelFactory() + } +} + +private class TrackerNetworksViewModelFactory() : ViewModelFactoryPlugin { + override fun create(modelClass: Class): T? { + with(modelClass) { + return when { + isAssignableFrom(TrackerNetworksViewModel::class.java) -> (TrackerNetworksViewModel() as T) + else -> null + } + } + } +} class TrackerNetworksViewModel : ViewModel() { diff --git a/app/src/main/java/com/duckduckgo/app/privacy/ui/WhitelistViewModel.kt b/app/src/main/java/com/duckduckgo/app/privacy/ui/WhitelistViewModel.kt index d37c4f714ae6..12c9742b6b5d 100644 --- a/app/src/main/java/com/duckduckgo/app/privacy/ui/WhitelistViewModel.kt +++ b/app/src/main/java/com/duckduckgo/app/privacy/ui/WhitelistViewModel.kt @@ -24,12 +24,45 @@ import com.duckduckgo.app.global.DefaultDispatcherProvider import com.duckduckgo.app.global.DispatcherProvider import com.duckduckgo.app.global.SingleLiveEvent import com.duckduckgo.app.global.UriString +import com.duckduckgo.app.global.plugins.view_model.ViewModelFactoryPlugin import com.duckduckgo.app.privacy.db.UserWhitelistDao import com.duckduckgo.app.privacy.model.UserWhitelistedDomain import com.duckduckgo.app.privacy.ui.WhitelistViewModel.Command.* +import com.duckduckgo.di.scopes.AppObjectGraph +import com.squareup.anvil.annotations.ContributesTo +import dagger.Module +import dagger.Provides +import dagger.multibindings.IntoSet import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch import kotlinx.coroutines.withContext +import javax.inject.Singleton + +@Module +@ContributesTo(AppObjectGraph::class) +class WhitelistViewModelFactoryModule { + @Provides + @Singleton + @IntoSet + fun provideWhitelistViewModelFactory( + dao: UserWhitelistDao + ): ViewModelFactoryPlugin { + return WhitelistViewModelFactory(dao) + } +} + +private class WhitelistViewModelFactory( + private val dao: UserWhitelistDao +) : ViewModelFactoryPlugin { + override fun create(modelClass: Class): T? { + with(modelClass) { + return when { + isAssignableFrom(WhitelistViewModel::class.java) -> (WhitelistViewModel(dao) as T) + else -> null + } + } + } +} class WhitelistViewModel( private val dao: UserWhitelistDao, diff --git a/app/src/main/java/com/duckduckgo/app/settings/SettingsViewModel.kt b/app/src/main/java/com/duckduckgo/app/settings/SettingsViewModel.kt index 2ec7a9f018b2..417b194a0965 100644 --- a/app/src/main/java/com/duckduckgo/app/settings/SettingsViewModel.kt +++ b/app/src/main/java/com/duckduckgo/app/settings/SettingsViewModel.kt @@ -23,6 +23,7 @@ import com.duckduckgo.app.browser.defaultbrowsing.DefaultBrowserDetector import com.duckduckgo.app.fire.FireAnimationLoader import com.duckduckgo.app.global.DuckDuckGoTheme import com.duckduckgo.app.global.SingleLiveEvent +import com.duckduckgo.app.global.plugins.view_model.ViewModelFactoryPlugin import com.duckduckgo.app.icon.api.AppIcon import com.duckduckgo.app.settings.clear.ClearWhatOption import com.duckduckgo.app.settings.clear.ClearWhenOption @@ -34,8 +35,48 @@ import com.duckduckgo.app.statistics.pixels.Pixel import com.duckduckgo.app.statistics.pixels.Pixel.PixelName import com.duckduckgo.app.statistics.pixels.Pixel.PixelName.* import com.duckduckgo.app.statistics.pixels.Pixel.PixelParameter.FIRE_ANIMATION +import com.duckduckgo.di.scopes.AppObjectGraph +import com.squareup.anvil.annotations.ContributesTo +import dagger.Module +import dagger.Provides +import dagger.multibindings.IntoSet import timber.log.Timber import javax.inject.Inject +import javax.inject.Singleton + +@Module +@ContributesTo(AppObjectGraph::class) +class SettingsViewModelFactoryModule { + @Provides + @Singleton + @IntoSet + fun provideSettingsViewModelFactory( + settingsDataStore: SettingsDataStore, + defaultWebBrowserCapability: DefaultBrowserDetector, + variantManager: VariantManager, + fireAnimationLoader: FireAnimationLoader, + pixel: Pixel + ): ViewModelFactoryPlugin { + return SettingsViewModelFactory(settingsDataStore, defaultWebBrowserCapability, variantManager, fireAnimationLoader, pixel) + } +} + +private class SettingsViewModelFactory( + private val settingsDataStore: SettingsDataStore, + private val defaultWebBrowserCapability: DefaultBrowserDetector, + private val variantManager: VariantManager, + private val fireAnimationLoader: FireAnimationLoader, + private val pixel: Pixel +) : ViewModelFactoryPlugin { + override fun create(modelClass: Class): T? { + with(modelClass) { + return when { + isAssignableFrom(SettingsViewModel::class.java) -> (SettingsViewModel(settingsDataStore, defaultWebBrowserCapability, variantManager, fireAnimationLoader, pixel) as T) + else -> null + } + } + } +} class SettingsViewModel @Inject constructor( private val settingsDataStore: SettingsDataStore, diff --git a/app/src/main/java/com/duckduckgo/app/survey/ui/SurveyViewModel.kt b/app/src/main/java/com/duckduckgo/app/survey/ui/SurveyViewModel.kt index 067ceaff508d..3f0aa21a0790 100644 --- a/app/src/main/java/com/duckduckgo/app/survey/ui/SurveyViewModel.kt +++ b/app/src/main/java/com/duckduckgo/app/survey/ui/SurveyViewModel.kt @@ -26,12 +26,49 @@ import com.duckduckgo.app.global.DispatcherProvider import com.duckduckgo.app.global.SingleLiveEvent import com.duckduckgo.app.global.install.AppInstallStore import com.duckduckgo.app.global.install.daysInstalled +import com.duckduckgo.app.global.plugins.view_model.ViewModelFactoryPlugin import com.duckduckgo.app.statistics.store.StatisticsDataStore import com.duckduckgo.app.survey.db.SurveyDao import com.duckduckgo.app.survey.model.Survey +import com.duckduckgo.di.scopes.AppObjectGraph +import com.squareup.anvil.annotations.ContributesTo +import dagger.Module +import dagger.Provides +import dagger.multibindings.IntoSet import kotlinx.coroutines.NonCancellable import kotlinx.coroutines.launch import kotlinx.coroutines.withContext +import javax.inject.Singleton + +@Module +@ContributesTo(AppObjectGraph::class) +class SurveyViewModelFactoryModule { + @Provides + @Singleton + @IntoSet + fun provideSurveyViewModelFactory( + surveyDao: SurveyDao, + statisticsStore: StatisticsDataStore, + appInstallStore: AppInstallStore, + ): ViewModelFactoryPlugin { + return SurveyViewModelFactory(surveyDao, statisticsStore, appInstallStore) + } +} + +private class SurveyViewModelFactory( + private val surveyDao: SurveyDao, + private val statisticsStore: StatisticsDataStore, + private val appInstallStore: AppInstallStore +) : ViewModelFactoryPlugin { + override fun create(modelClass: Class): T? { + with(modelClass) { + return when { + isAssignableFrom(SurveyViewModel::class.java) -> (SurveyViewModel(surveyDao, statisticsStore, appInstallStore) as T) + else -> null + } + } + } +} class SurveyViewModel( private val surveyDao: SurveyDao, diff --git a/app/src/main/java/com/duckduckgo/app/systemsearch/SystemSearchViewModel.kt b/app/src/main/java/com/duckduckgo/app/systemsearch/SystemSearchViewModel.kt index 09099411ca8f..6e00764d5c47 100644 --- a/app/src/main/java/com/duckduckgo/app/systemsearch/SystemSearchViewModel.kt +++ b/app/src/main/java/com/duckduckgo/app/systemsearch/SystemSearchViewModel.kt @@ -21,15 +21,22 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.duckduckgo.app.autocomplete.api.AutoComplete import com.duckduckgo.app.autocomplete.api.AutoComplete.AutoCompleteResult +import com.duckduckgo.app.autocomplete.api.AutoCompleteApi import com.duckduckgo.app.global.DefaultDispatcherProvider import com.duckduckgo.app.global.DispatcherProvider import com.duckduckgo.app.global.SingleLiveEvent +import com.duckduckgo.app.global.plugins.view_model.ViewModelFactoryPlugin import com.duckduckgo.app.onboarding.store.AppStage import com.duckduckgo.app.onboarding.store.UserStageStore import com.duckduckgo.app.onboarding.store.isNewUser import com.duckduckgo.app.statistics.pixels.Pixel import com.duckduckgo.app.statistics.pixels.Pixel.PixelName.* +import com.duckduckgo.di.scopes.AppObjectGraph import com.jakewharton.rxrelay2.PublishRelay +import com.squareup.anvil.annotations.ContributesTo +import dagger.Module +import dagger.Provides +import dagger.multibindings.IntoSet import io.reactivex.Observable import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.disposables.Disposable @@ -39,6 +46,39 @@ import kotlinx.coroutines.Job import kotlinx.coroutines.launch import timber.log.Timber import java.util.concurrent.TimeUnit +import javax.inject.Singleton + +@Module +@ContributesTo(AppObjectGraph::class) +class SystemSearchViewModelFactoryModule { + @Provides + @Singleton + @IntoSet + fun provideSystemSearchViewModelFactory( + userStageStore: UserStageStore, + autoCompleteApi: AutoCompleteApi, + deviceAppLookup: DeviceAppLookup, + pixel: Pixel, + ): ViewModelFactoryPlugin { + return SystemSearchViewModelFactory(userStageStore, autoCompleteApi, deviceAppLookup, pixel) + } +} + +private class SystemSearchViewModelFactory( + private val userStageStore: UserStageStore, + private val autoComplete: AutoComplete, + private val deviceAppLookup: DeviceAppLookup, + private val pixel: Pixel +) : ViewModelFactoryPlugin { + override fun create(modelClass: Class): T? { + with(modelClass) { + return when { + isAssignableFrom(SystemSearchViewModel::class.java) -> (SystemSearchViewModel(userStageStore, autoComplete, deviceAppLookup, pixel) as T) + else -> null + } + } + } +} data class SystemSearchResult(val autocomplete: AutoCompleteResult, val deviceApps: List) diff --git a/app/src/main/java/com/duckduckgo/app/tabs/ui/TabSwitcherViewModel.kt b/app/src/main/java/com/duckduckgo/app/tabs/ui/TabSwitcherViewModel.kt index 82ceb8ba1914..15119f2e6cec 100644 --- a/app/src/main/java/com/duckduckgo/app/tabs/ui/TabSwitcherViewModel.kt +++ b/app/src/main/java/com/duckduckgo/app/tabs/ui/TabSwitcherViewModel.kt @@ -24,8 +24,44 @@ import androidx.lifecycle.viewModelScope import com.duckduckgo.app.browser.R import com.duckduckgo.app.browser.session.WebViewSessionStorage import com.duckduckgo.app.global.SingleLiveEvent +import com.duckduckgo.app.global.plugins.view_model.ViewModelFactoryPlugin import com.duckduckgo.app.tabs.model.TabEntity import com.duckduckgo.app.tabs.model.TabRepository +import com.duckduckgo.di.scopes.AppObjectGraph +import com.squareup.anvil.annotations.ContributesTo +import dagger.Module +import dagger.Provides +import dagger.multibindings.IntoSet +import javax.inject.Singleton + +@Module +@ContributesTo(AppObjectGraph::class) +class TabSwitcherViewModelFactoryModule { + @Provides + @Singleton + @IntoSet + fun provideTabSwitcherViewModelFactory( + tabRepository: TabRepository, + webViewSessionStorage: WebViewSessionStorage + ): ViewModelFactoryPlugin { + return TabSwitcherViewModelFactory(tabRepository, webViewSessionStorage) + } +} + +private class TabSwitcherViewModelFactory( + private val tabRepository: TabRepository, + private val webViewSessionStorage: WebViewSessionStorage +) : ViewModelFactoryPlugin { + override fun create(modelClass: Class): T? { + with(modelClass) { + return when { + isAssignableFrom(TabSwitcherViewModel::class.java) -> TabSwitcherViewModel(tabRepository, webViewSessionStorage) as T + else -> null + } + } + } + +} class TabSwitcherViewModel(private val tabRepository: TabRepository, private val webViewSessionStorage: WebViewSessionStorage) : ViewModel() { diff --git a/app/src/main/java/com/duckduckgo/app/widget/ui/AddWidgetInstructionsViewModel.kt b/app/src/main/java/com/duckduckgo/app/widget/ui/AddWidgetInstructionsViewModel.kt index 0d5db08e79c2..47881db683ca 100644 --- a/app/src/main/java/com/duckduckgo/app/widget/ui/AddWidgetInstructionsViewModel.kt +++ b/app/src/main/java/com/duckduckgo/app/widget/ui/AddWidgetInstructionsViewModel.kt @@ -18,8 +18,37 @@ package com.duckduckgo.app.widget.ui import androidx.lifecycle.ViewModel import com.duckduckgo.app.global.SingleLiveEvent +import com.duckduckgo.app.global.plugins.view_model.ViewModelFactoryPlugin import com.duckduckgo.app.widget.ui.AddWidgetInstructionsViewModel.Command.Close import com.duckduckgo.app.widget.ui.AddWidgetInstructionsViewModel.Command.ShowHome +import com.duckduckgo.di.scopes.AppObjectGraph +import com.squareup.anvil.annotations.ContributesTo +import dagger.Module +import dagger.Provides +import dagger.multibindings.IntoSet +import javax.inject.Singleton + +@Module +@ContributesTo(AppObjectGraph::class) +class AddWidgetInstructionsViewModelFactoryModule { + @Provides + @Singleton + @IntoSet + fun provideAddWidgetInstructionsViewModelFactory(): ViewModelFactoryPlugin { + return AddWidgetInstructionsViewModelFactory() + } +} + +private class AddWidgetInstructionsViewModelFactory() : ViewModelFactoryPlugin { + override fun create(modelClass: Class): T? { + with(modelClass) { + return when { + isAssignableFrom(AddWidgetInstructionsViewModel::class.java) -> (AddWidgetInstructionsViewModel() as T) + else -> null + } + } + } +} class AddWidgetInstructionsViewModel : ViewModel() { diff --git a/common/src/main/java/com/duckduckgo/app/global/plugins/view_model/ViewModelFactoryPlugin.kt b/common/src/main/java/com/duckduckgo/app/global/plugins/view_model/ViewModelFactoryPlugin.kt new file mode 100644 index 000000000000..8885f5e7a972 --- /dev/null +++ b/common/src/main/java/com/duckduckgo/app/global/plugins/view_model/ViewModelFactoryPlugin.kt @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2021 DuckDuckGo + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.duckduckgo.app.global.plugins.view_model + +import androidx.lifecycle.ViewModel +import com.duckduckgo.app.global.plugins.PluginPoint +import javax.inject.Inject +import javax.inject.Singleton + +interface ViewModelFactoryPlugin { + fun create(modelClass: Class): T? +} + +@Singleton +class ViewModelFactoryPluginPoint @Inject constructor( + private val injectorPlugins: Set<@JvmSuppressWildcards ViewModelFactoryPlugin> +) : PluginPoint { + override fun getPlugins(): List { + return injectorPlugins.toList() + } +} From dc804bd304a176648b308a92476d53ac447ccf33 Mon Sep 17 00:00:00 2001 From: Aitor Viana Date: Thu, 11 Mar 2021 12:21:27 +0100 Subject: [PATCH 2/2] Moved dagger module and VM factory to the botton of the files --- .../app/bookmarks/ui/BookmarksViewModel.kt | 60 ++--- .../app/brokensite/BrokenSiteViewModel.kt | 56 ++--- .../app/browser/BrowserTabViewModel.kt | 230 +++++++++--------- .../app/browser/BrowserViewModel.kt | 80 +++--- .../feedback/ui/common/FeedbackViewModel.kt | 56 ++--- .../InitialFeedbackFragmentViewModel.kt | 40 +-- .../BrokenSiteNegativeFeedbackViewModel.kt | 28 +-- ...ShareOpenEndedNegativeFeedbackViewModel.kt | 38 +-- .../PositiveFeedbackLandingViewModel.kt | 44 ++-- .../ui/FireproofWebsitesViewModel.kt | 68 +++--- .../ui/GlobalPrivacyControlViewModel.kt | 56 ++--- .../app/icon/ui/ChangeIconViewModel.kt | 59 +++-- .../duckduckgo/app/launch/LaunchViewModel.kt | 56 ++--- .../ui/LocationPermissionsViewModel.kt | 68 +++--- .../app/onboarding/ui/OnboardingViewModel.kt | 53 ++-- .../ui/page/DefaultBrowserPageViewModel.kt | 60 ++--- .../privacy/ui/PrivacyDashboardViewModel.kt | 60 ++--- .../privacy/ui/PrivacyPracticesViewModel.kt | 44 ++-- .../app/privacy/ui/ScorecardViewModel.kt | 48 ++-- .../privacy/ui/TrackerNetworksViewModel.kt | 44 ++-- .../app/privacy/ui/WhitelistViewModel.kt | 52 ++-- .../app/settings/SettingsViewModel.kt | 68 +++--- .../app/survey/ui/SurveyViewModel.kt | 60 ++--- .../app/systemsearch/SystemSearchViewModel.kt | 64 ++--- .../app/tabs/ui/TabSwitcherViewModel.kt | 57 +++-- .../ui/AddWidgetInstructionsViewModel.kt | 36 +-- 26 files changed, 791 insertions(+), 794 deletions(-) diff --git a/app/src/main/java/com/duckduckgo/app/bookmarks/ui/BookmarksViewModel.kt b/app/src/main/java/com/duckduckgo/app/bookmarks/ui/BookmarksViewModel.kt index 39841b13f2fd..1656deae3e72 100644 --- a/app/src/main/java/com/duckduckgo/app/bookmarks/ui/BookmarksViewModel.kt +++ b/app/src/main/java/com/duckduckgo/app/bookmarks/ui/BookmarksViewModel.kt @@ -39,36 +39,6 @@ import kotlinx.coroutines.NonCancellable import kotlinx.coroutines.launch import javax.inject.Singleton -@Module -@ContributesTo(AppObjectGraph::class) -class BookmarksViewModelFactoryModule { - @Provides - @Singleton - @IntoSet - fun provideBookmarksViewModelFactory( - dao: BookmarksDao, - faviconManager: FaviconManager, - dispatcherProvider: DispatcherProvider - ): ViewModelFactoryPlugin { - return BookmarksViewModelFactory(dao, faviconManager, dispatcherProvider) - } -} - -private class BookmarksViewModelFactory( - private val dao: BookmarksDao, - private val faviconManager: FaviconManager, - private val dispatcherProvider: DispatcherProvider -) : ViewModelFactoryPlugin { - override fun create(modelClass: Class): T? { - with(modelClass) { - return when { - isAssignableFrom(BookmarksViewModel::class.java) -> (BookmarksViewModel(dao, faviconManager, dispatcherProvider) as T) - else -> null - } - } - } -} - class BookmarksViewModel( val dao: BookmarksDao, private val faviconManager: FaviconManager, @@ -149,3 +119,33 @@ class BookmarksViewModel( } } + +@Module +@ContributesTo(AppObjectGraph::class) +class BookmarksViewModelFactoryModule { + @Provides + @Singleton + @IntoSet + fun provideBookmarksViewModelFactory( + dao: BookmarksDao, + faviconManager: FaviconManager, + dispatcherProvider: DispatcherProvider + ): ViewModelFactoryPlugin { + return BookmarksViewModelFactory(dao, faviconManager, dispatcherProvider) + } +} + +private class BookmarksViewModelFactory( + private val dao: BookmarksDao, + private val faviconManager: FaviconManager, + private val dispatcherProvider: DispatcherProvider +) : ViewModelFactoryPlugin { + override fun create(modelClass: Class): T? { + with(modelClass) { + return when { + isAssignableFrom(BookmarksViewModel::class.java) -> (BookmarksViewModel(dao, faviconManager, dispatcherProvider) as T) + else -> null + } + } + } +} diff --git a/app/src/main/java/com/duckduckgo/app/brokensite/BrokenSiteViewModel.kt b/app/src/main/java/com/duckduckgo/app/brokensite/BrokenSiteViewModel.kt index ccd9d9d52fc1..5a93747b088c 100644 --- a/app/src/main/java/com/duckduckgo/app/brokensite/BrokenSiteViewModel.kt +++ b/app/src/main/java/com/duckduckgo/app/brokensite/BrokenSiteViewModel.kt @@ -36,34 +36,6 @@ import dagger.Provides import dagger.multibindings.IntoSet import javax.inject.Singleton -@Module -@ContributesTo(AppObjectGraph::class) -class BrokenSiteViewModelFactoryModule { - @Provides - @Singleton - @IntoSet - fun provideBrokenSiteViewModelFactory( - pixel: Pixel, - brokenSiteSender: BrokenSiteSender - ): ViewModelFactoryPlugin { - return BrokenSiteViewModelFactory(pixel, brokenSiteSender) - } -} - -private class BrokenSiteViewModelFactory( - private val pixel: Pixel, - private val brokenSiteSender: BrokenSiteSender -) : ViewModelFactoryPlugin { - override fun create(modelClass: Class): T? { - with(modelClass) { - return when { - isAssignableFrom(BrokenSiteViewModel::class.java) -> (BrokenSiteViewModel(pixel, brokenSiteSender) as T) - else -> null - } - } - } -} - class BrokenSiteViewModel(private val pixel: Pixel, private val brokenSiteSender: BrokenSiteSender) : ViewModel() { data class ViewState( @@ -153,3 +125,31 @@ class BrokenSiteViewModel(private val pixel: Pixel, private val brokenSiteSender const val DESKTOP_SITE = "desktop" } } + +@Module +@ContributesTo(AppObjectGraph::class) +class BrokenSiteViewModelFactoryModule { + @Provides + @Singleton + @IntoSet + fun provideBrokenSiteViewModelFactory( + pixel: Pixel, + brokenSiteSender: BrokenSiteSender + ): ViewModelFactoryPlugin { + return BrokenSiteViewModelFactory(pixel, brokenSiteSender) + } +} + +private class BrokenSiteViewModelFactory( + private val pixel: Pixel, + private val brokenSiteSender: BrokenSiteSender +) : ViewModelFactoryPlugin { + override fun create(modelClass: Class): T? { + with(modelClass) { + return when { + isAssignableFrom(BrokenSiteViewModel::class.java) -> (BrokenSiteViewModel(pixel, brokenSiteSender) as T) + else -> null + } + } + } +} diff --git a/app/src/main/java/com/duckduckgo/app/browser/BrowserTabViewModel.kt b/app/src/main/java/com/duckduckgo/app/browser/BrowserTabViewModel.kt index a8b6144eddfd..3f24da3e7456 100644 --- a/app/src/main/java/com/duckduckgo/app/browser/BrowserTabViewModel.kt +++ b/app/src/main/java/com/duckduckgo/app/browser/BrowserTabViewModel.kt @@ -119,121 +119,6 @@ import java.util.* import java.util.concurrent.TimeUnit import javax.inject.Singleton -@Module -@ContributesTo(AppObjectGraph::class) -class BrowserTabViewModelFactoryModule { - @Provides - @Singleton - @IntoSet - fun proideBrowserTabViewModelFactory( - statisticsUpdater: StatisticsUpdater, - queryUrlConverter: QueryUrlConverter, - duckDuckGoUrlDetector: DuckDuckGoUrlDetector, - siteFactory: SiteFactory, - tabRepository: TabRepository, - userWhitelistDao: UserWhitelistDao, - networkLeaderboardDao: NetworkLeaderboardDao, - bookmarksDao: BookmarksDao, - fireproofWebsiteRepository: FireproofWebsiteRepository, - locationPermissionsRepository: LocationPermissionsRepository, - geoLocationPermissions: GeoLocationPermissions, - navigationAwareLoginDetector: NavigationAwareLoginDetector, - autoCompleteApi: AutoCompleteApi, - appSettingsPreferencesStore: SettingsDataStore, - longPressHandler: LongPressHandler, - webViewSessionStorage: WebViewSessionStorage, - specialUrlDetector: SpecialUrlDetector, - faviconManager: FaviconManager, - addToHomeCapabilityDetector: AddToHomeCapabilityDetector, - ctaViewModel: CtaViewModel, - searchCountDao: SearchCountDao, - pixel: Pixel, - dispatchers: DispatcherProvider = DefaultDispatcherProvider(), - userEventsStore: UserEventsStore, - notificationDao: NotificationDao, - useOurAppDetector: UseOurAppDetector, - variantManager: VariantManager, - fileDownloader: FileDownloader, - globalPrivacyControl: GlobalPrivacyControl, - fireproofDialogsEventHandler: FireproofDialogsEventHandler - ): ViewModelFactoryPlugin { - return BrowserTabViewModelFactory( - statisticsUpdater, - queryUrlConverter, - duckDuckGoUrlDetector, - siteFactory, - tabRepository, - userWhitelistDao, - networkLeaderboardDao, - bookmarksDao, - fireproofWebsiteRepository, - locationPermissionsRepository, - geoLocationPermissions, - navigationAwareLoginDetector, - autoCompleteApi, - appSettingsPreferencesStore, - longPressHandler, - webViewSessionStorage, - specialUrlDetector, - faviconManager, - addToHomeCapabilityDetector, - ctaViewModel, - searchCountDao, - pixel, - dispatchers, - userEventsStore, - notificationDao, - useOurAppDetector, - variantManager, - fileDownloader, - globalPrivacyControl, - fireproofDialogsEventHandler - ) - } -} - -private class BrowserTabViewModelFactory( - private val statisticsUpdater: StatisticsUpdater, - private val queryUrlConverter: OmnibarEntryConverter, - private val duckDuckGoUrlDetector: DuckDuckGoUrlDetector, - private val siteFactory: SiteFactory, - private val tabRepository: TabRepository, - private val userWhitelistDao: UserWhitelistDao, - private val networkLeaderboardDao: NetworkLeaderboardDao, - private val bookmarksDao: BookmarksDao, - private val fireproofWebsiteRepository: FireproofWebsiteRepository, - private val locationPermissionsRepository: LocationPermissionsRepository, - private val geoLocationPermissions: GeoLocationPermissions, - private val navigationAwareLoginDetector: NavigationAwareLoginDetector, - private val autoComplete: AutoComplete, - private val appSettingsPreferencesStore: SettingsDataStore, - private val longPressHandler: LongPressHandler, - private val webViewSessionStorage: WebViewSessionStorage, - private val specialUrlDetector: SpecialUrlDetector, - private val faviconManager: FaviconManager, - private val addToHomeCapabilityDetector: AddToHomeCapabilityDetector, - private val ctaViewModel: CtaViewModel, - private val searchCountDao: SearchCountDao, - private val pixel: Pixel, - private val dispatchers: DispatcherProvider = DefaultDispatcherProvider(), - private val userEventsStore: UserEventsStore, - private val notificationDao: NotificationDao, - private val useOurAppDetector: UseOurAppDetector, - private val variantManager: VariantManager, - private val fileDownloader: FileDownloader, - private val globalPrivacyControl: GlobalPrivacyControl, - private val fireproofDialogsEventHandler: FireproofDialogsEventHandler -) : ViewModelFactoryPlugin { - override fun create(modelClass: Class): T? { - with(modelClass) { - return when { - isAssignableFrom(BrowserTabViewModel::class.java) -> BrowserTabViewModel(statisticsUpdater, queryUrlConverter, duckDuckGoUrlDetector, siteFactory, tabRepository, userWhitelistDao, networkLeaderboardDao, bookmarksDao, fireproofWebsiteRepository, locationPermissionsRepository, geoLocationPermissions, navigationAwareLoginDetector, autoComplete, appSettingsPreferencesStore, longPressHandler, webViewSessionStorage, specialUrlDetector, faviconManager, addToHomeCapabilityDetector, ctaViewModel, searchCountDao, pixel, dispatchers, userEventsStore, notificationDao, useOurAppDetector, variantManager, fileDownloader, globalPrivacyControl, fireproofDialogsEventHandler) as T - else -> null - } - } - } -} - class BrowserTabViewModel( private val statisticsUpdater: StatisticsUpdater, private val queryUrlConverter: OmnibarEntryConverter, @@ -1956,3 +1841,118 @@ class BrowserTabViewModel( private const val ONE_HOUR_IN_MS = 3_600_000 } } + +@Module +@ContributesTo(AppObjectGraph::class) +class BrowserTabViewModelFactoryModule { + @Provides + @Singleton + @IntoSet + fun provideBrowserTabViewModelFactory( + statisticsUpdater: StatisticsUpdater, + queryUrlConverter: QueryUrlConverter, + duckDuckGoUrlDetector: DuckDuckGoUrlDetector, + siteFactory: SiteFactory, + tabRepository: TabRepository, + userWhitelistDao: UserWhitelistDao, + networkLeaderboardDao: NetworkLeaderboardDao, + bookmarksDao: BookmarksDao, + fireproofWebsiteRepository: FireproofWebsiteRepository, + locationPermissionsRepository: LocationPermissionsRepository, + geoLocationPermissions: GeoLocationPermissions, + navigationAwareLoginDetector: NavigationAwareLoginDetector, + autoCompleteApi: AutoCompleteApi, + appSettingsPreferencesStore: SettingsDataStore, + longPressHandler: LongPressHandler, + webViewSessionStorage: WebViewSessionStorage, + specialUrlDetector: SpecialUrlDetector, + faviconManager: FaviconManager, + addToHomeCapabilityDetector: AddToHomeCapabilityDetector, + ctaViewModel: CtaViewModel, + searchCountDao: SearchCountDao, + pixel: Pixel, + dispatchers: DispatcherProvider = DefaultDispatcherProvider(), + userEventsStore: UserEventsStore, + notificationDao: NotificationDao, + useOurAppDetector: UseOurAppDetector, + variantManager: VariantManager, + fileDownloader: FileDownloader, + globalPrivacyControl: GlobalPrivacyControl, + fireproofDialogsEventHandler: FireproofDialogsEventHandler + ): ViewModelFactoryPlugin { + return BrowserTabViewModelFactory( + statisticsUpdater, + queryUrlConverter, + duckDuckGoUrlDetector, + siteFactory, + tabRepository, + userWhitelistDao, + networkLeaderboardDao, + bookmarksDao, + fireproofWebsiteRepository, + locationPermissionsRepository, + geoLocationPermissions, + navigationAwareLoginDetector, + autoCompleteApi, + appSettingsPreferencesStore, + longPressHandler, + webViewSessionStorage, + specialUrlDetector, + faviconManager, + addToHomeCapabilityDetector, + ctaViewModel, + searchCountDao, + pixel, + dispatchers, + userEventsStore, + notificationDao, + useOurAppDetector, + variantManager, + fileDownloader, + globalPrivacyControl, + fireproofDialogsEventHandler + ) + } +} + +private class BrowserTabViewModelFactory( + private val statisticsUpdater: StatisticsUpdater, + private val queryUrlConverter: OmnibarEntryConverter, + private val duckDuckGoUrlDetector: DuckDuckGoUrlDetector, + private val siteFactory: SiteFactory, + private val tabRepository: TabRepository, + private val userWhitelistDao: UserWhitelistDao, + private val networkLeaderboardDao: NetworkLeaderboardDao, + private val bookmarksDao: BookmarksDao, + private val fireproofWebsiteRepository: FireproofWebsiteRepository, + private val locationPermissionsRepository: LocationPermissionsRepository, + private val geoLocationPermissions: GeoLocationPermissions, + private val navigationAwareLoginDetector: NavigationAwareLoginDetector, + private val autoComplete: AutoComplete, + private val appSettingsPreferencesStore: SettingsDataStore, + private val longPressHandler: LongPressHandler, + private val webViewSessionStorage: WebViewSessionStorage, + private val specialUrlDetector: SpecialUrlDetector, + private val faviconManager: FaviconManager, + private val addToHomeCapabilityDetector: AddToHomeCapabilityDetector, + private val ctaViewModel: CtaViewModel, + private val searchCountDao: SearchCountDao, + private val pixel: Pixel, + private val dispatchers: DispatcherProvider = DefaultDispatcherProvider(), + private val userEventsStore: UserEventsStore, + private val notificationDao: NotificationDao, + private val useOurAppDetector: UseOurAppDetector, + private val variantManager: VariantManager, + private val fileDownloader: FileDownloader, + private val globalPrivacyControl: GlobalPrivacyControl, + private val fireproofDialogsEventHandler: FireproofDialogsEventHandler +) : ViewModelFactoryPlugin { + override fun create(modelClass: Class): T? { + with(modelClass) { + return when { + isAssignableFrom(BrowserTabViewModel::class.java) -> BrowserTabViewModel(statisticsUpdater, queryUrlConverter, duckDuckGoUrlDetector, siteFactory, tabRepository, userWhitelistDao, networkLeaderboardDao, bookmarksDao, fireproofWebsiteRepository, locationPermissionsRepository, geoLocationPermissions, navigationAwareLoginDetector, autoComplete, appSettingsPreferencesStore, longPressHandler, webViewSessionStorage, specialUrlDetector, faviconManager, addToHomeCapabilityDetector, ctaViewModel, searchCountDao, pixel, dispatchers, userEventsStore, notificationDao, useOurAppDetector, variantManager, fileDownloader, globalPrivacyControl, fireproofDialogsEventHandler) as T + else -> null + } + } + } +} diff --git a/app/src/main/java/com/duckduckgo/app/browser/BrowserViewModel.kt b/app/src/main/java/com/duckduckgo/app/browser/BrowserViewModel.kt index 35b9f469f61f..e2a713f83b29 100644 --- a/app/src/main/java/com/duckduckgo/app/browser/BrowserViewModel.kt +++ b/app/src/main/java/com/duckduckgo/app/browser/BrowserViewModel.kt @@ -55,46 +55,6 @@ import timber.log.Timber import javax.inject.Singleton import kotlin.coroutines.CoroutineContext -@Module -@ContributesTo(AppObjectGraph::class) -class BrowserViewModelFactoryModule { - @Provides - @Singleton - @IntoSet - fun provideBrowserViewModelFactory( - tabRepository: TabRepository, - queryUrlConverter: QueryUrlConverter, - dataClearer: DataClearer, - appEnjoymentPromptEmitter: AppEnjoymentPromptEmitter, - appEnjoymentUserEventRecorder: AppEnjoymentUserEventRecorder, - dispatchers: DispatcherProvider = DefaultDispatcherProvider(), - pixel: Pixel, - useOurAppDetector: UseOurAppDetector - ): ViewModelFactoryPlugin { - return BrowserViewModelFactory(tabRepository, queryUrlConverter, dataClearer, appEnjoymentPromptEmitter, appEnjoymentUserEventRecorder, dispatchers, pixel, useOurAppDetector) - } -} - -private class BrowserViewModelFactory( - val tabRepository: TabRepository, - val queryUrlConverter: OmnibarEntryConverter, - val dataClearer: DataClearer, - val appEnjoymentPromptEmitter: AppEnjoymentPromptEmitter, - val appEnjoymentUserEventRecorder: AppEnjoymentUserEventRecorder, - val dispatchers: DispatcherProvider = DefaultDispatcherProvider(), - val pixel: Pixel, - val useOurAppDetector: UseOurAppDetector -) : ViewModelFactoryPlugin { - override fun create(modelClass: Class): T? { - with(modelClass) { - return when { - isAssignableFrom(BrowserViewModel::class.java) -> BrowserViewModel(tabRepository, queryUrlConverter, dataClearer, appEnjoymentPromptEmitter, appEnjoymentUserEventRecorder, dispatchers, pixel, useOurAppDetector) as T - else -> null - } - } - } -} - class BrowserViewModel( private val tabRepository: TabRepository, private val queryUrlConverter: OmnibarEntryConverter, @@ -279,3 +239,43 @@ class BrowserViewModel( } } } + +@Module +@ContributesTo(AppObjectGraph::class) +class BrowserViewModelFactoryModule { + @Provides + @Singleton + @IntoSet + fun provideBrowserViewModelFactory( + tabRepository: TabRepository, + queryUrlConverter: QueryUrlConverter, + dataClearer: DataClearer, + appEnjoymentPromptEmitter: AppEnjoymentPromptEmitter, + appEnjoymentUserEventRecorder: AppEnjoymentUserEventRecorder, + dispatchers: DispatcherProvider = DefaultDispatcherProvider(), + pixel: Pixel, + useOurAppDetector: UseOurAppDetector + ): ViewModelFactoryPlugin { + return BrowserViewModelFactory(tabRepository, queryUrlConverter, dataClearer, appEnjoymentPromptEmitter, appEnjoymentUserEventRecorder, dispatchers, pixel, useOurAppDetector) + } +} + +private class BrowserViewModelFactory( + val tabRepository: TabRepository, + val queryUrlConverter: OmnibarEntryConverter, + val dataClearer: DataClearer, + val appEnjoymentPromptEmitter: AppEnjoymentPromptEmitter, + val appEnjoymentUserEventRecorder: AppEnjoymentUserEventRecorder, + val dispatchers: DispatcherProvider = DefaultDispatcherProvider(), + val pixel: Pixel, + val useOurAppDetector: UseOurAppDetector +) : ViewModelFactoryPlugin { + override fun create(modelClass: Class): T? { + with(modelClass) { + return when { + isAssignableFrom(BrowserViewModel::class.java) -> BrowserViewModel(tabRepository, queryUrlConverter, dataClearer, appEnjoymentPromptEmitter, appEnjoymentUserEventRecorder, dispatchers, pixel, useOurAppDetector) as T + else -> null + } + } + } +} diff --git a/app/src/main/java/com/duckduckgo/app/feedback/ui/common/FeedbackViewModel.kt b/app/src/main/java/com/duckduckgo/app/feedback/ui/common/FeedbackViewModel.kt index 9ee295042e15..87a46146d551 100644 --- a/app/src/main/java/com/duckduckgo/app/feedback/ui/common/FeedbackViewModel.kt +++ b/app/src/main/java/com/duckduckgo/app/feedback/ui/common/FeedbackViewModel.kt @@ -39,34 +39,6 @@ import kotlinx.coroutines.withContext import timber.log.Timber import javax.inject.Singleton -@Module -@ContributesTo(AppObjectGraph::class) -class FeedbackViewModelFactoryModule { - @Provides - @Singleton - @IntoSet - fun provideFeedbackViewModelFactory( - playStoreUtils: PlayStoreUtils, - feedbackSubmitter: FeedbackSubmitter - ): ViewModelFactoryPlugin { - return FeedbackViewModelFactory(playStoreUtils, feedbackSubmitter) - } -} - -private class FeedbackViewModelFactory( - private val playStoreUtils: PlayStoreUtils, - private val feedbackSubmitter: FeedbackSubmitter -) : ViewModelFactoryPlugin { - override fun create(modelClass: Class): T? { - with(modelClass) { - return when { - isAssignableFrom(FeedbackViewModel::class.java) -> (FeedbackViewModel(playStoreUtils, feedbackSubmitter) as T) - else -> null - } - } - } -} - class FeedbackViewModel(private val playStoreUtils: PlayStoreUtils, private val feedbackSubmitter: FeedbackSubmitter) : ViewModel() { val command: SingleLiveEvent = SingleLiveEvent() @@ -317,3 +289,31 @@ data class UpdateViewCommand( val mainReason: MainReason? = null, val subReason: SubReason? = null ) + +@Module +@ContributesTo(AppObjectGraph::class) +class FeedbackViewModelFactoryModule { + @Provides + @Singleton + @IntoSet + fun provideFeedbackViewModelFactory( + playStoreUtils: PlayStoreUtils, + feedbackSubmitter: FeedbackSubmitter + ): ViewModelFactoryPlugin { + return FeedbackViewModelFactory(playStoreUtils, feedbackSubmitter) + } +} + +private class FeedbackViewModelFactory( + private val playStoreUtils: PlayStoreUtils, + private val feedbackSubmitter: FeedbackSubmitter +) : ViewModelFactoryPlugin { + override fun create(modelClass: Class): T? { + with(modelClass) { + return when { + isAssignableFrom(FeedbackViewModel::class.java) -> (FeedbackViewModel(playStoreUtils, feedbackSubmitter) as T) + else -> null + } + } + } +} diff --git a/app/src/main/java/com/duckduckgo/app/feedback/ui/initial/InitialFeedbackFragmentViewModel.kt b/app/src/main/java/com/duckduckgo/app/feedback/ui/initial/InitialFeedbackFragmentViewModel.kt index 9f771dc1689b..f247b4a33aab 100644 --- a/app/src/main/java/com/duckduckgo/app/feedback/ui/initial/InitialFeedbackFragmentViewModel.kt +++ b/app/src/main/java/com/duckduckgo/app/feedback/ui/initial/InitialFeedbackFragmentViewModel.kt @@ -27,6 +27,26 @@ import dagger.Provides import dagger.multibindings.IntoSet import javax.inject.Singleton +class InitialFeedbackFragmentViewModel : ViewModel() { + + val viewState: MutableLiveData = MutableLiveData() + val command: MutableLiveData = MutableLiveData() + + fun onPositiveFeedback() { + command.value = Command.PositiveFeedbackSelected + } + + fun onNegativeFeedback() { + command.value = Command.NegativeFeedbackSelected + } + + sealed class Command { + object PositiveFeedbackSelected : Command() + object NegativeFeedbackSelected : Command() + object UserCancelled : Command() + } +} + @Module @ContributesTo(AppObjectGraph::class) class InitialFeedbackFragmentViewModelFactoryModule { @@ -48,23 +68,3 @@ private class InitialFeedbackFragmentViewModelFactory() : ViewModelFactoryPlugin } } } - -class InitialFeedbackFragmentViewModel : ViewModel() { - - val viewState: MutableLiveData = MutableLiveData() - val command: MutableLiveData = MutableLiveData() - - fun onPositiveFeedback() { - command.value = Command.PositiveFeedbackSelected - } - - fun onNegativeFeedback() { - command.value = Command.NegativeFeedbackSelected - } - - sealed class Command { - object PositiveFeedbackSelected : Command() - object NegativeFeedbackSelected : Command() - object UserCancelled : Command() - } -} diff --git a/app/src/main/java/com/duckduckgo/app/feedback/ui/negative/brokensite/BrokenSiteNegativeFeedbackViewModel.kt b/app/src/main/java/com/duckduckgo/app/feedback/ui/negative/brokensite/BrokenSiteNegativeFeedbackViewModel.kt index 1a7502ad87b0..67fc04a94bbc 100644 --- a/app/src/main/java/com/duckduckgo/app/feedback/ui/negative/brokensite/BrokenSiteNegativeFeedbackViewModel.kt +++ b/app/src/main/java/com/duckduckgo/app/feedback/ui/negative/brokensite/BrokenSiteNegativeFeedbackViewModel.kt @@ -26,6 +26,20 @@ import dagger.Provides import dagger.multibindings.IntoSet import javax.inject.Singleton +class BrokenSiteNegativeFeedbackViewModel : ViewModel() { + + val command: SingleLiveEvent = SingleLiveEvent() + + fun userSubmittingFeedback(feedback: String, brokenSite: String?) { + command.value = Command.ExitAndSubmitFeedback(feedback, brokenSite) + } + + sealed class Command { + data class ExitAndSubmitFeedback(val feedback: String, val brokenSite: String?) : Command() + object Exit : Command() + } +} + @Module @ContributesTo(AppObjectGraph::class) class BrokenSiteNegativeFeedbackViewModelFactoryModule { @@ -47,17 +61,3 @@ private class BrokenSiteNegativeFeedbackViewModelFactory() : ViewModelFactoryPlu } } } - -class BrokenSiteNegativeFeedbackViewModel : ViewModel() { - - val command: SingleLiveEvent = SingleLiveEvent() - - fun userSubmittingFeedback(feedback: String, brokenSite: String?) { - command.value = Command.ExitAndSubmitFeedback(feedback, brokenSite) - } - - sealed class Command { - data class ExitAndSubmitFeedback(val feedback: String, val brokenSite: String?) : Command() - object Exit : Command() - } -} diff --git a/app/src/main/java/com/duckduckgo/app/feedback/ui/negative/openended/ShareOpenEndedNegativeFeedbackViewModel.kt b/app/src/main/java/com/duckduckgo/app/feedback/ui/negative/openended/ShareOpenEndedNegativeFeedbackViewModel.kt index e9bb78aee266..5161da230abe 100644 --- a/app/src/main/java/com/duckduckgo/app/feedback/ui/negative/openended/ShareOpenEndedNegativeFeedbackViewModel.kt +++ b/app/src/main/java/com/duckduckgo/app/feedback/ui/negative/openended/ShareOpenEndedNegativeFeedbackViewModel.kt @@ -28,6 +28,25 @@ import dagger.Provides import dagger.multibindings.IntoSet import javax.inject.Singleton +class ShareOpenEndedNegativeFeedbackViewModel : ViewModel() { + + val command: SingleLiveEvent = SingleLiveEvent() + + fun userSubmittingPositiveFeedback(feedback: String) { + command.value = Command.ExitAndSubmitPositiveFeedback(feedback) + } + + fun userSubmittingNegativeFeedback(mainReason: MainReason, subReason: SubReason?, openEndedComment: String) { + command.value = Command.ExitAndSubmitNegativeFeedback(mainReason, subReason, openEndedComment) + } + + sealed class Command { + data class ExitAndSubmitNegativeFeedback(val mainReason: MainReason, val subReason: SubReason?, val feedback: String) : Command() + data class ExitAndSubmitPositiveFeedback(val feedback: String) : Command() + object Exit : Command() + } +} + @Module @ContributesTo(AppObjectGraph::class) class ShareOpenEndedNegativeFeedbackViewModelFactoryModule { @@ -49,22 +68,3 @@ private class ShareOpenEndedNegativeFeedbackViewModelFactory() : ViewModelFactor } } } - -class ShareOpenEndedNegativeFeedbackViewModel : ViewModel() { - - val command: SingleLiveEvent = SingleLiveEvent() - - fun userSubmittingPositiveFeedback(feedback: String) { - command.value = Command.ExitAndSubmitPositiveFeedback(feedback) - } - - fun userSubmittingNegativeFeedback(mainReason: MainReason, subReason: SubReason?, openEndedComment: String) { - command.value = Command.ExitAndSubmitNegativeFeedback(mainReason, subReason, openEndedComment) - } - - sealed class Command { - data class ExitAndSubmitNegativeFeedback(val mainReason: MainReason, val subReason: SubReason?, val feedback: String) : Command() - data class ExitAndSubmitPositiveFeedback(val feedback: String) : Command() - object Exit : Command() - } -} diff --git a/app/src/main/java/com/duckduckgo/app/feedback/ui/positive/initial/PositiveFeedbackLandingViewModel.kt b/app/src/main/java/com/duckduckgo/app/feedback/ui/positive/initial/PositiveFeedbackLandingViewModel.kt index 6902440b922b..7f7a135f610e 100644 --- a/app/src/main/java/com/duckduckgo/app/feedback/ui/positive/initial/PositiveFeedbackLandingViewModel.kt +++ b/app/src/main/java/com/duckduckgo/app/feedback/ui/positive/initial/PositiveFeedbackLandingViewModel.kt @@ -26,28 +26,6 @@ import dagger.Provides import dagger.multibindings.IntoSet import javax.inject.Singleton -@Module -@ContributesTo(AppObjectGraph::class) -class PositiveFeedbackLandingViewModelFactoryModule { - @Provides - @Singleton - @IntoSet - fun providePositiveFeedbackLandingViewModelFactory(): ViewModelFactoryPlugin { - return PositiveFeedbackLandingViewModelFactory() - } -} - -private class PositiveFeedbackLandingViewModelFactory() : ViewModelFactoryPlugin { - override fun create(modelClass: Class): T? { - with(modelClass) { - return when { - isAssignableFrom(PositiveFeedbackLandingViewModel::class.java) -> (PositiveFeedbackLandingViewModel() as T) - else -> null - } - } - } -} - class PositiveFeedbackLandingViewModel : ViewModel() { val command: SingleLiveEvent = SingleLiveEvent() @@ -72,3 +50,25 @@ sealed class Command { object Exit : Command() object LaunchShareFeedbackPage : Command() } + +@Module +@ContributesTo(AppObjectGraph::class) +class PositiveFeedbackLandingViewModelFactoryModule { + @Provides + @Singleton + @IntoSet + fun providePositiveFeedbackLandingViewModelFactory(): ViewModelFactoryPlugin { + return PositiveFeedbackLandingViewModelFactory() + } +} + +private class PositiveFeedbackLandingViewModelFactory() : ViewModelFactoryPlugin { + override fun create(modelClass: Class): T? { + with(modelClass) { + return when { + isAssignableFrom(PositiveFeedbackLandingViewModel::class.java) -> (PositiveFeedbackLandingViewModel() as T) + else -> null + } + } + } +} diff --git a/app/src/main/java/com/duckduckgo/app/fire/fireproofwebsite/ui/FireproofWebsitesViewModel.kt b/app/src/main/java/com/duckduckgo/app/fire/fireproofwebsite/ui/FireproofWebsitesViewModel.kt index 0c7dfec68978..1ebbeec4dcbc 100644 --- a/app/src/main/java/com/duckduckgo/app/fire/fireproofwebsite/ui/FireproofWebsitesViewModel.kt +++ b/app/src/main/java/com/duckduckgo/app/fire/fireproofwebsite/ui/FireproofWebsitesViewModel.kt @@ -37,40 +37,6 @@ import dagger.multibindings.IntoSet import kotlinx.coroutines.launch import javax.inject.Singleton -@Module -@ContributesTo(AppObjectGraph::class) -class FireproofWebsitesViewModelFactoryModule { - @Provides - @Singleton - @IntoSet - fun provideFireproofWebsitesViewModelFactory( - fireproofWebsiteRepository: FireproofWebsiteRepository, - dispatcherProvider: DispatcherProvider, - pixel: Pixel, - settingsDataStore: SettingsDataStore, - userEventsStore: UserEventsStore - ): ViewModelFactoryPlugin { - return FireproofWebsitesViewModelFactory(fireproofWebsiteRepository, dispatcherProvider, pixel, settingsDataStore, userEventsStore) - } -} - -private class FireproofWebsitesViewModelFactory( - private val fireproofWebsiteRepository: FireproofWebsiteRepository, - private val dispatcherProvider: DispatcherProvider, - private val pixel: Pixel, - private val settingsDataStore: SettingsDataStore, - private val userEventsStore: UserEventsStore -) : ViewModelFactoryPlugin { - override fun create(modelClass: Class): T? { - with(modelClass) { - return when { - isAssignableFrom(FireproofWebsitesViewModel::class.java) -> (FireproofWebsitesViewModel(fireproofWebsiteRepository, dispatcherProvider, pixel, settingsDataStore, userEventsStore) as T) - else -> null - } - } - } -} - class FireproofWebsitesViewModel( private val fireproofWebsiteRepository: FireproofWebsiteRepository, private val dispatcherProvider: DispatcherProvider, @@ -144,3 +110,37 @@ class FireproofWebsitesViewModel( _viewState.value = _viewState.value?.copy(loginDetectionEnabled = enabled) } } + +@Module +@ContributesTo(AppObjectGraph::class) +class FireproofWebsitesViewModelFactoryModule { + @Provides + @Singleton + @IntoSet + fun provideFireproofWebsitesViewModelFactory( + fireproofWebsiteRepository: FireproofWebsiteRepository, + dispatcherProvider: DispatcherProvider, + pixel: Pixel, + settingsDataStore: SettingsDataStore, + userEventsStore: UserEventsStore + ): ViewModelFactoryPlugin { + return FireproofWebsitesViewModelFactory(fireproofWebsiteRepository, dispatcherProvider, pixel, settingsDataStore, userEventsStore) + } +} + +private class FireproofWebsitesViewModelFactory( + private val fireproofWebsiteRepository: FireproofWebsiteRepository, + private val dispatcherProvider: DispatcherProvider, + private val pixel: Pixel, + private val settingsDataStore: SettingsDataStore, + private val userEventsStore: UserEventsStore +) : ViewModelFactoryPlugin { + override fun create(modelClass: Class): T? { + with(modelClass) { + return when { + isAssignableFrom(FireproofWebsitesViewModel::class.java) -> (FireproofWebsitesViewModel(fireproofWebsiteRepository, dispatcherProvider, pixel, settingsDataStore, userEventsStore) as T) + else -> null + } + } + } +} diff --git a/app/src/main/java/com/duckduckgo/app/globalprivacycontrol/ui/GlobalPrivacyControlViewModel.kt b/app/src/main/java/com/duckduckgo/app/globalprivacycontrol/ui/GlobalPrivacyControlViewModel.kt index 4eb54fbf0010..e1bcf452f886 100644 --- a/app/src/main/java/com/duckduckgo/app/globalprivacycontrol/ui/GlobalPrivacyControlViewModel.kt +++ b/app/src/main/java/com/duckduckgo/app/globalprivacycontrol/ui/GlobalPrivacyControlViewModel.kt @@ -29,34 +29,6 @@ import dagger.Provides import dagger.multibindings.IntoSet import javax.inject.Singleton -@Module -@ContributesTo(AppObjectGraph::class) -class GlobalPrivacyControlViewModelFactoryModule { - @Provides - @Singleton - @IntoSet - fun provideGlobalPrivacyControlViewModelFactory( - pixel: Pixel, - settingsDataStore: SettingsDataStore - ): ViewModelFactoryPlugin { - return GlobalPrivacyControlViewModelFactory(pixel, settingsDataStore) - } -} - -private class GlobalPrivacyControlViewModelFactory( - private val pixel: Pixel, - private val settingsDataStore: SettingsDataStore -) : ViewModelFactoryPlugin { - override fun create(modelClass: Class): T? { - with(modelClass) { - return when { - isAssignableFrom(GlobalPrivacyControlViewModel::class.java) -> (GlobalPrivacyControlViewModel(pixel, settingsDataStore) as T) - else -> null - } - } - } -} - class GlobalPrivacyControlViewModel( private val pixel: Pixel, private val settingsDataStore: SettingsDataStore @@ -96,3 +68,31 @@ class GlobalPrivacyControlViewModel( const val LEARN_MORE_URL = "https://duckduckgo.com/global-privacy-control-learn-more" } } + +@Module +@ContributesTo(AppObjectGraph::class) +class GlobalPrivacyControlViewModelFactoryModule { + @Provides + @Singleton + @IntoSet + fun provideGlobalPrivacyControlViewModelFactory( + pixel: Pixel, + settingsDataStore: SettingsDataStore + ): ViewModelFactoryPlugin { + return GlobalPrivacyControlViewModelFactory(pixel, settingsDataStore) + } +} + +private class GlobalPrivacyControlViewModelFactory( + private val pixel: Pixel, + private val settingsDataStore: SettingsDataStore +) : ViewModelFactoryPlugin { + override fun create(modelClass: Class): T? { + with(modelClass) { + return when { + isAssignableFrom(GlobalPrivacyControlViewModel::class.java) -> (GlobalPrivacyControlViewModel(pixel, settingsDataStore) as T) + else -> null + } + } + } +} diff --git a/app/src/main/java/com/duckduckgo/app/icon/ui/ChangeIconViewModel.kt b/app/src/main/java/com/duckduckgo/app/icon/ui/ChangeIconViewModel.kt index 7571923f36c7..c07a32ab5c0b 100644 --- a/app/src/main/java/com/duckduckgo/app/icon/ui/ChangeIconViewModel.kt +++ b/app/src/main/java/com/duckduckgo/app/icon/ui/ChangeIconViewModel.kt @@ -32,36 +32,6 @@ import dagger.multibindings.IntoSet import javax.inject.Inject import javax.inject.Singleton -@Module -@ContributesTo(AppObjectGraph::class) -class ChangeIconViewModelFactoryModule { - @Provides - @Singleton - @IntoSet - fun provideChangeIconViewModelFactory( - settingsDataStore: SettingsDataStore, - appIconModifier: IconModifier, - pixel: Pixel - ): ViewModelFactoryPlugin { - return ChangeIconViewModelFactory(settingsDataStore, appIconModifier, pixel) - } -} - -private class ChangeIconViewModelFactory( - private val settingsDataStore: SettingsDataStore, - private val appIconModifier: IconModifier, - private val pixel: Pixel -) : ViewModelFactoryPlugin { - override fun create(modelClass: Class): T? { - with(modelClass) { - return when { - isAssignableFrom(ChangeIconViewModel::class.java) -> (ChangeIconViewModel(settingsDataStore, appIconModifier, pixel) as T) - else -> null - } - } - } -} - class ChangeIconViewModel @Inject constructor( private val settingsDataStore: SettingsDataStore, private val appIconModifier: IconModifier, @@ -109,5 +79,34 @@ class ChangeIconViewModel @Inject constructor( appIconModifier.changeIcon(previousIcon, viewData.appIcon) command.value = Command.IconChanged } +} +@Module +@ContributesTo(AppObjectGraph::class) +class ChangeIconViewModelFactoryModule { + @Provides + @Singleton + @IntoSet + fun provideChangeIconViewModelFactory( + settingsDataStore: SettingsDataStore, + appIconModifier: IconModifier, + pixel: Pixel + ): ViewModelFactoryPlugin { + return ChangeIconViewModelFactory(settingsDataStore, appIconModifier, pixel) + } +} + +private class ChangeIconViewModelFactory( + private val settingsDataStore: SettingsDataStore, + private val appIconModifier: IconModifier, + private val pixel: Pixel +) : ViewModelFactoryPlugin { + override fun create(modelClass: Class): T? { + with(modelClass) { + return when { + isAssignableFrom(ChangeIconViewModel::class.java) -> (ChangeIconViewModel(settingsDataStore, appIconModifier, pixel) as T) + else -> null + } + } + } } diff --git a/app/src/main/java/com/duckduckgo/app/launch/LaunchViewModel.kt b/app/src/main/java/com/duckduckgo/app/launch/LaunchViewModel.kt index 58b58d7507ff..a2af53fed089 100644 --- a/app/src/main/java/com/duckduckgo/app/launch/LaunchViewModel.kt +++ b/app/src/main/java/com/duckduckgo/app/launch/LaunchViewModel.kt @@ -32,34 +32,6 @@ import kotlinx.coroutines.withTimeoutOrNull import timber.log.Timber import javax.inject.Singleton -@Module -@ContributesTo(AppObjectGraph::class) -class LaunchViewModelFactoryModule { - @Provides - @Singleton - @IntoSet - fun provideLaunchViewModelFactory( - userStageStore: UserStageStore, - appInstallationReferrerStateListener: AppInstallationReferrerStateListener - ): ViewModelFactoryPlugin { - return LaunchViewModelFactory(userStageStore, appInstallationReferrerStateListener) - } -} - -private class LaunchViewModelFactory( - private val userStageStore: UserStageStore, - private val appInstallationReferrerStateListener: AppInstallationReferrerStateListener -) : ViewModelFactoryPlugin { - override fun create(modelClass: Class): T? { - with(modelClass) { - return when { - isAssignableFrom(LaunchViewModel::class.java) -> (LaunchViewModel(userStageStore, appInstallationReferrerStateListener) as T) - else -> null - } - } - } -} - class LaunchViewModel( private val userStageStore: UserStageStore, private val appReferrerStateListener: AppInstallationReferrerStateListener @@ -94,3 +66,31 @@ class LaunchViewModel( Timber.d("Waited ${System.currentTimeMillis() - startTime}ms for referrer") } } + +@Module +@ContributesTo(AppObjectGraph::class) +class LaunchViewModelFactoryModule { + @Provides + @Singleton + @IntoSet + fun provideLaunchViewModelFactory( + userStageStore: UserStageStore, + appInstallationReferrerStateListener: AppInstallationReferrerStateListener + ): ViewModelFactoryPlugin { + return LaunchViewModelFactory(userStageStore, appInstallationReferrerStateListener) + } +} + +private class LaunchViewModelFactory( + private val userStageStore: UserStageStore, + private val appInstallationReferrerStateListener: AppInstallationReferrerStateListener +) : ViewModelFactoryPlugin { + override fun create(modelClass: Class): T? { + with(modelClass) { + return when { + isAssignableFrom(LaunchViewModel::class.java) -> (LaunchViewModel(userStageStore, appInstallationReferrerStateListener) as T) + else -> null + } + } + } +} diff --git a/app/src/main/java/com/duckduckgo/app/location/ui/LocationPermissionsViewModel.kt b/app/src/main/java/com/duckduckgo/app/location/ui/LocationPermissionsViewModel.kt index f30412e9f481..f5ff366e9f7b 100644 --- a/app/src/main/java/com/duckduckgo/app/location/ui/LocationPermissionsViewModel.kt +++ b/app/src/main/java/com/duckduckgo/app/location/ui/LocationPermissionsViewModel.kt @@ -35,40 +35,6 @@ import dagger.multibindings.IntoSet import kotlinx.coroutines.launch import javax.inject.Singleton -@Module -@ContributesTo(AppObjectGraph::class) -class LocationPermissionsViewModelFactoryModule { - @Provides - @Singleton - @IntoSet - fun provideLocationPermissionsViewModelFactory( - locationPermissionsRepository: LocationPermissionsRepository, - geoLocationPermissions: GeoLocationPermissions, - dispatcherProvider: DispatcherProvider, - settingsDataStore: SettingsDataStore, - pixel: Pixel - ): ViewModelFactoryPlugin { - return LocationPermissionsViewModelFactory(locationPermissionsRepository, geoLocationPermissions, dispatcherProvider, settingsDataStore, pixel) - } -} - -private class LocationPermissionsViewModelFactory( - private val locationPermissionsRepository: LocationPermissionsRepository, - private val geoLocationPermissions: GeoLocationPermissions, - private val dispatcherProvider: DispatcherProvider, - private val settingsDataStore: SettingsDataStore, - private val pixel: Pixel -) : ViewModelFactoryPlugin { - override fun create(modelClass: Class): T? { - with(modelClass) { - return when { - isAssignableFrom(LocationPermissionsViewModel::class.java) -> (LocationPermissionsViewModel(locationPermissionsRepository, geoLocationPermissions, dispatcherProvider, settingsDataStore, pixel) as T) - else -> null - } - } - } -} - class LocationPermissionsViewModel( private val locationPermissionsRepository: LocationPermissionsRepository, private val geoLocationPermissions: GeoLocationPermissions, @@ -170,3 +136,37 @@ class LocationPermissionsViewModel( } } } + +@Module +@ContributesTo(AppObjectGraph::class) +class LocationPermissionsViewModelFactoryModule { + @Provides + @Singleton + @IntoSet + fun provideLocationPermissionsViewModelFactory( + locationPermissionsRepository: LocationPermissionsRepository, + geoLocationPermissions: GeoLocationPermissions, + dispatcherProvider: DispatcherProvider, + settingsDataStore: SettingsDataStore, + pixel: Pixel + ): ViewModelFactoryPlugin { + return LocationPermissionsViewModelFactory(locationPermissionsRepository, geoLocationPermissions, dispatcherProvider, settingsDataStore, pixel) + } +} + +private class LocationPermissionsViewModelFactory( + private val locationPermissionsRepository: LocationPermissionsRepository, + private val geoLocationPermissions: GeoLocationPermissions, + private val dispatcherProvider: DispatcherProvider, + private val settingsDataStore: SettingsDataStore, + private val pixel: Pixel +) : ViewModelFactoryPlugin { + override fun create(modelClass: Class): T? { + with(modelClass) { + return when { + isAssignableFrom(LocationPermissionsViewModel::class.java) -> (LocationPermissionsViewModel(locationPermissionsRepository, geoLocationPermissions, dispatcherProvider, settingsDataStore, pixel) as T) + else -> null + } + } + } +} diff --git a/app/src/main/java/com/duckduckgo/app/onboarding/ui/OnboardingViewModel.kt b/app/src/main/java/com/duckduckgo/app/onboarding/ui/OnboardingViewModel.kt index 55d9d0061af5..1a6a02de403d 100644 --- a/app/src/main/java/com/duckduckgo/app/onboarding/ui/OnboardingViewModel.kt +++ b/app/src/main/java/com/duckduckgo/app/onboarding/ui/OnboardingViewModel.kt @@ -31,6 +31,32 @@ import dagger.multibindings.IntoSet import kotlinx.coroutines.launch import javax.inject.Singleton +class OnboardingViewModel( + private val userStageStore: UserStageStore, + private val pageLayoutManager: OnboardingPageManager, + private val dispatchers: DispatcherProvider +) : ViewModel() { + + fun initializePages() { + pageLayoutManager.buildPageBlueprints() + } + + fun pageCount(): Int { + return pageLayoutManager.pageCount() + } + + fun getItem(position: Int): OnboardingPageFragment? { + return pageLayoutManager.buildPage(position) + } + + fun onOnboardingDone() { + // Executing this on IO to avoid any delay changing threads between Main-IO. + viewModelScope.launch(dispatchers.io()) { + userStageStore.stageCompleted(AppStage.NEW) + } + } +} + @Module @ContributesTo(AppObjectGraph::class) class OnboardingViewModelFactoryModule { @@ -59,31 +85,4 @@ private class OnboardingViewModelFactory( } } } - -} - -class OnboardingViewModel( - private val userStageStore: UserStageStore, - private val pageLayoutManager: OnboardingPageManager, - private val dispatchers: DispatcherProvider -) : ViewModel() { - - fun initializePages() { - pageLayoutManager.buildPageBlueprints() - } - - fun pageCount(): Int { - return pageLayoutManager.pageCount() - } - - fun getItem(position: Int): OnboardingPageFragment? { - return pageLayoutManager.buildPage(position) - } - - fun onOnboardingDone() { - // Executing this on IO to avoid any delay changing threads between Main-IO. - viewModelScope.launch(dispatchers.io()) { - userStageStore.stageCompleted(AppStage.NEW) - } - } } diff --git a/app/src/main/java/com/duckduckgo/app/onboarding/ui/page/DefaultBrowserPageViewModel.kt b/app/src/main/java/com/duckduckgo/app/onboarding/ui/page/DefaultBrowserPageViewModel.kt index 698aaa34cb24..0c1e34f51e70 100644 --- a/app/src/main/java/com/duckduckgo/app/onboarding/ui/page/DefaultBrowserPageViewModel.kt +++ b/app/src/main/java/com/duckduckgo/app/onboarding/ui/page/DefaultBrowserPageViewModel.kt @@ -30,36 +30,6 @@ import dagger.Provides import dagger.multibindings.IntoSet import javax.inject.Singleton -@Module -@ContributesTo(AppObjectGraph::class) -class DefaultBrowserPageViewModelFactoryModule { - @Provides - @Singleton - @IntoSet - fun provideDefaultBrowserPageViewModelFactory( - defaultBrowserDetector: DefaultBrowserDetector, - pixel: Pixel, - installStore: AppInstallStore - ): ViewModelFactoryPlugin { - return DefaultBrowserPageViewModelFactory(defaultBrowserDetector, pixel, installStore) - } -} - -private class DefaultBrowserPageViewModelFactory( - private val defaultBrowserDetector: DefaultBrowserDetector, - private val pixel: Pixel, - private val installStore: AppInstallStore -) : ViewModelFactoryPlugin { - override fun create(modelClass: Class): T? { - with(modelClass) { - return when { - isAssignableFrom(DefaultBrowserPageViewModel::class.java) -> (DefaultBrowserPageViewModel(defaultBrowserDetector, pixel, installStore) as T) - else -> null - } - } - } -} - class DefaultBrowserPageViewModel( private val defaultBrowserDetector: DefaultBrowserDetector, private val pixel: Pixel, @@ -230,3 +200,33 @@ class DefaultBrowserPageViewModel( const val DEFAULT_URL = "https://duckduckgo.com" } } + +@Module +@ContributesTo(AppObjectGraph::class) +class DefaultBrowserPageViewModelFactoryModule { + @Provides + @Singleton + @IntoSet + fun provideDefaultBrowserPageViewModelFactory( + defaultBrowserDetector: DefaultBrowserDetector, + pixel: Pixel, + installStore: AppInstallStore + ): ViewModelFactoryPlugin { + return DefaultBrowserPageViewModelFactory(defaultBrowserDetector, pixel, installStore) + } +} + +private class DefaultBrowserPageViewModelFactory( + private val defaultBrowserDetector: DefaultBrowserDetector, + private val pixel: Pixel, + private val installStore: AppInstallStore +) : ViewModelFactoryPlugin { + override fun create(modelClass: Class): T? { + with(modelClass) { + return when { + isAssignableFrom(DefaultBrowserPageViewModel::class.java) -> (DefaultBrowserPageViewModel(defaultBrowserDetector, pixel, installStore) as T) + else -> null + } + } + } +} diff --git a/app/src/main/java/com/duckduckgo/app/privacy/ui/PrivacyDashboardViewModel.kt b/app/src/main/java/com/duckduckgo/app/privacy/ui/PrivacyDashboardViewModel.kt index 5dc62963fe70..966d7f2e3bde 100644 --- a/app/src/main/java/com/duckduckgo/app/privacy/ui/PrivacyDashboardViewModel.kt +++ b/app/src/main/java/com/duckduckgo/app/privacy/ui/PrivacyDashboardViewModel.kt @@ -46,36 +46,6 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import javax.inject.Singleton -@Module -@ContributesTo(AppObjectGraph::class) -class PrivacyDashboardViewModelFactoryModule { - @Provides - @Singleton - @IntoSet - fun providePrivacyDashboardViewModelFactory( - userWhitelistDao: UserWhitelistDao, - networkLeaderboardDao: NetworkLeaderboardDao, - pixel: Pixel - ): ViewModelFactoryPlugin { - return PrivacyDashboardViewModelFactory(userWhitelistDao, networkLeaderboardDao, pixel) - } -} - -private class PrivacyDashboardViewModelFactory( - private val userWhitelistDao: UserWhitelistDao, - private val networkLeaderboardDao: NetworkLeaderboardDao, - private val pixel: Pixel -) : ViewModelFactoryPlugin { - override fun create(modelClass: Class): T? { - with(modelClass) { - return when { - isAssignableFrom(PrivacyDashboardViewModel::class.java) -> PrivacyDashboardViewModel(userWhitelistDao, networkLeaderboardDao, pixel) as T - else -> null - } - } - } -} - class PrivacyDashboardViewModel( private val userWhitelistDao: UserWhitelistDao, networkLeaderboardDao: NetworkLeaderboardDao, @@ -234,3 +204,33 @@ class PrivacyDashboardViewModel( private const val LEADERBOARD_MIN_DOMAINS_EXCLUSIVE = 30 } } + +@Module +@ContributesTo(AppObjectGraph::class) +class PrivacyDashboardViewModelFactoryModule { + @Provides + @Singleton + @IntoSet + fun providePrivacyDashboardViewModelFactory( + userWhitelistDao: UserWhitelistDao, + networkLeaderboardDao: NetworkLeaderboardDao, + pixel: Pixel + ): ViewModelFactoryPlugin { + return PrivacyDashboardViewModelFactory(userWhitelistDao, networkLeaderboardDao, pixel) + } +} + +private class PrivacyDashboardViewModelFactory( + private val userWhitelistDao: UserWhitelistDao, + private val networkLeaderboardDao: NetworkLeaderboardDao, + private val pixel: Pixel +) : ViewModelFactoryPlugin { + override fun create(modelClass: Class): T? { + with(modelClass) { + return when { + isAssignableFrom(PrivacyDashboardViewModel::class.java) -> PrivacyDashboardViewModel(userWhitelistDao, networkLeaderboardDao, pixel) as T + else -> null + } + } + } +} diff --git a/app/src/main/java/com/duckduckgo/app/privacy/ui/PrivacyPracticesViewModel.kt b/app/src/main/java/com/duckduckgo/app/privacy/ui/PrivacyPracticesViewModel.kt index 9dccc5158b21..e84f820b5f6f 100644 --- a/app/src/main/java/com/duckduckgo/app/privacy/ui/PrivacyPracticesViewModel.kt +++ b/app/src/main/java/com/duckduckgo/app/privacy/ui/PrivacyPracticesViewModel.kt @@ -30,28 +30,6 @@ import dagger.Provides import dagger.multibindings.IntoSet import javax.inject.Singleton -@Module -@ContributesTo(AppObjectGraph::class) -class PrivacyPracticesViewModelFactoryModule { - @Provides - @Singleton - @IntoSet - fun providePrivacyPracticesViewModelFactory(): ViewModelFactoryPlugin { - return PrivacyPracticesViewModelFactory() - } -} - -private class PrivacyPracticesViewModelFactory() : ViewModelFactoryPlugin { - override fun create(modelClass: Class): T? { - with(modelClass) { - return when { - isAssignableFrom(PrivacyPracticesViewModel::class.java) -> (PrivacyPracticesViewModel() as T) - else -> null - } - } - } -} - class PrivacyPracticesViewModel : ViewModel() { data class ViewState( @@ -89,3 +67,25 @@ class PrivacyPracticesViewModel : ViewModel() { ) } } + +@Module +@ContributesTo(AppObjectGraph::class) +class PrivacyPracticesViewModelFactoryModule { + @Provides + @Singleton + @IntoSet + fun providePrivacyPracticesViewModelFactory(): ViewModelFactoryPlugin { + return PrivacyPracticesViewModelFactory() + } +} + +private class PrivacyPracticesViewModelFactory() : ViewModelFactoryPlugin { + override fun create(modelClass: Class): T? { + with(modelClass) { + return when { + isAssignableFrom(PrivacyPracticesViewModel::class.java) -> (PrivacyPracticesViewModel() as T) + else -> null + } + } + } +} diff --git a/app/src/main/java/com/duckduckgo/app/privacy/ui/ScorecardViewModel.kt b/app/src/main/java/com/duckduckgo/app/privacy/ui/ScorecardViewModel.kt index 38f9e82b257b..1c88e22a8970 100644 --- a/app/src/main/java/com/duckduckgo/app/privacy/ui/ScorecardViewModel.kt +++ b/app/src/main/java/com/duckduckgo/app/privacy/ui/ScorecardViewModel.kt @@ -38,30 +38,6 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import javax.inject.Singleton -@Module -@ContributesTo(AppObjectGraph::class) -class ScorecardViewModelFactoryModule { - @Provides - @Singleton - @IntoSet - fun provideScorecardViewModelFactory(userWhitelistDao: UserWhitelistDao): ViewModelFactoryPlugin { - return ScorecardViewModelFactory(userWhitelistDao) - } -} - -private class ScorecardViewModelFactory( - private val userWhitelistDao: UserWhitelistDao, -) : ViewModelFactoryPlugin { - override fun create(modelClass: Class): T? { - with(modelClass) { - return when { - isAssignableFrom(ScorecardViewModel::class.java) -> ScorecardViewModel(userWhitelistDao) as T - else -> null - } - } - } -} - class ScorecardViewModel( private val userWhitelistDao: UserWhitelistDao, private val dispatchers: DispatcherProvider = DefaultDispatcherProvider() @@ -138,3 +114,27 @@ class ScorecardViewModel( } } } + +@Module +@ContributesTo(AppObjectGraph::class) +class ScorecardViewModelFactoryModule { + @Provides + @Singleton + @IntoSet + fun provideScorecardViewModelFactory(userWhitelistDao: UserWhitelistDao): ViewModelFactoryPlugin { + return ScorecardViewModelFactory(userWhitelistDao) + } +} + +private class ScorecardViewModelFactory( + private val userWhitelistDao: UserWhitelistDao, +) : ViewModelFactoryPlugin { + override fun create(modelClass: Class): T? { + with(modelClass) { + return when { + isAssignableFrom(ScorecardViewModel::class.java) -> ScorecardViewModel(userWhitelistDao) as T + else -> null + } + } + } +} diff --git a/app/src/main/java/com/duckduckgo/app/privacy/ui/TrackerNetworksViewModel.kt b/app/src/main/java/com/duckduckgo/app/privacy/ui/TrackerNetworksViewModel.kt index 8b5b3beb5190..86b8449d838b 100644 --- a/app/src/main/java/com/duckduckgo/app/privacy/ui/TrackerNetworksViewModel.kt +++ b/app/src/main/java/com/duckduckgo/app/privacy/ui/TrackerNetworksViewModel.kt @@ -34,28 +34,6 @@ import dagger.multibindings.IntoSet import java.util.* import javax.inject.Singleton -@Module -@ContributesTo(AppObjectGraph::class) -class TrackerNetworksViewModelFactoryModule { - @Provides - @Singleton - @IntoSet - fun provideTrackerNetworksViewModelFactory(): ViewModelFactoryPlugin { - return TrackerNetworksViewModelFactory() - } -} - -private class TrackerNetworksViewModelFactory() : ViewModelFactoryPlugin { - override fun create(modelClass: Class): T? { - with(modelClass) { - return when { - isAssignableFrom(TrackerNetworksViewModel::class.java) -> (TrackerNetworksViewModel() as T) - else -> null - } - } - } -} - class TrackerNetworksViewModel : ViewModel() { data class ViewState( @@ -114,3 +92,25 @@ class TrackerNetworksViewModel : ViewModel() { return emptyMap>().toSortedMap(comparator) } } + +@Module +@ContributesTo(AppObjectGraph::class) +class TrackerNetworksViewModelFactoryModule { + @Provides + @Singleton + @IntoSet + fun provideTrackerNetworksViewModelFactory(): ViewModelFactoryPlugin { + return TrackerNetworksViewModelFactory() + } +} + +private class TrackerNetworksViewModelFactory() : ViewModelFactoryPlugin { + override fun create(modelClass: Class): T? { + with(modelClass) { + return when { + isAssignableFrom(TrackerNetworksViewModel::class.java) -> (TrackerNetworksViewModel() as T) + else -> null + } + } + } +} diff --git a/app/src/main/java/com/duckduckgo/app/privacy/ui/WhitelistViewModel.kt b/app/src/main/java/com/duckduckgo/app/privacy/ui/WhitelistViewModel.kt index 12c9742b6b5d..eef477299a92 100644 --- a/app/src/main/java/com/duckduckgo/app/privacy/ui/WhitelistViewModel.kt +++ b/app/src/main/java/com/duckduckgo/app/privacy/ui/WhitelistViewModel.kt @@ -38,32 +38,6 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import javax.inject.Singleton -@Module -@ContributesTo(AppObjectGraph::class) -class WhitelistViewModelFactoryModule { - @Provides - @Singleton - @IntoSet - fun provideWhitelistViewModelFactory( - dao: UserWhitelistDao - ): ViewModelFactoryPlugin { - return WhitelistViewModelFactory(dao) - } -} - -private class WhitelistViewModelFactory( - private val dao: UserWhitelistDao -) : ViewModelFactoryPlugin { - override fun create(modelClass: Class): T? { - with(modelClass) { - return when { - isAssignableFrom(WhitelistViewModel::class.java) -> (WhitelistViewModel(dao) as T) - else -> null - } - } - } -} - class WhitelistViewModel( private val dao: UserWhitelistDao, private val dispatchers: DispatcherProvider = DefaultDispatcherProvider() @@ -151,3 +125,29 @@ class WhitelistViewModel( withContext(dispatchers.io()) { dao.delete(entry) } } } + +@Module +@ContributesTo(AppObjectGraph::class) +class WhitelistViewModelFactoryModule { + @Provides + @Singleton + @IntoSet + fun provideWhitelistViewModelFactory( + dao: UserWhitelistDao + ): ViewModelFactoryPlugin { + return WhitelistViewModelFactory(dao) + } +} + +private class WhitelistViewModelFactory( + private val dao: UserWhitelistDao +) : ViewModelFactoryPlugin { + override fun create(modelClass: Class): T? { + with(modelClass) { + return when { + isAssignableFrom(WhitelistViewModel::class.java) -> (WhitelistViewModel(dao) as T) + else -> null + } + } + } +} diff --git a/app/src/main/java/com/duckduckgo/app/settings/SettingsViewModel.kt b/app/src/main/java/com/duckduckgo/app/settings/SettingsViewModel.kt index 417b194a0965..0ed48bb30e55 100644 --- a/app/src/main/java/com/duckduckgo/app/settings/SettingsViewModel.kt +++ b/app/src/main/java/com/duckduckgo/app/settings/SettingsViewModel.kt @@ -44,40 +44,6 @@ import timber.log.Timber import javax.inject.Inject import javax.inject.Singleton -@Module -@ContributesTo(AppObjectGraph::class) -class SettingsViewModelFactoryModule { - @Provides - @Singleton - @IntoSet - fun provideSettingsViewModelFactory( - settingsDataStore: SettingsDataStore, - defaultWebBrowserCapability: DefaultBrowserDetector, - variantManager: VariantManager, - fireAnimationLoader: FireAnimationLoader, - pixel: Pixel - ): ViewModelFactoryPlugin { - return SettingsViewModelFactory(settingsDataStore, defaultWebBrowserCapability, variantManager, fireAnimationLoader, pixel) - } -} - -private class SettingsViewModelFactory( - private val settingsDataStore: SettingsDataStore, - private val defaultWebBrowserCapability: DefaultBrowserDetector, - private val variantManager: VariantManager, - private val fireAnimationLoader: FireAnimationLoader, - private val pixel: Pixel -) : ViewModelFactoryPlugin { - override fun create(modelClass: Class): T? { - with(modelClass) { - return when { - isAssignableFrom(SettingsViewModel::class.java) -> (SettingsViewModel(settingsDataStore, defaultWebBrowserCapability, variantManager, fireAnimationLoader, pixel) as T) - else -> null - } - } - } -} - class SettingsViewModel @Inject constructor( private val settingsDataStore: SettingsDataStore, private val defaultWebBrowserCapability: DefaultBrowserDetector, @@ -277,3 +243,37 @@ class SettingsViewModel @Inject constructor( } } } + +@Module +@ContributesTo(AppObjectGraph::class) +class SettingsViewModelFactoryModule { + @Provides + @Singleton + @IntoSet + fun provideSettingsViewModelFactory( + settingsDataStore: SettingsDataStore, + defaultWebBrowserCapability: DefaultBrowserDetector, + variantManager: VariantManager, + fireAnimationLoader: FireAnimationLoader, + pixel: Pixel + ): ViewModelFactoryPlugin { + return SettingsViewModelFactory(settingsDataStore, defaultWebBrowserCapability, variantManager, fireAnimationLoader, pixel) + } +} + +private class SettingsViewModelFactory( + private val settingsDataStore: SettingsDataStore, + private val defaultWebBrowserCapability: DefaultBrowserDetector, + private val variantManager: VariantManager, + private val fireAnimationLoader: FireAnimationLoader, + private val pixel: Pixel +) : ViewModelFactoryPlugin { + override fun create(modelClass: Class): T? { + with(modelClass) { + return when { + isAssignableFrom(SettingsViewModel::class.java) -> (SettingsViewModel(settingsDataStore, defaultWebBrowserCapability, variantManager, fireAnimationLoader, pixel) as T) + else -> null + } + } + } +} diff --git a/app/src/main/java/com/duckduckgo/app/survey/ui/SurveyViewModel.kt b/app/src/main/java/com/duckduckgo/app/survey/ui/SurveyViewModel.kt index 3f0aa21a0790..5743fb9b2e4e 100644 --- a/app/src/main/java/com/duckduckgo/app/survey/ui/SurveyViewModel.kt +++ b/app/src/main/java/com/duckduckgo/app/survey/ui/SurveyViewModel.kt @@ -40,36 +40,6 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import javax.inject.Singleton -@Module -@ContributesTo(AppObjectGraph::class) -class SurveyViewModelFactoryModule { - @Provides - @Singleton - @IntoSet - fun provideSurveyViewModelFactory( - surveyDao: SurveyDao, - statisticsStore: StatisticsDataStore, - appInstallStore: AppInstallStore, - ): ViewModelFactoryPlugin { - return SurveyViewModelFactory(surveyDao, statisticsStore, appInstallStore) - } -} - -private class SurveyViewModelFactory( - private val surveyDao: SurveyDao, - private val statisticsStore: StatisticsDataStore, - private val appInstallStore: AppInstallStore -) : ViewModelFactoryPlugin { - override fun create(modelClass: Class): T? { - with(modelClass) { - return when { - isAssignableFrom(SurveyViewModel::class.java) -> (SurveyViewModel(surveyDao, statisticsStore, appInstallStore) as T) - else -> null - } - } - } -} - class SurveyViewModel( private val surveyDao: SurveyDao, private val statisticsStore: StatisticsDataStore, @@ -145,3 +115,33 @@ class SurveyViewModel( const val MODEL = "mo" } } + +@Module +@ContributesTo(AppObjectGraph::class) +class SurveyViewModelFactoryModule { + @Provides + @Singleton + @IntoSet + fun provideSurveyViewModelFactory( + surveyDao: SurveyDao, + statisticsStore: StatisticsDataStore, + appInstallStore: AppInstallStore, + ): ViewModelFactoryPlugin { + return SurveyViewModelFactory(surveyDao, statisticsStore, appInstallStore) + } +} + +private class SurveyViewModelFactory( + private val surveyDao: SurveyDao, + private val statisticsStore: StatisticsDataStore, + private val appInstallStore: AppInstallStore +) : ViewModelFactoryPlugin { + override fun create(modelClass: Class): T? { + with(modelClass) { + return when { + isAssignableFrom(SurveyViewModel::class.java) -> (SurveyViewModel(surveyDao, statisticsStore, appInstallStore) as T) + else -> null + } + } + } +} diff --git a/app/src/main/java/com/duckduckgo/app/systemsearch/SystemSearchViewModel.kt b/app/src/main/java/com/duckduckgo/app/systemsearch/SystemSearchViewModel.kt index 6e00764d5c47..a82a9dd197e5 100644 --- a/app/src/main/java/com/duckduckgo/app/systemsearch/SystemSearchViewModel.kt +++ b/app/src/main/java/com/duckduckgo/app/systemsearch/SystemSearchViewModel.kt @@ -48,38 +48,6 @@ import timber.log.Timber import java.util.concurrent.TimeUnit import javax.inject.Singleton -@Module -@ContributesTo(AppObjectGraph::class) -class SystemSearchViewModelFactoryModule { - @Provides - @Singleton - @IntoSet - fun provideSystemSearchViewModelFactory( - userStageStore: UserStageStore, - autoCompleteApi: AutoCompleteApi, - deviceAppLookup: DeviceAppLookup, - pixel: Pixel, - ): ViewModelFactoryPlugin { - return SystemSearchViewModelFactory(userStageStore, autoCompleteApi, deviceAppLookup, pixel) - } -} - -private class SystemSearchViewModelFactory( - private val userStageStore: UserStageStore, - private val autoComplete: AutoComplete, - private val deviceAppLookup: DeviceAppLookup, - private val pixel: Pixel -) : ViewModelFactoryPlugin { - override fun create(modelClass: Class): T? { - with(modelClass) { - return when { - isAssignableFrom(SystemSearchViewModel::class.java) -> (SystemSearchViewModel(userStageStore, autoComplete, deviceAppLookup, pixel) as T) - else -> null - } - } - } -} - data class SystemSearchResult(val autocomplete: AutoCompleteResult, val deviceApps: List) class SystemSearchViewModel( @@ -290,3 +258,35 @@ class SystemSearchViewModel( private const val RESULTS_MAX_RESULTS_PER_GROUP = 4 } } + +@Module +@ContributesTo(AppObjectGraph::class) +class SystemSearchViewModelFactoryModule { + @Provides + @Singleton + @IntoSet + fun provideSystemSearchViewModelFactory( + userStageStore: UserStageStore, + autoCompleteApi: AutoCompleteApi, + deviceAppLookup: DeviceAppLookup, + pixel: Pixel, + ): ViewModelFactoryPlugin { + return SystemSearchViewModelFactory(userStageStore, autoCompleteApi, deviceAppLookup, pixel) + } +} + +private class SystemSearchViewModelFactory( + private val userStageStore: UserStageStore, + private val autoComplete: AutoComplete, + private val deviceAppLookup: DeviceAppLookup, + private val pixel: Pixel +) : ViewModelFactoryPlugin { + override fun create(modelClass: Class): T? { + with(modelClass) { + return when { + isAssignableFrom(SystemSearchViewModel::class.java) -> (SystemSearchViewModel(userStageStore, autoComplete, deviceAppLookup, pixel) as T) + else -> null + } + } + } +} diff --git a/app/src/main/java/com/duckduckgo/app/tabs/ui/TabSwitcherViewModel.kt b/app/src/main/java/com/duckduckgo/app/tabs/ui/TabSwitcherViewModel.kt index 15119f2e6cec..32c8ec6a99cb 100644 --- a/app/src/main/java/com/duckduckgo/app/tabs/ui/TabSwitcherViewModel.kt +++ b/app/src/main/java/com/duckduckgo/app/tabs/ui/TabSwitcherViewModel.kt @@ -34,35 +34,6 @@ import dagger.Provides import dagger.multibindings.IntoSet import javax.inject.Singleton -@Module -@ContributesTo(AppObjectGraph::class) -class TabSwitcherViewModelFactoryModule { - @Provides - @Singleton - @IntoSet - fun provideTabSwitcherViewModelFactory( - tabRepository: TabRepository, - webViewSessionStorage: WebViewSessionStorage - ): ViewModelFactoryPlugin { - return TabSwitcherViewModelFactory(tabRepository, webViewSessionStorage) - } -} - -private class TabSwitcherViewModelFactory( - private val tabRepository: TabRepository, - private val webViewSessionStorage: WebViewSessionStorage -) : ViewModelFactoryPlugin { - override fun create(modelClass: Class): T? { - with(modelClass) { - return when { - isAssignableFrom(TabSwitcherViewModel::class.java) -> TabSwitcherViewModel(tabRepository, webViewSessionStorage) as T - else -> null - } - } - } - -} - class TabSwitcherViewModel(private val tabRepository: TabRepository, private val webViewSessionStorage: WebViewSessionStorage) : ViewModel() { var tabs: LiveData> = tabRepository.liveTabs @@ -108,3 +79,31 @@ class TabSwitcherViewModel(private val tabRepository: TabRepository, private val command.value = Command.Close } } + +@Module +@ContributesTo(AppObjectGraph::class) +class TabSwitcherViewModelFactoryModule { + @Provides + @Singleton + @IntoSet + fun provideTabSwitcherViewModelFactory( + tabRepository: TabRepository, + webViewSessionStorage: WebViewSessionStorage + ): ViewModelFactoryPlugin { + return TabSwitcherViewModelFactory(tabRepository, webViewSessionStorage) + } +} + +private class TabSwitcherViewModelFactory( + private val tabRepository: TabRepository, + private val webViewSessionStorage: WebViewSessionStorage +) : ViewModelFactoryPlugin { + override fun create(modelClass: Class): T? { + with(modelClass) { + return when { + isAssignableFrom(TabSwitcherViewModel::class.java) -> TabSwitcherViewModel(tabRepository, webViewSessionStorage) as T + else -> null + } + } + } +} diff --git a/app/src/main/java/com/duckduckgo/app/widget/ui/AddWidgetInstructionsViewModel.kt b/app/src/main/java/com/duckduckgo/app/widget/ui/AddWidgetInstructionsViewModel.kt index 47881db683ca..7554d759a490 100644 --- a/app/src/main/java/com/duckduckgo/app/widget/ui/AddWidgetInstructionsViewModel.kt +++ b/app/src/main/java/com/duckduckgo/app/widget/ui/AddWidgetInstructionsViewModel.kt @@ -28,6 +28,24 @@ import dagger.Provides import dagger.multibindings.IntoSet import javax.inject.Singleton +class AddWidgetInstructionsViewModel : ViewModel() { + + sealed class Command { + object ShowHome : Command() + object Close : Command() + } + + val command: SingleLiveEvent = SingleLiveEvent() + + fun onShowHomePressed() { + command.value = ShowHome + } + + fun onClosePressed() { + command.value = Close + } +} + @Module @ContributesTo(AppObjectGraph::class) class AddWidgetInstructionsViewModelFactoryModule { @@ -49,21 +67,3 @@ private class AddWidgetInstructionsViewModelFactory() : ViewModelFactoryPlugin { } } } - -class AddWidgetInstructionsViewModel : ViewModel() { - - sealed class Command { - object ShowHome : Command() - object Close : Command() - } - - val command: SingleLiveEvent = SingleLiveEvent() - - fun onShowHomePressed() { - command.value = ShowHome - } - - fun onClosePressed() { - command.value = Close - } -}