Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 71533ec8 authored by George Lin's avatar George Lin Committed by Android (Google) Code Review
Browse files

Merge "Handle intent from the Settings (2/3)" into main

parents a6b36ce7 bfdc41bf
Loading
Loading
Loading
Loading
+15 −253
Original line number Diff line number Diff line
@@ -16,48 +16,27 @@

package com.android.wallpaper.customization.ui.util

import android.content.Context
import android.provider.Settings
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.FrameLayout
import android.widget.LinearLayout
import androidx.compose.ui.platform.ComposeView
import com.android.customization.picker.mode.shared.util.DarkModeLifecycleUtil
import com.android.themepicker.R
import com.android.wallpaper.config.BaseFlags
import com.android.wallpaper.customization.ui.compose.ColorFloatingSheet
import com.android.wallpaper.customization.ui.viewmodel.ThemePickerCustomizationOptionsData
import com.android.wallpaper.model.Screen
import com.android.wallpaper.model.Screen.HOME_SCREEN
import com.android.wallpaper.model.Screen.LOCK_SCREEN
import com.android.wallpaper.customization.ui.util.ThemePickerCustomizationOptionUtil.ThemePickerLockCustomizationOption.SHORTCUTS
import com.android.wallpaper.picker.customization.ui.util.CustomizationOptionUtil
import com.android.wallpaper.picker.customization.ui.util.CustomizationOptionUtil.CustomizationOption
import com.android.wallpaper.picker.customization.ui.util.DefaultCustomizationOptionUtil
import com.android.wallpaper.picker.customization.ui.viewmodel.CustomizationOptionsData
import dagger.hilt.android.qualifiers.ActivityContext
import dagger.hilt.android.scopes.ActivityScoped
import javax.inject.Inject
import javax.inject.Singleton

