Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2fe7082f authored by Riley Jones's avatar Riley Jones
Browse files

Updating userState shortcut targets to enforce defensive copying

Test: N/A, only changes access & documentation
Flag: EXEMPT internal change
Bug: 330775538

Change-Id: I3c09cac6b1c1c2d0d8d9305dc32cf490249ceabb
parent 03aa21bb
Loading
Loading
Loading
Loading
+6 −3
Original line number Diff line number Diff line
@@ -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;
+5 −4
Original line number Diff line number Diff line
@@ -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.
+18 −16
Original line number Diff line number Diff line
@@ -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);
+6 −4
Original line number Diff line number Diff line
@@ -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());