diff options
3 files changed, 71 insertions, 5 deletions
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 b5c54023c492..d9def90cec9c 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 @@ -498,6 +498,11 @@ public class OneHandedController implements RemoteCallable<OneHandedController> @VisibleForTesting void onActivatedActionChanged() { + if (!isShortcutEnabled()) { + Slog.w(TAG, "Shortcut not enabled, skip onActivatedActionChanged()"); + return; + } + if (!isOneHandedEnabled()) { final boolean success = mOneHandedSettingsUtil.setOneHandedModeEnabled( mContext.getContentResolver(), 1 /* Enabled for shortcut */, mUserId); @@ -608,6 +613,11 @@ public class OneHandedController implements RemoteCallable<OneHandedController> } @VisibleForTesting + boolean isShortcutEnabled() { + return mOneHandedSettingsUtil.getShortcutEnabled(mContext.getContentResolver(), mUserId); + } + + @VisibleForTesting boolean isSwipeToNotificationEnabled() { return mIsSwipeToNotificationEnabled; } @@ -617,8 +627,11 @@ public class OneHandedController implements RemoteCallable<OneHandedController> mMainExecutor.execute(() -> stopOneHanded()); } - // Reset and align shortcut one_handed_mode_activated status with current mState - notifyShortcutState(mState.getState()); + // If setting is pull screen, notify shortcut one_handed_mode_activated to reset + // and align status with current mState when function enabled. + if (isOneHandedEnabled() && !isSwipeToNotificationEnabled()) { + notifyShortcutState(mState.getState()); + } mTouchHandler.onOneHandedEnabled(mIsOneHandedEnabled); @@ -717,6 +730,8 @@ public class OneHandedController implements RemoteCallable<OneHandedController> pw.println(mLockedDisabled); pw.print(innerPrefix + "mUserId="); pw.println(mUserId); + pw.print(innerPrefix + "isShortcutEnabled="); + pw.println(isShortcutEnabled()); if (mBackgroundPanelOrganizer != null) { mBackgroundPanelOrganizer.dump(pw); diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedSettingsUtil.java b/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedSettingsUtil.java index da53b359a304..3baa69f0033a 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedSettingsUtil.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedSettingsUtil.java @@ -16,6 +16,8 @@ package com.android.wm.shell.onehanded; +import static com.android.internal.accessibility.AccessibilityShortcutController.ONE_HANDED_COMPONENT_NAME; + import android.annotation.IntDef; import android.content.ContentResolver; import android.database.ContentObserver; @@ -34,6 +36,9 @@ import java.lang.annotation.RetentionPolicy; public final class OneHandedSettingsUtil { private static final String TAG = "OneHandedSettingsUtil"; + private static final String ONE_HANDED_MODE_TARGET_NAME = + ONE_HANDED_COMPONENT_NAME.getShortClassName(); + @IntDef(prefix = {"ONE_HANDED_TIMEOUT_"}, value = { ONE_HANDED_TIMEOUT_NEVER, ONE_HANDED_TIMEOUT_SHORT_IN_SECONDS, @@ -158,6 +163,17 @@ public final class OneHandedSettingsUtil { } /** + * Queries one-handed mode shortcut enabled in settings or not. + * + * @return true if user enabled one-handed shortcut in settings, false otherwise. + */ + public boolean getShortcutEnabled(ContentResolver resolver, int userId) { + final String targets = Settings.Secure.getStringForUser(resolver, + Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS, userId); + return targets != null ? targets.contains(ONE_HANDED_MODE_TARGET_NAME) : false; + } + + /** * Sets tutorial shown counts. * * @return true if the value was set, false on database errors. 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 950900337918..be786fb55b30 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 @@ -118,6 +118,7 @@ public class OneHandedControllerTest extends OneHandedTestCase { mDefaultTapAppToExitEnabled); when(mMockSettingsUitl.getSettingsSwipeToNotificationEnabled(any(), anyInt())).thenReturn( mDefaultSwipeToNotificationEnabled); + when(mMockSettingsUitl.getShortcutEnabled(any(), anyInt())).thenReturn(false); when(mMockDisplayAreaOrganizer.getLastDisplayBounds()).thenReturn( new Rect(0, 0, mDisplayLayout.width(), mDisplayLayout.height())); @@ -341,6 +342,7 @@ public class OneHandedControllerTest extends OneHandedTestCase { when(mSpiedTransitionState.getState()).thenReturn(STATE_ACTIVE); when(mSpiedTransitionState.isTransitioning()).thenReturn(false); when(mMockSettingsUitl.getOneHandedModeActivated(any(), anyInt())).thenReturn(true); + when(mSpiedOneHandedController.isShortcutEnabled()).thenReturn(true); mSpiedOneHandedController.onActivatedActionChanged(); verify(mSpiedOneHandedController, never()).startOneHanded(); @@ -352,6 +354,7 @@ public class OneHandedControllerTest extends OneHandedTestCase { when(mSpiedTransitionState.getState()).thenReturn(STATE_NONE); when(mSpiedTransitionState.isTransitioning()).thenReturn(false); when(mMockSettingsUitl.getOneHandedModeActivated(any(), anyInt())).thenReturn(false); + when(mSpiedOneHandedController.isShortcutEnabled()).thenReturn(true); mSpiedOneHandedController.onActivatedActionChanged(); verify(mSpiedOneHandedController, never()).startOneHanded(); @@ -363,6 +366,7 @@ public class OneHandedControllerTest extends OneHandedTestCase { when(mSpiedTransitionState.getState()).thenReturn(STATE_NONE); when(mSpiedTransitionState.isTransitioning()).thenReturn(false); when(mMockSettingsUitl.getOneHandedModeActivated(any(), anyInt())).thenReturn(true); + when(mSpiedOneHandedController.isShortcutEnabled()).thenReturn(true); mSpiedOneHandedController.onActivatedActionChanged(); verify(mSpiedOneHandedController).startOneHanded(); @@ -374,6 +378,7 @@ public class OneHandedControllerTest extends OneHandedTestCase { when(mSpiedTransitionState.getState()).thenReturn(STATE_ENTERING); when(mSpiedTransitionState.isTransitioning()).thenReturn(true); when(mMockSettingsUitl.getOneHandedModeActivated(any(), anyInt())).thenReturn(true); + when(mSpiedOneHandedController.isShortcutEnabled()).thenReturn(true); mSpiedOneHandedController.onActivatedActionChanged(); verify(mSpiedTransitionState, never()).setState(STATE_EXITING); @@ -384,6 +389,7 @@ public class OneHandedControllerTest extends OneHandedTestCase { when(mSpiedTransitionState.getState()).thenReturn(STATE_EXITING); when(mSpiedTransitionState.isTransitioning()).thenReturn(true); when(mMockSettingsUitl.getOneHandedModeActivated(any(), anyInt())).thenReturn(true); + when(mSpiedOneHandedController.isShortcutEnabled()).thenReturn(true); mSpiedOneHandedController.onActivatedActionChanged(); verify(mSpiedTransitionState, never()).setState(STATE_ENTERING); @@ -392,6 +398,7 @@ public class OneHandedControllerTest extends OneHandedTestCase { @Test public void testOneHandedDisabled_shortcutTrigger_thenAutoEnabled() { when(mSpiedOneHandedController.isOneHandedEnabled()).thenReturn(false); + when(mSpiedOneHandedController.isShortcutEnabled()).thenReturn(true); when(mSpiedTransitionState.getState()).thenReturn(STATE_NONE); when(mSpiedTransitionState.isTransitioning()).thenReturn(false); when(mMockSettingsUitl.getOneHandedModeActivated(any(), anyInt())).thenReturn(false); @@ -417,6 +424,7 @@ public class OneHandedControllerTest extends OneHandedTestCase { when(mSpiedOneHandedController.isOneHandedEnabled()).thenReturn(true); when(mSpiedTransitionState.getState()).thenReturn(STATE_NONE); when(mSpiedTransitionState.isTransitioning()).thenReturn(false); + when(mSpiedOneHandedController.isShortcutEnabled()).thenReturn(true); when(mSpiedOneHandedController.isSwipeToNotificationEnabled()).thenReturn(true); mSpiedOneHandedController.registerEventCallback(mMockEventCallback); mSpiedOneHandedController.onActivatedActionChanged(); @@ -425,11 +433,11 @@ public class OneHandedControllerTest extends OneHandedTestCase { } @Test - public void testNotifyShortcutState_whenUpdateOneHandedEnabled() { - when(mSpiedOneHandedController.isOneHandedEnabled()).thenReturn(false); + public void testNotifyShortcutState_whenSetOneHandedEnabled() { + when(mSpiedOneHandedController.isOneHandedEnabled()).thenReturn(true); when(mSpiedTransitionState.getState()).thenReturn(STATE_NONE); when(mSpiedTransitionState.isTransitioning()).thenReturn(false); - when(mSpiedOneHandedController.isSwipeToNotificationEnabled()).thenReturn(true); + when(mSpiedOneHandedController.isSwipeToNotificationEnabled()).thenReturn(false); mSpiedOneHandedController.registerEventCallback(mMockEventCallback); mSpiedOneHandedController.setOneHandedEnabled(true); @@ -448,4 +456,31 @@ public class OneHandedControllerTest extends OneHandedTestCase { // Verify no NPE crash and mMockShellMainExecutor never be execute. verify(mMockShellMainExecutor, never()).execute(any()); } + + @Test + public void testShortcutEnable_ableToAutoEnableOneHandedMode() { + when(mSpiedOneHandedController.isOneHandedEnabled()).thenReturn(false); + when(mSpiedTransitionState.getState()).thenReturn(STATE_NONE); + when(mSpiedTransitionState.isTransitioning()).thenReturn(false); + when(mSpiedOneHandedController.isShortcutEnabled()).thenReturn(true); + when(mSpiedOneHandedController.isSwipeToNotificationEnabled()).thenReturn(false); + when(mMockSettingsUitl.setOneHandedModeEnabled(any(), anyInt(), anyInt())).thenReturn( + false /* To avoid test runner create Toast */); + mSpiedOneHandedController.onActivatedActionChanged(); + + verify(mSpiedOneHandedController).notifyUserConfigChanged(anyBoolean()); + } + + @Test + public void testShortcutDisable_shouldNotAutoEnableOneHandedMode() { + when(mSpiedOneHandedController.isOneHandedEnabled()).thenReturn(false); + when(mSpiedTransitionState.getState()).thenReturn(STATE_NONE); + when(mSpiedTransitionState.isTransitioning()).thenReturn(false); + when(mSpiedOneHandedController.isSwipeToNotificationEnabled()).thenReturn(false); + when(mMockSettingsUitl.setOneHandedModeEnabled(any(), anyInt(), anyInt())).thenReturn(true); + mSpiedOneHandedController.onActivatedActionChanged(); + + verify(mMockSettingsUitl, never()).setOneHandedModeEnabled(any(), anyInt(), anyInt()); + verify(mSpiedOneHandedController, never()).notifyUserConfigChanged(anyBoolean()); + } } |