diff options
| author | 2023-03-25 12:26:39 +0000 | |
|---|---|---|
| committer | 2023-03-25 12:26:39 +0000 | |
| commit | a8e179cb60f42adf71d7bc83883dff23c72f811e (patch) | |
| tree | 633bac3c983106d9d2ad1eb347214c1040c04a7b | |
| parent | 0a3089376026e8e59fa750a2e56a2c758f398822 (diff) | |
| parent | 6a22e3710fe0751048f753f42a90074ede6b08ec (diff) | |
Merge "Remove pending runnables in QSTileView#changeState" into udc-dev
| -rw-r--r-- | packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileViewImpl.kt | 29 |
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 { |