Merge "Add configurable nav bar opacity rules" into nyc-dev am: 7014a3a893

am: 41c513147d

* commit '41c513147dd8e524504b6d310159dd87666ab8f6':
  Add configurable nav bar opacity rules
This commit is contained in:
Yorke Lee
2016-03-09 21:06:01 +00:00
committed by android-build-merger
3 changed files with 57 additions and 14 deletions

View File

@@ -2440,9 +2440,13 @@
flag). -->
<bool name="config_forceWindowDrawsStatusBarBackground">true</bool>
<!-- If set, this will force the navigation bar to always be drawn with an opaque
background. -->
<bool name="config_forceNavBarAlwaysOpaque">false</bool>
<!-- Controls the opacity of the navigation bar depending on the visibility of the
various workspace stacks.
0 - Nav bar is always opaque when either the freeform stack or docked stack is visible.
1 - Nav bar is always translucent when the freeform stack is visible, otherwise always
opaque.
-->
<integer name="config_navBarOpacityMode">0</integer>
<!-- Default bounds [left top right bottom] on screen for picture-in-picture windows. -->
<string translatable="false" name="config_defaultPictureInPictureBounds">"0 0 100 100"</string>

View File

@@ -2394,7 +2394,7 @@
<java-symbol type="string" name="config_packagedKeyboardName" />
<java-symbol type="bool" name="config_forceWindowDrawsStatusBarBackground" />
<java-symbol type="bool" name="config_forceNavBarAlwaysOpaque" />
<java-symbol type="integer" name="config_navBarOpacityMode" />
<java-symbol type="color" name="system_bar_background_semi_transparent" />
<!-- EditText suggestion popup. -->

View File

@@ -211,6 +211,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;
@@ -539,7 +546,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;
@@ -1729,8 +1736,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
@@ -7093,7 +7100,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
@@ -7118,14 +7125,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;
@@ -7199,6 +7203,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) {