Skip to content

Commit 9d17387

Browse files
authored
Use providers in the VM factories to respect the dep di semantics (#1145)
1 parent dbd43b7 commit 9d17387

25 files changed

+214
-195
lines changed

app/src/main/java/com/duckduckgo/app/bookmarks/ui/BookmarksViewModel.kt

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ import dagger.multibindings.IntoSet
3737
import io.reactivex.schedulers.Schedulers
3838
import kotlinx.coroutines.NonCancellable
3939
import kotlinx.coroutines.launch
40+
import javax.inject.Provider
4041
import javax.inject.Singleton
4142

4243
class BookmarksViewModel(
@@ -127,23 +128,23 @@ class BookmarksViewModelFactoryModule {
127128
@Singleton
128129
@IntoSet
129130
fun provideBookmarksViewModelFactory(
130-
dao: BookmarksDao,
131-
faviconManager: FaviconManager,
132-
dispatcherProvider: DispatcherProvider
131+
dao: Provider<BookmarksDao>,
132+
faviconManager: Provider<FaviconManager>,
133+
dispatcherProvider: Provider<DispatcherProvider>
133134
): ViewModelFactoryPlugin {
134135
return BookmarksViewModelFactory(dao, faviconManager, dispatcherProvider)
135136
}
136137
}
137138

138139
private class BookmarksViewModelFactory(
139-
private val dao: BookmarksDao,
140-
private val faviconManager: FaviconManager,
141-
private val dispatcherProvider: DispatcherProvider
140+
private val dao: Provider<BookmarksDao>,
141+
private val faviconManager: Provider<FaviconManager>,
142+
private val dispatcherProvider: Provider<DispatcherProvider>
142143
) : ViewModelFactoryPlugin {
143144
override fun <T : ViewModel?> create(modelClass: Class<T>): T? {
144145
with(modelClass) {
145146
return when {
146-
isAssignableFrom(BookmarksViewModel::class.java) -> (BookmarksViewModel(dao, faviconManager, dispatcherProvider) as T)
147+
isAssignableFrom(BookmarksViewModel::class.java) -> (BookmarksViewModel(dao.get(), faviconManager.get(), dispatcherProvider.get()) as T)
147148
else -> null
148149
}
149150
}

app/src/main/java/com/duckduckgo/app/brokensite/BrokenSiteViewModel.kt

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ import com.squareup.anvil.annotations.ContributesTo
3535
import dagger.Module
3636
import dagger.Provides
3737
import dagger.multibindings.IntoSet
38+
import javax.inject.Provider
3839
import javax.inject.Singleton
3940

4041
class BrokenSiteViewModel(private val pixel: Pixel, private val brokenSiteSender: BrokenSiteSender) : ViewModel() {
@@ -134,21 +135,21 @@ class BrokenSiteViewModelFactoryModule {
134135
@Singleton
135136
@IntoSet
136137
fun provideBrokenSiteViewModelFactory(
137-
pixel: Pixel,
138-
brokenSiteSender: BrokenSiteSender
138+
pixel: Provider<Pixel>,
139+
brokenSiteSender: Provider<BrokenSiteSender>
139140
): ViewModelFactoryPlugin {
140141
return BrokenSiteViewModelFactory(pixel, brokenSiteSender)
141142
}
142143
}
143144

144145
private class BrokenSiteViewModelFactory(
145-
private val pixel: Pixel,
146-
private val brokenSiteSender: BrokenSiteSender
146+
private val pixel: Provider<Pixel>,
147+
private val brokenSiteSender: Provider<BrokenSiteSender>
147148
) : ViewModelFactoryPlugin {
148149
override fun <T : ViewModel?> create(modelClass: Class<T>): T? {
149150
with(modelClass) {
150151
return when {
151-
isAssignableFrom(BrokenSiteViewModel::class.java) -> (BrokenSiteViewModel(pixel, brokenSiteSender) as T)
152+
isAssignableFrom(BrokenSiteViewModel::class.java) -> (BrokenSiteViewModel(pixel.get(), brokenSiteSender.get()) as T)
152153
else -> null
153154
}
154155
}

app/src/main/java/com/duckduckgo/app/browser/BrowserTabViewModel.kt

Lines changed: 60 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ import timber.log.Timber
117117
import java.io.File
118118
import java.util.*
119119
import java.util.concurrent.TimeUnit
120+
import javax.inject.Provider
120121
import javax.inject.Singleton
121122

122123
class BrowserTabViewModel(
@@ -1843,36 +1844,36 @@ class BrowserTabViewModelFactoryModule {
18431844
@Singleton
18441845
@IntoSet
18451846
fun provideBrowserTabViewModelFactory(
1846-
statisticsUpdater: StatisticsUpdater,
1847-
queryUrlConverter: QueryUrlConverter,
1848-
duckDuckGoUrlDetector: DuckDuckGoUrlDetector,
1849-
siteFactory: SiteFactory,
1850-
tabRepository: TabRepository,
1851-
userWhitelistDao: UserWhitelistDao,
1852-
networkLeaderboardDao: NetworkLeaderboardDao,
1853-
bookmarksDao: BookmarksDao,
1854-
fireproofWebsiteRepository: FireproofWebsiteRepository,
1855-
locationPermissionsRepository: LocationPermissionsRepository,
1856-
geoLocationPermissions: GeoLocationPermissions,
1857-
navigationAwareLoginDetector: NavigationAwareLoginDetector,
1858-
autoCompleteApi: AutoCompleteApi,
1859-
appSettingsPreferencesStore: SettingsDataStore,
1860-
longPressHandler: LongPressHandler,
1861-
webViewSessionStorage: WebViewSessionStorage,
1862-
specialUrlDetector: SpecialUrlDetector,
1863-
faviconManager: FaviconManager,
1864-
addToHomeCapabilityDetector: AddToHomeCapabilityDetector,
1865-
ctaViewModel: CtaViewModel,
1866-
searchCountDao: SearchCountDao,
1867-
pixel: Pixel,
1847+
statisticsUpdater: Provider<StatisticsUpdater>,
1848+
queryUrlConverter: Provider<QueryUrlConverter>,
1849+
duckDuckGoUrlDetector: Provider<DuckDuckGoUrlDetector>,
1850+
siteFactory: Provider<SiteFactory>,
1851+
tabRepository: Provider<TabRepository>,
1852+
userWhitelistDao: Provider<UserWhitelistDao>,
1853+
networkLeaderboardDao: Provider<NetworkLeaderboardDao>,
1854+
bookmarksDao: Provider<BookmarksDao>,
1855+
fireproofWebsiteRepository: Provider<FireproofWebsiteRepository>,
1856+
locationPermissionsRepository: Provider<LocationPermissionsRepository>,
1857+
geoLocationPermissions: Provider<GeoLocationPermissions>,
1858+
navigationAwareLoginDetector: Provider<NavigationAwareLoginDetector>,
1859+
autoCompleteApi: Provider<AutoCompleteApi>,
1860+
appSettingsPreferencesStore: Provider<SettingsDataStore>,
1861+
longPressHandler: Provider<LongPressHandler>,
1862+
webViewSessionStorage: Provider<WebViewSessionStorage>,
1863+
specialUrlDetector: Provider<SpecialUrlDetector>,
1864+
faviconManager: Provider<FaviconManager>,
1865+
addToHomeCapabilityDetector: Provider<AddToHomeCapabilityDetector>,
1866+
ctaViewModel: Provider<CtaViewModel>,
1867+
searchCountDao: Provider<SearchCountDao>,
1868+
pixel: Provider<Pixel>,
18681869
dispatchers: DispatcherProvider = DefaultDispatcherProvider(),
1869-
userEventsStore: UserEventsStore,
1870-
notificationDao: NotificationDao,
1871-
useOurAppDetector: UseOurAppDetector,
1872-
variantManager: VariantManager,
1873-
fileDownloader: FileDownloader,
1874-
globalPrivacyControl: GlobalPrivacyControl,
1875-
fireproofDialogsEventHandler: FireproofDialogsEventHandler
1870+
userEventsStore: Provider<UserEventsStore>,
1871+
notificationDao: Provider<NotificationDao>,
1872+
useOurAppDetector: Provider<UseOurAppDetector>,
1873+
variantManager: Provider<VariantManager>,
1874+
fileDownloader: Provider<FileDownloader>,
1875+
globalPrivacyControl: Provider<GlobalPrivacyControl>,
1876+
fireproofDialogsEventHandler: Provider<FireproofDialogsEventHandler>
18761877
): ViewModelFactoryPlugin {
18771878
return BrowserTabViewModelFactory(
18781879
statisticsUpdater,
@@ -1910,41 +1911,41 @@ class BrowserTabViewModelFactoryModule {
19101911
}
19111912

19121913
private class BrowserTabViewModelFactory(
1913-
private val statisticsUpdater: StatisticsUpdater,
1914-
private val queryUrlConverter: OmnibarEntryConverter,
1915-
private val duckDuckGoUrlDetector: DuckDuckGoUrlDetector,
1916-
private val siteFactory: SiteFactory,
1917-
private val tabRepository: TabRepository,
1918-
private val userWhitelistDao: UserWhitelistDao,
1919-
private val networkLeaderboardDao: NetworkLeaderboardDao,
1920-
private val bookmarksDao: BookmarksDao,
1921-
private val fireproofWebsiteRepository: FireproofWebsiteRepository,
1922-
private val locationPermissionsRepository: LocationPermissionsRepository,
1923-
private val geoLocationPermissions: GeoLocationPermissions,
1924-
private val navigationAwareLoginDetector: NavigationAwareLoginDetector,
1925-
private val autoComplete: AutoComplete,
1926-
private val appSettingsPreferencesStore: SettingsDataStore,
1927-
private val longPressHandler: LongPressHandler,
1928-
private val webViewSessionStorage: WebViewSessionStorage,
1929-
private val specialUrlDetector: SpecialUrlDetector,
1930-
private val faviconManager: FaviconManager,
1931-
private val addToHomeCapabilityDetector: AddToHomeCapabilityDetector,
1932-
private val ctaViewModel: CtaViewModel,
1933-
private val searchCountDao: SearchCountDao,
1934-
private val pixel: Pixel,
1914+
private val statisticsUpdater: Provider<StatisticsUpdater>,
1915+
private val queryUrlConverter: Provider<QueryUrlConverter>,
1916+
private val duckDuckGoUrlDetector: Provider<DuckDuckGoUrlDetector>,
1917+
private val siteFactory: Provider<SiteFactory>,
1918+
private val tabRepository: Provider<TabRepository>,
1919+
private val userWhitelistDao: Provider<UserWhitelistDao>,
1920+
private val networkLeaderboardDao: Provider<NetworkLeaderboardDao>,
1921+
private val bookmarksDao: Provider<BookmarksDao>,
1922+
private val fireproofWebsiteRepository: Provider<FireproofWebsiteRepository>,
1923+
private val locationPermissionsRepository: Provider<LocationPermissionsRepository>,
1924+
private val geoLocationPermissions: Provider<GeoLocationPermissions>,
1925+
private val navigationAwareLoginDetector: Provider<NavigationAwareLoginDetector>,
1926+
private val autoComplete: Provider<AutoCompleteApi>,
1927+
private val appSettingsPreferencesStore: Provider<SettingsDataStore>,
1928+
private val longPressHandler: Provider<LongPressHandler>,
1929+
private val webViewSessionStorage: Provider<WebViewSessionStorage>,
1930+
private val specialUrlDetector: Provider<SpecialUrlDetector>,
1931+
private val faviconManager: Provider<FaviconManager>,
1932+
private val addToHomeCapabilityDetector: Provider<AddToHomeCapabilityDetector>,
1933+
private val ctaViewModel: Provider<CtaViewModel>,
1934+
private val searchCountDao: Provider<SearchCountDao>,
1935+
private val pixel: Provider<Pixel>,
19351936
private val dispatchers: DispatcherProvider = DefaultDispatcherProvider(),
1936-
private val userEventsStore: UserEventsStore,
1937-
private val notificationDao: NotificationDao,
1938-
private val useOurAppDetector: UseOurAppDetector,
1939-
private val variantManager: VariantManager,
1940-
private val fileDownloader: FileDownloader,
1941-
private val globalPrivacyControl: GlobalPrivacyControl,
1942-
private val fireproofDialogsEventHandler: FireproofDialogsEventHandler
1937+
private val userEventsStore: Provider<UserEventsStore>,
1938+
private val notificationDao: Provider<NotificationDao>,
1939+
private val useOurAppDetector: Provider<UseOurAppDetector>,
1940+
private val variantManager: Provider<VariantManager>,
1941+
private val fileDownloader: Provider<FileDownloader>,
1942+
private val globalPrivacyControl: Provider<GlobalPrivacyControl>,
1943+
private val fireproofDialogsEventHandler: Provider<FireproofDialogsEventHandler>
19431944
) : ViewModelFactoryPlugin {
19441945
override fun <T : ViewModel?> create(modelClass: Class<T>): T? {
19451946
with(modelClass) {
19461947
return when {
1947-
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
1948+
isAssignableFrom(BrowserTabViewModel::class.java) -> BrowserTabViewModel(statisticsUpdater.get(), queryUrlConverter.get(), duckDuckGoUrlDetector.get(), siteFactory.get(), tabRepository.get(), userWhitelistDao.get(), networkLeaderboardDao.get(), bookmarksDao.get(), fireproofWebsiteRepository.get(), locationPermissionsRepository.get(), geoLocationPermissions.get(), navigationAwareLoginDetector.get(), autoComplete.get(), appSettingsPreferencesStore.get(), longPressHandler.get(), webViewSessionStorage.get(), specialUrlDetector.get(), faviconManager.get(), addToHomeCapabilityDetector.get(), ctaViewModel.get(), searchCountDao.get(), pixel.get(), dispatchers, userEventsStore.get(), notificationDao.get(), useOurAppDetector.get(), variantManager.get(), fileDownloader.get(), globalPrivacyControl.get(), fireproofDialogsEventHandler.get()) as T
19481949
else -> null
19491950
}
19501951
}

app/src/main/java/com/duckduckgo/app/browser/BrowserViewModel.kt

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ import kotlinx.coroutines.CoroutineScope
5353
import kotlinx.coroutines.Dispatchers
5454
import kotlinx.coroutines.launch
5555
import timber.log.Timber
56+
import javax.inject.Provider
5657
import javax.inject.Singleton
5758
import kotlin.coroutines.CoroutineContext
5859

@@ -248,33 +249,33 @@ class BrowserViewModelFactoryModule {
248249
@Singleton
249250
@IntoSet
250251
fun provideBrowserViewModelFactory(
251-
tabRepository: TabRepository,
252-
queryUrlConverter: QueryUrlConverter,
253-
dataClearer: DataClearer,
254-
appEnjoymentPromptEmitter: AppEnjoymentPromptEmitter,
255-
appEnjoymentUserEventRecorder: AppEnjoymentUserEventRecorder,
252+
tabRepository: Provider<TabRepository>,
253+
queryUrlConverter: Provider<QueryUrlConverter>,
254+
dataClearer: Provider<DataClearer>,
255+
appEnjoymentPromptEmitter: Provider<AppEnjoymentPromptEmitter>,
256+
appEnjoymentUserEventRecorder: Provider<AppEnjoymentUserEventRecorder>,
256257
dispatchers: DispatcherProvider = DefaultDispatcherProvider(),
257-
pixel: Pixel,
258-
useOurAppDetector: UseOurAppDetector
258+
pixel: Provider<Pixel>,
259+
useOurAppDetector: Provider<UseOurAppDetector>
259260
): ViewModelFactoryPlugin {
260261
return BrowserViewModelFactory(tabRepository, queryUrlConverter, dataClearer, appEnjoymentPromptEmitter, appEnjoymentUserEventRecorder, dispatchers, pixel, useOurAppDetector)
261262
}
262263
}
263264

264265
private class BrowserViewModelFactory(
265-
val tabRepository: TabRepository,
266-
val queryUrlConverter: OmnibarEntryConverter,
267-
val dataClearer: DataClearer,
268-
val appEnjoymentPromptEmitter: AppEnjoymentPromptEmitter,
269-
val appEnjoymentUserEventRecorder: AppEnjoymentUserEventRecorder,
266+
val tabRepository: Provider<TabRepository>,
267+
val queryUrlConverter: Provider<QueryUrlConverter>,
268+
val dataClearer: Provider<DataClearer>,
269+
val appEnjoymentPromptEmitter: Provider<AppEnjoymentPromptEmitter>,
270+
val appEnjoymentUserEventRecorder: Provider<AppEnjoymentUserEventRecorder>,
270271
val dispatchers: DispatcherProvider = DefaultDispatcherProvider(),
271-
val pixel: Pixel,
272-
val useOurAppDetector: UseOurAppDetector
272+
val pixel: Provider<Pixel>,
273+
val useOurAppDetector: Provider<UseOurAppDetector>
273274
) : ViewModelFactoryPlugin {
274275
override fun <T : ViewModel?> create(modelClass: Class<T>): T? {
275276
with(modelClass) {
276277
return when {
277-
isAssignableFrom(BrowserViewModel::class.java) -> BrowserViewModel(tabRepository, queryUrlConverter, dataClearer, appEnjoymentPromptEmitter, appEnjoymentUserEventRecorder, dispatchers, pixel, useOurAppDetector) as T
278+
isAssignableFrom(BrowserViewModel::class.java) -> BrowserViewModel(tabRepository.get(), queryUrlConverter.get(), dataClearer.get(), appEnjoymentPromptEmitter.get(), appEnjoymentUserEventRecorder.get(), dispatchers, pixel.get(), useOurAppDetector.get()) as T
278279
else -> null
279280
}
280281
}

app/src/main/java/com/duckduckgo/app/feedback/ui/common/FeedbackViewModel.kt

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ import kotlinx.coroutines.GlobalScope
3737
import kotlinx.coroutines.launch
3838
import kotlinx.coroutines.withContext
3939
import timber.log.Timber
40+
import javax.inject.Provider
4041
import javax.inject.Singleton
4142

4243
class FeedbackViewModel(private val playStoreUtils: PlayStoreUtils, private val feedbackSubmitter: FeedbackSubmitter) : ViewModel() {
@@ -297,21 +298,21 @@ class FeedbackViewModelFactoryModule {
297298
@Singleton
298299
@IntoSet
299300
fun provideFeedbackViewModelFactory(
300-
playStoreUtils: PlayStoreUtils,
301-
feedbackSubmitter: FeedbackSubmitter
301+
playStoreUtils: Provider<PlayStoreUtils>,
302+
feedbackSubmitter: Provider<FeedbackSubmitter>
302303
): ViewModelFactoryPlugin {
303304
return FeedbackViewModelFactory(playStoreUtils, feedbackSubmitter)
304305
}
305306
}
306307

307308
private class FeedbackViewModelFactory(
308-
private val playStoreUtils: PlayStoreUtils,
309-
private val feedbackSubmitter: FeedbackSubmitter
309+
private val playStoreUtils: Provider<PlayStoreUtils>,
310+
private val feedbackSubmitter: Provider<FeedbackSubmitter>
310311
) : ViewModelFactoryPlugin {
311312
override fun <T : ViewModel?> create(modelClass: Class<T>): T? {
312313
with(modelClass) {
313314
return when {
314-
isAssignableFrom(FeedbackViewModel::class.java) -> (FeedbackViewModel(playStoreUtils, feedbackSubmitter) as T)
315+
isAssignableFrom(FeedbackViewModel::class.java) -> (FeedbackViewModel(playStoreUtils.get(), feedbackSubmitter.get()) as T)
315316
else -> null
316317
}
317318
}

app/src/main/java/com/duckduckgo/app/feedback/ui/initial/InitialFeedbackFragmentViewModel.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ class InitialFeedbackFragmentViewModelFactoryModule {
5858
}
5959
}
6060

61-
private class InitialFeedbackFragmentViewModelFactory() : ViewModelFactoryPlugin {
61+
private class InitialFeedbackFragmentViewModelFactory : ViewModelFactoryPlugin {
6262
override fun <T : ViewModel?> create(modelClass: Class<T>): T? {
6363
with(modelClass) {
6464
return when {

app/src/main/java/com/duckduckgo/app/feedback/ui/negative/brokensite/BrokenSiteNegativeFeedbackViewModel.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ class BrokenSiteNegativeFeedbackViewModelFactoryModule {
5151
}
5252
}
5353

54-
private class BrokenSiteNegativeFeedbackViewModelFactory() : ViewModelFactoryPlugin {
54+
private class BrokenSiteNegativeFeedbackViewModelFactory : ViewModelFactoryPlugin {
5555
override fun <T : ViewModel?> create(modelClass: Class<T>): T? {
5656
with(modelClass) {
5757
return when {

app/src/main/java/com/duckduckgo/app/feedback/ui/negative/openended/ShareOpenEndedNegativeFeedbackViewModel.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ class ShareOpenEndedNegativeFeedbackViewModelFactoryModule {
5858
}
5959
}
6060

61-
private class ShareOpenEndedNegativeFeedbackViewModelFactory() : ViewModelFactoryPlugin {
61+
private class ShareOpenEndedNegativeFeedbackViewModelFactory : ViewModelFactoryPlugin {
6262
override fun <T : ViewModel?> create(modelClass: Class<T>): T? {
6363
with(modelClass) {
6464
return when {

app/src/main/java/com/duckduckgo/app/feedback/ui/positive/initial/PositiveFeedbackLandingViewModel.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ class PositiveFeedbackLandingViewModelFactoryModule {
6262
}
6363
}
6464

65-
private class PositiveFeedbackLandingViewModelFactory() : ViewModelFactoryPlugin {
65+
private class PositiveFeedbackLandingViewModelFactory : ViewModelFactoryPlugin {
6666
override fun <T : ViewModel?> create(modelClass: Class<T>): T? {
6767
with(modelClass) {
6868
return when {

0 commit comments

Comments
 (0)