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

Commit 86480e37 authored by Tiger Huang's avatar Tiger Huang Committed by Automerger Merge Worker
Browse files

Merge "Update requested state by comparing with source consumer" into rvc-dev...

Merge "Update requested state by comparing with source consumer" into rvc-dev am: 894a7974 am: 8e4707ae

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/12108428

Change-Id: I8b8c9bbfe2e5bfa58ae6f94f57886a6ae4897686
parents fae3137f 8e4707ae
Loading
Loading
Loading
Loading
+20 −6
Original line number Diff line number Diff line
@@ -737,7 +737,7 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation
            }
        }

        final boolean hasControl = mTmpControlArray.size() > 0;
        boolean requestedStateStale = false;
        final int[] showTypes = new int[1];
        final int[] hideTypes = new int[1];

@@ -754,9 +754,26 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation
        // Ensure to create source consumers if not available yet.
        for (int i = mTmpControlArray.size() - 1; i >= 0; i--) {
            final InsetsSourceControl control = mTmpControlArray.valueAt(i);
            InsetsSourceConsumer consumer = getSourceConsumer(control.getType());
            final @InternalInsetsType int type = control.getType();
            final InsetsSourceConsumer consumer = getSourceConsumer(type);
            consumer.setControl(control, showTypes, hideTypes);

            if (!requestedStateStale) {
                final boolean requestedVisible = consumer.isRequestedVisible();

                // We might have changed our requested visibilities while we don't have the control,
                // so we need to update our requested state once we have control. Otherwise, our
                // requested state at the server side might be incorrect.
                final boolean requestedVisibilityChanged =
                        requestedVisible != mRequestedState.getSourceOrDefaultVisibility(type);

                // The IME client visibility will be reset by insets source provider while updating
                // control, so if IME is requested visible, we need to send the request to server.
                final boolean imeRequestedVisible = type == ITYPE_IME && requestedVisible;

                requestedStateStale = requestedVisibilityChanged || imeRequestedVisible;
            }

        }
        mTmpControlArray.clear();

@@ -772,10 +789,7 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation
        if (hideTypes[0] != 0) {
            applyAnimation(hideTypes[0], false /* show */, false /* fromIme */);
        }
        if (hasControl && mRequestedState.hasSources()) {
            // We might have changed our requested visibilities while we don't have the control,
            // so we need to update our requested state once we have control. Otherwise, our
            // requested state at the server side might be incorrect.
        if (requestedStateStale) {
            updateRequestedState();
        }
    }
+40 −1
Original line number Diff line number Diff line
@@ -691,18 +691,57 @@ public class InsetsControllerTest {
    @Test
    public void testRequestedState() {
        InstrumentationRegistry.getInstrumentation().runOnMainSync(() -> {

            // The modified state can be controlled when we have control.
            mController.onControlsChanged(createSingletonControl(ITYPE_STATUS_BAR));
            mController.hide(statusBars());
            assertFalse(mTestHost.getModifiedState().peekSource(ITYPE_STATUS_BAR).isVisible());
            mController.onControlsChanged(new InsetsSourceControl[0]);

            // The modified state won't be changed while losing control.
            mController.onControlsChanged(null /* activeControls */);
            assertFalse(mTestHost.getModifiedState().peekSource(ITYPE_STATUS_BAR).isVisible());

            // The modified state won't be changed while state changed while we don't have control.
            InsetsState newState = new InsetsState(mController.getState(), true /* copySource */);
            mController.onStateChanged(newState);
            assertFalse(mTestHost.getModifiedState().peekSource(ITYPE_STATUS_BAR).isVisible());

            // The modified state won't be changed while controlling an insets without having the
            // control.
            mController.show(statusBars());
            assertFalse(mTestHost.getModifiedState().peekSource(ITYPE_STATUS_BAR).isVisible());

            // The modified state can be updated while gaining control.
            mController.onControlsChanged(createSingletonControl(ITYPE_STATUS_BAR));
            assertTrue(mTestHost.getModifiedState().peekSource(ITYPE_STATUS_BAR).isVisible());

            // The modified state can still be updated if the local state and the requested state
            // are the same.
            mController.onControlsChanged(null /* activeControls */);
            mController.hide(statusBars());
            newState = new InsetsState(mController.getState(), true /* copySource */);
            newState.getSource(ITYPE_STATUS_BAR).setVisible(false);
            mController.onStateChanged(newState);
            mController.onControlsChanged(createSingletonControl(ITYPE_STATUS_BAR));
            assertFalse(mTestHost.getModifiedState().peekSource(ITYPE_STATUS_BAR).isVisible());

            // The modified state will always be updated while receiving IME control if IME is
            // requested visible.
            mController.getSourceConsumer(ITYPE_IME).show(false /* fromIme */);
            newState = new InsetsState(mController.getState(), true /* copySource */);
            newState.getSource(ITYPE_IME).setVisible(true);
            newState.getSource(ITYPE_IME).setFrame(1, 2, 3, 4);
            mController.onStateChanged(newState);
            mController.onControlsChanged(createSingletonControl(ITYPE_IME));
            assertEquals(newState.getSource(ITYPE_IME),
                    mTestHost.getModifiedState().peekSource(ITYPE_IME));
            newState = new InsetsState(mController.getState(), true /* copySource */);
            newState.getSource(ITYPE_IME).setVisible(true);
            newState.getSource(ITYPE_IME).setFrame(5, 6, 7, 8);
            mController.onStateChanged(newState);
            mController.onControlsChanged(createSingletonControl(ITYPE_IME));
            assertEquals(newState.getSource(ITYPE_IME),
                    mTestHost.getModifiedState().peekSource(ITYPE_IME));
        });
    }