diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedController.java index 5a3c38b09ec6c..cee8337471de7 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedController.java @@ -432,17 +432,26 @@ public class OneHandedController { if (mDisplayAreaOrganizer.isInOneHanded()) { stopOneHanded(); } - // TODO Be aware to unregisterOrganizer() after animation finished - mDisplayAreaOrganizer.unregisterOrganizer(); - mBackgroundPanelOrganizer.unregisterOrganizer(); - if (mIsOneHandedEnabled) { + + mTouchHandler.onOneHandedEnabled(mIsOneHandedEnabled); + mGestureHandler.onOneHandedEnabled(mIsOneHandedEnabled || mIsSwipeToNotificationEnabled); + + if (!mIsOneHandedEnabled) { + mDisplayAreaOrganizer.unregisterOrganizer(); + mBackgroundPanelOrganizer.unregisterOrganizer(); + // 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() { diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedDisplayAreaOrganizer.java b/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedDisplayAreaOrganizer.java index 04d1264bdd9d4..afc8a097dd051 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedDisplayAreaOrganizer.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedDisplayAreaOrganizer.java @@ -66,8 +66,7 @@ public class OneHandedDisplayAreaOrganizer extends DisplayAreaOrganizer { private boolean mIsInOneHanded; private int mEnterExitAnimationDurationMs; - @VisibleForTesting - ArrayMap mDisplayAreaTokenMap = new ArrayMap(); + private ArrayMap 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 getDisplayAreaTokenMap() { + return mDisplayAreaTokenMap; + } + /** * Register transition callback */ diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/OneHandedControllerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/OneHandedControllerTest.java index f141167178a15..c20c2c769e56b 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/OneHandedControllerTest.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/OneHandedControllerTest.java @@ -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") diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/OneHandedDisplayAreaOrganizerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/OneHandedDisplayAreaOrganizerTest.java index 01162b5c0b838..c0b25d2745261 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/OneHandedDisplayAreaOrganizerTest.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/OneHandedDisplayAreaOrganizerTest.java @@ -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 diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/OneHandedTestCase.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/OneHandedTestCase.java index 73a95345e1c9b..9e631ee6e469b 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/OneHandedTestCase.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/OneHandedTestCase.java @@ -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(), diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/OneHandedTutorialHandlerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/OneHandedTutorialHandlerTest.java index c3e6bf376bda7..1767929b9eb05 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/OneHandedTutorialHandlerTest.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/onehanded/OneHandedTutorialHandlerTest.java @@ -17,10 +17,12 @@ package com.android.wm.shell.onehanded; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; import android.content.om.IOverlayManager; import android.os.Handler; import android.testing.AndroidTestingRunner; +import android.util.ArrayMap; import androidx.test.filters.SmallTest; @@ -68,6 +70,8 @@ public class OneHandedTutorialHandlerTest extends OneHandedTestCase { mTimeoutHandler = new OneHandedTimeoutHandler(mMockShellMainExecutor); mGestureHandler = new OneHandedGestureHandler(mContext, mMockDisplayController, mMockShellMainExecutor); + + when(mMockDisplayAreaOrganizer.getDisplayAreaTokenMap()).thenReturn(new ArrayMap<>()); mOneHandedController = new OneHandedController( getContext(), mMockDisplayController,