diff options
11 files changed, 132 insertions, 52 deletions
diff --git a/core/java/com/android/internal/accessibility/common/ShortcutConstants.java b/core/java/com/android/internal/accessibility/common/ShortcutConstants.java index 6420620adda9..a3fcfad7afc8 100644 --- a/core/java/com/android/internal/accessibility/common/ShortcutConstants.java +++ b/core/java/com/android/internal/accessibility/common/ShortcutConstants.java @@ -72,6 +72,7 @@ public final class ShortcutConstants { UserShortcutType.TRIPLETAP, UserShortcutType.TWOFINGER_DOUBLETAP, UserShortcutType.QUICK_SETTINGS, + UserShortcutType.GESTURE }) public @interface UserShortcutType { int DEFAULT = 0; @@ -81,6 +82,7 @@ public final class ShortcutConstants { int TRIPLETAP = 1 << 2; int TWOFINGER_DOUBLETAP = 1 << 3; int QUICK_SETTINGS = 1 << 4; + int GESTURE = 1 << 5; // LINT.ThenChange(:shortcut_type_array) } @@ -95,6 +97,7 @@ public final class ShortcutConstants { UserShortcutType.TRIPLETAP, UserShortcutType.TWOFINGER_DOUBLETAP, UserShortcutType.QUICK_SETTINGS, + UserShortcutType.GESTURE // LINT.ThenChange(:shortcut_type_intdef) }; diff --git a/core/java/com/android/internal/accessibility/dialog/AccessibilityButtonChooserActivity.java b/core/java/com/android/internal/accessibility/dialog/AccessibilityButtonChooserActivity.java index c8d619481726..01cbb5514669 100644 --- a/core/java/com/android/internal/accessibility/dialog/AccessibilityButtonChooserActivity.java +++ b/core/java/com/android/internal/accessibility/dialog/AccessibilityButtonChooserActivity.java @@ -20,6 +20,7 @@ import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL; import static com.android.internal.accessibility.AccessibilityShortcutController.MAGNIFICATION_COMPONENT_NAME; import static com.android.internal.accessibility.AccessibilityShortcutController.MAGNIFICATION_CONTROLLER_NAME; +import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.GESTURE; import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.SOFTWARE; import static com.android.internal.accessibility.dialog.AccessibilityTargetHelper.getTargets; import static com.android.internal.accessibility.util.AccessibilityStatsLogUtils.logAccessibilityButtonLongPressStatus; @@ -66,6 +67,9 @@ public class AccessibilityButtonChooserActivity extends Activity { NAV_BAR_MODE_GESTURAL == getResources().getInteger( com.android.internal.R.integer.config_navBarInteractionMode); + final int targetType = (isGestureNavigateEnabled + && android.provider.Flags.a11yStandaloneGestureEnabled()) ? GESTURE : SOFTWARE; + if (isGestureNavigateEnabled) { final TextView promptPrologue = findViewById(R.id.accessibility_button_prompt_prologue); promptPrologue.setText(isTouchExploreOn @@ -78,7 +82,7 @@ public class AccessibilityButtonChooserActivity extends Activity { : R.string.accessibility_gesture_instructional_text); } - mTargets.addAll(getTargets(this, SOFTWARE)); + mTargets.addAll(getTargets(this, targetType)); final GridView gridview = findViewById(R.id.accessibility_button_chooser_grid); gridview.setAdapter(new ButtonTargetAdapter(mTargets)); diff --git a/core/java/com/android/internal/accessibility/dialog/AccessibilityShortcutChooserActivity.java b/core/java/com/android/internal/accessibility/dialog/AccessibilityShortcutChooserActivity.java index 6256dbcfe4de..44c7543ecac1 100644 --- a/core/java/com/android/internal/accessibility/dialog/AccessibilityShortcutChooserActivity.java +++ b/core/java/com/android/internal/accessibility/dialog/AccessibilityShortcutChooserActivity.java @@ -18,7 +18,6 @@ package com.android.internal.accessibility.dialog; import static com.android.internal.accessibility.common.ShortcutConstants.ShortcutMenuMode; import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType; import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.HARDWARE; -import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.SOFTWARE; import static com.android.internal.accessibility.dialog.AccessibilityTargetHelper.getInstalledTargets; import static com.android.internal.accessibility.dialog.AccessibilityTargetHelper.getTargets; import static com.android.internal.accessibility.util.AccessibilityUtils.isUserSetupCompleted; @@ -213,10 +212,7 @@ public class AccessibilityShortcutChooserActivity extends Activity { final boolean isEditMenuMode = mTargetAdapter.getShortcutMenuMode() == ShortcutMenuMode.EDIT; final int selectDialogTitleId = R.string.accessibility_select_shortcut_menu_title; - final int editDialogTitleId = - mShortcutType == SOFTWARE - ? R.string.accessibility_edit_shortcut_menu_button_title - : R.string.accessibility_edit_shortcut_menu_volume_title; + final int editDialogTitleId = R.string.accessibility_edit_shortcut_menu_volume_title; mMenuDialog.setTitle(getString(isEditMenuMode ? editDialogTitleId : selectDialogTitleId)); mMenuDialog.getButton(DialogInterface.BUTTON_POSITIVE).setOnClickListener( diff --git a/core/java/com/android/internal/accessibility/dialog/AccessibilityTarget.java b/core/java/com/android/internal/accessibility/dialog/AccessibilityTarget.java index ec90dd242c36..a753110edd51 100644 --- a/core/java/com/android/internal/accessibility/dialog/AccessibilityTarget.java +++ b/core/java/com/android/internal/accessibility/dialog/AccessibilityTarget.java @@ -16,6 +16,7 @@ package com.android.internal.accessibility.dialog; +import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.GESTURE; import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.HARDWARE; import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.SOFTWARE; import static com.android.internal.accessibility.util.ShortcutUtils.optInValueToSettings; @@ -197,6 +198,9 @@ public abstract class AccessibilityTarget implements TargetOperations, OnTargetS @VisibleForTesting public static boolean isRecognizedShortcutType(@UserShortcutType int shortcutType) { int mask = SOFTWARE | HARDWARE; + if (android.provider.Flags.a11yStandaloneGestureEnabled()) { + mask = mask | GESTURE; + } return (shortcutType != 0 && (shortcutType & mask) == shortcutType); } } diff --git a/core/java/com/android/internal/accessibility/util/AccessibilityStatsLogUtils.java b/core/java/com/android/internal/accessibility/util/AccessibilityStatsLogUtils.java index 8e18f842a055..9d66461aa80f 100644 --- a/core/java/com/android/internal/accessibility/util/AccessibilityStatsLogUtils.java +++ b/core/java/com/android/internal/accessibility/util/AccessibilityStatsLogUtils.java @@ -23,6 +23,7 @@ import static android.provider.Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_ import static android.provider.Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW; import static com.android.internal.accessibility.AccessibilityShortcutController.MAGNIFICATION_COMPONENT_NAME; +import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.GESTURE; 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; @@ -247,6 +248,8 @@ public final class AccessibilityStatsLogUtils { } else { return ACCESSIBILITY_SHORTCUT_REPORTED__SHORTCUT_TYPE__A11Y_BUTTON; } + case GESTURE: + return ACCESSIBILITY_SHORTCUT_REPORTED__SHORTCUT_TYPE__A11Y_GESTURE; case HARDWARE: return ACCESSIBILITY_SHORTCUT_REPORTED__SHORTCUT_TYPE__VOLUME_KEY; case QUICK_SETTINGS: diff --git a/core/java/com/android/internal/accessibility/util/ShortcutUtils.java b/core/java/com/android/internal/accessibility/util/ShortcutUtils.java index 6b0ca9faa2a4..48f86ffe8456 100644 --- a/core/java/com/android/internal/accessibility/util/ShortcutUtils.java +++ b/core/java/com/android/internal/accessibility/util/ShortcutUtils.java @@ -166,6 +166,8 @@ public final class ShortcutUtils { switch (type) { case UserShortcutType.SOFTWARE: return Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS; + case UserShortcutType.GESTURE: + return Settings.Secure.ACCESSIBILITY_GESTURE_TARGETS; case UserShortcutType.HARDWARE: return Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE; case UserShortcutType.TRIPLETAP: @@ -190,6 +192,7 @@ public final class ShortcutUtils { public static int convertToType(String key) { return switch (key) { case Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS -> UserShortcutType.SOFTWARE; + case Settings.Secure.ACCESSIBILITY_GESTURE_TARGETS -> UserShortcutType.GESTURE; case Settings.Secure.ACCESSIBILITY_QS_TARGETS -> UserShortcutType.QUICK_SETTINGS; case Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE -> UserShortcutType.HARDWARE; case Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED -> diff --git a/core/tests/coretests/src/com/android/internal/accessibility/dialog/AccessibilityTargetTest.java b/core/tests/coretests/src/com/android/internal/accessibility/dialog/AccessibilityTargetTest.java index 389b677587b0..f01ac6f6fa10 100644 --- a/core/tests/coretests/src/com/android/internal/accessibility/dialog/AccessibilityTargetTest.java +++ b/core/tests/coretests/src/com/android/internal/accessibility/dialog/AccessibilityTargetTest.java @@ -16,15 +16,22 @@ package com.android.internal.accessibility.dialog; +import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.GESTURE; import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.HARDWARE; import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.SOFTWARE; import static com.google.common.truth.Truth.assertThat; +import android.platform.test.annotations.DisableFlags; +import android.platform.test.annotations.EnableFlags; +import android.platform.test.flag.junit.SetFlagsRule; +import android.provider.Flags; + import androidx.test.runner.AndroidJUnit4; import com.android.internal.accessibility.common.ShortcutConstants; +import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; @@ -32,9 +39,13 @@ import java.util.stream.IntStream; @RunWith(AndroidJUnit4.class) public class AccessibilityTargetTest { + @Rule + public SetFlagsRule mSetFlagsRule = new SetFlagsRule(); private static final int[] EXPECTED_TYPES = { HARDWARE, SOFTWARE }; + private static final int[] EXPECTED_TYPES_GESTURE = { HARDWARE, SOFTWARE, GESTURE }; @Test + @DisableFlags(Flags.FLAG_A11Y_STANDALONE_GESTURE_ENABLED) public void isRecognizedShortcutType_expectedType_isTrue() { for (int type : EXPECTED_TYPES) { assertThat(AccessibilityTarget.isRecognizedShortcutType(type)).isTrue(); @@ -42,6 +53,7 @@ public class AccessibilityTargetTest { } @Test + @DisableFlags(Flags.FLAG_A11Y_STANDALONE_GESTURE_ENABLED) public void isRecognizedShortcutType_notExpectedType_isFalse() { for (int type: ShortcutConstants.USER_SHORTCUT_TYPES) { if (IntStream.of(EXPECTED_TYPES).noneMatch(x -> x == type)) { @@ -49,4 +61,28 @@ public class AccessibilityTargetTest { } } } + + @Test + @EnableFlags(Flags.FLAG_A11Y_STANDALONE_GESTURE_ENABLED) + public void isRecognizedShortcutType_expectedType_gestureIncluded_isTrue() { + for (int type : EXPECTED_TYPES_GESTURE) { + if (!AccessibilityTarget.isRecognizedShortcutType(type)) { + throw new AssertionError( + "Shortcut type " + type + " should be recognized"); + } + } + } + + @Test + @EnableFlags(Flags.FLAG_A11Y_STANDALONE_GESTURE_ENABLED) + public void isRecognizedShortcutType_notExpectedType_gestureIncluded_isFalse() { + for (int type: ShortcutConstants.USER_SHORTCUT_TYPES) { + if (IntStream.of(EXPECTED_TYPES_GESTURE).noneMatch(x -> x == type)) { + if (AccessibilityTarget.isRecognizedShortcutType(type)) { + throw new AssertionError( + "Shortcut type " + type + " should not be recognized"); + } + } + } + } } diff --git a/core/tests/coretests/src/com/android/internal/accessibility/util/ShortcutUtilsTest.java b/core/tests/coretests/src/com/android/internal/accessibility/util/ShortcutUtilsTest.java index 928fce9e6e59..8bebc62e93f2 100644 --- a/core/tests/coretests/src/com/android/internal/accessibility/util/ShortcutUtilsTest.java +++ b/core/tests/coretests/src/com/android/internal/accessibility/util/ShortcutUtilsTest.java @@ -20,6 +20,8 @@ import static android.provider.Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATI import static android.provider.Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_MAGNIFICATION_CONTROLLER; import static com.android.internal.accessibility.common.ShortcutConstants.SERVICES_SEPARATOR; +import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.GESTURE; +import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.SOFTWARE; import static com.google.common.truth.Truth.assertThat; @@ -99,8 +101,7 @@ public class ShortcutUtilsTest { public void getShortcutTargets_softwareShortcutNoService_emptyResult() { assertThat( ShortcutUtils.getShortcutTargetsFromSettings( - mContext, - ShortcutConstants.UserShortcutType.SOFTWARE, mDefaultUserId) + mContext, SOFTWARE, mDefaultUserId) ).isEmpty(); } @@ -114,13 +115,21 @@ public class ShortcutUtilsTest { } @Test + public void getShortcutTargets_gestureShortcutNoService_emptyResult() { + assertThat( + ShortcutUtils.getShortcutTargetsFromSettings( + mContext, GESTURE, mDefaultUserId) + ).isEmpty(); + } + + @Test public void getShortcutTargets_softwareShortcut1Service_return1Service() { setupShortcutTargets(ONE_COMPONENT, Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS); setupShortcutTargets(TWO_COMPONENTS, Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE); assertThat( ShortcutUtils.getShortcutTargetsFromSettings( - mContext, ShortcutConstants.UserShortcutType.SOFTWARE, + mContext, SOFTWARE, mDefaultUserId) ).containsExactlyElementsIn(ONE_COMPONENT); } diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java index 1dc3fb421545..5f304133437f 100644 --- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java +++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java @@ -47,6 +47,7 @@ import static com.android.internal.accessibility.AccessibilityShortcutController import static com.android.internal.accessibility.common.ShortcutConstants.CHOOSER_PACKAGE_NAME; import static com.android.internal.accessibility.common.ShortcutConstants.USER_SHORTCUT_TYPES; import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType; +import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.GESTURE; 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; @@ -3086,6 +3087,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub scheduleUpdateClientsIfNeededLocked(userState, forceUpdate); updateAccessibilityShortcutTargetsLocked(userState, HARDWARE); updateAccessibilityShortcutTargetsLocked(userState, SOFTWARE); + updateAccessibilityShortcutTargetsLocked(userState, GESTURE); updateAccessibilityShortcutTargetsLocked(userState, QUICK_SETTINGS); // Update the capabilities before the mode because we will check the current mode is // invalid or not.. @@ -3207,6 +3209,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub somethingChanged |= readAccessibilityShortcutTargetsLocked(userState, HARDWARE); somethingChanged |= readAccessibilityShortcutTargetsLocked(userState, QUICK_SETTINGS); somethingChanged |= readAccessibilityShortcutTargetsLocked(userState, SOFTWARE); + somethingChanged |= readAccessibilityShortcutTargetsLocked(userState, GESTURE); somethingChanged |= readAccessibilityButtonTargetComponentLocked(userState); somethingChanged |= readUserRecommendedUiTimeoutSettingsLocked(userState); somethingChanged |= readMagnificationModeForDefaultDisplayLocked(userState); @@ -3750,23 +3753,19 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub return; } - final List<Pair<Integer, String>> shortcutTypeAndShortcutSetting = new ArrayList<>(3); - shortcutTypeAndShortcutSetting.add( - new Pair<>(HARDWARE, - Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE)); - shortcutTypeAndShortcutSetting.add( - new Pair<>(SOFTWARE, - Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS)); + final List<Integer> shortcutTypes = new ArrayList<>(4); + shortcutTypes.add(HARDWARE); + shortcutTypes.add(SOFTWARE); if (android.view.accessibility.Flags.a11yQsShortcut()) { - shortcutTypeAndShortcutSetting.add( - new Pair<>(QUICK_SETTINGS, - Settings.Secure.ACCESSIBILITY_QS_TARGETS)); + shortcutTypes.add(QUICK_SETTINGS); + } + if (android.provider.Flags.a11yStandaloneGestureEnabled()) { + shortcutTypes.add(GESTURE); } final ComponentName serviceName = service.getComponentName(); - for (Pair<Integer, String> shortcutTypePair : shortcutTypeAndShortcutSetting) { - int shortcutType = shortcutTypePair.first; - String shortcutSettingName = shortcutTypePair.second; + for (Integer shortcutType: shortcutTypes) { + String shortcutSettingName = ShortcutUtils.convertToKey(shortcutType); if (userState.removeShortcutTargetLocked(shortcutType, serviceName)) { final Set<String> currentTargets = userState.getShortcutTargetsLocked(shortcutType); persistColonDelimitedSetToSettingLocked( @@ -4068,6 +4067,11 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub boolean enable, @UserShortcutType int shortcutTypes, @NonNull List<String> shortcutTargets, @UserIdInt int userId) { enableShortcutsForTargets_enforcePermission(); + if ((shortcutTypes & GESTURE) == GESTURE + && !android.provider.Flags.a11yStandaloneGestureEnabled()) { + throw new IllegalArgumentException( + "GESTURE type shortcuts are disabled by feature flag"); + } for (int shortcutType : USER_SHORTCUT_TYPES) { if ((shortcutTypes & shortcutType) == shortcutType) { enableShortcutForTargets(enable, shortcutType, shortcutTargets, userId); @@ -5451,6 +5455,9 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub private final Uri mAccessibilityButtonTargetsUri = Settings.Secure.getUriFor( Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS); + private final Uri mAccessibilityGestureTargetsUri = Settings.Secure.getUriFor( + Settings.Secure.ACCESSIBILITY_GESTURE_TARGETS); + private final Uri mUserNonInteractiveUiTimeoutUri = Settings.Secure.getUriFor( Settings.Secure.ACCESSIBILITY_NON_INTERACTIVE_UI_TIMEOUT_MS); @@ -5504,6 +5511,8 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub contentResolver.registerContentObserver( mAccessibilityButtonTargetsUri, false, this, UserHandle.USER_ALL); contentResolver.registerContentObserver( + mAccessibilityGestureTargetsUri, false, this, UserHandle.USER_ALL); + contentResolver.registerContentObserver( mUserNonInteractiveUiTimeoutUri, false, this, UserHandle.USER_ALL); contentResolver.registerContentObserver( mUserInteractiveUiTimeoutUri, false, this, UserHandle.USER_ALL); @@ -5575,6 +5584,10 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub if (readAccessibilityShortcutTargetsLocked(userState, SOFTWARE)) { onUserStateChangedLocked(userState); } + } else if (mAccessibilityGestureTargetsUri.equals(uri)) { + if (readAccessibilityShortcutTargetsLocked(userState, GESTURE)) { + onUserStateChangedLocked(userState); + } } else if (mUserNonInteractiveUiTimeoutUri.equals(uri) || mUserInteractiveUiTimeoutUri.equals(uri)) { readUserRecommendedUiTimeoutSettingsLocked(userState); diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityUserState.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityUserState.java index 710bae9cbcc8..7bcbc2768a16 100644 --- a/services/accessibility/java/com/android/server/accessibility/AccessibilityUserState.java +++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityUserState.java @@ -27,6 +27,12 @@ import static android.provider.Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_ import static com.android.internal.accessibility.AccessibilityShortcutController.MAGNIFICATION_CONTROLLER_NAME; import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType; +import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.GESTURE; +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.internal.accessibility.common.ShortcutConstants.UserShortcutType.TRIPLETAP; +import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.TWOFINGER_DOUBLETAP; import android.accessibilityservice.AccessibilityService.SoftKeyboardShowMode; import android.accessibilityservice.AccessibilityServiceInfo; @@ -101,6 +107,7 @@ class AccessibilityUserState { private final ArraySet<String> mAccessibilityShortcutKeyTargets = new ArraySet<>(); private final ArraySet<String> mAccessibilityButtonTargets = new ArraySet<>(); + private final ArraySet<String> mAccessibilityGestureTargets = new ArraySet<>(); private final ArraySet<String> mAccessibilityQsTargets = new ArraySet<>(); /** @@ -224,6 +231,7 @@ class AccessibilityUserState { mTouchExplorationGrantedServices.clear(); mAccessibilityShortcutKeyTargets.clear(); mAccessibilityButtonTargets.clear(); + mAccessibilityGestureTargets.clear(); mTargetAssignedToAccessibilityButton = null; mIsTouchExplorationEnabled = false; mServiceHandlesDoubleTap = false; @@ -524,6 +532,20 @@ class AccessibilityUserState { } } + private void dumpShortcutTargets( + PrintWriter pw, @UserShortcutType int shortcutType, String name) { + pw.append(" ").append(name).append(":{"); + ArraySet<String> targets = getShortcutTargetsInternalLocked(shortcutType); + int size = targets.size(); + for (int i = 0; i < size; i++) { + if (i > 0) { + pw.append(", "); + } + pw.append(targets.valueAt(i)); + } + pw.println("}"); + } + void dump(FileDescriptor fd, PrintWriter pw, String[] args) { pw.append("User state["); pw.println(); @@ -553,30 +575,12 @@ class AccessibilityUserState { .append(String.valueOf(mAlwaysOnMagnificationEnabled)); pw.append("}"); pw.println(); - pw.append(" shortcut key:{"); - int size = mAccessibilityShortcutKeyTargets.size(); - for (int i = 0; i < size; i++) { - final String componentId = mAccessibilityShortcutKeyTargets.valueAt(i); - pw.append(componentId); - if (i + 1 < size) { - pw.append(", "); - } - } - pw.println("}"); - pw.append(" button:{"); - size = mAccessibilityButtonTargets.size(); - for (int i = 0; i < size; i++) { - final String componentId = mAccessibilityButtonTargets.valueAt(i); - pw.append(componentId); - if (i + 1 < size) { - pw.append(", "); - } - } - pw.println("}"); + dumpShortcutTargets(pw, HARDWARE, "shortcut key"); + dumpShortcutTargets(pw, SOFTWARE, "button"); pw.append(" button target:{").append(mTargetAssignedToAccessibilityButton); pw.println("}"); - pw.append(" qs shortcut targets:").append(mAccessibilityQsTargets.toString()); - pw.println(); + dumpShortcutTargets(pw, GESTURE, "gesture"); + dumpShortcutTargets(pw, QUICK_SETTINGS, "qs shortcut targets"); pw.append(" a11y tiles in QS panel:").append(mA11yTilesInQsPanel.toString()); pw.println(); pw.append(" Bound services:{"); @@ -782,15 +786,17 @@ class AccessibilityUserState { } private ArraySet<String> getShortcutTargetsInternalLocked(@UserShortcutType int shortcutType) { - if (shortcutType == UserShortcutType.HARDWARE) { + if (shortcutType == HARDWARE) { return mAccessibilityShortcutKeyTargets; - } else if (shortcutType == UserShortcutType.SOFTWARE) { + } else if (shortcutType == SOFTWARE) { return mAccessibilityButtonTargets; - } else if (shortcutType == UserShortcutType.QUICK_SETTINGS) { + } else if (shortcutType == GESTURE) { + return mAccessibilityGestureTargets; + } else if (shortcutType == QUICK_SETTINGS) { return mAccessibilityQsTargets; - } else if ((shortcutType == UserShortcutType.TRIPLETAP + } else if ((shortcutType == TRIPLETAP && isMagnificationSingleFingerTripleTapEnabledLocked()) || ( - shortcutType == UserShortcutType.TWOFINGER_DOUBLETAP + shortcutType == TWOFINGER_DOUBLETAP && isMagnificationTwoFingerTripleTapEnabledLocked())) { ArraySet<String> targets = new ArraySet<>(); targets.add(MAGNIFICATION_CONTROLLER_NAME); @@ -811,7 +817,7 @@ class AccessibilityUserState { */ boolean updateShortcutTargetsLocked( Set<String> newTargets, @UserShortcutType int shortcutType) { - final int mask = UserShortcutType.TRIPLETAP | UserShortcutType.TWOFINGER_DOUBLETAP; + final int mask = TRIPLETAP | TWOFINGER_DOUBLETAP; if ((shortcutType & mask) != 0) { throw new IllegalArgumentException("Tap shortcuts cannot be updated with target sets."); } @@ -867,8 +873,8 @@ class AccessibilityUserState { */ public boolean removeShortcutTargetLocked( @UserShortcutType int shortcutType, ComponentName target) { - if (shortcutType == UserShortcutType.TRIPLETAP - || shortcutType == UserShortcutType.TWOFINGER_DOUBLETAP) { + if (shortcutType == TRIPLETAP + || shortcutType == TWOFINGER_DOUBLETAP) { throw new UnsupportedOperationException( "removeShortcutTargetLocked only support shortcut type: " + "software and hardware and quick settings for now" 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 123f0edc8dd3..ca3055196e6d 100644 --- a/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityUserStateTest.java +++ b/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityUserStateTest.java @@ -28,6 +28,7 @@ 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.GESTURE; 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; @@ -163,6 +164,7 @@ public class AccessibilityUserStateTest { mUserState.mTouchExplorationGrantedServices.add(COMPONENT_NAME); mUserState.updateShortcutTargetsLocked(Set.of(COMPONENT_NAME.flattenToString()), HARDWARE); mUserState.updateShortcutTargetsLocked(Set.of(COMPONENT_NAME.flattenToString()), SOFTWARE); + mUserState.updateShortcutTargetsLocked(Set.of(COMPONENT_NAME.flattenToString()), GESTURE); mUserState.setTargetAssignedToAccessibilityButton(COMPONENT_NAME.flattenToString()); mUserState.setTouchExplorationEnabledLocked(true); mUserState.setMagnificationSingleFingerTripleTapEnabledLocked(true); @@ -186,6 +188,7 @@ public class AccessibilityUserStateTest { assertTrue(mUserState.mTouchExplorationGrantedServices.isEmpty()); assertTrue(mUserState.getShortcutTargetsLocked(HARDWARE).isEmpty()); assertTrue(mUserState.getShortcutTargetsLocked(SOFTWARE).isEmpty()); + assertTrue(mUserState.getShortcutTargetsLocked(GESTURE).isEmpty()); assertNull(mUserState.getTargetAssignedToAccessibilityButton()); assertFalse(mUserState.isTouchExplorationEnabledLocked()); assertFalse(mUserState.isMagnificationSingleFingerTripleTapEnabledLocked()); |