Make settings themed apps have light nav

This is needed to help with differential aging.

The nav needs to be white with a 1dp divider on it, so add support
for the divider and add hidden attribute to set the nav buttons
inverted.

Test: Open settings
Bug: 63630024
Change-Id: Iec6046baeb86fb554df73346df8652fee8b2736a
This commit is contained in:
Jason Monk
2017-09-01 12:40:06 -04:00
parent bb9d0aa60c
commit ea506c67ec
4 changed files with 54 additions and 6 deletions

View File

@@ -18,6 +18,9 @@ package com.android.internal.policy;
import android.app.WindowConfiguration;
import android.graphics.Outline;
import android.graphics.drawable.InsetDrawable;
import android.graphics.drawable.LayerDrawable;
import android.util.Pair;
import android.view.ViewOutlineProvider;
import android.view.accessibility.AccessibilityNodeInfo;
import com.android.internal.R;
@@ -1097,8 +1100,8 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind
boolean navBarToLeftEdge = isNavBarToLeftEdge(mLastBottomInset, mLastLeftInset);
int navBarSize = getNavBarSize(mLastBottomInset, mLastRightInset, mLastLeftInset);
updateColorViewInt(mNavigationColorViewState, sysUiVisibility,
mWindow.mNavigationBarColor, navBarSize, navBarToRightEdge || navBarToLeftEdge,
navBarToLeftEdge,
mWindow.mNavigationBarColor, mWindow.mNavigationBarDividerColor, navBarSize,
navBarToRightEdge || navBarToLeftEdge, navBarToLeftEdge,
0 /* sideInset */, animate && !disallowAnimate, false /* force */);
boolean statusBarNeedsRightInset = navBarToRightEdge
@@ -1108,7 +1111,7 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind
int statusBarSideInset = statusBarNeedsRightInset ? mLastRightInset
: statusBarNeedsLeftInset ? mLastLeftInset : 0;
updateColorViewInt(mStatusColorViewState, sysUiVisibility,
calculateStatusBarColor(), mLastTopInset,
calculateStatusBarColor(), 0, mLastTopInset,
false /* matchVertical */, statusBarNeedsLeftInset, statusBarSideInset,
animate && !disallowAnimate,
mForceWindowDrawsStatusBarBackground);
@@ -1195,6 +1198,7 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind
* @param state the color view to update.
* @param sysUiVis the current systemUiVisibility to apply.
* @param color the current color to apply.
* @param dividerColor the current divider color to apply.
* @param size the current size in the non-parent-matching dimension.
* @param verticalBar if true the view is attached to a vertical edge, otherwise to a
* horizontal edge,
@@ -1202,7 +1206,7 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind
* @param animate if true, the change will be animated.
*/
private void updateColorViewInt(final ColorViewState state, int sysUiVis, int color,
int size, boolean verticalBar, boolean seascape, int sideMargin,
int dividerColor, int size, boolean verticalBar, boolean seascape, int sideMargin,
boolean animate, boolean force) {
state.present = state.attributes.isPresent(sysUiVis, mWindow.getAttributes().flags, force);
boolean show = state.attributes.isVisible(state.present, color,
@@ -1221,7 +1225,7 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind
if (view == null) {
if (showView) {
state.view = view = new View(mContext);
view.setBackgroundColor(color);
setColor(view, color, dividerColor, verticalBar, seascape);
view.setTransitionName(state.attributes.transitionName);
view.setId(state.attributes.id);
visibilityChanged = true;
@@ -1256,7 +1260,7 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind
view.setLayoutParams(lp);
}
if (showView) {
view.setBackgroundColor(color);
setColor(view, color, dividerColor, verticalBar, seascape);
}
}
if (visibilityChanged) {
@@ -1289,6 +1293,34 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind
state.color = color;
}
private static void setColor(View v, int color, int dividerColor, boolean verticalBar,
boolean seascape) {
if (dividerColor != 0) {
final Pair<Boolean, Boolean> dir = (Pair<Boolean, Boolean>) v.getTag();
if (dir == null || dir.first != verticalBar || dir.second != seascape) {
final int size = Math.round(
TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 1,
v.getContext().getResources().getDisplayMetrics()));
// Use an inset to make the divider line on the side that faces the app.
final InsetDrawable d = new InsetDrawable(new ColorDrawable(color),
verticalBar && !seascape ? size : 0,
!verticalBar ? size : 0,
verticalBar && seascape ? size : 0, 0);
v.setBackground(new LayerDrawable(new Drawable[] {
new ColorDrawable(dividerColor), d }));
v.setTag(new Pair<>(verticalBar, seascape));
} else {
final LayerDrawable d = (LayerDrawable) v.getBackground();
final InsetDrawable inset = ((InsetDrawable) d.getDrawable(1));
((ColorDrawable) inset.getDrawable()).setColor(color);
((ColorDrawable) d.getDrawable(0)).setColor(dividerColor);
}
} else {
v.setTag(null);
v.setBackgroundColor(color);
}
}
private void updateColorViewTranslations() {
// Put the color views back in place when they get moved off the screen
// due to the the ViewRootImpl panning.

View File

@@ -233,6 +233,7 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback {
private int mTextColor = 0;
int mStatusBarColor = 0;
int mNavigationBarColor = 0;
int mNavigationBarDividerColor = 0;
private boolean mForcedStatusBarColor = false;
private boolean mForcedNavigationBarColor = false;
@@ -2432,6 +2433,8 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback {
}
if (!mForcedNavigationBarColor) {
mNavigationBarColor = a.getColor(R.styleable.Window_navigationBarColor, 0xFF000000);
mNavigationBarDividerColor = a.getColor(R.styleable.Window_navigationBarDividerColor,
0x00000000);
}
WindowManager.LayoutParams params = getAttributes();

View File

@@ -2056,6 +2056,14 @@
Corresponds to {@link android.view.Window#setNavigationBarColor(int)}. -->
<attr name="navigationBarColor" format="color" />
<!-- @hide
Shows 1dp line of the specified color between the navigation bar and the app content.
<p>For this to take effect, the window must be drawing the system bar backgrounds with
{@link android.R.attr#windowDrawsSystemBarBackgrounds} and the navigation bar must not
have been requested to be translucent with
{@link android.R.attr#windowTranslucentNavigation}. -->
<attr name="navigationBarDividerColor" format="color" />
<!-- The duration, in milliseconds, of the window background fade duration
when transitioning into or away from an Activity when called with an
Activity Transition. Corresponds to

View File

@@ -745,6 +745,11 @@ easier.
<item name="colorSecondary">@color/secondary_device_default_settings_light</item>
<item name="colorAccent">@color/accent_device_default_light</item>
<item name="colorEdgeEffect">@android:color/black</item>
<!-- Add white nav bar with divider that matches material -->
<item name="navigationBarDividerColor">#1f000000</item>
<item name="navigationBarColor">@android:color/white</item>
<item name="windowLightNavigationBar">true</item>
</style>
<!-- @hide DeviceDefault theme for a window that should use Settings theme colors