From 7585bd4458e6651b41e1919650115d4e2d61b1d4 Mon Sep 17 00:00:00 2001 From: Daniel Norman Date: Mon, 6 Mar 2023 16:19:05 -0800 Subject: [PATCH] Fix a11yfocus clearing of view with AccessibilityDataSensitive root. Fix: 271473168 Test: atest AccessibilityInteractionControllerTest Change-Id: I4ae989786cd081e6feda6d81788b482a12a94fa2 --- .../AccessibilityInteractionController.java | 5 ++- ...ccessibilityInteractionControllerTest.java | 44 +++++++++++++------ 2 files changed, 35 insertions(+), 14 deletions(-) diff --git a/core/java/android/view/AccessibilityInteractionController.java b/core/java/android/view/AccessibilityInteractionController.java index 6804c5ca3e4fb..6901b72187419 100644 --- a/core/java/android/view/AccessibilityInteractionController.java +++ b/core/java/android/view/AccessibilityInteractionController.java @@ -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; diff --git a/core/tests/coretests/src/android/view/AccessibilityInteractionControllerTest.java b/core/tests/coretests/src/android/view/AccessibilityInteractionControllerTest.java index 7855ef9c49ad3..d91541fbc1fc0 100644 --- a/core/tests/coretests/src/android/view/AccessibilityInteractionControllerTest.java +++ b/core/tests/coretests/src/android/view/AccessibilityInteractionControllerTest.java @@ -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() {