diff options
5 files changed, 270 insertions, 249 deletions
diff --git a/core/java/com/android/internal/accessibility/util/ShortcutUtils.java b/core/java/com/android/internal/accessibility/util/ShortcutUtils.java index a7aef92b2f96..6b0ca9faa2a4 100644 --- a/core/java/com/android/internal/accessibility/util/ShortcutUtils.java +++ b/core/java/com/android/internal/accessibility/util/ShortcutUtils.java @@ -181,6 +181,27 @@ public final class ShortcutUtils { } /** + * Converts {@link Settings.Secure} key to {@link UserShortcutType}. + * + * @param key The shortcut key in Settings. + * @return The mapped type + */ + @UserShortcutType + public static int convertToType(String key) { + return switch (key) { + case Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS -> UserShortcutType.SOFTWARE; + case Settings.Secure.ACCESSIBILITY_QS_TARGETS -> UserShortcutType.QUICK_SETTINGS; + case Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE -> UserShortcutType.HARDWARE; + case Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED -> + UserShortcutType.TRIPLETAP; + case Settings.Secure.ACCESSIBILITY_MAGNIFICATION_TWO_FINGER_TRIPLE_TAP_ENABLED -> + UserShortcutType.TWOFINGER_DOUBLETAP; + default -> throw new IllegalArgumentException( + "Unsupported user shortcut key: " + key); + }; + } + + /** * Updates an accessibility state if the accessibility service is a Always-On a11y service, * a.k.a. AccessibilityServices that has FLAG_REQUEST_ACCESSIBILITY_BUTTON * <p> diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java index 4f9db8bece63..acd80eeac558 100644 --- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java +++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java @@ -47,6 +47,11 @@ import static com.android.internal.accessibility.AccessibilityShortcutController import static com.android.internal.accessibility.common.ShortcutConstants.CHOOSER_PACKAGE_NAME; import static com.android.internal.accessibility.common.ShortcutConstants.USER_SHORTCUT_TYPES; import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType; +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.internal.accessibility.util.AccessibilityStatsLogUtils.logAccessibilityShortcutActivated; import static com.android.internal.util.FunctionalUtils.ignoreRemoteException; import static com.android.internal.util.function.pooled.PooledLambda.obtainMessage; @@ -923,25 +928,11 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub newValue, restoredFromSdk); } } - case Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS -> { - synchronized (mLock) { - restoreAccessibilityButtonTargetsLocked( - previousValue, newValue); - } - } - case Settings.Secure.ACCESSIBILITY_QS_TARGETS -> { - if (!android.view.accessibility.Flags.a11yQsShortcut()) { - return; - } - restoreAccessibilityQsTargets(newValue); - } - case Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE -> { - if (!android.view.accessibility.Flags - .restoreA11yShortcutTargetService()) { - return; - } - restoreAccessibilityShortcutTargetService(previousValue, newValue); - } + case Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS, + Settings.Secure.ACCESSIBILITY_QS_TARGETS, + Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE -> + restoreShortcutTargets(newValue, + ShortcutUtils.convertToType(which)); } } } @@ -1040,7 +1031,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub } persistColonDelimitedSetToSettingLocked(Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS, userState.mUserId, targetsFromSetting, str -> str); - readAccessibilityButtonTargetsLocked(userState); + readAccessibilityShortcutTargetsLocked(userState, SOFTWARE); onUserStateChangedLocked(userState); } @@ -1720,12 +1711,12 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub } // Turn on/off a11y qs shortcut for the a11y features based on the change in QS Panel if (!a11yFeaturesToEnable.isEmpty()) { - enableShortcutForTargets(/* enable= */ true, UserShortcutType.QUICK_SETTINGS, + enableShortcutForTargets(/* enable= */ true, QUICK_SETTINGS, a11yFeaturesToEnable, userId); } if (!a11yFeaturesToRemove.isEmpty()) { - enableShortcutForTargets(/* enable= */ false, UserShortcutType.QUICK_SETTINGS, + enableShortcutForTargets(/* enable= */ false, QUICK_SETTINGS, a11yFeaturesToRemove, userId); } } @@ -2057,100 +2048,78 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub } /** - * User could enable accessibility services and configure accessibility button during the SUW. - * Merges current value of accessibility button settings into the restored one to make sure - * user's preferences of accessibility button updated in SUW are not lost. - * - * Called only during settings restore; currently supports only the owner user - * TODO: http://b/22388012 - */ - void restoreAccessibilityButtonTargetsLocked(String oldSetting, String newSetting) { - final Set<String> targetsFromSetting = new ArraySet<>(); - readColonDelimitedStringToSet(oldSetting, str -> str, targetsFromSetting, - /* doMerge = */false); - readColonDelimitedStringToSet(newSetting, str -> str, targetsFromSetting, - /* doMerge = */true); - - final AccessibilityUserState userState = getUserStateLocked(UserHandle.USER_SYSTEM); - userState.mAccessibilityButtonTargets.clear(); - userState.mAccessibilityButtonTargets.addAll(targetsFromSetting); - persistColonDelimitedSetToSettingLocked(Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS, - UserHandle.USER_SYSTEM, userState.mAccessibilityButtonTargets, str -> str); - - scheduleNotifyClientsOfServicesStateChangeLocked(userState); - onUserStateChangedLocked(userState); - } - - /** * User could configure accessibility shortcut during the SUW before restoring user data. * Merges the current value and the new value to make sure we don't lost the setting the user's - * preferences of accessibility qs shortcut updated in SUW are not lost. - * - * Called only during settings restore; currently supports only the owner user + * preferences of accessibility shortcut updated in SUW are not lost. + * Called only during settings restore; currently supports only the owner user. + * <P> + * Throws an exception if used with {@code TRIPLETAP} or {@code TWOFINGER_DOUBLETAP}. + * </P> * TODO: http://b/22388012 */ - private void restoreAccessibilityQsTargets(String newValue) { + private void restoreShortcutTargets(String newValue, + @UserShortcutType int shortcutType) { + assertNoTapShortcut(shortcutType); + if (shortcutType == QUICK_SETTINGS && !android.view.accessibility.Flags.a11yQsShortcut()) { + return; + } + if (shortcutType == HARDWARE + && !android.view.accessibility.Flags.restoreA11yShortcutTargetService()) { + return; + } + synchronized (mLock) { final AccessibilityUserState userState = getUserStateLocked(UserHandle.USER_SYSTEM); - final Set<String> mergedTargets = userState.getA11yQsTargets(); - readColonDelimitedStringToSet(newValue, str -> str, mergedTargets, - /* doMerge = */ true); + final Set<String> mergedTargets = (shortcutType == HARDWARE) + ? new ArraySet<>(ShortcutUtils.getShortcutTargetsFromSettings( + mContext, shortcutType, userState.mUserId)) + : userState.getShortcutTargetsLocked(shortcutType); + + // If dealing with the hardware shortcut, + // remove the default service if it wasn't present before restore, + // but only if the raw shortcut setting is not null (edge case during SUW). + // Otherwise, merge the old and new targets normally. + if (Flags.clearDefaultFromA11yShortcutTargetServiceRestore() + && shortcutType == HARDWARE) { + final String defaultService = + mContext.getString(R.string.config_defaultAccessibilityService); + final ComponentName defaultServiceComponent = TextUtils.isEmpty(defaultService) + ? null : ComponentName.unflattenFromString(defaultService); + boolean shouldClearDefaultService = defaultServiceComponent != null + && !stringSetContainsComponentName(mergedTargets, defaultServiceComponent); + readColonDelimitedStringToSet(newValue, str -> str, + mergedTargets, /*doMerge=*/true); + + if (shouldClearDefaultService && stringSetContainsComponentName( + mergedTargets, defaultServiceComponent)) { + Slog.i(LOG_TAG, "Removing default service " + defaultService + + " from restore of " + + Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE); + mergedTargets.removeIf(str -> + defaultServiceComponent.equals(ComponentName.unflattenFromString(str))); + } + if (mergedTargets.isEmpty()) { + return; + } + } else { + readColonDelimitedStringToSet(newValue, str -> str, mergedTargets, + /* doMerge = */ true); + } - userState.updateA11yQsTargetLocked(mergedTargets); - persistColonDelimitedSetToSettingLocked(Settings.Secure.ACCESSIBILITY_QS_TARGETS, + userState.updateShortcutTargetsLocked(mergedTargets, shortcutType); + persistColonDelimitedSetToSettingLocked(ShortcutUtils.convertToKey(shortcutType), UserHandle.USER_SYSTEM, mergedTargets, str -> str); scheduleNotifyClientsOfServicesStateChangeLocked(userState); onUserStateChangedLocked(userState); } } - /** - * Merges the old and restored value of - * {@link Settings.Secure#ACCESSIBILITY_SHORTCUT_TARGET_SERVICE}. - * - * <p>Also clears out {@link R.string#config_defaultAccessibilityService} from - * the merged set if it was not present before restoring. - */ - private void restoreAccessibilityShortcutTargetService( - String oldValue, String restoredValue) { - final Set<String> targetsFromSetting = new ArraySet<>(); - readColonDelimitedStringToSet(oldValue, str -> str, - targetsFromSetting, /*doMerge=*/false); - final String defaultService = - mContext.getString(R.string.config_defaultAccessibilityService); - final ComponentName defaultServiceComponent = TextUtils.isEmpty(defaultService) - ? null : ComponentName.unflattenFromString(defaultService); - boolean shouldClearDefaultService = defaultServiceComponent != null - && !stringSetContainsComponentName(targetsFromSetting, defaultServiceComponent); - readColonDelimitedStringToSet(restoredValue, str -> str, - targetsFromSetting, /*doMerge=*/true); - if (Flags.clearDefaultFromA11yShortcutTargetServiceRestore()) { - if (shouldClearDefaultService && stringSetContainsComponentName( - targetsFromSetting, defaultServiceComponent)) { - Slog.i(LOG_TAG, "Removing default service " + defaultService - + " from restore of " - + Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE); - targetsFromSetting.removeIf(str -> - defaultServiceComponent.equals(ComponentName.unflattenFromString(str))); - } - if (targetsFromSetting.isEmpty()) { - return; - } - } - synchronized (mLock) { - final AccessibilityUserState userState = getUserStateLocked(UserHandle.USER_SYSTEM); - final Set<String> shortcutTargets = - userState.getShortcutTargetsLocked(UserShortcutType.HARDWARE); - shortcutTargets.clear(); - shortcutTargets.addAll(targetsFromSetting); - persistColonDelimitedSetToSettingLocked( - Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE, - UserHandle.USER_SYSTEM, targetsFromSetting, str -> str); - scheduleNotifyClientsOfServicesStateChangeLocked(userState); - onUserStateChangedLocked(userState); - } + private String getRawShortcutSetting(int userId, @UserShortcutType int shortcutType) { + return Settings.Secure.getStringForUser(mContext.getContentResolver(), + ShortcutUtils.convertToKey(shortcutType), userId); } + /** * Returns {@code true} if the set contains the provided non-null {@link ComponentName}. * @@ -2263,7 +2232,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub private void showAccessibilityTargetsSelection(int displayId, @UserShortcutType int shortcutType) { final Intent intent = new Intent(AccessibilityManager.ACTION_CHOOSE_ACCESSIBILITY_BUTTON); - final String chooserClassName = (shortcutType == UserShortcutType.HARDWARE) + final String chooserClassName = (shortcutType == HARDWARE) ? AccessibilityShortcutChooserActivity.class.getName() : AccessibilityButtonChooserActivity.class.getName(); intent.setClassName(CHOOSER_PACKAGE_NAME, chooserClassName); @@ -3236,9 +3205,9 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub somethingChanged |= readAudioDescriptionEnabledSettingLocked(userState); somethingChanged |= readMagnificationEnabledSettingsLocked(userState); somethingChanged |= readAutoclickEnabledSettingLocked(userState); - somethingChanged |= readAccessibilityShortcutKeySettingLocked(userState); - somethingChanged |= readAccessibilityQsTargetsLocked(userState); - somethingChanged |= readAccessibilityButtonTargetsLocked(userState); + somethingChanged |= readAccessibilityShortcutTargetsLocked(userState, HARDWARE); + somethingChanged |= readAccessibilityShortcutTargetsLocked(userState, QUICK_SETTINGS); + somethingChanged |= readAccessibilityShortcutTargetsLocked(userState, SOFTWARE); somethingChanged |= readAccessibilityButtonTargetComponentLocked(userState); somethingChanged |= readUserRecommendedUiTimeoutSettingsLocked(userState); somethingChanged |= readMagnificationModeForDefaultDisplayLocked(userState); @@ -3386,60 +3355,34 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub userState.setSendMotionEventsEnabled(sendMotionEvents); } - private boolean readAccessibilityShortcutKeySettingLocked(AccessibilityUserState userState) { - final String settingValue = Settings.Secure.getStringForUser(mContext.getContentResolver(), - Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE, userState.mUserId); + /** + * Throws an exception for {@code TRIPLETAP} or {@code TWOFINGER_DOUBLETAP} types. + */ + private boolean readAccessibilityShortcutTargetsLocked(AccessibilityUserState userState, + @UserShortcutType int shortcutType) { + assertNoTapShortcut(shortcutType); + final String settingValue = getRawShortcutSetting(userState.mUserId, shortcutType); final Set<String> targetsFromSetting = new ArraySet<>(); - readColonDelimitedStringToSet(settingValue, str -> str, targetsFromSetting, false); - // Fall back to device's default a11y service, only when setting is never updated. - if (settingValue == null) { + // If dealing with an empty hardware shortcut, fall back to the default value. + if (shortcutType == HARDWARE && settingValue == null) { final String defaultService = mContext.getString( R.string.config_defaultAccessibilityService); if (!TextUtils.isEmpty(defaultService)) { - targetsFromSetting.add(defaultService); + // Convert to component name to reformat the target if it has a relative path. + ComponentName name = ComponentName.unflattenFromString(defaultService); + if (name != null) { + targetsFromSetting.add(name.flattenToString()); + } } + } else { + readColonDelimitedStringToSet(settingValue, str -> str, targetsFromSetting, false); } - final Set<String> currentTargets = - userState.getShortcutTargetsLocked(UserShortcutType.HARDWARE); - if (targetsFromSetting.equals(currentTargets)) { - return false; - } - currentTargets.clear(); - currentTargets.addAll(targetsFromSetting); - scheduleNotifyClientsOfServicesStateChangeLocked(userState); - return true; - } - - private boolean readAccessibilityQsTargetsLocked(AccessibilityUserState userState) { - final Set<String> targetsFromSetting = new ArraySet<>(); - readColonDelimitedSettingToSet(Settings.Secure.ACCESSIBILITY_QS_TARGETS, - userState.mUserId, str -> str, targetsFromSetting); - - final Set<String> currentTargets = - userState.getShortcutTargetsLocked(UserShortcutType.QUICK_SETTINGS); - if (targetsFromSetting.equals(currentTargets)) { - return false; - } - userState.updateA11yQsTargetLocked(targetsFromSetting); - scheduleNotifyClientsOfServicesStateChangeLocked(userState); - return true; - } - - private boolean readAccessibilityButtonTargetsLocked(AccessibilityUserState userState) { - final Set<String> targetsFromSetting = new ArraySet<>(); - readColonDelimitedSettingToSet(Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS, - userState.mUserId, str -> str, targetsFromSetting); - - final Set<String> currentTargets = - userState.getShortcutTargetsLocked(UserShortcutType.SOFTWARE); - if (targetsFromSetting.equals(currentTargets)) { - return false; + if (userState.updateShortcutTargetsLocked(targetsFromSetting, shortcutType)) { + scheduleNotifyClientsOfServicesStateChangeLocked(userState); + return true; } - currentTargets.clear(); - currentTargets.addAll(targetsFromSetting); - scheduleNotifyClientsOfServicesStateChangeLocked(userState); - return true; + return false; } private boolean readAccessibilityButtonTargetComponentLocked(AccessibilityUserState userState) { @@ -3487,14 +3430,10 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub */ private void updateAccessibilityShortcutKeyTargetsLocked(AccessibilityUserState userState) { final Set<String> currentTargets = - userState.getShortcutTargetsLocked(UserShortcutType.HARDWARE); - final int lastSize = currentTargets.size(); - if (lastSize == 0) { - return; - } + userState.getShortcutTargetsLocked(HARDWARE); currentTargets.removeIf( name -> !userState.isShortcutTargetInstalledLocked(name)); - if (lastSize == currentTargets.size()) { + if (!userState.updateShortcutTargetsLocked(currentTargets, HARDWARE)) { return; } @@ -3680,13 +3619,9 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub final Set<String> currentTargets = userState.getShortcutTargetsLocked(UserShortcutType.SOFTWARE); - final int lastSize = currentTargets.size(); - if (lastSize == 0) { - return; - } currentTargets.removeIf( name -> !userState.isShortcutTargetInstalledLocked(name)); - if (lastSize == currentTargets.size()) { + if (!userState.updateShortcutTargetsLocked(currentTargets, SOFTWARE)) { return; } @@ -3719,8 +3654,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub return; } final Set<String> buttonTargets = - userState.getShortcutTargetsLocked(UserShortcutType.SOFTWARE); - int lastSize = buttonTargets.size(); + userState.getShortcutTargetsLocked(SOFTWARE); buttonTargets.removeIf(name -> { if (packageName != null && name != null && !name.contains(packageName)) { return false; @@ -3752,13 +3686,11 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub } return false; }); - boolean changed = (lastSize != buttonTargets.size()); - lastSize = buttonTargets.size(); final Set<String> shortcutKeyTargets = - userState.getShortcutTargetsLocked(UserShortcutType.HARDWARE); + userState.getShortcutTargetsLocked(HARDWARE); final Set<String> qsShortcutTargets = - userState.getShortcutTargetsLocked(UserShortcutType.QUICK_SETTINGS); + userState.getShortcutTargetsLocked(QUICK_SETTINGS); userState.mEnabledServices.forEach(componentName -> { if (packageName != null && componentName != null && !packageName.equals(componentName.getPackageName())) { @@ -3790,8 +3722,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub + " should be assign to the button or shortcut."); buttonTargets.add(serviceName); }); - changed |= (lastSize != buttonTargets.size()); - if (!changed) { + if (!userState.updateShortcutTargetsLocked(buttonTargets, SOFTWARE)) { return; } @@ -3815,10 +3746,10 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub } final Set<String> targets = - userState.getShortcutTargetsLocked(UserShortcutType.QUICK_SETTINGS); + userState.getShortcutTargetsLocked(QUICK_SETTINGS); // Removes the targets that are no longer installed on the device. - boolean somethingChanged = targets.removeIf( + targets.removeIf( name -> !userState.isShortcutTargetInstalledLocked(name)); // Add the target if the a11y service is enabled and the tile exist in QS panel Set<ComponentName> enabledServices = userState.getEnabledServicesLocked(); @@ -3829,14 +3760,13 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub ComponentName tileService = a11yFeatureToTileService.getOrDefault(enabledService, null); if (tileService != null && currentA11yTilesInQsPanel.contains(tileService)) { - somethingChanged |= targets.add(enabledService.flattenToString()); + targets.add(enabledService.flattenToString()); } } - if (!somethingChanged) { + if (!userState.updateShortcutTargetsLocked(targets, QUICK_SETTINGS)) { return; } - userState.updateA11yQsTargetLocked(targets); // Update setting key with new value. persistColonDelimitedSetToSettingLocked( @@ -3862,14 +3792,14 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub final List<Pair<Integer, String>> shortcutTypeAndShortcutSetting = new ArrayList<>(3); shortcutTypeAndShortcutSetting.add( - new Pair<>(UserShortcutType.HARDWARE, + new Pair<>(HARDWARE, Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE)); shortcutTypeAndShortcutSetting.add( new Pair<>(UserShortcutType.SOFTWARE, Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS)); if (android.view.accessibility.Flags.a11yQsShortcut()) { shortcutTypeAndShortcutSetting.add( - new Pair<>(UserShortcutType.QUICK_SETTINGS, + new Pair<>(QUICK_SETTINGS, Settings.Secure.ACCESSIBILITY_QS_TARGETS)); } @@ -3883,7 +3813,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub shortcutSettingName, userState.mUserId, currentTargets, str -> str); - if (shortcutType != UserShortcutType.QUICK_SETTINGS) { + if (shortcutType != QUICK_SETTINGS) { continue; } @@ -3968,7 +3898,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub mMainHandler.sendMessage(obtainMessage( AccessibilityManagerService::performAccessibilityShortcutInternal, this, - Display.DEFAULT_DISPLAY, UserShortcutType.HARDWARE, targetName)); + Display.DEFAULT_DISPLAY, HARDWARE, targetName)); } /** @@ -4115,7 +4045,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub final boolean requestA11yButton = (installedServiceInfo.flags & FLAG_REQUEST_ACCESSIBILITY_BUTTON) != 0; // Turns on / off the accessibility service - if ((targetSdk <= Build.VERSION_CODES.Q && shortcutType == UserShortcutType.HARDWARE) + if ((targetSdk <= Build.VERSION_CODES.Q && shortcutType == HARDWARE) || (targetSdk > Build.VERSION_CODES.Q && !requestA11yButton)) { if (serviceConnection == null) { logAccessibilityShortcutActivated(mContext, assignedTarget, shortcutType, @@ -4129,7 +4059,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub } return true; } - if (shortcutType == UserShortcutType.HARDWARE && targetSdk > Build.VERSION_CODES.Q + if (shortcutType == HARDWARE && targetSdk > Build.VERSION_CODES.Q && requestA11yButton) { if (!userState.getEnabledServicesLocked().contains(assignedTarget)) { enableAccessibilityServiceLocked(assignedTarget, mCurrentUserId); @@ -4222,7 +4152,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub validNewTargets = newTargets; // filter out targets that doesn't have qs shortcut - if (shortcutType == UserShortcutType.QUICK_SETTINGS) { + if (shortcutType == QUICK_SETTINGS) { validNewTargets = newTargets.stream().filter(target -> { ComponentName targetComponent = ComponentName.unflattenFromString(target); return featureToTileMap.containsKey(targetComponent); @@ -4240,10 +4170,10 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub /* defaultEmptyString= */ "" ); - if (shortcutType == UserShortcutType.QUICK_SETTINGS) { + if (shortcutType == QUICK_SETTINGS) { int numOfFeatureChanged = Math.abs(currentTargets.size() - validNewTargets.size()); logMetricForQsShortcutConfiguration(enable, numOfFeatureChanged); - userState.updateA11yQsTargetLocked(validNewTargets); + userState.updateShortcutTargetsLocked(validNewTargets, QUICK_SETTINGS); scheduleNotifyClientsOfServicesStateChangeLocked(userState); onUserStateChangedLocked(userState); } @@ -4257,7 +4187,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub } // Add or Remove tile in QS Panel - if (shortcutType == UserShortcutType.QUICK_SETTINGS) { + if (shortcutType == QUICK_SETTINGS) { mMainHandler.sendMessage(obtainMessage( AccessibilityManagerService::updateA11yTileServicesInQuickSettingsPanel, this, validNewTargets, currentTargets, userId)); @@ -4266,7 +4196,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub if (!enable) { return; } - if (shortcutType == UserShortcutType.HARDWARE) { + if (shortcutType == HARDWARE) { skipVolumeShortcutDialogTimeoutRestriction(userId); if (com.android.server.accessibility.Flags.enableHardwareShortcutDisablesWarning()) { persistIntToSetting( @@ -4461,6 +4391,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub shortcutTargets.add(serviceName); } } + userState.updateShortcutTargetsLocked(Set.copyOf(shortcutTargets), shortcutType); return shortcutTargets; } } @@ -5672,7 +5603,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub || mShowImeWithHardKeyboardUri.equals(uri)) { userState.reconcileSoftKeyboardModeWithSettingsLocked(); } else if (mAccessibilityShortcutServiceIdUri.equals(uri)) { - if (readAccessibilityShortcutKeySettingLocked(userState)) { + if (readAccessibilityShortcutTargetsLocked(userState, HARDWARE)) { onUserStateChangedLocked(userState); } } else if (mAccessibilityButtonComponentIdUri.equals(uri)) { @@ -5680,7 +5611,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub onUserStateChangedLocked(userState); } } else if (mAccessibilityButtonTargetsUri.equals(uri)) { - if (readAccessibilityButtonTargetsLocked(userState)) { + if (readAccessibilityShortcutTargetsLocked(userState, SOFTWARE)) { onUserStateChangedLocked(userState); } } else if (mUserNonInteractiveUiTimeoutUri.equals(uri) @@ -6505,4 +6436,10 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub String metricId = enable ? METRIC_ID_QS_SHORTCUT_ADD : METRIC_ID_QS_SHORTCUT_REMOVE; Counter.logIncrementWithUid(metricId, Binder.getCallingUid(), numOfFeatures); } + + private void assertNoTapShortcut(@UserShortcutType int shortcutType) { + if ((shortcutType & (TRIPLETAP | TWOFINGER_DOUBLETAP)) != 0) { + throw new IllegalArgumentException("Tap shortcuts are not supported."); + } + } } diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityUserState.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityUserState.java index a37a1841fcc0..de1c86a1ac06 100644 --- a/services/accessibility/java/com/android/server/accessibility/AccessibilityUserState.java +++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityUserState.java @@ -777,12 +777,15 @@ class AccessibilityUserState { * @return The array set of the strings */ public ArraySet<String> getShortcutTargetsLocked(@UserShortcutType int shortcutType) { + return new ArraySet<>(getShortcutTargetsInternalLocked(shortcutType)); + } + private ArraySet<String> getShortcutTargetsInternalLocked(@UserShortcutType int shortcutType) { if (shortcutType == UserShortcutType.HARDWARE) { return mAccessibilityShortcutKeyTargets; } else if (shortcutType == UserShortcutType.SOFTWARE) { return mAccessibilityButtonTargets; } else if (shortcutType == UserShortcutType.QUICK_SETTINGS) { - return getA11yQsTargets(); + return mAccessibilityQsTargets; } else if ((shortcutType == UserShortcutType.TRIPLETAP && isMagnificationSingleFingerTripleTapEnabledLocked()) || ( shortcutType == UserShortcutType.TWOFINGER_DOUBLETAP @@ -795,6 +798,32 @@ class AccessibilityUserState { } /** + * Updates the corresponding shortcut targets with the provided set. + * Tap shortcuts don't operate using sets of targets, + * so trying to update {@code TRIPLETAP} or {@code TWOFINGER_DOUBLETAP} + * will instead throw an {@code IllegalArgumentException} + * @param newTargets set of targets to replace the existing set. + * @param shortcutType type to be replaced. + * @return {@code true} if the set was changed, or {@code false} if the elements are the same. + * @throws IllegalArgumentException if {@code TRIPLETAP} or {@code TWOFINGER_DOUBLETAP} is used. + */ + boolean updateShortcutTargetsLocked( + Set<String> newTargets, @UserShortcutType int shortcutType) { + final int mask = UserShortcutType.TRIPLETAP | UserShortcutType.TWOFINGER_DOUBLETAP; + if ((shortcutType & mask) != 0) { + throw new IllegalArgumentException("Tap shortcuts cannot be updated with target sets."); + } + + final Set<String> currentTargets = getShortcutTargetsInternalLocked(shortcutType); + if (newTargets.equals(currentTargets)) { + return false; + } + currentTargets.clear(); + currentTargets.addAll(newTargets); + return true; + } + + /** * Whether or not the given shortcut target is installed in device. * * @param name The shortcut target name @@ -844,8 +873,9 @@ class AccessibilityUserState { ); } - Set<String> targets = getShortcutTargetsLocked(shortcutType); - boolean result = targets.removeIf(name -> { + // getting internal set lets us directly modify targets, as it's not a copy. + Set<String> targets = getShortcutTargetsInternalLocked(shortcutType); + return targets.removeIf(name -> { ComponentName componentName; if (name == null || (componentName = ComponentName.unflattenFromString(name)) == null) { @@ -853,11 +883,6 @@ class AccessibilityUserState { } return componentName.equals(target); }); - if (shortcutType == UserShortcutType.QUICK_SETTINGS) { - updateA11yQsTargetLocked(targets); - } - - return result; } /** @@ -1114,11 +1139,6 @@ class AccessibilityUserState { ); } - public void updateA11yQsTargetLocked(Set<String> targets) { - mAccessibilityQsTargets.clear(); - mAccessibilityQsTargets.addAll(targets); - } - /** * Returns a copy of the targets which has qs shortcut turned on */ 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 4e8c75559f3b..9884085cc3f7 100644 --- a/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityManagerServiceTest.java @@ -25,6 +25,8 @@ import static android.view.accessibility.Flags.FLAG_SKIP_ACCESSIBILITY_WARNING_D import static com.android.internal.accessibility.AccessibilityShortcutController.ACCESSIBILITY_HEARING_AIDS_COMPONENT_NAME; import static com.android.internal.accessibility.AccessibilityShortcutController.MAGNIFICATION_CONTROLLER_NAME; +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.server.accessibility.AccessibilityManagerService.ACTION_LAUNCH_HEARING_DEVICES_DIALOG; import static com.android.window.flags.Flags.FLAG_ALWAYS_DRAW_MAGNIFICATION_FULLSCREEN_BORDER; @@ -1082,7 +1084,7 @@ public class AccessibilityManagerServiceTest { mA11yms.enableShortcutsForTargets( /* enable= */ true, - UserShortcutType.HARDWARE, + HARDWARE, List.of(target), mA11yms.getCurrentUserIdLocked()); mTestableLooper.processAllMessages(); @@ -1346,14 +1348,14 @@ public class AccessibilityManagerServiceTest { mA11yms.enableShortcutsForTargets( /* enable= */ true, - UserShortcutType.HARDWARE, + HARDWARE, List.of(TARGET_STANDARD_A11Y_SERVICE.flattenToString()), mA11yms.getCurrentUserIdLocked()); mTestableLooper.processAllMessages(); assertThat( ShortcutUtils.isComponentIdExistingInSettings( - mTestableContext, ShortcutConstants.UserShortcutType.HARDWARE, + mTestableContext, HARDWARE, TARGET_STANDARD_A11Y_SERVICE.flattenToString()) ).isTrue(); } @@ -1367,7 +1369,7 @@ public class AccessibilityManagerServiceTest { mA11yms.enableShortcutsForTargets( /* enable= */ false, - UserShortcutType.HARDWARE, + HARDWARE, List.of(TARGET_STANDARD_A11Y_SERVICE.flattenToString()), mA11yms.getCurrentUserIdLocked()); mTestableLooper.processAllMessages(); @@ -1375,7 +1377,7 @@ public class AccessibilityManagerServiceTest { assertThat( ShortcutUtils.isComponentIdExistingInSettings( mTestableContext, - ShortcutConstants.UserShortcutType.HARDWARE, + HARDWARE, TARGET_STANDARD_A11Y_SERVICE.flattenToString())) .isFalse(); } @@ -1390,14 +1392,14 @@ public class AccessibilityManagerServiceTest { mA11yms.enableShortcutsForTargets( /* enable= */ true, - UserShortcutType.QUICK_SETTINGS, + QUICK_SETTINGS, List.of(TARGET_ALWAYS_ON_A11Y_SERVICE.flattenToString()), mA11yms.getCurrentUserIdLocked()); mTestableLooper.processAllMessages(); assertThat( ShortcutUtils.isComponentIdExistingInSettings( - mTestableContext, UserShortcutType.QUICK_SETTINGS, + mTestableContext, QUICK_SETTINGS, TARGET_ALWAYS_ON_A11Y_SERVICE.flattenToString()) ).isTrue(); verify(mStatusBarManagerInternal) @@ -1417,14 +1419,14 @@ public class AccessibilityManagerServiceTest { mA11yms.enableShortcutsForTargets( /* enable= */ false, - UserShortcutType.QUICK_SETTINGS, + QUICK_SETTINGS, List.of(TARGET_ALWAYS_ON_A11Y_SERVICE.flattenToString()), mA11yms.getCurrentUserIdLocked()); mTestableLooper.processAllMessages(); assertThat( ShortcutUtils.isComponentIdExistingInSettings( - mTestableContext, UserShortcutType.QUICK_SETTINGS, + mTestableContext, QUICK_SETTINGS, TARGET_ALWAYS_ON_A11Y_SERVICE.flattenToString()) ).isFalse(); verify(mStatusBarManagerInternal) @@ -1614,44 +1616,49 @@ public class AccessibilityManagerServiceTest { @Test @EnableFlags(android.view.accessibility.Flags.FLAG_A11Y_QS_SHORTCUT) - public void restoreAccessibilityQsTargets_a11yQsTargetsRestored() { + public void restoreShortcutTargets_qs_a11yQsTargetsRestored() { String daltonizerTile = AccessibilityShortcutController.DALTONIZER_COMPONENT_NAME.flattenToString(); String colorInversionTile = AccessibilityShortcutController.COLOR_INVERSION_COMPONENT_NAME.flattenToString(); final AccessibilityUserState userState = new AccessibilityUserState( UserHandle.USER_SYSTEM, mTestableContext, mA11yms); - userState.updateA11yQsTargetLocked(Set.of(daltonizerTile)); + userState.updateShortcutTargetsLocked(Set.of(daltonizerTile), QUICK_SETTINGS); mA11yms.mUserStates.put(UserHandle.USER_SYSTEM, userState); broadcastSettingRestored( - Settings.Secure.ACCESSIBILITY_QS_TARGETS, - /*previousValue=*/null, + ShortcutUtils.convertToKey(QUICK_SETTINGS), /*newValue=*/colorInversionTile); - assertThat(mA11yms.mUserStates.get(UserHandle.USER_SYSTEM).getA11yQsTargets()) - .containsExactlyElementsIn(Set.of(daltonizerTile, colorInversionTile)); + Set<String> expected = Set.of(daltonizerTile, colorInversionTile); + assertThat(readStringsFromSetting(ShortcutUtils.convertToKey(QUICK_SETTINGS))) + .containsExactlyElementsIn(expected); + assertThat(userState.getShortcutTargetsLocked(QUICK_SETTINGS)) + .containsExactlyElementsIn(expected); } @Test @DisableFlags(android.view.accessibility.Flags.FLAG_A11Y_QS_SHORTCUT) - public void restoreAccessibilityQsTargets_a11yQsTargetsNotRestored() { + public void restoreShortcutTargets_qs_a11yQsTargetsNotRestored() { String daltonizerTile = AccessibilityShortcutController.DALTONIZER_COMPONENT_NAME.flattenToString(); String colorInversionTile = AccessibilityShortcutController.COLOR_INVERSION_COMPONENT_NAME.flattenToString(); final AccessibilityUserState userState = new AccessibilityUserState( UserHandle.USER_SYSTEM, mTestableContext, mA11yms); - userState.updateA11yQsTargetLocked(Set.of(daltonizerTile)); + userState.updateShortcutTargetsLocked(Set.of(daltonizerTile), QUICK_SETTINGS); + putShortcutSettingForUser(QUICK_SETTINGS, daltonizerTile, userState.mUserId); mA11yms.mUserStates.put(UserHandle.USER_SYSTEM, userState); broadcastSettingRestored( - Settings.Secure.ACCESSIBILITY_QS_TARGETS, - /*previousValue=*/null, + ShortcutUtils.convertToKey(QUICK_SETTINGS), /*newValue=*/colorInversionTile); - assertThat(userState.getA11yQsTargets()) - .containsExactlyElementsIn(Set.of(daltonizerTile)); + Set<String> expected = Set.of(daltonizerTile); + assertThat(readStringsFromSetting(ShortcutUtils.convertToKey(QUICK_SETTINGS))) + .containsExactlyElementsIn(expected); + assertThat(userState.getShortcutTargetsLocked(QUICK_SETTINGS)) + .containsExactlyElementsIn(expected); } @Test @@ -1717,27 +1724,26 @@ public class AccessibilityManagerServiceTest { @Test @EnableFlags(android.view.accessibility.Flags.FLAG_RESTORE_A11Y_SHORTCUT_TARGET_SERVICE) - public void restoreA11yShortcutTargetService_targetsMerged() { + public void restoreShortcutTargets_hardware_targetsMerged() { + mFakePermissionEnforcer.grant(Manifest.permission.MANAGE_ACCESSIBILITY); final String servicePrevious = TARGET_ALWAYS_ON_A11Y_SERVICE.flattenToString(); final String otherPrevious = TARGET_MAGNIFICATION; - final String combinedPrevious = String.join(":", servicePrevious, otherPrevious); final String serviceRestored = TARGET_STANDARD_A11Y_SERVICE.flattenToString(); final AccessibilityUserState userState = new AccessibilityUserState( UserHandle.USER_SYSTEM, mTestableContext, mA11yms); mA11yms.mUserStates.put(UserHandle.USER_SYSTEM, userState); setupShortcutTargetServices(userState); + mA11yms.enableShortcutsForTargets( + true, HARDWARE, List.of(servicePrevious, otherPrevious), userState.mUserId); broadcastSettingRestored( - Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE, - /*previousValue=*/combinedPrevious, + ShortcutUtils.convertToKey(HARDWARE), /*newValue=*/serviceRestored); final Set<String> expected = Set.of(servicePrevious, otherPrevious, serviceRestored); - assertThat(readStringsFromSetting( - Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE)) + assertThat(readStringsFromSetting(ShortcutUtils.convertToKey(HARDWARE))) .containsExactlyElementsIn(expected); - assertThat(mA11yms.mUserStates.get(UserHandle.USER_SYSTEM) - .getShortcutTargetsLocked(UserShortcutType.HARDWARE)) + assertThat(userState.getShortcutTargetsLocked(HARDWARE)) .containsExactlyElementsIn(expected); } @@ -1745,7 +1751,7 @@ public class AccessibilityManagerServiceTest { @EnableFlags({ android.view.accessibility.Flags.FLAG_RESTORE_A11Y_SHORTCUT_TARGET_SERVICE, Flags.FLAG_CLEAR_DEFAULT_FROM_A11Y_SHORTCUT_TARGET_SERVICE_RESTORE}) - public void restoreA11yShortcutTargetService_alreadyHadDefaultService_doesNotClear() { + public void restoreShortcutTargets_hardware_alreadyHadDefaultService_doesNotClear() { final String serviceDefault = TARGET_STANDARD_A11Y_SERVICE.flattenToString(); mTestableContext.getOrCreateTestableResources().addOverride( R.string.config_defaultAccessibilityService, serviceDefault); @@ -1754,17 +1760,18 @@ public class AccessibilityManagerServiceTest { mA11yms.mUserStates.put(UserHandle.USER_SYSTEM, userState); setupShortcutTargetServices(userState); + // default is present in userState & setting, so it's not cleared + putShortcutSettingForUser(HARDWARE, serviceDefault, UserHandle.USER_SYSTEM); + userState.updateShortcutTargetsLocked(Set.of(serviceDefault), HARDWARE); + broadcastSettingRestored( Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE, - /*previousValue=*/serviceDefault, /*newValue=*/serviceDefault); final Set<String> expected = Set.of(serviceDefault); - assertThat(readStringsFromSetting( - Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE)) + assertThat(readStringsFromSetting(ShortcutUtils.convertToKey(HARDWARE))) .containsExactlyElementsIn(expected); - assertThat(mA11yms.mUserStates.get(UserHandle.USER_SYSTEM) - .getShortcutTargetsLocked(UserShortcutType.HARDWARE)) + assertThat(userState.getShortcutTargetsLocked(HARDWARE)) .containsExactlyElementsIn(expected); } @@ -1772,7 +1779,7 @@ public class AccessibilityManagerServiceTest { @EnableFlags({ android.view.accessibility.Flags.FLAG_RESTORE_A11Y_SHORTCUT_TARGET_SERVICE, Flags.FLAG_CLEAR_DEFAULT_FROM_A11Y_SHORTCUT_TARGET_SERVICE_RESTORE}) - public void restoreA11yShortcutTargetService_didNotHaveDefaultService_clearsDefaultService() { + public void restoreShortcutTargets_hardware_didNotHaveDefaultService_clearsDefaultService() { final String serviceDefault = TARGET_STANDARD_A11Y_SERVICE.flattenToString(); final String serviceRestored = TARGET_ALWAYS_ON_A11Y_SERVICE.flattenToString(); // Restored value from the broadcast contains both default and non-default service. @@ -1784,18 +1791,45 @@ public class AccessibilityManagerServiceTest { mA11yms.mUserStates.put(UserHandle.USER_SYSTEM, userState); setupShortcutTargetServices(userState); - broadcastSettingRestored( - Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE, - /*previousValue=*/null, + broadcastSettingRestored(ShortcutUtils.convertToKey(HARDWARE), /*newValue=*/combinedRestored); // The default service is cleared from the final restored value. final Set<String> expected = Set.of(serviceRestored); - assertThat(readStringsFromSetting( - Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE)) + assertThat(readStringsFromSetting(ShortcutUtils.convertToKey(HARDWARE))) .containsExactlyElementsIn(expected); - assertThat(mA11yms.mUserStates.get(UserHandle.USER_SYSTEM) - .getShortcutTargetsLocked(UserShortcutType.HARDWARE)) + assertThat(userState.getShortcutTargetsLocked(HARDWARE)) + .containsExactlyElementsIn(expected); + } + + @Test + @EnableFlags({ + android.view.accessibility.Flags.FLAG_RESTORE_A11Y_SHORTCUT_TARGET_SERVICE, + Flags.FLAG_CLEAR_DEFAULT_FROM_A11Y_SHORTCUT_TARGET_SERVICE_RESTORE}) + public void restoreShortcutTargets_hardware_nullSetting_clearsDefaultService() { + final String serviceDefault = TARGET_STANDARD_A11Y_SERVICE.flattenToString(); + final String serviceRestored = TARGET_ALWAYS_ON_A11Y_SERVICE.flattenToString(); + // Restored value from the broadcast contains both default and non-default service. + final String combinedRestored = String.join(":", serviceDefault, serviceRestored); + mTestableContext.getOrCreateTestableResources().addOverride( + R.string.config_defaultAccessibilityService, serviceDefault); + final AccessibilityUserState userState = new AccessibilityUserState( + UserHandle.USER_SYSTEM, mTestableContext, mA11yms); + mA11yms.mUserStates.put(UserHandle.USER_SYSTEM, userState); + setupShortcutTargetServices(userState); + + // UserState has default, but setting is null (this emulates a typical scenario in SUW). + userState.updateShortcutTargetsLocked(Set.of(serviceDefault), HARDWARE); + putShortcutSettingForUser(HARDWARE, null, UserHandle.USER_SYSTEM); + + broadcastSettingRestored(ShortcutUtils.convertToKey(HARDWARE), + /*newValue=*/combinedRestored); + + // The default service is cleared from the final restored value. + final Set<String> expected = Set.of(serviceRestored); + assertThat(readStringsFromSetting(ShortcutUtils.convertToKey(HARDWARE))) + .containsExactlyElementsIn(expected); + assertThat(userState.getShortcutTargetsLocked(HARDWARE)) .containsExactlyElementsIn(expected); } @@ -1806,11 +1840,10 @@ public class AccessibilityManagerServiceTest { return result; } - private void broadcastSettingRestored(String setting, String previousValue, String newValue) { + private void broadcastSettingRestored(String setting, String newValue) { Intent intent = new Intent(Intent.ACTION_SETTING_RESTORED) .addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY) .putExtra(Intent.EXTRA_SETTING_NAME, setting) - .putExtra(Intent.EXTRA_SETTING_PREVIOUS_VALUE, previousValue) .putExtra(Intent.EXTRA_SETTING_NEW_VALUE, newValue); sendBroadcastToAccessibilityManagerService(intent); mTestableLooper.processAllMessages(); @@ -1952,4 +1985,13 @@ public class AccessibilityManagerServiceTest { private static boolean isSameCurrentUser(AccessibilityManagerService service, Context context) { return service.getCurrentUserIdLocked() == context.getUserId(); } + + private void putShortcutSettingForUser(@UserShortcutType int shortcutType, + String shortcutValue, int userId) { + Settings.Secure.putStringForUser( + mTestableContext.getContentResolver(), + ShortcutUtils.convertToKey(shortcutType), + shortcutValue, + userId); + } } 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 b269beb90c75..9fad14d889fd 100644 --- a/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityUserStateTest.java +++ b/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityUserStateTest.java @@ -28,6 +28,7 @@ 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.common.ShortcutConstants.UserShortcutType.QUICK_SETTINGS; import static com.android.server.accessibility.AccessibilityUserState.doesShortcutTargetsStringContain; import static com.google.common.truth.Truth.assertThat; @@ -429,20 +430,20 @@ public class AccessibilityUserStateTest { } @Test - public void updateA11yQsTargetLocked_valueUpdated() { + public void updateShortcutTargetsLocked_quickSettings_valueUpdated() { Set<String> newTargets = Set.of( AccessibilityShortcutController.DALTONIZER_COMPONENT_NAME.flattenToString(), AccessibilityShortcutController.COLOR_INVERSION_COMPONENT_NAME.flattenToString() ); - mUserState.updateA11yQsTargetLocked(newTargets); + mUserState.updateShortcutTargetsLocked(newTargets, QUICK_SETTINGS); assertThat(mUserState.getA11yQsTargets()).isEqualTo(newTargets); } @Test public void getA11yQsTargets_returnsCopiedData() { - updateA11yQsTargetLocked_valueUpdated(); + updateShortcutTargetsLocked_quickSettings_valueUpdated(); Set<String> targets = mUserState.getA11yQsTargets(); targets.clear(); |