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 Original line Diff line number Diff line
@@ -862,9 +862,7 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation
    }
    }


    public boolean onStateChanged(InsetsState state) {
    public boolean onStateChanged(InsetsState state) {
        boolean stateChanged = !mState.equals(state, false /* excludesCaptionBar */,
        if (mState.equals(state) && mLastDispatchedState.equals(state)) {
                false /* excludesInvisibleIme */);
        if (!stateChanged && mLastDispatchedState.equals(state)) {
            return false;
            return false;
        }
        }
        if (DEBUG) Log.d(TAG, "onStateChanged: " + state);
        if (DEBUG) Log.d(TAG, "onStateChanged: " + state);
@@ -875,7 +873,7 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation
        updateCompatSysUiVisibility();
        updateCompatSysUiVisibility();


        if (!mState.equals(lastState, false /* excludesCaptionBar */,
        if (!mState.equals(lastState, false /* excludesCaptionBar */,
                true /* excludesInvisibleIme */)) {
                true /* excludesInvisibleIme */, true /* excludesInvalidSource */)) {
            if (DEBUG) Log.d(TAG, "onStateChanged, notifyInsetsChanged");
            if (DEBUG) Log.d(TAG, "onStateChanged, notifyInsetsChanged");
            mHost.notifyInsetsChanged();
            mHost.notifyInsetsChanged();
            if (mLastDispatchedState.getDisplayFrame().equals(state.getDisplayFrame())) {
            if (mLastDispatchedState.getDisplayFrame().equals(state.getDisplayFrame())) {
+10 −1
Original line number Original line 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;
    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)
    @Retention(RetentionPolicy.SOURCE)
    @IntDef(flag = true, prefix = "FLAG_", value = {
    @IntDef(flag = true, prefix = "FLAG_", value = {
            FLAG_SUPPRESS_SCRIM,
            FLAG_SUPPRESS_SCRIM,
            FLAG_INSETS_ROUNDED_CORNER,
            FLAG_INSETS_ROUNDED_CORNER,
            FLAG_FORCE_CONSUMING,
            FLAG_FORCE_CONSUMING,
            FLAG_ANIMATE_RESIZING,
            FLAG_ANIMATE_RESIZING,
            FLAG_FORCE_CONSUMING_OPAQUE_CAPTION_BAR
            FLAG_FORCE_CONSUMING_OPAQUE_CAPTION_BAR,
            FLAG_INVALID,
    })
    })
    public @interface Flags {}
    public @interface Flags {}


@@ -594,6 +600,9 @@ public class InsetsSource implements Parcelable {
        if ((flags & FLAG_FORCE_CONSUMING_OPAQUE_CAPTION_BAR) != 0) {
        if ((flags & FLAG_FORCE_CONSUMING_OPAQUE_CAPTION_BAR) != 0) {
            joiner.add("FORCE_CONSUMING_OPAQUE_CAPTION_BAR");
            joiner.add("FORCE_CONSUMING_OPAQUE_CAPTION_BAR");
        }
        }
        if ((flags & FLAG_INVALID) != 0) {
            joiner.add("INVALID");
        }
        return joiner.toString();
        return joiner.toString();
    }
    }


+1 −1
Original line number Original line Diff line number Diff line
@@ -325,7 +325,7 @@ public class InsetsSourceConsumer {
            }
            }
        }
        }
        final InsetsSource source = mState.peekSource(mId);
        final InsetsSource source = mState.peekSource(mId);
        if (source == null) {
        if (source == null || source.hasFlags(InsetsSource.FLAG_INVALID)) {
            return false;
            return false;
        }
        }
        final boolean requestedVisible = (mController.getRequestedVisibleTypes() & mType) != 0;
        final boolean requestedVisible = (mController.getRequestedVisibleTypes() & mType) != 0;
+19 −14
Original line number Original line 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;
import static android.view.InsetsSource.FLAG_FORCE_CONSUMING_OPAQUE_CAPTION_BAR;
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_INSETS_ROUNDED_CORNER;
import static android.view.InsetsSource.FLAG_INVALID;
import static android.view.InsetsStateProto.DISPLAY_CUTOUT;
import static android.view.InsetsStateProto.DISPLAY_CUTOUT;
import static android.view.InsetsStateProto.DISPLAY_FRAME;
import static android.view.InsetsStateProto.DISPLAY_FRAME;
import static android.view.InsetsStateProto.SOURCES;
import static android.view.InsetsStateProto.SOURCES;
@@ -55,8 +56,6 @@ import android.view.WindowInsets.Type;
import android.view.WindowInsets.Type.InsetsType;
import android.view.WindowInsets.Type.InsetsType;
import android.view.WindowManager.LayoutParams.SoftInputModeFlags;
import android.view.WindowManager.LayoutParams.SoftInputModeFlags;


import com.android.internal.annotations.VisibleForTesting;

import java.io.PrintWriter;
import java.io.PrintWriter;
import java.util.Objects;
import java.util.Objects;
import java.util.StringJoiner;
import java.util.StringJoiner;
@@ -703,21 +702,23 @@ public class InsetsState implements Parcelable {


    @Override
    @Override
    public boolean equals(@Nullable Object o) {
    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
     * 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
     * caption insets information on the client side, and when we communicate with server, it's
     * excluded.
     * excluded.
     *
     * @param excludesCaptionBar   If {@link Type#captionBar()}} should be ignored.
     * @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.
     *                             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.
     * @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,
    public boolean equals(@Nullable Object o, boolean excludesCaptionBar,
            boolean excludesInvisibleIme) {
            boolean excludesInvisibleIme, boolean excludesInvalidSource) {
        if (this == o) { return true; }
        if (this == o) { return true; }
        if (o == null || getClass() != o.getClass()) { return false; }
        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> thisSources = mSources;
        final SparseArray<InsetsSource> thatSources = state.mSources;
        final SparseArray<InsetsSource> thatSources = state.mSources;
        if (!excludesCaptionBar && !excludesInvisibleIme) {
        if (!excludesCaptionBar && !excludesInvisibleIme && !excludesInvalidSource) {
            return thisSources.contentEquals(thatSources);
            return thisSources.contentEquals(thatSources);
        } else {
        } else {
            final int thisSize = thisSources.size();
            final int thisSize = thisSources.size();
@@ -749,9 +750,11 @@ public class InsetsState implements Parcelable {


                // Seek to the next non-excluding source of ours.
                // Seek to the next non-excluding source of ours.
                while (thisSource != null
                while (thisSource != null
                        && (excludesCaptionBar && thisSource.getType() == captionBar()
                        && ((excludesCaptionBar && thisSource.getType() == captionBar())
                                || excludesInvisibleIme && thisSource.getType() == ime()
                                || (excludesInvisibleIme && thisSource.getType() == ime()
                                        && !thisSource.isVisible())) {
                                        && !thisSource.isVisible())
                                || (excludesInvalidSource
                                        && thisSource.hasFlags(FLAG_INVALID)))) {
                    thisIndex++;
                    thisIndex++;
                    thisSource = thisIndex < thisSize ? thisSources.valueAt(thisIndex) : null;
                    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.
                // Seek to the next non-excluding source of theirs.
                while (thatSource != null
                while (thatSource != null
                        && (excludesCaptionBar && thatSource.getType() == captionBar()
                        && ((excludesCaptionBar && thatSource.getType() == captionBar())
                                || excludesInvisibleIme && thatSource.getType() == ime()
                                || (excludesInvisibleIme && thatSource.getType() == ime()
                                        && !thatSource.isVisible())) {
                                        && !thatSource.isVisible())
                                || (excludesInvalidSource
                                        && thatSource.hasFlags(FLAG_INVALID)))) {
                    thatIndex++;
                    thatIndex++;
                    thatSource = thatIndex < thatSize ? thatSources.valueAt(thatIndex) : null;
                    thatSource = thatIndex < thatSize ? thatSources.valueAt(thatIndex) : null;
                }
                }
+95 −12
Original line number Original line 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.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED;
import static android.view.InsetsSource.FLAG_FORCE_CONSUMING;
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_FORCE_CONSUMING_OPAQUE_CAPTION_BAR;
import static android.view.InsetsSource.FLAG_INVALID;
import static android.view.InsetsSource.ID_IME;
import static android.view.InsetsSource.ID_IME;
import static android.view.InsetsSource.SIDE_BOTTOM;
import static android.view.InsetsSource.SIDE_BOTTOM;
import static android.view.InsetsSource.SIDE_TOP;
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));
        state1.addSource(new InsetsSource(ID_CAPTION_BAR, captionBar()).setFrame(0, 0, 0, 5));
        assertFalse(state1.equals(
        assertFalse(state1.equals(
                state2, false /* excludesCaptionBar */, false /* excludesInvisibleIme */));
                state2,
                false /* excludesCaptionBar */,
                false /* excludesInvisibleIme */,
                false /* excludesInvalidSource */));
        assertTrue(state1.equals(
        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));
        state2.addSource(new InsetsSource(ID_CAPTION_BAR, captionBar()).setFrame(0, 0, 0, 10));
        assertFalse(state1.equals(
        assertFalse(state1.equals(
                state2, false /* excludesCaptionBar */, false /* excludesInvisibleIme */));
                state2,
                false /* excludesCaptionBar */,
                false /* excludesInvisibleIme */,
                false /* excludesInvalidSource */));
        assertTrue(state1.equals(
        assertTrue(state1.equals(
                state2, true /* excludesCaptionBar */, false /* excludesInvisibleIme */));
                state2,
                true /* excludesCaptionBar */,
                false /* excludesInvisibleIme */,
                false /* excludesInvalidSource */));


        state1.addSource(new InsetsSource(ID_STATUS_BAR, statusBars()));
        state1.addSource(new InsetsSource(ID_STATUS_BAR, statusBars()));
        state2.addSource(new InsetsSource(ID_STATUS_BAR, statusBars()));
        state2.addSource(new InsetsSource(ID_STATUS_BAR, statusBars()));
        assertFalse(state1.equals(
        assertFalse(state1.equals(
                state2, false /* excludesCaptionBar */, false /* excludesInvisibleIme */));
                state2,
                false /* excludesCaptionBar */,
                false /* excludesInvisibleIme */,
                false /* excludesInvalidSource */));
        assertTrue(state1.equals(
        assertTrue(state1.equals(
                state2, true /* excludesCaptionBar */, false /* excludesInvisibleIme */));
                state2,
                true /* excludesCaptionBar */,
                false /* excludesInvisibleIme */,
                false /* excludesInvalidSource */));
    }
    }


    @Test
    @Test
@@ -380,22 +399,86 @@ public class InsetsStateTest {
        final InsetsSource imeSource1 = new InsetsSource(ID_IME, ime()).setVisible(true);
        final InsetsSource imeSource1 = new InsetsSource(ID_IME, ime()).setVisible(true);
        state1.addSource(imeSource1);
        state1.addSource(imeSource1);
        assertFalse(state1.equals(
        assertFalse(state1.equals(
                state2, false /* excludesCaptionBar */, false /* excludesInvisibleIme */));
                state2,
                false /* excludesCaptionBar */,
                false /* excludesInvisibleIme */,
                false /* excludesInvalidSource */));
        assertFalse(state1.equals(
        assertFalse(state1.equals(
                state2, false /* excludesCaptionBar */, true /* excludesInvisibleIme */));
                state2,
                false /* excludesCaptionBar */,
                true /* excludesInvisibleIme */,
                false /* excludesInvalidSource */));


        imeSource1.setVisible(false);
        imeSource1.setVisible(false);
        assertFalse(state1.equals(
        assertFalse(state1.equals(
                state2, false /* excludesCaptionBar */, false /* excludesInvisibleIme */));
                state2,
                false /* excludesCaptionBar */,
                false /* excludesInvisibleIme */,
                false /* excludesInvalidSource */));
        assertTrue(state1.equals(
        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);
        final InsetsSource imeSource2 = new InsetsSource(ID_IME, ime()).setFrame(0, 0, 0, 10);
        state2.addSource(imeSource2);
        state2.addSource(imeSource2);
        assertFalse(state1.equals(
        assertFalse(state1.equals(
                state2, false /* excludesCaptionBar */, false /* excludesInvisibleIme */));
                state2,
                false /* excludesCaptionBar */,
                false /* excludesInvisibleIme */,
                false /* excludesInvalidSource */));
        assertTrue(state1.equals(
        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
    @Test
Loading