Window Manager Flag Migration (4/n)
Wire up the appearance and the transient state of system bars between
WMS and System UI. The derived classes of CommandQueue.Callbacks no
longer listen to setSystemUiVisibility, but listen to showTransient,
abortTransient, and onSystemBarAppearanceChanged instead.
Bug: 118118435
Test: atest InsetsSourceProviderTest InsetsStateControllerTest
InsetsPolicyTest WindowStateTests CommandQueueTest
RegisterStatusBarResultTest InsetsFlagsTest
LightBarControllerTest
Test: build on specific target
Change-Id: Ie35f4b4468bce7ef8c76f091e306610c069fba85
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
index d6a8f90..c9dc08e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
@@ -22,6 +22,8 @@
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;
@@ -43,12 +45,17 @@
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;
@@ -76,7 +83,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_SET_SYSTEMUI_VISIBILITY = 6 << MSG_SHIFT;
+ private static final int MSG_SYSTEM_BAR_APPEARANCE_CHANGED = 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;
@@ -115,6 +122,9 @@
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;
@@ -160,28 +170,6 @@
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.
@@ -292,6 +280,28 @@
* @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
@@ -456,28 +466,53 @@
}
}
+ // 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) {
- // Don't coalesce these, since it might have one time flags set such as
- // STATUS_BAR_UNHIDE which might get lost.
+ 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});
+ }
SomeArgs args = SomeArgs.obtain();
args.argi1 = displayId;
- 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();
+ 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();
}
}
@Override
- public void topAppWindowChanged(int displayId, boolean menuVisible) { }
+ 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();
+ }
+
+ }
@Override
public void setImeWindowStatus(int displayId, IBinder token, int vis, int backDisposition,
@@ -827,6 +862,33 @@
}
}
+ @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);
@@ -879,15 +941,6 @@
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 */,
@@ -1094,6 +1147,39 @@
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 5144a95..275475d6 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.restoreSystemUiVisibilityState();
+ navBar.restoreAppearanceAndTransientState();
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 8b9268e..e81e5ca 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarStateControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarStateControllerImpl.java
@@ -21,7 +21,6 @@
import android.text.format.DateFormat;
import android.util.FloatProperty;
import android.util.Log;
-import android.view.View;
import android.view.animation.Interpolator;
import com.android.internal.annotations.GuardedBy;
@@ -80,9 +79,14 @@
private HistoricalState[] mHistoricalRecords = new HistoricalState[HISTORY_SIZE];
/**
- * Current SystemUiVisibility
+ * If any of the system bars is hidden.
*/
- private int mSystemUiVisibility = View.SYSTEM_UI_FLAG_VISIBLE;
+ private boolean mIsFullscreen = false;
+
+ /**
+ * If the navigation bar can stay hidden when the display gets tapped.
+ */
+ private boolean mIsImmersive = false;
/**
* If the device is currently pulsing (AOD2).
@@ -320,12 +324,13 @@
}
@Override
- public void setSystemUiVisibility(int visibility) {
- if (mSystemUiVisibility != visibility) {
- mSystemUiVisibility = visibility;
+ public void setFullscreenState(boolean isFullscreen, boolean isImmersive) {
+ if (mIsFullscreen != isFullscreen || mIsImmersive != isImmersive) {
+ mIsFullscreen = isFullscreen;
+ mIsImmersive = isImmersive;
synchronized (mListeners) {
for (RankedListener rl : new ArrayList<>(mListeners)) {
- rl.mListener.onSystemUiVisibilityChanged(mSystemUiVisibility);
+ rl.mListener.onFullscreenStateChanged(isFullscreen, isImmersive);
}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/SysuiStatusBarStateController.java b/packages/SystemUI/src/com/android/systemui/statusbar/SysuiStatusBarStateController.java
index 2ad979ab..07b3550 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/SysuiStatusBarStateController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/SysuiStatusBarStateController.java
@@ -111,9 +111,9 @@
boolean isKeyguardRequested();
/**
- * Set systemui visibility
+ * Set the fullscreen state
*/
- void setSystemUiVisibility(int visibility);
+ void setFullscreenState(boolean isFullscreen, boolean isImmersive);
/**
* Set pulsing
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 175d072..008464e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/AutoHideController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/AutoHideController.java
@@ -17,52 +17,39 @@
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 implements CommandQueue.Callbacks {
+public class AutoHideController {
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;
- @VisibleForTesting
- int mDisplayId;
- @VisibleForTesting
- int mSystemUiVisibility;
- // last value sent to window manager
- private int mLastDispatchedSystemUiVisibility = ~View.SYSTEM_UI_FLAG_VISIBLE;
+ private int mDisplayId;
private boolean mAutoHideSuspended;
- private static final long AUTOHIDE_TIMEOUT_MS = 2250;
+ private static final long AUTO_HIDE_TIMEOUT_MS = 2250;
private final Runnable mAutoHide = () -> {
- int requested = mSystemUiVisibility & ~getTransientMask();
- if (mSystemUiVisibility != requested) {
- notifySystemUiVisibilityChanged(requested);
+ if (isAnyTransientBarShown()) {
+ hideTransientBars();
}
};
@@ -70,8 +57,6 @@
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;
@@ -79,13 +64,6 @@
mDisplayId = context.getDisplayId();
}
- @Override
- public void onDisplayRemoved(int displayId) {
- if (displayId == mDisplayId) {
- mCommandQueue.removeCallback(this);
- }
- }
-
void setStatusBar(StatusBar statusBar) {
mStatusBar = statusBar;
}
@@ -94,50 +72,18 @@
mNavigationBar = navigationBar;
}
- @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) {
+ private void hideTransientBars() {
try {
- if (mLastDispatchedSystemUiVisibility != vis) {
- mWindowManagerService.statusBarVisibilityChanged(mDisplayId, vis);
- mLastDispatchedSystemUiVisibility = vis;
- }
+ mWindowManagerService.hideTransientBars(mDisplayId);
} catch (RemoteException ex) {
Log.w(TAG, "Cannot get WindowManager");
}
+ if (mStatusBar != null) {
+ mStatusBar.clearTransient();
+ }
+ if (mNavigationBar != null) {
+ mNavigationBar.clearTransient();
+ }
}
void resumeSuspendedAutoHide() {
@@ -156,13 +102,12 @@
if (checkBarModesRunnable != null) {
mHandler.removeCallbacks(checkBarModesRunnable);
}
- mAutoHideSuspended = (mSystemUiVisibility & getTransientMask()) != 0;
+ mAutoHideSuspended = isAnyTransientBarShown();
}
void touchAutoHide() {
// update transient bar auto hide
- if ((hasStatusBar() && mStatusBar.getStatusBarMode() == MODE_SEMI_TRANSPARENT)
- || hasNavigationBar() && mNavigationBar.isSemiTransparent()) {
+ if (isAnyTransientBarShown()) {
scheduleAutoHide();
} else {
cancelAutoHide();
@@ -170,9 +115,9 @@
}
private Runnable getCheckBarModesRunnable() {
- if (hasStatusBar()) {
+ if (mStatusBar != null) {
return () -> mStatusBar.checkBarModes();
- } else if (hasNavigationBar()) {
+ } else if (mNavigationBar != null) {
return () -> mNavigationBar.checkNavBarModes();
} else {
return null;
@@ -186,15 +131,14 @@
private void scheduleAutoHide() {
cancelAutoHide();
- mHandler.postDelayed(mAutoHide, AUTOHIDE_TIMEOUT_MS);
+ mHandler.postDelayed(mAutoHide, AUTO_HIDE_TIMEOUT_MS);
}
void checkUserAutoHide(MotionEvent event) {
- boolean shouldAutoHide =
- (mSystemUiVisibility & getTransientMask()) != 0 // a transient bar is revealed.
+ boolean shouldAutoHide = isAnyTransientBarShown()
&& event.getAction() == MotionEvent.ACTION_OUTSIDE // touch outside the source bar.
&& event.getX() == 0 && event.getY() == 0;
- if (hasStatusBar()) {
+ if (mStatusBar != null) {
// a touch outside both bars
shouldAutoHide &= !mRemoteInputManager.getController().isRemoteInputActive();
}
@@ -208,23 +152,8 @@
mHandler.postDelayed(mAutoHide, 350); // longer than app gesture -> flag clear
}
- 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;
+ private boolean isAnyTransientBarShown() {
+ return (mStatusBar != null && mStatusBar.isTransientShown())
+ || mNavigationBar != null && mNavigationBar.isTransientShown();
}
}
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 211a40a..e6731e6 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_OPAQUE = 0;
+ public static final int MODE_TRANSPARENT = 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_TRANSPARENT = 4;
+ public static final int MODE_OPAQUE = 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 int mMode;
+ private @TransitionMode 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 442c089..c9c38a0 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/EdgeBackGestureHandler.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/EdgeBackGestureHandler.java
@@ -16,8 +16,6 @@
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;
@@ -133,7 +131,7 @@
private boolean mIsAttached;
private boolean mIsGesturalModeEnabled;
private boolean mIsEnabled;
- private boolean mIsInTransientImmersiveStickyState;
+ private boolean mIsNavBarShownTransiently;
private InputMonitor mInputMonitor;
private InputEventReceiver mInputEventReceiver;
@@ -198,10 +196,8 @@
updateCurrentUserResources(currentUserContext.getResources());
}
- public void onSystemUiVisibilityChanged(int systemUiVisibility) {
- mIsInTransientImmersiveStickyState =
- (systemUiVisibility & SYSTEM_UI_FLAG_IMMERSIVE_STICKY) != 0
- && (systemUiVisibility & NAVIGATION_BAR_TRANSIENT) != 0;
+ public void onNavBarTransientStateChanged(boolean isTransient) {
+ mIsNavBarShownTransiently = isTransient;
}
private void disposeInputChannel() {
@@ -316,7 +312,7 @@
}
// Always allow if the user is in a transient sticky immersive state
- if (mIsInTransientImmersiveStickyState) {
+ if (mIsNavBarShownTransiently) {
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 b0b656a..2e776e3 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarController.java
@@ -16,15 +16,20 @@
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.graphics.Rect;
-import android.view.View;
+import android.view.InsetsFlags;
+import android.view.ViewDebug;
+import android.view.WindowInsetsController.Appearance;
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;
@@ -49,13 +54,10 @@
private BiometricUnlockController mBiometricUnlockController;
private LightBarTransitionsController mNavigationBarController;
- private int mSystemUiVisibility;
- private int mFullscreenStackVisibility;
- private int mDockedStackVisibility;
- private boolean mFullscreenLight;
- private boolean mDockedLight;
- private int mLastStatusBarMode;
- private int mLastNavigationBarMode;
+ private @Appearance int mAppearance;
+ private AppearanceRegion[] mAppearanceRegions = new AppearanceRegion[0];
+ private int mStatusBarMode;
+ private int mNavigationBarMode;
private final Color mDarkModeColor;
/**
@@ -75,8 +77,6 @@
*/
private boolean mForceDarkForScrim;
- private final Rect mLastFullscreenBounds = new Rect();
- private final Rect mLastDockedBounds = new Rect();
private boolean mQsCustomizing;
private boolean mDirectReplying;
@@ -101,45 +101,32 @@
mBiometricUnlockController = biometricUnlockController;
}
- public void onSystemUiVisibilityChanged(int fullscreenStackVis, int dockedStackVis,
- int mask, Rect fullscreenStackBounds, Rect dockedStackBounds, boolean sbModeChanged,
+ void onStatusBarAppearanceChanged(AppearanceRegion[] appearanceRegions, boolean sbModeChanged,
int statusBarMode, boolean navbarColorManagedByIme) {
- 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);
+ final int numStacks = appearanceRegions.length;
+ boolean stackAppearancesChanged = mAppearanceRegions.length != numStacks;
+ for (int i = 0; i < numStacks && !stackAppearancesChanged; i++) {
+ stackAppearancesChanged |= !appearanceRegions[i].equals(mAppearanceRegions[i]);
}
-
- mFullscreenStackVisibility = newFullscreen;
- mDockedStackVisibility = newDocked;
- mLastStatusBarMode = statusBarMode;
+ if (stackAppearancesChanged || sbModeChanged) {
+ mAppearanceRegions = appearanceRegions;
+ onStatusBarModeChanged(statusBarMode);
+ }
mNavbarColorManagedByIme = navbarColorManagedByIme;
- mLastFullscreenBounds.set(fullscreenStackBounds);
- mLastDockedBounds.set(dockedStackBounds);
}
- public void onNavigationVisibilityChanged(int vis, int mask, boolean nbModeChanged,
+ void onStatusBarModeChanged(int newBarMode) {
+ mStatusBarMode = newBarMode;
+ updateStatus();
+ }
+
+ void onNavigationBarAppearanceChanged(@Appearance int appearance, boolean nbModeChanged,
int navigationBarMode, boolean navbarColorManagedByIme) {
- 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);
+ int diff = appearance ^ mAppearance;
+ if ((diff & APPEARANCE_LIGHT_SIDE_BARS) != 0 || nbModeChanged) {
+ final boolean last = mNavigationLight;
+ mHasLightNavigationBar = isLight(appearance, navigationBarMode,
+ APPEARANCE_LIGHT_SIDE_BARS);
mNavigationLight = mHasLightNavigationBar
&& (mDirectReplying && mNavbarColorManagedByIme || !mForceDarkForScrim)
&& !mQsCustomizing;
@@ -147,17 +134,20 @@
updateNavigation();
}
}
- mSystemUiVisibility = newVis;
- mLastNavigationBarMode = navigationBarMode;
+ mAppearance = appearance;
+ mNavigationBarMode = navigationBarMode;
mNavbarColorManagedByIme = navbarColorManagedByIme;
}
+ void onNavigationBarModeChanged(int newBarMode) {
+ mHasLightNavigationBar = isLight(mAppearance, newBarMode, APPEARANCE_LIGHT_SIDE_BARS);
+ }
+
private void reevaluate() {
- onSystemUiVisibilityChanged(mFullscreenStackVisibility,
- mDockedStackVisibility, 0 /* mask */, mLastFullscreenBounds, mLastDockedBounds,
- true /* sbModeChange*/, mLastStatusBarMode, mNavbarColorManagedByIme);
- onNavigationVisibilityChanged(mSystemUiVisibility, 0 /* mask */, true /* nbModeChanged */,
- mLastNavigationBarMode, mNavbarColorManagedByIme);
+ onStatusBarAppearanceChanged(mAppearanceRegions, true /* sbModeChange */, mStatusBarMode,
+ mNavbarColorManagedByIme);
+ onNavigationBarAppearanceChanged(mAppearance, true /* nbModeChanged */,
+ mNavigationBarMode, mNavbarColorManagedByIme);
}
public void setQsCustomizing(boolean customizing) {
@@ -191,10 +181,10 @@
}
}
- private boolean isLight(int vis, int barMode, int flag) {
- boolean isTransparentBar = (barMode == MODE_TRANSPARENT
+ private static boolean isLight(int appearance, int barMode, int flag) {
+ final boolean isTransparentBar = (barMode == MODE_TRANSPARENT
|| barMode == MODE_LIGHTS_OUT_TRANSPARENT);
- boolean light = (vis & flag) != 0;
+ final boolean light = (appearance & flag) != 0;
return isTransparentBar && light;
}
@@ -207,49 +197,49 @@
&& unlockMode != BiometricUnlockController.MODE_WAKE_AND_UNLOCK;
}
- private void updateStatus(Rect fullscreenStackBounds, Rect dockedStackBounds) {
- boolean hasDockedStack = !dockedStackBounds.isEmpty();
+ private void updateStatus() {
+ final int numStacks = mAppearanceRegions.length;
+ int numLightStacks = 0;
- // If both are light or fullscreen is light and there is no docked stack, all icons get
- // dark.
- if ((mFullscreenLight && mDockedLight) || (mFullscreenLight && !hasDockedStack)) {
+ // 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) {
mStatusBarIconController.setIconsDarkArea(null);
mStatusBarIconController.getTransitionsController().setIconsDark(true, animateChange());
}
- // 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)) {
+ // If no one is light, all icons become white.
+ else if (numLightStacks == 0) {
mStatusBarIconController.getTransitionsController().setIconsDark(
false, animateChange());
}
// Not the same for every stack, magic!
else {
- Rect bounds = mFullscreenLight ? fullscreenStackBounds : dockedStackBounds;
- if (bounds.isEmpty()) {
- mStatusBarIconController.setIconsDarkArea(null);
- } else {
- mStatusBarIconController.setIconsDarkArea(bounds);
- }
+ mStatusBarIconController.setIconsDarkArea(
+ mAppearanceRegions[indexLightStack].getBounds());
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();
}
@@ -257,24 +247,21 @@
@Override
public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
pw.println("LightBarController: ");
- 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(" 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(" mNavigationLight="); pw.print(mNavigationLight);
pw.print(" mHasLightNavigationBar="); pw.println(mHasLightNavigationBar);
- pw.print(" mLastStatusBarMode="); pw.print(mLastStatusBarMode);
- pw.print(" mLastNavigationBarMode="); pw.println(mLastNavigationBarMode);
+ pw.print(" mStatusBarMode="); pw.print(mStatusBarMode);
+ pw.print(" mNavigationBarMode="); pw.println(mNavigationBarMode);
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 38dc5ea..7030dfc 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java
@@ -21,6 +21,10 @@
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;
@@ -31,7 +35,6 @@
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;
@@ -52,7 +55,6 @@
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;
@@ -67,12 +69,14 @@
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;
@@ -84,6 +88,7 @@
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;
@@ -128,7 +133,8 @@
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_SYSTEM_UI_VISIBILITY = "system_ui_visibility";
+ private static final String EXTRA_APPEARANCE = "appearance";
+ private static final String EXTRA_TRANSIENT_STATE = "transient_state";
/** Allow some time inbetween the long press for back and recents. */
private static final int LOCK_TO_APP_GESTURE_TOLERENCE = 200;
@@ -165,7 +171,10 @@
private Locale mLocale;
private int mLayoutDirection;
- private int mSystemUiVisibility = View.SYSTEM_UI_FLAG_VISIBLE;
+ /** @see android.view.WindowInsetsController#setSystemBarsAppearance(int) */
+ private @Appearance int mAppearance;
+
+ private boolean mTransientShown;
private int mNavBarMode = NAV_BAR_MODE_3BUTTON;
private LightBarController mLightBarController;
private AutoHideController mAutoHideController;
@@ -295,7 +304,8 @@
if (savedInstanceState != null) {
mDisabledFlags1 = savedInstanceState.getInt(EXTRA_DISABLE_STATE, 0);
mDisabledFlags2 = savedInstanceState.getInt(EXTRA_DISABLE2_STATE, 0);
- mSystemUiVisibility = savedInstanceState.getInt(EXTRA_SYSTEM_UI_VISIBILITY, 0);
+ mAppearance = savedInstanceState.getInt(EXTRA_APPEARANCE, 0);
+ mTransientShown = savedInstanceState.getBoolean(EXTRA_TRANSIENT_STATE, false);
}
mAccessibilityManagerWrapper.addCallback(mAccessibilityListener);
@@ -397,7 +407,8 @@
super.onSaveInstanceState(outState);
outState.putInt(EXTRA_DISABLE_STATE, mDisabledFlags1);
outState.putInt(EXTRA_DISABLE2_STATE, mDisabledFlags2);
- outState.putInt(EXTRA_SYSTEM_UI_VISIBILITY, mSystemUiVisibility);
+ outState.putInt(EXTRA_APPEARANCE, mAppearance);
+ outState.putBoolean(EXTRA_TRANSIENT_STATE, mTransientShown);
if (mNavigationBarView != null) {
mNavigationBarView.getLightTransitionsController().saveState(outState);
}
@@ -518,80 +529,107 @@
rotationButtonController.onRotationProposal(rotation, winRotation, isValid);
}
- /** Restores the System UI flags saved state to {@link NavigationBarFragment}. */
- public void restoreSystemUiVisibilityState() {
- final int barMode = computeBarMode(0, mSystemUiVisibility);
- if (barMode != -1) {
- mNavigationBarMode = barMode;
- }
+ /** Restores the appearance and the transient saved state to {@link NavigationBarFragment}. */
+ public void restoreAppearanceAndTransientState() {
+ final int barMode = barMode(mTransientShown, mAppearance);
+ mNavigationBarMode = barMode;
checkNavBarModes();
mAutoHideController.touchAutoHide();
- mLightBarController.onNavigationVisibilityChanged(mSystemUiVisibility, 0 /* mask */,
- true /* nbModeChanged */, mNavigationBarMode, false /* navbarColorManagedByIme */);
+ mLightBarController.onNavigationBarAppearanceChanged(mAppearance, true /* nbModeChanged */,
+ barMode, false /* navbarColorManagedByIme */);
}
@Override
- public void setSystemUiVisibility(int displayId, int vis, int fullscreenStackVis,
- int dockedStackVis, int mask, Rect fullscreenStackBounds, Rect dockedStackBounds,
- boolean navbarColorManagedByIme) {
+ public void onSystemBarAppearanceChanged(int displayId, @Appearance int appearance,
+ AppearanceRegion[] appearanceRegions, 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 (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();
+ if (mAppearance != appearance) {
+ mAppearance = appearance;
+ if (getView() == null) {
+ return;
}
- if (mNavigationBarView != null) {
- mNavigationBarView.onSystemUiVisibilityChanged(mSystemUiVisibility);
- }
+ nbModeChanged = updateBarMode(barMode(mTransientShown, appearance));
}
- mLightBarController.onNavigationVisibilityChanged(
- vis, mask, nbModeChanged, mNavigationBarMode, navbarColorManagedByIme);
+ mLightBarController.onNavigationBarAppearanceChanged(appearance, nbModeChanged,
+ mNavigationBarMode, navbarColorManagedByIme);
}
- 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
+ @Override
+ public void showTransient(int displayId, @InternalInsetType int[] types) {
+ if (displayId != mDisplayId) {
+ return;
}
- return newMode;
+ if (!containsType(types, TYPE_NAVIGATION_BAR)) {
+ return;
+ }
+ if (!mTransientShown) {
+ mTransientShown = true;
+ handleTransientChanged();
+ }
}
- 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) {
+ @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();
+ }
+ mNavigationBarMode = barMode;
+ checkNavBarModes();
+ mAutoHideController.touchAutoHide();
+ return true;
+ }
+ return false;
+ }
+
+ private static @TransitionMode int barMode(boolean isTransient, int appearance) {
+ final int lightsOutOpaque = APPEARANCE_LOW_PROFILE_BARS | APPEARANCE_OPAQUE_SIDE_BARS;
+ if (isTransient) {
return MODE_SEMI_TRANSPARENT;
- } else if ((vis & View.NAVIGATION_BAR_TRANSLUCENT) != 0) {
- return MODE_TRANSLUCENT;
- } else if ((vis & lightsOutTransparent) == lightsOutTransparent) {
- return MODE_LIGHTS_OUT_TRANSPARENT;
- } else if ((vis & View.NAVIGATION_BAR_TRANSPARENT) != 0) {
- return MODE_TRANSPARENT;
- } else if ((vis & View.SYSTEM_UI_FLAG_LOW_PROFILE) != 0) {
+ } else if ((appearance & lightsOutOpaque) == lightsOutOpaque) {
return MODE_LIGHTS_OUT;
- } else {
+ } else if ((appearance & APPEARANCE_LOW_PROFILE_BARS) != 0) {
+ return MODE_LIGHTS_OUT_TRANSPARENT;
+ } else if ((appearance & APPEARANCE_OPAQUE_SIDE_BARS) != 0) {
return MODE_OPAQUE;
+ } else {
+ return MODE_TRANSPARENT;
}
}
@@ -990,8 +1028,8 @@
mAutoHideController.setNavigationBar(this);
}
- public boolean isSemiTransparent() {
- return mNavigationBarMode == MODE_SEMI_TRANSPARENT;
+ boolean isTransientShown() {
+ return mTransientShown;
}
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 ae18833..4b4a35b 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 onSystemUiVisibilityChanged(int systemUiVisibility) {
- mEdgeBackGestureHandler.onSystemUiVisibilityChanged(systemUiVisibility);
+ void onTransientStateChanged(boolean isTransient) {
+ mEdgeBackGestureHandler.onNavBarTransientStateChanged(isTransient);
}
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 8e70d082..145be48 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
@@ -24,6 +24,11 @@
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;
@@ -75,7 +80,6 @@
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;
@@ -104,6 +108,7 @@
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;
@@ -112,6 +117,7 @@
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;
@@ -124,6 +130,7 @@
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;
@@ -428,10 +435,13 @@
private int mDisabled1 = 0;
private int mDisabled2 = 0;
- // 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();
+ /** @see android.view.WindowInsetsController#setSystemBarsAppearance(int) */
+ private @Appearance int mAppearance;
+
+ private boolean mTransientShown;
+
+ private boolean mAppFullscreen;
+ private boolean mAppImmersive;
private final DisplayMetrics mDisplayMetrics;
@@ -826,10 +836,22 @@
// Set up the initial notification state. This needs to happen before CommandQueue.disable()
setUpPresenter();
- setSystemUiVisibility(mDisplayId, result.mSystemUiVisibility,
- result.mFullscreenStackSysUiVisibility, result.mDockedStackSysUiVisibility,
- 0xffffffff, result.mFullscreenStackBounds, result.mDockedStackBounds,
- result.mNavbarColorManagedByIme);
+ 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;
+
// StatusBarManagerService has a back up of IME token and it's restored here.
setImeWindowStatus(mDisplayId, result.mImeToken, result.mImeWindowVis,
result.mImeBackDisposition, result.mShowImeSwitcher);
@@ -2230,49 +2252,104 @@
}
}
- @Override // CommandQueue
- public void setSystemUiVisibility(int displayId, int vis, int fullscreenStackVis,
- int dockedStackVis, int mask, Rect fullscreenStackBounds, Rect dockedStackBounds,
- boolean navbarColorManagedByIme) {
+ @Override
+ public void onSystemBarAppearanceChanged(int displayId, @Appearance int appearance,
+ AppearanceRegion[] appearanceRegions, boolean navbarColorManagedByIme) {
if (displayId != mDisplayId) {
return;
}
- 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;
+ boolean barModeChanged = false;
+ final int diff = mAppearance ^ appearance;
+ if (mAppearance != appearance) {
+ mAppearance = appearance;
// update low profile
- if ((diff & View.SYSTEM_UI_FLAG_LOW_PROFILE) != 0) {
+ if ((diff & APPEARANCE_LOW_PROFILE_BARS) != 0) {
updateAreThereNotifications();
}
-
- // ready to unhide
- if ((vis & View.STATUS_BAR_UNHIDE) != 0) {
- mNoAnimationOnNextBarModeChange = true;
- }
-
- // update status bar mode
- final int sbMode = computeStatusBarMode(oldVal, newVal);
-
- sbModeChanged = sbMode != -1;
- if (sbModeChanged && sbMode != mStatusBarMode) {
- mStatusBarMode = sbMode;
- checkBarModes();
- mAutoHideController.touchAutoHide();
- }
- mStatusBarStateController.setSystemUiVisibility(mSystemUiVisibility);
+ barModeChanged = updateBarMode(barMode(mTransientShown, appearance));
}
- mLightBarController.onSystemUiVisibilityChanged(fullscreenStackVis, dockedStackVis,
- mask, fullscreenStackBounds, dockedStackBounds, sbModeChanged, mStatusBarMode,
- navbarColorManagedByIme);
+ 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();
+ }
+
+ private void showTransientUnchecked() {
+ if (!mTransientShown) {
+ mTransientShown = true;
+ mNoAnimationOnNextBarModeChange = true;
+ handleTransientChanged();
+ }
+ }
+
+ @Override
+ public void abortTransient(int displayId, @InternalInsetType int[] types) {
+ if (displayId != mDisplayId) {
+ return;
+ }
+ 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;
+ mStatusBarStateController.setFullscreenState(isFullscreen, isImmersive);
}
@Override
@@ -2303,40 +2380,10 @@
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,
@@ -2392,20 +2439,16 @@
/** Returns whether the top activity is in fullscreen mode. */
public boolean inFullscreenMode() {
- return 0
- != (mSystemUiVisibility
- & (View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION));
+ return mAppFullscreen;
}
/** Returns whether the top activity is in immersive mode. */
public boolean inImmersiveMode() {
- return 0
- != (mSystemUiVisibility
- & (View.SYSTEM_UI_FLAG_IMMERSIVE | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY));
+ return mAppImmersive;
}
private boolean areLightsOn() {
- return 0 == (mSystemUiVisibility & View.SYSTEM_UI_FLAG_LOW_PROFILE);
+ return 0 == (mAppearance & APPEARANCE_LOW_PROFILE_BARS);
}
public static String viewInfo(View v) {
@@ -4729,8 +4772,8 @@
void createStatusBar(StatusBar statusbar);
}
- public @TransitionMode int getStatusBarMode() {
- return mStatusBarMode;
+ boolean isTransientShown() {
+ return mTransientShown;
}
}
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 d04c7bd..6b51391 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java
@@ -23,6 +23,7 @@
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;
@@ -42,6 +43,7 @@
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.view.Window;
+import android.view.WindowInsets;
import android.view.WindowInsetsController;
import android.widget.FrameLayout;
@@ -74,7 +76,8 @@
}
@Override
- protected boolean fitSystemWindows(Rect insets) {
+ public WindowInsets onApplyWindowInsets(WindowInsets windowInsets) {
+ final Insets insets = windowInsets.getMaxInsets(WindowInsets.Type.systemBars());
if (getFitsSystemWindows()) {
boolean paddingChanged = insets.top != getPaddingTop()
|| insets.bottom != getPaddingBottom();
@@ -100,9 +103,6 @@
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,9 +116,8 @@
if (changed) {
setPadding(0, 0, 0, 0);
}
- insets.top = 0;
}
- return false;
+ return windowInsets;
}
private void applyMargins() {