Refactoring performAccessibilityShortcut

Internal function (managerService) was already paramaterized.
Paramaterizing external function (manager) allows us to clean up code
from AccessibilityTarget, and will help with expandability in the future.

Test: atest com.android.server.accessibility
Flag: EXEMPT internal refactoring
Bug: 330775538
Change-Id: I5419dc1a5b70bdb8c208c2222bf997be16aff746
diff --git a/core/java/android/view/accessibility/AccessibilityManager.java b/core/java/android/view/accessibility/AccessibilityManager.java
index 3fc9ebc..a4cea33 100644
--- a/core/java/android/view/accessibility/AccessibilityManager.java
+++ b/core/java/android/view/accessibility/AccessibilityManager.java
@@ -19,6 +19,8 @@
 import static android.accessibilityservice.AccessibilityServiceInfo.FLAG_ENABLE_ACCESSIBILITY_VOLUME;
 import static android.annotation.SystemApi.Client.MODULE_LIBRARIES;
 
+import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.HARDWARE;
+
 import android.Manifest;
 import android.accessibilityservice.AccessibilityService;
 import android.accessibilityservice.AccessibilityServiceInfo;
@@ -62,6 +64,7 @@
 import android.util.ArrayMap;
 import android.util.Log;
 import android.util.SparseArray;
+import android.view.Display;
 import android.view.IWindow;
 import android.view.SurfaceControl;
 import android.view.View;
@@ -69,6 +72,7 @@
 
 import com.android.internal.R;
 import com.android.internal.accessibility.common.ShortcutConstants;
+import com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType;
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.util.IntPair;
 
@@ -1565,7 +1569,7 @@
     @SystemApi
     @RequiresPermission(Manifest.permission.MANAGE_ACCESSIBILITY)
     public void performAccessibilityShortcut() {
-        performAccessibilityShortcut(null);
+        performAccessibilityShortcut(Display.DEFAULT_DISPLAY, HARDWARE, null);
     }
 
     /**
@@ -1577,7 +1581,8 @@
      * @hide
      */
     @RequiresPermission(Manifest.permission.MANAGE_ACCESSIBILITY)
