diff options
| author | Jorim Jaggi <jjaggi@google.com> | 2018-11-30 17:24:58 +0100 |
|---|---|---|
| committer | Jorim Jaggi <jjaggi@google.com> | 2019-01-08 17:24:08 +0100 |
| commit | 297985ab9ddaec1b4236882aec2ff9cc9b08c846 (patch) | |
| tree | bdf4d57b93e892db80ed0f13b6128dbd21752450 /core/java/android/view/WindowInsets.java | |
| parent | 027ff086227ab6b4e1f6bc7c4d623c19e9eda31a (diff) | |
A brave new world for window insets (8/n)
WindowInsets now keeps track of all insets per type. Insets are
non-additive, i.e. every inset starts out relative to the window
edge, so the IME inset would include the navigation bar inset, but
not vice-versa.
We remove decorWindowInsets because it wasn't used at all.
For compatibility, we map the constructor where we pass in a Rect
to TOP_BAR. This is fine as every query to systemWindowInsets
stableInsets will include this type, so we don't need the
information where it came from.
Test: WindowInsetTest
Bug: 118118435
Change-Id: I1cb37d328060293f9a876e61d4a09e6675fa7197
Diffstat (limited to 'core/java/android/view/WindowInsets.java')
| -rw-r--r-- | core/java/android/view/WindowInsets.java | 379 |
1 files changed, 201 insertions, 178 deletions
diff --git a/core/java/android/view/WindowInsets.java b/core/java/android/view/WindowInsets.java index 572d33103cf4..6e2c47e31aae 100644 --- a/core/java/android/view/WindowInsets.java +++ b/core/java/android/view/WindowInsets.java @@ -17,18 +17,30 @@ package android.view; -import android.annotation.NonNull; +import static android.view.WindowInsets.Type.FIRST; +import static android.view.WindowInsets.Type.LAST; +import static android.view.WindowInsets.Type.SIDE_BARS; +import static android.view.WindowInsets.Type.SIZE; +import static android.view.WindowInsets.Type.TOP_BAR; +import static android.view.WindowInsets.Type.all; +import static android.view.WindowInsets.Type.compatSystemInsets; +import static android.view.WindowInsets.Type.indexOf; + import android.annotation.IntDef; +import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.UnsupportedAppUsage; import android.graphics.Insets; import android.graphics.Rect; +import android.util.SparseArray; +import android.view.WindowInsets.Type.InsetType; import android.view.inputmethod.InputMethod; import com.android.internal.util.Preconditions; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; +import java.util.Arrays; import java.util.Objects; /** @@ -49,9 +61,9 @@ import java.util.Objects; */ public final class WindowInsets { - @NonNull private final Insets mSystemWindowInsets; - @NonNull private final Insets mWindowDecorInsets; - @NonNull private final Insets mStableInsets; + private final Insets[] mTypeInsetsMap; + private final Insets[] mTypeMaxInsetsMap; + @Nullable private Rect mTempRect; private final boolean mIsRound; @Nullable private final DisplayCutout mDisplayCutout; @@ -64,7 +76,6 @@ public final class WindowInsets { private final boolean mAlwaysConsumeNavBar; private final boolean mSystemWindowInsetsConsumed; - private final boolean mWindowDecorInsetsConsumed; private final boolean mStableInsetsConsumed; private final boolean mDisplayCutoutConsumed; @@ -78,7 +89,7 @@ public final class WindowInsets { public static final WindowInsets CONSUMED; static { - CONSUMED = new WindowInsets((Insets) null, null, null, false, false, null); + CONSUMED = new WindowInsets((Rect) null, null, false, false, null); } /** @@ -87,24 +98,38 @@ public final class WindowInsets { * A {@code null} inset indicates that the respective inset is consumed. * * @hide + * @deprecated Use {@link WindowInsets(SparseArray, SparseArray, boolean, boolean, DisplayCutout)} */ - public WindowInsets(Rect systemWindowInsets, Rect windowDecorInsets, Rect stableInsets, + public WindowInsets(Rect systemWindowInsetsRect, Rect stableInsetsRect, boolean isRound, boolean alwaysConsumeNavBar, DisplayCutout displayCutout) { - this(insetsOrNull(systemWindowInsets), insetsOrNull(windowDecorInsets), - insetsOrNull(stableInsets), isRound, alwaysConsumeNavBar, displayCutout); + this(createCompatTypeMap(systemWindowInsetsRect), createCompatTypeMap(stableInsetsRect), + isRound, alwaysConsumeNavBar, displayCutout); } - private WindowInsets(Insets systemWindowInsets, Insets windowDecorInsets, - Insets stableInsets, boolean isRound, boolean alwaysConsumeNavBar, - DisplayCutout displayCutout) { - mSystemWindowInsetsConsumed = systemWindowInsets == null; - mSystemWindowInsets = mSystemWindowInsetsConsumed ? Insets.NONE : systemWindowInsets; - - mWindowDecorInsetsConsumed = windowDecorInsets == null; - mWindowDecorInsets = mWindowDecorInsetsConsumed ? Insets.NONE : windowDecorInsets; + /** + * Construct a new WindowInsets from individual insets. + * + * {@code typeInsetsMap} and {@code typeMaxInsetsMap} are a map of indexOf(type) -> insets that + * contain the information what kind of system bars causes how much insets. The insets in this + * map are non-additive; i.e. they have the same origin. In other words: If two system bars + * overlap on one side, the insets of the larger bar will also include the insets of the smaller + * bar. + * + * {@code null} type inset map indicates that the respective inset is fully consumed. + * @hide + */ + public WindowInsets(@Nullable Insets[] typeInsetsMap, + @Nullable Insets[] typeMaxInsetsMap, boolean isRound, + boolean alwaysConsumeNavBar, DisplayCutout displayCutout) { + mSystemWindowInsetsConsumed = typeInsetsMap == null; + mTypeInsetsMap = mSystemWindowInsetsConsumed + ? new Insets[SIZE] + : typeInsetsMap.clone(); - mStableInsetsConsumed = stableInsets == null; - mStableInsets = mStableInsetsConsumed ? Insets.NONE : stableInsets; + mStableInsetsConsumed = typeMaxInsetsMap == null; + mTypeMaxInsetsMap = mStableInsetsConsumed + ? new Insets[SIZE] + : typeMaxInsetsMap.clone(); mIsRound = isRound; mAlwaysConsumeNavBar = alwaysConsumeNavBar; @@ -120,10 +145,7 @@ public final class WindowInsets { * @param src Source to copy insets from */ public WindowInsets(WindowInsets src) { - this(src.mSystemWindowInsetsConsumed ? null : src.mSystemWindowInsets, - src.mWindowDecorInsetsConsumed ? null : src.mWindowDecorInsets, - src.mStableInsetsConsumed ? null : src.mStableInsets, - src.mIsRound, src.mAlwaysConsumeNavBar, + this(src.mTypeInsetsMap, src.mTypeMaxInsetsMap, src.mIsRound, src.mAlwaysConsumeNavBar, displayCutoutCopyConstructorArgument(src)); } @@ -137,10 +159,52 @@ public final class WindowInsets { } } + /** + * @return The insets that include system bars indicated by {@code typeMask}, taken from + * {@code typeInsetMap}. + */ + private static Insets getInsets(Insets[] typeInsetsMap, @InsetType int typeMask) { + Insets result = null; + for (int i = FIRST; i <= LAST; i = i << 1) { + if ((typeMask & i) == 0) { + continue; + } + Insets insets = typeInsetsMap[indexOf(i)]; + if (insets == null) { + continue; + } + if (result == null) { + result = insets; + } else { + result = Insets.max(result, insets); + } + } + return result == null ? Insets.NONE : result; + } + /** @hide */ @UnsupportedAppUsage public WindowInsets(Rect systemWindowInsets) { - this(systemWindowInsets, null, null, false, false, null); + this(createCompatTypeMap(systemWindowInsets), null, false, false, null); + } + + /** + * Creates a indexOf(type) -> inset map for which the {@code insets} is just mapped to + * {@link InsetType#topBar()} and {@link InsetType#sideBars()}, depending on the location of the + * inset. + */ + private static Insets[] createCompatTypeMap(@Nullable Rect insets) { + if (insets == null) { + return null; + } + Insets[] typeInsetMap = new Insets[SIZE]; + assignCompatInsets(typeInsetMap, insets); + return typeInsetMap; + } + + private static void assignCompatInsets(Insets[] typeInsetMap, Rect insets) { + typeInsetMap[indexOf(TOP_BAR)] = Insets.of(0, insets.top, 0, 0); + typeInsetMap[indexOf(SIDE_BARS)] = Insets.of(insets.left, 0, insets.right, insets.bottom); } /** @@ -156,8 +220,8 @@ public final class WindowInsets { if (mTempRect == null) { mTempRect = new Rect(); } - mTempRect.set(mSystemWindowInsets.left, mSystemWindowInsets.top, - mSystemWindowInsets.right, mSystemWindowInsets.bottom); + Insets insets = getSystemWindowInsets(); + mTempRect.set(insets.left, insets.top, insets.right, insets.bottom); return mTempRect; } @@ -172,7 +236,7 @@ public final class WindowInsets { */ @NonNull public Insets getSystemWindowInsets() { - return mSystemWindowInsets; + return getInsets(mTypeInsetsMap, compatSystemInsets()); } /** @@ -185,7 +249,7 @@ public final class WindowInsets { * @return The left system window inset */ public int getSystemWindowInsetLeft() { - return mSystemWindowInsets.left; + return getSystemWindowInsets().left; } /** @@ -198,7 +262,7 @@ public final class WindowInsets { * @return The top system window inset */ public int getSystemWindowInsetTop() { - return mSystemWindowInsets.top; + return getSystemWindowInsets().top; } /** @@ -211,7 +275,7 @@ public final class WindowInsets { * @return The right system window inset */ public int getSystemWindowInsetRight() { - return mSystemWindowInsets.right; + return getSystemWindowInsets().right; } /** @@ -224,63 +288,7 @@ public final class WindowInsets { * @return The bottom system window inset */ public int getSystemWindowInsetBottom() { - return mSystemWindowInsets.bottom; - } - - /** - * Returns the left window decor inset in pixels. - * - * <p>The window decor inset represents the area of the window content area that is - * partially or fully obscured by decorations within the window provided by the framework. - * This can include action bars, title bars, toolbars, etc.</p> - * - * @return The left window decor inset - * @hide pending API - */ - public int getWindowDecorInsetLeft() { - return mWindowDecorInsets.left; - } - - /** - * Returns the top window decor inset in pixels. - * - * <p>The window decor inset represents the area of the window content area that is - * partially or fully obscured by decorations within the window provided by the framework. - * This can include action bars, title bars, toolbars, etc.</p> - * - * @return The top window decor inset - * @hide pending API - */ - public int getWindowDecorInsetTop() { - return mWindowDecorInsets.top; - } - - /** - * Returns the right window decor inset in pixels. - * - * <p>The window decor inset represents the area of the window content area that is - * partially or fully obscured by decorations within the window provided by the framework. - * This can include action bars, title bars, toolbars, etc.</p> - * - * @return The right window decor inset - * @hide pending API - */ - public int getWindowDecorInsetRight() { - return mWindowDecorInsets.right; - } - - /** - * Returns the bottom window decor inset in pixels. - * - * <p>The window decor inset represents the area of the window content area that is - * partially or fully obscured by decorations within the window provided by the framework. - * This can include action bars, title bars, toolbars, etc.</p> - * - * @return The bottom window decor inset - * @hide pending API - */ - public int getWindowDecorInsetBottom() { - return mWindowDecorInsets.bottom; + return getSystemWindowInsets().bottom; } /** @@ -293,23 +301,7 @@ public final class WindowInsets { * @return true if any of the system window inset values are nonzero */ public boolean hasSystemWindowInsets() { - return mSystemWindowInsets.left != 0 || mSystemWindowInsets.top != 0 || - mSystemWindowInsets.right != 0 || mSystemWindowInsets.bottom != 0; - } - - /** - * Returns true if this WindowInsets has nonzero window decor insets. - * - * <p>The window decor inset represents the area of the window content area that is - * partially or fully obscured by decorations within the window provided by the framework. - * This can include action bars, title bars, toolbars, etc.</p> - * - * @return true if any of the window decor inset values are nonzero - * @hide pending API - */ - public boolean hasWindowDecorInsets() { - return mWindowDecorInsets.left != 0 || mWindowDecorInsets.top != 0 || - mWindowDecorInsets.right != 0 || mWindowDecorInsets.bottom != 0; + return !getSystemWindowInsets().equals(Insets.NONE); } /** @@ -318,7 +310,8 @@ public final class WindowInsets { * @return true if any inset values are nonzero */ public boolean hasInsets() { - return hasSystemWindowInsets() || hasWindowDecorInsets() || hasStableInsets() + return !getInsets(mTypeInsetsMap, all()).equals(Insets.NONE) + || !getInsets(mTypeMaxInsetsMap, all()).equals(Insets.NONE) || mDisplayCutout != null; } @@ -340,9 +333,7 @@ public final class WindowInsets { */ @NonNull public WindowInsets consumeDisplayCutout() { - return new WindowInsets(mSystemWindowInsetsConsumed ? null : mSystemWindowInsets, - mWindowDecorInsetsConsumed ? null : mWindowDecorInsets, - mStableInsetsConsumed ? null : mStableInsets, + return new WindowInsets(mTypeInsetsMap, mTypeMaxInsetsMap, mIsRound, mAlwaysConsumeNavBar, null /* displayCutout */); } @@ -362,7 +353,7 @@ public final class WindowInsets { * @return true if the insets have been fully consumed. */ public boolean isConsumed() { - return mSystemWindowInsetsConsumed && mWindowDecorInsetsConsumed && mStableInsetsConsumed + return mSystemWindowInsetsConsumed && mStableInsetsConsumed && mDisplayCutoutConsumed; } @@ -387,9 +378,7 @@ public final class WindowInsets { */ @NonNull public WindowInsets consumeSystemWindowInsets() { - return new WindowInsets(null /* systemWindowInsets */, - mWindowDecorInsetsConsumed ? null : mWindowDecorInsets, - mStableInsetsConsumed ? null : mStableInsets, + return new WindowInsets(null, mStableInsetsConsumed ? null : mTypeMaxInsetsMap, mIsRound, mAlwaysConsumeNavBar, displayCutoutCopyConstructorArgument(this)); } @@ -449,18 +438,6 @@ public final class WindowInsets { } /** - * @hide - */ - @NonNull - public WindowInsets consumeWindowDecorInsets() { - return new WindowInsets(mSystemWindowInsetsConsumed ? null : mSystemWindowInsets, - null /* windowDecorInsets */, - mStableInsetsConsumed ? null : mStableInsets, - mIsRound, mAlwaysConsumeNavBar, - displayCutoutCopyConstructorArgument(this)); - } - - /** * Returns the stable insets in pixels. * * <p>The stable inset represents the area of a full-screen window that <b>may</b> be @@ -473,7 +450,7 @@ public final class WindowInsets { */ @NonNull public Insets getStableInsets() { - return mStableInsets; + return getInsets(mTypeMaxInsetsMap, compatSystemInsets()); } /** @@ -488,7 +465,7 @@ public final class WindowInsets { * @return The top stable inset */ public int getStableInsetTop() { - return mStableInsets.top; + return getStableInsets().top; } /** @@ -503,7 +480,7 @@ public final class WindowInsets { * @return The left stable inset */ public int getStableInsetLeft() { - return mStableInsets.left; + return getStableInsets().left; } /** @@ -518,7 +495,7 @@ public final class WindowInsets { * @return The right stable inset */ public int getStableInsetRight() { - return mStableInsets.right; + return getStableInsets().right; } /** @@ -533,7 +510,7 @@ public final class WindowInsets { * @return The bottom stable inset */ public int getStableInsetBottom() { - return mStableInsets.bottom; + return getStableInsets().bottom; } /** @@ -548,8 +525,7 @@ public final class WindowInsets { * @return true if any of the stable inset values are nonzero */ public boolean hasStableInsets() { - return mStableInsets.top != 0 || mStableInsets.left != 0 || mStableInsets.right != 0 - || mStableInsets.bottom != 0; + return !getStableInsets().equals(Insets.NONE); } /** @@ -559,9 +535,7 @@ public final class WindowInsets { */ @NonNull public WindowInsets consumeStableInsets() { - return new WindowInsets(mSystemWindowInsetsConsumed ? null : mSystemWindowInsets, - mWindowDecorInsetsConsumed ? null : mWindowDecorInsets, - null /* stableInsets */, + return new WindowInsets(mSystemWindowInsetsConsumed ? null : mTypeInsetsMap, null, mIsRound, mAlwaysConsumeNavBar, displayCutoutCopyConstructorArgument(this)); } @@ -575,9 +549,8 @@ public final class WindowInsets { @Override public String toString() { - return "WindowInsets{systemWindowInsets=" + mSystemWindowInsets - + " windowDecorInsets=" + mWindowDecorInsets - + " stableInsets=" + mStableInsets + return "WindowInsets{systemWindowInsets=" + getSystemWindowInsets() + + " stableInsets=" + getStableInsets() + (mDisplayCutout != null ? " cutout=" + mDisplayCutout : "") + (isRound() ? " round" : "") + "}"; @@ -634,16 +607,16 @@ public final class WindowInsets { Preconditions.checkArgumentNonnegative(bottom); return new WindowInsets( - mSystemWindowInsetsConsumed ? null : - insetInsets(mSystemWindowInsets, left, top, right, bottom), - mWindowDecorInsetsConsumed ? null : - insetInsets(mWindowDecorInsets, left, top, right, bottom), - mStableInsetsConsumed ? null : - insetInsets(mStableInsets, left, top, right, bottom), + mSystemWindowInsetsConsumed + ? null + : insetInsets(mTypeInsetsMap, left, top, right, bottom), + mStableInsetsConsumed + ? null + : insetInsets(mTypeMaxInsetsMap, left, top, right, bottom), mIsRound, mAlwaysConsumeNavBar, mDisplayCutoutConsumed - ? null : - mDisplayCutout == null + ? null + : mDisplayCutout == null ? DisplayCutout.NO_CUTOUT : mDisplayCutout.inset(left, top, right, bottom)); } @@ -653,23 +626,49 @@ public final class WindowInsets { if (this == o) return true; if (o == null || !(o instanceof WindowInsets)) return false; WindowInsets that = (WindowInsets) o; + return mIsRound == that.mIsRound && mAlwaysConsumeNavBar == that.mAlwaysConsumeNavBar && mSystemWindowInsetsConsumed == that.mSystemWindowInsetsConsumed - && mWindowDecorInsetsConsumed == that.mWindowDecorInsetsConsumed && mStableInsetsConsumed == that.mStableInsetsConsumed && mDisplayCutoutConsumed == that.mDisplayCutoutConsumed - && Objects.equals(mSystemWindowInsets, that.mSystemWindowInsets) - && Objects.equals(mWindowDecorInsets, that.mWindowDecorInsets) - && Objects.equals(mStableInsets, that.mStableInsets) + && Arrays.equals(mTypeInsetsMap, that.mTypeInsetsMap) + && Arrays.equals(mTypeMaxInsetsMap, that.mTypeMaxInsetsMap) && Objects.equals(mDisplayCutout, that.mDisplayCutout); } @Override public int hashCode() { - return Objects.hash(mSystemWindowInsets, mWindowDecorInsets, mStableInsets, mIsRound, - mDisplayCutout, mAlwaysConsumeNavBar, mSystemWindowInsetsConsumed, - mWindowDecorInsetsConsumed, mStableInsetsConsumed, mDisplayCutoutConsumed); + return Objects.hash(Arrays.hashCode(mTypeInsetsMap), Arrays.hashCode(mTypeMaxInsetsMap), + mIsRound, mDisplayCutout, mAlwaysConsumeNavBar, mSystemWindowInsetsConsumed, + mStableInsetsConsumed, mDisplayCutoutConsumed); + } + + + /** + * Insets every inset in {@code typeInsetsMap} by the specified left, top, right, bottom. + * + * @return {@code typeInsetsMap} if no inset was modified; a copy of the map with the modified + * insets otherwise. + */ + private static Insets[] insetInsets( + Insets[] typeInsetsMap, int left, int top, int right, int bottom) { + boolean cloned = false; + for (int i = 0; i < SIZE; i++) { + Insets insets = typeInsetsMap[i]; + if (insets == null) { + continue; + } + Insets insetInsets = insetInsets(insets, left, top, right, bottom); + if (insetInsets != insets) { + if (!cloned) { + typeInsetsMap = typeInsetsMap.clone(); + cloned = true; + } + typeInsetsMap[i] = insetInsets; + } + } + return typeInsetsMap; } private static Insets insetInsets(Insets insets, int left, int top, int right, int bottom) { @@ -683,10 +682,6 @@ public final class WindowInsets { return Insets.of(newLeft, newTop, newRight, newBottom); } - private static Insets insetsOrNull(Rect insets) { - return insets != null ? Insets.of(insets) : null; - } - /** * @return whether system window insets have been consumed. */ @@ -699,11 +694,13 @@ public final class WindowInsets { */ public static class Builder { - private Insets mSystemWindowInsets; - private Insets mStableInsets; + private final Insets[] mTypeInsetsMap; + private final Insets[] mTypeMaxInsetsMap; + private boolean mSystemInsetsConsumed = true; + private boolean mStableInsetsConsumed = true; + private DisplayCutout mDisplayCutout; - private Insets mWindowDecorInsets; private boolean mIsRound; private boolean mAlwaysConsumeNavBar; @@ -711,6 +708,8 @@ public final class WindowInsets { * Creates a builder where all insets are initially consumed. */ public Builder() { + mTypeInsetsMap = new Insets[SIZE]; + mTypeMaxInsetsMap = new Insets[SIZE]; } /** @@ -719,12 +718,11 @@ public final class WindowInsets { * @param insets the instance to initialize from. */ public Builder(WindowInsets insets) { - mSystemWindowInsets = insets.mSystemWindowInsetsConsumed ? null - : insets.mSystemWindowInsets; - mStableInsets = insets.mStableInsetsConsumed ? null : insets.mStableInsets; + mTypeInsetsMap = insets.mTypeInsetsMap.clone(); + mTypeMaxInsetsMap = insets.mTypeMaxInsetsMap.clone(); + mSystemInsetsConsumed = insets.mSystemWindowInsetsConsumed; + mStableInsetsConsumed = insets.mStableInsetsConsumed; mDisplayCutout = displayCutoutCopyConstructorArgument(insets); - mWindowDecorInsets = insets.mWindowDecorInsetsConsumed ? null - : insets.mWindowDecorInsets; mIsRound = insets.mIsRound; mAlwaysConsumeNavBar = insets.mAlwaysConsumeNavBar; } @@ -742,7 +740,8 @@ public final class WindowInsets { @NonNull public Builder setSystemWindowInsets(@NonNull Insets systemWindowInsets) { Preconditions.checkNotNull(systemWindowInsets); - mSystemWindowInsets = systemWindowInsets; + assignCompatInsets(mTypeInsetsMap, systemWindowInsets.toRect()); + mSystemInsetsConsumed = false; return this; } @@ -761,7 +760,8 @@ public final class WindowInsets { @NonNull public Builder setStableInsets(@NonNull Insets stableInsets) { Preconditions.checkNotNull(stableInsets); - mStableInsets = stableInsets; + assignCompatInsets(mTypeInsetsMap, stableInsets.toRect()); + mStableInsetsConsumed = false; return this; } @@ -780,14 +780,6 @@ public final class WindowInsets { /** @hide */ @NonNull - public Builder setWindowDecorInsets(@NonNull Insets windowDecorInsets) { - Preconditions.checkNotNull(windowDecorInsets); - mWindowDecorInsets = windowDecorInsets; - return this; - } - - /** @hide */ - @NonNull public Builder setRound(boolean round) { mIsRound = round; return this; @@ -807,8 +799,9 @@ public final class WindowInsets { */ @NonNull public WindowInsets build() { - return new WindowInsets(mSystemWindowInsets, mWindowDecorInsets, mStableInsets, - mIsRound, mAlwaysConsumeNavBar, mDisplayCutout); + return new WindowInsets(mSystemInsetsConsumed ? null : mTypeInsetsMap, + mStableInsetsConsumed ? null : mTypeMaxInsetsMap, mIsRound, + mAlwaysConsumeNavBar, mDisplayCutout); } } @@ -818,10 +811,31 @@ public final class WindowInsets { */ public static final class Type { - static final int TOP_BAR = 0x1; + static final int FIRST = 0x1; + static final int TOP_BAR = FIRST; + static final int IME = 0x2; static final int SIDE_BARS = 0x4; - static final int WINDOW_DECOR = 0x8; + + static final int LAST = 0x8; + static final int SIZE = 4; + static final int WINDOW_DECOR = LAST; + + static int indexOf(@InsetType int type) { + switch (type) { + case TOP_BAR: + return 0; + case IME: + return 1; + case SIDE_BARS: + return 2; + case WINDOW_DECOR: + return 3; + default: + throw new IllegalArgumentException("type needs to be >= FIRST and <= LAST," + + " type=" + type); + } + } private Type() { } @@ -870,6 +884,15 @@ public final class WindowInsets { } /** + * @return Inset types representing the list of bars that traditionally were denoted as + * system insets. + * @hide + */ + static @InsetType int compatSystemInsets() { + return TOP_BAR | SIDE_BARS | IME; + } + + /** * @return All inset types combined. */ public static @InsetType int all() { |
