diff options
| author | 2024-06-26 18:39:06 +0000 | |
|---|---|---|
| committer | 2024-06-26 18:39:06 +0000 | |
| commit | fbcec62583d5e03dc770d6b4cdebae9618cd625f (patch) | |
| tree | bcb74e7c2f0e4d07f34e72b954ae881838e1cd09 | |
| parent | 34d64863aff72e14de575504cb13c8e0679447cc (diff) | |
| parent | 2fe7082f8881109fae459a661004e6ea1b25c80a (diff) | |
Merge "Updating userState shortcut targets to enforce defensive copying" into main
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()); |