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());
- }
-}