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

Commit 7585bd44 authored by Daniel Norman's avatar Daniel Norman
Browse files

Fix a11yfocus clearing of view with AccessibilityDataSensitive root.

Fix: 271473168
Test: atest AccessibilityInteractionControllerTest
Change-Id: I4ae989786cd081e6feda6d81788b482a12a94fa2
parent e2a53cbe
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -874,8 +874,11 @@ public final class AccessibilityInteractionController {
            return;
        }
        try {
            // Clearing focus does not expose sensitive data, so set fetch flags to ensure that the
            // root view is always returned if present.
            setAccessibilityFetchFlags(
                    AccessibilityNodeInfo.FLAG_SERVICE_REQUESTS_INCLUDE_NOT_IMPORTANT_VIEWS);
                    AccessibilityNodeInfo.FLAG_SERVICE_REQUESTS_INCLUDE_NOT_IMPORTANT_VIEWS
                            | AccessibilityNodeInfo.FLAG_SERVICE_IS_ACCESSIBILITY_TOOL);
            final View root = getRootView();
            if (root != null && isShown(root)) {
                final View host = mViewRootImpl.mAccessibilityFocusedHost;
+31 −13
Original line number Diff line number Diff line
@@ -16,8 +16,8 @@

package android.view;

import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertTrue;
import static com.google.common.truth.Truth.assertThat;
import static com.google.common.truth.Truth.assertWithMessage;

import android.accessibilityservice.AccessibilityServiceInfo;
import android.app.Activity;
@@ -98,24 +98,42 @@ public class AccessibilityInteractionControllerTest {
    @Test
    public void clearAccessibilityFocus_shouldClearFocus() throws Exception {
        performAccessibilityFocus("com.android.frameworks.coretests:id/appNameBtn");
        assertTrue("Button should have a11y focus",
                mButton.isAccessibilityFocused());
        assertWithMessage("Button should have a11y focus").that(
                mButton.isAccessibilityFocused()).isTrue();
        mAccessibilityInteractionController.clearAccessibilityFocusClientThread();
        sInstrumentation.waitForIdleSync();
        assertFalse("Button should not have a11y focus",
                mButton.isAccessibilityFocused());
        assertWithMessage("Button should not have a11y focus").that(
                mButton.isAccessibilityFocused()).isFalse();
    }

    @Test
    public void clearAccessibilityFocus_uiThread_shouldClearFocus() throws Exception {
        performAccessibilityFocus("com.android.frameworks.coretests:id/appNameBtn");
        assertTrue("Button should have a11y focus",
                mButton.isAccessibilityFocused());
        sInstrumentation.runOnMainSync(() -> {
            mAccessibilityInteractionController.clearAccessibilityFocusClientThread();
        });
        assertFalse("Button should not have a11y focus",
                mButton.isAccessibilityFocused());
        assertWithMessage("Button should have a11y focus").that(
                mButton.isAccessibilityFocused()).isTrue();
        sInstrumentation.runOnMainSync(() ->
                mAccessibilityInteractionController.clearAccessibilityFocusClientThread());
        assertWithMessage("Button should not have a11y focus").that(
                mButton.isAccessibilityFocused()).isFalse();
    }

    @Test
    public void clearAccessibilityFocus_sensitiveRootView_shouldClearFocus()
            throws Exception {
        final View rootView = mButton.getRootView();
        assertThat(rootView).isNotNull();
        try {
            rootView.setAccessibilityDataSensitive(View.ACCESSIBILITY_DATA_SENSITIVE_YES);
            performAccessibilityFocus("com.android.frameworks.coretests:id/appNameBtn");
            assertWithMessage("Button should have a11y focus").that(
                    mButton.isAccessibilityFocused()).isTrue();
            sInstrumentation.runOnMainSync(() ->
                    mAccessibilityInteractionController.clearAccessibilityFocusClientThread());
            assertWithMessage("Button should not have a11y focus").that(
                    mButton.isAccessibilityFocused()).isFalse();
        } finally {
            rootView.setAccessibilityDataSensitive(View.ACCESSIBILITY_DATA_SENSITIVE_AUTO);
        }
    }

    private void launchActivity() {