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

Commit 8320fd49 authored by Tiger Huang's avatar Tiger Huang Committed by Android (Google) Code Review
Browse files

Merge "Flag InsetsSource as invalid if mServerVisible is false" into main

parents d5e4d469 52f20677
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