Loading services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java +6 −3 Original line number Diff line number Diff line Loading @@ -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; Loading services/accessibility/java/com/android/server/accessibility/AccessibilityUserState.java +5 −4 Original line number Diff line number Diff line Loading @@ -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<>(); /** Loading Loading @@ -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 Loading Loading @@ -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. Loading services/tests/servicestests/src/com/android/server/accessibility/AccessibilityManagerServiceTest.java +18 −16 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); Loading Loading @@ -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, Loading @@ -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, Loading Loading @@ -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. Loading @@ -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()); } Loading Loading @@ -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(); Loading Loading @@ -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); Loading services/tests/servicestests/src/com/android/server/accessibility/AccessibilityUserStateTest.java +6 −4 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); Loading @@ -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()); Loading Loading
services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java +6 −3 Original line number Diff line number Diff line Loading @@ -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; Loading
services/accessibility/java/com/android/server/accessibility/AccessibilityUserState.java +5 −4 Original line number Diff line number Diff line Loading @@ -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<>(); /** Loading Loading @@ -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 Loading Loading @@ -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. Loading
services/tests/servicestests/src/com/android/server/accessibility/AccessibilityManagerServiceTest.java +18 −16 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); Loading Loading @@ -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, Loading @@ -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, Loading Loading @@ -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. Loading @@ -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()); } Loading Loading @@ -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(); Loading Loading @@ -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); Loading
services/tests/servicestests/src/com/android/server/accessibility/AccessibilityUserStateTest.java +6 −4 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); Loading @@ -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()); Loading