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

Commit e0a0f51e authored by George Lin's avatar George Lin
Browse files

Introduce small clock on the settings screen

This is to introduce the small clock on the settings preview.

Test: Manually tested that the small clock shows correctly. See bug
Bug: 274927017
Change-Id: I6b7a741c06e0da2d97dd57d7d6c263cb69fd20b6
parent b1fe4288
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -176,6 +176,10 @@
    copied from sysui resources
    -->
    <dimen name="keyguard_large_clock_top_margin">-60dp</dimen>
    <!-- Dimension for the clock view, copied from sysui resources. -->
    <dimen name="small_clock_height">114dp</dimen>
    <dimen name="small_clock_padding_top">28dp</dimen>
    <dimen name="clock_padding_start">28dp</dimen>

    <dimen name="tab_touch_delegate_height_padding">8dp</dimen>
</resources>
+2 −2
Original line number Diff line number Diff line
@@ -15,8 +15,8 @@
 */
package com.android.customization.module

import android.app.Activity
import android.content.Context
import androidx.activity.ComponentActivity
import androidx.fragment.app.FragmentActivity
import com.android.customization.model.theme.OverlayManagerCompat
import com.android.customization.model.theme.ThemeBundleProvider
@@ -67,7 +67,7 @@ interface CustomizationInjector : Injector {
        interactor: ClockPickerInteractor,
    ): ClockCarouselViewModel.Factory

    fun getClockViewFactory(activity: Activity): ClockViewFactory
    fun getClockViewFactory(activity: ComponentActivity): ClockViewFactory

    fun getClockSettingsViewModelFactory(
        context: Context,
+27 −5
Original line number Diff line number Diff line
@@ -15,7 +15,6 @@
 */
package com.android.customization.module

import android.app.Activity
import android.app.UiModeManager
import android.content.Context
import android.content.Intent
@@ -25,6 +24,8 @@ import android.text.TextUtils
import androidx.activity.ComponentActivity
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentActivity
import androidx.lifecycle.DefaultLifecycleObserver
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.get
import com.android.customization.model.color.ColorCustomizationManager
@@ -80,6 +81,7 @@ import com.android.wallpaper.picker.customization.data.content.WallpaperClientIm
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 com.android.wallpaper.util.ScreenSizeCalculator
import kotlinx.coroutines.Dispatchers

open class ThemePickerInjector : WallpaperPicker2Injector(), CustomizationInjector {
@@ -101,7 +103,7 @@ open class ThemePickerInjector : WallpaperPicker2Injector(), CustomizationInject
    private var clockPickerInteractor: ClockPickerInteractor? = null
    private var clockSectionViewModel: ClockSectionViewModel? = null
    private var clockCarouselViewModelFactory: ClockCarouselViewModel.Factory? = null
    private var clockViewFactory: ClockViewFactory? = null
    private var clockViewFactories: MutableMap<Int, ClockViewFactory> = HashMap()
    private var notificationsInteractor: NotificationsInteractor? = null
    private var notificationSectionViewModelFactory: NotificationSectionViewModel.Factory? = null
    private var colorPickerInteractor: ColorPickerInteractor? = null
@@ -356,9 +358,29 @@ open class ThemePickerInjector : WallpaperPicker2Injector(), CustomizationInject
            }
    }

    override fun getClockViewFactory(activity: Activity): ClockViewFactory {
        return clockViewFactory
            ?: ClockViewFactory(activity, getClockRegistry(activity)).also { clockViewFactory = it }
    override fun getClockViewFactory(activity: ComponentActivity): ClockViewFactory {
        val activityHashCode = activity.hashCode()
        return clockViewFactories[activityHashCode]
            ?: ClockViewFactory(
                    activity.applicationContext,
                    ScreenSizeCalculator.getInstance()
                        .getScreenSize(activity.windowManager.defaultDisplay),
                    getClockRegistry(
                        activity.applicationContext,
                    ),
                )
                .also {
                    clockViewFactories[activityHashCode] = it
                    activity.lifecycle.addObserver(
                        object : DefaultLifecycleObserver {
                            override fun onDestroy(owner: LifecycleOwner) {
                                super.onDestroy(owner)
                                clockViewFactories[activityHashCode]?.onDestroy()
                                clockViewFactories.remove(activityHashCode)
                            }
                        }
                    )
                }
    }

    private fun getNotificationsInteractor(
+1 −1
Original line number Diff line number Diff line
@@ -91,7 +91,7 @@ object ClockCarouselViewBinder {
                launch {
                    viewModel.clockId.collect { clockId ->
                        singleClockHostView.removeAllViews()
                        val clockView = clockViewFactory.getView(clockId)
                        val clockView = clockViewFactory.getLargeView(clockId)
                        // The clock view might still be attached to an existing parent. Detach
                        // before adding to another parent.
                        (clockView.parent as? ViewGroup)?.removeView(clockView)
+35 −21
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@ import android.view.View
import android.view.ViewGroup
import android.widget.LinearLayout
import android.widget.SeekBar
import androidx.core.view.doOnPreDraw
import androidx.core.view.isInvisible
import androidx.core.view.isVisible
import androidx.lifecycle.Lifecycle
@@ -40,6 +41,7 @@ import com.android.customization.picker.color.ui.binder.ColorOptionIconBinder
import com.android.customization.picker.common.ui.view.ItemSpacing
import com.android.wallpaper.R
import com.android.wallpaper.picker.option.ui.binder.OptionItemBinder
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.mapNotNull
import kotlinx.coroutines.launch

@@ -90,17 +92,6 @@ 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 ->
@@ -176,15 +167,38 @@ object ClockSettingsBinder {
                }

                launch {
                    viewModel.selectedClockSize.collect { size ->
                    combine(
                            viewModel.selectedClockId.mapNotNull { it },
                            viewModel.selectedClockSize,
                            ::Pair,
                        )
                        .collect { (clockId, size) ->
                            val clockView =
                                if (size == ClockSize.DYNAMIC) {
                                    clockViewFactory.getLargeView(clockId)
                                } else {
                                    clockViewFactory.getSmallView(clockId)
                                }
                            (clockView.parent as? ViewGroup)?.removeView(clockView)
                            clockHostView.removeAllViews()
                            clockHostView.addView(clockView)

                            when (size) {
                                ClockSize.DYNAMIC -> {
                                    sizeOptions.radioButtonDynamic.isChecked = true
                                    sizeOptions.radioButtonSmall.isChecked = false
                                    clockHostView.doOnPreDraw {
                                        it.pivotX = (it.width / 2).toFloat()
                                        it.pivotY = (it.height / 2).toFloat()
                                    }
                                }
                                ClockSize.SMALL -> {
                                    sizeOptions.radioButtonDynamic.isChecked = false
                                    sizeOptions.radioButtonSmall.isChecked = true
                                    clockHostView.doOnPreDraw {
                                        it.pivotX = 0F
                                        it.pivotY = 0F
                                    }
                                }
                            }
                        }
Loading