From 27db0caacaa8120d83642539405fcedeab272875 Mon Sep 17 00:00:00 2001 From: Adrian Roos Date: Wed, 29 May 2019 16:12:09 +0200 Subject: DecorView: Fix status guard Fixes several issues with the status guard: - poor background color for light status bar background - guard & action mode need insets for the navigation bar in landscape - status guard was not properly dismissed after completion of the action mode - uses the proper non-zero root inset when LAYOUT_HIDE_NAVIGATION is unset & in landscape Bug: 132924796 Test: make ApiDemos, use SystemUiModes activity to trigger action mode Change-Id: Ie9ba2b6fb2c87a1825df85f756ffb062a45d4f55 --- .../com/android/internal/policy/DecorView.java | 81 ++++++++++++++++------ core/res/res/values/colors.xml | 1 + core/res/res/values/symbols.xml | 5 +- 3 files changed, 63 insertions(+), 24 deletions(-) diff --git a/core/java/com/android/internal/policy/DecorView.java b/core/java/com/android/internal/policy/DecorView.java index 585a27978c4f..2941a813fecb 100644 --- a/core/java/com/android/internal/policy/DecorView.java +++ b/core/java/com/android/internal/policy/DecorView.java @@ -1004,6 +1004,10 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind public void onWindowSystemUiVisibilityChanged(int visible) { updateColorViews(null /* insets */, true /* animate */); updateDecorCaptionStatus(getResources().getConfiguration()); + + if (mStatusGuard != null && mStatusGuard.getVisibility() == VISIBLE) { + updateStatusGuardColor(); + } } @Override @@ -1462,28 +1466,45 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind } final Rect rect = mTempRect; - // If the parent doesn't consume the insets, manually - // apply the default system window insets. - mWindow.mContentParent.computeSystemWindowInsets(insets, rect); - final int newMargin = rect.top == 0 ? insets.getSystemWindowInsetTop() : 0; - if (mlp.topMargin != newMargin) { + // Apply the insets that have not been applied by the contentParent yet. + WindowInsets innerInsets = + mWindow.mContentParent.computeSystemWindowInsets(insets, rect); + int newTopMargin = innerInsets.getSystemWindowInsetTop(); + int newLeftMargin = innerInsets.getSystemWindowInsetLeft(); + int newRightMargin = innerInsets.getSystemWindowInsetRight(); + + // Must use root window insets for the guard, because the color views consume + // the navigation bar inset if the window does not request LAYOUT_HIDE_NAV - but + // the status guard is attached at the root. + WindowInsets rootInsets = getRootWindowInsets(); + int newGuardLeftMargin = rootInsets.getSystemWindowInsetLeft(); + int newGuardRightMargin = rootInsets.getSystemWindowInsetRight(); + + if (mlp.topMargin != newTopMargin || mlp.leftMargin != newLeftMargin + || mlp.rightMargin != newRightMargin) { mlpChanged = true; - mlp.topMargin = insets.getSystemWindowInsetTop(); - - if (mStatusGuard == null) { - mStatusGuard = new View(mContext); - mStatusGuard.setBackgroundColor(mContext.getColor( - R.color.decor_view_status_guard)); - addView(mStatusGuard, indexOfChild(mStatusColorViewState.view), - new LayoutParams(LayoutParams.MATCH_PARENT, - mlp.topMargin, Gravity.START | Gravity.TOP)); - } else { - final LayoutParams lp = (LayoutParams) - mStatusGuard.getLayoutParams(); - if (lp.height != mlp.topMargin) { - lp.height = mlp.topMargin; - mStatusGuard.setLayoutParams(lp); - } + mlp.topMargin = newTopMargin; + mlp.leftMargin = newLeftMargin; + mlp.rightMargin = newRightMargin; + } + + if (newTopMargin > 0 && mStatusGuard == null) { + mStatusGuard = new View(mContext); + mStatusGuard.setVisibility(GONE); + final LayoutParams lp = new LayoutParams(MATCH_PARENT, + mlp.topMargin, Gravity.LEFT | Gravity.TOP); + lp.leftMargin = newGuardLeftMargin; + lp.rightMargin = newGuardRightMargin; + addView(mStatusGuard, indexOfChild(mStatusColorViewState.view), lp); + } else if (mStatusGuard != null) { + final LayoutParams lp = (LayoutParams) + mStatusGuard.getLayoutParams(); + if (lp.height != mlp.topMargin || lp.leftMargin != newGuardLeftMargin + || lp.rightMargin != newGuardRightMargin) { + lp.height = mlp.topMargin; + lp.leftMargin = newGuardLeftMargin; + lp.rightMargin = newGuardRightMargin; + mStatusGuard.setLayoutParams(lp); } } @@ -1491,6 +1512,11 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind // always show the status guard above it if we have one. showStatusGuard = mStatusGuard != null; + if (showStatusGuard && mStatusGuard.getVisibility() != VISIBLE) { + // If it wasn't previously shown, the color may be stale + updateStatusGuardColor(); + } + // We only need to consume the insets if the action // mode is overlaid on the app content (e.g. it's // sitting in a FrameLayout, see @@ -1502,7 +1528,7 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind } } else { // reset top margin - if (mlp.topMargin != 0) { + if (mlp.topMargin != 0 || mlp.leftMargin != 0 || mlp.rightMargin != 0) { mlpChanged = true; mlp.topMargin = 0; } @@ -1513,11 +1539,19 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind } } if (mStatusGuard != null) { - mStatusGuard.setVisibility(showStatusGuard ? View.VISIBLE : View.GONE); + mStatusGuard.setVisibility(showStatusGuard ? VISIBLE : GONE); } return insets; } + private void updateStatusGuardColor() { + boolean lightStatusBar = + (getWindowSystemUiVisibility() & SYSTEM_UI_FLAG_LIGHT_STATUS_BAR) != 0; + mStatusGuard.setBackgroundColor(lightStatusBar + ? mContext.getColor(R.color.decor_view_status_guard_light) + : mContext.getColor(R.color.decor_view_status_guard)); + } + /** * Overrides the view outline when the activity enters picture-in-picture to ensure that it has * an opaque shadow even if the window background is completely transparent. This only applies @@ -2594,6 +2628,7 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind } lastActionModeView.killMode(); mFadeAnim = null; + requestApplyInsets(); } } diff --git a/core/res/res/values/colors.xml b/core/res/res/values/colors.xml index 3b282650d59e..1dcd389d9d8f 100644 --- a/core/res/res/values/colors.xml +++ b/core/res/res/values/colors.xml @@ -79,6 +79,7 @@ #fff9f9f9 #ff000000 + #ffffffff #ff0092f4 diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 27a4a46c20dc..b030c1ac86cb 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -1964,6 +1964,7 @@ + @@ -3805,7 +3806,9 @@ - + + + -- cgit v1.2.3-59-g8ed1b