Merge "Reuse StateChange logic in SysUIState" into main
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/model/SysUIStateDispatcherTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/model/SysUIStateDispatcherTest.kt
index b82f5fc..ff2e13b 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/model/SysUIStateDispatcherTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/model/SysUIStateDispatcherTest.kt
@@ -81,7 +81,7 @@
     private companion object {
         const val DISPLAY_1 = 1
         const val DISPLAY_2 = 2
-        const val FLAG_1 = 10L
-        const val FLAG_2 = 20L
+        const val FLAG_1 = 1L
+        const val FLAG_2 = 2L
     }
 }
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/model/SysUiStateExtTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/model/SysUiStateExtTest.kt
index 09588f9..d1b5529 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/model/SysUiStateExtTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/model/SysUiStateExtTest.kt
@@ -35,10 +35,10 @@
 
     @Test
     fun updateFlags() {
-        underTest.updateFlags(Display.DEFAULT_DISPLAY, 1L to true, 2L to false, 3L to true)
+        underTest.updateFlags(Display.DEFAULT_DISPLAY, 1L to true, 2L to false, 4L to true)
 
         assertThat(underTest.flags and 1L).isNotEqualTo(0L)
         assertThat(underTest.flags and 2L).isEqualTo(0L)
-        assertThat(underTest.flags and 3L).isNotEqualTo(0L)
+        assertThat(underTest.flags and 4L).isNotEqualTo(0L)
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/model/SysUIStateChange.kt b/packages/SystemUI/src/com/android/systemui/model/SysUIStateChange.kt
index aaed606..cec846e 100644
--- a/packages/SystemUI/src/com/android/systemui/model/SysUIStateChange.kt
+++ b/packages/SystemUI/src/com/android/systemui/model/SysUIStateChange.kt
@@ -43,8 +43,6 @@
         return this
     }
 
-    fun hasChanges() = flagsToSet != 0L || flagsToClear != 0L
-
     /**
      * Applies all changed flags to [sysUiState].
      *
@@ -83,6 +81,7 @@
         iterateBits(flagsToSet or flagsToClear) { bit -> sysUiState.setFlag(bit, false) }
     }
 
+    /** Resets all the pending changes. */
     fun clear() {
         flagsToSet = 0
         flagsToClear = 0
diff --git a/packages/SystemUI/src/com/android/systemui/model/SysUiState.kt b/packages/SystemUI/src/com/android/systemui/model/SysUiState.kt
index e99ee7d..71cb745 100644
--- a/packages/SystemUI/src/com/android/systemui/model/SysUiState.kt
+++ b/packages/SystemUI/src/com/android/systemui/model/SysUiState.kt
@@ -22,6 +22,7 @@
 import com.android.systemui.display.data.repository.PerDisplayInstanceProviderWithTeardown
 import com.android.systemui.dump.DumpManager
 import com.android.systemui.model.SysUiState.SysUiStateCallback
+import com.android.systemui.shade.shared.flag.ShadeWindowGoesAround
 import com.android.systemui.shared.system.QuickStepContract
 import com.android.systemui.shared.system.QuickStepContract.SystemUiStateFlags
 import dagger.assisted.Assisted
@@ -29,6 +30,7 @@
 import dagger.assisted.AssistedInject
 import dalvik.annotation.optimization.NeverCompile
 import java.io.PrintWriter
+import java.lang.Long.bitCount
 import javax.inject.Inject
 
 /** Contains sysUi state flags and notifies registered listeners whenever changes happen. */
@@ -111,8 +113,7 @@
         get() = _flags
 
     private var _flags: Long = 0
-    private var flagsToSet: Long = 0
-    private var flagsToClear: Long = 0
+    private val stateChange = StateChange()
 
     /**
      * Add listener to be notified of changes made to SysUI state. The callback will also be called
@@ -132,13 +133,11 @@
 
     /** Methods to this call can be chained together before calling [.commitUpdate]. */
     override fun setFlag(@SystemUiStateFlags flag: Long, enabled: Boolean): SysUiState {
-        val toSet = flagWithOptionalOverrides(flag, enabled, displayId, sceneContainerPlugin)
-
-        if (toSet) {
-            flagsToSet = flagsToSet or flag
-        } else {
-            flagsToClear = flagsToClear or flag
+        if (ShadeWindowGoesAround.isEnabled && bitCount(flag) > 1) {
+            error("Flags should be a single bit.")
         }
+        val toSet = flagWithOptionalOverrides(flag, enabled, displayId, sceneContainerPlugin)
+        stateChange.setFlag(flag, toSet)
         return this
     }
 
@@ -147,27 +146,19 @@
         ReplaceWith("commitUpdate()"),
     )
     override fun commitUpdate(displayId: Int) {
-        // TODO b/398011576 - handle updates for different displays.
         commitUpdate()
     }
 
     override fun commitUpdate() {
-        updateFlags()
-        flagsToSet = 0
-        flagsToClear = 0
-    }
-
-    private fun updateFlags() {
-        var newState = flags
-        newState = newState or flagsToSet
-        newState = newState and flagsToClear.inv()
+        val newState = stateChange.applyTo(flags)
         notifyAndSetSystemUiStateChanged(newState, flags)
+        stateChange.clear()
     }
 
     /** Notify all those who are registered that the state has changed. */
     private fun notifyAndSetSystemUiStateChanged(newFlags: Long, oldFlags: Long) {
         if (SysUiState.DEBUG) {
-            Log.d(TAG, "SysUiState changed: old=$oldFlags new=$newFlags")
+            Log.d(TAG, "SysUiState changed for displayId=$displayId: old=$oldFlags new=$newFlags")
         }
         if (newFlags != oldFlags) {
             _flags = newFlags
@@ -185,6 +176,8 @@
         pw.println(QuickStepContract.isBackGestureDisabled(flags, false /* forTrackpad */))
         pw.print("    assistantGestureDisabled=")
         pw.println(QuickStepContract.isAssistantGestureDisabled(flags))
+        pw.print("    pendingStateChanges=")
+        pw.println(stateChange.toString())
     }
 
     override fun destroy() {