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:
@@ -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.
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user