diff options
4 files changed, 35 insertions, 27 deletions
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java index c0fd557ea7ba..1dc3fb421545 100644 --- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java +++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java @@ -849,14 +849,17 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub                      userState.mEnabledServices, userState.mUserId);          } -        boolean buttonTargetsChanged = userState.mAccessibilityButtonTargets.removeIf( +        // Remove any button targets that match any stopped continuous services +        Set<String> buttonTargets = userState.getShortcutTargetsLocked(SOFTWARE); +        boolean buttonTargetsChanged = buttonTargets.removeIf(                  target -> continuousServicePackages.stream().anyMatch(                          pkg -> Objects.equals(target, pkg)));          if (buttonTargetsChanged) { +            userState.updateShortcutTargetsLocked(buttonTargets, SOFTWARE);              persistColonDelimitedSetToSettingLocked( -                    Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS, +                    ShortcutUtils.convertToKey(SOFTWARE),                      userState.mUserId, -                    userState.mAccessibilityButtonTargets, str -> str); +                    buttonTargets, str -> str);          }          return enabledServicesChanged || buttonTargetsChanged; diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityUserState.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityUserState.java index 47a6d3e582b6..710bae9cbcc8 100644 --- a/services/accessibility/java/com/android/server/accessibility/AccessibilityUserState.java +++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityUserState.java @@ -98,9 +98,9 @@ class AccessibilityUserState {      final Set<ComponentName> mTouchExplorationGrantedServices = new HashSet<>(); -    final ArraySet<String> mAccessibilityShortcutKeyTargets = new ArraySet<>(); +    private final ArraySet<String> mAccessibilityShortcutKeyTargets = new ArraySet<>(); -    final ArraySet<String> mAccessibilityButtonTargets = new ArraySet<>(); +    private final ArraySet<String> mAccessibilityButtonTargets = new ArraySet<>();      private final ArraySet<String> mAccessibilityQsTargets = new ArraySet<>();      /** @@ -771,7 +771,8 @@ class AccessibilityUserState {      /**       * Returns a set which contains the flattened component names and the system class names -     * assigned to the given shortcut. +     * assigned to the given shortcut. The set is a defensive copy. To apply any changes to the set, +     * use {@link #updateShortcutTargetsLocked(Set, int)}       *       * @param shortcutType The shortcut type.       * @return The array set of the strings @@ -858,7 +859,7 @@ class AccessibilityUserState {      }      /** -     * Removes given shortcut target in the list. +     * Removes given shortcut target in the set.       *       * @param shortcutType The shortcut type.       * @param target The component name of the shortcut target. 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 a40bbd27fa8a..20b9592cb9f2 100644 --- a/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityManagerServiceTest.java @@ -27,6 +27,7 @@ import static com.android.internal.accessibility.AccessibilityShortcutController  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.internal.accessibility.common.ShortcutConstants.UserShortcutType.SOFTWARE;  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; @@ -599,7 +600,7 @@ public class AccessibilityManagerServiceTest {          final AccessibilityUserState userState = mA11yms.mUserStates.get(                  mA11yms.getCurrentUserIdLocked()); -        userState.mAccessibilityShortcutKeyTargets.add(MAGNIFICATION_CONTROLLER_NAME); +        userState.updateShortcutTargetsLocked(Set.of(MAGNIFICATION_CONTROLLER_NAME), HARDWARE);          userState.setMagnificationCapabilitiesLocked(                  Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_ALL); @@ -799,8 +800,8 @@ public class AccessibilityManagerServiceTest {          final AccessibilityUserState userState = mA11yms.mUserStates.get(                  mA11yms.getCurrentUserIdLocked());          mFakePermissionEnforcer.grant(Manifest.permission.MANAGE_ACCESSIBILITY); -        userState.mAccessibilityShortcutKeyTargets.add( -                ACCESSIBILITY_HEARING_AIDS_COMPONENT_NAME.flattenToString()); +        userState.updateShortcutTargetsLocked( +                Set.of(ACCESSIBILITY_HEARING_AIDS_COMPONENT_NAME.flattenToString()), HARDWARE);          mA11yms.performAccessibilityShortcut(                  Display.DEFAULT_DISPLAY, HARDWARE, @@ -818,8 +819,8 @@ public class AccessibilityManagerServiceTest {          final AccessibilityUserState userState = mA11yms.mUserStates.get(                  mA11yms.getCurrentUserIdLocked());          mFakePermissionEnforcer.grant(Manifest.permission.MANAGE_ACCESSIBILITY); -        userState.mAccessibilityShortcutKeyTargets.add( -                ACCESSIBILITY_HEARING_AIDS_COMPONENT_NAME.flattenToString()); +        userState.updateShortcutTargetsLocked( +                Set.of(ACCESSIBILITY_HEARING_AIDS_COMPONENT_NAME.flattenToString()), HARDWARE);          mA11yms.performAccessibilityShortcut(                  Display.DEFAULT_DISPLAY, HARDWARE, @@ -875,9 +876,10 @@ public class AccessibilityManagerServiceTest {          userState.mInstalledServices.clear();          userState.mInstalledServices.add(info_a);          userState.mInstalledServices.add(info_b); -        userState.mAccessibilityButtonTargets.clear(); -        userState.mAccessibilityButtonTargets.add(info_a.getComponentName().flattenToString()); -        userState.mAccessibilityButtonTargets.add(info_b.getComponentName().flattenToString()); +        userState.updateShortcutTargetsLocked(Set.of( +                        info_a.getComponentName().flattenToString(), +                        info_b.getComponentName().flattenToString()), +                SOFTWARE);          // despite force stopping both packages, only the first service has the relevant flag,          // so only the first should be removed. @@ -891,11 +893,11 @@ public class AccessibilityManagerServiceTest {          //Assert user state change          userState = mA11yms.getCurrentUserState(); -        assertThat(userState.mAccessibilityButtonTargets).containsExactly( +        assertThat(userState.getShortcutTargetsLocked(SOFTWARE)).containsExactly(                  info_b.getComponentName().flattenToString());          //Assert setting change          final Set<String> targetsFromSetting = new ArraySet<>(); -        mA11yms.readColonDelimitedSettingToSet(Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS, +        mA11yms.readColonDelimitedSettingToSet(ShortcutUtils.convertToKey(SOFTWARE),                  userState.mUserId, str -> str, targetsFromSetting);          assertThat(targetsFromSetting).containsExactly(info_b.getComponentName().flattenToString());      } @@ -996,10 +998,10 @@ public class AccessibilityManagerServiceTest {          final AccessibilityServiceInfo info_c = mockAccessibilityServiceInfo(                  new ComponentName("package_c", "class_c"));          final AccessibilityUserState userState = mA11yms.getCurrentUserState(); -        userState.mAccessibilityButtonTargets.clear(); -        userState.mAccessibilityButtonTargets.add(info_b.getComponentName().flattenToString()); -        userState.mAccessibilityShortcutKeyTargets.clear(); -        userState.mAccessibilityShortcutKeyTargets.add(info_c.getComponentName().flattenToString()); +        userState.updateShortcutTargetsLocked( +                Set.of(info_b.getComponentName().flattenToString()), SOFTWARE); +        userState.updateShortcutTargetsLocked( +                Set.of(info_c.getComponentName().flattenToString()), HARDWARE);          assertThat(mA11yms.isAccessibilityServiceWarningRequired(info_a)).isTrue();          assertThat(mA11yms.isAccessibilityServiceWarningRequired(info_b)).isFalse(); @@ -1560,8 +1562,8 @@ public class AccessibilityManagerServiceTest {          mFakePermissionEnforcer.grant(Manifest.permission.MANAGE_ACCESSIBILITY);          setupShortcutTargetServices();          final AccessibilityUserState userState = mA11yms.getCurrentUserState(); -        userState.mAccessibilityButtonTargets.clear(); -        userState.mAccessibilityButtonTargets.add(TARGET_ALWAYS_ON_A11Y_SERVICE.flattenToString()); +        userState.updateShortcutTargetsLocked( +                Set.of(TARGET_ALWAYS_ON_A11Y_SERVICE.flattenToString()), SOFTWARE);          ComponentName tile = new ComponentName(                  TARGET_ALWAYS_ON_A11Y_SERVICE.getPackageName(),                  TARGET_ALWAYS_ON_A11Y_SERVICE_TILE_CLASS); 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 9fad14d889fd..123f0edc8dd3 100644 --- a/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityUserStateTest.java +++ b/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityUserStateTest.java @@ -28,7 +28,9 @@ 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.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.server.accessibility.AccessibilityUserState.doesShortcutTargetsStringContain;  import static com.google.common.truth.Truth.assertThat; @@ -159,8 +161,8 @@ public class AccessibilityUserStateTest {          mUserState.setInteractiveUiTimeoutLocked(30);          mUserState.mEnabledServices.add(COMPONENT_NAME);          mUserState.mTouchExplorationGrantedServices.add(COMPONENT_NAME); -        mUserState.mAccessibilityShortcutKeyTargets.add(COMPONENT_NAME.flattenToString()); -        mUserState.mAccessibilityButtonTargets.add(COMPONENT_NAME.flattenToString()); +        mUserState.updateShortcutTargetsLocked(Set.of(COMPONENT_NAME.flattenToString()), HARDWARE); +        mUserState.updateShortcutTargetsLocked(Set.of(COMPONENT_NAME.flattenToString()), SOFTWARE);          mUserState.setTargetAssignedToAccessibilityButton(COMPONENT_NAME.flattenToString());          mUserState.setTouchExplorationEnabledLocked(true);          mUserState.setMagnificationSingleFingerTripleTapEnabledLocked(true); @@ -182,8 +184,8 @@ public class AccessibilityUserStateTest {          assertEquals(0, mUserState.getInteractiveUiTimeoutLocked());          assertTrue(mUserState.mEnabledServices.isEmpty());          assertTrue(mUserState.mTouchExplorationGrantedServices.isEmpty()); -        assertTrue(mUserState.mAccessibilityShortcutKeyTargets.isEmpty()); -        assertTrue(mUserState.mAccessibilityButtonTargets.isEmpty()); +        assertTrue(mUserState.getShortcutTargetsLocked(HARDWARE).isEmpty()); +        assertTrue(mUserState.getShortcutTargetsLocked(SOFTWARE).isEmpty());          assertNull(mUserState.getTargetAssignedToAccessibilityButton());          assertFalse(mUserState.isTouchExplorationEnabledLocked());          assertFalse(mUserState.isMagnificationSingleFingerTripleTapEnabledLocked());  |