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
This commit is contained in:
@@ -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() {
|
||||
|
||||
@@ -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
|
||||
*/
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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(),
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user