summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java9
-rw-r--r--services/accessibility/java/com/android/server/accessibility/AccessibilityUserState.java9
-rw-r--r--services/tests/servicestests/src/com/android/server/accessibility/AccessibilityManagerServiceTest.java34
-rw-r--r--services/tests/servicestests/src/com/android/server/accessibility/AccessibilityUserStateTest.java10
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());