Extract SysUi state management out of OverviewProxyService

Move all sysUi state flag handling into a
separate class.

fixes: 138601608
Test: atest SysUiStateFlagsContainerTest
Checked that callbacks were being sent in
OPS, EdgeHandler and in Launcher codebase via
debugger.

Change-Id: Ie8f7ef2e647db88d244af1062eb95dbb69a46919
diff --git a/packages/SystemUI/src/com/android/systemui/Dependency.java b/packages/SystemUI/src/com/android/systemui/Dependency.java
index 59270a0..f9452e2 100644
--- a/packages/SystemUI/src/com/android/systemui/Dependency.java
+++ b/packages/SystemUI/src/com/android/systemui/Dependency.java
@@ -41,6 +41,7 @@
 import com.android.systemui.fragments.FragmentService;
 import com.android.systemui.keyguard.ScreenLifecycle;
 import com.android.systemui.keyguard.WakefulnessLifecycle;
+import com.android.systemui.model.SysUiState;
 import com.android.systemui.plugins.ActivityStarter;
 import com.android.systemui.plugins.DarkIconDispatcher;
 import com.android.systemui.plugins.FalsingManager;
@@ -304,6 +305,7 @@
     @Inject Lazy<ChannelEditorDialogController> mChannelEditorDialogController;
     @Inject Lazy<INotificationManager> mINotificationManager;
     @Inject Lazy<FalsingManager> mFalsingManager;
+    @Inject Lazy<SysUiState> mSysUiStateFlagsContainer;
 
     @Inject
     public Dependency() {
@@ -482,6 +484,7 @@
         mProviders.put(ChannelEditorDialogController.class, mChannelEditorDialogController::get);
         mProviders.put(INotificationManager.class, mINotificationManager::get);
         mProviders.put(FalsingManager.class, mFalsingManager::get);
+        mProviders.put(SysUiState.class, mSysUiStateFlagsContainer::get);
 
         // TODO(b/118592525): to support multi-display , we start to add something which is
         //                    per-display, while others may be global. I think it's time to add
diff --git a/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java b/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java
index 3ce8a4b..b67d7df 100644
--- a/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java
+++ b/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java
@@ -30,6 +30,7 @@
 import com.android.keyguard.KeyguardUpdateMonitor;
 import com.android.keyguard.ViewMediatorCallback;
 import com.android.systemui.keyguard.DismissCallbackRegistry;
+import com.android.systemui.model.SysUiState;
 import com.android.systemui.plugins.FalsingManager;
 import com.android.systemui.plugins.statusbar.StatusBarStateController;
 import com.android.systemui.statusbar.KeyguardIndicationController;
diff --git a/packages/SystemUI/src/com/android/systemui/SystemUIModule.java b/packages/SystemUI/src/com/android/systemui/SystemUIModule.java
index edd2463..5d103eb 100644
--- a/packages/SystemUI/src/com/android/systemui/SystemUIModule.java
+++ b/packages/SystemUI/src/com/android/systemui/SystemUIModule.java
@@ -20,6 +20,7 @@
 import android.content.Context;
 import android.content.pm.PackageManager;
 
+import com.android.systemui.model.SysUiState;
 import com.android.systemui.plugins.statusbar.StatusBarStateController;
 import com.android.systemui.statusbar.phone.KeyguardLiftController;
 import com.android.systemui.util.AsyncSensorManager;
@@ -47,4 +48,11 @@
         }
         return new KeyguardLiftController(context, statusBarStateController, asyncSensorManager);
     }
