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

Commit 5dfe09d2 authored by Hawkwood's avatar Hawkwood
Browse files

Refactor clock resource ids

This intends to remove as many instances of resource lookups by name
as possible in the custom clocks and related code. These have been a
source of bugs, and by creating a common lib, we can directly share
resources to every context where they are needed.

Bug: 364680879
Test: Checked rebuilt plugins
Flag: NONE API & Build config change
Change-Id: Ib12e9cd05d0688e241bbf361a6408f9f2f23c202
parent 724fd7a9
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -55,7 +55,6 @@ class ClockRegistryProvider(
            isEnabled = flags.isCustomClocksEnabled(context),
            handleAllUsers = false,
            DefaultClockProvider(
                ctx = context,
                layoutInflater = LayoutInflater.from(context),
                resources = context.resources,
                isClockReactiveVariantsEnabled = flags.isClockReactiveVariantsEnabled(),
+13 −18
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@ import android.view.View
import android.view.View.MeasureSpec.EXACTLY
import android.view.ViewGroup
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.constraintlayout.widget.ConstraintSet
import com.android.customization.picker.clock.shared.ClockSize
import com.android.systemui.plugins.clocks.ClockController
import com.android.wallpaper.util.ScreenSizeCalculator
@@ -43,30 +44,24 @@ class ClockConstraintLayoutHostView(context: Context, attrs: AttributeSet?) :
    }

    companion object {
        fun addClockViews(
        fun ClockConstraintLayoutHostView.addClockViews(
            clockController: ClockController,
            rootView: ClockConstraintLayoutHostView,
            size: ClockSize,
            cs: ConstraintSet,
        ) {
            clockController.let { clock ->
                val layout =
                    when (size) {
                    ClockSize.DYNAMIC -> {
                        clock.largeClock.layout.views.forEach {
                            if (it.parent != null) {
                                (it.parent as ViewGroup).removeView(it)
                            }
                            rootView.addView(it).apply { it.visibility = View.VISIBLE }
                        }
                        ClockSize.DYNAMIC -> clock.largeClock.layout
                        ClockSize.SMALL -> clock.smallClock.layout
                    }
                layout.views.forEach { view ->
                    (view.parent as? ViewGroup)?.let { it.removeView(view) }
                    this.addView(view)

                    ClockSize.SMALL -> {
                        clock.smallClock.layout.views.forEach {
                            if (it.parent != null) {
                                (it.parent as ViewGroup).removeView(it)
                            }
                            rootView.addView(it).apply { it.visibility = View.VISIBLE }
                        }
                    }
                    // Set the view to be invisible until the constraint set is applied
                    view.visibility = View.INVISIBLE
                    cs.setVisibility(view.id, View.VISIBLE)
                }
            }
        }
+13 −54
Original line number Diff line number Diff line
@@ -18,13 +18,13 @@ package com.android.customization.picker.clock.ui.view
import android.app.Activity
import android.app.WallpaperColors
import android.app.WallpaperManager
import android.content.Context
import android.graphics.Rect
import android.view.View
import android.widget.FrameLayout
import androidx.annotation.ColorInt
import androidx.lifecycle.LifecycleOwner
import com.android.internal.policy.SystemBarUtils
import com.android.systemui.customization.clocks.ContextUtil.getSafeStatusBarHeight
import com.android.systemui.customization.clocks.R as clocksR
import com.android.systemui.plugins.clocks.ClockAxisStyle
import com.android.systemui.plugins.clocks.ClockController
import com.android.systemui.plugins.clocks.ClockFaceController.Companion.updateTheme
@@ -98,9 +98,7 @@ constructor(
        val layoutParams =
            FrameLayout.LayoutParams(
                FrameLayout.LayoutParams.WRAP_CONTENT,
                resources.getDimensionPixelSize(
                    com.android.systemui.customization.R.dimen.small_clock_height
                ),
                resources.getDimensionPixelSize(clocksR.dimen.small_clock_height),
            )
        layoutParams.topMargin = getSmallClockTopMargin()
        layoutParams.marginStart = getSmallClockStartPadding()
@@ -110,18 +108,12 @@ constructor(
    }

    private fun getSmallClockTopMargin() =
        getStatusBarHeight(appContext) +
            appContext.resources.getDimensionPixelSize(
                com.android.systemui.customization.R.dimen.small_clock_padding_top
            )
        activity.getSafeStatusBarHeight() +
            appContext.resources.getDimensionPixelSize(clocksR.dimen.small_clock_padding_top)

    private fun getSmallClockStartPadding() =
        appContext.resources.getDimensionPixelSize(
            com.android.systemui.customization.R.dimen.clock_padding_start
        ) +
            appContext.resources.getDimensionPixelSize(
                com.android.systemui.customization.R.dimen.status_view_margin_horizontal
            )
        appContext.resources.getDimensionPixelSize(clocksR.dimen.clock_padding_start) +
            appContext.resources.getDimensionPixelSize(clocksR.dimen.status_view_margin_horizontal)

    override fun updateColorForAllClocks(@ColorInt seedColor: Int?) {
        clockControllers.values.forEach {
@@ -196,26 +188,18 @@ constructor(

    private fun initClockController(clockId: String): ClockController? {
        val isWallpaperDark = isLockscreenWallpaperDark()
        return registry.createExampleClock(clockId)?.also { controller ->
        return registry.createExampleClock(activity, clockId)?.also { controller ->
            controller.initialize(isWallpaperDark, 0f, 0f, null)

            // Initialize large clock
            controller.largeClock.events.onFontSettingChanged(
                resources
                    .getDimensionPixelSize(
                        com.android.systemui.customization.R.dimen.large_clock_text_size
                    )
                    .toFloat()
                resources.getDimensionPixelSize(clocksR.dimen.large_clock_text_size).toFloat()
            )
            controller.largeClock.events.onTargetRegionChanged(getLargeClockRegion())

            // Initialize small clock
            controller.smallClock.events.onFontSettingChanged(
                resources
                    .getDimensionPixelSize(
                        com.android.systemui.customization.R.dimen.small_clock_text_size
                    )
                    .toFloat()
                resources.getDimensionPixelSize(clocksR.dimen.small_clock_text_size).toFloat()
            )
            controller.smallClock.events.onTargetRegionChanged(getSmallClockRegion())
            controller.events.onWeatherDataChanged(WeatherData.getPlaceholderWeatherData())
@@ -229,13 +213,8 @@ constructor(
     */
    private fun getLargeClockRegion(): Rect {
        val largeClockTopMargin =
            resources.getDimensionPixelSize(
                com.android.systemui.customization.R.dimen.keyguard_large_clock_top_margin
            )
        val targetHeight =
            resources.getDimensionPixelSize(
                com.android.systemui.customization.R.dimen.large_clock_text_size
            ) * 2
            resources.getDimensionPixelSize(clocksR.dimen.keyguard_large_clock_top_margin)
        val targetHeight = resources.getDimensionPixelSize(clocksR.dimen.large_clock_text_size) * 2
        val top = (screenSize.y / 2 - targetHeight / 2 + largeClockTopMargin / 2)
        return Rect(0, top, screenSize.x, (top + targetHeight))
    }
@@ -247,27 +226,7 @@ constructor(
     */
    private fun getSmallClockRegion(): Rect {
        val topMargin = getSmallClockTopMargin()
        val targetHeight =
            resources.getDimensionPixelSize(
                com.android.systemui.customization.R.dimen.small_clock_height
            )
        val targetHeight = resources.getDimensionPixelSize(clocksR.dimen.small_clock_height)
        return Rect(getSmallClockStartPadding(), topMargin, screenSize.x, topMargin + targetHeight)
    }

    companion object {
        private fun getStatusBarHeight(context: Context): Int {
            val display = context.displayNoVerify
            if (display != null) {
                return SystemBarUtils.getStatusBarHeight(context.resources, display.cutout)
            }

            var result = 0
            val resourceId: Int =
                context.resources.getIdentifier("status_bar_height", "dimen", "android")
            if (resourceId > 0) {
                result = context.resources.getDimensionPixelSize(resourceId)
            }
            return result
        }
    }
}
+5 −24
Original line number Diff line number Diff line
@@ -41,7 +41,6 @@ import com.android.customization.picker.color.ui.view.ColorOptionIconView2
import com.android.customization.picker.color.ui.viewmodel.ColorOptionIconViewModel
import com.android.customization.picker.settings.ui.binder.ColorContrastSectionViewBinder2
import com.android.systemui.plugins.clocks.ClockAxisStyle
import com.android.systemui.plugins.clocks.ClockPreviewConfig
import com.android.systemui.shared.Flags
import com.android.themepicker.R
import com.android.wallpaper.config.BaseFlags
@@ -528,30 +527,12 @@ constructor(private val defaultCustomizationOptionsBinder: DefaultCustomizationO
                            clockHostView.removeAllViews()
                            // For new customization picker, we should get views from clocklayout
                            if (Flags.newCustomizationPickerUi()) {
                                clockViewFactory.getController(clock.clockId)?.let { clockController
                                    ->
                                    val udfpsTop =
                                        clockPickerViewModel.getUdfpsLocation()?.let {
                                            it.centerY - it.radius
                                        }
                                    val previewConfig =
                                        ClockPreviewConfig(
                                            context = context,
                                            isShadeLayoutWide =
                                                clockPickerViewModel.getIsShadeLayoutWide(),
                                            isSceneContainerFlagEnabled = false,
                                            udfpsTop = udfpsTop,
                                        )
                                    addClockViews(clockController, clockHostView, size)
                                clockViewFactory.getController(clock.clockId)?.run {
                                    val cs = ConstraintSet()
                                    clockController.largeClock.layout.applyPreviewConstraints(
                                        previewConfig,
                                        cs,
                                    )
                                    clockController.smallClock.layout.applyPreviewConstraints(
                                        previewConfig,
                                        cs,
                                    )
                                    clockHostView.addClockViews(this, size, cs)
                                    val cfg = clockPickerViewModel.buildPreviewConfig(context)
                                    largeClock.layout.applyPreviewConstraints(cfg, cs)
                                    smallClock.layout.applyPreviewConstraints(cfg, cs)
                                    cs.applyTo(clockHostView)
                                }
                            } else {
+13 −0
Original line number Diff line number Diff line
@@ -28,9 +28,11 @@ import com.android.customization.picker.clock.shared.model.ClockMetadataModel
import com.android.customization.picker.clock.ui.viewmodel.ClockColorViewModel
import com.android.customization.picker.color.domain.interactor.ColorPickerInteractor2
import com.android.customization.picker.color.ui.viewmodel.ColorOptionIconViewModel
import com.android.internal.policy.SystemBarUtils
import com.android.systemui.plugins.clocks.AxisPresetConfig
import com.android.systemui.plugins.clocks.AxisPresetConfig.IndexedStyle
import com.android.systemui.plugins.clocks.ClockAxisStyle
import com.android.systemui.plugins.clocks.ClockPreviewConfig
import com.android.themepicker.R
import com.android.wallpaper.picker.common.icon.ui.viewmodel.Icon
import com.android.wallpaper.picker.common.text.ui.viewmodel.Text
@@ -522,6 +524,17 @@ constructor(
        onApplyClicked.value = false
    }

    suspend fun buildPreviewConfig(previewContext: Context): ClockPreviewConfig {
        return ClockPreviewConfig(
            isShadeLayoutWide = getIsShadeLayoutWide(),
            isSceneContainerFlagEnabled = false,
            udfpsTop = getUdfpsLocation()?.let { it.centerY - it.radius },
            statusBarHeight = SystemBarUtils.getStatusBarHeight(previewContext),
            splitShadeTopMargin = 0,
            clockTopMargin = 0,
        )
    }

    companion object {
        private const val DEFAULT_CLOCK_COLOR_ID = "DEFAULT"
        private val helperColorLab: DoubleArray by lazy { DoubleArray(3) }