diff options
| -rw-r--r-- | core/java/com/android/internal/policy/DecorView.java | 43 | ||||
| -rw-r--r-- | core/java/com/android/internal/policy/PhoneWindow.java | 7 | ||||
| -rw-r--r-- | core/res/res/values/attrs.xml | 19 | ||||
| -rw-r--r-- | core/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 0d962eb424f6..dafa68ee095c 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<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(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 544afd993b37..2de95372f62c 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 8151ceb26407..15d593b9ce54 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)}. --> <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 @@ -2087,6 +2095,17 @@ {@link android.R.attr#windowBackground}. --> <attr name="windowSplashscreenContent" format="reference" /> + + <!-- @hide + If set, the navigation bar will be drawn such that it is compatible with a light + navigation bar background. + <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}. + Corresponds to setting {@link android.view.View#SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR} on + the decor view. --> + <attr name="windowLightNavigationBar" format="boolean" /> </declare-styleable> <!-- The set of attributes that describe a AlertDialog's theme. --> diff --git a/core/res/res/values/themes_device_defaults.xml b/core/res/res/values/themes_device_defaults.xml index 8755e37f105f..bf0c90660392 100644 --- a/core/res/res/values/themes_device_defaults.xml +++ b/core/res/res/values/themes_device_defaults.xml @@ -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 |