-    public void performAccessibilityShortcut(@Nullable String targetName) {
+    public void performAccessibilityShortcut(
+            int displayId, @UserShortcutType int shortcutType, @Nullable String targetName) {
         final IAccessibilityManager service;
         synchronized (mLock) {
             service = getServiceLocked();
@@ -1586,7 +1591,7 @@
             }
         }
         try {
-            service.performAccessibilityShortcut(targetName);
+            service.performAccessibilityShortcut(displayId, shortcutType, targetName);
         } catch (RemoteException re) {
             Log.e(LOG_TAG, "Error performing accessibility shortcut. ", re);
         }
@@ -1602,7 +1607,7 @@
      */
     @RequiresPermission(Manifest.permission.MANAGE_ACCESSIBILITY)
     public void enableShortcutsForTargets(boolean enable,
-            @ShortcutConstants.UserShortcutType int shortcutTypes, @NonNull Set<String> targets,
+            @UserShortcutType int shortcutTypes, @NonNull Set<String> targets,
             @UserIdInt int userId) {
         final IAccessibilityManager service;
         synchronized (mLock) {
@@ -1817,7 +1822,7 @@
     @RequiresPermission(Manifest.permission.MANAGE_ACCESSIBILITY)
     @NonNull
     public List<String> getAccessibilityShortcutTargets(
-            @ShortcutConstants.UserShortcutType int shortcutType) {
+            @UserShortcutType int shortcutType) {
         final IAccessibilityManager service;
         synchronized (mLock) {
             service = getServiceLocked();
diff --git a/core/java/android/view/accessibility/IAccessibilityManager.aidl b/core/java/android/view/accessibility/IAccessibilityManager.aidl
index cd11314..72a1fe4 100644
--- a/core/java/android/view/accessibility/IAccessibilityManager.aidl
+++ b/core/java/android/view/accessibility/IAccessibilityManager.aidl
@@ -92,7 +92,7 @@
     void notifyAccessibilityButtonVisibilityChanged(boolean available);
 
     @EnforcePermission("MANAGE_ACCESSIBILITY")
-    void performAccessibilityShortcut(String targetName);
+    void performAccessibilityShortcut(int displayId, int shortcutType, String targetName);
 
     @EnforcePermission("MANAGE_ACCESSIBILITY")
     List<String> getAccessibilityShortcutTargets(int shortcutType);
diff --git a/core/java/com/android/internal/accessibility/dialog/AccessibilityTarget.java b/core/java/com/android/internal/accessibility/dialog/AccessibilityTarget.java
index 66faa31..ec90dd2 100644
--- a/core/java/com/android/internal/accessibility/dialog/AccessibilityTarget.java
+++ b/core/java/com/android/internal/accessibility/dialog/AccessibilityTarget.java
@@ -36,6 +36,7 @@
 import com.android.internal.accessibility.common.ShortcutConstants.AccessibilityFragmentType;
 import com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType;
 import com.android.internal.accessibility.dialog.TargetAdapter.ViewHolder;
+import com.android.internal.accessibility.util.ShortcutUtils;
 import com.android.internal.annotations.VisibleForTesting;
 
 import java.util.Set;
@@ -67,6 +68,10 @@
     public AccessibilityTarget(Context context, @UserShortcutType int shortcutType,
             @AccessibilityFragmentType int fragmentType, boolean isShortcutSwitched, String id,
             int uid, CharSequence label, Drawable icon, String key) {
+        if (!isRecognizedShortcutType(shortcutType)) {
+            throw new IllegalArgumentException(
+                    "Unexpected shortcut type " + ShortcutUtils.convertToKey(shortcutType));
+        }
         mContext = context;
         mShortcutType = shortcutType;
         mFragmentType = fragmentType;
@@ -97,20 +102,15 @@
         holder.mStatusView.setVisibility(View.GONE);
     }
 
+    @SuppressLint("MissingPermission")
     @Override
     public void onSelected() {
         final AccessibilityManager am =
                 getContext().getSystemService(AccessibilityManager.class);
-        switch (getShortcutType()) {
-            case SOFTWARE:
-                am.notifyAccessibilityButtonClicked(getContext().getDisplayId(), getId());
-                return;
-            case HARDWARE:
-                am.performAccessibilityShortcut(getId());
-                return;
-            default:
-                throw new IllegalStateException("Unexpected shortcut type");
+        if (am == null) {
+            return;
         }
+        am.performAccessibilityShortcut(getContext().getDisplayId(), mShortcutType, getId());
     }
 
     @SuppressLint("MissingPermission")
@@ -188,4 +188,15 @@
     public String getKey() {
         return mKey;
     }
+
+    /**
+     * Determines if the provided shortcut type is valid for use with AccessibilityTargets.
+     * @param shortcutType shortcut type to check.
+     * @return {@code true} if the shortcut type can be used, {@code false} otherwise.
+     */
+    @VisibleForTesting
+    public static boolean isRecognizedShortcutType(@UserShortcutType int shortcutType) {
+        int mask = SOFTWARE | HARDWARE;
+        return (shortcutType != 0 && (shortcutType & mask) == shortcutType);
+    }
 }
diff --git a/core/java/com/android/internal/accessibility/dialog/AccessibilityTargetHelper.java b/core/java/com/android/internal/accessibility/dialog/AccessibilityTargetHelper.java
index e523ab0..4ccdf79 100644
--- a/core/java/com/android/internal/accessibility/dialog/AccessibilityTargetHelper.java
+++ b/core/java/com/android/internal/accessibility/dialog/AccessibilityTargetHelper.java
@@ -41,6 +41,7 @@
 import com.android.internal.R;
 import com.android.internal.accessibility.common.ShortcutConstants.AccessibilityFragmentType;
 import com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType;
+import com.android.internal.annotations.VisibleForTesting;
 
 import java.util.ArrayList;
 import java.util.Collections;
@@ -159,21 +160,32 @@
 
         final List<AccessibilityTarget> targets = new ArrayList<>(installedServices.size());
         for (AccessibilityServiceInfo info : installedServices) {
-            final int targetSdk =
-                    info.getResolveInfo().serviceInfo.applicationInfo.targetSdkVersion;
-            final boolean hasRequestAccessibilityButtonFlag =
-                    (info.flags & AccessibilityServiceInfo.FLAG_REQUEST_ACCESSIBILITY_BUTTON) != 0;
-            if ((targetSdk <= Build.VERSION_CODES.Q) && !hasRequestAccessibilityButtonFlag
-                    && (shortcutType == SOFTWARE)) {
-                continue;
+            if (isValidServiceTarget(info, shortcutType)) {
+                targets.add(createAccessibilityServiceTarget(context, shortcutType, info));
             }
-
-            targets.add(createAccessibilityServiceTarget(context, shortcutType, info));
         }
 
         return targets;
     }
 
+    /**
+     * Check for maintaining compatibility on prior versions.
+     * Determines if a given service should be accumulated in a list of installed services.
+     * @param info service info to check.
+     * @param shortcutType type of shortcut to accumulate a list for.
+     * @return {@code true} if the service should be added (always true past version Q),
+     * otherwise {@code false}.
+     */
+    @VisibleForTesting
+    public static boolean isValidServiceTarget(
+            AccessibilityServiceInfo info, @UserShortcutType int shortcutType) {
+        final boolean hasRequestAccessibilityButtonFlag =
+                (info.flags & AccessibilityServiceInfo.FLAG_REQUEST_ACCESSIBILITY_BUTTON) != 0;
+        return (info.getResolveInfo().serviceInfo.applicationInfo.targetSdkVersion
+                > Build.VERSION_CODES.Q) || hasRequestAccessibilityButtonFlag
+                || shortcutType != SOFTWARE;
+    }
+
     private static List<AccessibilityTarget> getAccessibilityActivityTargets(Context context,
             @UserShortcutType int shortcutType) {
         final AccessibilityManager am = (AccessibilityManager) context.getSystemService(
diff --git a/core/tests/coretests/src/android/view/accessibility/AccessibilityManagerTest.java b/core/tests/coretests/src/android/view/accessibility/AccessibilityManagerTest.java
index 1013bf5..ce36ee0 100644
--- a/core/tests/coretests/src/android/view/accessibility/AccessibilityManagerTest.java
+++ b/core/tests/coretests/src/android/view/accessibility/AccessibilityManagerTest.java
@@ -20,6 +20,7 @@
 import static com.android.internal.accessibility.AccessibilityShortcutController.COLOR_INVERSION_TILE_COMPONENT_NAME;
 import static com.android.internal.accessibility.AccessibilityShortcutController.DALTONIZER_COMPONENT_NAME;
 import static com.android.internal.accessibility.AccessibilityShortcutController.DALTONIZER_TILE_COMPONENT_NAME;
+import static com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType.HARDWARE;
 
 import static com.google.common.truth.Truth.assertThat;
 
@@ -31,6 +32,8 @@
 import static org.junit.Assert.fail;
 import static org.mockito.ArgumentMatchers.anyBoolean;
 import static org.mockito.ArgumentMatchers.anyList;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.ArgumentMatchers.isNull;
 import static org.mockito.Matchers.any;
 import static org.mockito.Matchers.anyInt;
 import static org.mockito.Mockito.doThrow;
@@ -48,12 +51,14 @@
 import android.os.Bundle;
 import android.os.RemoteException;
 import android.os.UserHandle;
+import android.view.Display;
 
 import androidx.annotation.NonNull;
 import androidx.test.InstrumentationRegistry;
 import androidx.test.runner.AndroidJUnit4;
 
 import com.android.internal.R;
+import com.android.internal.accessibility.common.ShortcutConstants;
 import com.android.internal.accessibility.common.ShortcutConstants.UserShortcutType;
 import com.android.internal.util.IntPair;
 import com.android.server.accessibility.test.MessageCapturingHandler;
@@ -321,7 +326,7 @@
         Throwable rethrownException = assertThrows(RuntimeException.class,
                 () -> manager.enableShortcutsForTargets(
                         /* enable= */ false,
-                        UserShortcutType.HARDWARE,
+                        HARDWARE,
                         Set.of(DALTONIZER_COMPONENT_NAME.flattenToString()),
                         UserHandle.USER_CURRENT
                 ));
@@ -331,7 +336,7 @@
     @Test
     public void enableShortcutsForTargets_verifyServiceMethodCalled() throws Exception {
         AccessibilityManager manager = createManager(WITH_A11Y_ENABLED);
-        int shortcutTypes = UserShortcutType.HARDWARE | UserShortcutType.TRIPLETAP;
+        int shortcutTypes = HARDWARE | UserShortcutType.TRIPLETAP;
 
         manager.enableShortcutsForTargets(
                 /* enable= */ false,
@@ -348,6 +353,30 @@
         );
     }
 
+    @Test
+    public void performAccessibilityShortcut_callToService_defaultTypeIsHardware()
+            throws Exception {
+        AccessibilityManager manager = createManager(WITH_A11Y_ENABLED);
+
+        manager.performAccessibilityShortcut();
+
+        verify(mMockService).performAccessibilityShortcut(
+                eq(Display.DEFAULT_DISPLAY), eq(HARDWARE), isNull());
+    }
+
+    @Test
+    public void performAccessibilityShortcut_callToService_typeParameterMatches() throws Exception {
+        AccessibilityManager manager = createManager(WITH_A11Y_ENABLED);
+        int display = Display.DEFAULT_DISPLAY;
+        String name = LABEL;
+
+        for (int type: ShortcutConstants.USER_SHORTCUT_TYPES) {
+            manager.performAccessibilityShortcut(display, type, name);
+
+            verify(mMockService).performAccessibilityShortcut(display, type, name);
+        }
+    }
+
     private class MyAccessibilityProxy extends AccessibilityDisplayProxy {
         MyAccessibilityProxy(int displayId,
                 @NonNull List<AccessibilityServiceInfo> serviceInfos) {
diff --git a/core/tests/coretests/src/com/android/internal/accessibility/AccessibilityShortcutControllerTest.java b/core/tests/coretests/src/com/android/internal/accessibility/AccessibilityShortcutControllerTest.java
index 6b9dbba..f78bc92 100644
--- a/core/tests/coretests/src/com/android/internal/accessibility/AccessibilityShortcutControllerTest.java
+++ b/core/tests/coretests/src/com/android/internal/accessibility/AccessibilityShortcutControllerTest.java
@@ -71,6 +71,7 @@
 import android.speech.tts.TextToSpeech;
 import android.speech.tts.Voice;
 import android.test.mock.MockContentResolver;
+import android.view.Display;
 import android.view.Window;
 import android.view.WindowManager;
 import android.view.accessibility.AccessibilityManager;
@@ -378,7 +379,8 @@
         verify(mAlertDialog).show();
         verify(mAccessibilityManagerService, atLeastOnce()).getInstalledAccessibilityServiceList(
                 anyInt());
-        verify(mAccessibilityManagerService, times(0)).performAccessibilityShortcut(null);
+        verify(mAccessibilityManagerService, times(0)).performAccessibilityShortcut(
+                Display.DEFAULT_DISPLAY, HARDWARE, null);
         verify(mFrameworkObjectProvider, times(0)).getTextToSpeech(any(), any());
     }
 
@@ -397,7 +399,8 @@
         // assertEquals(WindowManager.LayoutParams.SYSTEM_FLAG_SHOW_FOR_ALL_USERS,
         //        mLayoutParams.privateFlags
         //                & WindowManager.LayoutParams.SYSTEM_FLAG_SHOW_FOR_ALL_USERS);
-        verify(mAccessibilityManagerService, times(1)).performAccessibilityShortcut(null);
+        verify(mAccessibilityManagerService, times(1)).performAccessibilityShortcut(
+                Display.DEFAULT_DISPLAY, HARDWARE, null);
     }
 
     @Test
@@ -630,7 +633,8 @@
 
         verifyZeroInteractions(mAlertDialogBuilder, mAlertDialog);
         verify(mToast).show();
-        verify(mAccessibilityManagerService).performAccessibilityShortcut(null);
+        verify(mAccessibilityManagerService).performAccessibilityShortcut(
+                Display.DEFAULT_DISPLAY, HARDWARE, null);
     }
 
     @Test
@@ -649,7 +653,8 @@
         verify(mAccessibilityManagerService).enableShortcutsForTargets(
                 eq(true), eq(HARDWARE), mListCaptor.capture(), anyInt());
         assertThat(mListCaptor.getValue()).containsExactly(SERVICE_NAME_STRING);
-        verify(mAccessibilityManagerService).performAccessibilityShortcut(null);
+        verify(mAccessibilityManagerService).performAccessibilityShortcut(
+                Display.DEFAULT_DISPLAY, HARDWARE, null);
     }
 
     @Test
@@ -666,7 +671,8 @@
 
         assertThat(Settings.Secure.getString(mContentResolver,
                 ACCESSIBILITY_SHORTCUT_TARGET_SERVICE)).isEqualTo(SERVICE_NAME_STRING);
-        verify(mAccessibilityManagerService).performAccessibilityShortcut(null);
+        verify(mAccessibilityManagerService).performAccessibilityShortcut(
+                Display.DEFAULT_DISPLAY, HARDWARE, null);
     }
 
     @Test
@@ -726,7 +732,8 @@
         Settings.Secure.putInt(mContentResolver, ACCESSIBILITY_SHORTCUT_DIALOG_SHOWN,
                 AccessibilityShortcutController.DialogStatus.SHOWN);
         getController().performAccessibilityShortcut();
-        verify(mAccessibilityManagerService).performAccessibilityShortcut(null);
+        verify(mAccessibilityManagerService).performAccessibilityShortcut(
+                Display.DEFAULT_DISPLAY, HARDWARE, null);
     }
 
     @Test
@@ -739,7 +746,8 @@
         getController().performAccessibilityShortcut();
 
         verifyZeroInteractions(mToast);
-        verify(mAccessibilityManagerService).performAccessibilityShortcut(null);
+        verify(mAccessibilityManagerService).performAccessibilityShortcut(
+                Display.DEFAULT_DISPLAY, HARDWARE, null);
     }
 
     @Test
@@ -755,7 +763,8 @@
         getController().performAccessibilityShortcut();
 
         verifyZeroInteractions(mToast);
-        verify(mAccessibilityManagerService).performAccessibilityShortcut(null);
+        verify(mAccessibilityManagerService).performAccessibilityShortcut(
+                Display.DEFAULT_DISPLAY, HARDWARE, null);
     }
 
     @Test
diff --git a/core/tests/coretests/src/com/android/internal/accessibility/dialog/AccessibilityTargetHelperTest.java b/core/tests/coretests/src/com/android/internal/accessibility/dialog/AccessibilityTargetHelperTest.java
new file mode 100644
index 0000000..64be97d
--- /dev/null
+++ b/core/tests/coretests/src/com/android/internal/accessibility/dialog/AccessibilityTargetHelperTest.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.internal.accessibility.dialog;
+
+import static android.accessibilityservice.AccessibilityServiceInfo.DEFAULT;
+import static android.accessibilityservice.AccessibilityServiceInfo.FLAG_REQUEST_ACCESSIBILITY_BUTTON;
+
+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.accessibilityservice.AccessibilityServiceInfo;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.ResolveInfo;
+import android.content.pm.ServiceInfo;
+import android.os.Build;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+
+@RunWith(AndroidJUnit4.class)
+public class AccessibilityTargetHelperTest {
+    @Test
+    public void isValidServiceTarget_legacyService_hardware_isTrue() {
+        assertThat(AccessibilityTargetHelper.isValidServiceTarget(generateServiceInfo(
+                /* flags = */ 0, /* targetSdk = */ 0), HARDWARE)).isTrue();
+    }
+
+    @Test
+    public void isValidServiceTarget_legacyService_software_requestsButton_isTrue() {
+        assertThat(AccessibilityTargetHelper.isValidServiceTarget(generateServiceInfo(
+                FLAG_REQUEST_ACCESSIBILITY_BUTTON, /* targetSdk = */ 0), SOFTWARE)).isTrue();
+    }
+
+    @Test
+    public void isValidServiceTarget_legacyService_software_isFalse() {
+        assertThat(AccessibilityTargetHelper.isValidServiceTarget(generateServiceInfo(
+                /* flags = */ 0, /* targetSdk = */ 0), SOFTWARE)).isFalse();
+    }
+
+    @Test
+    public void isValidServiceTarget_modernService_isTrue() {
+        assertThat(AccessibilityTargetHelper.isValidServiceTarget(generateServiceInfo(
+                /* flags = */ 0, Build.VERSION_CODES.Q + 1), DEFAULT)).isTrue();
+    }
+
+    private AccessibilityServiceInfo generateServiceInfo(int flags, int targetSdk) {
+        AccessibilityServiceInfo info = new AccessibilityServiceInfo();
+        info.flags = flags;
+        info.setResolveInfo(new ResolveInfo());
+        info.getResolveInfo().serviceInfo = new ServiceInfo();
+        info.getResolveInfo().serviceInfo.applicationInfo = new ApplicationInfo();
+        info.getResolveInfo().serviceInfo.applicationInfo.targetSdkVersion = targetSdk;
+        return info;
+    }
+}
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
new file mode 100644
index 0000000..389b677
--- /dev/null
+++ b/core/tests/coretests/src/com/android/internal/accessibility/dialog/AccessibilityTargetTest.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.internal.accessibility.dialog;
+
+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 androidx.test.runner.AndroidJUnit4;
+
+import com.android.internal.accessibility.common.ShortcutConstants;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.stream.IntStream;
+
+@RunWith(AndroidJUnit4.class)
+public class AccessibilityTargetTest {
+    private static final int[] EXPECTED_TYPES = { HARDWARE, SOFTWARE };
+
+    @Test
+    public void isRecognizedShortcutType_expectedType_isTrue() {
+        for (int type : EXPECTED_TYPES) {
+            assertThat(AccessibilityTarget.isRecognizedShortcutType(type)).isTrue();
+        }
+    }
+
+    @Test
+    public void isRecognizedShortcutType_notExpectedType_isFalse() {
+        for (int type: ShortcutConstants.USER_SHORTCUT_TYPES) {
+            if (IntStream.of(EXPECTED_TYPES).noneMatch(x -> x == type)) {
+                assertThat(AccessibilityTarget.isRecognizedShortcutType(type)).isFalse();
+            }
+        }
+    }
+}
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
index acd80ee..1654a8d 100644
--- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
+++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
@@ -2075,10 +2075,6 @@
                             mContext, shortcutType, userState.mUserId))
                     : userState.getShortcutTargetsLocked(shortcutType);
 
