Revert "Window Manager Flag Migration (4/n)"

This reverts commit cb1b848084be47118342c4893ede2298067c3d0f.

Reason for revert: Droidcop-triggered revert due to b/142849532

Change-Id: If81eba4e979e21202e78839bb1afbc66691098d2
diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/statusbar/StatusBarStateController.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/statusbar/StatusBarStateController.java
index 208d3b6..fe547a0a 100644
--- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/statusbar/StatusBarStateController.java
+++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/statusbar/StatusBarStateController.java
@@ -95,6 +95,11 @@
         default void onDozeAmountChanged(float linear, float eased) {}
 
         /**
+         * Callback to be notified when the sysui visibility changes
+         */
+        default void onSystemUiVisibilityChanged(int visibility) {}
+
+        /**
          * Callback to be notified when the pulsing state changes
          */
         default void onPulsingChanged(boolean pulsing) {}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
index c9dc08e..d6a8f90 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
@@ -22,8 +22,6 @@
 import static android.inputmethodservice.InputMethodService.IME_INVISIBLE;
 import static android.view.Display.DEFAULT_DISPLAY;
 import static android.view.Display.INVALID_DISPLAY;
-import static android.view.InsetsState.TYPE_NAVIGATION_BAR;
-import static android.view.InsetsState.TYPE_TOP_BAR;
 
 import static com.android.systemui.statusbar.phone.StatusBar.ONLY_CORE_APPS;
 
@@ -45,17 +43,12 @@
 import android.os.Message;
 import android.util.Pair;
 import android.util.SparseArray;
-import android.view.InsetsFlags;
-import android.view.InsetsState.InternalInsetType;
-import android.view.View;
-import android.view.WindowInsetsController.Appearance;
 
 import androidx.annotation.VisibleForTesting;
 
 import com.android.internal.os.SomeArgs;
 import com.android.internal.statusbar.IStatusBar;
 import com.android.internal.statusbar.StatusBarIcon;
-import com.android.internal.view.AppearanceRegion;
 import com.android.systemui.SystemUI;
 import com.android.systemui.statusbar.CommandQueue.Callbacks;
 import com.android.systemui.statusbar.policy.CallbackController;
@@ -83,7 +76,7 @@
     private static final int MSG_EXPAND_NOTIFICATIONS          = 3 << MSG_SHIFT;
     private static final int MSG_COLLAPSE_PANELS               = 4 << MSG_SHIFT;
     private static final int MSG_EXPAND_SETTINGS               = 5 << MSG_SHIFT;
-    private static final int MSG_SYSTEM_BAR_APPEARANCE_CHANGED = 6 << MSG_SHIFT;
+    private static final int MSG_SET_SYSTEMUI_VISIBILITY       = 6 << MSG_SHIFT;
     private static final int MSG_DISPLAY_READY                 = 7 << MSG_SHIFT;
     private static final int MSG_SHOW_IME_BUTTON               = 8 << MSG_SHIFT;
     private static final int MSG_TOGGLE_RECENT_APPS            = 9 << MSG_SHIFT;
@@ -122,9 +115,6 @@
     private static final int MSG_SHOW_PINNING_TOAST_ENTER_EXIT = 45 << MSG_SHIFT;
     private static final int MSG_SHOW_PINNING_TOAST_ESCAPE     = 46 << MSG_SHIFT;
     private static final int MSG_RECENTS_ANIMATION_STATE_CHANGED = 47 << MSG_SHIFT;
-    private static final int MSG_SHOW_TRANSIENT                = 48 << MSG_SHIFT;
-    private static final int MSG_ABORT_TRANSIENT               = 49 << MSG_SHIFT;
-    private static final int MSG_TOP_APP_WINDOW_CHANGED        = 50 << MSG_SHIFT;
 
     public static final int FLAG_EXCLUDE_NONE = 0;
     public static final int FLAG_EXCLUDE_SEARCH_PANEL = 1 << 0;
@@ -170,6 +160,28 @@
         default void animateExpandSettingsPanel(String obj) { }
 
         /**
+         * Called to notify visibility flag changes.
+         * @see IStatusBar#setSystemUiVisibility(int, int, int, int, int, Rect, Rect).
+         *
+         * @param displayId The id of the display to notify.
+         * @param vis The visibility flags except SYSTEM_UI_FLAG_LIGHT_STATUS_BAR which will
+         *            be reported separately in fullscreenStackVis and dockedStackVis.
+         * @param fullscreenStackVis The flags which only apply in the region of the fullscreen
+         *                           stack, which is currently only SYSTEM_UI_FLAG_LIGHT_STATUS_BAR.
+         * @param dockedStackVis The flags that only apply in the region of the docked stack, which
+         *                       is currently only SYSTEM_UI_FLAG_LIGHT_STATUS_BAR.
+         * @param mask Which flags to change.
+         * @param fullscreenStackBounds The current bounds of the fullscreen stack, in screen
+         *                              coordinates.
+         * @param dockedStackBounds The current bounds of the docked stack, in screen coordinates.
+         * @param navbarColorManagedByIme {@code true} if navigation bar color is managed by IME.
+         */
+        default void setSystemUiVisibility(int displayId, int vis, int fullscreenStackVis,
+                int dockedStackVis, int mask, Rect fullscreenStackBounds, Rect dockedStackBounds,
+                boolean navbarColorManagedByIme) {
+        }
+
+        /**
          * Called to notify IME window status changes.
          *
          * @param displayId The id of the display to notify.
@@ -280,28 +292,6 @@
          * @see IStatusBar#onRecentsAnimationStateChanged(boolean)
          */
         default void onRecentsAnimationStateChanged(boolean running) { }
-
-        /**
-         * @see IStatusBar#onSystemBarAppearanceChanged(int, int, AppearanceRegion[], boolean).
-         */
-        default void onSystemBarAppearanceChanged(int displayId, @Appearance int appearance,
-                AppearanceRegion[] appearanceRegions, boolean navbarColorManagedByIme) { }
-
-        /**
-         * @see IStatusBar#showTransient(int, int[]).
-         */
-        default void showTransient(int displayId, @InternalInsetType int[] types) { }
-
-        /**
-         * @see IStatusBar#abortTransient(int, int[]).
-         */
-        default void abortTransient(int displayId, @InternalInsetType int[] types) { }
-
-        /**
-         * @see IStatusBar#topAppWindowChanged(int, boolean, boolean).
-         */
-        default void topAppWindowChanged(int displayId, boolean isFullscreen, boolean isImmersive) {
-        }
     }
 
     @VisibleForTesting
@@ -466,53 +456,28 @@
         }
     }
 
-    // TODO(b/118118435): Remove this function after migration
     @Override
     public void setSystemUiVisibility(int displayId, int vis, int fullscreenStackVis,
             int dockedStackVis, int mask, Rect fullscreenStackBounds, Rect dockedStackBounds,
             boolean navbarColorManagedByIme) {
         synchronized (mLock) {
-            final boolean hasDockedStack = !dockedStackBounds.isEmpty();
-            final boolean transientStatus = (vis & View.STATUS_BAR_TRANSIENT) != 0;
-            final boolean transientNavigation = (vis & View.NAVIGATION_BAR_TRANSIENT) != 0;
-            if (transientStatus && transientNavigation) {
-                showTransient(displayId, new int[]{TYPE_TOP_BAR, TYPE_NAVIGATION_BAR});
-            } else if (transientStatus) {
-                showTransient(displayId, new int[]{TYPE_TOP_BAR});
-                abortTransient(displayId, new int[]{TYPE_NAVIGATION_BAR});
-            } else if (transientNavigation) {
-                showTransient(displayId, new int[]{TYPE_NAVIGATION_BAR});
-                abortTransient(displayId, new int[]{TYPE_TOP_BAR});
-            } else {
-                abortTransient(displayId, new int[]{TYPE_TOP_BAR, TYPE_NAVIGATION_BAR});
-            }
+            // Don't coalesce these, since it might have one time flags set such as
+            // STATUS_BAR_UNHIDE which might get lost.
             SomeArgs args = SomeArgs.obtain();
             args.argi1 = displayId;
-            args.argi2 = InsetsFlags.getAppearance(vis);
-            args.argi3 = navbarColorManagedByIme ? 1 : 0;
-            final int fullscreenAppearance = InsetsFlags.getAppearance(fullscreenStackVis);
-            final int dockedAppearance = InsetsFlags.getAppearance(dockedStackVis);
-            args.arg1 = hasDockedStack
-                    ? new AppearanceRegion[]{
-                            new AppearanceRegion(fullscreenAppearance, fullscreenStackBounds),
-                            new AppearanceRegion(dockedAppearance, dockedStackBounds)}
-                    : new AppearanceRegion[]{
-                            new AppearanceRegion(fullscreenAppearance, fullscreenStackBounds)};
-            mHandler.obtainMessage(MSG_SYSTEM_BAR_APPEARANCE_CHANGED, args).sendToTarget();
+            args.argi2 = vis;
+            args.argi3 = fullscreenStackVis;
+            args.argi4 = dockedStackVis;
+            args.argi5 = mask;
+            args.argi6 = navbarColorManagedByIme ? 1 : 0;
+            args.arg1 = fullscreenStackBounds;
+            args.arg2 = dockedStackBounds;
+            mHandler.obtainMessage(MSG_SET_SYSTEMUI_VISIBILITY, args).sendToTarget();
         }
     }
 
     @Override
-    public void topAppWindowChanged(int displayId, boolean isFullscreen, boolean isImmersive) {
-        synchronized (mLock) {
-            SomeArgs args = SomeArgs.obtain();
-            args.argi1 = displayId;
-            args.argi2 = isFullscreen ? 1 : 0;
-            args.argi3 = isImmersive ? 1 : 0;
-            mHandler.obtainMessage(MSG_TOP_APP_WINDOW_CHANGED, args).sendToTarget();
-        }
-
-    }
+    public void topAppWindowChanged(int displayId, boolean menuVisible) { }
 
     @Override
     public void setImeWindowStatus(int displayId, IBinder token, int vis, int backDisposition,
@@ -862,33 +827,6 @@
         }
     }
 