@ActivityScoped
@Singleton
class ThemePickerCustomizationOptionUtil
@Inject
constructor(
    private val defaultCustomizationOptionUtil: DefaultCustomizationOptionUtil,
    @ActivityContext private val context: Context,
) : CustomizationOptionUtil {
constructor(private val defaultCustomizationOptionUtil: DefaultCustomizationOptionUtil) :
    CustomizationOptionUtil {

    // Instantiate DarkModeLifecycleUtil for it to observe lifecycle and update DarkModeRepository
    @Inject lateinit var darkModeLifecycleUtil: DarkModeLifecycleUtil

    enum class ThemePickerLockCustomizationOption : CustomizationOptionUtil.CustomizationOption {
    enum class ThemePickerLockCustomizationOption : CustomizationOption {
        CLOCK,
        SHORTCUTS,
        LOCK_SCREEN_NOTIFICATIONS,
        MORE_LOCK_SCREEN_SETTINGS,
    }

    enum class ThemePickerHomeCustomizationOption : CustomizationOptionUtil.CustomizationOption {
    enum class ThemePickerHomeCustomizationOption : CustomizationOption {
        PACK_THEME,
        COLORS,
        COLOR_CONTRAST,
@@ -65,232 +44,15 @@ constructor(
        GRID,
    }

    override fun getOptionEntries(
        customizationOptionsData: CustomizationOptionsData,
        screen: Screen,
        optionContainer: LinearLayout,
        layoutInflater: LayoutInflater,
    ): List<Pair<CustomizationOptionUtil.CustomizationOption, View>> {
        customizationOptionsData as ThemePickerCustomizationOptionsData
        val isKeyguardQuickAffordanceEnabled =
            BaseFlags.get().isKeyguardQuickAffordanceEnabled(optionContainer.context)
        val showPackEntry =
            Settings.Secure.getInt(
                context.contentResolver,
                Settings.Secure.PACK_THEME_FEATURE_ENABLED,
                /* def= */ 0,
            ) == 1
        val defaultOptionEntries =
            defaultCustomizationOptionUtil.getOptionEntries(
                customizationOptionsData = customizationOptionsData,
                screen = screen,
                optionContainer = optionContainer,
                layoutInflater = layoutInflater,
            )
        return when (screen) {
            LOCK_SCREEN ->
                buildList {
                    addAll(defaultOptionEntries)
                    if (BaseFlags.get().isPackThemeEnabled() && showPackEntry) {
                        add(
                            ThemePickerHomeCustomizationOption.PACK_THEME to
                                layoutInflater.inflate(
                                    R.layout.customization_option_entry_pack_theme,
                                    optionContainer,
                                    false,
                                )
                        )
                    }
                    add(
                        ThemePickerLockCustomizationOption.CLOCK to
                            layoutInflater.inflate(
                                R.layout.customization_option_entry_clock,
                                optionContainer,
                                false,
                            )
                    )
                    if (isKeyguardQuickAffordanceEnabled) {
                        add(
                            ThemePickerLockCustomizationOption.SHORTCUTS to
                                layoutInflater.inflate(
                                    R.layout.customization_option_entry_keyguard_quick_affordance,
                                    optionContainer,
                                    false,
                                )
                        )
                    }
                    add(
                        ThemePickerLockCustomizationOption.LOCK_SCREEN_NOTIFICATIONS to
                            layoutInflater.inflate(
                                R.layout.customization_option_entry_lock_screen_notifications,
                                optionContainer,
                                false,
                            )
                    )
                    add(
                        ThemePickerLockCustomizationOption.MORE_LOCK_SCREEN_SETTINGS to
                            layoutInflater.inflate(
                                R.layout.customization_option_entry_more_lock_settings,
                                optionContainer,
                                false,
                            )
                    )
                }
            HOME_SCREEN ->
                buildList {
                    addAll(defaultOptionEntries)
                    if (BaseFlags.get().isPackThemeEnabled() && showPackEntry) {
                        add(
                            ThemePickerHomeCustomizationOption.PACK_THEME to
                                layoutInflater.inflate(
                                    R.layout.customization_option_entry_pack_theme,
                                    optionContainer,
                                    false,
                                )
                        )
                    }
                    add(
                        ThemePickerHomeCustomizationOption.COLORS to
                            layoutInflater.inflate(
                                R.layout.customization_option_entry_colors,
                                optionContainer,
                                false,
                            )
                    )
                    add(
                        ThemePickerHomeCustomizationOption.COLOR_CONTRAST to
                            layoutInflater.inflate(
                                R.layout.customization_option_entry_color_contrast,
                                optionContainer,
                                false,
                            )
                    )
                    if (
                        customizationOptionsData.isThemedIconAvailable ||
                            customizationOptionsData.isShapeAvailable
                    )
                        add(
                            ThemePickerHomeCustomizationOption.APP_ICONS to
                                layoutInflater.inflate(
                                    R.layout.customization_option_entry_app_icons,
                                    optionContainer,
                                    false,
                                )
                        )
                    if (customizationOptionsData.isGridCustomizationAvailable) {
                        add(
                            ThemePickerHomeCustomizationOption.GRID to
                                layoutInflater.inflate(
                                    R.layout.customization_option_entry_grid,
                                    optionContainer,
                                    false,
                                )
                        )
                    }
                }
        }
    }

    override fun initFloatingSheet(
        customizationOptionsData: CustomizationOptionsData,
        bottomSheetContainer: FrameLayout,
        layoutInflater: LayoutInflater,
    ): Map<CustomizationOptionUtil.CustomizationOption, View> {
        customizationOptionsData as ThemePickerCustomizationOptionsData
        val map =
            defaultCustomizationOptionUtil.initFloatingSheet(
                customizationOptionsData = customizationOptionsData,
                bottomSheetContainer = bottomSheetContainer,
                layoutInflater = layoutInflater,
            )
        val isComposeRefactorEnabled = BaseFlags.get().isComposeRefactorEnabled()
        val isKeyguardQuickAffordanceEnabled =
            BaseFlags.get().isKeyguardQuickAffordanceEnabled(bottomSheetContainer.context)
        return buildMap {
            putAll(map)
            put(
                ThemePickerLockCustomizationOption.CLOCK,
                inflateFloatingSheet(
                        ThemePickerLockCustomizationOption.CLOCK,
                        bottomSheetContainer,
                        layoutInflater,
                    )
                    .also { bottomSheetContainer.addView(it) },
            )
            if (isKeyguardQuickAffordanceEnabled) {
                put(
                    ThemePickerLockCustomizationOption.SHORTCUTS,
                    if (isComposeRefactorEnabled) {
                            ComposeView(context)
                        } else {
                            inflateFloatingSheet(
                                ThemePickerLockCustomizationOption.SHORTCUTS,
                                bottomSheetContainer,
                                layoutInflater,
                            )
                        }
                        .also { bottomSheetContainer.addView(it) },
                )
            }

            put(
                ThemePickerHomeCustomizationOption.COLORS,
                if (isComposeRefactorEnabled) {
                        ComposeView(context).apply { setContent { ColorFloatingSheet() } }
                    } else {
                        inflateFloatingSheet(
                            ThemePickerHomeCustomizationOption.COLORS,
                            bottomSheetContainer,
                            layoutInflater,
                        )
                    }
                    .also { bottomSheetContainer.addView(it) },
            )
            put(
                ThemePickerHomeCustomizationOption.APP_ICONS,
                inflateFloatingSheet(
                    ThemePickerHomeCustomizationOption.APP_ICONS,
                    bottomSheetContainer,
                    layoutInflater,
                ),
            )
            if (customizationOptionsData.isGridCustomizationAvailable) {
                put(
                    ThemePickerHomeCustomizationOption.GRID,
                    inflateFloatingSheet(
                            ThemePickerHomeCustomizationOption.GRID,
                            bottomSheetContainer,
                            layoutInflater,
                        )
                        .also { bottomSheetContainer.addView(it) },
                )
            }
    override fun getCustomizationOptionFromDestination(destination: String): CustomizationOption? {
        return defaultCustomizationOptionUtil.getCustomizationOptionFromDestination(destination)
            ?: when (destination) {
                DESTINATION_QUICK_AFFORDANCES -> SHORTCUTS
                else -> null
            }
    }

    override fun createClockPreviewAndAddToParent(
        parentView: ViewGroup,
        layoutInflater: LayoutInflater,
    ): View? {
        val clockHostView = layoutInflater.inflate(R.layout.clock_host_view, parentView, false)
        parentView.addView(clockHostView)
        return clockHostView
    companion object {
        const val DESTINATION_QUICK_AFFORDANCES = "quick_affordances"
    }

    private fun inflateFloatingSheet(
        option: CustomizationOptionUtil.CustomizationOption,
        bottomSheetContainer: FrameLayout,
        layoutInflater: LayoutInflater,
    ): View =
        when (option) {
            ThemePickerLockCustomizationOption.CLOCK -> R.layout.floating_sheet_clock
            ThemePickerLockCustomizationOption.SHORTCUTS -> R.layout.floating_sheet_shortcut
            ThemePickerHomeCustomizationOption.COLORS -> R.layout.floating_sheet_colors
            ThemePickerHomeCustomizationOption.APP_ICONS -> R.layout.floating_sheet_app_icon
            ThemePickerHomeCustomizationOption.GRID -> R.layout.floating_sheet_grid
            else ->
                throw IllegalStateException(
                    "Customization option $option does not have a bottom sheet view"
                )
        }.let { layoutInflater.inflate(it, bottomSheetContainer, false) }
}
+270 −0

File added.

Preview size limit exceeded, changes collapsed.

+23 −41
Original line number Diff line number Diff line
@@ -19,7 +19,11 @@ package com.android.wallpaper.customization.ui.viewmodel
import android.content.Context
import android.view.accessibility.AccessibilityManager
import com.android.customization.picker.mode.ui.viewmodel.DarkModeViewModel
import com.android.wallpaper.customization.ui.util.ThemePickerCustomizationOptionUtil
import com.android.wallpaper.customization.ui.util.ThemePickerCustomizationOptionUtil.ThemePickerHomeCustomizationOption.APP_ICONS
import com.android.wallpaper.customization.ui.util.ThemePickerCustomizationOptionUtil.ThemePickerHomeCustomizationOption.COLORS
import com.android.wallpaper.customization.ui.util.ThemePickerCustomizationOptionUtil.ThemePickerHomeCustomizationOption.GRID
import com.android.wallpaper.customization.ui.util.ThemePickerCustomizationOptionUtil.ThemePickerLockCustomizationOption.CLOCK
import com.android.wallpaper.customization.ui.util.ThemePickerCustomizationOptionUtil.ThemePickerLockCustomizationOption.SHORTCUTS
import com.android.wallpaper.picker.customization.ui.view.ApplyButton
import com.android.wallpaper.picker.customization.ui.view.ApplyButton.ApplyButtonState.APPLY_BUTTON_DISABLED
import com.android.wallpaper.picker.customization.ui.view.ApplyButton.ApplyButtonState.APPLY_BUTTON_ENABLED
@@ -61,10 +65,14 @@ constructor(
    val themedIconViewModel: ThemedIconViewModel,
    val packThemeViewModel: PackThemeViewModel,
    @Assisted private val viewModelScope: CoroutineScope,
    @Assisted initialDeepLinkDestination: String?,
) : CustomizationOptionsViewModel {

    private val defaultCustomizationOptionsViewModel =
        defaultCustomizationOptionsViewModelFactory.create(viewModelScope)
        defaultCustomizationOptionsViewModelFactory.create(
            viewModelScope,
            initialDeepLinkDestination,
        )

    override val wallpaperCarouselViewModel =
        defaultCustomizationOptionsViewModel.wallpaperCarouselViewModel
@@ -126,10 +134,7 @@ constructor(

    override fun onTransitionToSecondaryScreenComplete() {
        defaultCustomizationOptionsViewModel.onTransitionToSecondaryScreenComplete()
        if (
            selectedOption.value ==
                ThemePickerCustomizationOptionUtil.ThemePickerLockCustomizationOption.CLOCK
        ) {
        if (selectedOption.value == CLOCK) {
            // Show the picker's clock when we complete the transition to land on the secondary
            // clock customization screen.
            clockPickerViewModel.setShowPickerClockControllerView(true)
@@ -140,9 +145,7 @@ constructor(
        selectedOption.map {
            if (it == null) {
                {
                    defaultCustomizationOptionsViewModel.selectOption(
                        ThemePickerCustomizationOptionUtil.ThemePickerLockCustomizationOption.CLOCK
                    )
                    defaultCustomizationOptionsViewModel.selectOption(CLOCK)
                    // When we are about to transition to the clock customization screen, hide the
                    // keyguard preview renderer's smartspace as well as the clock. Because, we will
                    // show the picker's clock controller view clock when the transition ends.
@@ -157,12 +160,7 @@ constructor(
    val onCustomizeShortcutClicked: Flow<(() -> Unit)?> =
        selectedOption.map {
            if (it == null) {
                {
                    defaultCustomizationOptionsViewModel.selectOption(
                        ThemePickerCustomizationOptionUtil.ThemePickerLockCustomizationOption
                            .SHORTCUTS
                    )
                }
                { defaultCustomizationOptionsViewModel.selectOption(SHORTCUTS) }
            } else {
                null
            }
@@ -171,11 +169,7 @@ constructor(
    val onCustomizeColorsClicked: Flow<(() -> Unit)?> =
        selectedOption.map {
            if (it == null) {
                {
                    defaultCustomizationOptionsViewModel.selectOption(
                        ThemePickerCustomizationOptionUtil.ThemePickerHomeCustomizationOption.COLORS
                    )
                }
                { defaultCustomizationOptionsViewModel.selectOption(COLORS) }
            } else {
                null
            }
@@ -184,12 +178,7 @@ constructor(
    val onCustomizeIconsClicked: Flow<(() -> Unit)?> =
        selectedOption.map {
            if (it == null) {
                {
                    defaultCustomizationOptionsViewModel.selectOption(
                        ThemePickerCustomizationOptionUtil.ThemePickerHomeCustomizationOption
                            .APP_ICONS
                    )
                }
                { defaultCustomizationOptionsViewModel.selectOption(APP_ICONS) }
            } else {
                null
            }
@@ -198,11 +187,7 @@ constructor(
    val onCustomizeShapeGridClicked: Flow<(() -> Unit)?> =
        selectedOption.map {
            if (it == null) {
                {
                    defaultCustomizationOptionsViewModel.selectOption(
                        ThemePickerCustomizationOptionUtil.ThemePickerHomeCustomizationOption.GRID
                    )
                }
                { defaultCustomizationOptionsViewModel.selectOption(GRID) }
            } else {
                null
            }
@@ -213,15 +198,11 @@ constructor(
        selectedOption
            .flatMapLatest {
                when (it) {
                    ThemePickerCustomizationOptionUtil.ThemePickerLockCustomizationOption.CLOCK ->
                        clockPickerViewModel.onApply
                    ThemePickerCustomizationOptionUtil.ThemePickerLockCustomizationOption
                        .SHORTCUTS -> keyguardQuickAffordancePickerViewModel2.onApply
                    ThemePickerCustomizationOptionUtil.ThemePickerHomeCustomizationOption.GRID ->
                        gridPickerViewModel.onApply
                    ThemePickerCustomizationOptionUtil.ThemePickerHomeCustomizationOption
                        .APP_ICONS -> appIconPickerViewModel.onApply
                    ThemePickerCustomizationOptionUtil.ThemePickerHomeCustomizationOption.COLORS ->
                    CLOCK -> clockPickerViewModel.onApply
                    SHORTCUTS -> keyguardQuickAffordancePickerViewModel2.onApply
                    GRID -> gridPickerViewModel.onApply
                    APP_ICONS -> appIconPickerViewModel.onApply
                    COLORS ->
                        combine(colorPickerViewModel2.onApply, darkModeViewModel.onApply) {
                            colorOnApply,
                            darkModeOnApply ->
@@ -283,7 +264,8 @@ constructor(
    @AssistedFactory
    interface Factory : CustomizationOptionsViewModelFactory {
        override fun create(
            viewModelScope: CoroutineScope
            viewModelScope: CoroutineScope,
            initialDeepLinkDestination: String?,
        ): ThemePickerCustomizationOptionsViewModel
    }
}
+5 −5
Original line number Diff line number Diff line
@@ -18,8 +18,8 @@ package com.android.wallpaper.modules

import com.android.customization.picker.clock.ui.view.ClockViewFactory
import com.android.customization.picker.clock.ui.view.ThemePickerClockViewFactory
import com.android.wallpaper.customization.ui.util.ThemePickerCustomizationOptionUtil
import com.android.wallpaper.picker.customization.ui.util.CustomizationOptionUtil
import com.android.wallpaper.customization.ui.util.ThemePickerCustomizationOptionViewUtil
import com.android.wallpaper.picker.customization.ui.util.CustomizationOptionViewUtil
import dagger.Binds
import dagger.Module
import dagger.hilt.InstallIn
@@ -36,7 +36,7 @@ abstract class ThemePickerActivityModule {

    @Binds
    @ActivityScoped
    abstract fun bindCustomizationOptionUtil(
        impl: ThemePickerCustomizationOptionUtil
    ): CustomizationOptionUtil
    abstract fun bindCustomizationOptionViewUtil(
        impl: ThemePickerCustomizationOptionViewUtil
    ): CustomizationOptionViewUtil
}
+8 −0
Original line number Diff line number Diff line
@@ -41,6 +41,7 @@ import com.android.systemui.shared.settings.data.repository.SystemSettingsReposi
import com.android.systemui.shared.settings.data.repository.SystemSettingsRepositoryImpl
import com.android.wallpaper.customization.ui.binder.ThemePickerCustomizationOptionsBinder
import com.android.wallpaper.customization.ui.binder.ThemePickerToolbarBinder
import com.android.wallpaper.customization.ui.util.ThemePickerCustomizationOptionUtil
import com.android.wallpaper.effects.DefaultEffectsController
import com.android.wallpaper.effects.EffectsController
import com.android.wallpaper.module.DefaultPartnerProvider
@@ -73,6 +74,7 @@ import com.android.wallpaper.picker.customization.ui.binder.CustomizationOptions
import com.android.wallpaper.picker.customization.ui.binder.DefaultPackThemeSuggestedEntryBinder
import com.android.wallpaper.picker.customization.ui.binder.PackThemeSuggestedEntryBinder
import com.android.wallpaper.picker.customization.ui.binder.ToolbarBinder
import com.android.wallpaper.picker.customization.ui.util.CustomizationOptionUtil
import com.android.wallpaper.picker.di.modules.BackgroundDispatcher
import com.android.wallpaper.picker.di.modules.MainDispatcher
import com.android.wallpaper.picker.domain.interactor.PackThemeInteractor
@@ -151,6 +153,12 @@ abstract class ThemePickerAppModule {
        impl: ThemePickerCustomizationOptionsBinder
    ): CustomizationOptionsBinder

    @Binds
    @Singleton
    abstract fun bindCustomizationOptionUtil(
        impl: ThemePickerCustomizationOptionUtil
    ): CustomizationOptionUtil

    @Binds
    @Singleton
    abstract fun bindEffectsController(impl: DefaultEffectsController): EffectsController
Loading