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

Commit 55a924db authored by George Lin's avatar George Lin
Browse files

[TP] Handle quick update from slider

When sliding, the color updates are frequent. We do not allow quick
updates to the settings. So we will handle the color changes at the UI
level.

1. Replace the clock preview on the lock screen with an overlay clock
   view
2. Implements the frequent color updates to the view

Test: Manually tested that the view quickly respond to the slider
Bug: 270097085
Change-Id: Ib78058d0dabaeea8cdbe1eed4516ecf02c76b904
parent 837b0cf5
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -41,6 +41,11 @@
            android:layout_height="match_parent"
            android:layout_gravity="center" />

        <FrameLayout
            android:id="@+id/clock_host_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_gravity="center" />
    </com.android.wallpaper.picker.DisplayAspectRatioFrameLayout>


+8 −4
Original line number Diff line number Diff line
@@ -15,7 +15,6 @@
 */
package com.android.customization.picker.clock.ui.binder

import android.view.View
import android.view.ViewGroup
import android.widget.FrameLayout
import androidx.core.view.isVisible
@@ -24,6 +23,7 @@ import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle
import com.android.customization.picker.clock.ui.view.ClockCarouselView
import com.android.customization.picker.clock.ui.view.ClockViewFactory
import com.android.customization.picker.clock.ui.viewmodel.ClockCarouselViewModel
import com.android.wallpaper.R
import kotlinx.coroutines.launch
@@ -43,7 +43,7 @@ object ClockCarouselViewBinder {
        carouselView: ClockCarouselView,
        singleClockView: ViewGroup,
        viewModel: ClockCarouselViewModel,
        clockViewFactory: (clockId: String) -> View,
        clockViewFactory: ClockViewFactory,
        lifecycleOwner: LifecycleOwner,
    ): Binding {
        val singleClockHostView =
@@ -56,7 +56,7 @@ object ClockCarouselViewBinder {
                    viewModel.allClockIds.collect { allClockIds ->
                        carouselView.setUpClockCarouselView(
                            clockIds = allClockIds,
                            onGetClockPreview = clockViewFactory,
                            onGetClockPreview = { clockId -> clockViewFactory.getView(clockId) },
                            onClockSelected = { clockId -> viewModel.setSelectedClock(clockId) },
                        )
                    }
@@ -68,6 +68,10 @@ object ClockCarouselViewBinder {
                    }
                }

                launch {
                    viewModel.seedColor.collect { clockViewFactory.updateColorForAllClocks(it) }
                }

                launch {
                    viewModel.isSingleClockViewVisible.collect { singleClockView.isVisible = it }
                }
@@ -75,7 +79,7 @@ object ClockCarouselViewBinder {
                launch {
                    viewModel.clockId.collect { clockId ->
                        singleClockHostView.removeAllViews()
                        val clockView = clockViewFactory(clockId)
                        val clockView = clockViewFactory.getView(clockId)
                        // The clock view might still be attached to an existing parent. Detach
                        // before adding to another parent.
                        (clockView.parent as? ViewGroup)?.removeView(clockView)
+26 −0
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@
package com.android.customization.picker.clock.ui.binder

import android.view.View
import android.view.ViewGroup
import android.widget.FrameLayout
import android.widget.SeekBar
import androidx.core.view.isInvisible
import androidx.core.view.isVisible
@@ -28,10 +30,12 @@ import androidx.recyclerview.widget.RecyclerView
import com.android.customization.picker.clock.shared.ClockSize
import com.android.customization.picker.clock.ui.adapter.ClockSettingsTabAdapter
import com.android.customization.picker.clock.ui.view.ClockSizeRadioButtonGroup
import com.android.customization.picker.clock.ui.view.ClockViewFactory
import com.android.customization.picker.clock.ui.viewmodel.ClockSettingsViewModel
import com.android.customization.picker.color.ui.adapter.ColorOptionAdapter
import com.android.customization.picker.common.ui.view.ItemSpacing
import com.android.wallpaper.R
import kotlinx.coroutines.flow.mapNotNull
import kotlinx.coroutines.launch

/** Bind between the clock settings screen and its view model. */
@@ -39,8 +43,11 @@ object ClockSettingsBinder {
    fun bind(
        view: View,
        viewModel: ClockSettingsViewModel,
        clockViewFactory: ClockViewFactory,
        lifecycleOwner: LifecycleOwner,
    ) {
        val clockHostView: FrameLayout = view.requireViewById(R.id.clock_host_view)

        val tabView: RecyclerView = view.requireViewById(R.id.tabs)
        val tabAdapter = ClockSettingsTabAdapter()
        tabView.adapter = tabAdapter
@@ -82,6 +89,25 @@ object ClockSettingsBinder {
        val colorOptionContainer = view.requireViewById<View>(R.id.color_picker_container)
        lifecycleOwner.lifecycleScope.launch {
            lifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) {
                launch {
                    viewModel.selectedClockId
                        .mapNotNull { it }
                        .collect { clockId ->
                            val clockView = clockViewFactory.getView(clockId)
                            (clockView.parent as? ViewGroup)?.removeView(clockView)
                            clockHostView.removeAllViews()
                            clockHostView.addView(clockView)
                        }
                }

                launch {
                    viewModel.seedColor.collect { seedColor ->
                        viewModel.selectedClockId.value?.let { selectedClockId ->
                            clockViewFactory.updateColor(selectedClockId, seedColor)
                        }
                    }
                }

                launch { viewModel.tabs.collect { tabAdapter.setItems(it) } }

                launch {
+12 −0
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@ import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.get
import com.android.customization.module.ThemePickerInjector
import com.android.customization.picker.clock.ui.binder.ClockSettingsBinder
import com.android.systemui.shared.clocks.shared.model.ClockPreviewConstants
import com.android.wallpaper.R
import com.android.wallpaper.module.InjectorProvider
import com.android.wallpaper.picker.AppbarFragment
@@ -95,6 +96,16 @@ class ClockSettingsFragment : AppbarFragment() {
                        onWallpaperColorChanged = { colors ->
                            colorViewModel.setLockWallpaperColors(colors)
                        },
                        initialExtrasProvider = {
                            Bundle().apply {
                                // Hide the clock from the system UI rendered preview so we can
                                // place the carousel on top of it.
                                putBoolean(
                                    ClockPreviewConstants.KEY_HIDE_CLOCK,
                                    true,
                                )
                            }
                        },
                    ),
                lifecycleOwner = this,
                offsetToStart = displayUtils.isOnWallpaperDisplay(activity),
@@ -111,6 +122,7 @@ class ClockSettingsFragment : AppbarFragment() {
                    ),
                )
                .get(),
            injector.getClockViewFactory(activity),
            this@ClockSettingsFragment,
        )

+11 −0
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@ package com.android.customization.picker.clock.ui.view

import android.app.Activity
import android.view.View
import androidx.annotation.ColorInt
import com.android.systemui.plugins.ClockController
import com.android.systemui.shared.clocks.ClockRegistry
import com.android.wallpaper.R
@@ -32,6 +33,16 @@ class ClockViewFactory(
        return (clockControllers[clockId] ?: initClockController(clockId)).largeClock.view
    }

    fun updateColorForAllClocks(@ColorInt seedColor: Int?) {
        clockControllers.values.forEach { it.events.onSeedColorChanged(seedColor = seedColor) }
    }

    fun updateColor(clockId: String, @ColorInt seedColor: Int?) {
        return (clockControllers[clockId] ?: initClockController(clockId))
            .events
            .onSeedColorChanged(seedColor)
    }

    private fun initClockController(clockId: String): ClockController {
        val controller =
            registry.createExampleClock(clockId).also { it?.initialize(activity.resources, 0f, 0f) }
Loading