diff options
Diffstat (limited to 'src/com/android/customization/module')
4 files changed, 509 insertions, 44 deletions
diff --git a/src/com/android/customization/module/CustomizationInjector.kt b/src/com/android/customization/module/CustomizationInjector.kt index 3cf8393f..306ef04c 100644 --- a/src/com/android/customization/module/CustomizationInjector.kt +++ b/src/com/android/customization/module/CustomizationInjector.kt @@ -15,12 +15,22 @@ */ package com.android.customization.module +import android.app.Activity import android.content.Context import androidx.fragment.app.FragmentActivity import com.android.customization.model.theme.OverlayManagerCompat import com.android.customization.model.theme.ThemeBundleProvider import com.android.customization.model.theme.ThemeManager +import com.android.customization.picker.clock.domain.interactor.ClockPickerInteractor +import com.android.customization.picker.clock.ui.view.ClockViewFactory +import com.android.customization.picker.clock.ui.viewmodel.ClockCarouselViewModel +import com.android.customization.picker.clock.ui.viewmodel.ClockSectionViewModel +import com.android.customization.picker.clock.ui.viewmodel.ClockSettingsViewModel +import com.android.customization.picker.color.domain.interactor.ColorPickerInteractor +import com.android.customization.picker.color.ui.viewmodel.ColorPickerViewModel import com.android.customization.picker.quickaffordance.domain.interactor.KeyguardQuickAffordancePickerInteractor +import com.android.systemui.shared.clocks.ClockRegistry +import com.android.wallpaper.model.WallpaperColorsViewModel import com.android.wallpaper.module.Injector interface CustomizationInjector : Injector { @@ -30,10 +40,35 @@ interface CustomizationInjector : Injector { provider: ThemeBundleProvider, activity: FragmentActivity, overlayManagerCompat: OverlayManagerCompat, - logger: ThemesUserEventLogger + logger: ThemesUserEventLogger, ): ThemeManager fun getKeyguardQuickAffordancePickerInteractor( - context: Context + context: Context, ): KeyguardQuickAffordancePickerInteractor + + fun getClockRegistry(context: Context): ClockRegistry + + fun getClockPickerInteractor(context: Context): ClockPickerInteractor + + fun getClockSectionViewModel(context: Context): ClockSectionViewModel + + fun getColorPickerInteractor( + context: Context, + wallpaperColorsViewModel: WallpaperColorsViewModel, + ): ColorPickerInteractor + + fun getColorPickerViewModelFactory( + context: Context, + wallpaperColorsViewModel: WallpaperColorsViewModel, + ): ColorPickerViewModel.Factory + + fun getClockCarouselViewModel(context: Context): ClockCarouselViewModel + + fun getClockViewFactory(activity: Activity): ClockViewFactory + + fun getClockSettingsViewModelFactory( + context: Context, + wallpaperColorsViewModel: WallpaperColorsViewModel, + ): ClockSettingsViewModel.Factory } diff --git a/src/com/android/customization/module/DefaultCustomizationSections.java b/src/com/android/customization/module/DefaultCustomizationSections.java index c47a6e63..232e9482 100644 --- a/src/com/android/customization/module/DefaultCustomizationSections.java +++ b/src/com/android/customization/module/DefaultCustomizationSections.java @@ -11,21 +11,36 @@ import com.android.customization.model.color.ColorSectionController; import com.android.customization.model.grid.GridOptionsManager; import com.android.customization.model.grid.GridSectionController; import com.android.customization.model.mode.DarkModeSectionController; +import com.android.customization.model.mode.DarkModeSnapshotRestorer; import com.android.customization.model.themedicon.ThemedIconSectionController; import com.android.customization.model.themedicon.ThemedIconSwitchProvider; +import com.android.customization.model.themedicon.domain.interactor.ThemedIconInteractor; +import com.android.customization.model.themedicon.domain.interactor.ThemedIconSnapshotRestorer; +import com.android.customization.picker.clock.ui.view.ClockViewFactory; +import com.android.customization.picker.clock.ui.viewmodel.ClockCarouselViewModel; +import com.android.customization.picker.color.ui.section.ColorSectionController2; +import com.android.customization.picker.color.ui.viewmodel.ColorPickerViewModel; +import com.android.customization.picker.notifications.ui.section.NotificationSectionController; +import com.android.customization.picker.notifications.ui.viewmodel.NotificationSectionViewModel; +import com.android.customization.picker.preview.ui.section.PreviewWithClockCarouselSectionController; import com.android.customization.picker.quickaffordance.domain.interactor.KeyguardQuickAffordancePickerInteractor; import com.android.customization.picker.quickaffordance.ui.section.KeyguardQuickAffordanceSectionController; import com.android.customization.picker.quickaffordance.ui.viewmodel.KeyguardQuickAffordancePickerViewModel; +import com.android.customization.picker.settings.ui.section.MoreSettingsSectionController; +import com.android.wallpaper.config.BaseFlags; import com.android.wallpaper.model.CustomizationSectionController; import com.android.wallpaper.model.CustomizationSectionController.CustomizationSectionNavigationController; import com.android.wallpaper.model.PermissionRequester; import com.android.wallpaper.model.WallpaperColorsViewModel; import com.android.wallpaper.model.WallpaperPreviewNavigator; import com.android.wallpaper.model.WallpaperSectionController; -import com.android.wallpaper.model.WorkspaceViewModel; import com.android.wallpaper.module.CurrentWallpaperInfoFactory; import com.android.wallpaper.module.CustomizationSections; +import com.android.wallpaper.picker.customization.domain.interactor.WallpaperInteractor; +import com.android.wallpaper.picker.customization.ui.section.ConnectedSectionController; import com.android.wallpaper.picker.customization.ui.section.ScreenPreviewSectionController; +import com.android.wallpaper.picker.customization.ui.section.WallpaperQuickSwitchSectionController; +import com.android.wallpaper.picker.customization.ui.viewmodel.WallpaperQuickSwitchViewModel; import com.android.wallpaper.util.DisplayUtils; import java.util.ArrayList; @@ -34,47 +49,100 @@ import java.util.List; /** {@link CustomizationSections} for the customization picker. */ public final class DefaultCustomizationSections implements CustomizationSections { + private final ColorPickerViewModel.Factory mColorPickerViewModelFactory; private final KeyguardQuickAffordancePickerInteractor mKeyguardQuickAffordancePickerInteractor; private final KeyguardQuickAffordancePickerViewModel.Factory mKeyguardQuickAffordancePickerViewModelFactory; + private final NotificationSectionViewModel.Factory mNotificationSectionViewModelFactory; + private final BaseFlags mFlags; + private final ClockCarouselViewModel mClockCarouselViewModel; + private final ClockViewFactory mClockViewFactory; + private final DarkModeSnapshotRestorer mDarkModeSnapshotRestorer; + private final ThemedIconSnapshotRestorer mThemedIconSnapshotRestorer; + private final ThemedIconInteractor mThemedIconInteractor; public DefaultCustomizationSections( + ColorPickerViewModel.Factory colorPickerViewModelFactory, KeyguardQuickAffordancePickerInteractor keyguardQuickAffordancePickerInteractor, KeyguardQuickAffordancePickerViewModel.Factory - keyguardQuickAffordancePickerViewModelFactory) { + keyguardQuickAffordancePickerViewModelFactory, + NotificationSectionViewModel.Factory notificationSectionViewModelFactory, + BaseFlags flags, + ClockCarouselViewModel clockCarouselViewModel, + ClockViewFactory clockViewFactory, + DarkModeSnapshotRestorer darkModeSnapshotRestorer, + ThemedIconSnapshotRestorer themedIconSnapshotRestorer, + ThemedIconInteractor themedIconInteractor) { + mColorPickerViewModelFactory = colorPickerViewModelFactory; mKeyguardQuickAffordancePickerInteractor = keyguardQuickAffordancePickerInteractor; mKeyguardQuickAffordancePickerViewModelFactory = keyguardQuickAffordancePickerViewModelFactory; + mNotificationSectionViewModelFactory = notificationSectionViewModelFactory; + mFlags = flags; + mClockCarouselViewModel = clockCarouselViewModel; + mClockViewFactory = clockViewFactory; + mDarkModeSnapshotRestorer = darkModeSnapshotRestorer; + mThemedIconSnapshotRestorer = themedIconSnapshotRestorer; + mThemedIconInteractor = themedIconInteractor; } @Override - public List<CustomizationSectionController<?>> getSectionControllersForScreen( + public List<CustomizationSectionController<?>> getRevampedUISectionControllersForScreen( Screen screen, FragmentActivity activity, LifecycleOwner lifecycleOwner, WallpaperColorsViewModel wallpaperColorsViewModel, - WorkspaceViewModel workspaceViewModel, PermissionRequester permissionRequester, WallpaperPreviewNavigator wallpaperPreviewNavigator, CustomizationSectionNavigationController sectionNavigationController, @Nullable Bundle savedInstanceState, CurrentWallpaperInfoFactory wallpaperInfoFactory, - DisplayUtils displayUtils) { + DisplayUtils displayUtils, + WallpaperQuickSwitchViewModel wallpaperQuickSwitchViewModel, + WallpaperInteractor wallpaperInteractor) { List<CustomizationSectionController<?>> sectionControllers = new ArrayList<>(); // Wallpaper section. sectionControllers.add( - new ScreenPreviewSectionController( + mFlags.isCustomClocksEnabled(activity) + ? new PreviewWithClockCarouselSectionController( activity, lifecycleOwner, screen, wallpaperInfoFactory, wallpaperColorsViewModel, - displayUtils)); + displayUtils, + mClockCarouselViewModel, + mClockViewFactory, + sectionNavigationController, + wallpaperInteractor) + : new ScreenPreviewSectionController( + activity, + lifecycleOwner, + screen, + wallpaperInfoFactory, + wallpaperColorsViewModel, + displayUtils, + sectionNavigationController, + wallpaperInteractor)); - // Theme color section. - sectionControllers.add(new ColorSectionController( - activity, wallpaperColorsViewModel, lifecycleOwner, savedInstanceState)); + sectionControllers.add( + new ConnectedSectionController( + // Theme color section. + new ColorSectionController2( + sectionNavigationController, + new ViewModelProvider( + activity, + mColorPickerViewModelFactory) + .get(ColorPickerViewModel.class), + lifecycleOwner), + // Wallpaper quick switch section. + new WallpaperQuickSwitchSectionController( + screen, + wallpaperQuickSwitchViewModel, + lifecycleOwner, + sectionNavigationController), + /* reverseOrderWhenHorizontal= */ true)); switch (screen) { case LOCK_SCREEN: @@ -88,21 +156,36 @@ public final class DefaultCustomizationSections implements CustomizationSections mKeyguardQuickAffordancePickerViewModelFactory) .get(KeyguardQuickAffordancePickerViewModel.class), lifecycleOwner)); + + // Notifications section. + sectionControllers.add( + new NotificationSectionController( + new ViewModelProvider( + activity, + mNotificationSectionViewModelFactory) + .get(NotificationSectionViewModel.class), + lifecycleOwner)); + + // More settings section. + sectionControllers.add(new MoreSettingsSectionController()); break; case HOME_SCREEN: - // Dark/Light theme section. - sectionControllers.add(new DarkModeSectionController(activity, - lifecycleOwner.getLifecycle())); - // Themed app icon section. - sectionControllers.add(new ThemedIconSectionController( - ThemedIconSwitchProvider.getInstance(activity), workspaceViewModel, - savedInstanceState)); + sectionControllers.add( + new ThemedIconSectionController( + ThemedIconSwitchProvider.getInstance(activity), + mThemedIconInteractor, + savedInstanceState, + mThemedIconSnapshotRestorer)); // App grid section. - sectionControllers.add(new GridSectionController( - GridOptionsManager.getInstance(activity), sectionNavigationController)); + sectionControllers.add( + new GridSectionController( + GridOptionsManager.getInstance(activity), + sectionNavigationController, + lifecycleOwner, + /* isRevampedUiEnabled= */ true)); break; } @@ -114,7 +197,6 @@ public final class DefaultCustomizationSections implements CustomizationSections FragmentActivity activity, LifecycleOwner lifecycleOwner, WallpaperColorsViewModel wallpaperColorsViewModel, - WorkspaceViewModel workspaceViewModel, PermissionRequester permissionRequester, WallpaperPreviewNavigator wallpaperPreviewNavigator, CustomizationSectionNavigationController sectionNavigationController, @@ -123,27 +205,42 @@ public final class DefaultCustomizationSections implements CustomizationSections List<CustomizationSectionController<?>> sectionControllers = new ArrayList<>(); // Wallpaper section. - sectionControllers.add(new WallpaperSectionController( - activity, lifecycleOwner, permissionRequester, wallpaperColorsViewModel, - workspaceViewModel, sectionNavigationController, wallpaperPreviewNavigator, - savedInstanceState, displayUtils)); + sectionControllers.add( + new WallpaperSectionController( + activity, + lifecycleOwner, + permissionRequester, + wallpaperColorsViewModel, + mThemedIconInteractor.isActivatedAsLiveData(), + sectionNavigationController, + wallpaperPreviewNavigator, + savedInstanceState, + displayUtils)); // Theme color section. sectionControllers.add(new ColorSectionController( activity, wallpaperColorsViewModel, lifecycleOwner, savedInstanceState)); // Dark/Light theme section. - sectionControllers.add(new DarkModeSectionController(activity, - lifecycleOwner.getLifecycle())); + sectionControllers.add(new DarkModeSectionController( + activity, + lifecycleOwner.getLifecycle(), + mDarkModeSnapshotRestorer)); // Themed app icon section. sectionControllers.add(new ThemedIconSectionController( - ThemedIconSwitchProvider.getInstance(activity), workspaceViewModel, - savedInstanceState)); + ThemedIconSwitchProvider.getInstance(activity), + mThemedIconInteractor, + savedInstanceState, + mThemedIconSnapshotRestorer)); // App grid section. - sectionControllers.add(new GridSectionController( - GridOptionsManager.getInstance(activity), sectionNavigationController)); + sectionControllers.add( + new GridSectionController( + GridOptionsManager.getInstance(activity), + sectionNavigationController, + lifecycleOwner, + /* isRevampedUiEnabled= */ false)); return sectionControllers; } diff --git a/src/com/android/customization/module/StatsLogUserEventLogger.java b/src/com/android/customization/module/StatsLogUserEventLogger.java index 2b6767b0..96454548 100644 --- a/src/com/android/customization/module/StatsLogUserEventLogger.java +++ b/src/com/android/customization/module/StatsLogUserEventLogger.java @@ -144,7 +144,7 @@ public class StatsLogUserEventLogger extends NoOpUserEventLogger implements Them final boolean isLockWallpaperSet = mWallpaperStatusChecker.isLockWallpaperSet(mContext); final String homeCollectionId = mPreferences.getHomeWallpaperCollectionId(); final String homeRemoteId = mPreferences.getHomeWallpaperRemoteId(); - final String effects = mPreferences.getWallpaperEffects(); + final String effects = mPreferences.getHomeWallpaperEffects(); String homeWallpaperId = TextUtils.isEmpty(homeRemoteId) ? mPreferences.getHomeWallpaperServiceName() : homeRemoteId; String lockCollectionId = isLockWallpaperSet ? mPreferences.getLockWallpaperCollectionId() diff --git a/src/com/android/customization/module/ThemePickerInjector.kt b/src/com/android/customization/module/ThemePickerInjector.kt index b3f95d5c..eb20037b 100644 --- a/src/com/android/customization/module/ThemePickerInjector.kt +++ b/src/com/android/customization/module/ThemePickerInjector.kt @@ -16,22 +16,55 @@ package com.android.customization.module import android.app.Activity +import android.app.UiModeManager import android.content.Context import android.content.Intent import android.net.Uri import android.os.Bundle +import android.text.TextUtils +import androidx.activity.ComponentActivity import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentActivity +import androidx.lifecycle.ViewModelProvider +import com.android.customization.model.color.ColorCustomizationManager +import com.android.customization.model.color.ColorOptionsProvider +import com.android.customization.model.grid.GridOptionsManager +import com.android.customization.model.grid.data.repository.GridRepositoryImpl +import com.android.customization.model.grid.domain.interactor.GridInteractor +import com.android.customization.model.grid.domain.interactor.GridSnapshotRestorer +import com.android.customization.model.grid.ui.viewmodel.GridScreenViewModel +import com.android.customization.model.mode.DarkModeSnapshotRestorer import com.android.customization.model.theme.OverlayManagerCompat import com.android.customization.model.theme.ThemeBundleProvider import com.android.customization.model.theme.ThemeManager +import com.android.customization.model.themedicon.ThemedIconSwitchProvider +import com.android.customization.model.themedicon.data.repository.ThemeIconRepository +import com.android.customization.model.themedicon.domain.interactor.ThemedIconInteractor +import com.android.customization.model.themedicon.domain.interactor.ThemedIconSnapshotRestorer +import com.android.customization.picker.clock.data.repository.ClockPickerRepositoryImpl +import com.android.customization.picker.clock.data.repository.ClockRegistryProvider +import com.android.customization.picker.clock.domain.interactor.ClockPickerInteractor +import com.android.customization.picker.clock.ui.view.ClockViewFactory +import com.android.customization.picker.clock.ui.viewmodel.ClockCarouselViewModel +import com.android.customization.picker.clock.ui.viewmodel.ClockSectionViewModel +import com.android.customization.picker.clock.ui.viewmodel.ClockSettingsViewModel +import com.android.customization.picker.color.data.repository.ColorPickerRepositoryImpl +import com.android.customization.picker.color.domain.interactor.ColorPickerInteractor +import com.android.customization.picker.color.domain.interactor.ColorPickerSnapshotRestorer +import com.android.customization.picker.color.ui.viewmodel.ColorPickerViewModel +import com.android.customization.picker.notifications.data.repository.NotificationsRepository +import com.android.customization.picker.notifications.domain.interactor.NotificationsInteractor +import com.android.customization.picker.notifications.domain.interactor.NotificationsSnapshotRestorer +import com.android.customization.picker.notifications.ui.viewmodel.NotificationSectionViewModel import com.android.customization.picker.quickaffordance.data.repository.KeyguardQuickAffordancePickerRepository import com.android.customization.picker.quickaffordance.domain.interactor.KeyguardQuickAffordancePickerInteractor import com.android.customization.picker.quickaffordance.domain.interactor.KeyguardQuickAffordanceSnapshotRestorer import com.android.customization.picker.quickaffordance.ui.viewmodel.KeyguardQuickAffordancePickerViewModel +import com.android.systemui.shared.clocks.ClockRegistry import com.android.systemui.shared.customization.data.content.CustomizationProviderClient import com.android.systemui.shared.customization.data.content.CustomizationProviderClientImpl import com.android.wallpaper.model.LiveWallpaperInfo +import com.android.wallpaper.model.WallpaperColorsViewModel import com.android.wallpaper.model.WallpaperInfo import com.android.wallpaper.module.CustomizationSections import com.android.wallpaper.module.FragmentFactory @@ -42,13 +75,20 @@ import com.android.wallpaper.picker.CustomizationPickerActivity import com.android.wallpaper.picker.ImagePreviewFragment import com.android.wallpaper.picker.LivePreviewFragment import com.android.wallpaper.picker.PreviewFragment +import com.android.wallpaper.picker.customization.data.content.WallpaperClientImpl +import com.android.wallpaper.picker.customization.data.repository.WallpaperRepository +import com.android.wallpaper.picker.customization.domain.interactor.WallpaperInteractor import com.android.wallpaper.picker.undo.domain.interactor.SnapshotRestorer -import kotlinx.coroutines.Dispatchers.IO +import kotlinx.coroutines.DelicateCoroutinesApi +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.GlobalScope +@OptIn(DelicateCoroutinesApi::class) open class ThemePickerInjector : WallpaperPicker2Injector(), CustomizationInjector { private var customizationSections: CustomizationSections? = null private var userEventLogger: UserEventLogger? = null private var prefs: WallpaperPreferences? = null + private var wallpaperInteractor: WallpaperInteractor? = null private var keyguardQuickAffordancePickerInteractor: KeyguardQuickAffordancePickerInteractor? = null private var keyguardQuickAffordancePickerViewModelFactory: @@ -58,12 +98,44 @@ open class ThemePickerInjector : WallpaperPicker2Injector(), CustomizationInject private var fragmentFactory: FragmentFactory? = null private var keyguardQuickAffordanceSnapshotRestorer: KeyguardQuickAffordanceSnapshotRestorer? = null + private var notificationsSnapshotRestorer: NotificationsSnapshotRestorer? = null + private var clockRegistry: ClockRegistry? = null + private var clockPickerInteractor: ClockPickerInteractor? = null + private var clockSectionViewModel: ClockSectionViewModel? = null + private var clockCarouselViewModel: ClockCarouselViewModel? = null + private var clockViewFactory: ClockViewFactory? = null + private var notificationsInteractor: NotificationsInteractor? = null + private var notificationSectionViewModelFactory: NotificationSectionViewModel.Factory? = null + private var colorPickerInteractor: ColorPickerInteractor? = null + private var colorPickerViewModelFactory: ColorPickerViewModel.Factory? = null + private var colorPickerSnapshotRestorer: ColorPickerSnapshotRestorer? = null + private var colorCustomizationManager: ColorCustomizationManager? = null + private var darkModeSnapshotRestorer: DarkModeSnapshotRestorer? = null + private var themedIconSnapshotRestorer: ThemedIconSnapshotRestorer? = null + private var themedIconInteractor: ThemedIconInteractor? = null + private var clockSettingsViewModelFactory: ClockSettingsViewModel.Factory? = null + private var gridInteractor: GridInteractor? = null + private var gridSnapshotRestorer: GridSnapshotRestorer? = null + private var gridScreenViewModelFactory: GridScreenViewModel.Factory? = null - override fun getCustomizationSections(activity: Activity): CustomizationSections { + override fun getCustomizationSections(activity: ComponentActivity): CustomizationSections { return customizationSections ?: DefaultCustomizationSections( + getColorPickerViewModelFactory( + context = activity, + wallpaperColorsViewModel = getWallpaperColorsViewModel(), + ), getKeyguardQuickAffordancePickerInteractor(activity), - getKeyguardQuickAffordancePickerViewModelFactory(activity) + getKeyguardQuickAffordancePickerViewModelFactory(activity), + NotificationSectionViewModel.Factory( + interactor = getNotificationsInteractor(activity), + ), + getFlags(), + getClockCarouselViewModel(activity), + getClockViewFactory(activity), + getDarkModeSnapshotRestorer(activity), + getThemedIconSnapshotRestorer(activity), + getThemedIconInteractor(), ) .also { customizationSections = it } } @@ -122,6 +194,13 @@ open class ThemePickerInjector : WallpaperPicker2Injector(), CustomizationInject return super<WallpaperPicker2Injector>.getSnapshotRestorers(context).toMutableMap().apply { this[KEY_QUICK_AFFORDANCE_SNAPSHOT_RESTORER] = getKeyguardQuickAffordanceSnapshotRestorer(context) + this[KEY_WALLPAPER_SNAPSHOT_RESTORER] = getWallpaperSnapshotRestorer(context) + this[KEY_NOTIFICATIONS_SNAPSHOT_RESTORER] = getNotificationsSnapshotRestorer(context) + this[KEY_DARK_MODE_SNAPSHOT_RESTORER] = getDarkModeSnapshotRestorer(context) + this[KEY_THEMED_ICON_SNAPSHOT_RESTORER] = getThemedIconSnapshotRestorer(context) + this[KEY_APP_GRID_SNAPSHOT_RESTORER] = getGridSnapshotRestorer(context) + this[KEY_COLOR_PICKER_SNAPSHOT_RESTORER] = + getColorPickerSnapshotRestorer(context, getWallpaperColorsViewModel()) } } @@ -138,6 +217,25 @@ open class ThemePickerInjector : WallpaperPicker2Injector(), CustomizationInject return ThemeManager(provider, activity, overlayManagerCompat, logger) } + override fun getWallpaperInteractor(context: Context): WallpaperInteractor { + return wallpaperInteractor + ?: WallpaperInteractor( + repository = + WallpaperRepository( + scope = GlobalScope, + client = WallpaperClientImpl(context = context), + backgroundDispatcher = Dispatchers.IO, + ), + shouldHandleReload = { + TextUtils.equals( + getColorCustomizationManager(context).currentColorSource, + ColorOptionsProvider.COLOR_SOURCE_PRESET + ) + } + ) + .also { wallpaperInteractor = it } + } + override fun getKeyguardQuickAffordancePickerInteractor( context: Context ): KeyguardQuickAffordancePickerInteractor { @@ -154,32 +252,45 @@ open class ThemePickerInjector : WallpaperPicker2Injector(), CustomizationInject ?: KeyguardQuickAffordancePickerViewModel.Factory( context, getKeyguardQuickAffordancePickerInteractor(context), - getUndoInteractor(context), getCurrentWallpaperInfoFactory(context), - ) + ) { intent -> + context.startActivity(intent) + } .also { keyguardQuickAffordancePickerViewModelFactory = it } } + fun getNotificationSectionViewModelFactory( + context: Context, + ): NotificationSectionViewModel.Factory { + return notificationSectionViewModelFactory + ?: NotificationSectionViewModel.Factory( + interactor = getNotificationsInteractor(context), + ) + .also { notificationSectionViewModelFactory = it } + } + private fun getKeyguardQuickAffordancePickerInteractorImpl( context: Context ): KeyguardQuickAffordancePickerInteractor { val client = getKeyguardQuickAffordancePickerProviderClient(context) return KeyguardQuickAffordancePickerInteractor( - KeyguardQuickAffordancePickerRepository(client, IO), + KeyguardQuickAffordancePickerRepository(client, Dispatchers.IO), client - ) { getKeyguardQuickAffordanceSnapshotRestorer(context) } + ) { + getKeyguardQuickAffordanceSnapshotRestorer(context) + } } protected fun getKeyguardQuickAffordancePickerProviderClient( context: Context ): CustomizationProviderClient { return customizationProviderClient - ?: CustomizationProviderClientImpl(context, IO).also { + ?: CustomizationProviderClientImpl(context, Dispatchers.IO).also { customizationProviderClient = it } } - protected fun getKeyguardQuickAffordanceSnapshotRestorer( + private fun getKeyguardQuickAffordanceSnapshotRestorer( context: Context ): KeyguardQuickAffordanceSnapshotRestorer { return keyguardQuickAffordanceSnapshotRestorer @@ -190,16 +301,238 @@ open class ThemePickerInjector : WallpaperPicker2Injector(), CustomizationInject .also { keyguardQuickAffordanceSnapshotRestorer = it } } + private fun getNotificationsSnapshotRestorer(context: Context): NotificationsSnapshotRestorer { + return notificationsSnapshotRestorer + ?: NotificationsSnapshotRestorer( + interactor = + getNotificationsInteractor( + context = context, + ), + ) + .also { notificationsSnapshotRestorer = it } + } + + override fun getClockRegistry(context: Context): ClockRegistry { + return clockRegistry + ?: ClockRegistryProvider( + context = context, + coroutineScope = GlobalScope, + mainDispatcher = Dispatchers.Main, + backgroundDispatcher = Dispatchers.IO, + ) + .get() + .also { clockRegistry = it } + } + + override fun getClockPickerInteractor( + context: Context, + ): ClockPickerInteractor { + return clockPickerInteractor + ?: ClockPickerInteractor( + ClockPickerRepositoryImpl( + secureSettingsRepository = getSecureSettingsRepository(context), + registry = getClockRegistry(context), + scope = GlobalScope, + ), + ) + .also { clockPickerInteractor = it } + } + + override fun getClockSectionViewModel(context: Context): ClockSectionViewModel { + return clockSectionViewModel + ?: ClockSectionViewModel(context, getClockPickerInteractor(context)).also { + clockSectionViewModel = it + } + } + + override fun getClockCarouselViewModel(context: Context): ClockCarouselViewModel { + return clockCarouselViewModel + ?: ClockCarouselViewModel(getClockPickerInteractor(context)).also { + clockCarouselViewModel = it + } + } + + override fun getClockViewFactory(activity: Activity): ClockViewFactory { + return clockViewFactory + ?: ClockViewFactory(activity, getClockRegistry(activity)).also { clockViewFactory = it } + } + + protected fun getNotificationsInteractor( + context: Context, + ): NotificationsInteractor { + return notificationsInteractor + ?: NotificationsInteractor( + repository = + NotificationsRepository( + scope = GlobalScope, + backgroundDispatcher = Dispatchers.IO, + secureSettingsRepository = getSecureSettingsRepository(context), + ), + snapshotRestorer = { getNotificationsSnapshotRestorer(context) }, + ) + .also { notificationsInteractor = it } + } + + override fun getColorPickerInteractor( + context: Context, + wallpaperColorsViewModel: WallpaperColorsViewModel, + ): ColorPickerInteractor { + return colorPickerInteractor + ?: ColorPickerInteractor( + repository = + ColorPickerRepositoryImpl( + wallpaperColorsViewModel, + getColorCustomizationManager(context) + ), + snapshotRestorer = { + getColorPickerSnapshotRestorer(context, wallpaperColorsViewModel) + } + ) + .also { colorPickerInteractor = it } + } + + override fun getColorPickerViewModelFactory( + context: Context, + wallpaperColorsViewModel: WallpaperColorsViewModel, + ): ColorPickerViewModel.Factory { + return colorPickerViewModelFactory + ?: ColorPickerViewModel.Factory( + context, + getColorPickerInteractor(context, wallpaperColorsViewModel), + ) + .also { colorPickerViewModelFactory = it } + } + + private fun getColorPickerSnapshotRestorer( + context: Context, + wallpaperColorsViewModel: WallpaperColorsViewModel, + ): ColorPickerSnapshotRestorer { + return colorPickerSnapshotRestorer + ?: ColorPickerSnapshotRestorer( + getColorPickerInteractor(context, wallpaperColorsViewModel) + ) + .also { colorPickerSnapshotRestorer = it } + } + + private fun getColorCustomizationManager(context: Context): ColorCustomizationManager { + return colorCustomizationManager + ?: ColorCustomizationManager.getInstance(context, OverlayManagerCompat(context)).also { + colorCustomizationManager = it + } + } + + fun getDarkModeSnapshotRestorer( + context: Context, + ): DarkModeSnapshotRestorer { + return darkModeSnapshotRestorer + ?: DarkModeSnapshotRestorer( + context = context, + manager = context.getSystemService(Context.UI_MODE_SERVICE) as UiModeManager, + backgroundDispatcher = Dispatchers.IO, + ) + .also { darkModeSnapshotRestorer = it } + } + + protected fun getThemedIconSnapshotRestorer( + context: Context, + ): ThemedIconSnapshotRestorer { + val optionProvider = ThemedIconSwitchProvider.getInstance(context) + return themedIconSnapshotRestorer + ?: ThemedIconSnapshotRestorer( + isActivated = { optionProvider.isThemedIconEnabled }, + setActivated = { isActivated -> + optionProvider.isThemedIconEnabled = isActivated + }, + interactor = getThemedIconInteractor(), + ) + .also { themedIconSnapshotRestorer = it } + } + + protected fun getThemedIconInteractor(): ThemedIconInteractor { + return themedIconInteractor + ?: ThemedIconInteractor( + repository = ThemeIconRepository(), + ) + .also { themedIconInteractor = it } + } + + override fun getClockSettingsViewModelFactory( + context: Context, + wallpaperColorsViewModel: WallpaperColorsViewModel, + ): ClockSettingsViewModel.Factory { + return clockSettingsViewModelFactory + ?: ClockSettingsViewModel.Factory( + context, + getClockPickerInteractor(context), + getColorPickerInteractor( + context, + wallpaperColorsViewModel, + ), + ) + .also { clockSettingsViewModelFactory = it } + } + + fun getGridScreenViewModelFactory( + context: Context, + ): ViewModelProvider.Factory { + return gridScreenViewModelFactory + ?: GridScreenViewModel.Factory( + context = context, + interactor = getGridInteractor(context), + ) + .also { gridScreenViewModelFactory = it } + } + + private fun getGridInteractor( + context: Context, + ): GridInteractor { + return gridInteractor + ?: GridInteractor( + applicationScope = GlobalScope, + repository = + GridRepositoryImpl( + applicationScope = GlobalScope, + manager = GridOptionsManager.getInstance(context), + backgroundDispatcher = Dispatchers.IO, + ), + snapshotRestorer = { getGridSnapshotRestorer(context) }, + ) + .also { gridInteractor = it } + } + + private fun getGridSnapshotRestorer( + context: Context, + ): GridSnapshotRestorer { + return gridSnapshotRestorer + ?: GridSnapshotRestorer( + interactor = getGridInteractor(context), + ) + .also { gridSnapshotRestorer = it } + } + companion object { @JvmStatic private val KEY_QUICK_AFFORDANCE_SNAPSHOT_RESTORER = WallpaperPicker2Injector.MIN_SNAPSHOT_RESTORER_KEY + @JvmStatic + private val KEY_WALLPAPER_SNAPSHOT_RESTORER = KEY_QUICK_AFFORDANCE_SNAPSHOT_RESTORER + 1 + @JvmStatic + private val KEY_NOTIFICATIONS_SNAPSHOT_RESTORER = KEY_WALLPAPER_SNAPSHOT_RESTORER + 1 + @JvmStatic + private val KEY_DARK_MODE_SNAPSHOT_RESTORER = KEY_NOTIFICATIONS_SNAPSHOT_RESTORER + 1 + @JvmStatic + private val KEY_THEMED_ICON_SNAPSHOT_RESTORER = KEY_DARK_MODE_SNAPSHOT_RESTORER + 1 + @JvmStatic + private val KEY_APP_GRID_SNAPSHOT_RESTORER = KEY_THEMED_ICON_SNAPSHOT_RESTORER + 1 + @JvmStatic + private val KEY_COLOR_PICKER_SNAPSHOT_RESTORER = KEY_APP_GRID_SNAPSHOT_RESTORER + 1 /** * When this injector is overridden, this is the minimal value that should be used by * restorers returns in [getSnapshotRestorers]. + * + * It should always be greater than the biggest restorer key. */ - @JvmStatic - protected val MIN_SNAPSHOT_RESTORER_KEY = KEY_QUICK_AFFORDANCE_SNAPSHOT_RESTORER + 1 + @JvmStatic protected val MIN_SNAPSHOT_RESTORER_KEY = KEY_COLOR_PICKER_SNAPSHOT_RESTORER + 1 } } |
