Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,16 @@ 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

class BookmarksViewModel(
val dao: BookmarksDao,
Expand Down Expand Up @@ -112,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 <T : ViewModel?> create(modelClass: Class<T>): T? {
with(modelClass) {
return when {
isAssignableFrom(BookmarksViewModel::class.java) -> (BookmarksViewModel(dao, faviconManager, dispatcherProvider) as T)
else -> null
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,14 @@ 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

class BrokenSiteViewModel(private val pixel: Pixel, private val brokenSiteSender: BrokenSiteSender) : ViewModel() {

Expand Down Expand Up @@ -118,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 <T : ViewModel?> create(modelClass: Class<T>): T? {
with(modelClass) {
return when {
isAssignableFrom(BrokenSiteViewModel::class.java) -> (BrokenSiteViewModel(pixel, brokenSiteSender) as T)
else -> null
}
}
}
}
124 changes: 124 additions & 0 deletions app/src/main/java/com/duckduckgo/app/browser/BrowserTabViewModel.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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.*
Expand All @@ -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
Expand Down Expand Up @@ -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
Expand All @@ -109,6 +117,7 @@ import timber.log.Timber
import java.io.File
import java.util.*
import java.util.concurrent.TimeUnit
import javax.inject.Singleton

class BrowserTabViewModel(
private val statisticsUpdater: StatisticsUpdater,
Expand Down Expand Up @@ -1832,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 <T : ViewModel?> create(modelClass: Class<T>): 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
}
}
}
}
48 changes: 48 additions & 0 deletions app/src/main/java/com/duckduckgo/app/browser/BrowserViewModel.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -41,10 +43,16 @@ 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

class BrowserViewModel(
Expand Down Expand Up @@ -231,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 <T : ViewModel?> create(modelClass: Class<T>): T? {
with(modelClass) {
return when {
isAssignableFrom(BrowserViewModel::class.java) -> BrowserViewModel(tabRepository, queryUrlConverter, dataClearer, appEnjoymentPromptEmitter, appEnjoymentUserEventRecorder, dispatchers, pixel, useOurAppDetector) as T
else -> null
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,12 +25,19 @@ 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

class FeedbackViewModel(private val playStoreUtils: PlayStoreUtils, private val feedbackSubmitter: FeedbackSubmitter) : ViewModel() {

Expand Down Expand Up @@ -282,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 <T : ViewModel?> create(modelClass: Class<T>): T? {
with(modelClass) {
return when {
isAssignableFrom(FeedbackViewModel::class.java) -> (FeedbackViewModel(playStoreUtils, feedbackSubmitter) as T)
else -> null
}
}
}
}
Loading