Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 52f20677 authored by Tiger Huang's avatar Tiger Huang
Browse files

Flag InsetsSource as invalid if mServerVisible is false

Since this CL, if an insets source is invalid, its visibility cannot be
overridden, as if the source is null.

This CL also enables the caller of InsetsState#equals to skip invalid
sources so that they can avoid the redundant consequence triggered by
adding an invalid insets source.

Fix: 406465708
Flag: EXEMPT bugfix
Test: atest InsetsStateTest InsetsStateControllerTest
      WindowInsetsControllerTests
Change-Id: I42a42ce414d4449bf1e89b95bd8a710ae4a157ec
parent 94ee6735
Loading
Loading
Loading
Loading
+2 −4
Original line number Diff line number Diff line
@@ -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);
@@ -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())) {
+10 −1
Original line number Diff line number Diff line
@@ -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 {}

@@ -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();
    }

+1 −1
Original line number Diff line number Diff line
@@ -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;
+19 −14
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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; }

@@ -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();
@@ -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;
                }
@@ -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;
                }
+95 −12
Original line number Diff line number Diff line
@@ -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;
@@ -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
@@ -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