diff options
10 files changed, 238 insertions, 47 deletions
diff --git a/core/java/android/view/accessibility/AccessibilityManager.java b/core/java/android/view/accessibility/AccessibilityManager.java index a87e5c8e1b56..2b7cf427a562 100644 --- a/core/java/android/view/accessibility/AccessibilityManager.java +++ b/core/java/android/view/accessibility/AccessibilityManager.java @@ -1774,7 +1774,8 @@ public final class AccessibilityManager { } /** - * Notifies that the accessibility button in the system's navigation area has been clicked + * Notifies that the accessibility button in the system's navigation area has been clicked, + * or a gesture shortcut input has been performed. * * @param displayId The logical display id. * @hide @@ -1785,7 +1786,8 @@ public final class AccessibilityManager { } /** - * Perform the accessibility button for the given target which is assigned to the button. + * Perform the accessibility button or gesture + * for the given target which is assigned to the button. * * @param displayId displayId The logical display id. * @param targetName The flattened {@link ComponentName} string or the class name of a system @@ -1810,6 +1812,31 @@ public final class AccessibilityManager { } /** + * Notifies that a shortcut was long-clicked. + * This displays the dialog used to select which target the given shortcut will use, + * from its list of targets. + * The current shortcut type is determined by the current navigation mode. + * + * @param displayId The id of the display to show the dialog on. + * @hide + */ + @RequiresPermission(Manifest.permission.STATUS_BAR_SERVICE) + public void notifyAccessibilityButtonLongClicked(int displayId) { + final IAccessibilityManager service; + synchronized (mLock) { + service = getServiceLocked(); + if (service == null) { + return; + } + } + try { + service.notifyAccessibilityButtonLongClicked(displayId); + } catch (RemoteException re) { + Log.e(LOG_TAG, "Error while dispatching accessibility button long click. ", re); + } + } + + /** * Notifies that the visibility of the accessibility button in the system's navigation area * has changed. * diff --git a/core/java/android/view/accessibility/IAccessibilityManager.aidl b/core/java/android/view/accessibility/IAccessibilityManager.aidl index 2de3ce8532e3..e04fa1537d54 100644 --- a/core/java/android/view/accessibility/IAccessibilityManager.aidl +++ b/core/java/android/view/accessibility/IAccessibilityManager.aidl @@ -88,6 +88,8 @@ interface IAccessibilityManager { @EnforcePermission("STATUS_BAR_SERVICE") void notifyAccessibilityButtonClicked(int displayId, String targetName); + @EnforcePermission("STATUS_BAR_SERVICE") + void notifyAccessibilityButtonLongClicked(int displayId); @EnforcePermission("STATUS_BAR_SERVICE") void notifyAccessibilityButtonVisibilityChanged(boolean available); diff --git a/core/java/com/android/internal/accessibility/dialog/AccessibilityButtonChooserActivity.java b/core/java/com/android/internal/accessibility/dialog/AccessibilityButtonChooserActivity.java index 01cbb5514669..81d8adfce2ae 100644 --- a/core/java/com/android/internal/accessibility/dialog/AccessibilityButtonChooserActivity.java +++ b/core/java/com/android/internal/accessibility/dialog/AccessibilityButtonChooserActivity.java @@ -20,7 +20,6 @@ import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL; import static com.android.internal.accessibility.AccessibilityShortcutController.MAGNIFICATION_COMPONENT_NAME; import static com.android.internal.accessibility.AccessibilityShortcutController.MAGNIFICATION_CONTROLLER_NAME; -import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.GESTURE; import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.SOFTWARE; import static com.android.internal.accessibility.dialog.AccessibilityTargetHelper.getTargets; import static com.android.internal.accessibility.util.AccessibilityStatsLogUtils.logAccessibilityButtonLongPressStatus; @@ -44,6 +43,8 @@ import java.util.List; * Activity used to display and persist a service or feature target for the Accessibility button. */ public class AccessibilityButtonChooserActivity extends Activity { + public static final String EXTRA_TYPE_TO_CHOOSE = "TYPE"; + private final List<AccessibilityTarget> mTargets = new ArrayList<>(); @Override @@ -67,8 +68,8 @@ public class AccessibilityButtonChooserActivity extends Activity { NAV_BAR_MODE_GESTURAL == getResources().getInteger( com.android.internal.R.integer.config_navBarInteractionMode); - final int targetType = (isGestureNavigateEnabled - && android.provider.Flags.a11yStandaloneGestureEnabled()) ? GESTURE : SOFTWARE; + final int targetType = android.provider.Flags.a11yStandaloneGestureEnabled() + ? getIntent().getIntExtra(EXTRA_TYPE_TO_CHOOSE, SOFTWARE) : SOFTWARE; if (isGestureNavigateEnabled) { final TextView promptPrologue = findViewById(R.id.accessibility_button_prompt_prologue); diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/SystemActions.java b/packages/SystemUI/src/com/android/systemui/accessibility/SystemActions.java index 7750f6bf4178..51c5b00daae4 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/SystemActions.java +++ b/packages/SystemUI/src/com/android/systemui/accessibility/SystemActions.java @@ -18,8 +18,6 @@ package com.android.systemui.accessibility; import static android.view.WindowManager.ScreenshotSource.SCREENSHOT_ACCESSIBILITY_ACTIONS; -import static com.android.internal.accessibility.common.ShortcutConstants.CHOOSER_PACKAGE_NAME; - import android.accessibilityservice.AccessibilityService; import android.app.PendingIntent; import android.app.RemoteAction; @@ -45,7 +43,6 @@ import android.view.accessibility.AccessibilityManager; import android.view.accessibility.Flags; import com.android.internal.R; -import com.android.internal.accessibility.dialog.AccessibilityButtonChooserActivity; import com.android.internal.accessibility.util.AccessibilityUtils; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.ScreenshotHelper; @@ -561,16 +558,13 @@ public class SystemActions implements CoreStartable, ConfigurationController.Con } private void handleAccessibilityButton() { - AccessibilityManager.getInstance(mContext).notifyAccessibilityButtonClicked( + mA11yManager.notifyAccessibilityButtonClicked( mDisplayTracker.getDefaultDisplayId()); } private void handleAccessibilityButtonChooser() { - final Intent intent = new Intent(AccessibilityManager.ACTION_CHOOSE_ACCESSIBILITY_BUTTON); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); - final String chooserClassName = AccessibilityButtonChooserActivity.class.getName(); - intent.setClassName(CHOOSER_PACKAGE_NAME, chooserClassName); - mContext.startActivityAsUser(intent, mUserTracker.getUserHandle()); + mA11yManager.notifyAccessibilityButtonLongClicked( + mDisplayTracker.getDefaultDisplayId()); } private void handleAccessibilityShortcut() { diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/views/NavigationBar.java b/packages/SystemUI/src/com/android/systemui/navigationbar/views/NavigationBar.java index e8c90c1fc9bf..c70a5234dfca 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/views/NavigationBar.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/views/NavigationBar.java @@ -34,7 +34,6 @@ import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD; import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_3BUTTON; import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL; -import static com.android.internal.accessibility.common.ShortcutConstants.CHOOSER_PACKAGE_NAME; import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.HOME_BUTTON_LONG_PRESS_DURATION_MS; import static com.android.systemui.navigationbar.NavBarHelper.transitionMode; import static com.android.systemui.recents.OverviewProxyService.OverviewProxyListener; @@ -60,7 +59,6 @@ import android.app.ActivityTaskManager; import android.app.IActivityTaskManager; import android.app.StatusBarManager; import android.content.Context; -import android.content.Intent; import android.content.res.Configuration; import android.graphics.Insets; import android.graphics.PixelFormat; @@ -105,7 +103,6 @@ import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; import com.android.app.viewcapture.ViewCaptureAwareWindowManager; -import com.android.internal.accessibility.dialog.AccessibilityButtonChooserActivity; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.UiEvent; import com.android.internal.logging.UiEventLogger; @@ -1625,11 +1622,9 @@ public class NavigationBar extends ViewController<NavigationBarView> implements } private boolean onAccessibilityLongClick(View v) { - final Intent intent = new Intent(AccessibilityManager.ACTION_CHOOSE_ACCESSIBILITY_BUTTON); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); - final String chooserClassName = AccessibilityButtonChooserActivity.class.getName(); - intent.setClassName(CHOOSER_PACKAGE_NAME, chooserClassName); - mContext.startActivityAsUser(intent, mUserTracker.getUserHandle()); + final Display display = v.getDisplay(); + mAccessibilityManager.notifyAccessibilityButtonLongClicked( + display != null ? display.getDisplayId() : mDisplayTracker.getDefaultDisplayId()); return true; } diff --git a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java index 000781acec58..a402a9d5ae7c 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java +++ b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java @@ -25,7 +25,6 @@ import static android.view.MotionEvent.ACTION_DOWN; import static android.view.MotionEvent.ACTION_UP; import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_3BUTTON; -import static com.android.internal.accessibility.common.ShortcutConstants.CHOOSER_PACKAGE_NAME; import static com.android.systemui.shared.system.QuickStepContract.KEY_EXTRA_SYSUI_PROXY; import static com.android.systemui.shared.system.QuickStepContract.KEY_EXTRA_UNFOLD_ANIMATION_FORWARDER; import static com.android.systemui.shared.system.QuickStepContract.KEY_EXTRA_UNLOCK_ANIMATION_CONTROLLER; @@ -76,7 +75,6 @@ import android.view.inputmethod.InputMethodManager; import androidx.annotation.NonNull; -import com.android.internal.accessibility.dialog.AccessibilityButtonChooserActivity; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.app.AssistUtils; import com.android.internal.app.IVoiceInteractionSessionListener; @@ -404,23 +402,16 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis @Override public void notifyAccessibilityButtonClicked(int displayId) { verifyCallerAndClearCallingIdentity("notifyAccessibilityButtonClicked", () -> - AccessibilityManager.getInstance(mContext) - .notifyAccessibilityButtonClicked(displayId)); + AccessibilityManager.getInstance(mContext).notifyAccessibilityButtonClicked( + displayId)); } @Override public void notifyAccessibilityButtonLongClicked() { - verifyCallerAndClearCallingIdentity("notifyAccessibilityButtonLongClicked", - () -> { - final Intent intent = - new Intent(AccessibilityManager.ACTION_CHOOSE_ACCESSIBILITY_BUTTON); - final String chooserClassName = AccessibilityButtonChooserActivity - .class.getName(); - intent.setClassName(CHOOSER_PACKAGE_NAME, chooserClassName); - intent.addFlags( - Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); - mContext.startActivityAsUser(intent, mUserTracker.getUserHandle()); - }); + verifyCallerAndClearCallingIdentity("notifyAccessibilityButtonLongClicked", () -> + AccessibilityManager.getInstance(mContext) + .notifyAccessibilityButtonLongClicked( + mDisplayTracker.getDefaultDisplayId())); } @Override diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java index b541345e1cb8..7580b697b516 100644 --- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java +++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java @@ -58,6 +58,7 @@ import static com.android.internal.accessibility.common.ShortcutConstants.UserSh import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.SOFTWARE; import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.TRIPLETAP; import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.TWOFINGER_DOUBLETAP; +import static com.android.internal.accessibility.dialog.AccessibilityButtonChooserActivity.EXTRA_TYPE_TO_CHOOSE; import static com.android.internal.accessibility.util.AccessibilityStatsLogUtils.logAccessibilityShortcutActivated; import static com.android.internal.accessibility.util.AccessibilityUtils.isUserSetupCompleted; import static com.android.internal.util.FunctionalUtils.ignoreRemoteException; @@ -1616,7 +1617,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub /** * Invoked remotely over AIDL by SysUi when the accessibility button within the system's - * navigation area has been clicked. + * navigation area has been clicked, or a gesture shortcut input has been performed. * * @param displayId The logical display id. * @param targetName The flattened {@link ComponentName} string or the class name of a system @@ -1646,7 +1647,26 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub } mMainHandler.sendMessage(obtainMessage( AccessibilityManagerService::performAccessibilityShortcutInternal, this, - displayId, SOFTWARE, targetName)); + displayId, getShortcutTypeForGenericShortcutCalls(currentUserId), targetName)); + } + + /** + * AIDL-exposed method to show the dialog + * for choosing the target for the gesture or button shortcuts. + * The shortcut is determined by the current navigation mode. + * + * @param displayId The id for the display to show the dialog on. + */ + @Override + @EnforcePermission(STATUS_BAR_SERVICE) + public void notifyAccessibilityButtonLongClicked(int displayId) { + notifyAccessibilityButtonLongClicked_enforcePermission(); + int userId; + synchronized (mLock) { + userId = mCurrentUserId; + } + showAccessibilityTargetsSelection(displayId, + getShortcutTypeForGenericShortcutCalls(userId), userId); } /** @@ -2344,16 +2364,18 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub } } - private void showAccessibilityTargetsSelection(int displayId, - @UserShortcutType int shortcutType) { + private void showAccessibilityTargetsSelection(int displayId, int shortcutType, + int userId) { final Intent intent = new Intent(AccessibilityManager.ACTION_CHOOSE_ACCESSIBILITY_BUTTON); final String chooserClassName = (shortcutType == HARDWARE) ? AccessibilityShortcutChooserActivity.class.getName() : AccessibilityButtonChooserActivity.class.getName(); intent.setClassName(CHOOSER_PACKAGE_NAME, chooserClassName); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); + intent.putExtra(EXTRA_TYPE_TO_CHOOSE, shortcutType); final Bundle bundle = ActivityOptions.makeBasic().setLaunchDisplayId(displayId).toBundle(); - mContext.startActivityAsUser(intent, bundle, UserHandle.of(mCurrentUserId)); + mMainHandler.post(() -> + mContext.startActivityAsUser(intent, bundle, UserHandle.of(userId))); } private void launchShortcutTargetActivity(int displayId, ComponentName name) { @@ -4011,7 +4033,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub * Perform the accessibility shortcut action. * * @param shortcutType The shortcut type. - * @param displayId The display id of the accessibility button. + * @param displayId The display id the shortcut is being performed from. * @param targetName The flattened {@link ComponentName} string or the class name of a system * class implementing a supported accessibility feature, or {@code null} if there's no * specified target. @@ -4031,7 +4053,8 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub if (targetName == null) { // In case there are many targets assigned to the given shortcut. if (shortcutTargets.size() > 1) { - showAccessibilityTargetsSelection(displayId, shortcutType); + showAccessibilityTargetsSelection( + displayId, shortcutType, getCurrentUserState().mUserId); return; } targetName = shortcutTargets.get(0); @@ -6563,6 +6586,18 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub callback)); } + @VisibleForTesting + int getShortcutTypeForGenericShortcutCalls(int userId) { + int navigationMode = Settings.Secure.getIntForUser( + mContext.getContentResolver(), + Settings.Secure.NAVIGATION_MODE, -1, userId); + if (android.provider.Flags.a11yStandaloneGestureEnabled()) { + return (navigationMode == NAV_BAR_MODE_GESTURAL) ? GESTURE : SOFTWARE; + } else { + return SOFTWARE; + } + } + void attachAccessibilityOverlayToDisplayInternal( int interactionId, int displayId, diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityUserState.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityUserState.java index b18e6ba8444d..0bf7ec001d4d 100644 --- a/services/accessibility/java/com/android/server/accessibility/AccessibilityUserState.java +++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityUserState.java @@ -57,6 +57,7 @@ import android.view.accessibility.IAccessibilityManagerClient; import com.android.internal.R; import com.android.internal.accessibility.AccessibilityShortcutController; +import com.android.internal.accessibility.common.ShortcutConstants; import com.android.internal.accessibility.util.ShortcutUtils; import java.io.FileDescriptor; @@ -707,11 +708,16 @@ class AccessibilityUserState { } /** - * Returns true if navibar magnification or shortcut key magnification is enabled. + * Returns true if a magnification shortcut of any type is enabled. */ public boolean isShortcutMagnificationEnabledLocked() { - return mAccessibilityShortcutKeyTargets.contains(MAGNIFICATION_CONTROLLER_NAME) - || mAccessibilityButtonTargets.contains(MAGNIFICATION_CONTROLLER_NAME); + for (int shortcutType : ShortcutConstants.USER_SHORTCUT_TYPES) { + if (getShortcutTargetsInternalLocked(shortcutType) + .contains(MAGNIFICATION_CONTROLLER_NAME)) { + return true; + } + } + return false; } /** diff --git a/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityManagerServiceTest.java index 2e6c93cb92aa..566feb7e3d80 100644 --- a/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityManagerServiceTest.java @@ -35,6 +35,7 @@ import static com.android.internal.accessibility.common.ShortcutConstants.UserSh import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.HARDWARE; import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.QUICK_SETTINGS; import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.SOFTWARE; +import static com.android.internal.accessibility.dialog.AccessibilityButtonChooserActivity.EXTRA_TYPE_TO_CHOOSE; import static com.android.server.accessibility.AccessibilityManagerService.ACTION_LAUNCH_HEARING_DEVICES_DIALOG; import static com.android.window.flags.Flags.FLAG_ALWAYS_DRAW_MAGNIFICATION_FULLSCREEN_BORDER; @@ -2046,6 +2047,53 @@ public class AccessibilityManagerServiceTest { } @Test + public void showAccessibilityTargetSelection_navBarNavigationMode_softwareExtra() { + mFakePermissionEnforcer.grant(Manifest.permission.STATUS_BAR_SERVICE); + final AccessibilityUserState userState = new AccessibilityUserState( + UserHandle.USER_SYSTEM, mTestableContext, mA11yms); + mA11yms.mUserStates.put(UserHandle.USER_SYSTEM, userState); + Settings.Secure.putIntForUser(mTestableContext.getContentResolver(), + NAVIGATION_MODE, NAV_BAR_MODE_3BUTTON, userState.mUserId); + + mA11yms.notifyAccessibilityButtonLongClicked(Display.DEFAULT_DISPLAY); + mTestableLooper.processAllMessages(); + + assertStartActivityWithExpectedShortcutType(mTestableContext.getMockContext(), SOFTWARE); + } + + @Test + @DisableFlags(android.provider.Flags.FLAG_A11Y_STANDALONE_GESTURE_ENABLED) + public void showAccessibilityTargetSelection_gestureNavigationMode_softwareExtra() { + mFakePermissionEnforcer.grant(Manifest.permission.STATUS_BAR_SERVICE); + final AccessibilityUserState userState = new AccessibilityUserState( + UserHandle.USER_SYSTEM, mTestableContext, mA11yms); + mA11yms.mUserStates.put(UserHandle.USER_SYSTEM, userState); + Settings.Secure.putIntForUser(mTestableContext.getContentResolver(), + NAVIGATION_MODE, NAV_BAR_MODE_GESTURAL, userState.mUserId); + + mA11yms.notifyAccessibilityButtonLongClicked(Display.DEFAULT_DISPLAY); + mTestableLooper.processAllMessages(); + + assertStartActivityWithExpectedShortcutType(mTestableContext.getMockContext(), SOFTWARE); + } + + @Test + @EnableFlags(android.provider.Flags.FLAG_A11Y_STANDALONE_GESTURE_ENABLED) + public void showAccessibilityTargetSelection_gestureNavigationMode_gestureExtra() { + mFakePermissionEnforcer.grant(Manifest.permission.STATUS_BAR_SERVICE); + final AccessibilityUserState userState = new AccessibilityUserState( + UserHandle.USER_SYSTEM, mTestableContext, mA11yms); + mA11yms.mUserStates.put(UserHandle.USER_SYSTEM, userState); + Settings.Secure.putIntForUser(mTestableContext.getContentResolver(), + NAVIGATION_MODE, NAV_BAR_MODE_GESTURAL, userState.mUserId); + + mA11yms.notifyAccessibilityButtonLongClicked(Display.DEFAULT_DISPLAY); + mTestableLooper.processAllMessages(); + + assertStartActivityWithExpectedShortcutType(mTestableContext.getMockContext(), GESTURE); + } + + @Test public void registerUserInitializationCompleteCallback_isRegistered() { mA11yms.mUserInitializationCompleteCallbacks.clear(); @@ -2075,6 +2123,43 @@ public class AccessibilityManagerServiceTest { UserHandle.MIN_SECONDARY_USER_ID); } + @Test + @DisableFlags(android.provider.Flags.FLAG_A11Y_STANDALONE_GESTURE_ENABLED) + public void getShortcutTypeForGenericShortcutCalls_softwareType() { + final AccessibilityUserState userState = new AccessibilityUserState( + UserHandle.USER_SYSTEM, mTestableContext, mA11yms); + mA11yms.mUserStates.put(UserHandle.USER_SYSTEM, userState); + + assertThat(mA11yms.getShortcutTypeForGenericShortcutCalls(userState.mUserId)) + .isEqualTo(SOFTWARE); + } + + @Test + @EnableFlags(android.provider.Flags.FLAG_A11Y_STANDALONE_GESTURE_ENABLED) + public void getShortcutTypeForGenericShortcutCalls_gestureNavigationMode_gestureType() { + final AccessibilityUserState userState = new AccessibilityUserState( + UserHandle.USER_SYSTEM, mTestableContext, mA11yms); + mA11yms.mUserStates.put(UserHandle.USER_SYSTEM, userState); + Settings.Secure.putIntForUser(mTestableContext.getContentResolver(), + NAVIGATION_MODE, NAV_BAR_MODE_GESTURAL, userState.mUserId); + + assertThat(mA11yms.getShortcutTypeForGenericShortcutCalls(userState.mUserId)) + .isEqualTo(GESTURE); + } + + @Test + @EnableFlags(android.provider.Flags.FLAG_A11Y_STANDALONE_GESTURE_ENABLED) + public void getShortcutTypeForGenericShortcutCalls_buttonNavigationMode_softwareType() { + final AccessibilityUserState userState = new AccessibilityUserState( + UserHandle.USER_SYSTEM, mTestableContext, mA11yms); + mA11yms.mUserStates.put(UserHandle.USER_SYSTEM, userState); + Settings.Secure.putIntForUser(mTestableContext.getContentResolver(), + NAVIGATION_MODE, NAV_BAR_MODE_3BUTTON, userState.mUserId); + + assertThat(mA11yms.getShortcutTypeForGenericShortcutCalls(userState.mUserId)) + .isEqualTo(SOFTWARE); + } + private Set<String> readStringsFromSetting(String setting) { final Set<String> result = new ArraySet<>(); mA11yms.readColonDelimitedSettingToSet( @@ -2148,6 +2233,14 @@ public class AccessibilityManagerServiceTest { Intent.EXTRA_COMPONENT_NAME)).isEqualTo(componentName); } + private void assertStartActivityWithExpectedShortcutType(Context mockContext, + @UserShortcutType int shortcutType) { + verify(mockContext).startActivityAsUser(mIntentArgumentCaptor.capture(), + any(Bundle.class), any(UserHandle.class)); + assertThat(mIntentArgumentCaptor.getValue().getIntExtra( + EXTRA_TYPE_TO_CHOOSE, -1)).isEqualTo(shortcutType); + } + private void setupShortcutTargetServices() { setupShortcutTargetServices(mA11yms.getCurrentUserState()); } diff --git a/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityUserStateTest.java b/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityUserStateTest.java index 62fa95149067..627b5e39a20a 100644 --- a/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityUserStateTest.java +++ b/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityUserStateTest.java @@ -28,10 +28,13 @@ import static android.view.accessibility.AccessibilityManager.STATE_FLAG_ACCESSI import static android.view.accessibility.AccessibilityManager.STATE_FLAG_HIGH_TEXT_CONTRAST_ENABLED; import static android.view.accessibility.AccessibilityManager.STATE_FLAG_TOUCH_EXPLORATION_ENABLED; +import static com.android.internal.accessibility.AccessibilityShortcutController.MAGNIFICATION_CONTROLLER_NAME; import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.GESTURE; import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.HARDWARE; import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.QUICK_SETTINGS; import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.SOFTWARE; +import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.TRIPLETAP; +import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.TWOFINGER_DOUBLETAP; import static com.android.server.accessibility.AccessibilityUserState.doesShortcutTargetsStringContain; import static com.google.common.truth.Truth.assertThat; @@ -67,6 +70,8 @@ import androidx.test.InstrumentationRegistry; import com.android.internal.R; import com.android.internal.accessibility.AccessibilityShortcutController; +import com.android.internal.accessibility.common.ShortcutConstants; +import com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType; import com.android.internal.util.test.FakeSettingsProvider; import org.junit.After; @@ -504,6 +509,36 @@ public class AccessibilityUserStateTest { assertThat(actual).containsExactly(tileComponent, mMockServiceInfo); } + @Test + public void isShortcutMagnificationEnabledLocked_anyShortcutType_returnsTrue() { + // Clear every shortcut + for (int shortcutType : ShortcutConstants.USER_SHORTCUT_TYPES) { + setMagnificationForShortcutType(shortcutType, false); + } + // Check each shortcut individually + for (int shortcutType : ShortcutConstants.USER_SHORTCUT_TYPES) { + // Setup + setMagnificationForShortcutType(shortcutType, true); + + // Checking + assertThat(mUserState.getShortcutTargetsLocked(shortcutType)) + .containsExactly(MAGNIFICATION_CONTROLLER_NAME); + assertThat(mUserState.isShortcutMagnificationEnabledLocked()).isTrue(); + + // Cleanup + setMagnificationForShortcutType(shortcutType, false); + } + } + + @Test + public void isShortcutMagnificationEnabledLocked_noShortcutTypes_returnsFalse() { + // Clear every shortcut + for (int shortcutType : ShortcutConstants.USER_SHORTCUT_TYPES) { + setMagnificationForShortcutType(shortcutType, false); + } + assertThat(mUserState.isShortcutMagnificationEnabledLocked()).isFalse(); + } + private int getSecureIntForUser(String key, int userId) { return Settings.Secure.getIntForUser(mMockResolver, key, -1, userId); } @@ -511,4 +546,16 @@ public class AccessibilityUserStateTest { private void putSecureIntForUser(String key, int value, int userId) { Settings.Secure.putIntForUser(mMockResolver, key, value, userId); } + + private void setMagnificationForShortcutType( + @UserShortcutType int shortcutType, boolean enabled) { + if (shortcutType == TRIPLETAP) { + mUserState.setMagnificationSingleFingerTripleTapEnabledLocked(enabled); + } else if (shortcutType == TWOFINGER_DOUBLETAP) { + mUserState.setMagnificationTwoFingerTripleTapEnabledLocked(enabled); + } else { + mUserState.updateShortcutTargetsLocked( + enabled ? Set.of(MAGNIFICATION_CONTROLLER_NAME) : Set.of(), shortcutType); + } + } } |