From 45484206740874ddd4024fedfdd8676d935ea67b Mon Sep 17 00:00:00 2001 From: Jason Monk Date: Fri, 1 Sep 2017 12:40:06 -0400 Subject: [PATCH] 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 --- .../android/internal/policy/DecorView.java | 43 ++++++++++++++++--- .../android/internal/policy/PhoneWindow.java | 7 +++ core/res/res/values/attrs.xml | 19 ++++++++ .../res/res/values/themes_device_defaults.xml | 5 +++ 4 files changed, 68 insertions(+), 6 deletions(-) diff --git a/core/java/com/android/internal/policy/DecorView.java b/core/java/com/android/internal/policy/DecorView.java index 0d962eb424f69..dafa68ee095c3 100644 --- a/core/java/com/android/internal/policy/DecorView.java +++ b/core/java/com/android/internal/policy/DecorView.java @@ -17,6 +17,9 @@ package com.android.internal.policy; 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; @@ -1103,8 +1106,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 @@ -1114,7 +1117,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); @@ -1201,6 +1204,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, @@ -1208,7 +1212,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, @@ -1227,7 +1231,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; @@ -1262,7 +1266,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) { @@ -1295,6 +1299,33 @@ 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 dir = (Pair) 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(0)); + ((ColorDrawable) inset.getDrawable()).setColor(dividerColor); + ((ColorDrawable) d.getDrawable(1)).setColor(color); + } + } else { + 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. diff --git a/core/java/com/android/internal/policy/PhoneWindow.java b/core/java/com/android/internal/policy/PhoneWindow.java index 544afd993b374..2de95372f62c8 100644 --- a/core/java/com/android/internal/policy/PhoneWindow.java +++ b/core/java/com/android/internal/policy/PhoneWindow.java @@ -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(); @@ -2453,6 +2456,10 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { decor.setSystemUiVisibility( decor.getSystemUiVisibility() | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); } + if (a.getBoolean(R.styleable.Window_windowLightNavigationBar, false)) { + decor.setSystemUiVisibility( + decor.getSystemUiVisibility() | View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR); + } if (mAlwaysReadCloseOnTouchAttr || getContext().getApplicationInfo().targetSdkVersion >= android.os.Build.VERSION_CODES.HONEYCOMB) { diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml index 8151ceb264074..15d593b9ce544 100644 --- a/core/res/res/values/attrs.xml +++ b/core/res/res/values/attrs.xml @@ -2055,6 +2055,14 @@ Corresponds to {@link android.view.Window#setNavigationBarColor(int)}. --> + + + + + + diff --git a/core/res/res/values/themes_device_defaults.xml b/core/res/res/values/themes_device_defaults.xml index 8755e37f105fd..bf0c906603920 100644 --- a/core/res/res/values/themes_device_defaults.xml +++ b/core/res/res/values/themes_device_defaults.xml @@ -745,6 +745,11 @@ easier. @color/secondary_device_default_settings_light @color/accent_device_default_light @android:color/black + + + #1f000000 + @android:color/white + true