From 78c60e509bf10b1da6a2ab3ebee6cbf7944d8000 Mon Sep 17 00:00:00 2001 From: Aitor Viana Date: Wed, 24 Mar 2021 19:56:32 +0100 Subject: [PATCH 1/3] Bumped anvil to 2.2.0 and upgrade dagger to 2.32 --- build.gradle | 2 +- versions.properties | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index daff54665a04..5bef75be191a 100644 --- a/build.gradle +++ b/build.gradle @@ -3,7 +3,7 @@ buildscript { ext.kotlin_version = '1.4.21' ext.spotless = "5.7.0" - ext.anvil_version = "2.1.0" + ext.anvil_version = "2.2.0" ext.min_sdk = 21 ext.target_sdk = 29 diff --git a/versions.properties b/versions.properties index 5dde3898855b..4793565a8843 100644 --- a/versions.properties +++ b/versions.properties @@ -26,7 +26,7 @@ version.com.jakewharton.rxrelay2..rxrelay=2.0.0 version.com.jakewharton.timber..timber=4.7.1 version.com.nhaarman.mockitokotlin2..mockito-kotlin=2.1.0 version.google.android.material=1.2.1 -version.google.dagger=2.27 +version.google.dagger=2.32 version.io.reactivex.rxjava2..rxandroid=2.0.2 version.io.reactivex.rxjava2..rxjava=2.2.9 version.kotlin=1.4.10 From b2414fd0830a9f5330f62af824327039277051ac Mon Sep 17 00:00:00 2001 From: Aitor Viana Date: Wed, 24 Mar 2021 20:48:29 +0100 Subject: [PATCH 2/3] VM factories to contribute multibinding --- .../app/bookmarks/ui/BookmarksViewModel.kt | 31 ++----- .../app/brokensite/BrokenSiteViewModel.kt | 24 +----- .../app/browser/BrowserTabViewModel.kt | 85 ++----------------- .../app/browser/BrowserViewModel.kt | 30 +------ .../feedback/ui/common/FeedbackViewModel.kt | 24 +----- .../InitialFeedbackFragmentViewModel.kt | 21 +---- .../BrokenSiteNegativeFeedbackViewModel.kt | 21 +---- ...ShareOpenEndedNegativeFeedbackViewModel.kt | 21 +---- .../PositiveFeedbackLandingViewModel.kt | 21 +---- .../ui/FireproofWebsitesViewModel.kt | 30 ++----- .../ui/GlobalPrivacyControlViewModel.kt | 30 ++----- .../app/icon/ui/ChangeIconViewModel.kt | 24 +----- .../duckduckgo/app/launch/LaunchViewModel.kt | 24 +----- .../ui/LocationPermissionsViewModel.kt | 28 +----- .../app/onboarding/ui/OnboardingViewModel.kt | 25 +----- .../ui/page/DefaultBrowserPageViewModel.kt | 25 +----- .../privacy/ui/PrivacyDashboardViewModel.kt | 27 ++---- .../privacy/ui/PrivacyPracticesViewModel.kt | 21 +---- .../app/privacy/ui/ScorecardViewModel.kt | 21 +---- .../privacy/ui/TrackerNetworksViewModel.kt | 20 +---- .../app/privacy/ui/WhitelistViewModel.kt | 23 +---- .../app/settings/SettingsViewModel.kt | 28 +----- .../app/survey/ui/SurveyViewModel.kt | 25 +----- .../app/systemsearch/SystemSearchViewModel.kt | 28 ++---- .../app/tabs/ui/TabSwitcherViewModel.kt | 24 +----- .../ui/AddWidgetInstructionsViewModel.kt | 21 +---- 26 files changed, 112 insertions(+), 590 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 48299ea40aa2..d8716bd4a551 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 @@ -16,11 +16,7 @@ package com.duckduckgo.app.bookmarks.ui -import androidx.lifecycle.LiveData -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.Observer -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope +import androidx.lifecycle.* import com.duckduckgo.app.bookmarks.db.BookmarkEntity import com.duckduckgo.app.bookmarks.db.BookmarksDao import com.duckduckgo.app.bookmarks.ui.BookmarksViewModel.Command.* @@ -30,15 +26,12 @@ 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 com.squareup.anvil.annotations.ContributesMultibinding import io.reactivex.schedulers.Schedulers import kotlinx.coroutines.NonCancellable import kotlinx.coroutines.launch +import javax.inject.Inject import javax.inject.Provider -import javax.inject.Singleton class BookmarksViewModel( val dao: BookmarksDao, @@ -121,22 +114,8 @@ class BookmarksViewModel( } -@Module -@ContributesTo(AppObjectGraph::class) -class BookmarksViewModelFactoryModule { - @Provides - @Singleton - @IntoSet - fun provideBookmarksViewModelFactory( - dao: Provider, - faviconManager: Provider, - dispatcherProvider: Provider - ): ViewModelFactoryPlugin { - return BookmarksViewModelFactory(dao, faviconManager, dispatcherProvider) - } -} - -private class BookmarksViewModelFactory( +@ContributesMultibinding(AppObjectGraph::class) +class BookmarksViewModelFactory @Inject constructor( private val dao: Provider, private val faviconManager: Provider, private val dispatcherProvider: Provider 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 a905b16cc7ff..651eb387a3f8 100644 --- a/app/src/main/java/com/duckduckgo/app/brokensite/BrokenSiteViewModel.kt +++ b/app/src/main/java/com/duckduckgo/app/brokensite/BrokenSiteViewModel.kt @@ -31,12 +31,9 @@ import com.duckduckgo.app.global.plugins.view_model.ViewModelFactoryPlugin import com.duckduckgo.app.pixels.AppPixelName 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 com.squareup.anvil.annotations.ContributesMultibinding +import javax.inject.Inject import javax.inject.Provider -import javax.inject.Singleton class BrokenSiteViewModel(private val pixel: Pixel, private val brokenSiteSender: BrokenSiteSender) : ViewModel() { @@ -128,21 +125,8 @@ class BrokenSiteViewModel(private val pixel: Pixel, private val brokenSiteSender } } -@Module -@ContributesTo(AppObjectGraph::class) -class BrokenSiteViewModelFactoryModule { - @Provides - @Singleton - @IntoSet - fun provideBrokenSiteViewModelFactory( - pixel: Provider, - brokenSiteSender: Provider - ): ViewModelFactoryPlugin { - return BrokenSiteViewModelFactory(pixel, brokenSiteSender) - } -} - -private class BrokenSiteViewModelFactory( +@ContributesMultibinding(AppObjectGraph::class) +class BrokenSiteViewModelFactory @Inject constructor( private val pixel: Provider, private val brokenSiteSender: Provider ) : ViewModelFactoryPlugin { 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 b8e081ffd0bb..e7d05fd92520 100644 --- a/app/src/main/java/com/duckduckgo/app/browser/BrowserTabViewModel.kt +++ b/app/src/main/java/com/duckduckgo/app/browser/BrowserTabViewModel.kt @@ -88,6 +88,7 @@ import com.duckduckgo.app.location.ui.SiteLocationPermissionDialog import com.duckduckgo.app.location.ui.SystemLocationPermissionDialog import com.duckduckgo.app.notification.db.NotificationDao import com.duckduckgo.app.notification.model.UseOurAppNotification +import com.duckduckgo.app.pixels.AppPixelName import com.duckduckgo.app.privacy.db.NetworkLeaderboardDao import com.duckduckgo.app.privacy.db.UserWhitelistDao import com.duckduckgo.app.privacy.model.PrivacyGrade @@ -95,7 +96,6 @@ 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.pixels.AppPixelName import com.duckduckgo.app.statistics.pixels.Pixel.PixelParameter import com.duckduckgo.app.surrogates.SurrogateResponse import com.duckduckgo.app.survey.model.Survey @@ -105,10 +105,7 @@ 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 com.squareup.anvil.annotations.ContributesMultibinding import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.disposables.Disposable import io.reactivex.schedulers.Schedulers @@ -118,8 +115,8 @@ import timber.log.Timber import java.io.File import java.util.* import java.util.concurrent.TimeUnit +import javax.inject.Inject import javax.inject.Provider -import javax.inject.Singleton class BrowserTabViewModel( private val statisticsUpdater: StatisticsUpdater, @@ -1846,80 +1843,8 @@ class BrowserTabViewModel( } } -@Module -@ContributesTo(AppObjectGraph::class) -class BrowserTabViewModelFactoryModule { - @Provides - @Singleton - @IntoSet - fun provideBrowserTabViewModelFactory( - statisticsUpdater: Provider, - queryUrlConverter: Provider, - duckDuckGoUrlDetector: Provider, - siteFactory: Provider, - tabRepository: Provider, - userWhitelistDao: Provider, - networkLeaderboardDao: Provider, - bookmarksDao: Provider, - fireproofWebsiteRepository: Provider, - locationPermissionsRepository: Provider, - geoLocationPermissions: Provider, - navigationAwareLoginDetector: Provider, - autoCompleteApi: Provider, - appSettingsPreferencesStore: Provider, - longPressHandler: Provider, - webViewSessionStorage: Provider, - specialUrlDetector: Provider, - faviconManager: Provider, - addToHomeCapabilityDetector: Provider, - ctaViewModel: Provider, - searchCountDao: Provider, - pixel: Provider, - dispatchers: DispatcherProvider = DefaultDispatcherProvider(), - userEventsStore: Provider, - notificationDao: Provider, - useOurAppDetector: Provider, - variantManager: Provider, - fileDownloader: Provider, - globalPrivacyControl: Provider, - fireproofDialogsEventHandler: Provider - ): 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( +@ContributesMultibinding(AppObjectGraph::class) +class BrowserTabViewModelFactory @Inject constructor( private val statisticsUpdater: Provider, private val queryUrlConverter: Provider, private val duckDuckGoUrlDetector: Provider, 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 b5103bfa4b80..047261a1710b 100644 --- a/app/src/main/java/com/duckduckgo/app/browser/BrowserViewModel.kt +++ b/app/src/main/java/com/duckduckgo/app/browser/BrowserViewModel.kt @@ -45,16 +45,13 @@ 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 com.squareup.anvil.annotations.ContributesMultibinding import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import timber.log.Timber +import javax.inject.Inject import javax.inject.Provider -import javax.inject.Singleton import kotlin.coroutines.CoroutineContext class BrowserViewModel( @@ -242,27 +239,8 @@ class BrowserViewModel( } } -@Module -@ContributesTo(AppObjectGraph::class) -class BrowserViewModelFactoryModule { - @Provides - @Singleton - @IntoSet - fun provideBrowserViewModelFactory( - tabRepository: Provider, - queryUrlConverter: Provider, - dataClearer: Provider, - appEnjoymentPromptEmitter: Provider, - appEnjoymentUserEventRecorder: Provider, - dispatchers: DispatcherProvider = DefaultDispatcherProvider(), - pixel: Provider, - useOurAppDetector: Provider - ): ViewModelFactoryPlugin { - return BrowserViewModelFactory(tabRepository, queryUrlConverter, dataClearer, appEnjoymentPromptEmitter, appEnjoymentUserEventRecorder, dispatchers, pixel, useOurAppDetector) - } -} - -private class BrowserViewModelFactory( +@ContributesMultibinding(AppObjectGraph::class) +class BrowserViewModelFactory @Inject constructor( val tabRepository: Provider, val queryUrlConverter: Provider, val dataClearer: Provider, 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 4d17f2fbcc6a..b893b711757b 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 @@ -28,17 +28,14 @@ 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 com.squareup.anvil.annotations.ContributesMultibinding import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import timber.log.Timber +import javax.inject.Inject import javax.inject.Provider -import javax.inject.Singleton class FeedbackViewModel(private val playStoreUtils: PlayStoreUtils, private val feedbackSubmitter: FeedbackSubmitter) : ViewModel() { @@ -291,21 +288,8 @@ data class UpdateViewCommand( val subReason: SubReason? = null ) -@Module -@ContributesTo(AppObjectGraph::class) -class FeedbackViewModelFactoryModule { - @Provides - @Singleton - @IntoSet - fun provideFeedbackViewModelFactory( - playStoreUtils: Provider, - feedbackSubmitter: Provider - ): ViewModelFactoryPlugin { - return FeedbackViewModelFactory(playStoreUtils, feedbackSubmitter) - } -} - -private class FeedbackViewModelFactory( +@ContributesMultibinding(AppObjectGraph::class) +class FeedbackViewModelFactory @Inject constructor( private val playStoreUtils: Provider, private val feedbackSubmitter: Provider ) : ViewModelFactoryPlugin { 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 7deec16228e4..8ba8c51a6498 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 @@ -21,11 +21,8 @@ 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 +import com.squareup.anvil.annotations.ContributesMultibinding +import javax.inject.Inject class InitialFeedbackFragmentViewModel : ViewModel() { @@ -47,18 +44,8 @@ class InitialFeedbackFragmentViewModel : ViewModel() { } } -@Module -@ContributesTo(AppObjectGraph::class) -class InitialFeedbackFragmentViewModelFactoryModule { - @Provides - @Singleton - @IntoSet - fun provideInitialFeedbackFragmentViewModelFactory(): ViewModelFactoryPlugin { - return InitialFeedbackFragmentViewModelFactory() - } -} - -private class InitialFeedbackFragmentViewModelFactory : ViewModelFactoryPlugin { +@ContributesMultibinding(AppObjectGraph::class) +class InitialFeedbackFragmentViewModelFactory @Inject constructor() : ViewModelFactoryPlugin { override fun create(modelClass: Class): T? { with(modelClass) { return when { 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 6e949871dd66..96fc2efbd4ad 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 @@ -20,11 +20,8 @@ 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 +import com.squareup.anvil.annotations.ContributesMultibinding +import javax.inject.Inject class BrokenSiteNegativeFeedbackViewModel : ViewModel() { @@ -40,18 +37,8 @@ class BrokenSiteNegativeFeedbackViewModel : ViewModel() { } } -@Module -@ContributesTo(AppObjectGraph::class) -class BrokenSiteNegativeFeedbackViewModelFactoryModule { - @Provides - @Singleton - @IntoSet - fun provideBrokenSiteNegativeFeedbackViewModelFactory(): ViewModelFactoryPlugin { - return BrokenSiteNegativeFeedbackViewModelFactory() - } -} - -private class BrokenSiteNegativeFeedbackViewModelFactory : ViewModelFactoryPlugin { +@ContributesMultibinding(AppObjectGraph::class) +class BrokenSiteNegativeFeedbackViewModelFactory @Inject constructor() : ViewModelFactoryPlugin { override fun create(modelClass: Class): T? { with(modelClass) { return when { 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 d40024303cdf..60e033c0df0c 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 @@ -22,11 +22,8 @@ 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 +import com.squareup.anvil.annotations.ContributesMultibinding +import javax.inject.Inject class ShareOpenEndedNegativeFeedbackViewModel : ViewModel() { @@ -47,18 +44,8 @@ class ShareOpenEndedNegativeFeedbackViewModel : ViewModel() { } } -@Module -@ContributesTo(AppObjectGraph::class) -class ShareOpenEndedNegativeFeedbackViewModelFactoryModule { - @Provides - @Singleton - @IntoSet - fun provideShareOpenEndedNegativeFeedbackViewModelFactory(): ViewModelFactoryPlugin { - return ShareOpenEndedNegativeFeedbackViewModelFactory() - } -} - -private class ShareOpenEndedNegativeFeedbackViewModelFactory : ViewModelFactoryPlugin { +@ContributesMultibinding(AppObjectGraph::class) +class ShareOpenEndedNegativeFeedbackViewModelFactory @Inject constructor() : ViewModelFactoryPlugin { override fun create(modelClass: Class): T? { with(modelClass) { return when { 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 097bdbee9aeb..fd8dc68d88f4 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 @@ -20,11 +20,8 @@ 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 +import com.squareup.anvil.annotations.ContributesMultibinding +import javax.inject.Inject class PositiveFeedbackLandingViewModel : ViewModel() { @@ -51,18 +48,8 @@ sealed class Command { object LaunchShareFeedbackPage : Command() } -@Module -@ContributesTo(AppObjectGraph::class) -class PositiveFeedbackLandingViewModelFactoryModule { - @Provides - @Singleton - @IntoSet - fun providePositiveFeedbackLandingViewModelFactory(): ViewModelFactoryPlugin { - return PositiveFeedbackLandingViewModelFactory() - } -} - -private class PositiveFeedbackLandingViewModelFactory : ViewModelFactoryPlugin { +@ContributesMultibinding(AppObjectGraph::class) +class PositiveFeedbackLandingViewModelFactory @Inject constructor() : ViewModelFactoryPlugin { override fun create(modelClass: Class): T? { with(modelClass) { return when { 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 83128f320bf3..6ba3db74d8e9 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 @@ -17,7 +17,6 @@ package com.duckduckgo.app.fire.fireproofwebsite.ui import androidx.lifecycle.* -import androidx.lifecycle.Observer import com.duckduckgo.app.fire.fireproofwebsite.data.FireproofWebsiteEntity import com.duckduckgo.app.fire.fireproofwebsite.data.FireproofWebsiteRepository import com.duckduckgo.app.fire.fireproofwebsite.ui.FireproofWebsitesViewModel.Command.ConfirmDeleteFireproofWebsite @@ -26,17 +25,14 @@ 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.pixels.AppPixelName.* import com.duckduckgo.app.settings.db.SettingsDataStore import com.duckduckgo.app.statistics.pixels.Pixel -import com.duckduckgo.app.pixels.AppPixelName.* import com.duckduckgo.di.scopes.AppObjectGraph -import com.squareup.anvil.annotations.ContributesTo -import dagger.Module -import dagger.Provides -import dagger.multibindings.IntoSet +import com.squareup.anvil.annotations.ContributesMultibinding import kotlinx.coroutines.launch +import javax.inject.Inject import javax.inject.Provider -import javax.inject.Singleton class FireproofWebsitesViewModel( private val fireproofWebsiteRepository: FireproofWebsiteRepository, @@ -112,24 +108,8 @@ class FireproofWebsitesViewModel( } } -@Module -@ContributesTo(AppObjectGraph::class) -class FireproofWebsitesViewModelFactoryModule { - @Provides - @Singleton - @IntoSet - fun provideFireproofWebsitesViewModelFactory( - fireproofWebsiteRepository: Provider, - dispatcherProvider: Provider, - pixel: Provider, - settingsDataStore: Provider, - userEventsStore: Provider - ): ViewModelFactoryPlugin { - return FireproofWebsitesViewModelFactory(fireproofWebsiteRepository, dispatcherProvider, pixel, settingsDataStore, userEventsStore) - } -} - -private class FireproofWebsitesViewModelFactory( +@ContributesMultibinding(AppObjectGraph::class) +class FireproofWebsitesViewModelFactory @Inject constructor( private val fireproofWebsiteRepository: Provider, private val dispatcherProvider: Provider, private val pixel: Provider, 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 fedfcf681317..8a20d5a97250 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 @@ -16,19 +16,18 @@ package com.duckduckgo.app.globalprivacycontrol.ui -import androidx.lifecycle.* +import androidx.lifecycle.LiveData +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.pixels.AppPixelName.* import com.duckduckgo.app.settings.db.SettingsDataStore import com.duckduckgo.app.statistics.pixels.Pixel -import com.duckduckgo.app.pixels.AppPixelName.* import com.duckduckgo.di.scopes.AppObjectGraph -import com.squareup.anvil.annotations.ContributesTo -import dagger.Module -import dagger.Provides -import dagger.multibindings.IntoSet +import com.squareup.anvil.annotations.ContributesMultibinding +import javax.inject.Inject import javax.inject.Provider -import javax.inject.Singleton class GlobalPrivacyControlViewModel( private val pixel: Pixel, @@ -70,21 +69,8 @@ class GlobalPrivacyControlViewModel( } } -@Module -@ContributesTo(AppObjectGraph::class) -class GlobalPrivacyControlViewModelFactoryModule { - @Provides - @Singleton - @IntoSet - fun provideGlobalPrivacyControlViewModelFactory( - pixel: Provider, - settingsDataStore: Provider - ): ViewModelFactoryPlugin { - return GlobalPrivacyControlViewModelFactory(pixel, settingsDataStore) - } -} - -private class GlobalPrivacyControlViewModelFactory( +@ContributesMultibinding(AppObjectGraph::class) +class GlobalPrivacyControlViewModelFactory @Inject constructor( private val pixel: Provider, private val settingsDataStore: Provider ) : ViewModelFactoryPlugin { 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 807b722a3c18..4de9fef930f3 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 @@ -26,13 +26,9 @@ import com.duckduckgo.app.pixels.AppPixelName 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 com.squareup.anvil.annotations.ContributesMultibinding import javax.inject.Inject import javax.inject.Provider -import javax.inject.Singleton class ChangeIconViewModel @Inject constructor( private val settingsDataStore: SettingsDataStore, @@ -83,22 +79,8 @@ class ChangeIconViewModel @Inject constructor( } } -@Module -@ContributesTo(AppObjectGraph::class) -class ChangeIconViewModelFactoryModule { - @Provides - @Singleton - @IntoSet - fun provideChangeIconViewModelFactory( - settingsDataStore: Provider, - appIconModifier: Provider, - pixel: Provider - ): ViewModelFactoryPlugin { - return ChangeIconViewModelFactory(settingsDataStore, appIconModifier, pixel) - } -} - -private class ChangeIconViewModelFactory( +@ContributesMultibinding(AppObjectGraph::class) +class ChangeIconViewModelFactory @Inject constructor( private val settingsDataStore: Provider, private val appIconModifier: Provider, private val pixel: Provider 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 f830915dacc4..485f757ef142 100644 --- a/app/src/main/java/com/duckduckgo/app/launch/LaunchViewModel.kt +++ b/app/src/main/java/com/duckduckgo/app/launch/LaunchViewModel.kt @@ -24,14 +24,11 @@ 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 com.squareup.anvil.annotations.ContributesMultibinding import kotlinx.coroutines.withTimeoutOrNull import timber.log.Timber +import javax.inject.Inject import javax.inject.Provider -import javax.inject.Singleton class LaunchViewModel( private val userStageStore: UserStageStore, @@ -68,21 +65,8 @@ class LaunchViewModel( } } -@Module -@ContributesTo(AppObjectGraph::class) -class LaunchViewModelFactoryModule { - @Provides - @Singleton - @IntoSet - fun provideLaunchViewModelFactory( - userStageStore: Provider, - appInstallationReferrerStateListener: Provider - ): ViewModelFactoryPlugin { - return LaunchViewModelFactory(userStageStore, appInstallationReferrerStateListener) - } -} - -private class LaunchViewModelFactory( +@ContributesMultibinding(AppObjectGraph::class) +class LaunchViewModelFactory @Inject constructor( private val userStageStore: Provider, private val appInstallationReferrerStateListener: Provider ) : ViewModelFactoryPlugin { 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 260760c72eb8..f9255080a3c9 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 @@ -17,7 +17,6 @@ package com.duckduckgo.app.location.ui 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 @@ -29,13 +28,10 @@ import com.duckduckgo.app.pixels.AppPixelName 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 com.squareup.anvil.annotations.ContributesMultibinding import kotlinx.coroutines.launch +import javax.inject.Inject import javax.inject.Provider -import javax.inject.Singleton class LocationPermissionsViewModel( private val locationPermissionsRepository: LocationPermissionsRepository, @@ -139,24 +135,8 @@ class LocationPermissionsViewModel( } } -@Module -@ContributesTo(AppObjectGraph::class) -class LocationPermissionsViewModelFactoryModule { - @Provides - @Singleton - @IntoSet - fun provideLocationPermissionsViewModelFactory( - locationPermissionsRepository: Provider, - geoLocationPermissions: Provider, - dispatcherProvider: Provider, - settingsDataStore: Provider, - pixel: Provider - ): ViewModelFactoryPlugin { - return LocationPermissionsViewModelFactory(locationPermissionsRepository, geoLocationPermissions, dispatcherProvider, settingsDataStore, pixel) - } -} - -private class LocationPermissionsViewModelFactory( +@ContributesMultibinding(AppObjectGraph::class) +class LocationPermissionsViewModelFactory @Inject constructor( private val locationPermissionsRepository: Provider, private val geoLocationPermissions: Provider, private val dispatcherProvider: Provider, 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 75fc7af09de5..543ed0dc978a 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 @@ -24,13 +24,10 @@ 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 com.squareup.anvil.annotations.ContributesMultibinding import kotlinx.coroutines.launch +import javax.inject.Inject import javax.inject.Provider -import javax.inject.Singleton class OnboardingViewModel( private val userStageStore: UserStageStore, @@ -58,22 +55,8 @@ class OnboardingViewModel( } } -@Module -@ContributesTo(AppObjectGraph::class) -class OnboardingViewModelFactoryModule { - @Provides - @Singleton - @IntoSet - fun provideOnboardingViewModelFactory( - userStageStore: Provider, - pageLayoutManager: Provider, - dispatchers: Provider - ): ViewModelFactoryPlugin { - return OnboardingViewModelFactory(userStageStore, pageLayoutManager, dispatchers) - } -} - -private class OnboardingViewModelFactory( +@ContributesMultibinding(AppObjectGraph::class) +class OnboardingViewModelFactory @Inject constructor( private val userStageStore: Provider, private val pageLayoutManager: Provider, private val dispatchers: Provider 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 4d2a8aeb2bab..2b9c6f7c2e4a 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 @@ -25,12 +25,9 @@ import com.duckduckgo.app.global.plugins.view_model.ViewModelFactoryPlugin import com.duckduckgo.app.pixels.AppPixelName 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 com.squareup.anvil.annotations.ContributesMultibinding +import javax.inject.Inject import javax.inject.Provider -import javax.inject.Singleton class DefaultBrowserPageViewModel( private val defaultBrowserDetector: DefaultBrowserDetector, @@ -203,22 +200,8 @@ class DefaultBrowserPageViewModel( } } -@Module -@ContributesTo(AppObjectGraph::class) -class DefaultBrowserPageViewModelFactoryModule { - @Provides - @Singleton - @IntoSet - fun provideDefaultBrowserPageViewModelFactory( - defaultBrowserDetector: Provider, - pixel: Provider, - installStore: Provider - ): ViewModelFactoryPlugin { - return DefaultBrowserPageViewModelFactory(defaultBrowserDetector, pixel, installStore) - } -} - -private class DefaultBrowserPageViewModelFactory( +@ContributesMultibinding(AppObjectGraph::class) +class DefaultBrowserPageViewModelFactory @Inject constructor( private val defaultBrowserDetector: Provider, private val pixel: Provider, private val installStore: Provider 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 ec905e1ede6f..c569e3511d11 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 @@ -25,6 +25,7 @@ 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.pixels.AppPixelName.* import com.duckduckgo.app.privacy.db.NetworkLeaderboardDao import com.duckduckgo.app.privacy.db.NetworkLeaderboardEntry import com.duckduckgo.app.privacy.db.UserWhitelistDao @@ -35,17 +36,13 @@ import com.duckduckgo.app.privacy.model.PrivacyPractices.Summary.UNKNOWN import com.duckduckgo.app.privacy.ui.PrivacyDashboardViewModel.Command.LaunchManageWhitelist import com.duckduckgo.app.privacy.ui.PrivacyDashboardViewModel.Command.LaunchReportBrokenSite import com.duckduckgo.app.statistics.pixels.Pixel -import com.duckduckgo.app.pixels.AppPixelName.* import com.duckduckgo.di.scopes.AppObjectGraph -import com.squareup.anvil.annotations.ContributesTo -import dagger.Module -import dagger.Provides -import dagger.multibindings.IntoSet +import com.squareup.anvil.annotations.ContributesMultibinding import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch import kotlinx.coroutines.withContext +import javax.inject.Inject import javax.inject.Provider -import javax.inject.Singleton class PrivacyDashboardViewModel( private val userWhitelistDao: UserWhitelistDao, @@ -206,22 +203,8 @@ class PrivacyDashboardViewModel( } } -@Module -@ContributesTo(AppObjectGraph::class) -class PrivacyDashboardViewModelFactoryModule { - @Provides - @Singleton - @IntoSet - fun providePrivacyDashboardViewModelFactory( - userWhitelistDao: Provider, - networkLeaderboardDao: Provider, - pixel: Provider - ): ViewModelFactoryPlugin { - return PrivacyDashboardViewModelFactory(userWhitelistDao, networkLeaderboardDao, pixel) - } -} - -private class PrivacyDashboardViewModelFactory( +@ContributesMultibinding(AppObjectGraph::class) +class PrivacyDashboardViewModelFactory @Inject constructor( private val userWhitelistDao: Provider, private val networkLeaderboardDao: Provider, private val pixel: Provider 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 0250be853158..760cfbb8c48f 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 @@ -24,11 +24,8 @@ 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 +import com.squareup.anvil.annotations.ContributesMultibinding +import javax.inject.Inject class PrivacyPracticesViewModel : ViewModel() { @@ -68,18 +65,8 @@ class PrivacyPracticesViewModel : ViewModel() { } } -@Module -@ContributesTo(AppObjectGraph::class) -class PrivacyPracticesViewModelFactoryModule { - @Provides - @Singleton - @IntoSet - fun providePrivacyPracticesViewModelFactory(): ViewModelFactoryPlugin { - return PrivacyPracticesViewModelFactory() - } -} - -private class PrivacyPracticesViewModelFactory : ViewModelFactoryPlugin { +@ContributesMultibinding(AppObjectGraph::class) +class PrivacyPracticesViewModelFactory @Inject constructor() : ViewModelFactoryPlugin { override fun create(modelClass: Class): T? { with(modelClass) { return when { 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 bf13b6529e4b..4847ffabe79c 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 @@ -30,14 +30,11 @@ 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 com.squareup.anvil.annotations.ContributesMultibinding import kotlinx.coroutines.launch import kotlinx.coroutines.withContext +import javax.inject.Inject import javax.inject.Provider -import javax.inject.Singleton class ScorecardViewModel( private val userWhitelistDao: UserWhitelistDao, @@ -116,18 +113,8 @@ class ScorecardViewModel( } } -@Module -@ContributesTo(AppObjectGraph::class) -class ScorecardViewModelFactoryModule { - @Provides - @Singleton - @IntoSet - fun provideScorecardViewModelFactory(userWhitelistDao: Provider): ViewModelFactoryPlugin { - return ScorecardViewModelFactory(userWhitelistDao) - } -} - -private class ScorecardViewModelFactory( +@ContributesMultibinding(AppObjectGraph::class) +class ScorecardViewModelFactory @Inject constructor( private val userWhitelistDao: Provider, ) : ViewModelFactoryPlugin { override fun create(modelClass: Class): T? { 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 3ed429cca44d..06dd13d7c05b 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 @@ -27,12 +27,10 @@ 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 com.squareup.anvil.annotations.ContributesMultibinding import dagger.Module -import dagger.Provides -import dagger.multibindings.IntoSet import java.util.* -import javax.inject.Singleton +import javax.inject.Inject class TrackerNetworksViewModel : ViewModel() { @@ -93,18 +91,8 @@ class TrackerNetworksViewModel : ViewModel() { } } -@Module -@ContributesTo(AppObjectGraph::class) -class TrackerNetworksViewModelFactoryModule { - @Provides - @Singleton - @IntoSet - fun provideTrackerNetworksViewModelFactory(): ViewModelFactoryPlugin { - return TrackerNetworksViewModelFactory() - } -} - -private class TrackerNetworksViewModelFactory : ViewModelFactoryPlugin { +@Module@ContributesMultibinding(AppObjectGraph::class) +class TrackerNetworksViewModelFactory @Inject constructor() : ViewModelFactoryPlugin { override fun create(modelClass: Class): T? { with(modelClass) { return when { 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 c6b2c70d9a05..4fa3e07c5db7 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 @@ -29,15 +29,12 @@ 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 com.squareup.anvil.annotations.ContributesMultibinding import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch import kotlinx.coroutines.withContext +import javax.inject.Inject import javax.inject.Provider -import javax.inject.Singleton class WhitelistViewModel( private val dao: UserWhitelistDao, @@ -127,20 +124,8 @@ class WhitelistViewModel( } } -@Module -@ContributesTo(AppObjectGraph::class) -class WhitelistViewModelFactoryModule { - @Provides - @Singleton - @IntoSet - fun provideWhitelistViewModelFactory( - dao: Provider - ): ViewModelFactoryPlugin { - return WhitelistViewModelFactory(dao) - } -} - -private class WhitelistViewModelFactory( +@ContributesMultibinding(AppObjectGraph::class) +class WhitelistViewModelFactory @Inject constructor( private val dao: Provider ) : ViewModelFactoryPlugin { override fun create(modelClass: Class): T? { 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 a557afbdb88d..b5d901ceb825 100644 --- a/app/src/main/java/com/duckduckgo/app/settings/SettingsViewModel.kt +++ b/app/src/main/java/com/duckduckgo/app/settings/SettingsViewModel.kt @@ -25,6 +25,7 @@ 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.pixels.AppPixelName.* import com.duckduckgo.app.settings.clear.ClearWhatOption import com.duckduckgo.app.settings.clear.ClearWhenOption import com.duckduckgo.app.settings.clear.FireAnimation @@ -33,17 +34,12 @@ import com.duckduckgo.app.settings.db.SettingsDataStore import com.duckduckgo.app.statistics.VariantManager import com.duckduckgo.app.statistics.pixels.Pixel import com.duckduckgo.app.statistics.pixels.Pixel.PixelName -import com.duckduckgo.app.pixels.AppPixelName.* 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 com.squareup.anvil.annotations.ContributesMultibinding import timber.log.Timber import javax.inject.Inject import javax.inject.Provider -import javax.inject.Singleton class SettingsViewModel @Inject constructor( private val settingsDataStore: SettingsDataStore, @@ -245,24 +241,8 @@ class SettingsViewModel @Inject constructor( } } -@Module -@ContributesTo(AppObjectGraph::class) -class SettingsViewModelFactoryModule { - @Provides - @Singleton - @IntoSet - fun provideSettingsViewModelFactory( - settingsDataStore: Provider, - defaultWebBrowserCapability: Provider, - variantManager: Provider, - fireAnimationLoader: Provider, - pixel: Provider - ): ViewModelFactoryPlugin { - return SettingsViewModelFactory(settingsDataStore, defaultWebBrowserCapability, variantManager, fireAnimationLoader, pixel) - } -} - -private class SettingsViewModelFactory( +@ContributesMultibinding(AppObjectGraph::class) +class SettingsViewModelFactory @Inject constructor( private val settingsDataStore: Provider, private val defaultWebBrowserCapability: Provider, private val variantManager: Provider, 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 6898b4196c08..cdd8c5008a19 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 @@ -31,15 +31,12 @@ 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 com.squareup.anvil.annotations.ContributesMultibinding import kotlinx.coroutines.NonCancellable import kotlinx.coroutines.launch import kotlinx.coroutines.withContext +import javax.inject.Inject import javax.inject.Provider -import javax.inject.Singleton class SurveyViewModel( private val surveyDao: SurveyDao, @@ -117,22 +114,8 @@ class SurveyViewModel( } } -@Module -@ContributesTo(AppObjectGraph::class) -class SurveyViewModelFactoryModule { - @Provides - @Singleton - @IntoSet - fun provideSurveyViewModelFactory( - surveyDao: Provider, - statisticsStore: Provider, - appInstallStore: Provider - ): ViewModelFactoryPlugin { - return SurveyViewModelFactory(surveyDao, statisticsStore, appInstallStore) - } -} - -private class SurveyViewModelFactory( +@ContributesMultibinding(AppObjectGraph::class) +class SurveyViewModelFactory @Inject constructor( private val surveyDao: Provider, private val statisticsStore: Provider, private val appInstallStore: Provider 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 b92c644e0a4c..ff587c7871b0 100644 --- a/app/src/main/java/com/duckduckgo/app/systemsearch/SystemSearchViewModel.kt +++ b/app/src/main/java/com/duckduckgo/app/systemsearch/SystemSearchViewModel.kt @@ -29,14 +29,11 @@ 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.pixels.AppPixelName.* +import com.duckduckgo.app.statistics.pixels.Pixel 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 com.squareup.anvil.annotations.ContributesMultibinding import io.reactivex.Observable import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.disposables.Disposable @@ -46,8 +43,8 @@ import kotlinx.coroutines.Job import kotlinx.coroutines.launch import timber.log.Timber import java.util.concurrent.TimeUnit +import javax.inject.Inject import javax.inject.Provider -import javax.inject.Singleton data class SystemSearchResult(val autocomplete: AutoCompleteResult, val deviceApps: List) @@ -260,23 +257,8 @@ class SystemSearchViewModel( } } -@Module -@ContributesTo(AppObjectGraph::class) -class SystemSearchViewModelFactoryModule { - @Provides - @Singleton - @IntoSet - fun provideSystemSearchViewModelFactory( - userStageStore: Provider, - autoCompleteApi: Provider, - deviceAppLookup: Provider, - pixel: Provider - ): ViewModelFactoryPlugin { - return SystemSearchViewModelFactory(userStageStore, autoCompleteApi, deviceAppLookup, pixel) - } -} - -private class SystemSearchViewModelFactory( +@ContributesMultibinding(AppObjectGraph::class) +class SystemSearchViewModelFactory @Inject constructor( private val userStageStore: Provider, private val autoComplete: Provider, private val deviceAppLookup: Provider, 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 1bafa87dad26..c51ea2cd9af7 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 @@ -28,12 +28,9 @@ 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 com.squareup.anvil.annotations.ContributesMultibinding +import javax.inject.Inject import javax.inject.Provider -import javax.inject.Singleton class TabSwitcherViewModel(private val tabRepository: TabRepository, private val webViewSessionStorage: WebViewSessionStorage) : ViewModel() { @@ -81,21 +78,8 @@ class TabSwitcherViewModel(private val tabRepository: TabRepository, private val } } -@Module -@ContributesTo(AppObjectGraph::class) -class TabSwitcherViewModelFactoryModule { - @Provides - @Singleton - @IntoSet - fun provideTabSwitcherViewModelFactory( - tabRepository: Provider, - webViewSessionStorage: Provider - ): ViewModelFactoryPlugin { - return TabSwitcherViewModelFactory(tabRepository, webViewSessionStorage) - } -} - -private class TabSwitcherViewModelFactory( +@ContributesMultibinding(AppObjectGraph::class) +class TabSwitcherViewModelFactory @Inject constructor( private val tabRepository: Provider, private val webViewSessionStorage: Provider ) : ViewModelFactoryPlugin { 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 7554d759a490..606a44a6221d 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 @@ -22,11 +22,8 @@ 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 +import com.squareup.anvil.annotations.ContributesMultibinding +import javax.inject.Inject class AddWidgetInstructionsViewModel : ViewModel() { @@ -46,18 +43,8 @@ class AddWidgetInstructionsViewModel : ViewModel() { } } -@Module -@ContributesTo(AppObjectGraph::class) -class AddWidgetInstructionsViewModelFactoryModule { - @Provides - @Singleton - @IntoSet - fun provideAddWidgetInstructionsViewModelFactory(): ViewModelFactoryPlugin { - return AddWidgetInstructionsViewModelFactory() - } -} - -private class AddWidgetInstructionsViewModelFactory() : ViewModelFactoryPlugin { +@ContributesMultibinding(AppObjectGraph::class) +class AddWidgetInstructionsViewModelFactory @Inject constructor() : ViewModelFactoryPlugin { override fun create(modelClass: Class): T? { with(modelClass) { return when { From 6fc927c5841c6046195b5b746dd85d2f7c441a24 Mon Sep 17 00:00:00 2001 From: Aitor Viana Date: Wed, 24 Mar 2021 21:08:20 +0100 Subject: [PATCH 3/3] Worker factories to contribute multibindings --- .../com/duckduckgo/app/di/AppComponent.kt | 2 - .../duckduckgo/app/fire/DataClearingWorker.kt | 6 +- .../AppConfigurationSyncWorkRequestBuilder.kt | 5 +- .../plugins/worker/WorkerPluginsModule.kt | 91 ------------------- .../AndroidNotificationScheduler.kt | 9 +- statistics/build.gradle | 7 +- .../statistics/api/OfflinePixelScheduler.kt | 6 +- 7 files changed, 23 insertions(+), 103 deletions(-) delete mode 100644 app/src/main/java/com/duckduckgo/app/global/plugins/worker/WorkerPluginsModule.kt diff --git a/app/src/main/java/com/duckduckgo/app/di/AppComponent.kt b/app/src/main/java/com/duckduckgo/app/di/AppComponent.kt index c81814f862aa..99018d70ed1e 100644 --- a/app/src/main/java/com/duckduckgo/app/di/AppComponent.kt +++ b/app/src/main/java/com/duckduckgo/app/di/AppComponent.kt @@ -24,7 +24,6 @@ import com.duckduckgo.app.browser.favicon.FaviconModule import com.duckduckgo.app.browser.rating.di.RatingModule import com.duckduckgo.app.global.DuckDuckGoApplication import com.duckduckgo.app.global.exception.UncaughtExceptionModule -import com.duckduckgo.app.global.plugins.worker.WorkerPluginsModule import com.duckduckgo.app.httpsupgrade.di.HttpsUpgraderModule import com.duckduckgo.app.onboarding.di.OnboardingModule import com.duckduckgo.app.onboarding.di.WelcomePageModule @@ -47,7 +46,6 @@ import javax.inject.Singleton @MergeComponent( scope = AppObjectGraph::class, modules = [ - WorkerPluginsModule::class, ApplicationModule::class, JobsModule::class, WorkerModule::class, diff --git a/app/src/main/java/com/duckduckgo/app/fire/DataClearingWorker.kt b/app/src/main/java/com/duckduckgo/app/fire/DataClearingWorker.kt index e3b3758a167d..abd2a6caa501 100644 --- a/app/src/main/java/com/duckduckgo/app/fire/DataClearingWorker.kt +++ b/app/src/main/java/com/duckduckgo/app/fire/DataClearingWorker.kt @@ -26,10 +26,13 @@ import com.duckduckgo.app.global.plugins.worker.WorkerInjectorPlugin import com.duckduckgo.app.global.view.ClearDataAction import com.duckduckgo.app.settings.clear.ClearWhatOption import com.duckduckgo.app.settings.db.SettingsDataStore +import com.duckduckgo.di.scopes.AppObjectGraph +import com.squareup.anvil.annotations.ContributesMultibinding import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import timber.log.Timber +import javax.inject.Inject class DataClearingWorker(context: Context, workerParams: WorkerParameters) : CoroutineWorker(context, workerParams), CoroutineScope { @@ -90,7 +93,8 @@ class DataClearingWorker(context: Context, workerParams: WorkerParameters) : Cor } } -class DataClearingWorkerInjectorPlugin( +@ContributesMultibinding(AppObjectGraph::class) +class DataClearingWorkerInjectorPlugin @Inject constructor( private val settingsDataStore: SettingsDataStore, private val clearDataAction: ClearDataAction ) : WorkerInjectorPlugin { diff --git a/app/src/main/java/com/duckduckgo/app/global/job/AppConfigurationSyncWorkRequestBuilder.kt b/app/src/main/java/com/duckduckgo/app/global/job/AppConfigurationSyncWorkRequestBuilder.kt index 695239990306..1e2b1232075b 100644 --- a/app/src/main/java/com/duckduckgo/app/global/job/AppConfigurationSyncWorkRequestBuilder.kt +++ b/app/src/main/java/com/duckduckgo/app/global/job/AppConfigurationSyncWorkRequestBuilder.kt @@ -20,6 +20,8 @@ import android.content.Context import androidx.work.* import com.duckduckgo.app.global.plugins.worker.WorkerInjectorPlugin import com.duckduckgo.app.job.ConfigurationDownloader +import com.duckduckgo.di.scopes.AppObjectGraph +import com.squareup.anvil.annotations.ContributesMultibinding import io.reactivex.Single import timber.log.Timber import java.util.concurrent.TimeUnit @@ -61,7 +63,8 @@ class AppConfigurationWorker(context: Context, workerParams: WorkerParameters) : } } -class AppConfigurationWorkerInjectorPlugin( +@ContributesMultibinding(AppObjectGraph::class) +class AppConfigurationWorkerInjectorPlugin @Inject constructor( private val configurationDownloader: ConfigurationDownloader ) : WorkerInjectorPlugin { diff --git a/app/src/main/java/com/duckduckgo/app/global/plugins/worker/WorkerPluginsModule.kt b/app/src/main/java/com/duckduckgo/app/global/plugins/worker/WorkerPluginsModule.kt deleted file mode 100644 index 437b404c3857..000000000000 --- a/app/src/main/java/com/duckduckgo/app/global/plugins/worker/WorkerPluginsModule.kt +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright (c) 2020 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.worker - -import androidx.core.app.NotificationManagerCompat -import com.duckduckgo.app.fire.DataClearingWorkerInjectorPlugin -import com.duckduckgo.app.global.job.AppConfigurationWorkerInjectorPlugin -import com.duckduckgo.app.global.view.ClearDataAction -import com.duckduckgo.app.job.ConfigurationDownloader -import com.duckduckgo.app.notification.ClearDataNotificationWorkerInjectorPlugin -import com.duckduckgo.app.notification.NotificationFactory -import com.duckduckgo.app.notification.PrivacyNotificationWorkerInjectorPlugin -import com.duckduckgo.app.notification.db.NotificationDao -import com.duckduckgo.app.notification.model.ClearDataNotification -import com.duckduckgo.app.notification.model.PrivacyProtectionNotification -import com.duckduckgo.app.settings.db.SettingsDataStore -import com.duckduckgo.app.statistics.api.OfflinePixelSender -import com.duckduckgo.app.statistics.api.OfflinePixelWorkerInjectorPlugin -import com.duckduckgo.app.statistics.pixels.Pixel -import dagger.Module -import dagger.Provides -import dagger.multibindings.IntoSet - -@Module -class WorkerPluginsModule { - - @Provides - @IntoSet - fun dataClearingWorkerInjectorPlugin( - settingsDataStore: SettingsDataStore, - clearDataAction: ClearDataAction - ): WorkerInjectorPlugin = DataClearingWorkerInjectorPlugin(settingsDataStore, clearDataAction) - - @Provides - @IntoSet - fun clearDataNotificationWorkerInjectorPlugin( - notificationManagerCompat: NotificationManagerCompat, - notificationDao: NotificationDao, - notificationFactory: NotificationFactory, - pixel: Pixel, - clearDataNotification: ClearDataNotification - ): WorkerInjectorPlugin = ClearDataNotificationWorkerInjectorPlugin( - notificationManagerCompat, - notificationDao, - notificationFactory, - pixel, - clearDataNotification - ) - - @Provides - @IntoSet - fun privacyNotificationWorkerInjectorPlugin( - notificationManagerCompat: NotificationManagerCompat, - notificationDao: NotificationDao, - notificationFactory: NotificationFactory, - pixel: Pixel, - privacyProtectionNotification: PrivacyProtectionNotification - ): WorkerInjectorPlugin = PrivacyNotificationWorkerInjectorPlugin( - notificationManagerCompat, - notificationDao, - notificationFactory, - pixel, - privacyProtectionNotification - ) - - @Provides - @IntoSet - fun appConfigurationWorkerInjectorPlugin( - configurationDownloader: ConfigurationDownloader - ): WorkerInjectorPlugin = AppConfigurationWorkerInjectorPlugin(configurationDownloader) - - @Provides - @IntoSet - fun offlinePixelWorkerInjectorPlugin( - offlinePixelSender: OfflinePixelSender - ): WorkerInjectorPlugin = OfflinePixelWorkerInjectorPlugin(offlinePixelSender) -} diff --git a/app/src/main/java/com/duckduckgo/app/notification/AndroidNotificationScheduler.kt b/app/src/main/java/com/duckduckgo/app/notification/AndroidNotificationScheduler.kt index 23caa023f003..528355a4ba5e 100644 --- a/app/src/main/java/com/duckduckgo/app/notification/AndroidNotificationScheduler.kt +++ b/app/src/main/java/com/duckduckgo/app/notification/AndroidNotificationScheduler.kt @@ -28,8 +28,11 @@ import com.duckduckgo.app.notification.model.PrivacyProtectionNotification import com.duckduckgo.app.notification.model.SchedulableNotification import com.duckduckgo.app.statistics.pixels.Pixel import com.duckduckgo.app.pixels.AppPixelName.NOTIFICATION_SHOWN +import com.duckduckgo.di.scopes.AppObjectGraph +import com.squareup.anvil.annotations.ContributesMultibinding import timber.log.Timber import java.util.concurrent.TimeUnit +import javax.inject.Inject // Please don't rename any Worker class name or class path // More information: https://craigrussell.io/2019/04/a-workmanager-pitfall-modifying-a-scheduled-worker/ @@ -111,7 +114,8 @@ class NotificationScheduler( } } -class ClearDataNotificationWorkerInjectorPlugin( +@ContributesMultibinding(AppObjectGraph::class) +class ClearDataNotificationWorkerInjectorPlugin @Inject constructor( private val notificationManagerCompat: NotificationManagerCompat, private val notificationDao: NotificationDao, private val notificationFactory: NotificationFactory, @@ -132,7 +136,8 @@ class ClearDataNotificationWorkerInjectorPlugin( } } -class PrivacyNotificationWorkerInjectorPlugin( +@ContributesMultibinding(AppObjectGraph::class) +class PrivacyNotificationWorkerInjectorPlugin @Inject constructor( private val notificationManagerCompat: NotificationManagerCompat, private val notificationDao: NotificationDao, private val notificationFactory: NotificationFactory, diff --git a/statistics/build.gradle b/statistics/build.gradle index 4495d9ccbad2..1ca8b3d0be98 100644 --- a/statistics/build.gradle +++ b/statistics/build.gradle @@ -17,13 +17,14 @@ plugins { id 'com.android.library' id 'kotlin-android' - id 'kotlin-kapt' + id 'com.squareup.anvil' } apply from: "$rootProject.projectDir/gradle/android-library.gradle" dependencies { implementation project(path: ':common') + implementation project(path: ':di') implementation Kotlin.stdlib.jdk7 implementation KotlinX.coroutines.core @@ -41,10 +42,6 @@ dependencies { // Room implementation AndroidX.room.runtime - implementation AndroidX.room.rxJava2 - kapt AndroidX.room.compiler - testImplementation AndroidX.room.testing - androidTestImplementation AndroidX.room.testing // WorkManager implementation AndroidX.work.runtimeKtx diff --git a/statistics/src/main/java/com/duckduckgo/app/statistics/api/OfflinePixelScheduler.kt b/statistics/src/main/java/com/duckduckgo/app/statistics/api/OfflinePixelScheduler.kt index 9c6494fdb516..285abbe5dfaa 100644 --- a/statistics/src/main/java/com/duckduckgo/app/statistics/api/OfflinePixelScheduler.kt +++ b/statistics/src/main/java/com/duckduckgo/app/statistics/api/OfflinePixelScheduler.kt @@ -19,6 +19,9 @@ package com.duckduckgo.app.statistics.api import android.content.Context import androidx.work.* import com.duckduckgo.app.global.plugins.worker.WorkerInjectorPlugin +import com.duckduckgo.di.scopes.AppObjectGraph +import com.squareup.anvil.annotations.ContributesMultibinding +import dagger.multibindings.IntoSet import timber.log.Timber import java.util.concurrent.TimeUnit import javax.inject.Inject @@ -68,7 +71,8 @@ class OfflinePixelScheduler @Inject constructor(private val workManager: WorkMan } } -class OfflinePixelWorkerInjectorPlugin( +@ContributesMultibinding(AppObjectGraph::class) +class OfflinePixelWorkerInjectorPlugin @Inject constructor( private val offlinePixelSender: OfflinePixelSender ) : WorkerInjectorPlugin {