summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/com/android/internal/accessibility/common/ShortcutConstants.java3
-rw-r--r--core/java/com/android/internal/accessibility/dialog/AccessibilityButtonChooserActivity.java6
-rw-r--r--core/java/com/android/internal/accessibility/dialog/AccessibilityShortcutChooserActivity.java6
-rw-r--r--core/java/com/android/internal/accessibility/dialog/AccessibilityTarget.java4
-rw-r--r--core/java/com/android/internal/accessibility/util/AccessibilityStatsLogUtils.java3
-rw-r--r--core/java/com/android/internal/accessibility/util/ShortcutUtils.java3
-rw-r--r--core/tests/coretests/src/com/android/internal/accessibility/dialog/AccessibilityTargetTest.java36
-rw-r--r--core/tests/coretests/src/com/android/internal/accessibility/util/ShortcutUtilsTest.java15
-rw-r--r--services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java39
-rw-r--r--services/accessibility/java/com/android/server/accessibility/AccessibilityUserState.java66
-rw-r--r--services/tests/servicestests/src/com/android/server/accessibility/AccessibilityUserStateTest.java3
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());