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

Commit c0d837a7 authored by Tiger Huang's avatar Tiger Huang
Browse files

Copy the source before modifying it before dispatching

Otherwise, we will modify the same instance referenced by the raw
InsetsState at the server side.

Fix: 154292314
Test: atest ChildlessActivityTest InsetsStateControllerTest
Change-Id: I1cc0122dc99ed00ad904c13158cb4b56e485401f
parent 896cdcca
Loading
Loading
Loading
Loading
+7 −2
Original line number Diff line number Diff line
@@ -170,8 +170,13 @@ class InsetsStateController {
        }

        if (aboveIme) {
            InsetsSource imeSource = state.peekSource(ITYPE_IME);
            if (imeSource != null && imeSource.isVisible()) {
                imeSource = new InsetsSource(imeSource);
                imeSource.setVisible(false);
                state = new InsetsState(state);
            state.setSourceVisible(ITYPE_IME, false);
                state.addSource(imeSource);
            }
        }

        return state;
+15 −0
Original line number Diff line number Diff line
@@ -152,6 +152,21 @@ public class InsetsStateControllerTest extends WindowTestsBase {
        assertNull(getController().getInsetsForDispatch(app).peekSource(ITYPE_NAVIGATION_BAR));
    }

    @Test
    public void testStripForDispatch_independentSources() {
        getController().getSourceProvider(ITYPE_IME).setWindow(mImeWindow, null, null);

        final WindowState app1 = createWindow(null, TYPE_APPLICATION, "app1");
        app1.mBehindIme = true;

        final WindowState app2 = createWindow(null, TYPE_APPLICATION, "app2");
        app2.mBehindIme = false;

        getController().getRawInsetsState().setSourceVisible(ITYPE_IME, true);
        assertFalse(getController().getInsetsForDispatch(app2).getSource(ITYPE_IME).isVisible());
        assertTrue(getController().getInsetsForDispatch(app1).getSource(ITYPE_IME).isVisible());
    }

    @Test
    public void testStripForDispatch_belowIme() {
        getController().getSourceProvider(ITYPE_IME).setWindow(mImeWindow, null, null);