Loading core/java/android/view/View.java +7 −1 Original line number Diff line number Diff line Loading @@ -5923,12 +5923,18 @@ public class View implements Drawable.Callback, KeyEvent.Callback, */ protected boolean fitSystemWindows(Rect insets) { if ((mPrivateFlags3 & PFLAG3_APPLYING_INSETS) == 0) { if (insets == null) { // Null insets by definition have already been consumed. // This call cannot apply insets since there are none to apply, // so return false. return false; } // If we're not in the process of dispatching the newer apply insets call, // that means we're not in the compatibility path. Dispatch into the newer // apply insets path and take things from there. try { mPrivateFlags3 |= PFLAG3_FITTING_SYSTEM_WINDOWS; return !dispatchApplyWindowInsets(new WindowInsets(insets)).hasInsets(); return dispatchApplyWindowInsets(new WindowInsets(insets)).isConsumed(); } finally { mPrivateFlags3 &= PFLAG3_FITTING_SYSTEM_WINDOWS; } Loading core/java/android/view/ViewGroup.java +2 −2 Original line number Diff line number Diff line Loading @@ -5433,11 +5433,11 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager @Override public WindowInsets dispatchApplyWindowInsets(WindowInsets insets) { insets = super.dispatchApplyWindowInsets(insets); if (insets.hasInsets()) { if (!insets.isConsumed()) { final int count = getChildCount(); for (int i = 0; i < count; i++) { insets = getChildAt(i).dispatchApplyWindowInsets(insets); if (!insets.hasInsets()) { if (insets.isConsumed()) { break; } } Loading core/java/android/view/WindowInsets.java +47 −7 Original line number Diff line number Diff line Loading @@ -35,6 +35,9 @@ public final class WindowInsets { private Rect mTempRect; private boolean mIsRound; private boolean mSystemWindowInsetsConsumed = false; private boolean mWindowDecorInsetsConsumed = false; private static final Rect EMPTY_RECT = new Rect(0, 0, 0, 0); /** Loading @@ -43,7 +46,13 @@ public final class WindowInsets { * since it would allow them to inadvertently consume unknown insets by returning it. * @hide */ public static final WindowInsets EMPTY = new WindowInsets(EMPTY_RECT, EMPTY_RECT); public static final WindowInsets CONSUMED; static { CONSUMED = new WindowInsets(EMPTY_RECT, EMPTY_RECT); CONSUMED.mSystemWindowInsetsConsumed = true; CONSUMED.mWindowDecorInsetsConsumed = true; } /** @hide */ public WindowInsets(Rect systemWindowInsets, Rect windowDecorInsets) { Loading @@ -52,13 +61,17 @@ public final class WindowInsets { /** @hide */ public WindowInsets(Rect systemWindowInsets, boolean isRound) { this(systemWindowInsets, EMPTY_RECT, isRound); this(systemWindowInsets, null, isRound); } /** @hide */ public WindowInsets(Rect systemWindowInsets, Rect windowDecorInsets, boolean isRound) { mSystemWindowInsets = systemWindowInsets; mWindowDecorInsets = windowDecorInsets; mSystemWindowInsetsConsumed = systemWindowInsets == null; mSystemWindowInsets = mSystemWindowInsetsConsumed ? EMPTY_RECT : systemWindowInsets; mWindowDecorInsetsConsumed = windowDecorInsets == null; mWindowDecorInsets = mWindowDecorInsetsConsumed ? EMPTY_RECT : windowDecorInsets; mIsRound = isRound; } Loading @@ -70,12 +83,14 @@ public final class WindowInsets { public WindowInsets(WindowInsets src) { mSystemWindowInsets = src.mSystemWindowInsets; mWindowDecorInsets = src.mWindowDecorInsets; mSystemWindowInsetsConsumed = src.mSystemWindowInsetsConsumed; mWindowDecorInsetsConsumed = src.mWindowDecorInsetsConsumed; mIsRound = src.mIsRound; } /** @hide */ public WindowInsets(Rect systemWindowInsets) { this(systemWindowInsets, EMPTY_RECT); this(systemWindowInsets, null); } /** Loading Loading @@ -242,6 +257,24 @@ public final class WindowInsets { return hasSystemWindowInsets() || hasWindowDecorInsets(); } /** * Check if these insets have been fully consumed. * * <p>Insets are considered "consumed" if the applicable <code>consume*</code> methods * have been called such that all insets have been set to zero. This affects propagation of * insets through the view hierarchy; insets that have not been fully consumed will continue * to propagate down to child views.</p> * * <p>The result of this method is equivalent to the return value of * {@link View#fitSystemWindows(android.graphics.Rect)}.</p> * * @return true if the insets have been fully consumed. * @hide Pending API */ public boolean isConsumed() { return mSystemWindowInsetsConsumed && mWindowDecorInsetsConsumed; } /** * Returns true if the associated window has a round shape. * Loading @@ -263,7 +296,8 @@ public final class WindowInsets { */ public WindowInsets consumeSystemWindowInsets() { final WindowInsets result = new WindowInsets(this); result.mSystemWindowInsets = new Rect(0, 0, 0, 0); result.mSystemWindowInsets = EMPTY_RECT; result.mSystemWindowInsetsConsumed = true; return result; } Loading @@ -281,10 +315,12 @@ public final class WindowInsets { boolean right, boolean bottom) { if (left || top || right || bottom) { final WindowInsets result = new WindowInsets(this); result.mSystemWindowInsets = new Rect(left ? 0 : mSystemWindowInsets.left, result.mSystemWindowInsets = new Rect( left ? 0 : mSystemWindowInsets.left, top ? 0 : mSystemWindowInsets.top, right ? 0 : mSystemWindowInsets.right, bottom ? 0 : mSystemWindowInsets.bottom); result.mSystemWindowInsetsConsumed = !hasSystemWindowInsets(); return result; } return this; Loading @@ -304,6 +340,7 @@ public final class WindowInsets { int right, int bottom) { final WindowInsets result = new WindowInsets(this); result.mSystemWindowInsets = new Rect(left, top, right, bottom); result.mSystemWindowInsetsConsumed = !hasSystemWindowInsets(); return result; } Loading @@ -313,6 +350,7 @@ public final class WindowInsets { public WindowInsets consumeWindowDecorInsets() { final WindowInsets result = new WindowInsets(this); result.mWindowDecorInsets.set(0, 0, 0, 0); result.mWindowDecorInsetsConsumed = true; return result; } Loading @@ -327,6 +365,7 @@ public final class WindowInsets { top ? 0 : mWindowDecorInsets.top, right ? 0 : mWindowDecorInsets.right, bottom ? 0 : mWindowDecorInsets.bottom); result.mWindowDecorInsetsConsumed = !hasWindowDecorInsets(); return result; } return this; Loading @@ -338,6 +377,7 @@ public final class WindowInsets { public WindowInsets replaceWindowDecorInsets(int left, int top, int right, int bottom) { final WindowInsets result = new WindowInsets(this); result.mWindowDecorInsets = new Rect(left, top, right, bottom); result.mWindowDecorInsetsConsumed = !hasWindowDecorInsets(); return result; } Loading core/java/com/android/internal/widget/ActionBarOverlayLayout.java +9 −1 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.internal.widget; import android.content.res.Configuration; import android.graphics.Canvas; import android.graphics.drawable.Drawable; import android.os.Build; Loading Loading @@ -134,6 +135,13 @@ public class ActionBarOverlayLayout extends ViewGroup { } } @Override protected void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); init(getContext()); requestApplyInsets(); } @Override public void onWindowSystemUiVisibilityChanged(int visible) { super.onWindowSystemUiVisibilityChanged(visible); Loading Loading @@ -219,7 +227,7 @@ public class ActionBarOverlayLayout extends ViewGroup { // insets in all cases, we need to know the measured size of the various action // bar elements. onApplyWindowInsets() happens before the measure pass, so we can't // do that here. Instead we will take this up in onMeasure(). return WindowInsets.EMPTY; return WindowInsets.CONSUMED; } @Override Loading Loading
core/java/android/view/View.java +7 −1 Original line number Diff line number Diff line Loading @@ -5923,12 +5923,18 @@ public class View implements Drawable.Callback, KeyEvent.Callback, */ protected boolean fitSystemWindows(Rect insets) { if ((mPrivateFlags3 & PFLAG3_APPLYING_INSETS) == 0) { if (insets == null) { // Null insets by definition have already been consumed. // This call cannot apply insets since there are none to apply, // so return false. return false; } // If we're not in the process of dispatching the newer apply insets call, // that means we're not in the compatibility path. Dispatch into the newer // apply insets path and take things from there. try { mPrivateFlags3 |= PFLAG3_FITTING_SYSTEM_WINDOWS; return !dispatchApplyWindowInsets(new WindowInsets(insets)).hasInsets(); return dispatchApplyWindowInsets(new WindowInsets(insets)).isConsumed(); } finally { mPrivateFlags3 &= PFLAG3_FITTING_SYSTEM_WINDOWS; } Loading
core/java/android/view/ViewGroup.java +2 −2 Original line number Diff line number Diff line Loading @@ -5433,11 +5433,11 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager @Override public WindowInsets dispatchApplyWindowInsets(WindowInsets insets) { insets = super.dispatchApplyWindowInsets(insets); if (insets.hasInsets()) { if (!insets.isConsumed()) { final int count = getChildCount(); for (int i = 0; i < count; i++) { insets = getChildAt(i).dispatchApplyWindowInsets(insets); if (!insets.hasInsets()) { if (insets.isConsumed()) { break; } } Loading
core/java/android/view/WindowInsets.java +47 −7 Original line number Diff line number Diff line Loading @@ -35,6 +35,9 @@ public final class WindowInsets { private Rect mTempRect; private boolean mIsRound; private boolean mSystemWindowInsetsConsumed = false; private boolean mWindowDecorInsetsConsumed = false; private static final Rect EMPTY_RECT = new Rect(0, 0, 0, 0); /** Loading @@ -43,7 +46,13 @@ public final class WindowInsets { * since it would allow them to inadvertently consume unknown insets by returning it. * @hide */ public static final WindowInsets EMPTY = new WindowInsets(EMPTY_RECT, EMPTY_RECT); public static final WindowInsets CONSUMED; static { CONSUMED = new WindowInsets(EMPTY_RECT, EMPTY_RECT); CONSUMED.mSystemWindowInsetsConsumed = true; CONSUMED.mWindowDecorInsetsConsumed = true; } /** @hide */ public WindowInsets(Rect systemWindowInsets, Rect windowDecorInsets) { Loading @@ -52,13 +61,17 @@ public final class WindowInsets { /** @hide */ public WindowInsets(Rect systemWindowInsets, boolean isRound) { this(systemWindowInsets, EMPTY_RECT, isRound); this(systemWindowInsets, null, isRound); } /** @hide */ public WindowInsets(Rect systemWindowInsets, Rect windowDecorInsets, boolean isRound) { mSystemWindowInsets = systemWindowInsets; mWindowDecorInsets = windowDecorInsets; mSystemWindowInsetsConsumed = systemWindowInsets == null; mSystemWindowInsets = mSystemWindowInsetsConsumed ? EMPTY_RECT : systemWindowInsets; mWindowDecorInsetsConsumed = windowDecorInsets == null; mWindowDecorInsets = mWindowDecorInsetsConsumed ? EMPTY_RECT : windowDecorInsets; mIsRound = isRound; } Loading @@ -70,12 +83,14 @@ public final class WindowInsets { public WindowInsets(WindowInsets src) { mSystemWindowInsets = src.mSystemWindowInsets; mWindowDecorInsets = src.mWindowDecorInsets; mSystemWindowInsetsConsumed = src.mSystemWindowInsetsConsumed; mWindowDecorInsetsConsumed = src.mWindowDecorInsetsConsumed; mIsRound = src.mIsRound; } /** @hide */ public WindowInsets(Rect systemWindowInsets) { this(systemWindowInsets, EMPTY_RECT); this(systemWindowInsets, null); } /** Loading Loading @@ -242,6 +257,24 @@ public final class WindowInsets { return hasSystemWindowInsets() || hasWindowDecorInsets(); } /** * Check if these insets have been fully consumed. * * <p>Insets are considered "consumed" if the applicable <code>consume*</code> methods * have been called such that all insets have been set to zero. This affects propagation of * insets through the view hierarchy; insets that have not been fully consumed will continue * to propagate down to child views.</p> * * <p>The result of this method is equivalent to the return value of * {@link View#fitSystemWindows(android.graphics.Rect)}.</p> * * @return true if the insets have been fully consumed. * @hide Pending API */ public boolean isConsumed() { return mSystemWindowInsetsConsumed && mWindowDecorInsetsConsumed; } /** * Returns true if the associated window has a round shape. * Loading @@ -263,7 +296,8 @@ public final class WindowInsets { */ public WindowInsets consumeSystemWindowInsets() { final WindowInsets result = new WindowInsets(this); result.mSystemWindowInsets = new Rect(0, 0, 0, 0); result.mSystemWindowInsets = EMPTY_RECT; result.mSystemWindowInsetsConsumed = true; return result; } Loading @@ -281,10 +315,12 @@ public final class WindowInsets { boolean right, boolean bottom) { if (left || top || right || bottom) { final WindowInsets result = new WindowInsets(this); result.mSystemWindowInsets = new Rect(left ? 0 : mSystemWindowInsets.left, result.mSystemWindowInsets = new Rect( left ? 0 : mSystemWindowInsets.left, top ? 0 : mSystemWindowInsets.top, right ? 0 : mSystemWindowInsets.right, bottom ? 0 : mSystemWindowInsets.bottom); result.mSystemWindowInsetsConsumed = !hasSystemWindowInsets(); return result; } return this; Loading @@ -304,6 +340,7 @@ public final class WindowInsets { int right, int bottom) { final WindowInsets result = new WindowInsets(this); result.mSystemWindowInsets = new Rect(left, top, right, bottom); result.mSystemWindowInsetsConsumed = !hasSystemWindowInsets(); return result; } Loading @@ -313,6 +350,7 @@ public final class WindowInsets { public WindowInsets consumeWindowDecorInsets() { final WindowInsets result = new WindowInsets(this); result.mWindowDecorInsets.set(0, 0, 0, 0); result.mWindowDecorInsetsConsumed = true; return result; } Loading @@ -327,6 +365,7 @@ public final class WindowInsets { top ? 0 : mWindowDecorInsets.top, right ? 0 : mWindowDecorInsets.right, bottom ? 0 : mWindowDecorInsets.bottom); result.mWindowDecorInsetsConsumed = !hasWindowDecorInsets(); return result; } return this; Loading @@ -338,6 +377,7 @@ public final class WindowInsets { public WindowInsets replaceWindowDecorInsets(int left, int top, int right, int bottom) { final WindowInsets result = new WindowInsets(this); result.mWindowDecorInsets = new Rect(left, top, right, bottom); result.mWindowDecorInsetsConsumed = !hasWindowDecorInsets(); return result; } Loading
core/java/com/android/internal/widget/ActionBarOverlayLayout.java +9 −1 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.internal.widget; import android.content.res.Configuration; import android.graphics.Canvas; import android.graphics.drawable.Drawable; import android.os.Build; Loading Loading @@ -134,6 +135,13 @@ public class ActionBarOverlayLayout extends ViewGroup { } } @Override protected void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); init(getContext()); requestApplyInsets(); } @Override public void onWindowSystemUiVisibilityChanged(int visible) { super.onWindowSystemUiVisibilityChanged(visible); Loading Loading @@ -219,7 +227,7 @@ public class ActionBarOverlayLayout extends ViewGroup { // insets in all cases, we need to know the measured size of the various action // bar elements. onApplyWindowInsets() happens before the measure pass, so we can't // do that here. Instead we will take this up in onMeasure(). return WindowInsets.EMPTY; return WindowInsets.CONSUMED; } @Override Loading