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

Commit a052eef7 authored by Bill Lin's avatar Bill Lin
Browse files

Do not register + unregister DA in the same call

Calling unregister + register in the same call is NOT able to process
the onDisplayAreaVanished() until the register call is finished.

Depend on flag mIsOneHandedEnabled to handle register/unregister DA

Test: atest WMShellUnitTests
Test: atest SystemUITests
Test: manual quickly enable/disable OHM
Bug: 178357839
Bug: 179092435
Bug: 179985282
Change-Id: Iaafb1a0ab1ba9c16088ed91a420edf0421123e67
parent 81388d53
Loading
Loading
Loading
Loading
+15 −6
Original line number Diff line number Diff line
@@ -432,17 +432,26 @@ public class OneHandedController {
        if (mDisplayAreaOrganizer.isInOneHanded()) {
            stopOneHanded();
        }
        // TODO Be aware to unregisterOrganizer() after animation finished

        mTouchHandler.onOneHandedEnabled(mIsOneHandedEnabled);
        mGestureHandler.onOneHandedEnabled(mIsOneHandedEnabled || mIsSwipeToNotificationEnabled);

        if (!mIsOneHandedEnabled) {
            mDisplayAreaOrganizer.unregisterOrganizer();
            mBackgroundPanelOrganizer.unregisterOrganizer();
        if (mIsOneHandedEnabled) {
            // Do NOT register + unRegister DA in the same call
            return;
        }

        if (mDisplayAreaOrganizer.getDisplayAreaTokenMap().isEmpty()) {
            mDisplayAreaOrganizer.registerOrganizer(
                    OneHandedDisplayAreaOrganizer.FEATURE_ONE_HANDED);
        }

        if (mBackgroundPanelOrganizer.getBackgroundSurface() == null) {
            mBackgroundPanelOrganizer.registerOrganizer(
                    OneHandedBackgroundPanelOrganizer.FEATURE_ONE_HANDED_BACKGROUND_PANEL);
        }
        mTouchHandler.onOneHandedEnabled(mIsOneHandedEnabled);
        mGestureHandler.onOneHandedEnabled(mIsOneHandedEnabled || mIsSwipeToNotificationEnabled);
    }

    private void setupGesturalOverlay() {
+6 −2
Original line number Diff line number Diff line
@@ -66,8 +66,7 @@ public class OneHandedDisplayAreaOrganizer extends DisplayAreaOrganizer {
    private boolean mIsInOneHanded;
    private int mEnterExitAnimationDurationMs;

    @VisibleForTesting
    ArrayMap<WindowContainerToken, SurfaceControl> mDisplayAreaTokenMap = new ArrayMap();
    private ArrayMap<WindowContainerToken, SurfaceControl> mDisplayAreaTokenMap = new ArrayMap();
    private DisplayController mDisplayController;
    private OneHandedAnimationController mAnimationController;
    private OneHandedSurfaceTransactionHelper.SurfaceControlTransactionFactory
@@ -298,6 +297,11 @@ public class OneHandedDisplayAreaOrganizer extends DisplayAreaOrganizer {
        return new Rect(0, 0, realSize.x, realSize.y);
    }

    @VisibleForTesting
    ArrayMap<WindowContainerToken, SurfaceControl> getDisplayAreaTokenMap() {
        return mDisplayAreaTokenMap;
    }

    /**
     * Register transition callback
     */
+24 −6
Original line number Diff line number Diff line
@@ -28,7 +28,9 @@ import android.content.om.IOverlayManager;
import android.os.Handler;
import android.provider.Settings;
import android.testing.AndroidTestingRunner;
import android.util.ArrayMap;
import android.view.Display;
import android.view.SurfaceControl;

import androidx.test.filters.SmallTest;

@@ -74,6 +76,8 @@ public class OneHandedControllerTest extends OneHandedTestCase {
    @Mock
    ShellExecutor mMockShellMainExecutor;
    @Mock
    SurfaceControl mMockLeash;
    @Mock
    Handler mMockShellMainHandler;

    @Before
@@ -81,6 +85,12 @@ public class OneHandedControllerTest extends OneHandedTestCase {
        MockitoAnnotations.initMocks(this);
        mDisplay = mContext.getDisplay();
        mTimeoutHandler = Mockito.spy(new OneHandedTimeoutHandler(mMockShellMainExecutor));

        when(mMockDisplayController.getDisplay(anyInt())).thenReturn(mDisplay);
        when(mMockDisplayAreaOrganizer.isInOneHanded()).thenReturn(false);
        when(mMockDisplayAreaOrganizer.getDisplayAreaTokenMap()).thenReturn(new ArrayMap<>());
        when(mMockBackgroundOrganizer.getBackgroundSurface()).thenReturn(mMockLeash);

        OneHandedController oneHandedController = new OneHandedController(
                mContext,
                mMockDisplayController,
@@ -96,9 +106,6 @@ public class OneHandedControllerTest extends OneHandedTestCase {
                mMockShellMainExecutor,
                mMockShellMainHandler);
        mOneHandedController = Mockito.spy(oneHandedController);

        when(mMockDisplayController.getDisplay(anyInt())).thenReturn(mDisplay);
        when(mMockDisplayAreaOrganizer.isInOneHanded()).thenReturn(false);
    }

    @Test
@@ -113,12 +120,22 @@ public class OneHandedControllerTest extends OneHandedTestCase {
    }

    @Test
    public void testRegisterOrganizer() {
        verify(mMockDisplayAreaOrganizer, atLeastOnce()).registerOrganizer(anyInt());
    public void testEnabledNoRegisterAndUnregisterInSameCall() {
        mOneHandedController.setOneHandedEnabled(true);

        verify(mMockDisplayAreaOrganizer).registerOrganizer(anyInt());
    }

    @Test
    public void testDisabledNoRegisterAndUnregisterInSameCall() {
        mOneHandedController.setOneHandedEnabled(false);

        verify(mMockDisplayAreaOrganizer, never()).registerOrganizer(anyInt());
    }

    @Test
    public void testStartOneHanded() {
        mOneHandedController.setOneHandedEnabled(true);
        mOneHandedController.startOneHanded();

        verify(mMockDisplayAreaOrganizer).scheduleOffset(anyInt(), anyInt());
@@ -127,6 +144,7 @@ public class OneHandedControllerTest extends OneHandedTestCase {
    @Test
    public void testStopOneHanded() {
        when(mMockDisplayAreaOrganizer.isInOneHanded()).thenReturn(false);
        mOneHandedController.setOneHandedEnabled(true);
        mOneHandedController.stopOneHanded();

        verify(mMockDisplayAreaOrganizer, never()).scheduleOffset(anyInt(), anyInt());
@@ -168,7 +186,7 @@ public class OneHandedControllerTest extends OneHandedTestCase {
        final boolean enabled = true;
        mOneHandedController.setSwipeToNotificationEnabled(enabled);

        verify(mMockTouchHandler, atLeastOnce()).onOneHandedEnabled(enabled);
        verify(mMockGestureHandler, atLeastOnce()).onOneHandedEnabled(enabled);
    }

    @Ignore("b/167943723, refactor it and fix it")
+1 −1
Original line number Diff line number Diff line
@@ -132,7 +132,7 @@ public class OneHandedDisplayAreaOrganizerTest extends OneHandedTestCase {
        mDisplayAreaOrganizer.onDisplayAreaAppeared(mDisplayAreaInfo, mLeash);
        mDisplayAreaOrganizer.onDisplayAreaVanished(mDisplayAreaInfo);

        assertThat(mDisplayAreaOrganizer.mDisplayAreaTokenMap).isEmpty();
        assertThat(mDisplayAreaOrganizer.getDisplayAreaTokenMap()).isEmpty();
    }

    @Test
+0 −2
Original line number Diff line number Diff line
@@ -66,8 +66,6 @@ public abstract class OneHandedTestCase {
                getContext().getContentResolver());
        sOrigSwipeToNotification = OneHandedSettingsUtil.getSettingsSwipeToNotificationEnabled(
                getContext().getContentResolver());
        Settings.Secure.putInt(getContext().getContentResolver(),
                Settings.Secure.ONE_HANDED_MODE_ENABLED, 1);
        Settings.Secure.putInt(getContext().getContentResolver(),
                Settings.Secure.ONE_HANDED_MODE_TIMEOUT, ONE_HANDED_TIMEOUT_MEDIUM_IN_SECONDS);
        Settings.Secure.putInt(getContext().getContentResolver(),
Loading