Loading core/java/com/android/internal/policy/DecorView.java +58 −23 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -1462,35 +1466,57 @@ 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. // Apply the insets that have not been applied by the contentParent yet. WindowInsets innerInsets = mWindow.mContentParent.computeSystemWindowInsets(insets, rect); final int newMargin = rect.top == 0 ? insets.getSystemWindowInsetTop() : 0; if (mlp.topMargin != newMargin) { 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(); mlp.topMargin = newTopMargin; mlp.leftMargin = newLeftMargin; mlp.rightMargin = newRightMargin; } if (mStatusGuard == null) { if (newTopMargin > 0 && 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 { 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) { if (lp.height != mlp.topMargin || lp.leftMargin != newGuardLeftMargin || lp.rightMargin != newGuardRightMargin) { lp.height = mlp.topMargin; lp.leftMargin = newGuardLeftMargin; lp.rightMargin = newGuardRightMargin; mStatusGuard.setLayoutParams(lp); } } } // The action mode's theme may differ from the app, so // 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 Loading @@ -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; } Loading @@ -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 Loading Loading @@ -2594,6 +2628,7 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind } lastActionModeView.killMode(); mFadeAnim = null; requestApplyInsets(); } } Loading core/res/res/values/colors.xml +1 −0 Original line number Diff line number Diff line Loading @@ -79,6 +79,7 @@ <drawable name="input_method_fullscreen_background">#fff9f9f9</drawable> <color name="decor_view_status_guard">#ff000000</color> <color name="decor_view_status_guard_light">#ffffffff</color> <!-- For date picker widget --> <drawable name="selected_day_background">#ff0092f4</drawable> Loading core/res/res/values/symbols.xml +4 −1 Original line number Diff line number Diff line Loading @@ -1962,6 +1962,7 @@ <java-symbol type="bool" name="show_ongoing_ime_switcher" /> <java-symbol type="color" name="config_defaultNotificationColor" /> <java-symbol type="color" name="decor_view_status_guard" /> <java-symbol type="color" name="decor_view_status_guard_light" /> <java-symbol type="drawable" name="ic_notification_ime_default" /> <java-symbol type="drawable" name="ic_menu_refresh" /> <java-symbol type="drawable" name="ic_settings" /> Loading Loading @@ -3804,6 +3805,8 @@ <java-symbol type="anim" name="resolver_launch_anim" /> <java-symbol type="style" name="Animation.DeviceDefault.Activity.Resolver" /> <java-symbol type="color" name="decor_view_status_guard_light" /> <java-symbol type="string" name="config_defaultSupervisionProfileOwnerComponent" /> <java-symbol type="bool" name="config_inflateSignalStrength" /> </resources> Loading
core/java/com/android/internal/policy/DecorView.java +58 −23 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -1462,35 +1466,57 @@ 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. // Apply the insets that have not been applied by the contentParent yet. WindowInsets innerInsets = mWindow.mContentParent.computeSystemWindowInsets(insets, rect); final int newMargin = rect.top == 0 ? insets.getSystemWindowInsetTop() : 0; if (mlp.topMargin != newMargin) { 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(); mlp.topMargin = newTopMargin; mlp.leftMargin = newLeftMargin; mlp.rightMargin = newRightMargin; } if (mStatusGuard == null) { if (newTopMargin > 0 && 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 { 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) { if (lp.height != mlp.topMargin || lp.leftMargin != newGuardLeftMargin || lp.rightMargin != newGuardRightMargin) { lp.height = mlp.topMargin; lp.leftMargin = newGuardLeftMargin; lp.rightMargin = newGuardRightMargin; mStatusGuard.setLayoutParams(lp); } } } // The action mode's theme may differ from the app, so // 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 Loading @@ -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; } Loading @@ -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 Loading Loading @@ -2594,6 +2628,7 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind } lastActionModeView.killMode(); mFadeAnim = null; requestApplyInsets(); } } Loading
core/res/res/values/colors.xml +1 −0 Original line number Diff line number Diff line Loading @@ -79,6 +79,7 @@ <drawable name="input_method_fullscreen_background">#fff9f9f9</drawable> <color name="decor_view_status_guard">#ff000000</color> <color name="decor_view_status_guard_light">#ffffffff</color> <!-- For date picker widget --> <drawable name="selected_day_background">#ff0092f4</drawable> Loading
core/res/res/values/symbols.xml +4 −1 Original line number Diff line number Diff line Loading @@ -1962,6 +1962,7 @@ <java-symbol type="bool" name="show_ongoing_ime_switcher" /> <java-symbol type="color" name="config_defaultNotificationColor" /> <java-symbol type="color" name="decor_view_status_guard" /> <java-symbol type="color" name="decor_view_status_guard_light" /> <java-symbol type="drawable" name="ic_notification_ime_default" /> <java-symbol type="drawable" name="ic_menu_refresh" /> <java-symbol type="drawable" name="ic_settings" /> Loading Loading @@ -3804,6 +3805,8 @@ <java-symbol type="anim" name="resolver_launch_anim" /> <java-symbol type="style" name="Animation.DeviceDefault.Activity.Resolver" /> <java-symbol type="color" name="decor_view_status_guard_light" /> <java-symbol type="string" name="config_defaultSupervisionProfileOwnerComponent" /> <java-symbol type="bool" name="config_inflateSignalStrength" /> </resources>