-            // If dealing with the hardware shortcut,
-            // remove the default service if it wasn't present before restore,
-            // but only if the raw shortcut setting is not null (edge case during SUW).
-            // Otherwise, merge the old and new targets normally.
             if (Flags.clearDefaultFromA11yShortcutTargetServiceRestore()
                     && shortcutType == HARDWARE) {
                 final String defaultService =
@@ -2087,8 +2083,8 @@
                         ? null : ComponentName.unflattenFromString(defaultService);
                 boolean shouldClearDefaultService = defaultServiceComponent != null
                         && !stringSetContainsComponentName(mergedTargets, defaultServiceComponent);
-                readColonDelimitedStringToSet(newValue, str -> str,
-                        mergedTargets, /*doMerge=*/true);
+                readColonDelimitedStringToSet(newValue, str -> str, mergedTargets,
+                        /* doMerge = */ true);
 
                 if (shouldClearDefaultService && stringSetContainsComponentName(
                         mergedTargets, defaultServiceComponent)) {
@@ -3889,7 +3885,8 @@
      */
     @EnforcePermission(MANAGE_ACCESSIBILITY)
     @Override
-    public void performAccessibilityShortcut(String targetName) {
+    public void performAccessibilityShortcut(
+            int displayId, @UserShortcutType int shortcutType, String targetName) {
         performAccessibilityShortcut_enforcePermission();
         if (mTraceManager.isA11yTracingEnabledForTypes(FLAGS_ACCESSIBILITY_MANAGER)) {
             mTraceManager.logTrace(LOG_TAG + ".performAccessibilityShortcut",
@@ -3898,7 +3895,7 @@
 
         mMainHandler.sendMessage(obtainMessage(
                 AccessibilityManagerService::performAccessibilityShortcutInternal, this,
-                Display.DEFAULT_DISPLAY, HARDWARE, targetName));
+                displayId, shortcutType, targetName));
     }
 
     /**
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 9884085..a40bbd2 100644
--- a/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/accessibility/AccessibilityManagerServiceTest.java
@@ -803,6 +803,7 @@
                 ACCESSIBILITY_HEARING_AIDS_COMPONENT_NAME.flattenToString());
 
         mA11yms.performAccessibilityShortcut(
+                Display.DEFAULT_DISPLAY, HARDWARE,
                 ACCESSIBILITY_HEARING_AIDS_COMPONENT_NAME.flattenToString());
         mTestableLooper.processAllMessages();
 
@@ -821,6 +822,7 @@
                 ACCESSIBILITY_HEARING_AIDS_COMPONENT_NAME.flattenToString());
 
         mA11yms.performAccessibilityShortcut(
+                Display.DEFAULT_DISPLAY, HARDWARE,
                 ACCESSIBILITY_HEARING_AIDS_COMPONENT_NAME.flattenToString());
         mTestableLooper.processAllMessages();