Prevent recomputeDisableFlags from clobbering the system disable flags

- The disable() call on the binder thread can race with this call on
  the main thread due to this 1) fetching the old values on the main
  thread, then 2) trying to synchronize on mLock by calling disable()
  (which the binder thread is currently holding) and then 3) applying
  the previous flags immediately after the fresh disable flags are set
  by the binder call.

Bug: 205921118
Test: atest SystemUITests
Change-Id: I5dd4d2d248b6c1ab6d1677e2bb915100cd3e4f4e
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
index 6676901..5876703 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
@@ -513,9 +513,13 @@
      * @param animate {@code true} to show animations.
      */
     public void recomputeDisableFlags(int displayId, boolean animate) {
-        int disabled1 = getDisabled1(displayId);
-        int disabled2 = getDisabled2(displayId);
-        disable(displayId, disabled1, disabled2, animate);
+        // This must update holding the lock otherwise it can clobber the disabled flags set on the
+        // binder thread from the disable() call
+        synchronized (mLock) {
+            int disabled1 = getDisabled1(displayId);
+            int disabled2 = getDisabled2(displayId);
+            disable(displayId, disabled1, disabled2, animate);
+        }
     }
 
     private void setDisabled(int displayId, int disabled1, int disabled2) {