Loading packages/SystemUI/src/com/android/systemui/shade/QuickSettingsController.java +1 −0 Original line number Diff line number Diff line Loading @@ -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); Loading packages/SystemUI/src/com/android/systemui/shade/ShadeExpansionStateManager.kt +21 −0 Original line number Diff line number Diff line Loading @@ -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>() Loading @@ -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 Loading Loading @@ -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) Loading Loading @@ -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 Loading packages/SystemUI/src/com/android/systemui/shade/ShadeQsExpansionFractionListener.kt 0 → 100644 +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) } packages/SystemUI/src/com/android/systemui/statusbar/policy/VariableDateView.kt +2 −2 Original line number Diff line number Diff line Loading @@ -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) } Loading @@ -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 packages/SystemUI/src/com/android/systemui/statusbar/policy/VariableDateViewController.kt +22 −1 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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) { Loading @@ -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() Loading Loading @@ -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) Loading @@ -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) Loading @@ -151,6 +168,7 @@ class VariableDateViewController( broadcastDispatcher.registerReceiver(intentReceiver, filter, HandlerExecutor(timeTickHandler), UserHandle.SYSTEM) shadeExpansionStateManager.addQsExpansionFractionListener(::onQsExpansionFractionChanged) post(::updateClock) mView.onAttach(onMeasureListener) } Loading @@ -158,6 +176,7 @@ class VariableDateViewController( override fun onViewDetached() { dateFormat = null mView.onAttach(null) shadeExpansionStateManager.removeQsExpansionFractionListener(::onQsExpansionFractionChanged) broadcastDispatcher.unregisterReceiver(intentReceiver) } Loading Loading @@ -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 Loading
packages/SystemUI/src/com/android/systemui/shade/QuickSettingsController.java +1 −0 Original line number Diff line number Diff line Loading @@ -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); Loading
packages/SystemUI/src/com/android/systemui/shade/ShadeExpansionStateManager.kt +21 −0 Original line number Diff line number Diff line Loading @@ -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>() Loading @@ -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 Loading Loading @@ -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) Loading Loading @@ -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 Loading
packages/SystemUI/src/com/android/systemui/shade/ShadeQsExpansionFractionListener.kt 0 → 100644 +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) }
packages/SystemUI/src/com/android/systemui/statusbar/policy/VariableDateView.kt +2 −2 Original line number Diff line number Diff line Loading @@ -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) } Loading @@ -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
packages/SystemUI/src/com/android/systemui/statusbar/policy/VariableDateViewController.kt +22 −1 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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) { Loading @@ -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() Loading Loading @@ -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) Loading @@ -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) Loading @@ -151,6 +168,7 @@ class VariableDateViewController( broadcastDispatcher.registerReceiver(intentReceiver, filter, HandlerExecutor(timeTickHandler), UserHandle.SYSTEM) shadeExpansionStateManager.addQsExpansionFractionListener(::onQsExpansionFractionChanged) post(::updateClock) mView.onAttach(onMeasureListener) } Loading @@ -158,6 +176,7 @@ class VariableDateViewController( override fun onViewDetached() { dateFormat = null mView.onAttach(null) shadeExpansionStateManager.removeQsExpansionFractionListener(::onQsExpansionFractionChanged) broadcastDispatcher.unregisterReceiver(intentReceiver) } Loading Loading @@ -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