From db1bc6bcc39c8c4deb1a86f889981e734a54fd72 Mon Sep 17 00:00:00 2001 From: Adrian Roos Date: Thu, 14 Apr 2016 17:49:43 -0700 Subject: [PATCH] Force status bar window to be visible when expanded Also don't collapse status bar if low profile gets set. Status bar should almost never be collapsed without explicit user action, and this only leads to issues. Fixes: 27629489 Change-Id: Ibe5c64df578438c7224985b173a9cd967bf363bf --- .../statusbar/phone/PhoneStatusBar.java | 5 ---- .../android/server/policy/BarController.java | 11 +++++-- .../server/policy/PhoneWindowManager.java | 30 ++++++++++++++----- .../server/policy/StatusBarController.java | 14 ++++++--- 4 files changed, 41 insertions(+), 19 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java index ba13e54022310..76fb41685567c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java @@ -2795,11 +2795,6 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, // update low profile if ((diff & View.SYSTEM_UI_FLAG_LOW_PROFILE) != 0) { - final boolean lightsOut = (vis & View.SYSTEM_UI_FLAG_LOW_PROFILE) != 0; - if (lightsOut) { - animateCollapsePanels(); - } - setAreThereNotifications(); } diff --git a/services/core/java/com/android/server/policy/BarController.java b/services/core/java/com/android/server/policy/BarController.java index 5878709e89b19..6edb4d2d2ac18 100644 --- a/services/core/java/com/android/server/policy/BarController.java +++ b/services/core/java/com/android/server/policy/BarController.java @@ -21,6 +21,7 @@ import android.os.Handler; import android.os.SystemClock; import android.util.Slog; import android.view.View; +import android.view.ViewGroup; import android.view.WindowManager; import android.view.WindowManagerPolicy.WindowState; @@ -53,7 +54,7 @@ public class BarController { private final Object mServiceAquireLock = new Object(); protected StatusBarManagerInternal mStatusBarInternal; - private WindowState mWin; + protected WindowState mWin; private int mState = StatusBarManager.WINDOW_STATE_SHOWING; private int mTransientBarState; private boolean mPendingShow; @@ -147,14 +148,18 @@ public class BarController { } final boolean wasVis = mWin.isVisibleLw(); final boolean wasAnim = mWin.isAnimatingLw(); - final boolean change = show ? mWin.showLw(!mNoAnimationOnNextShow) - : mWin.hideLw(!mNoAnimationOnNextShow); + final boolean change = show ? mWin.showLw(!mNoAnimationOnNextShow && !skipAnimation()) + : mWin.hideLw(!mNoAnimationOnNextShow && !skipAnimation()); mNoAnimationOnNextShow = false; final int state = computeStateLw(wasVis, wasAnim, mWin, change); final boolean stateChanged = updateStateLw(state); return change || stateChanged; } + protected boolean skipAnimation() { + return false; + } + private int computeStateLw(boolean wasVis, boolean wasAnim, WindowState win, boolean change) { if (win.isDrawnLw()) { final boolean vis = win.isVisibleLw(); diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index e409299c53786..e0c56d7a4dbe1 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -3956,6 +3956,9 @@ public class PhoneWindowManager implements WindowManagerPolicy { if (!isKeyguardShowing) { navTranslucent &= areTranslucentBarsAllowed(); } + boolean statusBarExpandedNotKeyguard = !isKeyguardShowing + && mStatusBar.getAttrs().height == MATCH_PARENT + && mStatusBar.getAttrs().width == MATCH_PARENT; // When the navigation bar isn't visible, we put up a fake // input window to catch all touch events. This way we can @@ -3978,7 +3981,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { boolean updateSysUiVisibility = layoutNavigationBar(displayWidth, displayHeight, displayRotation, uiMode, overscanRight, overscanBottom, dcf, navVisible, navTranslucent, - navAllowedHidden); + navAllowedHidden, statusBarExpandedNotKeyguard); if (DEBUG_LAYOUT) Slog.i(TAG, String.format("mDock rect: (%d,%d - %d,%d)", mDockLeft, mDockTop, mDockRight, mDockBottom)); updateSysUiVisibility |= layoutStatusBar(pf, df, of, vf, dcf, sysui, isKeyguardShowing); @@ -4057,7 +4060,8 @@ public class PhoneWindowManager implements WindowManagerPolicy { private boolean layoutNavigationBar(int displayWidth, int displayHeight, int displayRotation, int uiMode, int overscanRight, int overscanBottom, Rect dcf, boolean navVisible, - boolean navTranslucent, boolean navAllowedHidden) { + boolean navTranslucent, boolean navAllowedHidden, + boolean statusBarExpandedNotKeyguard) { if (mNavigationBar != null) { boolean transientNavBarShowing = mNavigationBarController.isTransientShowing(); // Force the navigation bar to its appropriate place and @@ -4079,8 +4083,9 @@ public class PhoneWindowManager implements WindowManagerPolicy { mRestrictedScreenHeight = mDockBottom - mRestrictedScreenTop; mRestrictedOverscanScreenHeight = mDockBottom - mRestrictedOverscanScreenTop; } else { - // We currently want to hide the navigation UI. - mNavigationBarController.setBarShowingLw(false); + // We currently want to hide the navigation UI - unless we expanded the status + // bar. + mNavigationBarController.setBarShowingLw(statusBarExpandedNotKeyguard); } if (navVisible && !navTranslucent && !navAllowedHidden && !mNavigationBar.isAnimatingLw() @@ -4104,8 +4109,9 @@ public class PhoneWindowManager implements WindowManagerPolicy { mRestrictedScreenWidth = mDockRight - mRestrictedScreenLeft; mRestrictedOverscanScreenWidth = mDockRight - mRestrictedOverscanScreenLeft; } else { - // We currently want to hide the navigation UI. - mNavigationBarController.setBarShowingLw(false); + // We currently want to hide the navigation UI - unless we expanded the status + // bar. + mNavigationBarController.setBarShowingLw(statusBarExpandedNotKeyguard); } if (navVisible && !navTranslucent && !navAllowedHidden && !mNavigationBar.isAnimatingLw() @@ -5023,7 +5029,12 @@ public class PhoneWindowManager implements WindowManagerPolicy { } else if (!mStatusBar.isVisibleLw()) { mStatusBarController.setShowTransparent(true /* transparent */); } - if (mForceStatusBar || mForceStatusBarFromKeyguard || mForceStatusBarTransparent) { + + WindowManager.LayoutParams statusBarAttrs = mStatusBar.getAttrs(); + boolean statusBarExpanded = statusBarAttrs.height == MATCH_PARENT + && statusBarAttrs.width == MATCH_PARENT; + if (mForceStatusBar || mForceStatusBarFromKeyguard || mForceStatusBarTransparent + || statusBarExpanded) { if (DEBUG_LAYOUT) Slog.v(TAG, "Showing status bar: forced"); if (mStatusBarController.setBarShowingLw(true)) { changes |= FINISH_LAYOUT_REDO_LAYOUT; @@ -5035,6 +5046,11 @@ public class PhoneWindowManager implements WindowManagerPolicy { mStatusBarController.updateVisibilityLw(false /*transientAllowed*/, mLastSystemUiFlags, mLastSystemUiFlags); } + if (statusBarExpanded && mNavigationBar != null) { + if (mNavigationBarController.setBarShowingLw(true)) { + changes |= FINISH_LAYOUT_REDO_LAYOUT; + } + } } else if (mTopFullscreenOpaqueWindowState != null) { final int fl = PolicyControl.getWindowFlags(null, lp); if (localLOGV) { diff --git a/services/core/java/com/android/server/policy/StatusBarController.java b/services/core/java/com/android/server/policy/StatusBarController.java index 245518ca28f64..1dbc44ea1b22e 100644 --- a/services/core/java/com/android/server/policy/StatusBarController.java +++ b/services/core/java/com/android/server/policy/StatusBarController.java @@ -16,11 +16,14 @@ package com.android.server.policy; +import static android.view.WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS; +import static android.view.WindowManager.LayoutParams.MATCH_PARENT; +import static android.view.WindowManagerInternal.AppTransitionListener; + import android.app.StatusBarManager; import android.os.IBinder; import android.os.SystemClock; import android.view.View; -import android.view.WindowManager; import android.view.animation.Animation; import android.view.animation.AnimationSet; import android.view.animation.Interpolator; @@ -29,8 +32,6 @@ import android.view.animation.TranslateAnimation; import com.android.server.LocalServices; import com.android.server.statusbar.StatusBarManagerInternal; -import static android.view.WindowManagerInternal.*; - /** * Implements status bar specific behavior. */ @@ -106,10 +107,15 @@ public class StatusBarController extends BarController { View.STATUS_BAR_UNHIDE, View.STATUS_BAR_TRANSLUCENT, StatusBarManager.WINDOW_STATUS_BAR, - WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, + FLAG_TRANSLUCENT_STATUS, View.STATUS_BAR_TRANSPARENT); } + @Override + protected boolean skipAnimation() { + return mWin.getAttrs().height == MATCH_PARENT; + } + public AppTransitionListener getAppTransitionListener() { return mAppTransitionListener; }