Loading core/java/android/view/InsetsController.java +2 −4 Original line number Diff line number Diff line Loading @@ -862,9 +862,7 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation } public boolean onStateChanged(InsetsState state) { boolean stateChanged = !mState.equals(state, false /* excludesCaptionBar */, false /* excludesInvisibleIme */); if (!stateChanged && mLastDispatchedState.equals(state)) { if (mState.equals(state) && mLastDispatchedState.equals(state)) { return false; } if (DEBUG) Log.d(TAG, "onStateChanged: " + state); Loading @@ -875,7 +873,7 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation updateCompatSysUiVisibility(); if (!mState.equals(lastState, false /* excludesCaptionBar */, true /* excludesInvisibleIme */)) { true /* excludesInvisibleIme */, true /* excludesInvalidSource */)) { if (DEBUG) Log.d(TAG, "onStateChanged, notifyInsetsChanged"); mHost.notifyInsetsChanged(); if (mLastDispatchedState.getDisplayFrame().equals(state.getDisplayFrame())) { Loading core/java/android/view/InsetsSource.java +10 −1 Original line number Diff line number Diff line Loading @@ -114,13 +114,19 @@ public class InsetsSource implements Parcelable { */ public static final int FLAG_FORCE_CONSUMING_OPAQUE_CAPTION_BAR = 1 << 4; /** * Indicates whether the insets source is valid. */ public static final int FLAG_INVALID = 1 << 5; @Retention(RetentionPolicy.SOURCE) @IntDef(flag = true, prefix = "FLAG_", value = { FLAG_SUPPRESS_SCRIM, FLAG_INSETS_ROUNDED_CORNER, FLAG_FORCE_CONSUMING, FLAG_ANIMATE_RESIZING, FLAG_FORCE_CONSUMING_OPAQUE_CAPTION_BAR FLAG_FORCE_CONSUMING_OPAQUE_CAPTION_BAR, FLAG_INVALID, }) public @interface Flags {} Loading Loading @@ -594,6 +600,9 @@ public class InsetsSource implements Parcelable { if ((flags & FLAG_FORCE_CONSUMING_OPAQUE_CAPTION_BAR) != 0) { joiner.add("FORCE_CONSUMING_OPAQUE_CAPTION_BAR"); } if ((flags & FLAG_INVALID) != 0) { joiner.add("INVALID"); } return joiner.toString(); } Loading core/java/android/view/InsetsSourceConsumer.java +1 −1 Original line number Diff line number Diff line Loading @@ -325,7 +325,7 @@ public class InsetsSourceConsumer { } } final InsetsSource source = mState.peekSource(mId); if (source == null) { if (source == null || source.hasFlags(InsetsSource.FLAG_INVALID)) { return false; } final boolean requestedVisible = (mController.getRequestedVisibleTypes() & mType) != 0; Loading core/java/android/view/InsetsState.java +19 −14 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ import static android.util.SequenceUtils.getInitSeq; import static android.view.InsetsSource.FLAG_FORCE_CONSUMING; import static android.view.InsetsSource.FLAG_FORCE_CONSUMING_OPAQUE_CAPTION_BAR; import static android.view.InsetsSource.FLAG_INSETS_ROUNDED_CORNER; import static android.view.InsetsSource.FLAG_INVALID; import static android.view.InsetsStateProto.DISPLAY_CUTOUT; import static android.view.InsetsStateProto.DISPLAY_FRAME; import static android.view.InsetsStateProto.SOURCES; Loading Loading @@ -55,8 +56,6 @@ import android.view.WindowInsets.Type; import android.view.WindowInsets.Type.InsetsType; import android.view.WindowManager.LayoutParams.SoftInputModeFlags; import com.android.internal.annotations.VisibleForTesting; import java.io.PrintWriter; import java.util.Objects; import java.util.StringJoiner; Loading Loading @@ -703,21 +702,23 @@ public class InsetsState implements Parcelable { @Override public boolean equals(@Nullable Object o) { return equals(o, false, false); return equals(o, false, false, false); } /** * An equals method can exclude the caption insets. This is useful because we assemble the * caption insets information on the client side, and when we communicate with server, it's * excluded. * * @param excludesCaptionBar If {@link Type#captionBar()}} should be ignored. * @param excludesInvisibleIme If {@link WindowInsets.Type#ime()} should be ignored when IME is * @param excludesInvisibleIme If {@link Type#ime()} should be ignored when IME is * not visible. * @param excludesInvalidSource If a source should be ignored if it has * {@link InsetsSource#FLAG_INVALID}. * @return {@code true} if the two InsetsState objects are equal, {@code false} otherwise. */ @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE) public boolean equals(@Nullable Object o, boolean excludesCaptionBar, boolean excludesInvisibleIme) { boolean excludesInvisibleIme, boolean excludesInvalidSource) { if (this == o) { return true; } if (o == null || getClass() != o.getClass()) { return false; } Loading @@ -735,7 +736,7 @@ public class InsetsState implements Parcelable { final SparseArray<InsetsSource> thisSources = mSources; final SparseArray<InsetsSource> thatSources = state.mSources; if (!excludesCaptionBar && !excludesInvisibleIme) { if (!excludesCaptionBar && !excludesInvisibleIme && !excludesInvalidSource) { return thisSources.contentEquals(thatSources); } else { final int thisSize = thisSources.size(); Loading @@ -749,9 +750,11 @@ public class InsetsState implements Parcelable { // Seek to the next non-excluding source of ours. while (thisSource != null && (excludesCaptionBar && thisSource.getType() == captionBar() || excludesInvisibleIme && thisSource.getType() == ime() && !thisSource.isVisible())) { && ((excludesCaptionBar && thisSource.getType() == captionBar()) || (excludesInvisibleIme && thisSource.getType() == ime() && !thisSource.isVisible()) || (excludesInvalidSource && thisSource.hasFlags(FLAG_INVALID)))) { thisIndex++; thisSource = thisIndex < thisSize ? thisSources.valueAt(thisIndex) : null; } Loading @@ -762,9 +765,11 @@ public class InsetsState implements Parcelable { // Seek to the next non-excluding source of theirs. while (thatSource != null && (excludesCaptionBar && thatSource.getType() == captionBar() || excludesInvisibleIme && thatSource.getType() == ime() && !thatSource.isVisible())) { && ((excludesCaptionBar && thatSource.getType() == captionBar()) || (excludesInvisibleIme && thatSource.getType() == ime() && !thatSource.isVisible()) || (excludesInvalidSource && thatSource.hasFlags(FLAG_INVALID)))) { thatIndex++; thatSource = thatIndex < thatSize ? thatSources.valueAt(thatIndex) : null; } Loading core/tests/coretests/src/android/view/InsetsStateTest.java +95 −12 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD; import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED; import static android.view.InsetsSource.FLAG_FORCE_CONSUMING; import static android.view.InsetsSource.FLAG_FORCE_CONSUMING_OPAQUE_CAPTION_BAR; import static android.view.InsetsSource.FLAG_INVALID; import static android.view.InsetsSource.ID_IME; import static android.view.InsetsSource.SIDE_BOTTOM; import static android.view.InsetsSource.SIDE_TOP; Loading Loading @@ -354,22 +355,40 @@ public class InsetsStateTest { state1.addSource(new InsetsSource(ID_CAPTION_BAR, captionBar()).setFrame(0, 0, 0, 5)); assertFalse(state1.equals( state2, false /* excludesCaptionBar */, false /* excludesInvisibleIme */)); state2, false /* excludesCaptionBar */, false /* excludesInvisibleIme */, false /* excludesInvalidSource */)); assertTrue(state1.equals( state2, true /* excludesCaptionBar */, false /* excludesInvisibleIme */)); state2, true /* excludesCaptionBar */, false /* excludesInvisibleIme */, false /* excludesInvalidSource */)); state2.addSource(new InsetsSource(ID_CAPTION_BAR, captionBar()).setFrame(0, 0, 0, 10)); assertFalse(state1.equals( state2, false /* excludesCaptionBar */, false /* excludesInvisibleIme */)); state2, false /* excludesCaptionBar */, false /* excludesInvisibleIme */, false /* excludesInvalidSource */)); assertTrue(state1.equals( state2, true /* excludesCaptionBar */, false /* excludesInvisibleIme */)); state2, true /* excludesCaptionBar */, false /* excludesInvisibleIme */, false /* excludesInvalidSource */)); state1.addSource(new InsetsSource(ID_STATUS_BAR, statusBars())); state2.addSource(new InsetsSource(ID_STATUS_BAR, statusBars())); assertFalse(state1.equals( state2, false /* excludesCaptionBar */, false /* excludesInvisibleIme */)); state2, false /* excludesCaptionBar */, false /* excludesInvisibleIme */, false /* excludesInvalidSource */)); assertTrue(state1.equals( state2, true /* excludesCaptionBar */, false /* excludesInvisibleIme */)); state2, true /* excludesCaptionBar */, false /* excludesInvisibleIme */, false /* excludesInvalidSource */)); } @Test Loading @@ -380,22 +399,86 @@ public class InsetsStateTest { final InsetsSource imeSource1 = new InsetsSource(ID_IME, ime()).setVisible(true); state1.addSource(imeSource1); assertFalse(state1.equals( state2, false /* excludesCaptionBar */, false /* excludesInvisibleIme */)); state2, false /* excludesCaptionBar */, false /* excludesInvisibleIme */, false /* excludesInvalidSource */)); assertFalse(state1.equals( state2, false /* excludesCaptionBar */, true /* excludesInvisibleIme */)); state2, false /* excludesCaptionBar */, true /* excludesInvisibleIme */, false /* excludesInvalidSource */)); imeSource1.setVisible(false); assertFalse(state1.equals( state2, false /* excludesCaptionBar */, false /* excludesInvisibleIme */)); state2, false /* excludesCaptionBar */, false /* excludesInvisibleIme */, false /* excludesInvalidSource */)); assertTrue(state1.equals( state2, false /* excludesCaptionBar */, true /* excludesInvisibleIme */)); state2, false /* excludesCaptionBar */, true /* excludesInvisibleIme */, false /* excludesInvalidSource */)); final InsetsSource imeSource2 = new InsetsSource(ID_IME, ime()).setFrame(0, 0, 0, 10); state2.addSource(imeSource2); assertFalse(state1.equals( state2, false /* excludesCaptionBar */, false /* excludesInvisibleIme */)); state2, false /* excludesCaptionBar */, false /* excludesInvisibleIme */, false /* excludesInvalidSource */)); assertTrue(state1.equals( state2, false /* excludesCaptionBar */, true /* excludesInvisibleIme */)); state2, false /* excludesCaptionBar */, true /* excludesInvisibleIme */, false /* excludesInvalidSource */)); } @Test public void testEquals_excludesInvalidSource() { final InsetsState state1 = new InsetsState(); final InsetsState state2 = new InsetsState(); final InsetsSource imeSource1 = new InsetsSource(ID_IME, ime()); state1.addSource(imeSource1); assertFalse(state1.equals( state2, false /* excludesCaptionBar */, false /* excludesInvisibleIme */, false /* excludesInvalidSource */)); assertFalse(state1.equals( state2, false /* excludesCaptionBar */, false /* excludesInvisibleIme */, true /* excludesInvalidSource */)); imeSource1.setFlags(FLAG_INVALID); assertFalse(state1.equals( state2, false /* excludesCaptionBar */, false /* excludesInvisibleIme */, false /* excludesInvalidSource */)); assertTrue(state1.equals( state2, false /* excludesCaptionBar */, false /* excludesInvisibleIme */, true /* excludesInvalidSource */)); final InsetsSource imeSource2 = new InsetsSource(ID_IME, ime()) .setFrame(0, 0, 0, 10) .setFlags(FLAG_INVALID); state2.addSource(imeSource2); assertFalse(state1.equals( state2, false /* excludesCaptionBar */, false /* excludesInvisibleIme */, false /* excludesInvalidSource */)); assertTrue(state1.equals( state2, false /* excludesCaptionBar */, false /* excludesInvisibleIme */, true /* excludesInvalidSource */)); } @Test Loading Loading
core/java/android/view/InsetsController.java +2 −4 Original line number Diff line number Diff line Loading @@ -862,9 +862,7 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation } public boolean onStateChanged(InsetsState state) { boolean stateChanged = !mState.equals(state, false /* excludesCaptionBar */, false /* excludesInvisibleIme */); if (!stateChanged && mLastDispatchedState.equals(state)) { if (mState.equals(state) && mLastDispatchedState.equals(state)) { return false; } if (DEBUG) Log.d(TAG, "onStateChanged: " + state); Loading @@ -875,7 +873,7 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation updateCompatSysUiVisibility(); if (!mState.equals(lastState, false /* excludesCaptionBar */, true /* excludesInvisibleIme */)) { true /* excludesInvisibleIme */, true /* excludesInvalidSource */)) { if (DEBUG) Log.d(TAG, "onStateChanged, notifyInsetsChanged"); mHost.notifyInsetsChanged(); if (mLastDispatchedState.getDisplayFrame().equals(state.getDisplayFrame())) { Loading
core/java/android/view/InsetsSource.java +10 −1 Original line number Diff line number Diff line Loading @@ -114,13 +114,19 @@ public class InsetsSource implements Parcelable { */ public static final int FLAG_FORCE_CONSUMING_OPAQUE_CAPTION_BAR = 1 << 4; /** * Indicates whether the insets source is valid. */ public static final int FLAG_INVALID = 1 << 5; @Retention(RetentionPolicy.SOURCE) @IntDef(flag = true, prefix = "FLAG_", value = { FLAG_SUPPRESS_SCRIM, FLAG_INSETS_ROUNDED_CORNER, FLAG_FORCE_CONSUMING, FLAG_ANIMATE_RESIZING, FLAG_FORCE_CONSUMING_OPAQUE_CAPTION_BAR FLAG_FORCE_CONSUMING_OPAQUE_CAPTION_BAR, FLAG_INVALID, }) public @interface Flags {} Loading Loading @@ -594,6 +600,9 @@ public class InsetsSource implements Parcelable { if ((flags & FLAG_FORCE_CONSUMING_OPAQUE_CAPTION_BAR) != 0) { joiner.add("FORCE_CONSUMING_OPAQUE_CAPTION_BAR"); } if ((flags & FLAG_INVALID) != 0) { joiner.add("INVALID"); } return joiner.toString(); } Loading
core/java/android/view/InsetsSourceConsumer.java +1 −1 Original line number Diff line number Diff line Loading @@ -325,7 +325,7 @@ public class InsetsSourceConsumer { } } final InsetsSource source = mState.peekSource(mId); if (source == null) { if (source == null || source.hasFlags(InsetsSource.FLAG_INVALID)) { return false; } final boolean requestedVisible = (mController.getRequestedVisibleTypes() & mType) != 0; Loading
core/java/android/view/InsetsState.java +19 −14 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ import static android.util.SequenceUtils.getInitSeq; import static android.view.InsetsSource.FLAG_FORCE_CONSUMING; import static android.view.InsetsSource.FLAG_FORCE_CONSUMING_OPAQUE_CAPTION_BAR; import static android.view.InsetsSource.FLAG_INSETS_ROUNDED_CORNER; import static android.view.InsetsSource.FLAG_INVALID; import static android.view.InsetsStateProto.DISPLAY_CUTOUT; import static android.view.InsetsStateProto.DISPLAY_FRAME; import static android.view.InsetsStateProto.SOURCES; Loading Loading @@ -55,8 +56,6 @@ import android.view.WindowInsets.Type; import android.view.WindowInsets.Type.InsetsType; import android.view.WindowManager.LayoutParams.SoftInputModeFlags; import com.android.internal.annotations.VisibleForTesting; import java.io.PrintWriter; import java.util.Objects; import java.util.StringJoiner; Loading Loading @@ -703,21 +702,23 @@ public class InsetsState implements Parcelable { @Override public boolean equals(@Nullable Object o) { return equals(o, false, false); return equals(o, false, false, false); } /** * An equals method can exclude the caption insets. This is useful because we assemble the * caption insets information on the client side, and when we communicate with server, it's * excluded. * * @param excludesCaptionBar If {@link Type#captionBar()}} should be ignored. * @param excludesInvisibleIme If {@link WindowInsets.Type#ime()} should be ignored when IME is * @param excludesInvisibleIme If {@link Type#ime()} should be ignored when IME is * not visible. * @param excludesInvalidSource If a source should be ignored if it has * {@link InsetsSource#FLAG_INVALID}. * @return {@code true} if the two InsetsState objects are equal, {@code false} otherwise. */ @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE) public boolean equals(@Nullable Object o, boolean excludesCaptionBar, boolean excludesInvisibleIme) { boolean excludesInvisibleIme, boolean excludesInvalidSource) { if (this == o) { return true; } if (o == null || getClass() != o.getClass()) { return false; } Loading @@ -735,7 +736,7 @@ public class InsetsState implements Parcelable { final SparseArray<InsetsSource> thisSources = mSources; final SparseArray<InsetsSource> thatSources = state.mSources; if (!excludesCaptionBar && !excludesInvisibleIme) { if (!excludesCaptionBar && !excludesInvisibleIme && !excludesInvalidSource) { return thisSources.contentEquals(thatSources); } else { final int thisSize = thisSources.size(); Loading @@ -749,9 +750,11 @@ public class InsetsState implements Parcelable { // Seek to the next non-excluding source of ours. while (thisSource != null && (excludesCaptionBar && thisSource.getType() == captionBar() || excludesInvisibleIme && thisSource.getType() == ime() && !thisSource.isVisible())) { && ((excludesCaptionBar && thisSource.getType() == captionBar()) || (excludesInvisibleIme && thisSource.getType() == ime() && !thisSource.isVisible()) || (excludesInvalidSource && thisSource.hasFlags(FLAG_INVALID)))) { thisIndex++; thisSource = thisIndex < thisSize ? thisSources.valueAt(thisIndex) : null; } Loading @@ -762,9 +765,11 @@ public class InsetsState implements Parcelable { // Seek to the next non-excluding source of theirs. while (thatSource != null && (excludesCaptionBar && thatSource.getType() == captionBar() || excludesInvisibleIme && thatSource.getType() == ime() && !thatSource.isVisible())) { && ((excludesCaptionBar && thatSource.getType() == captionBar()) || (excludesInvisibleIme && thatSource.getType() == ime() && !thatSource.isVisible()) || (excludesInvalidSource && thatSource.hasFlags(FLAG_INVALID)))) { thatIndex++; thatSource = thatIndex < thatSize ? thatSources.valueAt(thatIndex) : null; } Loading
core/tests/coretests/src/android/view/InsetsStateTest.java +95 −12 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD; import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED; import static android.view.InsetsSource.FLAG_FORCE_CONSUMING; import static android.view.InsetsSource.FLAG_FORCE_CONSUMING_OPAQUE_CAPTION_BAR; import static android.view.InsetsSource.FLAG_INVALID; import static android.view.InsetsSource.ID_IME; import static android.view.InsetsSource.SIDE_BOTTOM; import static android.view.InsetsSource.SIDE_TOP; Loading Loading @@ -354,22 +355,40 @@ public class InsetsStateTest { state1.addSource(new InsetsSource(ID_CAPTION_BAR, captionBar()).setFrame(0, 0, 0, 5)); assertFalse(state1.equals( state2, false /* excludesCaptionBar */, false /* excludesInvisibleIme */)); state2, false /* excludesCaptionBar */, false /* excludesInvisibleIme */, false /* excludesInvalidSource */)); assertTrue(state1.equals( state2, true /* excludesCaptionBar */, false /* excludesInvisibleIme */)); state2, true /* excludesCaptionBar */, false /* excludesInvisibleIme */, false /* excludesInvalidSource */)); state2.addSource(new InsetsSource(ID_CAPTION_BAR, captionBar()).setFrame(0, 0, 0, 10)); assertFalse(state1.equals( state2, false /* excludesCaptionBar */, false /* excludesInvisibleIme */)); state2, false /* excludesCaptionBar */, false /* excludesInvisibleIme */, false /* excludesInvalidSource */)); assertTrue(state1.equals( state2, true /* excludesCaptionBar */, false /* excludesInvisibleIme */)); state2, true /* excludesCaptionBar */, false /* excludesInvisibleIme */, false /* excludesInvalidSource */)); state1.addSource(new InsetsSource(ID_STATUS_BAR, statusBars())); state2.addSource(new InsetsSource(ID_STATUS_BAR, statusBars())); assertFalse(state1.equals( state2, false /* excludesCaptionBar */, false /* excludesInvisibleIme */)); state2, false /* excludesCaptionBar */, false /* excludesInvisibleIme */, false /* excludesInvalidSource */)); assertTrue(state1.equals( state2, true /* excludesCaptionBar */, false /* excludesInvisibleIme */)); state2, true /* excludesCaptionBar */, false /* excludesInvisibleIme */, false /* excludesInvalidSource */)); } @Test Loading @@ -380,22 +399,86 @@ public class InsetsStateTest { final InsetsSource imeSource1 = new InsetsSource(ID_IME, ime()).setVisible(true); state1.addSource(imeSource1); assertFalse(state1.equals( state2, false /* excludesCaptionBar */, false /* excludesInvisibleIme */)); state2, false /* excludesCaptionBar */, false /* excludesInvisibleIme */, false /* excludesInvalidSource */)); assertFalse(state1.equals( state2, false /* excludesCaptionBar */, true /* excludesInvisibleIme */)); state2, false /* excludesCaptionBar */, true /* excludesInvisibleIme */, false /* excludesInvalidSource */)); imeSource1.setVisible(false); assertFalse(state1.equals( state2, false /* excludesCaptionBar */, false /* excludesInvisibleIme */)); state2, false /* excludesCaptionBar */, false /* excludesInvisibleIme */, false /* excludesInvalidSource */)); assertTrue(state1.equals( state2, false /* excludesCaptionBar */, true /* excludesInvisibleIme */)); state2, false /* excludesCaptionBar */, true /* excludesInvisibleIme */, false /* excludesInvalidSource */)); final InsetsSource imeSource2 = new InsetsSource(ID_IME, ime()).setFrame(0, 0, 0, 10); state2.addSource(imeSource2); assertFalse(state1.equals( state2, false /* excludesCaptionBar */, false /* excludesInvisibleIme */)); state2, false /* excludesCaptionBar */, false /* excludesInvisibleIme */, false /* excludesInvalidSource */)); assertTrue(state1.equals( state2, false /* excludesCaptionBar */, true /* excludesInvisibleIme */)); state2, false /* excludesCaptionBar */, true /* excludesInvisibleIme */, false /* excludesInvalidSource */)); } @Test public void testEquals_excludesInvalidSource() { final InsetsState state1 = new InsetsState(); final InsetsState state2 = new InsetsState(); final InsetsSource imeSource1 = new InsetsSource(ID_IME, ime()); state1.addSource(imeSource1); assertFalse(state1.equals( state2, false /* excludesCaptionBar */, false /* excludesInvisibleIme */, false /* excludesInvalidSource */)); assertFalse(state1.equals( state2, false /* excludesCaptionBar */, false /* excludesInvisibleIme */, true /* excludesInvalidSource */)); imeSource1.setFlags(FLAG_INVALID); assertFalse(state1.equals( state2, false /* excludesCaptionBar */, false /* excludesInvisibleIme */, false /* excludesInvalidSource */)); assertTrue(state1.equals( state2, false /* excludesCaptionBar */, false /* excludesInvisibleIme */, true /* excludesInvalidSource */)); final InsetsSource imeSource2 = new InsetsSource(ID_IME, ime()) .setFrame(0, 0, 0, 10) .setFlags(FLAG_INVALID); state2.addSource(imeSource2); assertFalse(state1.equals( state2, false /* excludesCaptionBar */, false /* excludesInvisibleIme */, false /* excludesInvalidSource */)); assertTrue(state1.equals( state2, false /* excludesCaptionBar */, false /* excludesInvisibleIme */, true /* excludesInvalidSource */)); } @Test Loading