summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Fabian Kozynski <kozynski@google.com> 2023-03-25 12:26:39 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2023-03-25 12:26:39 +0000
commita8e179cb60f42adf71d7bc83883dff23c72f811e (patch)
tree633bac3c983106d9d2ad1eb347214c1040c04a7b
parent0a3089376026e8e59fa750a2e56a2c758f398822 (diff)
parent6a22e3710fe0751048f753f42a90074ede6b08ec (diff)
Merge "Remove pending runnables in QSTileView#changeState" into udc-dev
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileViewImpl.kt29
1 files changed, 26 insertions, 3 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileViewImpl.kt b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileViewImpl.kt
index de1137e48074..3090b793552f 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileViewImpl.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileViewImpl.kt
@@ -310,9 +310,15 @@ open class QSTileViewImpl @JvmOverloads constructor(
}
override fun onStateChanged(state: QSTile.State) {
- post {
- handleStateChanged(state)
- }
+ // We cannot use the handler here because sometimes, the views are not attached (if they
+ // are in a page that the ViewPager hasn't attached). Instead, we use a runnable where
+ // all its instances are `equal` to each other, so they can be used to remove them from the
+ // queue.
+ // This means that at any given time there's at most one enqueued runnable to change state.
+ // However, as we only ever care about the last state posted, this is fine.
+ val runnable = StateChangeRunnable(state.copy())
+ removeCallbacks(runnable)
+ post(runnable)
}
override fun getDetailY(): Int {
@@ -650,6 +656,23 @@ open class QSTileViewImpl @JvmOverloads constructor(
secondaryLabel.currentTextColor,
chevronView.imageTintList?.defaultColor ?: 0
)
+
+ inner class StateChangeRunnable(private val state: QSTile.State) : Runnable {
+ override fun run() {
+ handleStateChanged(state)
+ }
+
+ // We want all instances of this runnable to be equal to each other, so they can be used to
+ // remove previous instances from the Handler/RunQueue of this view
+ override fun equals(other: Any?): Boolean {
+ return other is StateChangeRunnable
+ }
+
+ // This makes sure that all instances have the same hashcode (because they are `equal`)
+ override fun hashCode(): Int {
+ return StateChangeRunnable::class.hashCode()
+ }
+ }
}
fun constrainSquishiness(squish: Float): Float {