+
+
+    @Singleton
+    @Provides
+    static SysUiState provideSysUiState() {
+        return new SysUiState();
+    }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/assist/AssistHandleLikeHomeBehavior.java b/packages/SystemUI/src/com/android/systemui/assist/AssistHandleLikeHomeBehavior.java
index 6cf2034..763315d 100644
--- a/packages/SystemUI/src/com/android/systemui/assist/AssistHandleLikeHomeBehavior.java
+++ b/packages/SystemUI/src/com/android/systemui/assist/AssistHandleLikeHomeBehavior.java
@@ -22,8 +22,8 @@
 
 import com.android.systemui.Dependency;
 import com.android.systemui.assist.AssistHandleBehaviorController.BehaviorController;
+import com.android.systemui.model.SysUiState;
 import com.android.systemui.plugins.statusbar.StatusBarStateController;
-import com.android.systemui.recents.OverviewProxyService;
 import com.android.systemui.shared.system.QuickStepContract;
 
 import java.io.PrintWriter;
@@ -41,15 +41,11 @@
                     handleDozingChanged(isDozing);
                 }
             };
-    private final OverviewProxyService.OverviewProxyListener mOverviewProxyListener =
-            new OverviewProxyService.OverviewProxyListener() {
-        @Override
-        public void onSystemUiStateChanged(int sysuiStateFlags) {
-            handleSystemUiStateChange(sysuiStateFlags);
-        }
-    };
+
+    private final SysUiState.SysUiStateCallback mSysUiStateCallback =
+            this::handleSystemUiStateChange;
     private final StatusBarStateController mStatusBarStateController;
-    private final OverviewProxyService mOverviewProxyService;
+    private final SysUiState mSysUiFlagContainer;
 
     private boolean mIsDozing;
     private boolean mIsHomeHandleHiding;
@@ -58,7 +54,7 @@
 
     AssistHandleLikeHomeBehavior() {
         mStatusBarStateController = Dependency.get(StatusBarStateController.class);
-        mOverviewProxyService = Dependency.get(OverviewProxyService.class);
+        mSysUiFlagContainer = Dependency.get(SysUiState.class);
     }
 
     @Override
@@ -66,14 +62,14 @@
         mAssistHandleCallbacks = callbacks;
         mIsDozing = mStatusBarStateController.isDozing();
         mStatusBarStateController.addCallback(mStatusBarStateListener);
-        mOverviewProxyService.addCallback(mOverviewProxyListener);
+        mSysUiFlagContainer.addCallback(mSysUiStateCallback);
         callbackForCurrentState();
     }
 
     @Override
     public void onModeDeactivated() {
         mAssistHandleCallbacks = null;
-        mOverviewProxyService.removeCallback(mOverviewProxyListener);
+        mSysUiFlagContainer.removeCallback(mSysUiStateCallback);
     }
 
     private static boolean isHomeHandleHiding(int sysuiStateFlags) {
diff --git a/packages/SystemUI/src/com/android/systemui/assist/AssistHandleReminderExpBehavior.java b/packages/SystemUI/src/com/android/systemui/assist/AssistHandleReminderExpBehavior.java
index f9ddeae..1e20b99 100644
--- a/packages/SystemUI/src/com/android/systemui/assist/AssistHandleReminderExpBehavior.java
+++ b/packages/SystemUI/src/com/android/systemui/assist/AssistHandleReminderExpBehavior.java
@@ -32,6 +32,7 @@
 import com.android.internal.config.sysui.SystemUiDeviceConfigFlags;
 import com.android.systemui.Dependency;
 import com.android.systemui.assist.AssistHandleBehaviorController.BehaviorController;
+import com.android.systemui.model.SysUiState;
 import com.android.systemui.plugins.statusbar.StatusBarStateController;
 import com.android.systemui.recents.OverviewProxyService;
 import com.android.systemui.shared.system.ActivityManagerWrapper;
@@ -107,12 +108,10 @@
                 public void onOverviewShown(boolean fromHome) {
                     handleOverviewShown();
                 }
-
-                @Override
-                public void onSystemUiStateChanged(int sysuiStateFlags) {
-                    handleSystemUiStateChanged(sysuiStateFlags);
-                }
             };
