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

Commit e4e44e15 authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Fix infinite text change flicker in shade header day/date view" into main

parents 7cf37316 8cf0ab77
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -1011,6 +1011,7 @@ public class QuickSettingsController implements Dumpable {
                && mPanelViewControllerLazy.get().mAnimateBack) {
            mPanelViewControllerLazy.get().adjustBackAnimationScale(adjustedExpansionFraction);
        }
        mShadeExpansionStateManager.onQsExpansionFractionChanged(qsExpansionFraction);
        mMediaHierarchyManager.setQsExpansion(qsExpansionFraction);
        int qsPanelBottomY = calculateBottomPosition(qsExpansionFraction);
        mScrimController.setQsPosition(qsExpansionFraction, qsPanelBottomY);
+21 −0
Original line number Diff line number Diff line
@@ -38,6 +38,8 @@ class ShadeExpansionStateManager @Inject constructor() : ShadeStateEvents {
    private val expansionListeners = CopyOnWriteArrayList<ShadeExpansionListener>()
    private val fullExpansionListeners = CopyOnWriteArrayList<ShadeFullExpansionListener>()
    private val qsExpansionListeners = CopyOnWriteArrayList<ShadeQsExpansionListener>()
    private val qsExpansionFractionListeners =
        CopyOnWriteArrayList<ShadeQsExpansionFractionListener>()
    private val stateListeners = CopyOnWriteArrayList<ShadeStateListener>()
    private val shadeStateEventsListeners = CopyOnWriteArrayList<ShadeStateEventsListener>()

@@ -45,6 +47,7 @@ class ShadeExpansionStateManager @Inject constructor() : ShadeStateEvents {
    @FloatRange(from = 0.0, to = 1.0) private var fraction: Float = 0f
    private var expanded: Boolean = false
    private var qsExpanded: Boolean = false
    private var qsExpansionFraction = 0f
    private var tracking: Boolean = false
    private var dragDownPxAmount: Float = 0f

@@ -82,6 +85,15 @@ class ShadeExpansionStateManager @Inject constructor() : ShadeStateEvents {
        qsExpansionListeners.remove(listener)
    }

    fun addQsExpansionFractionListener(listener: ShadeQsExpansionFractionListener) {
        qsExpansionFractionListeners.add(listener)
        listener.onQsExpansionFractionChanged(qsExpansionFraction)
    }

    fun removeQsExpansionFractionListener(listener: ShadeQsExpansionFractionListener) {
        qsExpansionFractionListeners.remove(listener)
    }

    /** Adds a listener that will be notified when the panel state has changed. */
    fun addStateListener(listener: ShadeStateListener) {
        stateListeners.add(listener)
@@ -175,6 +187,15 @@ class ShadeExpansionStateManager @Inject constructor() : ShadeStateEvents {
        qsExpansionListeners.forEach { it.onQsExpansionChanged(qsExpanded) }
    }

    fun onQsExpansionFractionChanged(qsExpansionFraction: Float) {
        this.qsExpansionFraction = qsExpansionFraction

        debugLog("qsExpansionFraction=$qsExpansionFraction")
        qsExpansionFractionListeners.forEach {
            it.onQsExpansionFractionChanged(qsExpansionFraction)
        }
    }

    fun onShadeExpansionFullyChanged(isExpanded: Boolean) {
        this.expanded = isExpanded

+23 −0
Original line number Diff line number Diff line
/*
 * Copyright (c) 2022 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.systemui.shade

/** A listener interface to be notified of expansion events for the quick settings panel. */
fun interface ShadeQsExpansionFractionListener {
    /** Invoked whenever the quick settings expansion fraction changes */
    fun onQsExpansionFractionChanged(qsExpansionFraction: Float)
}
+2 −2
Original line number Diff line number Diff line
@@ -64,7 +64,7 @@ class VariableDateView(context: Context, attrs: AttributeSet) : TextView(context
    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
        val availableWidth = MeasureSpec.getSize(widthMeasureSpec) - paddingStart - paddingEnd
        if (MeasureSpec.getMode(widthMeasureSpec) != MeasureSpec.UNSPECIFIED && !freezeSwitching) {
            onMeasureListener?.onMeasureAction(availableWidth)
            onMeasureListener?.onMeasureAction(availableWidth, widthMeasureSpec)
        }
        super.onMeasure(widthMeasureSpec, heightMeasureSpec)
    }
@@ -74,6 +74,6 @@ class VariableDateView(context: Context, attrs: AttributeSet) : TextView(context
    }

    interface OnMeasureListener {
        fun onMeasureAction(availableWidth: Int)
        fun onMeasureAction(availableWidth: Int, widthMeasureSpec: Int)
    }
}
 No newline at end of file
+22 −1
Original line number Diff line number Diff line
@@ -28,9 +28,11 @@ import android.os.HandlerExecutor
import android.os.UserHandle
import android.text.TextUtils
import android.util.Log
import android.view.View.MeasureSpec
import androidx.annotation.VisibleForTesting
import com.android.systemui.Dependency
import com.android.systemui.broadcast.BroadcastDispatcher
import com.android.systemui.shade.ShadeExpansionStateManager
import com.android.systemui.util.ViewController
import com.android.systemui.util.time.SystemClock
import java.text.FieldPosition
@@ -80,6 +82,7 @@ private const val TAG = "VariableDateViewController"
class VariableDateViewController(
    private val systemClock: SystemClock,
    private val broadcastDispatcher: BroadcastDispatcher,
    private val shadeExpansionStateManager: ShadeExpansionStateManager,
    private val timeTickHandler: Handler,
    view: VariableDateView
) : ViewController<VariableDateView>(view) {
@@ -94,6 +97,7 @@ class VariableDateViewController(
                post(::updateClock)
            }
        }
    private var isQsExpanded = false
    private var lastWidth = Integer.MAX_VALUE
    private var lastText = ""
    private var currentTime = Date()
@@ -131,7 +135,11 @@ class VariableDateViewController(
    }

    private val onMeasureListener = object : VariableDateView.OnMeasureListener {
        override fun onMeasureAction(availableWidth: Int) {
        override fun onMeasureAction(availableWidth: Int, widthMeasureSpec: Int) {
            if (!isQsExpanded && MeasureSpec.getMode(widthMeasureSpec) == MeasureSpec.AT_MOST) {
                // ignore measured width from AT_MOST passes when in QQS (b/289489856)
                return
            }
            if (availableWidth != lastWidth) {
                // maybeChangeFormat will post if the pattern needs to change.
                maybeChangeFormat(availableWidth)
@@ -140,6 +148,15 @@ class VariableDateViewController(
        }
    }

    private fun onQsExpansionFractionChanged(qsExpansionFraction: Float) {
        val newIsQsExpanded = qsExpansionFraction > 0.5
        if (newIsQsExpanded != isQsExpanded) {
            isQsExpanded = newIsQsExpanded
            // manually trigger a measure pass midway through the transition from QS to QQS
            post { mView.measure(0, 0) }
        }
    }

    override fun onViewAttached() {
        val filter = IntentFilter().apply {
            addAction(Intent.ACTION_TIME_TICK)
@@ -151,6 +168,7 @@ class VariableDateViewController(
        broadcastDispatcher.registerReceiver(intentReceiver, filter,
                HandlerExecutor(timeTickHandler), UserHandle.SYSTEM)

        shadeExpansionStateManager.addQsExpansionFractionListener(::onQsExpansionFractionChanged)
        post(::updateClock)
        mView.onAttach(onMeasureListener)
    }
@@ -158,6 +176,7 @@ class VariableDateViewController(
    override fun onViewDetached() {
        dateFormat = null
        mView.onAttach(null)
        shadeExpansionStateManager.removeQsExpansionFractionListener(::onQsExpansionFractionChanged)
        broadcastDispatcher.unregisterReceiver(intentReceiver)
    }

@@ -211,12 +230,14 @@ class VariableDateViewController(
    class Factory @Inject constructor(
        private val systemClock: SystemClock,
        private val broadcastDispatcher: BroadcastDispatcher,
        private val shadeExpansionStateManager: ShadeExpansionStateManager,
        @Named(Dependency.TIME_TICK_HANDLER_NAME) private val handler: Handler
    ) {
        fun create(view: VariableDateView): VariableDateViewController {
            return VariableDateViewController(
                    systemClock,
                    broadcastDispatcher,
                    shadeExpansionStateManager,
                    handler,
                    view
            )
Loading