Merge "Fix a11yfocus clearing of view with AccessibilityDataSensitive root." into udc-dev

This commit is contained in:
Daniel Norman
2023-03-08 16:46:52 +00:00
committed by Android (Google) Code Review
2 changed files with 35 additions and 14 deletions

View File

@@ -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;

View File

@@ -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() {