From 9b2ffb31df8b996f434f2f6f0df3274255a15ad6 Mon Sep 17 00:00:00 2001 From: Yorke Lee Date: Mon, 7 Mar 2016 20:42:01 -0800 Subject: [PATCH] Add configurable nav bar opacity rules NAV_BAR_OPAQUE_WHEN_FREEFORM_OR_DOCKED (default) - Nav bar is always opaque when either the freeform stack or docked stack is visible. NAV_BAR_TRANSLUCENT_WHEN_FREEFORM_OPAQUE_OTHERWISE - Nav bar is always translucent when the freeform stack is visible, otherwise always opaque. Bug: 26425669 Change-Id: I36ff12df4448a35c66f0e3dc2272169496b562d5 --- core/res/res/values/config.xml | 10 +++- core/res/res/values/symbols.xml | 2 +- .../server/policy/PhoneWindowManager.java | 59 +++++++++++++++---- 3 files changed, 57 insertions(+), 14 deletions(-) diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 7857107106ce8..ce5d07c1e6ed3 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -2440,9 +2440,13 @@ flag). --> true - - false + + 0 "0 0 100 100" diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 0934c3bdc1baa..0ef003d0197bd 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -2392,7 +2392,7 @@ - + diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index e51a2e1aa526d..a23fbfc18a73c 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -209,6 +209,13 @@ public class PhoneWindowManager implements WindowManagerPolicy { static final int SHORT_PRESS_SLEEP_GO_TO_SLEEP = 0; static final int SHORT_PRESS_SLEEP_GO_TO_SLEEP_AND_GO_HOME = 1; + // Controls navigation bar opacity depending on which workspace stacks are currently + // visible. + // Nav bar is always opaque when either the freeform stack or docked stack is visible. + static final int NAV_BAR_OPAQUE_WHEN_FREEFORM_OR_DOCKED = 0; + // Nav bar is always translucent when the freeform stack is visible, otherwise always opaque. + static final int NAV_BAR_TRANSLUCENT_WHEN_FREEFORM_OPAQUE_OTHERWISE = 1; + static final int APPLICATION_MEDIA_SUBLAYER = -2; static final int APPLICATION_MEDIA_OVERLAY_SUBLAYER = -1; static final int APPLICATION_PANEL_SUBLAYER = 1; @@ -537,7 +544,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { boolean mForceStatusBar; boolean mForceStatusBarFromKeyguard; private boolean mForceStatusBarTransparent; - boolean mForceNavBarOpaque; + int mNavBarOpacityMode = NAV_BAR_OPAQUE_WHEN_FREEFORM_OR_DOCKED; boolean mHideLockScreen; boolean mForcingShowNavBar; int mForcingShowNavBarLayer; @@ -1719,8 +1726,8 @@ public class PhoneWindowManager implements WindowManagerPolicy { mShortPressWindowBehavior = SHORT_PRESS_WINDOW_PICTURE_IN_PICTURE; } - mForceNavBarOpaque = res.getBoolean( - com.android.internal.R.bool.config_forceNavBarAlwaysOpaque); + mNavBarOpacityMode = res.getInteger( + com.android.internal.R.integer.config_navBarOpacityMode); } @Override @@ -7067,7 +7074,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { // is visible but also when we are resizing for the transitions when docked stack // visibility changes. mForceShowSystemBars = dockedStackVisible || freeformStackVisible || resizing; - final boolean forceOpaqueSystemBars = mForceShowSystemBars && !mForceStatusBarFromKeyguard; + final boolean forceOpaqueStatusBar = mForceShowSystemBars && !mForceStatusBarFromKeyguard; // apply translucent bar vis flags WindowState transWin = isStatusBarKeyguard() && !mHideLockScreen @@ -7092,14 +7099,11 @@ public class PhoneWindowManager implements WindowManagerPolicy { } if ((!areTranslucentBarsAllowed() && transWin != mStatusBar) - || forceOpaqueSystemBars) { - vis &= ~(View.NAVIGATION_BAR_TRANSLUCENT | View.STATUS_BAR_TRANSLUCENT - | View.SYSTEM_UI_TRANSPARENT); + || forceOpaqueStatusBar) { + vis &= ~(View.STATUS_BAR_TRANSLUCENT | View.STATUS_BAR_TRANSPARENT); } - if (mForceNavBarOpaque) { - vis &= ~(View.NAVIGATION_BAR_TRANSLUCENT | View.NAVIGATION_BAR_TRANSPARENT); - } + vis = configureNavBarOpacity(vis, dockedStackVisible, freeformStackVisible, resizing); if (mForceWindowDrawsStatusBarBackground) { vis |= View.STATUS_BAR_TRANSPARENT; @@ -7173,6 +7177,41 @@ public class PhoneWindowManager implements WindowManagerPolicy { return vis; } + /** + * @return the current visibility flags with the nav-bar opacity related flags toggled based + * on the nav bar opacity rules chosen by {@link #mNavBarOpacityMode}. + */ + private int configureNavBarOpacity(int visibility, boolean dockedStackVisible, + boolean freeformStackVisible, boolean isDockedDividerResizing) { + if (mNavBarOpacityMode == NAV_BAR_OPAQUE_WHEN_FREEFORM_OR_DOCKED) { + if (dockedStackVisible || freeformStackVisible || isDockedDividerResizing) { + visibility = setNavBarOpaqueFlag(visibility); + } + } else if (mNavBarOpacityMode == NAV_BAR_TRANSLUCENT_WHEN_FREEFORM_OPAQUE_OTHERWISE) { + if (isDockedDividerResizing) { + visibility = setNavBarOpaqueFlag(visibility); + } else if (freeformStackVisible) { + visibility = setNavBarTranslucentFlag(visibility); + } else { + visibility = setNavBarOpaqueFlag(visibility); + } + } + + if (!areTranslucentBarsAllowed()) { + visibility &= ~View.NAVIGATION_BAR_TRANSLUCENT; + } + return visibility; + } + + private int setNavBarOpaqueFlag(int visibility) { + return visibility &= ~(View.NAVIGATION_BAR_TRANSLUCENT | View.NAVIGATION_BAR_TRANSPARENT); + } + + private int setNavBarTranslucentFlag(int visibility) { + visibility &= ~View.NAVIGATION_BAR_TRANSPARENT; + return visibility |= View.NAVIGATION_BAR_TRANSLUCENT; + } + private void clearClearableFlagsLw() { int newVal = mResettingSystemUiFlags | View.SYSTEM_UI_CLEARABLE_FLAGS; if (newVal != mResettingSystemUiFlags) {