-    @Override
-    public void onSystemBarAppearanceChanged(int displayId, @Appearance int appearance,
-            AppearanceRegion[] appearanceRegions, boolean navbarColorManagedByIme) {
-        synchronized (mLock) {
-            SomeArgs args = SomeArgs.obtain();
-            args.argi1 = displayId;
-            args.argi2 = appearance;
-            args.argi3 = navbarColorManagedByIme ? 1 : 0;
-            args.arg1 = appearanceRegions;
-            mHandler.obtainMessage(MSG_SYSTEM_BAR_APPEARANCE_CHANGED, args).sendToTarget();
-        }
-    }
-
-    @Override
-    public void showTransient(int displayId, int[] types) {
-        synchronized (mLock) {
-            mHandler.obtainMessage(MSG_SHOW_TRANSIENT, displayId, 0, types).sendToTarget();
-        }
-    }
-
-    @Override
-    public void abortTransient(int displayId, int[] types) {
-        synchronized (mLock) {
-            mHandler.obtainMessage(MSG_ABORT_TRANSIENT, displayId, 0, types).sendToTarget();
-        }
-    }
-
     private final class H extends Handler {
         private H(Looper l) {
             super(l);
@@ -941,6 +879,15 @@
                         mCallbacks.get(i).animateExpandSettingsPanel((String) msg.obj);
                     }
                     break;
+                case MSG_SET_SYSTEMUI_VISIBILITY:
+                    args = (SomeArgs) msg.obj;
+                    for (int i = 0; i < mCallbacks.size(); i++) {
+                        mCallbacks.get(i).setSystemUiVisibility(args.argi1, args.argi2, args.argi3,
+                                args.argi4, args.argi5, (Rect) args.arg1, (Rect) args.arg2,
+                                args.argi6 == 1);
+                    }
+                    args.recycle();
+                    break;
                 case MSG_SHOW_IME_BUTTON:
                     args = (SomeArgs) msg.obj;
                     handleShowImeButton(args.argi1 /* displayId */, (IBinder) args.arg1 /* token */,
@@ -1147,39 +1094,6 @@
                         mCallbacks.get(i).onRecentsAnimationStateChanged(msg.arg1 > 0);
                     }
                     break;
-                case MSG_SYSTEM_BAR_APPEARANCE_CHANGED:
-                    args = (SomeArgs) msg.obj;
-                    for (int i = 0; i < mCallbacks.size(); i++) {
-                        mCallbacks.get(i).onSystemBarAppearanceChanged(args.argi1, args.argi2,
-                                (AppearanceRegion[]) args.arg1, args.argi3 == 1);
-                    }
-                    args.recycle();
-                    break;
-                case MSG_SHOW_TRANSIENT: {
-                    final int displayId = msg.arg1;
-                    final int[] types = (int[]) msg.obj;
-                    for (int i = 0; i < mCallbacks.size(); i++) {
-                        mCallbacks.get(i).showTransient(displayId, types);
-                    }
-                    break;
-                }
-                case MSG_ABORT_TRANSIENT: {
-                    final int displayId = msg.arg1;
-                    final int[] types = (int[]) msg.obj;
-                    for (int i = 0; i < mCallbacks.size(); i++) {
-                        mCallbacks.get(i).abortTransient(displayId, types);
-                    }
-                    break;
-                }
-                case MSG_TOP_APP_WINDOW_CHANGED: {
-                    args = (SomeArgs) msg.obj;
-                    for (int i = 0; i < mCallbacks.size(); i++) {
-                        mCallbacks.get(i).topAppWindowChanged(
-                                args.argi1, args.argi2 != 0, args.argi3 != 0);
-                    }
-                    args.recycle();
-                    break;
-                }
             }
         }
     }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NavigationBarController.java b/packages/SystemUI/src/com/android/systemui/statusbar/NavigationBarController.java
index 275475d6..5144a95 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NavigationBarController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NavigationBarController.java
@@ -156,7 +156,7 @@
                             Dependency.get(NotificationRemoteInputManager.class),
                             Dependency.get(IWindowManager.class));
             navBar.setAutoHideController(autoHideController);
-            navBar.restoreAppearanceAndTransientState();
+            navBar.restoreSystemUiVisibilityState();
             mNavigationBars.append(displayId, navBar);
 
             if (result != null) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarStateControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarStateControllerImpl.java
index 46a12330..8b9268e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarStateControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarStateControllerImpl.java
@@ -320,6 +320,18 @@
     }
 
     @Override
