summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/view/accessibility/AccessibilityManager.java31
-rw-r--r--core/java/android/view/accessibility/IAccessibilityManager.aidl2
-rw-r--r--core/java/com/android/internal/accessibility/dialog/AccessibilityButtonChooserActivity.java7
-rw-r--r--packages/SystemUI/src/com/android/systemui/accessibility/SystemActions.java12
-rw-r--r--packages/SystemUI/src/com/android/systemui/navigationbar/views/NavigationBar.java11
-rw-r--r--packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java21
-rw-r--r--services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java49
-rw-r--r--services/accessibility/java/com/android/server/accessibility/AccessibilityUserState.java12
-rw-r--r--services/tests/servicestests/src/com/android/server/accessibility/AccessibilityManagerServiceTest.java93
-rw-r--r--services/tests/servicestests/src/com/android/server/accessibility/AccessibilityUserStateTest.java47
10 files changed, 238 insertions, 47 deletions
diff --git a/core/java/android/view/accessibility/AccessibilityManager.java b/core/java/android/view/accessibility/AccessibilityManager.java
index a87e5c8e1b56..2b7cf427a562 100644
--- a/core/java/android/view/accessibility/AccessibilityManager.java
+++ b/core/java/android/view/accessibility/AccessibilityManager.java
@@ -1774,7 +1774,8 @@ public final class AccessibilityManager {
}
/**
- * Notifies that the accessibility button in the system's navigation area has been clicked
+ * Notifies that the accessibility button in the system's navigation area has been clicked,
+ * or a gesture shortcut input has been performed.
*
* @param displayId The logical display id.
* @hide
@@ -1785,7 +1786,8 @@ public final class AccessibilityManager {
}
/**
- * Perform the accessibility button for the given target which is assigned to the button.
+ * Perform the accessibility button or gesture
+ * for the given target which is assigned to the button.
*
* @param displayId displayId The logical display id.
* @param targetName The flattened {@link ComponentName} string or the class name of a system
@@ -1810,6 +1812,31 @@ public final class AccessibilityManager {
}
/**
+ * Notifies that a shortcut was long-clicked.
+ * This displays the dialog used to select which target the given shortcut will use,
+ * from its list of targets.
+ * The current shortcut type is determined by the current navigation mode.
+ *
+ * @param displayId The id of the display to show the dialog on.
+ * @hide
+ */
+ @RequiresPermission(Manifest.permission.STATUS_BAR_SERVICE)
+ public void notifyAccessibilityButtonLongClicked(int displayId) {
+ final IAccessibilityManager service;
+ synchronized (mLock) {
+ service = getServiceLocked();
+ if (service == null) {
+ return;
+ }
+ }
+ try {
+ service.notifyAccessibilityButtonLongClicked(displayId);
+ } catch (RemoteException re) {
+ Log.e(LOG_TAG, "Error while dispatching accessibility button long click. ", re);
+ }
+ }
+
+ /**
* Notifies that the visibility of the accessibility button in the system's navigation area
* has changed.
*
diff --git a/core/java/android/view/accessibility/IAccessibilityManager.aidl b/core/java/android/view/accessibility/IAccessibilityManager.aidl
index 2de3ce8532e3..e04fa1537d54 100644
--- a/core/java/android/view/accessibility/IAccessibilityManager.aidl
+++ b/core/java/android/view/accessibility/IAccessibilityManager.aidl
@@ -88,6 +88,8 @@ interface IAccessibilityManager {
@EnforcePermission("STATUS_BAR_SERVICE")
void notifyAccessibilityButtonClicked(int displayId, String targetName);
+ @EnforcePermission("STATUS_BAR_SERVICE")
+ void notifyAccessibilityButtonLongClicked(int displayId);
@EnforcePermission("STATUS_BAR_SERVICE")
void notifyAccessibilityButtonVisibilityChanged(boolean available);
diff --git a/core/java/com/android/internal/accessibility/dialog/AccessibilityButtonChooserActivity.java b/core/java/com/android/internal/accessibility/dialog/AccessibilityButtonChooserActivity.java
index 01cbb5514669..81d8adfce2ae 100644
--- a/core/java/com/android/internal/accessibility/dialog/AccessibilityButtonChooserActivity.java
+++ b/core/java/com/android/internal/accessibility/dialog/AccessibilityButtonChooserActivity.java
@@ -20,7 +20,6 @@ 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;
@@ -44,6 +43,8 @@ import java.util.List;
* Activity used to display and persist a service or feature target for the Accessibility button.
*/
public class AccessibilityButtonChooserActivity extends Activity {
+ public static final String EXTRA_TYPE_TO_CHOOSE = "TYPE";
+
private final List<AccessibilityTarget> mTargets = new ArrayList<>();
@Override
@@ -67,8 +68,8 @@ 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;
+ final int targetType = android.provider.Flags.a11yStandaloneGestureEnabled()
+ ? getIntent().getIntExtra(EXTRA_TYPE_TO_CHOOSE, SOFTWARE) : SOFTWARE;
if (isGestureNavigateEnabled) {
final TextView promptPrologue = findViewById(R.id.accessibility_button_prompt_prologue);
diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/SystemActions.java b/packages/SystemUI/src/com/android/systemui/accessibility/SystemActions.java
index 7750f6bf4178..51c5b00daae4 100644
--- a/packages/SystemUI/src/com/android/systemui/accessibility/SystemActions.java
+++ b/packages/SystemUI/src/com/android/systemui/accessibility/SystemActions.java
@@ -18,8 +18,6 @@ package com.android.systemui.accessibility;
import static android.view.WindowManager.ScreenshotSource.SCREENSHOT_ACCESSIBILITY_ACTIONS;
-import static com.android.internal.accessibility.common.ShortcutConstants.CHOOSER_PACKAGE_NAME;
-
import android.accessibilityservice.AccessibilityService;
import android.app.PendingIntent;
import android.app.RemoteAction;
@@ -45,7 +43,6 @@ import android.view.accessibility.AccessibilityManager;
import android.view.accessibility.Flags;
import com.android.internal.R;
-import com.android.internal.accessibility.dialog.AccessibilityButtonChooserActivity;
import com.android.internal.accessibility.util.AccessibilityUtils;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.ScreenshotHelper;
@@ -561,16 +558,13 @@ public class SystemActions implements CoreStartable, ConfigurationController.Con
}
private void handleAccessibilityButton() {
- AccessibilityManager.getInstance(mContext).notifyAccessibilityButtonClicked(
+ mA11yManager.notifyAccessibilityButtonClicked(
mDisplayTracker.getDefaultDisplayId());
}
private void handleAccessibilityButtonChooser() {
- final Intent intent = new Intent(AccessibilityManager.ACTION_CHOOSE_ACCESSIBILITY_BUTTON);
- intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
- final String chooserClassName = AccessibilityButtonChooserActivity.class.getName();
- intent.setClassName(CHOOSER_PACKAGE_NAME, chooserClassName);
- mContext.startActivityAsUser(intent, mUserTracker.getUserHandle());
+ mA11yManager.notifyAccessibilityButtonLongClicked(
+ mDisplayTracker.getDefaultDisplayId());
}
private void handleAccessibilityShortcut() {
diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/views/NavigationBar.java b/packages/SystemUI/src/com/android/systemui/navigationbar/views/NavigationBar.java
index e8c90c1fc9bf..c70a5234dfca 100644
--- a/packages/SystemUI/src/com/android/systemui/navigationbar/views/NavigationBar.java
+++ b/packages/SystemUI/src/com/android/systemui/navigationbar/views/NavigationBar.java
@@ -34,7 +34,6 @@ import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD;
import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_3BUTTON;
import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL;
-import static com.android.internal.accessibility.common.ShortcutConstants.CHOOSER_PACKAGE_NAME;
import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.HOME_BUTTON_LONG_PRESS_DURATION_MS;
import static com.android.systemui.navigationbar.NavBarHelper.transitionMode;
import static com.android.systemui.recents.OverviewProxyService.OverviewProxyListener;
@@ -60,7 +59,6 @@ import android.app.ActivityTaskManager;
import android.app.IActivityTaskManager;
import android.app.StatusBarManager;
import android.content.Context;
-import android.content.Intent;
import android.content.res.Configuration;
import android.graphics.Insets;
import android.graphics.PixelFormat;
@@ -105,7 +103,6 @@ import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import com.android.app.viewcapture.ViewCaptureAwareWindowManager;
-import com.android.internal.accessibility.dialog.AccessibilityButtonChooserActivity;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.UiEvent;
import com.android.internal.logging.UiEventLogger;
@@ -1625,11 +1622,9 @@ public class NavigationBar extends ViewController<NavigationBarView> implements
}
private boolean onAccessibilityLongClick(View v) {
- final Intent intent = new Intent(AccessibilityManager.ACTION_CHOOSE_ACCESSIBILITY_BUTTON);
- intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
- final String chooserClassName = AccessibilityButtonChooserActivity.class.getName();
- intent.setClassName(CHOOSER_PACKAGE_NAME, chooserClassName);
- mContext.startActivityAsUser(intent, mUserTracker.getUserHandle());
+ final Display display = v.getDisplay();
+ mAccessibilityManager.notifyAccessibilityButtonLongClicked(
+ display != null ? display.getDisplayId() : mDisplayTracker.getDefaultDisplayId());
return true;
}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java
index 000781acec58..a402a9d5ae7c 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java
@@ -25,7 +25,6 @@ import static android.view.MotionEvent.ACTION_DOWN;
import static android.view.MotionEvent.ACTION_UP;
import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_3BUTTON;
-import static com.android.internal.accessibility.common.ShortcutConstants.CHOOSER_PACKAGE_NAME;
import static com.android.systemui.shared.system.QuickStepContract.KEY_EXTRA_SYSUI_PROXY;
import static com.android.systemui.shared.system.QuickStepContract.KEY_EXTRA_UNFOLD_ANIMATION_FORWARDER;
import static com.android.systemui.shared.system.QuickStepContract.KEY_EXTRA_UNLOCK_ANIMATION_CONTROLLER;
@@ -76,7 +75,6 @@ import android.view.inputmethod.InputMethodManager;
import androidx.annotation.NonNull;
-import com.android.internal.accessibility.dialog.AccessibilityButtonChooserActivity;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.app.AssistUtils;
import com.android.internal.app.IVoiceInteractionSessionListener;
@@ -404,23 +402,16 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis
@Override
public void notifyAccessibilityButtonClicked(int displayId) {
verifyCallerAndClearCallingIdentity("notifyAccessibilityButtonClicked", () ->
- AccessibilityManager.getInstance(mContext)
- .notifyAccessibilityButtonClicked(displayId));
+ AccessibilityManager.getInstance(mContext).notifyAccessibilityButtonClicked(
+ displayId));
}
@Override
public void notifyAccessibilityButtonLongClicked() {
- verifyCallerAndClearCallingIdentity("notifyAccessibilityButtonLongClicked",
- () -> {
- final Intent intent =
- new Intent(AccessibilityManager.ACTION_CHOOSE_ACCESSIBILITY_BUTTON);
- final String chooserClassName = AccessibilityButtonChooserActivity
- .class.getName();
- intent.setClassName(CHOOSER_PACKAGE_NAME, chooserClassName);
- intent.addFlags(
- Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
- mContext.startActivityAsUser(intent, mUserTracker.getUserHandle());
- });
+ verifyCallerAndClearCallingIdentity("notifyAccessibilityButtonLongClicked", () ->
+ AccessibilityManager.getInstance(mContext)
+ .notifyAccessibilityButtonLongClicked(
+ mDisplayTracker.getDefaultDisplayId()));
}
@Override
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
index b541345e1cb8..7580b697b516 100644
--- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
+++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
@@ -58,6 +58,7 @@ import static com.android.internal.accessibility.common.ShortcutConstants.UserSh
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 static com.android.internal.accessibility.dialog.AccessibilityButtonChooserActivity.EXTRA_TYPE_TO_CHOOSE;
import static com.android.internal.accessibility.util.AccessibilityStatsLogUtils.logAccessibilityShortcutActivated;
import static com.android.internal.accessibility.util.AccessibilityUtils.isUserSetupCompleted;
import static com.android.internal.util.FunctionalUtils.ignoreRemoteException;
@@ -1616,7 +1617,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
/**
* Invoked remotely over AIDL by SysUi when the accessibility button within the system's
- * navigation area has been clicked.
+ * navigation area has been clicked, or a gesture shortcut input has been performed.
*
* @param displayId The logical display id.
* @param targetName The flattened {@link ComponentName} string or the class name of a system
@@ -1646,7 +1647,26 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
}
mMainHandler.sendMessage(obtainMessage(
AccessibilityManagerService::performAccessibilityShortcutInternal, this,
- displayId, SOFTWARE, targetName));
+ displayId, getShortcutTypeForGenericShortcutCalls(currentUserId), targetName));
+ }
+
+ /**
+ * AIDL-exposed method to show the dialog
+ * for choosing the target for the gesture or button shortcuts.
+ * The shortcut is determined by the current navigation mode.
+ *
+ * @param displayId The id for the display to show the dialog on.
+ */
+ @Override
+ @EnforcePermission(STATUS_BAR_SERVICE)
+ public void notifyAccessibilityButtonLongClicked(int displayId) {
+ notifyAccessibilityButtonLongClicked_enforcePermission();
+ int userId;
+ synchronized (mLock) {
+ userId = mCurrentUserId;
+ }
+ showAccessibilityTargetsSelection(displayId,
+ getShortcutTypeForGenericShortcutCalls(userId), userId);
}
/**
@@ -2344,16 +2364,18 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
}
}
- private void showAccessibilityTargetsSelection(int displayId,
- @UserShortcutType int shortcutType) {
+ private void showAccessibilityTargetsSelection(int displayId, int shortcutType,
+ int userId) {
final Intent intent = new Intent(AccessibilityManager.ACTION_CHOOSE_ACCESSIBILITY_BUTTON);
final String chooserClassName = (shortcutType == HARDWARE)
? AccessibilityShortcutChooserActivity.class.getName()
: AccessibilityButtonChooserActivity.class.getName();
intent.setClassName(CHOOSER_PACKAGE_NAME, chooserClassName);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
+ intent.putExtra(EXTRA_TYPE_TO_CHOOSE, shortcutType);
final Bundle bundle = ActivityOptions.makeBasic().setLaunchDisplayId(displayId).toBundle();
- mContext.startActivityAsUser(intent, bundle, UserHandle.of(mCurrentUserId));
+ mMainHandler.post(() ->
+ mContext.startActivityAsUser(intent, bundle, UserHandle.of(userId)));
}
private void launchShortcutTargetActivity(int displayId, ComponentName name) {
@@ -4011,7 +4033,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
* Perform the accessibility shortcut action.
*
* @param shortcutType The shortcut type.
- * @param displayId The display id of the accessibility button.
+ * @param displayId The display id the shortcut is being performed from.
* @param targetName The flattened {@link ComponentName} string or the class name of a system
* class implementing a supported accessibility feature, or {@code null} if there's no
* specified target.
@@ -4031,7 +4053,8 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
if (targetName == null) {
// In case there are many targets assigned to the given shortcut.
if (shortcutTargets.size() > 1) {
- showAccessibilityTargetsSelection(displayId, shortcutType);
+ showAccessibilityTargetsSelection(
+ displayId, shortcutType, getCurrentUserState().mUserId);
return;
}
targetName = shortcutTargets.get(0);
@@ -6563,6 +6586,18 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
callback));
}
+ @VisibleForTesting
+ int getShortcutTypeForGenericShortcutCalls(int userId) {
+ int navigationMode = Settings.Secure.getIntForUser(
+ mContext.getContentResolver(),
+ Settings.Secure.NAVIGATION_MODE, -1, userId);
+ if (android.provider.Flags.a11yStandaloneGestureEnabled()) {
+ return (navigationMode == NAV_BAR_MODE_GESTURAL) ? GESTURE : SOFTWARE;
+ } else {
+ return SOFTWARE;
+ }
+ }
+
void attachAccessibilityOverlayToDisplayInternal(
int interactionId,
int displayId,
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityUserState.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityUserState.java
index b18e6ba8444d..0bf7ec001d4d 100644
--- a/services/accessibility/java/com/android/server/accessibility/AccessibilityUserState.java
+++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityUserState.java
@@ -57,6 +57,7 @@ import android.view.accessibility.IAccessibilityManagerClient;
import com.android.internal.R;
import com.android.internal.accessibility.AccessibilityShortcutController;
+import com.android.internal.accessibility.common.ShortcutConstants;
import com.android.internal.accessibility.util.ShortcutUtils;
import java.io.FileDescriptor;
@@ -707,11 +708,16 @@ class AccessibilityUserState {
}
/**
- * Returns true if navibar magnification or shortcut key magnification is enabled.
+ * Returns true if a magnification shortcut of any type is enabled.
*/
public boolean isShortcutMagnificationEnabledLocked() {
- return mAccessibilityShortcutKeyTargets.contains(MAGNIFICATION_CONTROLLER_NAME)
- || mAccessibilityButtonTargets.contains(MAGNIFICATION_CONTROLLER_NAME);
+ for (int shortcutType : ShortcutConstants.USER_SHORTCUT_TYPES) {
+ if (getShortcutTargetsInternalLocked(shortcutType)
+ .contains(MAGNIFICATION_CONTROLLER_NAME)) {
+ return true;
+ }
+ }
+ return false;
}
/**
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 2e6c93cb92aa..566feb7e3d80 100644
--- a/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityManagerServiceTest.java
@@ -35,6 +35,7 @@ import static com.android.internal.accessibility.common.ShortcutConstants.UserSh
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.dialog.AccessibilityButtonChooserActivity.EXTRA_TYPE_TO_CHOOSE;
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;
@@ -2046,6 +2047,53 @@ public class AccessibilityManagerServiceTest {
}
@Test
+ public void showAccessibilityTargetSelection_navBarNavigationMode_softwareExtra() {
+ mFakePermissionEnforcer.grant(Manifest.permission.STATUS_BAR_SERVICE);
+ final AccessibilityUserState userState = new AccessibilityUserState(
+ UserHandle.USER_SYSTEM, mTestableContext, mA11yms);
+ mA11yms.mUserStates.put(UserHandle.USER_SYSTEM, userState);
+ Settings.Secure.putIntForUser(mTestableContext.getContentResolver(),
+ NAVIGATION_MODE, NAV_BAR_MODE_3BUTTON, userState.mUserId);
+
+ mA11yms.notifyAccessibilityButtonLongClicked(Display.DEFAULT_DISPLAY);
+ mTestableLooper.processAllMessages();
+
+ assertStartActivityWithExpectedShortcutType(mTestableContext.getMockContext(), SOFTWARE);
+ }
+
+ @Test
+ @DisableFlags(android.provider.Flags.FLAG_A11Y_STANDALONE_GESTURE_ENABLED)
+ public void showAccessibilityTargetSelection_gestureNavigationMode_softwareExtra() {
+ mFakePermissionEnforcer.grant(Manifest.permission.STATUS_BAR_SERVICE);
+ final AccessibilityUserState userState = new AccessibilityUserState(
+ UserHandle.USER_SYSTEM, mTestableContext, mA11yms);
+ mA11yms.mUserStates.put(UserHandle.USER_SYSTEM, userState);
+ Settings.Secure.putIntForUser(mTestableContext.getContentResolver(),
+ NAVIGATION_MODE, NAV_BAR_MODE_GESTURAL, userState.mUserId);
+
+ mA11yms.notifyAccessibilityButtonLongClicked(Display.DEFAULT_DISPLAY);
+ mTestableLooper.processAllMessages();
+
+ assertStartActivityWithExpectedShortcutType(mTestableContext.getMockContext(), SOFTWARE);
+ }
+
+ @Test
+ @EnableFlags(android.provider.Flags.FLAG_A11Y_STANDALONE_GESTURE_ENABLED)
+ public void showAccessibilityTargetSelection_gestureNavigationMode_gestureExtra() {
+ mFakePermissionEnforcer.grant(Manifest.permission.STATUS_BAR_SERVICE);
+ final AccessibilityUserState userState = new AccessibilityUserState(
+ UserHandle.USER_SYSTEM, mTestableContext, mA11yms);
+ mA11yms.mUserStates.put(UserHandle.USER_SYSTEM, userState);
+ Settings.Secure.putIntForUser(mTestableContext.getContentResolver(),
+ NAVIGATION_MODE, NAV_BAR_MODE_GESTURAL, userState.mUserId);
+
+ mA11yms.notifyAccessibilityButtonLongClicked(Display.DEFAULT_DISPLAY);
+ mTestableLooper.processAllMessages();
+
+ assertStartActivityWithExpectedShortcutType(mTestableContext.getMockContext(), GESTURE);
+ }
+
+ @Test
public void registerUserInitializationCompleteCallback_isRegistered() {
mA11yms.mUserInitializationCompleteCallbacks.clear();
@@ -2075,6 +2123,43 @@ public class AccessibilityManagerServiceTest {
UserHandle.MIN_SECONDARY_USER_ID);
}
+ @Test
+ @DisableFlags(android.provider.Flags.FLAG_A11Y_STANDALONE_GESTURE_ENABLED)
+ public void getShortcutTypeForGenericShortcutCalls_softwareType() {
+ final AccessibilityUserState userState = new AccessibilityUserState(
+ UserHandle.USER_SYSTEM, mTestableContext, mA11yms);
+ mA11yms.mUserStates.put(UserHandle.USER_SYSTEM, userState);
+
+ assertThat(mA11yms.getShortcutTypeForGenericShortcutCalls(userState.mUserId))
+ .isEqualTo(SOFTWARE);
+ }
+
+ @Test
+ @EnableFlags(android.provider.Flags.FLAG_A11Y_STANDALONE_GESTURE_ENABLED)
+ public void getShortcutTypeForGenericShortcutCalls_gestureNavigationMode_gestureType() {
+ final AccessibilityUserState userState = new AccessibilityUserState(
+ UserHandle.USER_SYSTEM, mTestableContext, mA11yms);
+ mA11yms.mUserStates.put(UserHandle.USER_SYSTEM, userState);
+ Settings.Secure.putIntForUser(mTestableContext.getContentResolver(),
+ NAVIGATION_MODE, NAV_BAR_MODE_GESTURAL, userState.mUserId);
+
+ assertThat(mA11yms.getShortcutTypeForGenericShortcutCalls(userState.mUserId))
+ .isEqualTo(GESTURE);
+ }
+
+ @Test
+ @EnableFlags(android.provider.Flags.FLAG_A11Y_STANDALONE_GESTURE_ENABLED)
+ public void getShortcutTypeForGenericShortcutCalls_buttonNavigationMode_softwareType() {
+ final AccessibilityUserState userState = new AccessibilityUserState(
+ UserHandle.USER_SYSTEM, mTestableContext, mA11yms);
+ mA11yms.mUserStates.put(UserHandle.USER_SYSTEM, userState);
+ Settings.Secure.putIntForUser(mTestableContext.getContentResolver(),
+ NAVIGATION_MODE, NAV_BAR_MODE_3BUTTON, userState.mUserId);
+
+ assertThat(mA11yms.getShortcutTypeForGenericShortcutCalls(userState.mUserId))
+ .isEqualTo(SOFTWARE);
+ }
+
private Set<String> readStringsFromSetting(String setting) {
final Set<String> result = new ArraySet<>();
mA11yms.readColonDelimitedSettingToSet(
@@ -2148,6 +2233,14 @@ public class AccessibilityManagerServiceTest {
Intent.EXTRA_COMPONENT_NAME)).isEqualTo(componentName);
}
+ private void assertStartActivityWithExpectedShortcutType(Context mockContext,
+ @UserShortcutType int shortcutType) {
+ verify(mockContext).startActivityAsUser(mIntentArgumentCaptor.capture(),
+ any(Bundle.class), any(UserHandle.class));
+ assertThat(mIntentArgumentCaptor.getValue().getIntExtra(
+ EXTRA_TYPE_TO_CHOOSE, -1)).isEqualTo(shortcutType);
+ }
+
private void setupShortcutTargetServices() {
setupShortcutTargetServices(mA11yms.getCurrentUserState());
}
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 62fa95149067..627b5e39a20a 100644
--- a/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityUserStateTest.java
+++ b/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityUserStateTest.java
@@ -28,10 +28,13 @@ 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.AccessibilityShortcutController.MAGNIFICATION_CONTROLLER_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;
+import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.TRIPLETAP;
+import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.TWOFINGER_DOUBLETAP;
import static com.android.server.accessibility.AccessibilityUserState.doesShortcutTargetsStringContain;
import static com.google.common.truth.Truth.assertThat;
@@ -67,6 +70,8 @@ import androidx.test.InstrumentationRegistry;
import com.android.internal.R;
import com.android.internal.accessibility.AccessibilityShortcutController;
+import com.android.internal.accessibility.common.ShortcutConstants;
+import com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType;
import com.android.internal.util.test.FakeSettingsProvider;
import org.junit.After;
@@ -504,6 +509,36 @@ public class AccessibilityUserStateTest {
assertThat(actual).containsExactly(tileComponent, mMockServiceInfo);
}
+ @Test
+ public void isShortcutMagnificationEnabledLocked_anyShortcutType_returnsTrue() {
+ // Clear every shortcut
+ for (int shortcutType : ShortcutConstants.USER_SHORTCUT_TYPES) {
+ setMagnificationForShortcutType(shortcutType, false);
+ }
+ // Check each shortcut individually
+ for (int shortcutType : ShortcutConstants.USER_SHORTCUT_TYPES) {
+ // Setup
+ setMagnificationForShortcutType(shortcutType, true);
+
+ // Checking
+ assertThat(mUserState.getShortcutTargetsLocked(shortcutType))
+ .containsExactly(MAGNIFICATION_CONTROLLER_NAME);
+ assertThat(mUserState.isShortcutMagnificationEnabledLocked()).isTrue();
+
+ // Cleanup
+ setMagnificationForShortcutType(shortcutType, false);
+ }
+ }
+
+ @Test
+ public void isShortcutMagnificationEnabledLocked_noShortcutTypes_returnsFalse() {
+ // Clear every shortcut
+ for (int shortcutType : ShortcutConstants.USER_SHORTCUT_TYPES) {
+ setMagnificationForShortcutType(shortcutType, false);
+ }
+ assertThat(mUserState.isShortcutMagnificationEnabledLocked()).isFalse();
+ }
+
private int getSecureIntForUser(String key, int userId) {
return Settings.Secure.getIntForUser(mMockResolver, key, -1, userId);
}
@@ -511,4 +546,16 @@ public class AccessibilityUserStateTest {
private void putSecureIntForUser(String key, int value, int userId) {
Settings.Secure.putIntForUser(mMockResolver, key, value, userId);
}
+
+ private void setMagnificationForShortcutType(
+ @UserShortcutType int shortcutType, boolean enabled) {
+ if (shortcutType == TRIPLETAP) {
+ mUserState.setMagnificationSingleFingerTripleTapEnabledLocked(enabled);
+ } else if (shortcutType == TWOFINGER_DOUBLETAP) {
+ mUserState.setMagnificationTwoFingerTripleTapEnabledLocked(enabled);
+ } else {
+ mUserState.updateShortcutTargetsLocked(
+ enabled ? Set.of(MAGNIFICATION_CONTROLLER_NAME) : Set.of(), shortcutType);
+ }
+ }
}