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

Commit 2e8a64a9 authored by Tiger Huang's avatar Tiger Huang
Browse files

Fix InsetsState#set if this == other

The logic shouldn't clear or remove the sources if this and the given
InsetsState are the same object. Otherwise, we will lose the reference
to the source that needs to be set from.

Fix: 417997812
Flag: EXEMPT bugfix
Test: atest InsetsStateTest
Change-Id: Ib8daec735f048731719353d3c52cb322fd70b964
parent e3b2dbbf
Loading
Loading
Loading
Loading
+22 −13
Original line number Diff line number Diff line
@@ -612,6 +612,7 @@ public class InsetsState implements Parcelable {
    }

    public void set(InsetsState other, boolean copySources) {
        if (this != other) {
            mDisplayFrame.set(other.mDisplayFrame);
            mDisplayCutout.set(other.mDisplayCutout);
            mRoundedCorners = other.getRoundedCorners();
@@ -626,6 +627,11 @@ public class InsetsState implements Parcelable {
                        ? new InsetsSource(otherSource)
                        : otherSource);
            }
        } else if (copySources) {
            for (int i = 0, size = mSources.size(); i < size; i++) {
                mSources.setValueAt(i, new InsetsSource(mSources.valueAt(i)));
            }
        }
    }

    /**
@@ -636,6 +642,9 @@ public class InsetsState implements Parcelable {
     * @param types the only types of sources would be set.
     */
    public void set(InsetsState other, @InsetsType int types) {
        if (this == other) {
            return;
        }
        mDisplayFrame.set(other.mDisplayFrame);
        mDisplayCutout.set(other.mDisplayCutout);
        mRoundedCorners = other.getRoundedCorners();
+49 −0
Original line number Diff line number Diff line
@@ -623,6 +623,55 @@ public class InsetsStateTest {
        assertEquals(mState, mState2);
    }

    @Test
    public void testSet() {
        mState.getOrCreateSource(ID_IME, ime())
                .setFrame(new Rect(1, 2, 3, 4));
        mState.getOrCreateSource(ID_STATUS_BAR, statusBars())
                .setFrame(new Rect(5, 6, 7, 8));
        final int size = mState.sourceSize();

        mState.set(mState);
        assertEquals(size, mState.sourceSize());
        mState.set(mState, true /* copiesSource */);
        assertEquals(size, mState.sourceSize());

        mState2.getOrCreateSource(ID_NAVIGATION_BAR, navigationBars())
                .setFrame(new Rect(9, 10, 11, 12));
        mState2.set(mState);
        assertEquals(size, mState2.sourceSize());
        assertEquals(mState, mState2);

        mState2.getOrCreateSource(ID_NAVIGATION_BAR, navigationBars())
                .setFrame(new Rect(13, 14, 15, 16));
        mState2.set(mState, true /* copiesSource */);
        assertEquals(size, mState2.sourceSize());
        assertEquals(mState, mState2);
    }

    @Test
    public void testSetForTypes() {
        mState.getOrCreateSource(ID_IME, ime())
                .setFrame(new Rect(1, 2, 3, 4));
        mState.getOrCreateSource(ID_STATUS_BAR, statusBars())
                .setFrame(new Rect(5, 6, 7, 8));
        final int size = mState.sourceSize();

        mState.set(mState, ime() | statusBars());
        assertEquals(size, mState.sourceSize());

        mState2.getOrCreateSource(ID_NAVIGATION_BAR, navigationBars())
                .setFrame(new Rect(9, 10, 11, 12));
        mState2.set(mState, ime() | statusBars());
        assertEquals(
                mState.getOrCreateSource(ID_IME, ime()),
                mState2.getOrCreateSource(ID_IME, ime()));
        assertEquals(
                mState.getOrCreateSource(ID_IME, statusBars()),
                mState2.getOrCreateSource(ID_IME, statusBars()));
        assertEquals(size + 1, mState2.sourceSize());
    }

    @Test
    public void testCopy() {
        mState.getOrCreateSource(ID_IME, ime())