+    public void setSystemUiVisibility(int visibility) {
+        if (mSystemUiVisibility != visibility) {
+            mSystemUiVisibility = visibility;
+            synchronized (mListeners) {
+                for (RankedListener rl : new ArrayList<>(mListeners)) {
+                    rl.mListener.onSystemUiVisibilityChanged(mSystemUiVisibility);
+                }
+            }
+        }
+    }
+
+    @Override
     public void setPulsing(boolean pulsing) {
         if (mPulsing != pulsing) {
             mPulsing = pulsing;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/SysuiStatusBarStateController.java b/packages/SystemUI/src/com/android/systemui/statusbar/SysuiStatusBarStateController.java
index 50ab8a8..2ad979ab 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/SysuiStatusBarStateController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/SysuiStatusBarStateController.java
@@ -111,6 +111,11 @@
     boolean isKeyguardRequested();
 
     /**
+     * Set systemui visibility
+     */
+    void setSystemUiVisibility(int visibility);
+
+    /**
      * Set pulsing
      */
     void setPulsing(boolean visibility);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/AutoHideController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/AutoHideController.java
index 008464e..175d072 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/AutoHideController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/AutoHideController.java
@@ -17,39 +17,52 @@
 package com.android.systemui.statusbar.phone;
 
 import static com.android.systemui.Dependency.MAIN_HANDLER_NAME;
+import static com.android.systemui.statusbar.phone.BarTransitions.MODE_SEMI_TRANSPARENT;
 
 import android.content.Context;
+import android.graphics.Rect;
 import android.os.Handler;
 import android.os.RemoteException;
 import android.util.Log;
 import android.view.IWindowManager;
 import android.view.MotionEvent;
+import android.view.View;
 
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.systemui.SysUiServiceProvider;
+import com.android.systemui.statusbar.CommandQueue;
 import com.android.systemui.statusbar.NotificationRemoteInputManager;
 
 import javax.inject.Inject;
 import javax.inject.Named;
 
 /** A controller to control all auto-hide things. */
-public class AutoHideController {
+public class AutoHideController implements CommandQueue.Callbacks {
     private static final String TAG = "AutoHideController";
 
     private final IWindowManager mWindowManagerService;
 
     private final Handler mHandler;
     private final NotificationRemoteInputManager mRemoteInputManager;
+    private final CommandQueue mCommandQueue;
     private StatusBar mStatusBar;
     private NavigationBarFragment mNavigationBar;
 
-    private int mDisplayId;
+    @VisibleForTesting
+    int mDisplayId;
+    @VisibleForTesting
+    int mSystemUiVisibility;
+    // last value sent to window manager
+    private int mLastDispatchedSystemUiVisibility = ~View.SYSTEM_UI_FLAG_VISIBLE;
 
     private boolean mAutoHideSuspended;
 
-    private static final long AUTO_HIDE_TIMEOUT_MS = 2250;
+    private static final long AUTOHIDE_TIMEOUT_MS = 2250;
 
     private final Runnable mAutoHide = () -> {
-        if (isAnyTransientBarShown()) {
-            hideTransientBars();
+        int requested = mSystemUiVisibility & ~getTransientMask();
+        if (mSystemUiVisibility != requested) {
+            notifySystemUiVisibilityChanged(requested);
         }
     };
 
@@ -57,6 +70,8 @@
     public AutoHideController(Context context, @Named(MAIN_HANDLER_NAME) Handler handler,
             NotificationRemoteInputManager notificationRemoteInputManager,
             IWindowManager iWindowManager) {
+        mCommandQueue = SysUiServiceProvider.getComponent(context, CommandQueue.class);
+        mCommandQueue.addCallback(this);
         mHandler = handler;
         mRemoteInputManager = notificationRemoteInputManager;
         mWindowManagerService = iWindowManager;
@@ -64,6 +79,13 @@
         mDisplayId = context.getDisplayId();
     }
 
+    @Override
+    public void onDisplayRemoved(int displayId) {
+        if (displayId == mDisplayId) {
+            mCommandQueue.removeCallback(this);
+        }
+    }
+
     void setStatusBar(StatusBar statusBar) {
         mStatusBar = statusBar;
     }
@@ -72,18 +94,50 @@
         mNavigationBar = navigationBar;
     }
 
-    private void hideTransientBars() {
+    @Override
+    public void setSystemUiVisibility(int displayId, int vis, int fullscreenStackVis,
+            int dockedStackVis, int mask, Rect fullscreenStackBounds, Rect dockedStackBounds,
+            boolean navbarColorManagedByIme) {
+        if (displayId != mDisplayId) {
+            return;
+        }
+        int oldVal = mSystemUiVisibility;
+        int newVal = (oldVal & ~mask) | (vis & mask);
+        int diff = newVal ^ oldVal;
+
+        if (diff != 0) {
+            mSystemUiVisibility = newVal;
+
+            // ready to unhide
+            if (hasStatusBar() && (vis & View.STATUS_BAR_UNHIDE) != 0) {
+                mSystemUiVisibility &= ~View.STATUS_BAR_UNHIDE;
+            }
+
+            if (hasNavigationBar() && (vis & View.NAVIGATION_BAR_UNHIDE) != 0) {
+                mSystemUiVisibility &= ~View.NAVIGATION_BAR_UNHIDE;
+            }
+
+            // Re-send setSystemUiVisibility to update un-hide status.
+            if (mSystemUiVisibility != newVal) {
+                mCommandQueue.setSystemUiVisibility(mDisplayId, mSystemUiVisibility,
+                        fullscreenStackVis, dockedStackVis, mask, fullscreenStackBounds,
+                        dockedStackBounds, navbarColorManagedByIme);
+            }
+
+            notifySystemUiVisibilityChanged(mSystemUiVisibility);
+        }
+    }
+
+    @VisibleForTesting
+    void notifySystemUiVisibilityChanged(int vis) {
         try {
-            mWindowManagerService.hideTransientBars(mDisplayId);
+            if (mLastDispatchedSystemUiVisibility != vis) {
+                mWindowManagerService.statusBarVisibilityChanged(mDisplayId, vis);
+                mLastDispatchedSystemUiVisibility = vis;
+            }
         } catch (RemoteException ex) {
             Log.w(TAG, "Cannot get WindowManager");
         }
-        if (mStatusBar != null) {
-            mStatusBar.clearTransient();
-        }
-        if (mNavigationBar != null) {
-            mNavigationBar.clearTransient();
-        }
     }
 
     void resumeSuspendedAutoHide() {
@@ -102,12 +156,13 @@
         if (checkBarModesRunnable != null) {
             mHandler.removeCallbacks(checkBarModesRunnable);
         }
-        mAutoHideSuspended = isAnyTransientBarShown();
+        mAutoHideSuspended = (mSystemUiVisibility & getTransientMask()) != 0;
     }
 
     void touchAutoHide() {
         // update transient bar auto hide
-        if (isAnyTransientBarShown()) {
+        if ((hasStatusBar() && mStatusBar.getStatusBarMode() == MODE_SEMI_TRANSPARENT)
+                || hasNavigationBar() && mNavigationBar.isSemiTransparent()) {
             scheduleAutoHide();
         } else {
             cancelAutoHide();
@@ -115,9 +170,9 @@
     }
 
     private Runnable getCheckBarModesRunnable() {
-        if (mStatusBar != null) {
+        if (hasStatusBar()) {
             return () -> mStatusBar.checkBarModes();
-        } else if (mNavigationBar != null) {
+        } else if (hasNavigationBar()) {
             return () -> mNavigationBar.checkNavBarModes();
         } else {
             return null;
@@ -131,14 +186,15 @@
 
     private void scheduleAutoHide() {
         cancelAutoHide();
-        mHandler.postDelayed(mAutoHide, AUTO_HIDE_TIMEOUT_MS);
+        mHandler.postDelayed(mAutoHide, AUTOHIDE_TIMEOUT_MS);
     }
 
     void checkUserAutoHide(MotionEvent event) {
-        boolean shouldAutoHide = isAnyTransientBarShown()
+        boolean shouldAutoHide =
+                (mSystemUiVisibility & getTransientMask()) != 0  // a transient bar is revealed.
                 && event.getAction() == MotionEvent.ACTION_OUTSIDE // touch outside the source bar.
                 && event.getX() == 0 && event.getY() == 0;
-        if (mStatusBar != null) {
+        if (hasStatusBar()) {
             // a touch outside both bars
             shouldAutoHide &= !mRemoteInputManager.getController().isRemoteInputActive();
         }
@@ -152,8 +208,23 @@
         mHandler.postDelayed(mAutoHide, 350); // longer than app gesture -> flag clear
     }
 
-    private boolean isAnyTransientBarShown() {
-        return (mStatusBar != null && mStatusBar.isTransientShown())
-                || mNavigationBar != null && mNavigationBar.isTransientShown();
+    private int getTransientMask() {
+        int mask = 0;
+        if (hasStatusBar()) {
+            mask |= View.STATUS_BAR_TRANSIENT;
+        }
+        if (hasNavigationBar()) {
+            mask |= View.NAVIGATION_BAR_TRANSIENT;
+        }
+        return mask;
+    }
+
+    boolean hasNavigationBar() {
+        return mNavigationBar != null;
+    }
+
+    @VisibleForTesting
+    boolean hasStatusBar() {
+        return mStatusBar != null;
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.java
index e6731e6..211a40a 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BarTransitions.java
@@ -44,11 +44,11 @@
     private static final boolean DEBUG = false;
     private static final boolean DEBUG_COLORS = false;
 
-    public static final int MODE_TRANSPARENT = 0;
+    public static final int MODE_OPAQUE = 0;
     public static final int MODE_SEMI_TRANSPARENT = 1;
     public static final int MODE_TRANSLUCENT = 2;
     public static final int MODE_LIGHTS_OUT = 3;
-    public static final int MODE_OPAQUE = 4;
+    public static final int MODE_TRANSPARENT = 4;
     public static final int MODE_WARNING = 5;
     public static final int MODE_LIGHTS_OUT_TRANSPARENT = 6;
 
@@ -72,7 +72,7 @@
     private final View mView;
     protected final BarBackgroundDrawable mBarBackground;
 
-    private @TransitionMode int mMode;
+    private int mMode;
     private boolean mAlwaysOpaque = false;
 
     public BarTransitions(View view, int gradientResourceId) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/EdgeBackGestureHandler.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/EdgeBackGestureHandler.java
index c9c38a0..442c089 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/EdgeBackGestureHandler.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/EdgeBackGestureHandler.java
@@ -16,6 +16,8 @@
 package com.android.systemui.statusbar.phone;
 
 import static android.view.Display.INVALID_DISPLAY;
+import static android.view.View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
+import static android.view.View.NAVIGATION_BAR_TRANSIENT;
 
 import android.content.Context;
 import android.content.res.Resources;
@@ -131,7 +133,7 @@
     private boolean mIsAttached;
     private boolean mIsGesturalModeEnabled;
     private boolean mIsEnabled;
-    private boolean mIsNavBarShownTransiently;
+    private boolean mIsInTransientImmersiveStickyState;
 
     private InputMonitor mInputMonitor;
     private InputEventReceiver mInputEventReceiver;
@@ -196,8 +198,10 @@
         updateCurrentUserResources(currentUserContext.getResources());
     }
 
-    public void onNavBarTransientStateChanged(boolean isTransient) {
-        mIsNavBarShownTransiently = isTransient;
+    public void onSystemUiVisibilityChanged(int systemUiVisibility) {
+        mIsInTransientImmersiveStickyState =
+                (systemUiVisibility & SYSTEM_UI_FLAG_IMMERSIVE_STICKY) != 0
+                && (systemUiVisibility & NAVIGATION_BAR_TRANSIENT) != 0;
     }
 
     private void disposeInputChannel() {
@@ -312,7 +316,7 @@
         }
 
         // Always allow if the user is in a transient sticky immersive state
-        if (mIsNavBarShownTransiently) {
+        if (mIsInTransientImmersiveStickyState) {
             return true;
         }
 
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarController.java
index 2e776e3..b0b656a 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarController.java
@@ -16,20 +16,15 @@
 
 package com.android.systemui.statusbar.phone;
 
-import static android.view.WindowInsetsController.APPEARANCE_LIGHT_SIDE_BARS;
-import static android.view.WindowInsetsController.APPEARANCE_LIGHT_TOP_BAR;
-
 import static com.android.systemui.statusbar.phone.BarTransitions.MODE_LIGHTS_OUT_TRANSPARENT;
 import static com.android.systemui.statusbar.phone.BarTransitions.MODE_TRANSPARENT;
 
 import android.content.Context;
 import android.graphics.Color;
-import android.view.InsetsFlags;
-import android.view.ViewDebug;
-import android.view.WindowInsetsController.Appearance;
+import android.graphics.Rect;
+import android.view.View;
 
 import com.android.internal.colorextraction.ColorExtractor.GradientColors;
-import com.android.internal.view.AppearanceRegion;
 import com.android.systemui.Dumpable;
 import com.android.systemui.R;
 import com.android.systemui.plugins.DarkIconDispatcher;
@@ -54,10 +49,13 @@
     private BiometricUnlockController mBiometricUnlockController;
 
     private LightBarTransitionsController mNavigationBarController;
-    private @Appearance int mAppearance;
-    private AppearanceRegion[] mAppearanceRegions = new AppearanceRegion[0];
-    private int mStatusBarMode;
-    private int mNavigationBarMode;
+    private int mSystemUiVisibility;
+    private int mFullscreenStackVisibility;
+    private int mDockedStackVisibility;
+    private boolean mFullscreenLight;
+    private boolean mDockedLight;
+    private int mLastStatusBarMode;
+    private int mLastNavigationBarMode;
     private final Color mDarkModeColor;
 
     /**
@@ -77,6 +75,8 @@
      */
     private boolean mForceDarkForScrim;
 
+    private final Rect mLastFullscreenBounds = new Rect();
+    private final Rect mLastDockedBounds = new Rect();
     private boolean mQsCustomizing;
 
     private boolean mDirectReplying;
@@ -101,32 +101,45 @@
         mBiometricUnlockController = biometricUnlockController;
     }
 
-    void onStatusBarAppearanceChanged(AppearanceRegion[] appearanceRegions, boolean sbModeChanged,
+    public void onSystemUiVisibilityChanged(int fullscreenStackVis, int dockedStackVis,
+            int mask, Rect fullscreenStackBounds, Rect dockedStackBounds, boolean sbModeChanged,
             int statusBarMode, boolean navbarColorManagedByIme) {
-        final int numStacks = appearanceRegions.length;
-        boolean stackAppearancesChanged = mAppearanceRegions.length != numStacks;
-        for (int i = 0; i < numStacks && !stackAppearancesChanged; i++) {
-            stackAppearancesChanged |= !appearanceRegions[i].equals(mAppearanceRegions[i]);
+        int oldFullscreen = mFullscreenStackVisibility;
+        int newFullscreen = (oldFullscreen & ~mask) | (fullscreenStackVis & mask);
+        int diffFullscreen = newFullscreen ^ oldFullscreen;
+        int oldDocked = mDockedStackVisibility;
+        int newDocked = (oldDocked & ~mask) | (dockedStackVis & mask);
+        int diffDocked = newDocked ^ oldDocked;
+        if ((diffFullscreen & View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR) != 0
+                || (diffDocked & View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR) != 0
+                || sbModeChanged
+                || !mLastFullscreenBounds.equals(fullscreenStackBounds)
+                || !mLastDockedBounds.equals(dockedStackBounds)) {
+
+            mFullscreenLight = isLight(newFullscreen, statusBarMode,
+                    View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
+            mDockedLight = isLight(newDocked, statusBarMode, View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
+            updateStatus(fullscreenStackBounds, dockedStackBounds);
         }
-        if (stackAppearancesChanged || sbModeChanged) {
-            mAppearanceRegions = appearanceRegions;
-            onStatusBarModeChanged(statusBarMode);
-        }
+
+        mFullscreenStackVisibility = newFullscreen;
+        mDockedStackVisibility = newDocked;
+        mLastStatusBarMode = statusBarMode;
         mNavbarColorManagedByIme = navbarColorManagedByIme;
+        mLastFullscreenBounds.set(fullscreenStackBounds);
+        mLastDockedBounds.set(dockedStackBounds);
     }
 
-    void onStatusBarModeChanged(int newBarMode) {
-        mStatusBarMode = newBarMode;
-        updateStatus();
-    }
-
-    void onNavigationBarAppearanceChanged(@Appearance int appearance, boolean nbModeChanged,
+    public void onNavigationVisibilityChanged(int vis, int mask, boolean nbModeChanged,
             int navigationBarMode, boolean navbarColorManagedByIme) {
-        int diff = appearance ^ mAppearance;
-        if ((diff & APPEARANCE_LIGHT_SIDE_BARS) != 0 || nbModeChanged) {
-            final boolean last = mNavigationLight;
-            mHasLightNavigationBar = isLight(appearance, navigationBarMode,
-                    APPEARANCE_LIGHT_SIDE_BARS);
+        int oldVis = mSystemUiVisibility;
+        int newVis = (oldVis & ~mask) | (vis & mask);
+        int diffVis = newVis ^ oldVis;
+        if ((diffVis & View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR) != 0
+                || nbModeChanged) {
+            boolean last = mNavigationLight;
+            mHasLightNavigationBar = isLight(vis, navigationBarMode,
+                    View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR);
             mNavigationLight = mHasLightNavigationBar
                     && (mDirectReplying && mNavbarColorManagedByIme || !mForceDarkForScrim)
                     && !mQsCustomizing;
@@ -134,20 +147,17 @@
                 updateNavigation();
             }
         }
-        mAppearance = appearance;
-        mNavigationBarMode = navigationBarMode;
+        mSystemUiVisibility = newVis;
+        mLastNavigationBarMode = navigationBarMode;
         mNavbarColorManagedByIme = navbarColorManagedByIme;
     }
 
-    void onNavigationBarModeChanged(int newBarMode) {
-        mHasLightNavigationBar = isLight(mAppearance, newBarMode, APPEARANCE_LIGHT_SIDE_BARS);
-    }
-
     private void reevaluate() {
-        onStatusBarAppearanceChanged(mAppearanceRegions, true /* sbModeChange */, mStatusBarMode,
-                mNavbarColorManagedByIme);
-        onNavigationBarAppearanceChanged(mAppearance, true /* nbModeChanged */,
-                mNavigationBarMode, mNavbarColorManagedByIme);
+        onSystemUiVisibilityChanged(mFullscreenStackVisibility,
+                mDockedStackVisibility, 0 /* mask */, mLastFullscreenBounds, mLastDockedBounds,
+                true /* sbModeChange*/, mLastStatusBarMode, mNavbarColorManagedByIme);
+        onNavigationVisibilityChanged(mSystemUiVisibility, 0 /* mask */, true /* nbModeChanged */,
+                mLastNavigationBarMode, mNavbarColorManagedByIme);
     }
 
     public void setQsCustomizing(boolean customizing) {
@@ -181,10 +191,10 @@
         }
     }
 
-    private static boolean isLight(int appearance, int barMode, int flag) {
-        final boolean isTransparentBar = (barMode == MODE_TRANSPARENT
+    private boolean isLight(int vis, int barMode, int flag) {
+        boolean isTransparentBar = (barMode == MODE_TRANSPARENT
                 || barMode == MODE_LIGHTS_OUT_TRANSPARENT);
-        final boolean light = (appearance & flag) != 0;
+        boolean light = (vis & flag) != 0;
         return isTransparentBar && light;
     }
 
@@ -197,49 +207,49 @@
                 && unlockMode != BiometricUnlockController.MODE_WAKE_AND_UNLOCK;
     }
 
-    private void updateStatus() {
-        final int numStacks = mAppearanceRegions.length;
-        int numLightStacks = 0;
+    private void updateStatus(Rect fullscreenStackBounds, Rect dockedStackBounds) {
+        boolean hasDockedStack = !dockedStackBounds.isEmpty();
 
-        // We can only have maximum one light stack.
-        int indexLightStack = -1;
-
-        for (int i = 0; i < numStacks; i++) {
-            if (isLight(mAppearanceRegions[i].getAppearance(), mStatusBarMode,
-                    APPEARANCE_LIGHT_TOP_BAR)) {
-                numLightStacks++;
-                indexLightStack = i;
-            }
-        }
-
-        // If all stacks are light, all icons get dark.
-        if (numLightStacks == numStacks) {
+        // If both are light or fullscreen is light and there is no docked stack, all icons get
+        // dark.
+        if ((mFullscreenLight && mDockedLight) || (mFullscreenLight && !hasDockedStack)) {
             mStatusBarIconController.setIconsDarkArea(null);
             mStatusBarIconController.getTransitionsController().setIconsDark(true, animateChange());
 
         }
 
-        // If no one is light, all icons become white.
-        else if (numLightStacks == 0) {
+        // If no one is light or the fullscreen is not light and there is no docked stack,
+        // all icons become white.
+        else if ((!mFullscreenLight && !mDockedLight) || (!mFullscreenLight && !hasDockedStack)) {
             mStatusBarIconController.getTransitionsController().setIconsDark(
                     false, animateChange());
         }
 
         // Not the same for every stack, magic!
         else {
-            mStatusBarIconController.setIconsDarkArea(
-                    mAppearanceRegions[indexLightStack].getBounds());
+            Rect bounds = mFullscreenLight ? fullscreenStackBounds : dockedStackBounds;
+            if (bounds.isEmpty()) {
+                mStatusBarIconController.setIconsDarkArea(null);
+            } else {
+                mStatusBarIconController.setIconsDarkArea(bounds);
+            }
             mStatusBarIconController.getTransitionsController().setIconsDark(true, animateChange());
         }
     }
 
     private void updateNavigation() {
         if (mNavigationBarController != null) {
-            mNavigationBarController.setIconsDark(mNavigationLight, animateChange());
+            mNavigationBarController.setIconsDark(
+                    mNavigationLight, animateChange());
         }
     }
 
     @Override
+    public void onBatteryLevelChanged(int level, boolean pluggedIn, boolean charging) {
+
+    }
+
+    @Override
     public void onPowerSaveChanged(boolean isPowerSave) {
         reevaluate();
     }
@@ -247,21 +257,24 @@
     @Override
     public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
         pw.println("LightBarController: ");
-        pw.print(" mAppearance=0x"); pw.println(ViewDebug.flagsToString(
-                InsetsFlags.class, "appearance", mAppearance));
-        final int numStacks = mAppearanceRegions.length;
-        for (int i = 0; i < numStacks; i++) {
-            final boolean isLight = isLight(mAppearanceRegions[i].getAppearance(), mStatusBarMode,
-                    APPEARANCE_LIGHT_TOP_BAR);
-            pw.print(" stack #"); pw.print(i); pw.print(": ");
-            pw.print(mAppearanceRegions[i].toString()); pw.print(" isLight="); pw.println(isLight);
-        }
+        pw.print(" mSystemUiVisibility=0x"); pw.print(
+                Integer.toHexString(mSystemUiVisibility));
+        pw.print(" mFullscreenStackVisibility=0x"); pw.print(
+                Integer.toHexString(mFullscreenStackVisibility));
+        pw.print(" mDockedStackVisibility=0x"); pw.println(
+                Integer.toHexString(mDockedStackVisibility));
+
+        pw.print(" mFullscreenLight="); pw.print(mFullscreenLight);
+        pw.print(" mDockedLight="); pw.println(mDockedLight);
+
+        pw.print(" mLastFullscreenBounds="); pw.print(mLastFullscreenBounds);
+        pw.print(" mLastDockedBounds="); pw.println(mLastDockedBounds);
 
         pw.print(" mNavigationLight="); pw.print(mNavigationLight);
         pw.print(" mHasLightNavigationBar="); pw.println(mHasLightNavigationBar);
 
-        pw.print(" mStatusBarMode="); pw.print(mStatusBarMode);
-        pw.print(" mNavigationBarMode="); pw.println(mNavigationBarMode);
+        pw.print(" mLastStatusBarMode="); pw.print(mLastStatusBarMode);
+        pw.print(" mLastNavigationBarMode="); pw.println(mLastNavigationBarMode);
 
         pw.print(" mForceDarkForScrim="); pw.print(mForceDarkForScrim);
         pw.print(" mQsCustomizing="); pw.print(mQsCustomizing);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java
index 7030dfc..38dc5ea 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java
@@ -21,10 +21,6 @@
 import static android.app.StatusBarManager.WindowType;
 import static android.app.StatusBarManager.WindowVisibleState;
 import static android.app.StatusBarManager.windowStateToString;
-import static android.view.InsetsState.TYPE_NAVIGATION_BAR;
-import static android.view.InsetsState.containsType;
-import static android.view.WindowInsetsController.APPEARANCE_LOW_PROFILE_BARS;
-import static android.view.WindowInsetsController.APPEARANCE_OPAQUE_SIDE_BARS;
 import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_3BUTTON;
 
 import static com.android.systemui.recents.OverviewProxyService.OverviewProxyListener;
@@ -35,6 +31,7 @@
 import static com.android.systemui.statusbar.phone.BarTransitions.MODE_LIGHTS_OUT_TRANSPARENT;
 import static com.android.systemui.statusbar.phone.BarTransitions.MODE_OPAQUE;
 import static com.android.systemui.statusbar.phone.BarTransitions.MODE_SEMI_TRANSPARENT;
+import static com.android.systemui.statusbar.phone.BarTransitions.MODE_TRANSLUCENT;
 import static com.android.systemui.statusbar.phone.BarTransitions.MODE_TRANSPARENT;
 import static com.android.systemui.statusbar.phone.BarTransitions.TransitionMode;
 import static com.android.systemui.statusbar.phone.StatusBar.DEBUG_WINDOW_STATE;
@@ -55,6 +52,7 @@
 import android.content.res.Configuration;
 import android.database.ContentObserver;
 import android.graphics.PixelFormat;
+import android.graphics.Rect;
 import android.inputmethodservice.InputMethodService;
 import android.net.Uri;
 import android.os.Binder;
@@ -69,14 +67,12 @@
 import android.text.TextUtils;
 import android.util.Log;
 import android.view.Display;
-import android.view.InsetsState.InternalInsetType;
 import android.view.KeyEvent;
 import android.view.LayoutInflater;
 import android.view.MotionEvent;
 import android.view.Surface;
 import android.view.View;
 import android.view.ViewGroup;
-import android.view.WindowInsetsController.Appearance;
 import android.view.WindowManager;
 import android.view.WindowManager.LayoutParams;
 import android.view.accessibility.AccessibilityEvent;
@@ -88,7 +84,6 @@
 import com.android.internal.logging.MetricsLogger;
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.internal.util.LatencyTracker;
-import com.android.internal.view.AppearanceRegion;
 import com.android.systemui.Dependency;
 import com.android.systemui.R;
 import com.android.systemui.SysUiServiceProvider;
@@ -133,8 +128,7 @@
     private static final boolean DEBUG = false;
     private static final String EXTRA_DISABLE_STATE = "disabled_state";
     private static final String EXTRA_DISABLE2_STATE = "disabled2_state";
-    private static final String EXTRA_APPEARANCE = "appearance";
-    private static final String EXTRA_TRANSIENT_STATE = "transient_state";
+    private static final String EXTRA_SYSTEM_UI_VISIBILITY = "system_ui_visibility";
 
     /** Allow some time inbetween the long press for back and recents. */
     private static final int LOCK_TO_APP_GESTURE_TOLERENCE = 200;
@@ -171,10 +165,7 @@
     private Locale mLocale;
     private int mLayoutDirection;
 
-    /** @see android.view.WindowInsetsController#setSystemBarsAppearance(int) */
-    private @Appearance int mAppearance;
-
-    private boolean mTransientShown;
+    private int mSystemUiVisibility = View.SYSTEM_UI_FLAG_VISIBLE;
     private int mNavBarMode = NAV_BAR_MODE_3BUTTON;
     private LightBarController mLightBarController;
     private AutoHideController mAutoHideController;
@@ -304,8 +295,7 @@
         if (savedInstanceState != null) {
             mDisabledFlags1 = savedInstanceState.getInt(EXTRA_DISABLE_STATE, 0);
             mDisabledFlags2 = savedInstanceState.getInt(EXTRA_DISABLE2_STATE, 0);
-            mAppearance = savedInstanceState.getInt(EXTRA_APPEARANCE, 0);
-            mTransientShown = savedInstanceState.getBoolean(EXTRA_TRANSIENT_STATE, false);
+            mSystemUiVisibility = savedInstanceState.getInt(EXTRA_SYSTEM_UI_VISIBILITY, 0);
         }
         mAccessibilityManagerWrapper.addCallback(mAccessibilityListener);
 
@@ -407,8 +397,7 @@
         super.onSaveInstanceState(outState);
         outState.putInt(EXTRA_DISABLE_STATE, mDisabledFlags1);
         outState.putInt(EXTRA_DISABLE2_STATE, mDisabledFlags2);
-        outState.putInt(EXTRA_APPEARANCE, mAppearance);
-        outState.putBoolean(EXTRA_TRANSIENT_STATE, mTransientShown);
+        outState.putInt(EXTRA_SYSTEM_UI_VISIBILITY, mSystemUiVisibility);
         if (mNavigationBarView != null) {
             mNavigationBarView.getLightTransitionsController().saveState(outState);
         }
@@ -529,107 +518,80 @@
         rotationButtonController.onRotationProposal(rotation, winRotation, isValid);
     }
 
-    /** Restores the appearance and the transient saved state to {@link NavigationBarFragment}. */
-    public void restoreAppearanceAndTransientState() {
-        final int barMode = barMode(mTransientShown, mAppearance);
-        mNavigationBarMode = barMode;
+    /** Restores the System UI flags saved state to {@link NavigationBarFragment}. */
+    public void restoreSystemUiVisibilityState() {
+        final int barMode = computeBarMode(0, mSystemUiVisibility);
+        if (barMode != -1) {
+            mNavigationBarMode = barMode;
+        }
         checkNavBarModes();
         mAutoHideController.touchAutoHide();
 
-        mLightBarController.onNavigationBarAppearanceChanged(mAppearance, true /* nbModeChanged */,
-                barMode, false /* navbarColorManagedByIme */);
+        mLightBarController.onNavigationVisibilityChanged(mSystemUiVisibility, 0 /* mask */,
+                true /* nbModeChanged */, mNavigationBarMode, false /* navbarColorManagedByIme */);
     }
 
     @Override
-    public void onSystemBarAppearanceChanged(int displayId, @Appearance int appearance,
-            AppearanceRegion[] appearanceRegions, boolean navbarColorManagedByIme) {
+    public void setSystemUiVisibility(int displayId, int vis, int fullscreenStackVis,
+            int dockedStackVis, int mask, Rect fullscreenStackBounds, Rect dockedStackBounds,
+            boolean navbarColorManagedByIme) {
         if (displayId != mDisplayId) {
             return;
         }
+        final int oldVal = mSystemUiVisibility;
+        final int newVal = (oldVal & ~mask) | (vis & mask);
+        final int diff = newVal ^ oldVal;
         boolean nbModeChanged = false;
-        if (mAppearance != appearance) {
-            mAppearance = appearance;
-            if (getView() == null) {
-                return;
+        if (diff != 0) {
+            mSystemUiVisibility = newVal;
+
+            // update navigation bar mode
+            final int nbMode = getView() == null
+                    ? -1 : computeBarMode(oldVal, newVal);
+            nbModeChanged = nbMode != -1;
+            if (nbModeChanged) {
+                if (mNavigationBarMode != nbMode) {
+                    if (mNavigationBarMode == MODE_TRANSPARENT
+                            || mNavigationBarMode == MODE_LIGHTS_OUT_TRANSPARENT) {
+                        mNavigationBarView.hideRecentsOnboarding();
+                    }
+                    mNavigationBarMode = nbMode;
+                    checkNavBarModes();
+                }
+                mAutoHideController.touchAutoHide();
             }
-            nbModeChanged = updateBarMode(barMode(mTransientShown, appearance));
-        }
-        mLightBarController.onNavigationBarAppearanceChanged(appearance, nbModeChanged,
-                mNavigationBarMode, navbarColorManagedByIme);
-    }
-
-    @Override
-    public void showTransient(int displayId, @InternalInsetType int[] types) {
-        if (displayId != mDisplayId) {
-            return;
-        }
-        if (!containsType(types, TYPE_NAVIGATION_BAR)) {
-            return;
-        }
-        if (!mTransientShown) {
-            mTransientShown = true;
-            handleTransientChanged();
-        }
-    }
-
-    @Override
-    public void abortTransient(int displayId, @InternalInsetType int[] types) {
-        if (displayId != mDisplayId) {
-            return;
-        }
-        if (!containsType(types, TYPE_NAVIGATION_BAR)) {
-            return;
-        }
-        clearTransient();
-    }
-
-    void clearTransient() {
-        if (mTransientShown) {
-            mTransientShown = false;
-            handleTransientChanged();
-        }
-    }
-
-    private void handleTransientChanged() {
-        if (getView() == null) {
-            return;
-        }
-        if (mNavigationBarView != null) {
-            mNavigationBarView.onTransientStateChanged(mTransientShown);
-        }
-        final int barMode = barMode(mTransientShown, mAppearance);
-        if (updateBarMode(barMode)) {
-            mLightBarController.onNavigationBarModeChanged(barMode);
-        }
-    }
-
-    // Returns true if the bar mode is changed.
-    private boolean updateBarMode(int barMode) {
-        if (mNavigationBarMode != barMode) {
-            if (mNavigationBarMode == MODE_TRANSPARENT
-                    || mNavigationBarMode == MODE_LIGHTS_OUT_TRANSPARENT) {
-                mNavigationBarView.hideRecentsOnboarding();
+            if (mNavigationBarView != null) {
+                mNavigationBarView.onSystemUiVisibilityChanged(mSystemUiVisibility);
             }
-            mNavigationBarMode = barMode;
-            checkNavBarModes();
-            mAutoHideController.touchAutoHide();
-            return true;
         }
-        return false;
+        mLightBarController.onNavigationVisibilityChanged(
+                vis, mask, nbModeChanged, mNavigationBarMode, navbarColorManagedByIme);
     }
 
-    private static @TransitionMode int barMode(boolean isTransient, int appearance) {
-        final int lightsOutOpaque = APPEARANCE_LOW_PROFILE_BARS | APPEARANCE_OPAQUE_SIDE_BARS;
-        if (isTransient) {
+    private @TransitionMode int computeBarMode(int oldVis, int newVis) {
+        final int oldMode = barMode(oldVis);
+        final int newMode = barMode(newVis);
+        if (oldMode == newMode) {
+            return -1; // no mode change
+        }
+        return newMode;
+    }
+
+    private @TransitionMode int barMode(int vis) {
+        final int lightsOutTransparent =
+                View.SYSTEM_UI_FLAG_LOW_PROFILE | View.NAVIGATION_BAR_TRANSIENT;
+        if ((vis & View.NAVIGATION_BAR_TRANSIENT) != 0) {
             return MODE_SEMI_TRANSPARENT;
-        } else if ((appearance & lightsOutOpaque) == lightsOutOpaque) {
-            return MODE_LIGHTS_OUT;
-        } else if ((appearance & APPEARANCE_LOW_PROFILE_BARS) != 0) {
+        } else if ((vis & View.NAVIGATION_BAR_TRANSLUCENT) != 0) {
+            return MODE_TRANSLUCENT;
+        } else if ((vis & lightsOutTransparent) == lightsOutTransparent) {
             return MODE_LIGHTS_OUT_TRANSPARENT;
-        } else if ((appearance & APPEARANCE_OPAQUE_SIDE_BARS) != 0) {
-            return MODE_OPAQUE;
-        } else {
+        } else if ((vis & View.NAVIGATION_BAR_TRANSPARENT) != 0) {
             return MODE_TRANSPARENT;
+        } else if ((vis & View.SYSTEM_UI_FLAG_LOW_PROFILE) != 0) {
+            return MODE_LIGHTS_OUT;
+        } else {
+            return MODE_OPAQUE;
         }
     }
 
@@ -1028,8 +990,8 @@
         mAutoHideController.setNavigationBar(this);
     }
 
-    boolean isTransientShown() {
-        return mTransientShown;
+    public boolean isSemiTransparent() {
+        return mNavigationBarMode == MODE_SEMI_TRANSPARENT;
     }
 
     private void checkBarModes() {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
index fe951a7..9804f9f 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
@@ -366,8 +366,8 @@
         return super.onTouchEvent(event);
     }
 
-    void onTransientStateChanged(boolean isTransient) {
-        mEdgeBackGestureHandler.onNavBarTransientStateChanged(isTransient);
+    void onSystemUiVisibilityChanged(int systemUiVisibility) {
+        mEdgeBackGestureHandler.onSystemUiVisibilityChanged(systemUiVisibility);
     }
 
     void onBarTransition(int newMode) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
index d2fa775..d1fe46e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
@@ -24,11 +24,6 @@
 import static android.app.StatusBarManager.WindowVisibleState;
 import static android.app.StatusBarManager.windowStateToString;
 import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN_OR_SPLIT_SCREEN_SECONDARY;
-import static android.view.InsetsFlags.getAppearance;
-import static android.view.InsetsState.TYPE_TOP_BAR;
-import static android.view.InsetsState.containsType;
-import static android.view.WindowInsetsController.APPEARANCE_LOW_PROFILE_BARS;
-import static android.view.WindowInsetsController.APPEARANCE_OPAQUE_TOP_BAR;
 
 import static com.android.systemui.Dependency.ALLOW_NOTIFICATION_LONG_PRESS_NAME;
 import static com.android.systemui.Dependency.BG_HANDLER;
@@ -80,6 +75,7 @@
 import android.content.res.Resources;
 import android.graphics.Point;
 import android.graphics.PointF;
+import android.graphics.Rect;
 import android.media.AudioAttributes;
 import android.metrics.LogMaker;
 import android.net.Uri;
@@ -108,7 +104,6 @@
 import android.util.Slog;
 import android.view.Display;
 import android.view.IWindowManager;
-import android.view.InsetsState.InternalInsetType;
 import android.view.KeyEvent;
 import android.view.LayoutInflater;
 import android.view.MotionEvent;
@@ -117,7 +112,6 @@
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.ViewTreeObserver;
-import android.view.WindowInsetsController.Appearance;
 import android.view.WindowManager;
 import android.view.WindowManagerGlobal;
 import android.view.accessibility.AccessibilityManager;
@@ -130,7 +124,6 @@
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.internal.statusbar.IStatusBarService;
 import com.android.internal.statusbar.RegisterStatusBarResult;
-import com.android.internal.view.AppearanceRegion;
 import com.android.internal.widget.LockPatternUtils;
 import com.android.keyguard.KeyguardUpdateMonitor;
 import com.android.keyguard.KeyguardUpdateMonitorCallback;
@@ -431,13 +424,10 @@
     private int mDisabled1 = 0;
     private int mDisabled2 = 0;
 
-    /** @see android.view.WindowInsetsController#setSystemBarsAppearance(int) */
-    private @Appearance int mAppearance;
-
-    private boolean mTransientShown;
-
-    private boolean mAppFullscreen;
-    private boolean mAppImmersive;
+    // tracking calls to View.setSystemUiVisibility()
+    private int mSystemUiVisibility = View.SYSTEM_UI_FLAG_VISIBLE;
+    private final Rect mLastFullscreenStackBounds = new Rect();
+    private final Rect mLastDockedStackBounds = new Rect();
 
     private final DisplayMetrics mDisplayMetrics;
 
@@ -829,22 +819,10 @@
         // Set up the initial notification state. This needs to happen before CommandQueue.disable()
         setUpPresenter();
 
-        if ((result.mSystemUiVisibility & View.STATUS_BAR_TRANSIENT) != 0) {
-            showTransientUnchecked();
-        }
-        final int fullscreenAppearance = getAppearance(result.mFullscreenStackSysUiVisibility);
-        final int dockedAppearance = getAppearance(result.mDockedStackSysUiVisibility);
-        final AppearanceRegion[] appearanceRegions = result.mDockedStackBounds.isEmpty()
-                ? new AppearanceRegion[]{
-                        new AppearanceRegion(fullscreenAppearance, result.mFullscreenStackBounds)}
-                : new AppearanceRegion[]{
-                        new AppearanceRegion(fullscreenAppearance, result.mFullscreenStackBounds),
-                        new AppearanceRegion(dockedAppearance, result.mDockedStackBounds)};
-        onSystemBarAppearanceChanged(mDisplayId, getAppearance(result.mSystemUiVisibility),
-                appearanceRegions, result.mNavbarColorManagedByIme);
-        mAppFullscreen = result.mAppFullscreen;
-        mAppImmersive = result.mAppImmersive;
-
+        setSystemUiVisibility(mDisplayId, result.mSystemUiVisibility,
+                result.mFullscreenStackSysUiVisibility, result.mDockedStackSysUiVisibility,
+                0xffffffff, result.mFullscreenStackBounds, result.mDockedStackBounds,
+                result.mNavbarColorManagedByIme);
         // StatusBarManagerService has a back up of IME token and it's restored here.
         setImeWindowStatus(mDisplayId, result.mImeToken, result.mImeWindowVis,
                 result.mImeBackDisposition, result.mShowImeSwitcher);
@@ -2244,103 +2222,49 @@
         }
     }
 
-    @Override
-    public void onSystemBarAppearanceChanged(int displayId, @Appearance int appearance,
-            AppearanceRegion[] appearanceRegions, boolean navbarColorManagedByIme) {
+    @Override // CommandQueue
+    public void setSystemUiVisibility(int displayId, int vis, int fullscreenStackVis,
+            int dockedStackVis, int mask, Rect fullscreenStackBounds, Rect dockedStackBounds,
+            boolean navbarColorManagedByIme) {
         if (displayId != mDisplayId) {
             return;
         }
-        boolean barModeChanged = false;
-        final int diff = mAppearance ^ appearance;
-        if (mAppearance != appearance) {
-            mAppearance = appearance;
+        final int oldVal = mSystemUiVisibility;
+        final int newVal = (oldVal&~mask) | (vis&mask);
+        final int diff = newVal ^ oldVal;
+        if (DEBUG) Log.d(TAG, String.format(
+                "setSystemUiVisibility displayId=%d vis=%s mask=%s oldVal=%s newVal=%s diff=%s",
+                displayId, Integer.toHexString(vis), Integer.toHexString(mask),
+                Integer.toHexString(oldVal), Integer.toHexString(newVal),
+                Integer.toHexString(diff)));
+        boolean sbModeChanged = false;
+        if (diff != 0) {
+            mSystemUiVisibility = newVal;
 
             // update low profile
-            if ((diff & APPEARANCE_LOW_PROFILE_BARS) != 0) {
+            if ((diff & View.SYSTEM_UI_FLAG_LOW_PROFILE) != 0) {
                 updateAreThereNotifications();
             }
-            barModeChanged = updateBarMode(barMode(mTransientShown, appearance));
-        }
-        mLightBarController.onStatusBarAppearanceChanged(appearanceRegions, barModeChanged,
-                mStatusBarMode, navbarColorManagedByIme);
-    }
 
-    @Override
-    public void showTransient(int displayId, @InternalInsetType int[] types) {
-        if (displayId != mDisplayId) {
-            return;
-        }
-        if (!containsType(types, TYPE_TOP_BAR)) {
-            return;
-        }
-        showTransientUnchecked();
-    }
+            // ready to unhide
+            if ((vis & View.STATUS_BAR_UNHIDE) != 0) {
+                mNoAnimationOnNextBarModeChange = true;
+            }
 
-    private void showTransientUnchecked() {
-        if (!mTransientShown) {
-            mTransientShown = true;
-            mNoAnimationOnNextBarModeChange = true;
-            handleTransientChanged();
-        }
-    }
+            // update status bar mode
+            final int sbMode = computeStatusBarMode(oldVal, newVal);
 
-    @Override
-    public void abortTransient(int displayId, @InternalInsetType int[] types) {
-        if (displayId != mDisplayId) {
-            return;
+            sbModeChanged = sbMode != -1;
+            if (sbModeChanged && sbMode != mStatusBarMode) {
+                mStatusBarMode = sbMode;
+                checkBarModes();
+                mAutoHideController.touchAutoHide();
+            }
+            mStatusBarStateController.setSystemUiVisibility(mSystemUiVisibility);
         }
-        if (!containsType(types, TYPE_TOP_BAR)) {
-            return;
-        }
-        clearTransient();
-    }
-
-    void clearTransient() {
-        if (mTransientShown) {
-            mTransientShown = false;
-            handleTransientChanged();
-        }
-    }
-
-    private void handleTransientChanged() {
-        final int barMode = barMode(mTransientShown, mAppearance);
-        if (updateBarMode(barMode)) {
-            mLightBarController.onStatusBarModeChanged(barMode);
-        }
-    }
-
-    private boolean updateBarMode(int barMode) {
-        if (mStatusBarMode != barMode) {
-            mStatusBarMode = barMode;
-            checkBarModes();
-            mAutoHideController.touchAutoHide();
-            return true;
-        }
-        return false;
-    }
-
-    private static @TransitionMode int barMode(boolean isTransient, int appearance) {
-        final int lightsOutOpaque = APPEARANCE_LOW_PROFILE_BARS | APPEARANCE_OPAQUE_TOP_BAR;
-        if (isTransient) {
-            return MODE_SEMI_TRANSPARENT;
-        } else if ((appearance & lightsOutOpaque) == lightsOutOpaque) {
-            return MODE_LIGHTS_OUT;
-        } else if ((appearance & APPEARANCE_LOW_PROFILE_BARS) != 0) {
-            return MODE_LIGHTS_OUT_TRANSPARENT;
-        } else if ((appearance & APPEARANCE_OPAQUE_TOP_BAR) != 0) {
-            return MODE_OPAQUE;
-        } else {
-            return MODE_TRANSPARENT;
-        }
-    }
-
-    @Override
-    public void topAppWindowChanged(int displayId, boolean isFullscreen, boolean isImmersive) {
-        if (displayId != mDisplayId) {
-            return;
-        }
-        mAppFullscreen = isFullscreen;
-        mAppImmersive = isImmersive;
+        mLightBarController.onSystemUiVisibilityChanged(fullscreenStackVis, dockedStackVis,
+                mask, fullscreenStackBounds, dockedStackBounds, sbModeChanged, mStatusBarMode,
+                navbarColorManagedByIme);
     }
 
     @Override
@@ -2371,10 +2295,40 @@
         setInteracting(StatusBarManager.WINDOW_NAVIGATION_BAR, running);
     }
 
+    protected @TransitionMode int computeStatusBarMode(int oldVal, int newVal) {
+        return computeBarMode(oldVal, newVal);
+    }
+
     protected BarTransitions getStatusBarTransitions() {
         return mStatusBarView.getBarTransitions();
     }
 
+    protected @TransitionMode int computeBarMode(int oldVis, int newVis) {
+        final int oldMode = barMode(oldVis);
+        final int newMode = barMode(newVis);
+        if (oldMode == newMode) {
+            return -1; // no mode change
+        }
+        return newMode;
+    }
+
+    private @TransitionMode int barMode(int vis) {
+        int lightsOutTransparent = View.SYSTEM_UI_FLAG_LOW_PROFILE | View.STATUS_BAR_TRANSPARENT;
+        if ((vis & View.STATUS_BAR_TRANSIENT) != 0) {
+            return MODE_SEMI_TRANSPARENT;
+        } else if ((vis & View.STATUS_BAR_TRANSLUCENT) != 0) {
+            return MODE_TRANSLUCENT;
+        } else if ((vis & lightsOutTransparent) == lightsOutTransparent) {
+            return MODE_LIGHTS_OUT_TRANSPARENT;
+        } else if ((vis & View.STATUS_BAR_TRANSPARENT) != 0) {
+            return MODE_TRANSPARENT;
+        } else if ((vis & View.SYSTEM_UI_FLAG_LOW_PROFILE) != 0) {
+            return MODE_LIGHTS_OUT;
+        } else {
+            return MODE_OPAQUE;
+        }
+    }
+
     void checkBarModes() {
         if (mDemoMode) return;
         if (mStatusBarView != null) checkBarMode(mStatusBarMode, mStatusBarWindowState,
@@ -2430,16 +2384,20 @@
 
     /** Returns whether the top activity is in fullscreen mode. */
     public boolean inFullscreenMode() {
-        return mAppFullscreen;
+        return 0
+                != (mSystemUiVisibility
+                        & (View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION));
     }
 
     /** Returns whether the top activity is in immersive mode. */
     public boolean inImmersiveMode() {
-        return mAppImmersive;
+        return 0
+                != (mSystemUiVisibility
+                        & (View.SYSTEM_UI_FLAG_IMMERSIVE | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY));
     }
 
     private boolean areLightsOn() {
-        return 0 == (mAppearance & APPEARANCE_LOW_PROFILE_BARS);
+        return 0 == (mSystemUiVisibility & View.SYSTEM_UI_FLAG_LOW_PROFILE);
     }
 
     public static String viewInfo(View v) {
@@ -4764,8 +4722,8 @@
         void createStatusBar(StatusBar statusbar);
     }
 
-    boolean isTransientShown() {
-        return mTransientShown;
+    public @TransitionMode int getStatusBarMode() {
+        return mStatusBarMode;
     }
 
 }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java
index 6b51391..d04c7bd 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java
@@ -23,7 +23,6 @@
 import android.content.res.Configuration;
 import android.content.res.TypedArray;
 import android.graphics.Canvas;
-import android.graphics.Insets;
 import android.graphics.Paint;
 import android.graphics.Rect;
 import android.graphics.drawable.Drawable;
@@ -43,7 +42,6 @@
 import android.view.ViewGroup;
 import android.view.ViewTreeObserver;
 import android.view.Window;
-import android.view.WindowInsets;
 import android.view.WindowInsetsController;
 import android.widget.FrameLayout;
 
@@ -76,8 +74,7 @@
     }
 
     @Override
-    public WindowInsets onApplyWindowInsets(WindowInsets windowInsets) {
-        final Insets insets = windowInsets.getMaxInsets(WindowInsets.Type.systemBars());
+    protected boolean fitSystemWindows(Rect insets) {
         if (getFitsSystemWindows()) {
             boolean paddingChanged = insets.top != getPaddingTop()
                     || insets.bottom != getPaddingBottom();
@@ -103,6 +100,9 @@
             if (paddingChanged) {
                 setPadding(0, 0, 0, 0);
             }
+            insets.left = 0;
+            insets.top = 0;
+            insets.right = 0;
         } else {
             if (mRightInset != 0 || mLeftInset != 0) {
                 mRightInset = 0;
@@ -116,8 +116,9 @@
             if (changed) {
                 setPadding(0, 0, 0, 0);
             }
+            insets.top = 0;
         }
-        return windowInsets;
+        return false;
     }
 
     private void applyMargins() {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java
index eb198c6..1bd01e1 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java
@@ -15,8 +15,6 @@
 package com.android.systemui.statusbar;
 
 import static android.view.Display.DEFAULT_DISPLAY;
-import static android.view.InsetsState.TYPE_NAVIGATION_BAR;
-import static android.view.InsetsState.TYPE_TOP_BAR;
 
 import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.Matchers.eq;
@@ -27,12 +25,10 @@
 import android.content.ComponentName;
 import android.graphics.Rect;
 import android.os.Bundle;
-import android.view.WindowInsetsController.Appearance;
 
 import androidx.test.filters.SmallTest;
 
 import com.android.internal.statusbar.StatusBarIcon;
-import com.android.internal.view.AppearanceRegion;
 import com.android.systemui.SysuiTestCase;
 import com.android.systemui.statusbar.CommandQueue.Callbacks;
 
@@ -114,56 +110,21 @@
     }
 
     @Test
-    public void testOnSystemBarAppearanceChanged() {
-        doTestOnSystemBarAppearanceChanged(DEFAULT_DISPLAY, 1,
-                new AppearanceRegion[]{new AppearanceRegion(2, new Rect())}, false);
+    public void testSetSystemUiVisibility() {
+        Rect r = new Rect();
+        mCommandQueue.setSystemUiVisibility(DEFAULT_DISPLAY, 1, 2, 3, 4, null, r, false);
+        waitForIdleSync();
+        verify(mCallbacks).setSystemUiVisibility(eq(DEFAULT_DISPLAY), eq(1), eq(2), eq(3), eq(4),
+                eq(null), eq(r), eq(false));
     }
 
     @Test
-    public void testOnSystemBarAppearanceChangedForSecondaryDisplay() {
-        doTestOnSystemBarAppearanceChanged(SECONDARY_DISPLAY, 1,
-                new AppearanceRegion[]{new AppearanceRegion(2, new Rect())}, false);
-    }
-
-    private void doTestOnSystemBarAppearanceChanged(int displayId, @Appearance int appearance,
-            AppearanceRegion[] appearanceRegions, boolean navbarColorManagedByIme) {
-        mCommandQueue.onSystemBarAppearanceChanged(displayId, appearance, appearanceRegions,
-                navbarColorManagedByIme);
+    public void testSetSystemUiVisibilityForSecondaryDisplay() {
+        Rect r = new Rect();
+        mCommandQueue.setSystemUiVisibility(SECONDARY_DISPLAY, 1, 2, 3, 4, null, r, false);
         waitForIdleSync();
-        verify(mCallbacks).onSystemBarAppearanceChanged(eq(displayId), eq(appearance),
-                eq(appearanceRegions), eq(navbarColorManagedByIme));
-    }
-
-    @Test
-    public void testShowTransient() {
-        int[] types = new int[]{ TYPE_TOP_BAR, TYPE_NAVIGATION_BAR };
-        mCommandQueue.showTransient(DEFAULT_DISPLAY, types);
-        waitForIdleSync();
-        verify(mCallbacks).showTransient(eq(DEFAULT_DISPLAY), eq(types));
-    }
-
-    @Test
-    public void testShowTransientForSecondaryDisplay() {
-        int[] types = new int[]{ TYPE_TOP_BAR, TYPE_NAVIGATION_BAR };
-        mCommandQueue.showTransient(SECONDARY_DISPLAY, types);
-        waitForIdleSync();
-        verify(mCallbacks).showTransient(eq(SECONDARY_DISPLAY), eq(types));
-    }
-
-    @Test
-    public void testAbortTransient() {
-        int[] types = new int[]{ TYPE_TOP_BAR, TYPE_NAVIGATION_BAR };
-        mCommandQueue.abortTransient(DEFAULT_DISPLAY, types);
-        waitForIdleSync();
-        verify(mCallbacks).abortTransient(eq(DEFAULT_DISPLAY), eq(types));
-    }
-
-    @Test
-    public void testAbortTransientForSecondaryDisplay() {
-        int[] types = new int[]{ TYPE_TOP_BAR, TYPE_NAVIGATION_BAR };
-        mCommandQueue.abortTransient(SECONDARY_DISPLAY, types);
-        waitForIdleSync();
-        verify(mCallbacks).abortTransient(eq(SECONDARY_DISPLAY), eq(types));
+        verify(mCallbacks).setSystemUiVisibility(eq(SECONDARY_DISPLAY), eq(1), eq(2), eq(3), eq(4),
+                eq(null), eq(r), eq(false));
     }
 
     @Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/AutoHideControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/AutoHideControllerTest.java
new file mode 100644
index 0000000..16f02d9
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/AutoHideControllerTest.java
@@ -0,0 +1,122 @@
+/*
+ * Copyright (C) 2019 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.statusbar.phone;
+
+import static android.view.Display.DEFAULT_DISPLAY;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+
+import android.graphics.Rect;
+import android.testing.AndroidTestingRunner;
+import android.testing.TestableLooper.RunWithLooper;
+import android.view.IWindowManager;
+import android.view.View;
+
+import androidx.test.filters.SmallTest;
+
+import com.android.systemui.Dependency;
+import com.android.systemui.SysuiTestCase;
+import com.android.systemui.statusbar.CommandQueue;
+import com.android.systemui.statusbar.NotificationRemoteInputManager;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+/** atest AutoHideControllerTest */
+@RunWith(AndroidTestingRunner.class)
+@RunWithLooper
+@SmallTest
+public class AutoHideControllerTest extends SysuiTestCase {
+
+    private AutoHideController mAutoHideController;
+
+    private static final int FULL_MASK = 0xffffffff;
+
+    @Before
+    public void setUp() {
+        mContext.putComponent(CommandQueue.class, mock(CommandQueue.class));
+        mAutoHideController =
+                spy(new AutoHideController(mContext, Dependency.get(Dependency.MAIN_HANDLER),
+                        mock(NotificationRemoteInputManager.class), mock(IWindowManager.class)));
+        mAutoHideController.mDisplayId = DEFAULT_DISPLAY;
+        mAutoHideController.mSystemUiVisibility = View.VISIBLE;
+    }
+
+    @After
+    public void tearDown() {
+        mAutoHideController = null;
+    }
+
+    @Test
+    public void testSetSystemUiVisibilityEarlyReturnWithDifferentDisplay() {
+        mAutoHideController.setSystemUiVisibility(1, 1, 2, 3, 4, null, new Rect(), false);
+
+        verify(mAutoHideController, never()).notifySystemUiVisibilityChanged(anyInt());
+    }
+
+    @Test
+    public void testSetSystemUiVisibilityEarlyReturnWithSameVisibility() {
+        mAutoHideController
+                .setSystemUiVisibility(
+                        DEFAULT_DISPLAY, View.VISIBLE, 2, 3, 4, null, new Rect(), false);
+
+        verify(mAutoHideController, never()).notifySystemUiVisibilityChanged(anyInt());
+    }
+
+    // Test if status bar unhide status doesn't change without status bar.
+    @Test
+    public void testSetSystemUiVisibilityWithoutStatusBar() {
+        doReturn(false).when(mAutoHideController).hasStatusBar();
+        int expectedStatus = View.STATUS_BAR_UNHIDE;
+        mAutoHideController.mSystemUiVisibility =
+                View.SYSTEM_UI_FLAG_FULLSCREEN | View.STATUS_BAR_UNHIDE;
+
+        mAutoHideController.setSystemUiVisibility(
+                DEFAULT_DISPLAY, expectedStatus, 2, 3, FULL_MASK, null, new Rect(), false);
+
+        assertEquals("System UI visibility should not be changed",
+                expectedStatus, mAutoHideController.mSystemUiVisibility);
+        verify(mAutoHideController, times(1)).notifySystemUiVisibilityChanged(eq(expectedStatus));
+    }
+
+    @Test
+    public void testSetSystemUiVisibilityWithVisChanged() {
+        doReturn(true).when(mAutoHideController).hasStatusBar();
+        doReturn(true).when(mAutoHideController).hasNavigationBar();
+        mAutoHideController.mSystemUiVisibility = View.SYSTEM_UI_FLAG_FULLSCREEN
+                | View.STATUS_BAR_UNHIDE
+                | View.NAVIGATION_BAR_UNHIDE;
+
+        mAutoHideController.setSystemUiVisibility(
+                DEFAULT_DISPLAY, View.STATUS_BAR_UNHIDE | View.NAVIGATION_BAR_UNHIDE,
+                2, 3, FULL_MASK, null, new Rect(), false);
+
+        int expectedStatus = View.VISIBLE;
+        assertEquals(expectedStatus, mAutoHideController.mSystemUiVisibility);
+        verify(mAutoHideController).notifySystemUiVisibilityChanged(eq(expectedStatus));
+    }
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LightBarControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LightBarControllerTest.java
deleted file mode 100644
index 6260d53..0000000
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LightBarControllerTest.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * Copyright (C) 2019 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.statusbar.phone;
-
-import static android.view.WindowInsetsController.APPEARANCE_LIGHT_TOP_BAR;
-
-import static com.android.systemui.statusbar.phone.BarTransitions.MODE_TRANSPARENT;
-
-import static org.mockito.ArgumentMatchers.anyBoolean;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.graphics.Rect;
-import android.testing.AndroidTestingRunner;
-import android.testing.TestableLooper;
-
-import androidx.test.filters.SmallTest;
-
-import com.android.internal.view.AppearanceRegion;
-import com.android.systemui.SysuiTestCase;
-import com.android.systemui.statusbar.policy.BatteryController;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@SmallTest
-@RunWith(AndroidTestingRunner.class)
-@TestableLooper.RunWithLooper
-public class LightBarControllerTest extends SysuiTestCase {
-
-    private LightBarTransitionsController mLightBarTransitionsController;
-    private SysuiDarkIconDispatcher mStatusBarIconController;
-    private LightBarController mLightBarController;
-
-    @Before
-    public void setup() {
-        mStatusBarIconController = mock(SysuiDarkIconDispatcher.class);
-        mLightBarTransitionsController = mock(LightBarTransitionsController.class);
-        when(mStatusBarIconController.getTransitionsController()).thenReturn(
-                mLightBarTransitionsController);
-        mLightBarController = new LightBarController(mContext, mStatusBarIconController,
-                mock(BatteryController.class));
-    }
-
-    @Test
-    public void testOnStatusBarAppearanceChanged_multipleStacks_allStacksLight() {
-        final Rect firstBounds = new Rect(0, 0, 1, 1);
-        final Rect secondBounds = new Rect(1, 0, 2, 1);
-        final AppearanceRegion[] appearanceRegions = new AppearanceRegion[]{
-                new AppearanceRegion(APPEARANCE_LIGHT_TOP_BAR, firstBounds),
-                new AppearanceRegion(APPEARANCE_LIGHT_TOP_BAR, secondBounds)
-        };
-        mLightBarController.onStatusBarAppearanceChanged(
-                appearanceRegions, true /* sbModeChanged */, MODE_TRANSPARENT,
-                false /* navbarColorManagedByIme */);
-        verify(mStatusBarIconController).setIconsDarkArea(eq(null));
-        verify(mLightBarTransitionsController).setIconsDark(eq(true), anyBoolean());
-    }
-
-    @Test
-    public void testOnStatusBarAppearanceChanged_multipleStacks_oneStackLightOneStackDark() {
-        final Rect firstBounds = new Rect(0, 0, 1, 1);
-        final Rect secondBounds = new Rect(1, 0, 2, 1);
-        final AppearanceRegion[] appearanceRegions = new AppearanceRegion[]{
-                new AppearanceRegion(APPEARANCE_LIGHT_TOP_BAR, firstBounds),
-                new AppearanceRegion(0 /* appearance */, secondBounds)
-        };
-        mLightBarController.onStatusBarAppearanceChanged(
-                appearanceRegions, true /* sbModeChanged */, MODE_TRANSPARENT,
-                false /* navbarColorManagedByIme */);
-        verify(mStatusBarIconController).setIconsDarkArea(eq(firstBounds));
-        verify(mLightBarTransitionsController).setIconsDark(eq(true), anyBoolean());
-    }
-
-    @Test
-    public void testOnStatusBarAppearanceChanged_multipleStacks_oneStackDarkOneStackLight() {
-        final Rect firstBounds = new Rect(0, 0, 1, 1);
-        final Rect secondBounds = new Rect(1, 0, 2, 1);
-        final AppearanceRegion[] appearanceRegions = new AppearanceRegion[]{
-                new AppearanceRegion(0 /* appearance */, firstBounds),
-                new AppearanceRegion(APPEARANCE_LIGHT_TOP_BAR, secondBounds)
-        };
-        mLightBarController.onStatusBarAppearanceChanged(
-                appearanceRegions, true /* sbModeChanged */, MODE_TRANSPARENT,
-                false /* navbarColorManagedByIme */);
-        verify(mStatusBarIconController).setIconsDarkArea(eq(secondBounds));
-        verify(mLightBarTransitionsController).setIconsDark(eq(true), anyBoolean());
-    }
-
-    @Test
-    public void testOnStatusBarAppearanceChanged_multipleStacks_allStacksDark() {
-        final Rect firstBounds = new Rect(0, 0, 1, 1);
-        final Rect secondBounds = new Rect(1, 0, 2, 1);
-        final AppearanceRegion[] appearanceRegions = new AppearanceRegion[]{
-                new AppearanceRegion(0 /* appearance */, firstBounds),
-                new AppearanceRegion(0 /* appearance */, secondBounds)
-        };
-        mLightBarController.onStatusBarAppearanceChanged(
-                appearanceRegions, true /* sbModeChanged */, MODE_TRANSPARENT,
-                false /* navbarColorManagedByIme */);
-        verify(mLightBarTransitionsController).setIconsDark(eq(false), anyBoolean());
-    }
-
-    @Test
-    public void testOnStatusBarAppearanceChanged_singleStack_light() {
-        final AppearanceRegion[] appearanceRegions = new AppearanceRegion[]{
-                new AppearanceRegion(APPEARANCE_LIGHT_TOP_BAR, new Rect(0, 0, 1, 1))
-        };
-        mLightBarController.onStatusBarAppearanceChanged(
-                appearanceRegions, true /* sbModeChanged */, MODE_TRANSPARENT,
-                false /* navbarColorManagedByIme */);
-        verify(mStatusBarIconController).setIconsDarkArea(eq(null));
-        verify(mLightBarTransitionsController).setIconsDark(eq(true), anyBoolean());
-    }
-
-    @Test
-    public void testOnStatusBarAppearanceChanged_singleStack_dark() {
-        final AppearanceRegion[] appearanceRegions = new AppearanceRegion[]{
-                new AppearanceRegion(0, new Rect(0, 0, 1, 1))
-        };
-        mLightBarController.onStatusBarAppearanceChanged(
-                appearanceRegions, true /* sbModeChanged */, MODE_TRANSPARENT,
-                false /* navbarColorManagedByIme */);
-        verify(mLightBarTransitionsController).setIconsDark(eq(false), anyBoolean());
-    }
-}