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

Commit 27c82d96 authored by George Lin's avatar George Lin
Browse files

Fix clock preview when changin clock size

There are cases that when changing clock sizes, the clock preview
appears wrongly. This is due to that we resue the clock view and do
config changes to the view while they are in the clock carousel.

We need to always reset it to the original config when getting the
view again.

Test: See bug. Manually tested that the preview shows correctly
Bug: 286012668
Change-Id: Ib8a464d1affda67cf8756ae8526d4b6301e6ff5e
parent 3d0a6e1b
Loading
Loading
Loading
Loading
+8 −8
Original line number Diff line number Diff line
@@ -176,23 +176,23 @@ object ClockSettingsBinder {
                            ::Pair,
                        )
                        .collect { (clockId, size) ->
                            clockHostView.removeAllViews()
                            val clockView =
                                if (size == ClockSize.DYNAMIC) {
                                    clockViewFactory.getLargeView(clockId)
                                } else {
                                    clockViewFactory.getSmallView(clockId)
                                when (size) {
                                    ClockSize.DYNAMIC -> clockViewFactory.getLargeView(clockId)
                                    ClockSize.SMALL -> clockViewFactory.getSmallView(clockId)
                                }
                            // The clock view might still be attached to an existing parent. Detach
                            // before adding to another parent.
                            (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()
                                        it.pivotX = it.width / 2F
                                        it.pivotY = it.height / 2F
                                    }
                                }
                                ClockSize.SMALL -> {
+14 −8
Original line number Diff line number Diff line
@@ -48,8 +48,8 @@ class ClockCarouselView(
    private lateinit var clockViewFactory: ClockViewFactory
    private var toCenterClockController: ClockController? = null
    private var offCenterClockController: ClockController? = null
    private var toCenterClockView: View? = null
    private var offCenterClockView: View? = null
    private var toCenterClockScaleView: View? = null
    private var offCenterClockScaleView: View? = null
    private var toCenterClockHostView: ClockHostView? = null
    private var offCenterClockHostView: ClockHostView? = null
    private var toCenterCardView: View? = null
@@ -125,8 +125,8 @@ class ClockCarouselView(
                    val scalingUpClockId = adapter.clockIds[scalingUpIdx]
                    offCenterClockController = clockViewFactory.getController(scalingDownClockId)
                    toCenterClockController = clockViewFactory.getController(scalingUpClockId)
                    offCenterClockView = motionLayout.findViewById(R.id.clock_scale_view_2)
                    toCenterClockView =
                    offCenterClockScaleView = motionLayout.findViewById(R.id.clock_scale_view_2)
                    toCenterClockScaleView =
                        motionLayout.findViewById(
                            if (endId == R.id.next) R.id.clock_scale_view_3
                            else R.id.clock_scale_view_1
@@ -166,10 +166,10 @@ class ClockCarouselView(
                        ?.onPickerCarouselSwiping(progress)
                    val scalingDownScale = getScalingDownScale(progress)
                    val scalingUpScale = getScalingUpScale(progress)
                    offCenterClockView?.scaleX = scalingDownScale
                    offCenterClockView?.scaleY = scalingDownScale
                    toCenterClockView?.scaleX = scalingUpScale
                    toCenterClockView?.scaleY = scalingUpScale
                    offCenterClockScaleView?.scaleX = scalingDownScale
                    offCenterClockScaleView?.scaleY = scalingDownScale
                    toCenterClockScaleView?.scaleX = scalingUpScale
                    toCenterClockScaleView?.scaleY = scalingUpScale
                }

                private fun onSmallClockViewTransition(progress: Float) {
@@ -339,6 +339,7 @@ class ClockCarouselView(
                        isMiddleView,
                        clockScaleView,
                        clockId,
                        clockHostView,
                    )
                ClockSize.SMALL ->
                    initializeSmallClockView(
@@ -354,7 +355,12 @@ class ClockCarouselView(
            isMiddleView: Boolean,
            clockScaleView: View,
            clockId: String,
            clockHostView: ClockHostView,
        ) {
            clockHostView.doOnPreDraw {
                it.pivotX = it.width / 2F
                it.pivotY = it.height / 2F
            }
            if (isMiddleView) {
                clockScaleView.scaleX = 1f
                clockScaleView.scaleY = 1f
+21 −6
Original line number Diff line number Diff line
@@ -53,16 +53,31 @@ class ClockViewFactory(
            ?: initClockController(clockId).also { clockControllers[clockId] = it }
    }

    /**
     * Reset the large view to its initial state when getting the view. This is because some view
     * configs, e.g. animation state, might change during the reuse of the clock view in the app.
     */
    fun getLargeView(clockId: String): View {
        return getController(clockId).largeClock.view
        return getController(clockId).largeClock.let {
            it.animations.onPickerCarouselSwiping(1F)
            it.view
        }
    }

    /**
     * Reset the small view to its initial state when getting the view. This is because some view
     * configs, e.g. translation X, might change during the reuse of the clock view in the app.
     */
    fun getSmallView(clockId: String): View {
        return smallClockFrames[clockId]
        val smallClockFrame =
            smallClockFrames[clockId]
                ?: createSmallClockFrame().also {
                    it.addView(getController(clockId).smallClock.view)
                    smallClockFrames[clockId] = it
                }
        smallClockFrame.translationX = 0F
        smallClockFrame.translationY = 0F
        return smallClockFrame
    }

    private fun createSmallClockFrame(): FrameLayout {