+
+    private final SysUiState.SysUiStateCallback mSysUiStateCallback =
+            this::handleSystemUiStateChanged;
     private final BroadcastReceiver mDefaultHomeBroadcastReceiver = new BroadcastReceiver() {
         @Override
         public void onReceive(Context context, Intent intent) {
@@ -127,6 +126,7 @@
     private final StatusBarStateController mStatusBarStateController;
     private final ActivityManagerWrapper mActivityManagerWrapper;
     private final OverviewProxyService mOverviewProxyService;
+    private final SysUiState mSysUiFlagContainer;
 
     private boolean mOnLockscreen;
     private boolean mIsDozing;
@@ -154,6 +154,7 @@
         mStatusBarStateController = Dependency.get(StatusBarStateController.class);
         mActivityManagerWrapper = ActivityManagerWrapper.getInstance();
         mOverviewProxyService = Dependency.get(OverviewProxyService.class);
+        mSysUiFlagContainer = Dependency.get(SysUiState.class);
         mDefaultHomeIntentFilter = new IntentFilter();
         for (String action : DEFAULT_HOME_CHANGE_ACTIONS) {
             mDefaultHomeIntentFilter.addAction(action);
@@ -174,6 +175,7 @@
         mRunningTaskId = runningTaskInfo == null ? 0 : runningTaskInfo.taskId;
         mActivityManagerWrapper.registerTaskStackListener(mTaskStackChangeListener);
         mOverviewProxyService.addCallback(mOverviewProxyListener);
+        mSysUiFlagContainer.addCallback(mSysUiStateCallback);
 
         mLearningTimeElapsed = Settings.Secure.getLong(
                 context.getContentResolver(), LEARNING_TIME_ELAPSED_KEY, /* default = */ 0);
@@ -199,6 +201,7 @@
         mStatusBarStateController.removeCallback(mStatusBarStateListener);
         mActivityManagerWrapper.unregisterTaskStackListener(mTaskStackChangeListener);
         mOverviewProxyService.removeCallback(mOverviewProxyListener);
+        mSysUiFlagContainer.removeCallback(mSysUiStateCallback);
     }
 
     @Override
diff --git a/packages/SystemUI/src/com/android/systemui/model/SysUiState.java b/packages/SystemUI/src/com/android/systemui/model/SysUiState.java
new file mode 100644
index 0000000..029ab43
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/model/SysUiState.java
@@ -0,0 +1,114 @@
+/*
+ * 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.model;
+
+import static android.view.Display.DEFAULT_DISPLAY;
+
+import android.annotation.NonNull;
+
+import com.android.systemui.Dumpable;
+import com.android.systemui.shared.system.QuickStepContract;
+
+import java.io.FileDescriptor;
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.inject.Singleton;
+
+/**
+ * Contains sysUi state flags and notifies registered
+ * listeners whenever changes happen.
+ */
+@Singleton
+public class SysUiState implements Dumpable {
+
+    private @QuickStepContract.SystemUiStateFlags int mFlags;
+    private final List<SysUiStateCallback> mCallbacks = new ArrayList<>();
+    private int mFlagsToSet = 0;
+    private int mFlagsToClear = 0;
+
+    /**
+     * Add listener to be notified of changes made to SysUI state.
+     * The callback will also be called as part of this function.
+     */
+    public void addCallback(@NonNull SysUiStateCallback callback) {
+        mCallbacks.add(callback);
+        callback.onSystemUiStateChanged(mFlags);
+    }
+
+    /** Callback will no longer receive events on state change */
+    public void removeCallback(@NonNull SysUiStateCallback callback) {
+        mCallbacks.remove(callback);
+    }
+
+    /** Methods to this call can be chained together before calling {@link #commitUpdate(int)}. */
+    public SysUiState setFlag(int flag, boolean enabled) {
+        if (enabled) {
+            mFlagsToSet |= flag;
+        } else {
+            mFlagsToClear |= flag;
+        }
+        return this;
+    }
+
+    /** Call to save all the flags updated from {@link #setFlag(int, boolean)}. */
+    public void commitUpdate(int displayId) {
+        updateFlags(displayId);
+        mFlagsToSet = 0;
+        mFlagsToClear = 0;
+    }
+
+    private void updateFlags(int displayId) {
+        if (displayId != DEFAULT_DISPLAY) {
+            // Ignore non-default displays for now
+            return;
+        }
+
+        int newState = mFlags;
+        newState |= mFlagsToSet;
+        newState &= ~mFlagsToClear;
+        notifyAndSetSystemUiStateChanged(newState, mFlags);
+    }
+
+    /** Notify all those who are registered that the state has changed. */
+    private void notifyAndSetSystemUiStateChanged(int newFlags, int oldFlags) {
+        if (newFlags != oldFlags) {
+            mCallbacks.forEach(callback -> callback.onSystemUiStateChanged(newFlags));
+            mFlags = newFlags;
+        }
+    }
+
+    @Override
+    public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
+        pw.println("SysUiState state:");
+        pw.print("  mSysUiStateFlags="); pw.println(mFlags);
+        pw.println("    " + QuickStepContract.getSystemUiStateString(mFlags));
+        pw.print("    backGestureDisabled=");
+        pw.println(QuickStepContract.isBackGestureDisabled(mFlags));
+        pw.print("    assistantGestureDisabled=");
+        pw.println(QuickStepContract.isAssistantGestureDisabled(mFlags));
+    }
+
+    /** Callback to be notified whenever system UI state flags are changed. */
+    public interface SysUiStateCallback{
+        /** To be called when any SysUiStateFlag gets updated */
+        void onSystemUiStateChanged(@QuickStepContract.SystemUiStateFlags int sysUiFlags);
+    }
+}
+
+
diff --git a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java
index 16f0b15..9268ee0 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java
@@ -17,7 +17,6 @@
 package com.android.systemui.recents;
 
 import static android.content.pm.PackageManager.MATCH_SYSTEM_ONLY;
-import static android.view.Display.DEFAULT_DISPLAY;
 import static android.view.MotionEvent.ACTION_CANCEL;
 import static android.view.MotionEvent.ACTION_DOWN;
 import static android.view.MotionEvent.ACTION_UP;
@@ -58,12 +57,12 @@
 import com.android.internal.policy.ScreenDecorationsUtils;
 import com.android.systemui.Dumpable;
 import com.android.systemui.SysUiServiceProvider;
+import com.android.systemui.model.SysUiState;
 import com.android.systemui.recents.OverviewProxyService.OverviewProxyListener;
 import com.android.systemui.shared.recents.IOverviewProxy;
 import com.android.systemui.shared.recents.ISystemUiProxy;
 import com.android.systemui.shared.system.ActivityManagerWrapper;
 import com.android.systemui.shared.system.QuickStepContract;
-import com.android.systemui.shared.system.QuickStepContract.SystemUiStateFlags;
 import com.android.systemui.stackdivider.Divider;
 import com.android.systemui.statusbar.NavigationBarController;
 import com.android.systemui.statusbar.phone.NavigationBarFragment;
@@ -101,6 +100,7 @@
     private static final long MAX_BACKOFF_MILLIS = 10 * 60 * 1000;
 
     private final Context mContext;
+    private SysUiState mSysUiState;
     private final Handler mHandler;
     private final NavigationBarController mNavBarController;
     private final StatusBarWindowController mStatusBarWinController;
@@ -114,7 +114,6 @@
 
     private IOverviewProxy mOverviewProxy;
     private int mConnectionBackoffAttempts;
-    private @SystemUiStateFlags int mSysUiStateFlags;
     private boolean mBound;
     private boolean mIsEnabled;
     private int mCurrentBoundedUserId = -1;
@@ -464,7 +463,8 @@
     @Inject
     public OverviewProxyService(Context context, DeviceProvisionedController provisionController,
             NavigationBarController navBarController, NavigationModeController navModeController,
-            StatusBarWindowController statusBarWinController) {
+            StatusBarWindowController statusBarWinController,
+            SysUiState sysUiState) {
         mContext = context;
         mHandler = new Handler();
         mNavBarController = navBarController;
@@ -478,6 +478,8 @@
         mWindowCornerRadius = ScreenDecorationsUtils.getWindowCornerRadius(mContext.getResources());
         mSupportsRoundedCornersOnWindows = ScreenDecorationsUtils
                 .supportsRoundedCornersOnWindows(mContext.getResources());
+        mSysUiState = sysUiState;
+        mSysUiState.addCallback(this::notifySystemUiStateFlags);
 
         // Assumes device always starts with back button until launcher tells it that it does not
         mNavBarButtonAlpha = 1.0f;
@@ -512,36 +514,12 @@
         }
     }
 
