Merge changes Id02aa26e,Iaafb1a0a into sc-dev

* changes:
  Refactor One handed mode Unit tests
  Do not register + unregister DA in the same call
This commit is contained in:
TreeHugger Robot
2021-02-20 16:23:36 +00:00
committed by Android (Google) Code Review
14 changed files with 231 additions and 228 deletions

View File

@@ -32,6 +32,7 @@ import android.os.ServiceManager;
import android.os.SystemProperties; import android.os.SystemProperties;
import android.provider.Settings; import android.provider.Settings;
import android.util.Slog; import android.util.Slog;
import android.view.ViewConfiguration;
import android.view.accessibility.AccessibilityManager; import android.view.accessibility.AccessibilityManager;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
@@ -155,7 +156,7 @@ public class OneHandedController {
OneHandedTouchHandler touchHandler = new OneHandedTouchHandler(timeoutHandler, OneHandedTouchHandler touchHandler = new OneHandedTouchHandler(timeoutHandler,
mainExecutor); mainExecutor);
OneHandedGestureHandler gestureHandler = new OneHandedGestureHandler( OneHandedGestureHandler gestureHandler = new OneHandedGestureHandler(
context, displayController, mainExecutor); context, displayController, ViewConfiguration.get(context), mainExecutor);
OneHandedBackgroundPanelOrganizer oneHandedBackgroundPanelOrganizer = OneHandedBackgroundPanelOrganizer oneHandedBackgroundPanelOrganizer =
new OneHandedBackgroundPanelOrganizer(context, displayController, mainExecutor); new OneHandedBackgroundPanelOrganizer(context, displayController, mainExecutor);
OneHandedDisplayAreaOrganizer organizer = new OneHandedDisplayAreaOrganizer( OneHandedDisplayAreaOrganizer organizer = new OneHandedDisplayAreaOrganizer(
@@ -223,8 +224,7 @@ public class OneHandedController {
setupGesturalOverlay(); setupGesturalOverlay();
updateSettings(); updateSettings();
mAccessibilityManager = (AccessibilityManager) mAccessibilityManager = AccessibilityManager.getInstance(context);
context.getSystemService(Context.ACCESSIBILITY_SERVICE);
mAccessibilityManager.addAccessibilityStateChangeListener( mAccessibilityManager.addAccessibilityStateChangeListener(
mAccessibilityStateChangeListener); mAccessibilityStateChangeListener);
} }
@@ -346,7 +346,8 @@ public class OneHandedController {
}; };
} }
private void onEnabledSettingChanged() { @VisibleForTesting
void onEnabledSettingChanged() {
final boolean enabled = OneHandedSettingsUtil.getSettingsOneHandedModeEnabled( final boolean enabled = OneHandedSettingsUtil.getSettingsOneHandedModeEnabled(
mContext.getContentResolver()); mContext.getContentResolver());
mOneHandedUiEventLogger.writeEvent(enabled mOneHandedUiEventLogger.writeEvent(enabled
@@ -361,7 +362,8 @@ public class OneHandedController {
mContext.getContentResolver())); mContext.getContentResolver()));
} }
private void onTimeoutSettingChanged() { @VisibleForTesting
void onTimeoutSettingChanged() {
final int newTimeout = OneHandedSettingsUtil.getSettingsOneHandedModeTimeout( final int newTimeout = OneHandedSettingsUtil.getSettingsOneHandedModeTimeout(
mContext.getContentResolver()); mContext.getContentResolver());
int metricsId = OneHandedUiEventLogger.OneHandedSettingsTogglesEvent.INVALID.getId(); int metricsId = OneHandedUiEventLogger.OneHandedSettingsTogglesEvent.INVALID.getId();
@@ -389,7 +391,8 @@ public class OneHandedController {
} }
} }
private void onTaskChangeExitSettingChanged() { @VisibleForTesting
void onTaskChangeExitSettingChanged() {
final boolean enabled = OneHandedSettingsUtil.getSettingsTapsAppToExit( final boolean enabled = OneHandedSettingsUtil.getSettingsTapsAppToExit(
mContext.getContentResolver()); mContext.getContentResolver());
mOneHandedUiEventLogger.writeEvent(enabled mOneHandedUiEventLogger.writeEvent(enabled
@@ -399,7 +402,8 @@ public class OneHandedController {
setTaskChangeToExit(enabled); setTaskChangeToExit(enabled);
} }
private void onSwipeToNotificationEnabledSettingChanged() { @VisibleForTesting
void onSwipeToNotificationEnabledSettingChanged() {
final boolean enabled = final boolean enabled =
OneHandedSettingsUtil.getSettingsSwipeToNotificationEnabled( OneHandedSettingsUtil.getSettingsSwipeToNotificationEnabled(
mContext.getContentResolver()); mContext.getContentResolver());
@@ -433,17 +437,26 @@ public class OneHandedController {
if (mDisplayAreaOrganizer.isInOneHanded()) { if (mDisplayAreaOrganizer.isInOneHanded()) {
stopOneHanded(); stopOneHanded();
} }
// TODO Be aware to unregisterOrganizer() after animation finished
mDisplayAreaOrganizer.unregisterOrganizer(); mTouchHandler.onOneHandedEnabled(mIsOneHandedEnabled);
mBackgroundPanelOrganizer.unregisterOrganizer(); mGestureHandler.onOneHandedEnabled(mIsOneHandedEnabled || mIsSwipeToNotificationEnabled);
if (mIsOneHandedEnabled) {
if (!mIsOneHandedEnabled) {
mDisplayAreaOrganizer.unregisterOrganizer();
mBackgroundPanelOrganizer.unregisterOrganizer();
// Do NOT register + unRegister DA in the same call
return;
}
if (mDisplayAreaOrganizer.getDisplayAreaTokenMap().isEmpty()) {
mDisplayAreaOrganizer.registerOrganizer( mDisplayAreaOrganizer.registerOrganizer(
OneHandedDisplayAreaOrganizer.FEATURE_ONE_HANDED); OneHandedDisplayAreaOrganizer.FEATURE_ONE_HANDED);
}
if (mBackgroundPanelOrganizer.getBackgroundSurface() == null) {
mBackgroundPanelOrganizer.registerOrganizer( mBackgroundPanelOrganizer.registerOrganizer(
OneHandedBackgroundPanelOrganizer.FEATURE_ONE_HANDED_BACKGROUND_PANEL); OneHandedBackgroundPanelOrganizer.FEATURE_ONE_HANDED_BACKGROUND_PANEL);
} }
mTouchHandler.onOneHandedEnabled(mIsOneHandedEnabled);
mGestureHandler.onOneHandedEnabled(mIsOneHandedEnabled || mIsSwipeToNotificationEnabled);
} }
private void setupGesturalOverlay() { private void setupGesturalOverlay() {
@@ -453,7 +466,6 @@ public class OneHandedController {
OverlayInfo info = null; OverlayInfo info = null;
try { try {
// TODO(b/157958539) migrate new RRO config file after S+
mOverlayManager.setHighestPriority(ONE_HANDED_MODE_GESTURAL_OVERLAY, USER_CURRENT); mOverlayManager.setHighestPriority(ONE_HANDED_MODE_GESTURAL_OVERLAY, USER_CURRENT);
info = mOverlayManager.getOverlayInfo(ONE_HANDED_MODE_GESTURAL_OVERLAY, USER_CURRENT); info = mOverlayManager.getOverlayInfo(ONE_HANDED_MODE_GESTURAL_OVERLAY, USER_CURRENT);
} catch (RemoteException e) { /* Do nothing */ } } catch (RemoteException e) { /* Do nothing */ }

View File

@@ -66,8 +66,7 @@ public class OneHandedDisplayAreaOrganizer extends DisplayAreaOrganizer {
private boolean mIsInOneHanded; private boolean mIsInOneHanded;
private int mEnterExitAnimationDurationMs; private int mEnterExitAnimationDurationMs;
@VisibleForTesting private ArrayMap<WindowContainerToken, SurfaceControl> mDisplayAreaTokenMap = new ArrayMap();
ArrayMap<WindowContainerToken, SurfaceControl> mDisplayAreaTokenMap = new ArrayMap();
private DisplayController mDisplayController; private DisplayController mDisplayController;
private OneHandedAnimationController mAnimationController; private OneHandedAnimationController mAnimationController;
private OneHandedSurfaceTransactionHelper.SurfaceControlTransactionFactory private OneHandedSurfaceTransactionHelper.SurfaceControlTransactionFactory
@@ -298,6 +297,11 @@ public class OneHandedDisplayAreaOrganizer extends DisplayAreaOrganizer {
return new Rect(0, 0, realSize.x, realSize.y); return new Rect(0, 0, realSize.x, realSize.y);
} }
@VisibleForTesting
ArrayMap<WindowContainerToken, SurfaceControl> getDisplayAreaTokenMap() {
return mDisplayAreaTokenMap;
}
/** /**
* Register transition callback * Register transition callback
*/ */

View File

@@ -87,6 +87,7 @@ public class OneHandedGestureHandler implements OneHandedTransitionCallback,
* @param displayController {@link DisplayController} * @param displayController {@link DisplayController}
*/ */
public OneHandedGestureHandler(Context context, DisplayController displayController, public OneHandedGestureHandler(Context context, DisplayController displayController,
ViewConfiguration viewConfig,
ShellExecutor mainExecutor) { ShellExecutor mainExecutor) {
mDisplayController = displayController; mDisplayController = displayController;
mMainExecutor = mainExecutor; mMainExecutor = mainExecutor;
@@ -95,7 +96,7 @@ public class OneHandedGestureHandler implements OneHandedTransitionCallback,
com.android.internal.R.dimen.navigation_bar_gesture_larger_height); com.android.internal.R.dimen.navigation_bar_gesture_larger_height);
mDragDistThreshold = context.getResources().getDimensionPixelSize( mDragDistThreshold = context.getResources().getDimensionPixelSize(
R.dimen.gestures_onehanded_drag_threshold); R.dimen.gestures_onehanded_drag_threshold);
final float slop = ViewConfiguration.get(context).getScaledTouchSlop(); final float slop = viewConfig.getScaledTouchSlop();
mSquaredSlop = slop * slop; mSquaredSlop = slop * slop;
updateIsEnabled(); updateIsEnabled();

View File

@@ -107,8 +107,7 @@ public class OneHandedTutorialHandler implements OneHandedTransitionCallback {
mPackageName = context.getPackageName(); mPackageName = context.getPackageName();
mContentResolver = context.getContentResolver(); mContentResolver = context.getContentResolver();
mWindowManager = context.getSystemService(WindowManager.class); mWindowManager = context.getSystemService(WindowManager.class);
mAccessibilityManager = (AccessibilityManager) mAccessibilityManager = AccessibilityManager.getInstance(context);
context.getSystemService(Context.ACCESSIBILITY_SERVICE);
mStartOneHandedDescription = context.getResources().getString( mStartOneHandedDescription = context.getResources().getString(
R.string.accessibility_action_start_one_handed); R.string.accessibility_action_start_one_handed);

View File

@@ -47,7 +47,6 @@ public class OneHandedAnimationControllerTest extends OneHandedTestCase {
private static final int TEST_BOUNDS_HEIGHT = 1000; private static final int TEST_BOUNDS_HEIGHT = 1000;
OneHandedAnimationController mOneHandedAnimationController; OneHandedAnimationController mOneHandedAnimationController;
OneHandedTutorialHandler mTutorialHandler;
@Mock @Mock
private SurfaceControl mMockLeash; private SurfaceControl mMockLeash;
@@ -60,8 +59,6 @@ public class OneHandedAnimationControllerTest extends OneHandedTestCase {
@Before @Before
public void setUp() throws Exception { public void setUp() throws Exception {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
mTutorialHandler = new OneHandedTutorialHandler(mContext, mMainExecutor);
mOneHandedAnimationController = new OneHandedAnimationController(mContext); mOneHandedAnimationController = new OneHandedAnimationController(mContext);
} }

View File

@@ -59,7 +59,7 @@ public class OneHandedBackgroundPanelOrganizerTest extends OneHandedTestCase {
DisplayController mMockDisplayController; DisplayController mMockDisplayController;
@Before @Before
public void setUp() throws Exception { public void setUp() {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
mTestableLooper = TestableLooper.get(this); mTestableLooper = TestableLooper.get(this);
mToken = new WindowContainerToken(mMockRealToken); mToken = new WindowContainerToken(mMockRealToken);
@@ -81,15 +81,6 @@ public class OneHandedBackgroundPanelOrganizerTest extends OneHandedTestCase {
assertThat(mBackgroundPanelOrganizer.getBackgroundSurface()).isNotNull(); assertThat(mBackgroundPanelOrganizer.getBackgroundSurface()).isNotNull();
} }
@Test
public void testUnregisterOrganizer() {
mBackgroundPanelOrganizer.onDisplayAreaAppeared(mDisplayAreaInfo, mLeash);
mTestableLooper.processAllMessages();
mBackgroundPanelOrganizer.unregisterOrganizer();
assertThat(mBackgroundPanelOrganizer.getBackgroundSurface()).isNull();
}
@Test @Test
public void testShowBackgroundLayer() { public void testShowBackgroundLayer() {
mBackgroundPanelOrganizer.onDisplayAreaAppeared(mDisplayAreaInfo, mLeash); mBackgroundPanelOrganizer.onDisplayAreaAppeared(mDisplayAreaInfo, mLeash);

View File

@@ -16,19 +16,24 @@
package com.android.wm.shell.onehanded; package com.android.wm.shell.onehanded;
import static android.window.DisplayAreaOrganizer.FEATURE_ONE_HANDED;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.atLeastOnce; import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.never; import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import android.content.om.IOverlayManager; import android.content.om.IOverlayManager;
import android.os.Handler; import android.os.Handler;
import android.provider.Settings;
import android.testing.AndroidTestingRunner; import android.testing.AndroidTestingRunner;
import android.util.ArrayMap;
import android.view.Display; import android.view.Display;
import android.view.SurfaceControl;
import androidx.test.filters.SmallTest; import androidx.test.filters.SmallTest;
@@ -37,19 +42,17 @@ import com.android.wm.shell.common.ShellExecutor;
import com.android.wm.shell.common.TaskStackListenerImpl; import com.android.wm.shell.common.TaskStackListenerImpl;
import org.junit.Before; import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.mockito.Mock; import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations; import org.mockito.MockitoAnnotations;
@SmallTest @SmallTest
@RunWith(AndroidTestingRunner.class) @RunWith(AndroidTestingRunner.class)
public class OneHandedControllerTest extends OneHandedTestCase { public class OneHandedControllerTest extends OneHandedTestCase {
Display mDisplay; Display mDisplay;
OneHandedController mOneHandedController; OneHandedController mSpiedOneHandedController;
OneHandedTimeoutHandler mTimeoutHandler; OneHandedTimeoutHandler mSpiedTimeoutHandler;
@Mock @Mock
DisplayController mMockDisplayController; DisplayController mMockDisplayController;
@@ -64,8 +67,6 @@ public class OneHandedControllerTest extends OneHandedTestCase {
@Mock @Mock
OneHandedGestureHandler mMockGestureHandler; OneHandedGestureHandler mMockGestureHandler;
@Mock @Mock
OneHandedTimeoutHandler mMockTimeoutHandler;
@Mock
OneHandedUiEventLogger mMockUiEventLogger; OneHandedUiEventLogger mMockUiEventLogger;
@Mock @Mock
IOverlayManager mMockOverlayManager; IOverlayManager mMockOverlayManager;
@@ -74,14 +75,28 @@ public class OneHandedControllerTest extends OneHandedTestCase {
@Mock @Mock
ShellExecutor mMockShellMainExecutor; ShellExecutor mMockShellMainExecutor;
@Mock @Mock
SurfaceControl mMockLeash;
@Mock
Handler mMockShellMainHandler; Handler mMockShellMainHandler;
final boolean mDefaultEnabled = OneHandedSettingsUtil.getSettingsOneHandedModeEnabled(
getTestContext().getContentResolver());
final boolean mDefaultSwipeToNotificationEnabled =
OneHandedSettingsUtil.getSettingsSwipeToNotificationEnabled(
getTestContext().getContentResolver());
@Before @Before
public void setUp() throws Exception { public void setUp() {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
mDisplay = mContext.getDisplay(); mDisplay = mContext.getDisplay();
mTimeoutHandler = Mockito.spy(new OneHandedTimeoutHandler(mMockShellMainExecutor)); mSpiedTimeoutHandler = spy(new OneHandedTimeoutHandler(mMockShellMainExecutor));
OneHandedController oneHandedController = new OneHandedController(
when(mMockDisplayController.getDisplay(anyInt())).thenReturn(mDisplay);
when(mMockDisplayAreaOrganizer.isInOneHanded()).thenReturn(false);
when(mMockDisplayAreaOrganizer.getDisplayAreaTokenMap()).thenReturn(new ArrayMap<>());
when(mMockBackgroundOrganizer.getBackgroundSurface()).thenReturn(mMockLeash);
mSpiedOneHandedController = spy(new OneHandedController(
mContext, mContext,
mMockDisplayController, mMockDisplayController,
mMockBackgroundOrganizer, mMockBackgroundOrganizer,
@@ -89,16 +104,13 @@ public class OneHandedControllerTest extends OneHandedTestCase {
mMockTouchHandler, mMockTouchHandler,
mMockTutorialHandler, mMockTutorialHandler,
mMockGestureHandler, mMockGestureHandler,
mTimeoutHandler, mSpiedTimeoutHandler,
mMockUiEventLogger, mMockUiEventLogger,
mMockOverlayManager, mMockOverlayManager,
mMockTaskStackListener, mMockTaskStackListener,
mMockShellMainExecutor, mMockShellMainExecutor,
mMockShellMainHandler); mMockShellMainHandler)
mOneHandedController = Mockito.spy(oneHandedController); );
when(mMockDisplayController.getDisplay(anyInt())).thenReturn(mDisplay);
when(mMockDisplayAreaOrganizer.isInOneHanded()).thenReturn(false);
} }
@Test @Test
@@ -113,21 +125,36 @@ public class OneHandedControllerTest extends OneHandedTestCase {
} }
@Test @Test
public void testRegisterOrganizer() { public void testNoRegisterAndUnregisterInSameCall() {
verify(mMockDisplayAreaOrganizer, atLeastOnce()).registerOrganizer(anyInt()); if (mDefaultEnabled) {
verify(mMockDisplayAreaOrganizer, never()).unregisterOrganizer();
} else {
verify(mMockDisplayAreaOrganizer, never()).registerOrganizer(FEATURE_ONE_HANDED);
}
} }
@Test @Test
public void testStartOneHanded() { public void testStartOneHandedShouldTriggerScheduleOffset() {
mOneHandedController.startOneHanded(); when(mMockDisplayAreaOrganizer.isInOneHanded()).thenReturn(false);
mSpiedOneHandedController.setOneHandedEnabled(true);
mSpiedOneHandedController.startOneHanded();
verify(mMockDisplayAreaOrganizer).scheduleOffset(anyInt(), anyInt()); verify(mMockDisplayAreaOrganizer).scheduleOffset(anyInt(), anyInt());
} }
@Test
public void testStartOneHandedShouldNotTriggerScheduleOffset() {
mSpiedOneHandedController.setOneHandedEnabled(true);
when(mMockDisplayAreaOrganizer.isInOneHanded()).thenReturn(true);
mSpiedOneHandedController.startOneHanded();
verify(mMockDisplayAreaOrganizer, never()).scheduleOffset(anyInt(), anyInt());
}
@Test @Test
public void testStopOneHanded() { public void testStopOneHanded() {
when(mMockDisplayAreaOrganizer.isInOneHanded()).thenReturn(false); when(mMockDisplayAreaOrganizer.isInOneHanded()).thenReturn(false);
mOneHandedController.stopOneHanded(); mSpiedOneHandedController.stopOneHanded();
verify(mMockDisplayAreaOrganizer, never()).scheduleOffset(anyInt(), anyInt()); verify(mMockDisplayAreaOrganizer, never()).scheduleOffset(anyInt(), anyInt());
} }
@@ -141,71 +168,66 @@ public class OneHandedControllerTest extends OneHandedTestCase {
@Test @Test
public void testRegisterTransitionCallback() { public void testRegisterTransitionCallback() {
OneHandedTransitionCallback callback = new OneHandedTransitionCallback() {}; OneHandedTransitionCallback callback = new OneHandedTransitionCallback() {
mOneHandedController.registerTransitionCallback(callback); };
mSpiedOneHandedController.registerTransitionCallback(callback);
verify(mMockDisplayAreaOrganizer).registerTransitionCallback(callback); verify(mMockDisplayAreaOrganizer).registerTransitionCallback(callback);
} }
@Test @Test
public void testStopOneHanded_shouldRemoveTimer() { public void testStopOneHanded_shouldRemoveTimer() {
mOneHandedController.stopOneHanded(); when(mMockDisplayAreaOrganizer.isInOneHanded()).thenReturn(true);
mSpiedOneHandedController.stopOneHanded();
verify(mTimeoutHandler).removeTimer(); verify(mSpiedTimeoutHandler, atLeastOnce()).removeTimer();
} }
@Test @Test
public void testUpdateIsEnabled() { public void testUpdateEnabled() {
final boolean enabled = true; mSpiedOneHandedController.setOneHandedEnabled(true);
mOneHandedController.setOneHandedEnabled(enabled);
verify(mMockTouchHandler, atLeastOnce()).onOneHandedEnabled(enabled); verify(mMockTouchHandler, atLeastOnce()).onOneHandedEnabled(mDefaultEnabled);
verify(mMockGestureHandler, atLeastOnce()).onOneHandedEnabled(
mDefaultEnabled || mDefaultSwipeToNotificationEnabled);
} }
@Test @Test
public void testUpdateSwipeToNotificationIsEnabled() { public void testUpdateSwipeToNotificationEnabled() {
final boolean enabled = true; final boolean swipeToNotificationEnabled = true;
mOneHandedController.setSwipeToNotificationEnabled(enabled); mSpiedOneHandedController.setSwipeToNotificationEnabled(swipeToNotificationEnabled);
verify(mMockTouchHandler, atLeastOnce()).onOneHandedEnabled(enabled); verify(mMockTouchHandler, atLeastOnce()).onOneHandedEnabled(mDefaultEnabled);
verify(mMockGestureHandler, atLeastOnce()).onOneHandedEnabled(
mDefaultEnabled || swipeToNotificationEnabled);
} }
@Ignore("b/167943723, refactor it and fix it")
@Test @Test
public void tesSettingsObserver_updateTapAppToExit() { public void testUpdateTapAppToExitUpdate() {
Settings.Secure.putInt(mContext.getContentResolver(), mSpiedOneHandedController.onTaskChangeExitSettingChanged();
Settings.Secure.TAPS_APP_TO_EXIT, 1);
verify(mOneHandedController).setTaskChangeToExit(true); verify(mMockTaskStackListener, atLeastOnce()).addListener(any());
} }
@Ignore("b/167943723, refactor it and fix it")
@Test @Test
public void tesSettingsObserver_updateEnabled() { public void tesSettingsObserverUpdateEnabled() {
Settings.Secure.putInt(mContext.getContentResolver(), mSpiedOneHandedController.onEnabledSettingChanged();
Settings.Secure.ONE_HANDED_MODE_ENABLED, 1);
verify(mOneHandedController).setOneHandedEnabled(true); verify(mSpiedOneHandedController, atLeastOnce()).setOneHandedEnabled(mDefaultEnabled);
} }
@Ignore("b/167943723, refactor it and fix it")
@Test @Test
public void tesSettingsObserver_updateTimeout() { public void testSettingsObserverUpdateTimeout() {
Settings.Secure.putInt(mContext.getContentResolver(), mSpiedOneHandedController.onTimeoutSettingChanged();
Settings.Secure.ONE_HANDED_MODE_TIMEOUT,
OneHandedSettingsUtil.ONE_HANDED_TIMEOUT_MEDIUM_IN_SECONDS);
verify(mMockTimeoutHandler).setTimeout( verify(mSpiedTimeoutHandler, atLeastOnce()).setTimeout(anyInt());
OneHandedSettingsUtil.ONE_HANDED_TIMEOUT_MEDIUM_IN_SECONDS);
} }
@Ignore("b/167943723, refactor it and fix it")
@Test @Test
public void tesSettingsObserver_updateSwipeToNotification() { public void tesSettingsObserverUpdateSwipeToNotification() {
Settings.Secure.putInt(mContext.getContentResolver(), mSpiedOneHandedController.onSwipeToNotificationEnabledSettingChanged();
Settings.Secure.SWIPE_BOTTOM_TO_NOTIFICATION_ENABLED, 1);
verify(mOneHandedController).setSwipeToNotificationEnabled(true); verify(mSpiedOneHandedController, atLeastOnce()).setSwipeToNotificationEnabled(
!mDefaultEnabled);
} }
} }

View File

@@ -27,6 +27,7 @@ import static org.mockito.Mockito.any;
import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.never; import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy; import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
@@ -37,6 +38,7 @@ import android.testing.TestableLooper;
import android.view.Display; import android.view.Display;
import android.view.Surface; import android.view.Surface;
import android.view.SurfaceControl; import android.view.SurfaceControl;
import android.window.DisplayAreaAppearedInfo;
import android.window.DisplayAreaInfo; import android.window.DisplayAreaInfo;
import android.window.IWindowContainerToken; import android.window.IWindowContainerToken;
import android.window.WindowContainerToken; import android.window.WindowContainerToken;
@@ -53,15 +55,19 @@ import org.junit.runner.RunWith;
import org.mockito.Mock; import org.mockito.Mock;
import org.mockito.MockitoAnnotations; import org.mockito.MockitoAnnotations;
import java.util.ArrayList;
import java.util.List;
@SmallTest @SmallTest
@RunWith(AndroidTestingRunner.class) @RunWith(AndroidTestingRunner.class)
public class OneHandedDisplayAreaOrganizerTest extends OneHandedTestCase { public class OneHandedDisplayAreaOrganizerTest extends OneHandedTestCase {
static final int DISPLAYAREA_INFO_COUNT = 3;
static final int DISPLAY_WIDTH = 1000; static final int DISPLAY_WIDTH = 1000;
static final int DISPLAY_HEIGHT = 1000; static final int DISPLAY_HEIGHT = 1000;
DisplayAreaInfo mDisplayAreaInfo; DisplayAreaInfo mDisplayAreaInfo;
Display mDisplay; Display mDisplay;
OneHandedDisplayAreaOrganizer mDisplayAreaOrganizer; OneHandedDisplayAreaOrganizer mSpiedDisplayAreaOrganizer;
OneHandedTutorialHandler mTutorialHandler; OneHandedTutorialHandler mTutorialHandler;
OneHandedAnimationController.OneHandedTransitionAnimator mFakeAnimator; OneHandedAnimationController.OneHandedTransitionAnimator mFakeAnimator;
WindowContainerToken mToken; WindowContainerToken mToken;
@@ -86,6 +92,8 @@ public class OneHandedDisplayAreaOrganizerTest extends OneHandedTestCase {
@Mock @Mock
ShellExecutor mMockShellMainExecutor; ShellExecutor mMockShellMainExecutor;
List<DisplayAreaAppearedInfo> mDisplayAreaAppearedInfoList = new ArrayList<>();
@Before @Before
public void setUp() throws Exception { public void setUp() throws Exception {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
@@ -112,170 +120,195 @@ public class OneHandedDisplayAreaOrganizerTest extends OneHandedTestCase {
when(mMockLeash.getWidth()).thenReturn(DISPLAY_WIDTH); when(mMockLeash.getWidth()).thenReturn(DISPLAY_WIDTH);
when(mMockLeash.getHeight()).thenReturn(DISPLAY_HEIGHT); when(mMockLeash.getHeight()).thenReturn(DISPLAY_HEIGHT);
mDisplayAreaOrganizer = spy(new OneHandedDisplayAreaOrganizer(mContext, mSpiedDisplayAreaOrganizer = spy(new OneHandedDisplayAreaOrganizer(mContext,
mMockDisplayController, mMockDisplayController,
mMockAnimationController, mMockAnimationController,
mTutorialHandler, mTutorialHandler,
mMockBackgroundOrganizer, mMockBackgroundOrganizer,
mMockShellMainExecutor)); mMockShellMainExecutor));
for (int i = 0; i < DISPLAYAREA_INFO_COUNT; i++) {
mDisplayAreaAppearedInfoList.add(getDummyDisplayAreaInfo());
}
doReturn(mDisplayAreaAppearedInfoList).when(mSpiedDisplayAreaOrganizer).registerOrganizer(
FEATURE_ONE_HANDED);
}
private DisplayAreaAppearedInfo getDummyDisplayAreaInfo() {
return new DisplayAreaAppearedInfo(mDisplayAreaInfo, mMockLeash);
}
@Test
public void testRegisterDisplayAreaOrganizer() {
assertThat(mSpiedDisplayAreaOrganizer.registerOrganizer(FEATURE_ONE_HANDED)).isNotNull();
} }
@Test @Test
public void testOnDisplayAreaAppeared() { public void testOnDisplayAreaAppeared() {
mDisplayAreaOrganizer.onDisplayAreaAppeared(mDisplayAreaInfo, mLeash); mDisplayAreaAppearedInfoList.forEach(
(info) -> mSpiedDisplayAreaOrganizer.onDisplayAreaAppeared(
info.getDisplayAreaInfo(),
info.getLeash()));
verify(mMockAnimationController, never()).getAnimator(any(), any(), any(), any()); verify(mMockAnimationController, never()).getAnimator(any(), any(), any(), any());
} }
@Test @Test
public void testOnDisplayAreaVanished() { public void testOnDisplayAreaVanished() {
mDisplayAreaOrganizer.onDisplayAreaAppeared(mDisplayAreaInfo, mLeash); mDisplayAreaAppearedInfoList.forEach(
mDisplayAreaOrganizer.onDisplayAreaVanished(mDisplayAreaInfo); (info) -> mSpiedDisplayAreaOrganizer.onDisplayAreaAppeared(
info.getDisplayAreaInfo(),
info.getLeash()));
assertThat(mDisplayAreaOrganizer.mDisplayAreaTokenMap).isEmpty(); mDisplayAreaAppearedInfoList.forEach(
(info) -> mSpiedDisplayAreaOrganizer.onDisplayAreaVanished(
info.getDisplayAreaInfo()));
verify(mSpiedDisplayAreaOrganizer, times(DISPLAYAREA_INFO_COUNT)).onDisplayAreaVanished(
any());
} }
@Test @Test
public void testRotation_portrait_0_to_landscape_90() { public void testRotation_portrait_0_to_landscape_90() {
when(mMockLeash.isValid()).thenReturn(false); when(mMockLeash.isValid()).thenReturn(false);
// Rotate 0 -> 90 // Rotate 0 -> 90
mDisplayAreaOrganizer.onRotateDisplay(Surface.ROTATION_0, Surface.ROTATION_90, mSpiedDisplayAreaOrganizer.onRotateDisplay(Surface.ROTATION_0, Surface.ROTATION_90,
mMockWindowContainerTransaction); mMockWindowContainerTransaction);
verify(mDisplayAreaOrganizer).finishOffset(anyInt(), anyInt()); verify(mSpiedDisplayAreaOrganizer).finishOffset(anyInt(), anyInt());
} }
@Test @Test
public void testRotation_portrait_0_to_seascape_270() { public void testRotation_portrait_0_to_seascape_270() {
when(mMockLeash.isValid()).thenReturn(false); when(mMockLeash.isValid()).thenReturn(false);
// Rotate 0 -> 270 // Rotate 0 -> 270
mDisplayAreaOrganizer.onRotateDisplay(Surface.ROTATION_0, Surface.ROTATION_270, mSpiedDisplayAreaOrganizer.onRotateDisplay(Surface.ROTATION_0, Surface.ROTATION_270,
mMockWindowContainerTransaction); mMockWindowContainerTransaction);
verify(mDisplayAreaOrganizer).finishOffset(anyInt(), anyInt()); verify(mSpiedDisplayAreaOrganizer).finishOffset(anyInt(), anyInt());
} }
@Test @Test
public void testRotation_portrait_180_to_landscape_90() { public void testRotation_portrait_180_to_landscape_90() {
when(mMockLeash.isValid()).thenReturn(false); when(mMockLeash.isValid()).thenReturn(false);
// Rotate 180 -> 90 // Rotate 180 -> 90
mDisplayAreaOrganizer.onRotateDisplay(Surface.ROTATION_180, Surface.ROTATION_90, mSpiedDisplayAreaOrganizer.onRotateDisplay(Surface.ROTATION_180, Surface.ROTATION_90,
mMockWindowContainerTransaction); mMockWindowContainerTransaction);
verify(mDisplayAreaOrganizer).finishOffset(anyInt(), anyInt()); verify(mSpiedDisplayAreaOrganizer).finishOffset(anyInt(), anyInt());
} }
@Test @Test
public void testRotation_portrait_180_to_seascape_270() { public void testRotation_portrait_180_to_seascape_270() {
when(mMockLeash.isValid()).thenReturn(false); when(mMockLeash.isValid()).thenReturn(false);
// Rotate 180 -> 270 // Rotate 180 -> 270
mDisplayAreaOrganizer.onRotateDisplay(Surface.ROTATION_180, Surface.ROTATION_270, mSpiedDisplayAreaOrganizer.onRotateDisplay(Surface.ROTATION_180, Surface.ROTATION_270,
mMockWindowContainerTransaction); mMockWindowContainerTransaction);
verify(mDisplayAreaOrganizer).finishOffset(anyInt(), anyInt()); verify(mSpiedDisplayAreaOrganizer).finishOffset(anyInt(), anyInt());
} }
@Test @Test
public void testRotation_landscape_90_to_portrait_0() { public void testRotation_landscape_90_to_portrait_0() {
when(mMockLeash.isValid()).thenReturn(false); when(mMockLeash.isValid()).thenReturn(false);
// Rotate 90 -> 0 // Rotate 90 -> 0
mDisplayAreaOrganizer.onRotateDisplay(Surface.ROTATION_90, Surface.ROTATION_0, mSpiedDisplayAreaOrganizer.onRotateDisplay(Surface.ROTATION_90, Surface.ROTATION_0,
mMockWindowContainerTransaction); mMockWindowContainerTransaction);
verify(mDisplayAreaOrganizer).finishOffset(anyInt(), anyInt()); verify(mSpiedDisplayAreaOrganizer).finishOffset(anyInt(), anyInt());
} }
@Test @Test
public void testRotation_landscape_90_to_portrait_180() { public void testRotation_landscape_90_to_portrait_180() {
when(mMockLeash.isValid()).thenReturn(false); when(mMockLeash.isValid()).thenReturn(false);
// Rotate 90 -> 180 // Rotate 90 -> 180
mDisplayAreaOrganizer.onRotateDisplay(Surface.ROTATION_90, Surface.ROTATION_180, mSpiedDisplayAreaOrganizer.onRotateDisplay(Surface.ROTATION_90, Surface.ROTATION_180,
mMockWindowContainerTransaction); mMockWindowContainerTransaction);
verify(mDisplayAreaOrganizer).finishOffset(anyInt(), anyInt()); verify(mSpiedDisplayAreaOrganizer).finishOffset(anyInt(), anyInt());
} }
@Test @Test
public void testRotation_Seascape_270_to_portrait_0() { public void testRotation_Seascape_270_to_portrait_0() {
when(mMockLeash.isValid()).thenReturn(false); when(mMockLeash.isValid()).thenReturn(false);
// Rotate 270 -> 0 // Rotate 270 -> 0
mDisplayAreaOrganizer.onRotateDisplay(Surface.ROTATION_270, Surface.ROTATION_0, mSpiedDisplayAreaOrganizer.onRotateDisplay(Surface.ROTATION_270, Surface.ROTATION_0,
mMockWindowContainerTransaction); mMockWindowContainerTransaction);
verify(mDisplayAreaOrganizer).finishOffset(anyInt(), anyInt()); verify(mSpiedDisplayAreaOrganizer).finishOffset(anyInt(), anyInt());
} }
@Test @Test
public void testRotation_seascape_90_to_portrait_180() { public void testRotation_seascape_90_to_portrait_180() {
when(mMockLeash.isValid()).thenReturn(false); when(mMockLeash.isValid()).thenReturn(false);
// Rotate 270 -> 180 // Rotate 270 -> 180
mDisplayAreaOrganizer.onRotateDisplay(Surface.ROTATION_270, Surface.ROTATION_180, mSpiedDisplayAreaOrganizer.onRotateDisplay(Surface.ROTATION_270, Surface.ROTATION_180,
mMockWindowContainerTransaction); mMockWindowContainerTransaction);
verify(mDisplayAreaOrganizer).finishOffset(anyInt(), anyInt()); verify(mSpiedDisplayAreaOrganizer).finishOffset(anyInt(), anyInt());
} }
@Test @Test
public void testRotation_portrait_0_to_portrait_0() { public void testRotation_portrait_0_to_portrait_0() {
when(mMockLeash.isValid()).thenReturn(false); when(mMockLeash.isValid()).thenReturn(false);
// Rotate 0 -> 0 // Rotate 0 -> 0
mDisplayAreaOrganizer.onRotateDisplay(Surface.ROTATION_0, Surface.ROTATION_0, mSpiedDisplayAreaOrganizer.onRotateDisplay(Surface.ROTATION_0, Surface.ROTATION_0,
mMockWindowContainerTransaction); mMockWindowContainerTransaction);
verify(mDisplayAreaOrganizer, never()).finishOffset(anyInt(), anyInt()); verify(mSpiedDisplayAreaOrganizer, never()).finishOffset(anyInt(), anyInt());
} }
@Test @Test
public void testRotation_portrait_0_to_portrait_180() { public void testRotation_portrait_0_to_portrait_180() {
when(mMockLeash.isValid()).thenReturn(false); when(mMockLeash.isValid()).thenReturn(false);
// Rotate 0 -> 180 // Rotate 0 -> 180
mDisplayAreaOrganizer.onRotateDisplay(Surface.ROTATION_0, Surface.ROTATION_180, mSpiedDisplayAreaOrganizer.onRotateDisplay(Surface.ROTATION_0, Surface.ROTATION_180,
mMockWindowContainerTransaction); mMockWindowContainerTransaction);
verify(mDisplayAreaOrganizer, never()).finishOffset(anyInt(), anyInt()); verify(mSpiedDisplayAreaOrganizer, never()).finishOffset(anyInt(), anyInt());
} }
@Test @Test
public void testRotation_portrait_180_to_portrait_180() { public void testRotation_portrait_180_to_portrait_180() {
when(mMockLeash.isValid()).thenReturn(false); when(mMockLeash.isValid()).thenReturn(false);
// Rotate 180 -> 180 // Rotate 180 -> 180
mDisplayAreaOrganizer.onRotateDisplay(Surface.ROTATION_180, Surface.ROTATION_180, mSpiedDisplayAreaOrganizer.onRotateDisplay(Surface.ROTATION_180, Surface.ROTATION_180,
mMockWindowContainerTransaction); mMockWindowContainerTransaction);
verify(mDisplayAreaOrganizer, never()).finishOffset(anyInt(), anyInt()); verify(mSpiedDisplayAreaOrganizer, never()).finishOffset(anyInt(), anyInt());
} }
@Test @Test
public void testRotation_portrait_180_to_portrait_0() { public void testRotation_portrait_180_to_portrait_0() {
when(mMockLeash.isValid()).thenReturn(false); when(mMockLeash.isValid()).thenReturn(false);
// Rotate 180 -> 0 // Rotate 180 -> 0
mDisplayAreaOrganizer.onRotateDisplay(Surface.ROTATION_180, Surface.ROTATION_0, mSpiedDisplayAreaOrganizer.onRotateDisplay(Surface.ROTATION_180, Surface.ROTATION_0,
mMockWindowContainerTransaction); mMockWindowContainerTransaction);
verify(mDisplayAreaOrganizer, never()).finishOffset(anyInt(), anyInt()); verify(mSpiedDisplayAreaOrganizer, never()).finishOffset(anyInt(), anyInt());
} }
@Test @Test
public void testRotation_landscape_90_to_landscape_90() { public void testRotation_landscape_90_to_landscape_90() {
when(mMockLeash.isValid()).thenReturn(false); when(mMockLeash.isValid()).thenReturn(false);
// Rotate 90 -> 90 // Rotate 90 -> 90
mDisplayAreaOrganizer.onRotateDisplay(Surface.ROTATION_90, Surface.ROTATION_90, mSpiedDisplayAreaOrganizer.onRotateDisplay(Surface.ROTATION_90, Surface.ROTATION_90,
mMockWindowContainerTransaction); mMockWindowContainerTransaction);
verify(mDisplayAreaOrganizer, never()).finishOffset(anyInt(), anyInt()); verify(mSpiedDisplayAreaOrganizer, never()).finishOffset(anyInt(), anyInt());
} }
@Test @Test
public void testRotation_landscape_90_to_seascape_270() { public void testRotation_landscape_90_to_seascape_270() {
when(mMockLeash.isValid()).thenReturn(false); when(mMockLeash.isValid()).thenReturn(false);
// Rotate 90 -> 270 // Rotate 90 -> 270
mDisplayAreaOrganizer.onRotateDisplay(Surface.ROTATION_90, Surface.ROTATION_270, mSpiedDisplayAreaOrganizer.onRotateDisplay(Surface.ROTATION_90, Surface.ROTATION_270,
mMockWindowContainerTransaction); mMockWindowContainerTransaction);
verify(mDisplayAreaOrganizer, never()).finishOffset(anyInt(), anyInt()); verify(mSpiedDisplayAreaOrganizer, never()).finishOffset(anyInt(), anyInt());
} }
@Test @Test
public void testRotation_seascape_270_to_seascape_270() { public void testRotation_seascape_270_to_seascape_270() {
when(mMockLeash.isValid()).thenReturn(false); when(mMockLeash.isValid()).thenReturn(false);
// Rotate 270 -> 270 // Rotate 270 -> 270
mDisplayAreaOrganizer.onRotateDisplay(Surface.ROTATION_270, Surface.ROTATION_270, mSpiedDisplayAreaOrganizer.onRotateDisplay(Surface.ROTATION_270, Surface.ROTATION_270,
mMockWindowContainerTransaction); mMockWindowContainerTransaction);
verify(mDisplayAreaOrganizer, never()).finishOffset(anyInt(), anyInt()); verify(mSpiedDisplayAreaOrganizer, never()).finishOffset(anyInt(), anyInt());
} }
@Test @Test
public void testRotation_seascape_90_to_landscape_90() { public void testRotation_seascape_90_to_landscape_90() {
when(mMockLeash.isValid()).thenReturn(false); when(mMockLeash.isValid()).thenReturn(false);
// Rotate 270 -> 90 // Rotate 270 -> 90
mDisplayAreaOrganizer.onRotateDisplay(Surface.ROTATION_270, Surface.ROTATION_90, mSpiedDisplayAreaOrganizer.onRotateDisplay(Surface.ROTATION_270, Surface.ROTATION_90,
mMockWindowContainerTransaction); mMockWindowContainerTransaction);
verify(mDisplayAreaOrganizer, never()).finishOffset(anyInt(), anyInt()); verify(mSpiedDisplayAreaOrganizer, never()).finishOffset(anyInt(), anyInt());
} }
} }

View File

@@ -18,10 +18,8 @@ package com.android.wm.shell.onehanded;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
import android.testing.AndroidTestingRunner; import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper; import android.view.ViewConfiguration;
import androidx.test.filters.SmallTest; import androidx.test.filters.SmallTest;
@@ -29,7 +27,6 @@ import com.android.wm.shell.common.DisplayController;
import com.android.wm.shell.common.ShellExecutor; import com.android.wm.shell.common.ShellExecutor;
import org.junit.Before; import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.mockito.Mock; import org.mockito.Mock;
@@ -38,7 +35,6 @@ import org.mockito.MockitoAnnotations;
@SmallTest @SmallTest
@RunWith(AndroidTestingRunner.class) @RunWith(AndroidTestingRunner.class)
public class OneHandedGestureHandlerTest extends OneHandedTestCase { public class OneHandedGestureHandlerTest extends OneHandedTestCase {
OneHandedTutorialHandler mTutorialHandler;
OneHandedGestureHandler mGestureHandler; OneHandedGestureHandler mGestureHandler;
@Mock @Mock
DisplayController mMockDisplayController; DisplayController mMockDisplayController;
@@ -46,11 +42,10 @@ public class OneHandedGestureHandlerTest extends OneHandedTestCase {
ShellExecutor mMockShellMainExecutor; ShellExecutor mMockShellMainExecutor;
@Before @Before
public void setUp() throws Exception { public void setUp() {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
mTutorialHandler = new OneHandedTutorialHandler(mContext, mMockShellMainExecutor);
mGestureHandler = new OneHandedGestureHandler(mContext, mMockDisplayController, mGestureHandler = new OneHandedGestureHandler(mContext, mMockDisplayController,
mMockShellMainExecutor); ViewConfiguration.get(mTestContext), mMockShellMainExecutor);
} }
@Test @Test
@@ -68,16 +63,6 @@ public class OneHandedGestureHandlerTest extends OneHandedTestCase {
assertThat(mGestureHandler.mGestureEventCallback).isEqualTo(callback); assertThat(mGestureHandler.mGestureEventCallback).isEqualTo(callback);
} }
@Ignore("b/167943723, refactor it and fix it")
@Test
public void testReceiveNewConfig_whenThreeButtonModeEnabled() {
mGestureHandler.onOneHandedEnabled(true);
mGestureHandler.onThreeButtonModeEnabled(true);
assertThat(mGestureHandler.mInputMonitor).isNotNull();
assertThat(mGestureHandler.mInputEventReceiver).isNotNull();
}
@Test @Test
public void testOneHandedDisabled_shouldDisposeInputChannel() { public void testOneHandedDisabled_shouldDisposeInputChannel() {
mGestureHandler.onOneHandedEnabled(false); mGestureHandler.onOneHandedEnabled(false);

View File

@@ -28,7 +28,6 @@ import android.database.ContentObserver;
import android.net.Uri; import android.net.Uri;
import android.provider.Settings; import android.provider.Settings;
import android.testing.AndroidTestingRunner; import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import androidx.test.filters.SmallTest; import androidx.test.filters.SmallTest;

View File

@@ -19,88 +19,47 @@ package com.android.wm.shell.onehanded;
import static android.view.Display.DEFAULT_DISPLAY; import static android.view.Display.DEFAULT_DISPLAY;
import static com.android.wm.shell.onehanded.OneHandedController.SUPPORT_ONE_HANDED_MODE; import static com.android.wm.shell.onehanded.OneHandedController.SUPPORT_ONE_HANDED_MODE;
import static com.android.wm.shell.onehanded.OneHandedSettingsUtil.ONE_HANDED_TIMEOUT_MEDIUM_IN_SECONDS;
import static org.junit.Assume.assumeTrue; import static org.junit.Assume.assumeTrue;
import android.content.Context; import android.content.Context;
import android.hardware.display.DisplayManager; import android.hardware.display.DisplayManager;
import android.os.SystemProperties; import android.os.SystemProperties;
import android.provider.Settings; import android.testing.TestableContext;
import androidx.test.platform.app.InstrumentationRegistry; import androidx.test.platform.app.InstrumentationRegistry;
import org.junit.After;
import org.junit.Before; import org.junit.Before;
import org.junit.Rule;
import org.mockito.Answers;
import org.mockito.Mock;
/** /**
* Base class that does One Handed specific setup. * Base class that does One Handed specific setup.
*/ */
public abstract class OneHandedTestCase { public abstract class OneHandedTestCase {
static boolean sOrigEnabled; @Mock(answer = Answers.RETURNS_DEEP_STUBS)
static boolean sOrigTapsAppToExitEnabled;
static int sOrigTimeout;
static boolean sOrigSwipeToNotification;
protected Context mContext; protected Context mContext;
@Rule
public TestableContext mTestContext = new TestableContext(
InstrumentationRegistry.getInstrumentation().getTargetContext(), null);
@Before @Before
public void setupSettings() { public void setUpContext() {
assumeTrue(SystemProperties.getBoolean(SUPPORT_ONE_HANDED_MODE, false)); assumeTrue(SystemProperties.getBoolean(SUPPORT_ONE_HANDED_MODE, false));
final Context testContext = final DisplayManager dm = getTestContext().getSystemService(DisplayManager.class);
InstrumentationRegistry.getInstrumentation().getTargetContext(); mContext = getTestContext().createDisplayContext(dm.getDisplay(DEFAULT_DISPLAY));
final DisplayManager dm = testContext.getSystemService(DisplayManager.class);
mContext = testContext.createDisplayContext(dm.getDisplay(DEFAULT_DISPLAY));
InstrumentationRegistry
.getInstrumentation()
.getUiAutomation()
.adoptShellPermissionIdentity();
sOrigEnabled = OneHandedSettingsUtil.getSettingsOneHandedModeEnabled(
getContext().getContentResolver());
sOrigTimeout = OneHandedSettingsUtil.getSettingsOneHandedModeTimeout(
getContext().getContentResolver());
sOrigTapsAppToExitEnabled = OneHandedSettingsUtil.getSettingsTapsAppToExit(
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(),
Settings.Secure.TAPS_APP_TO_EXIT, 1);
Settings.Secure.putInt(getContext().getContentResolver(),
Settings.Secure.SWIPE_BOTTOM_TO_NOTIFICATION_ENABLED, 1);
} }
@After /** return testable context */
public void restoreSettings() { protected TestableContext getTestContext() {
if (mContext == null) { return mTestContext;
// Return early if one-handed mode is not supported
return;
}
Settings.Secure.putInt(getContext().getContentResolver(),
Settings.Secure.ONE_HANDED_MODE_ENABLED, sOrigEnabled ? 1 : 0);
Settings.Secure.putInt(mContext.getContentResolver(),
Settings.Secure.ONE_HANDED_MODE_TIMEOUT, sOrigTimeout);
Settings.Secure.putInt(mContext.getContentResolver(),
Settings.Secure.TAPS_APP_TO_EXIT, sOrigTapsAppToExitEnabled ? 1 : 0);
Settings.Secure.putInt(mContext.getContentResolver(),
Settings.Secure.SWIPE_BOTTOM_TO_NOTIFICATION_ENABLED,
sOrigSwipeToNotification ? 1 : 0);
InstrumentationRegistry
.getInstrumentation()
.getUiAutomation()
.dropShellPermissionIdentity();
} }
/** return display context */
protected Context getContext() { protected Context getContext() {
return mContext; return mContext;
} }
} }

View File

@@ -27,24 +27,18 @@ import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import android.os.Looper;
import android.testing.AndroidTestingRunner; import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import androidx.test.filters.SmallTest; import androidx.test.filters.SmallTest;
import com.android.wm.shell.TestShellExecutor; import com.android.wm.shell.TestShellExecutor;
import com.android.wm.shell.common.ShellExecutor;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Mockito; import org.mockito.Mockito;
import org.mockito.MockitoAnnotations; import org.mockito.MockitoAnnotations;
import java.util.ArrayList;
@SmallTest @SmallTest
@RunWith(AndroidTestingRunner.class) @RunWith(AndroidTestingRunner.class)
public class OneHandedTimeoutHandlerTest extends OneHandedTestCase { public class OneHandedTimeoutHandlerTest extends OneHandedTestCase {
@@ -52,7 +46,7 @@ public class OneHandedTimeoutHandlerTest extends OneHandedTestCase {
private TestShellExecutor mMainExecutor; private TestShellExecutor mMainExecutor;
@Before @Before
public void setUp() throws Exception { public void setUp() {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
mMainExecutor = new TestShellExecutor(); mMainExecutor = new TestShellExecutor();
mTimeoutHandler = Mockito.spy(new OneHandedTimeoutHandler(mMainExecutor)); mTimeoutHandler = Mockito.spy(new OneHandedTimeoutHandler(mMainExecutor));

View File

@@ -18,8 +18,9 @@ package com.android.wm.shell.onehanded;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.spy;
import android.testing.AndroidTestingRunner; import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import androidx.test.filters.SmallTest; import androidx.test.filters.SmallTest;
@@ -35,18 +36,20 @@ import org.mockito.MockitoAnnotations;
@SmallTest @SmallTest
@RunWith(AndroidTestingRunner.class) @RunWith(AndroidTestingRunner.class)
public class OneHandedTouchHandlerTest extends OneHandedTestCase { public class OneHandedTouchHandlerTest extends OneHandedTestCase {
boolean mIsEventCallback = false;
private OneHandedTouchHandler mTouchHandler; private OneHandedTouchHandler mTouchHandler;
private OneHandedTimeoutHandler mSpiedTimeoutHandler;
private OneHandedTouchHandler.OneHandedTouchEventCallback mTouchEventCallback =
() -> mIsEventCallback = true;
@Mock @Mock
private OneHandedTimeoutHandler mTimeoutHandler; private ShellExecutor mMockShellMainExecutor;
@Mock
private ShellExecutor mMainExecutor;
@Before @Before
public void setUp() { public void setUp() {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
mTouchHandler = new OneHandedTouchHandler(mTimeoutHandler, mMainExecutor); mSpiedTimeoutHandler = spy(new OneHandedTimeoutHandler(mMockShellMainExecutor));
mTouchHandler = new OneHandedTouchHandler(mSpiedTimeoutHandler, mMockShellMainExecutor);
} }
@Test @Test
@@ -55,7 +58,7 @@ public class OneHandedTouchHandlerTest extends OneHandedTestCase {
}; };
mTouchHandler.registerTouchEventListener(callback); mTouchHandler.registerTouchEventListener(callback);
assertThat(mTouchHandler.mTouchEventCallback).isEqualTo(callback); assertThat(mIsEventCallback).isFalse();
} }
@Test @Test

View File

@@ -17,10 +17,12 @@
package com.android.wm.shell.onehanded; package com.android.wm.shell.onehanded;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.content.om.IOverlayManager; import android.content.om.IOverlayManager;
import android.os.Handler; import android.os.Handler;
import android.testing.AndroidTestingRunner; import android.testing.AndroidTestingRunner;
import android.util.ArrayMap;
import androidx.test.filters.SmallTest; import androidx.test.filters.SmallTest;
@@ -37,12 +39,15 @@ import org.mockito.MockitoAnnotations;
@SmallTest @SmallTest
@RunWith(AndroidTestingRunner.class) @RunWith(AndroidTestingRunner.class)
public class OneHandedTutorialHandlerTest extends OneHandedTestCase { public class OneHandedTutorialHandlerTest extends OneHandedTestCase {
@Mock
OneHandedTouchHandler mTouchHandler;
OneHandedTutorialHandler mTutorialHandler;
OneHandedGestureHandler mGestureHandler;
OneHandedTimeoutHandler mTimeoutHandler; OneHandedTimeoutHandler mTimeoutHandler;
OneHandedController mOneHandedController; OneHandedController mOneHandedController;
@Mock
OneHandedGestureHandler mMockGestureHandler;
@Mock
OneHandedTouchHandler mMockTouchHandler;
@Mock
OneHandedTutorialHandler mMockTutorialHandler;
@Mock @Mock
DisplayController mMockDisplayController; DisplayController mMockDisplayController;
@Mock @Mock
@@ -64,18 +69,17 @@ public class OneHandedTutorialHandlerTest extends OneHandedTestCase {
@Before @Before
public void setUp() { public void setUp() {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
mTutorialHandler = new OneHandedTutorialHandler(mContext, mMockShellMainExecutor);
mTimeoutHandler = new OneHandedTimeoutHandler(mMockShellMainExecutor); mTimeoutHandler = new OneHandedTimeoutHandler(mMockShellMainExecutor);
mGestureHandler = new OneHandedGestureHandler(mContext, mMockDisplayController,
mMockShellMainExecutor); when(mMockDisplayAreaOrganizer.getDisplayAreaTokenMap()).thenReturn(new ArrayMap<>());
mOneHandedController = new OneHandedController( mOneHandedController = new OneHandedController(
getContext(), getContext(),
mMockDisplayController, mMockDisplayController,
mMockBackgroundOrganizer, mMockBackgroundOrganizer,
mMockDisplayAreaOrganizer, mMockDisplayAreaOrganizer,
mTouchHandler, mMockTouchHandler,
mTutorialHandler, mMockTutorialHandler,
mGestureHandler, mMockGestureHandler,
mTimeoutHandler, mTimeoutHandler,
mMockUiEventLogger, mMockUiEventLogger,
mMockOverlayManager, mMockOverlayManager,
@@ -86,6 +90,6 @@ public class OneHandedTutorialHandlerTest extends OneHandedTestCase {
@Test @Test
public void testRegisterForDisplayAreaOrganizer() { public void testRegisterForDisplayAreaOrganizer() {
verify(mMockDisplayAreaOrganizer).registerTransitionCallback(mTutorialHandler); verify(mMockDisplayAreaOrganizer).registerTransitionCallback(mMockTutorialHandler);
} }
} }