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

Commit 78d119d3 authored by George Lin's avatar George Lin
Browse files

Introduce apply button (1/2)

The apply button has a state of in progress to handle cases that the
apply action is long.

Test: Manually tested. See bug.
Fixes: 409241414
Flag: com.android.systemui.shared.new_customization_picker_ui
Change-Id: I55c294717b084712aab2f654296aea1d7e8c0f85
parent e85af693
Loading
Loading
Loading
Loading
+18 −18
Original line number Diff line number Diff line
@@ -16,11 +16,9 @@

package com.android.wallpaper.customization.ui.binder

import android.widget.Button
import android.widget.FrameLayout
import android.widget.Toolbar
import androidx.core.graphics.ColorUtils
import androidx.core.graphics.drawable.DrawableCompat
import androidx.core.view.isInvisible
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleOwner
@@ -37,6 +35,10 @@ import com.android.wallpaper.customization.ui.viewmodel.ThemePickerCustomization
import com.android.wallpaper.picker.customization.ui.binder.ColorUpdateBinder
import com.android.wallpaper.picker.customization.ui.binder.DefaultToolbarBinder
import com.android.wallpaper.picker.customization.ui.binder.ToolbarBinder
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
import com.android.wallpaper.picker.customization.ui.view.ApplyButton.ApplyButtonState.APPLY_BUTTON_IN_PROGRESS
import com.android.wallpaper.picker.customization.ui.viewmodel.ColorUpdateViewModel
import com.android.wallpaper.picker.customization.ui.viewmodel.CustomizationOptionsViewModel
import javax.inject.Inject
@@ -52,7 +54,7 @@ constructor(private val defaultToolbarBinder: DefaultToolbarBinder) : ToolbarBin
    override fun bind(
        navButton: FrameLayout,
        toolbar: Toolbar,
        applyButton: Button,
        applyButton: ApplyButton,
        viewModel: CustomizationOptionsViewModel,
        colorUpdateViewModel: ColorUpdateViewModel,
        lifecycleOwner: LifecycleOwner,
@@ -75,26 +77,28 @@ constructor(private val defaultToolbarBinder: DefaultToolbarBinder) : ToolbarBin
        }

        ColorUpdateBinder.bind(
            setColor = { color ->
                DrawableCompat.setTint(DrawableCompat.wrap(applyButton.background), color)
            },
            setColor = { color -> applyButton.setApplyButtonBackgroundColor(color) },
            color = colorUpdateViewModel.colorPrimary,
            shouldAnimate = { true },
            lifecycleOwner = lifecycleOwner,
        )

        ColorUpdateBinder.bind(
            setColor = { color -> applyButton.setTextColor(color) },
            setColor = { color ->
                applyButton.setApplyButtonTextColor(color)
                applyButton.setIndicatorColor(color)
            },
            color =
                combine(
                    viewModel.isApplyButtonEnabled,
                    viewModel.applyButtonState,
                    colorUpdateViewModel.colorOnPrimary,
                    colorUpdateViewModel.colorOnSurface,
                ) { enabled, onPrimary, onSurface ->
                    if (enabled) {
                        onPrimary
                    } else {
                ) { state, onPrimary, onSurface ->
                    when (state) {
                        APPLY_BUTTON_ENABLED -> onPrimary
                        APPLY_BUTTON_DISABLED ->
                            ColorUtils.setAlphaComponent(onSurface, 97) // 97 for 38% transparent
                        APPLY_BUTTON_IN_PROGRESS -> onPrimary
                    }
                },
            shouldAnimate = { false },
@@ -112,11 +116,7 @@ constructor(private val defaultToolbarBinder: DefaultToolbarBinder) : ToolbarBin
                launch { viewModel.isApplyButtonVisible.collect { applyButton.isInvisible = !it } }

                launch {
                    viewModel.isApplyButtonEnabled.collect {
                        applyButton.isEnabled = it
                        applyButton.background.alpha =
                            if (it) 255 else 31 // 255 for 100%, 31 for 12% transparent
                    }
                    viewModel.applyButtonState.collect { applyButton.setApplyButtonState(it) }
                }

                launch {
+14 −4
Original line number Diff line number Diff line
@@ -18,6 +18,10 @@ package com.android.wallpaper.customization.ui.viewmodel

import com.android.customization.picker.mode.ui.viewmodel.DarkModeViewModel
import com.android.wallpaper.customization.ui.util.ThemePickerCustomizationOptionUtil
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
import com.android.wallpaper.picker.customization.ui.view.ApplyButton.ApplyButtonState.APPLY_BUTTON_IN_PROGRESS
import com.android.wallpaper.picker.customization.ui.viewmodel.CustomizationOptionsData
import com.android.wallpaper.picker.customization.ui.viewmodel.CustomizationOptionsViewModel
import com.android.wallpaper.picker.customization.ui.viewmodel.CustomizationOptionsViewModelFactory
@@ -83,7 +87,7 @@ constructor(
        defaultCustomizationOptionsViewModel.discardChangesDialogViewModel

    override fun handleBackPressed(): Boolean {
        if (isApplyButtonEnabled.value) {
        if (applyButtonState.value == APPLY_BUTTON_ENABLED) {
            defaultCustomizationOptionsViewModel.showDiscardChangesDialogViewModel()
            return true
        }
@@ -219,12 +223,18 @@ constructor(
            }
            .stateIn(viewModelScope, SharingStarted.Eagerly, null)

    val isApplyButtonEnabled: StateFlow<Boolean> =
    val applyButtonState: StateFlow<ApplyButton.ApplyButtonState> =
        combine(isApplyInProgress, onApplyButtonClicked) { isApplyInProgress, onApplyButtonClicked
                ->
                !isApplyInProgress && onApplyButtonClicked != null
                if (isApplyInProgress) {
                    APPLY_BUTTON_IN_PROGRESS
                } else if (onApplyButtonClicked == null) {
                    APPLY_BUTTON_DISABLED
                } else {
                    APPLY_BUTTON_ENABLED
                }
            }
            .stateIn(viewModelScope, SharingStarted.WhileSubscribed(), false)
            .stateIn(viewModelScope, SharingStarted.WhileSubscribed(), APPLY_BUTTON_DISABLED)

    val isApplyButtonVisible: Flow<Boolean> = selectedOption.map { it != null }