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();