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:
Bill Lin
2021-02-18 18:07:39 +08:00
parent 81388d53e8
commit a052eef726
6 changed files with 50 additions and 17 deletions

View File

@@ -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() {

View File

@@ -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
*/

View File

@@ -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")

View File

@@ -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

View File

@@ -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(),

View File

@@ -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,