Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit bb99a9c0 authored by Wenyu Zhang's avatar Wenyu Zhang
Browse files

a11y: Handle screen reader keyboard shortcut in A11yManagerService

Use new key gesture handler API to handle screen reader keyboard
shortcut.

Bug: 413279228
Test: atest AccessibilityManagerServiceTest
Flag: EXEMPT refactor

Change-Id: Ia696522c031ef0ae9f97203ebe40831b111334e3
parent d77e0c95
Loading
Loading
Loading
Loading
+9 −3
Original line number Diff line number Diff line
@@ -659,6 +659,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
        if (enableTalkbackAndMagnifierKeyGestures()) {
            supportedGestures.add(KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_MAGNIFICATION);
            supportedGestures.add(KeyGestureEvent.KEY_GESTURE_TYPE_ACTIVATE_SELECT_TO_SPEAK);
            supportedGestures.add(KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_TALKBACK);
        }
        if (enableVoiceAccessKeyGestures()) {
            supportedGestures.add(KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_VOICE_ACCESS);
@@ -719,6 +720,8 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
                    R.string.config_defaultSelectToSpeakService);
            case KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_VOICE_ACCESS -> mContext.getString(
                    R.string.config_defaultVoiceAccessService);
            case KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_TALKBACK -> mContext.getString(
                    R.string.config_defaultAccessibilityService);
            default -> "";
        };
    }
@@ -740,6 +743,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
                break;
            case KeyGestureEvent.KEY_GESTURE_TYPE_ACTIVATE_SELECT_TO_SPEAK:
            case KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_VOICE_ACCESS:
            case KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_TALKBACK:
                targetName = getTargetNameFromKeyGestureType(gestureType);
                if (targetName.isEmpty()) {
                    return;
@@ -4390,10 +4394,12 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
            if(!enableTalkbackAndMagnifierKeyGestures() &&
                    (shortcutTargets.contains(MAGNIFICATION_CONTROLLER_NAME) ||
                            shortcutTargets.contains(mContext.getString(
                                    R.string.config_defaultSelectToSpeakService)))) {
                                    R.string.config_defaultSelectToSpeakService)) ||
                            shortcutTargets.contains(mContext.getString(
                                    R.string.config_defaultAccessibilityService)))) {
                Slog.w(LOG_TAG,
                        "KEY_GESTURE type magnification and select to speak shortcuts are "
                                + "disabled by feature flag");
                        "KEY_GESTURE type magnification, select to speak and TalkBack shortcuts"
                                + "are disabled by feature flag");
                return;
            }
            if (!enableVoiceAccessKeyGestures() && shortcutTargets.contains(mContext.getString(
+30 −0
Original line number Diff line number Diff line
@@ -2294,6 +2294,36 @@ public class AccessibilityManagerServiceTest {
                trustedService.getComponentName().flattenToString());
    }

    @Test
    @EnableFlags(com.android.hardware.input.Flags.FLAG_ENABLE_TALKBACK_AND_MAGNIFIER_KEY_GESTURES)
    public void handleKeyGestureEvent_activateTalkBack_trustedService() {
        setupAccessibilityServiceConnection(FLAG_REQUEST_ACCESSIBILITY_BUTTON);
        mFakePermissionEnforcer.grant(Manifest.permission.MANAGE_ACCESSIBILITY);

        final AccessibilityServiceInfo trustedService = mockAccessibilityServiceInfo(
                new ComponentName("package_a", "class_a"),
                /* isSystemApp= */ true, /* isAlwaysOnService= */ true);
        AccessibilityUserState userState = mA11yms.getCurrentUserState();
        userState.mInstalledServices.add(trustedService);
        mTestableContext.getOrCreateTestableResources().addOverride(
                R.string.config_defaultAccessibilityService,
                trustedService.getComponentName().flattenToString());
        mTestableContext.getOrCreateTestableResources().addOverride(
                R.array.config_trustedAccessibilityServices,
                new String[]{trustedService.getComponentName().flattenToString()});

        assertThat(ShortcutUtils.getShortcutTargetsFromSettings(mTestableContext, KEY_GESTURE,
                mA11yms.getCurrentUserIdLocked())).isEmpty();

        mA11yms.handleKeyGestureEvent(new KeyGestureEvent.Builder().setKeyGestureType(
                KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_TALKBACK).setAction(
                KeyGestureEvent.ACTION_GESTURE_COMPLETE).build());

        assertThat(ShortcutUtils.getShortcutTargetsFromSettings(mTestableContext, KEY_GESTURE,
                mA11yms.getCurrentUserIdLocked())).containsExactly(
                trustedService.getComponentName().flattenToString());
    }

    @Test
    public void displayListReturnsDisplays() {
        mTestDisplayManagerWrapper.mDisplays = createFakeDisplayList(