From c5d54570fe117f557bab9c0445c207ea962b2ca4 Mon Sep 17 00:00:00 2001 From: Riley Jones Date: Sat, 8 Jun 2024 00:48:35 +0000 Subject: 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 --- .../view/accessibility/AccessibilityManager.java | 15 +++-- .../view/accessibility/IAccessibilityManager.aidl | 2 +- .../accessibility/dialog/AccessibilityTarget.java | 29 ++++++--- .../dialog/AccessibilityTargetHelper.java | 30 ++++++--- .../accessibility/AccessibilityManagerTest.java | 33 +++++++++- .../AccessibilityShortcutControllerTest.java | 25 +++++--- .../dialog/AccessibilityTargetHelperTest.java | 74 ++++++++++++++++++++++ .../dialog/AccessibilityTargetTest.java | 52 +++++++++++++++ .../accessibility/AccessibilityManagerService.java | 13 ++-- .../AccessibilityManagerServiceTest.java | 2 + 10 files changed, 233 insertions(+), 42 deletions(-) create mode 100644 core/tests/coretests/src/com/android/internal/accessibility/dialog/AccessibilityTargetHelperTest.java create mode 100644 core/tests/coretests/src/com/android/internal/accessibility/dialog/AccessibilityTargetTest.java diff --git a/core/java/android/view/accessibility/AccessibilityManager.java b/core/java/android/view/accessibility/AccessibilityManager.java index 3fc9ebc7c9fb..a4cea3364998 100644 --- a/core/java/android/view/accessibility/AccessibilityManager.java +++ b/core/java/android/view/accessibility/AccessibilityManager.java @@ -19,6 +19,8 @@ package android.view.accessibility; 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.os.UserHandle; 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 android.view.accessibility.AccessibilityEvent.EventType; 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 @@ public final class AccessibilityManager { @SystemApi @RequiresPermission(Manifest.permission.MANAGE_ACCESSIBILITY) public void performAccessibilityShortcut() { - performAccessibilityShortcut(null); + performAccessibilityShortcut(Display.DEFAULT_DISPLAY, HARDWARE, null); } /** @@ -1577,7 +1581,8 @@ public final class AccessibilityManager { * @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 @@ public final class AccessibilityManager { } } 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 @@ public final class AccessibilityManager { */ @RequiresPermission(Manifest.permission.MANAGE_ACCESSIBILITY) public void enableShortcutsForTargets(boolean enable, - @ShortcutConstants.UserShortcutType int shortcutTypes, @NonNull Set targets, + @UserShortcutType int shortcutTypes, @NonNull Set targets, @UserIdInt int userId) { final IAccessibilityManager service; synchronized (mLock) { @@ -1817,7 +1822,7 @@ public final class AccessibilityManager { @RequiresPermission(Manifest.permission.MANAGE_ACCESSIBILITY) @NonNull public List 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 cd1131496be0..72a1fe424906 100644 --- a/core/java/android/view/accessibility/IAccessibilityManager.aidl +++ b/core/java/android/view/accessibility/IAccessibilityManager.aidl @@ -92,7 +92,7 @@ interface IAccessibilityManager { void notifyAccessibilityButtonVisibilityChanged(boolean available); @EnforcePermission("MANAGE_ACCESSIBILITY") - void performAccessibilityShortcut(String targetName); + void performAccessibilityShortcut(int displayId, int shortcutType, String targetName); @EnforcePermission("MANAGE_ACCESSIBILITY") List 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 66faa318666d..ec90dd242c36 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; 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 abstract class AccessibilityTarget implements TargetOperations, OnTargetS 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 @@ public abstract class AccessibilityTarget implements TargetOperations, OnTargetS 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 abstract class AccessibilityTarget implements TargetOperations, OnTargetS 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 e523ab066074..4ccdf79da358 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 android.view.accessibility.AccessibilityManager; 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 @@ public final class AccessibilityTargetHelper { final List 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 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 1013bf50ab94..ce36ee06bb38 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 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.assertTrue; 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.graphics.drawable.Icon; 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 @@ public class AccessibilityManagerTest { 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 @@ public class AccessibilityManagerTest { @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 @@ public class AccessibilityManagerTest { ); } + @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 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 6b9dbbaaf484..f78bc9294357 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.provider.Settings; 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 @@ public class AccessibilityShortcutControllerTest { 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 @@ public class AccessibilityShortcutControllerTest { // 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 @@ public class AccessibilityShortcutControllerTest { verifyZeroInteractions(mAlertDialogBuilder, mAlertDialog); verify(mToast).show(); - verify(mAccessibilityManagerService).performAccessibilityShortcut(null); + verify(mAccessibilityManagerService).performAccessibilityShortcut( + Display.DEFAULT_DISPLAY, HARDWARE, null); } @Test @@ -649,7 +653,8 @@ public class AccessibilityShortcutControllerTest { 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 @@ public class AccessibilityShortcutControllerTest { 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 @@ public class AccessibilityShortcutControllerTest { 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 @@ public class AccessibilityShortcutControllerTest { getController().performAccessibilityShortcut(); verifyZeroInteractions(mToast); - verify(mAccessibilityManagerService).performAccessibilityShortcut(null); + verify(mAccessibilityManagerService).performAccessibilityShortcut( + Display.DEFAULT_DISPLAY, HARDWARE, null); } @Test @@ -755,7 +763,8 @@ public class AccessibilityShortcutControllerTest { 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 000000000000..64be97d63f1b --- /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 000000000000..389b677587b0 --- /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 acd80eeac558..1654a8de6422 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 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub 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 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub ? 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 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub */ @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 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub 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 9884085cc3f7..a40bbd27fa8a 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 @@ public class AccessibilityManagerServiceTest { ACCESSIBILITY_HEARING_AIDS_COMPONENT_NAME.flattenToString()); mA11yms.performAccessibilityShortcut( + Display.DEFAULT_DISPLAY, HARDWARE, ACCESSIBILITY_HEARING_AIDS_COMPONENT_NAME.flattenToString()); mTestableLooper.processAllMessages(); @@ -821,6 +822,7 @@ public class AccessibilityManagerServiceTest { ACCESSIBILITY_HEARING_AIDS_COMPONENT_NAME.flattenToString()); mA11yms.performAccessibilityShortcut( + Display.DEFAULT_DISPLAY, HARDWARE, ACCESSIBILITY_HEARING_AIDS_COMPONENT_NAME.flattenToString()); mTestableLooper.processAllMessages(); -- cgit v1.2.3-59-g8ed1b