-    public void setSystemUiStateFlag(int flag, boolean enabled, int displayId) {
-        if (displayId != DEFAULT_DISPLAY) {
-            // Ignore non-default displays for now
-            return;
-        }
-
-        int newState = mSysUiStateFlags;
-        if (enabled) {
-            newState |= flag;
-        } else {
-            newState &= ~flag;
-        }
-        if (mSysUiStateFlags != newState) {
-            mSysUiStateFlags = newState;
-            notifySystemUiStateChanged(mSysUiStateFlags);
-            notifySystemUiStateFlags(mSysUiStateFlags);
-        }
-    }
-
-    public int getSystemUiStateFlags() {
-        return mSysUiStateFlags;
-    }
-
     private void updateSystemUiStateFlags() {
         final NavigationBarFragment navBarFragment =
                 mNavBarController.getDefaultNavigationBarFragment();
         final NavigationBarView navBarView =
                 mNavBarController.getNavigationBarView(mContext.getDisplayId());
 
-        mSysUiStateFlags = 0;
         if (navBarFragment != null) {
             navBarFragment.updateSystemUiStateFlags(-1);
         }
@@ -552,7 +530,6 @@
         if (mStatusBarWinController != null) {
             mStatusBarWinController.notifyStateChangedCallbacks();
         }
-        notifySystemUiStateFlags(mSysUiStateFlags);
     }
 
     private void notifySystemUiStateFlags(int flags) {
@@ -568,11 +545,13 @@
     private void onStatusBarStateChanged(boolean keyguardShowing, boolean keyguardOccluded,
             boolean bouncerShowing) {
         int displayId = mContext.getDisplayId();
-        setSystemUiStateFlag(SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING,
-                keyguardShowing && !keyguardOccluded, displayId);
-        setSystemUiStateFlag(SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING_OCCLUDED,
-                keyguardShowing && keyguardOccluded, displayId);
-        setSystemUiStateFlag(SYSUI_STATE_BOUNCER_SHOWING, bouncerShowing, displayId);
+
+        mSysUiState.setFlag(SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING,
+                        keyguardShowing && !keyguardOccluded)
+                .setFlag(SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING_OCCLUDED,
+                        keyguardShowing && keyguardOccluded)
+                .setFlag(SYSUI_STATE_BOUNCER_SHOWING, bouncerShowing)
+                .commitUpdate(displayId);
     }
 
     /**
@@ -665,7 +644,6 @@
         mConnectionCallbacks.add(listener);
         listener.onConnectionChanged(mOverviewProxy != null);
         listener.onNavBarButtonAlphaChanged(mNavBarButtonAlpha, false);
-        listener.onSystemUiStateChanged(mSysUiStateFlags);
     }
 
     @Override
@@ -736,12 +714,6 @@
         }
     }
 
-    private void notifySystemUiStateChanged(int sysuiStateFlags) {
-        for (int i = mConnectionCallbacks.size() - 1; i >= 0; --i) {
-            mConnectionCallbacks.get(i).onSystemUiStateChanged(sysuiStateFlags);
-        }
-    }
-
     private void notifyStartAssistant(Bundle bundle) {
         for (int i = mConnectionCallbacks.size() - 1; i >= 0; --i) {
             mConnectionCallbacks.get(i).startAssistant(bundle);
@@ -782,12 +754,7 @@
 
         pw.print("  quickStepIntent="); pw.println(mQuickStepIntent);
         pw.print("  quickStepIntentResolved="); pw.println(isEnabled());
-        pw.print("  mSysUiStateFlags="); pw.println(mSysUiStateFlags);
-        pw.println("    " + QuickStepContract.getSystemUiStateString(mSysUiStateFlags));
-        pw.print("    backGestureDisabled=");
-        pw.println(QuickStepContract.isBackGestureDisabled(mSysUiStateFlags));
-        pw.print("    assistantGestureDisabled=");
-        pw.println(QuickStepContract.isAssistantGestureDisabled(mSysUiStateFlags));
+        mSysUiState.dump(fd, pw, args);
         pw.print(" mInputFocusTransferStarted="); pw.println(mInputFocusTransferStarted);
     }
 
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 3314e67..575b559 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/EdgeBackGestureHandler.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/EdgeBackGestureHandler.java
@@ -55,6 +55,7 @@
 import com.android.systemui.Dependency;
 import com.android.systemui.R;
 import com.android.systemui.bubbles.BubbleController;
+import com.android.systemui.model.SysUiState;
 import com.android.systemui.recents.OverviewProxyService;
 import com.android.systemui.shared.system.QuickStepContract;
 import com.android.systemui.shared.system.WindowManagerWrapper;
@@ -166,8 +167,10 @@
     private RegionSamplingHelper mRegionSamplingHelper;
     private int mLeftInset;
     private int mRightInset;
+    private int mSysUiFlags;
 
-    public EdgeBackGestureHandler(Context context, OverviewProxyService overviewProxyService) {
+    public EdgeBackGestureHandler(Context context, OverviewProxyService overviewProxyService,
+            SysUiState sysUiFlagContainer) {
         final Resources res = context.getResources();
         mContext = context;
         mDisplayId = context.getDisplayId();
@@ -186,6 +189,7 @@
         mMinArrowPosition = res.getDimensionPixelSize(R.dimen.navigation_edge_arrow_min_y);
         mFingerOffset = res.getDimensionPixelSize(R.dimen.navigation_edge_finger_offset);
         updateCurrentUserResources(res);
+        sysUiFlagContainer.addCallback(sysUiFlags -> mSysUiFlags = sysUiFlags);
     }
 
     public void updateCurrentUserResources(Resources res) {
@@ -352,10 +356,9 @@
         if (action == MotionEvent.ACTION_DOWN) {
             // Verify if this is in within the touch region and we aren't in immersive mode, and
             // either the bouncer is showing or the notification panel is hidden
-            int stateFlags = mOverviewProxyService.getSystemUiStateFlags();
             mIsOnLeftEdge = ev.getX() <= mEdgeWidth + mLeftInset;
             mInRejectedExclusion = false;
-            mAllowGesture = !QuickStepContract.isBackGestureDisabled(stateFlags)
+            mAllowGesture = !QuickStepContract.isBackGestureDisabled(mSysUiFlags)
                     && isWithinTouchRegion((int) ev.getX(), (int) ev.getY());
             if (mAllowGesture) {
                 mEdgePanelLp.gravity = mIsOnLeftEdge
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 5d3f3ac..2b8c86b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java
@@ -91,6 +91,7 @@
 import com.android.systemui.assist.AssistManager;
 import com.android.systemui.fragments.FragmentHostManager;
 import com.android.systemui.fragments.FragmentHostManager.FragmentListener;
+import com.android.systemui.model.SysUiState;
 import com.android.systemui.plugins.statusbar.StatusBarStateController;
 import com.android.systemui.recents.OverviewProxyService;
 import com.android.systemui.recents.Recents;
@@ -134,6 +135,7 @@
 
     private final AccessibilityManagerWrapper mAccessibilityManagerWrapper;
     protected final AssistManager mAssistManager;
+    private SysUiState mSysUiFlagsContainer;
     private final MetricsLogger mMetricsLogger;
     private final DeviceProvisionedController mDeviceProvisionedController;
     private final StatusBarStateController mStatusBarStateController;
@@ -245,12 +247,14 @@
             DeviceProvisionedController deviceProvisionedController, MetricsLogger metricsLogger,
             AssistManager assistManager, OverviewProxyService overviewProxyService,
             NavigationModeController navigationModeController,
-            StatusBarStateController statusBarStateController) {
+            StatusBarStateController statusBarStateController,
+            SysUiState sysUiFlagsContainer) {
         mAccessibilityManagerWrapper = accessibilityManagerWrapper;
         mDeviceProvisionedController = deviceProvisionedController;
         mStatusBarStateController = statusBarStateController;
         mMetricsLogger = metricsLogger;
         mAssistManager = assistManager;
+        mSysUiFlagsContainer = sysUiFlagsContainer;
         mAssistantAvailable = mAssistManager.getAssistInfoForUser(UserHandle.USER_CURRENT) != null;
         mOverviewProxyService = overviewProxyService;
         mNavBarMode = navigationModeController.addListener(this);
@@ -884,12 +888,11 @@
         }
         boolean clickable = (a11yFlags & SYSUI_STATE_A11Y_BUTTON_CLICKABLE) != 0;
         boolean longClickable = (a11yFlags & SYSUI_STATE_A11Y_BUTTON_LONG_CLICKABLE) != 0;
-        mOverviewProxyService.setSystemUiStateFlag(SYSUI_STATE_A11Y_BUTTON_CLICKABLE,
-                clickable, mDisplayId);
-        mOverviewProxyService.setSystemUiStateFlag(SYSUI_STATE_A11Y_BUTTON_LONG_CLICKABLE,
-                longClickable, mDisplayId);
-        mOverviewProxyService.setSystemUiStateFlag(SYSUI_STATE_NAV_BAR_HIDDEN,
-                !isNavBarWindowVisible(), mDisplayId);
+
+        mSysUiFlagsContainer.setFlag(SYSUI_STATE_A11Y_BUTTON_CLICKABLE, clickable)
+                .setFlag(SYSUI_STATE_A11Y_BUTTON_LONG_CLICKABLE, longClickable)
+                .setFlag(SYSUI_STATE_NAV_BAR_HIDDEN, !isNavBarWindowVisible())
+                .commitUpdate(mDisplayId);
     }
 
     /**
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 3485f23..fa4812d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
@@ -68,6 +68,7 @@
 import com.android.systemui.R;
 import com.android.systemui.SysUiServiceProvider;
 import com.android.systemui.assist.AssistManager;
+import com.android.systemui.model.SysUiState;
 import com.android.systemui.recents.OverviewProxyService;
 import com.android.systemui.recents.Recents;
 import com.android.systemui.recents.RecentsOnboarding;
@@ -92,6 +93,7 @@
     final static boolean ALTERNATE_CAR_MODE_UI = false;
     private final RegionSamplingHelper mRegionSamplingHelper;
     private final int mNavColorSampleMargin;
+    private final SysUiState mSysUiFlagContainer;
 
     View mCurrentView = null;
     private View mVertical;
@@ -266,6 +268,7 @@
         mNavBarMode = Dependency.get(NavigationModeController.class).addListener(this);
         boolean isGesturalMode = isGesturalMode(mNavBarMode);
 
+        mSysUiFlagContainer = Dependency.get(SysUiState.class);
         // Set up the context group of buttons
         mContextualButtonGroup = new ContextualButtonGroup(R.id.menu_container);
         final ContextualButton imeSwitcherButton = new ContextualButton(R.id.ime_switcher,
@@ -307,11 +310,10 @@
         mButtonDispatchers.put(R.id.menu_container, mContextualButtonGroup);
         mDeadZone = new DeadZone(this);
 
-        mNavColorSampleMargin =
-                getResources()
+        mNavColorSampleMargin = getResources()
                         .getDimensionPixelSize(R.dimen.navigation_handle_sample_horizontal_margin);
-
-        mEdgeBackGestureHandler = new EdgeBackGestureHandler(context, mOverviewProxyService);
+        mEdgeBackGestureHandler =
+                new EdgeBackGestureHandler(context, mOverviewProxyService, mSysUiFlagContainer);
         mRegionSamplingHelper = new RegionSamplingHelper(this,
                 new RegionSamplingHelper.SamplingCallback() {
                     @Override
@@ -745,23 +747,26 @@
 
     public void updateDisabledSystemUiStateFlags() {
         int displayId = mContext.getDisplayId();
-        mOverviewProxyService.setSystemUiStateFlag(SYSUI_STATE_SCREEN_PINNING,
-                ActivityManagerWrapper.getInstance().isScreenPinningActive(), displayId);
-        mOverviewProxyService.setSystemUiStateFlag(SYSUI_STATE_OVERVIEW_DISABLED,
-                (mDisabledFlags & View.STATUS_BAR_DISABLE_RECENT) != 0, displayId);
-        mOverviewProxyService.setSystemUiStateFlag(SYSUI_STATE_HOME_DISABLED,
-                (mDisabledFlags & View.STATUS_BAR_DISABLE_HOME) != 0, displayId);
-        mOverviewProxyService.setSystemUiStateFlag(SYSUI_STATE_SEARCH_DISABLED,
-                (mDisabledFlags & View.STATUS_BAR_DISABLE_SEARCH) != 0, displayId);
+
+        mSysUiFlagContainer.setFlag(SYSUI_STATE_SCREEN_PINNING,
+                        ActivityManagerWrapper.getInstance().isScreenPinningActive())
+                .setFlag(SYSUI_STATE_OVERVIEW_DISABLED,
+                        (mDisabledFlags & View.STATUS_BAR_DISABLE_RECENT) != 0)
+                .setFlag(SYSUI_STATE_HOME_DISABLED,
+                        (mDisabledFlags & View.STATUS_BAR_DISABLE_HOME) != 0)
+                .setFlag(SYSUI_STATE_SEARCH_DISABLED,
+                        (mDisabledFlags & View.STATUS_BAR_DISABLE_SEARCH) != 0)
+                .commitUpdate(displayId);
     }
 
     public void updatePanelSystemUiStateFlags() {
         int displayId = mContext.getDisplayId();
         if (mPanelView != null) {
-            mOverviewProxyService.setSystemUiStateFlag(SYSUI_STATE_NOTIFICATION_PANEL_EXPANDED,
-                    mPanelView.isFullyExpanded() && !mPanelView.isInSettings(), displayId);
-            mOverviewProxyService.setSystemUiStateFlag(SYSUI_STATE_QUICK_SETTINGS_EXPANDED,
-                    mPanelView.isInSettings(), displayId);
+            mSysUiFlagContainer.setFlag(SYSUI_STATE_NOTIFICATION_PANEL_EXPANDED,
+                    mPanelView.isFullyExpanded() && !mPanelView.isInSettings())
+                    .setFlag(SYSUI_STATE_QUICK_SETTINGS_EXPANDED,
+                            mPanelView.isInSettings())
+                    .commitUpdate(displayId);
         }
     }