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

Commit 644c7902 authored by George Lin's avatar George Lin Committed by Automerger Merge Worker
Browse files

Introduce small clock on the settings screen am: e0a0f51e

parents 7c1db8b0 e0a0f51e
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