diff options
3 files changed, 54 insertions, 34 deletions
diff --git a/services/accessibility/java/com/android/server/accessibility/a11ychecker/AccessibilityCheckerManager.java b/services/accessibility/java/com/android/server/accessibility/a11ychecker/AccessibilityCheckerManager.java index 83f57b2bf31c..950246ff20ac 100644 --- a/services/accessibility/java/com/android/server/accessibility/a11ychecker/AccessibilityCheckerManager.java +++ b/services/accessibility/java/com/android/server/accessibility/a11ychecker/AccessibilityCheckerManager.java @@ -87,7 +87,7 @@ public final class AccessibilityCheckerManager { public Set<AndroidAccessibilityCheckerResult> maybeRunA11yChecker( List<AccessibilityNodeInfo> nodes, @Nullable String sourceEventClassName, ComponentName a11yServiceComponentName, @UserIdInt int userId) { - if (!shouldRunA11yChecker()) { + if (!shouldRunA11yChecker() || nodes.isEmpty()) { return Set.of(); } @@ -95,24 +95,33 @@ public final class AccessibilityCheckerManager { String defaultBrowserName = mPackageManager.getDefaultBrowserPackageNameAsUser(userId); try { + AndroidAccessibilityCheckerResult.Builder commonResultBuilder = + AccessibilityCheckerUtils.getCommonResultBuilder(nodes.getFirst(), + sourceEventClassName, mPackageManager, a11yServiceComponentName); + if (commonResultBuilder == null) { + return Set.of(); + } for (AccessibilityNodeInfo nodeInfo : nodes) { - // Skip browser results because they are mostly related to web content and not the - // browser app itself. + // Skip browser results because they are mostly related to web content and + // not the browser app itself. if (nodeInfo.getPackageName() == null || nodeInfo.getPackageName().toString().equals(defaultBrowserName)) { continue; } - List<AccessibilityHierarchyCheckResult> checkResults = runChecksOnNode(nodeInfo); + List<AccessibilityHierarchyCheckResult> checkResults = runChecksOnNode( + nodeInfo); Set<AndroidAccessibilityCheckerResult> filteredResults = AccessibilityCheckerUtils.processResults(nodeInfo, checkResults, - sourceEventClassName, mPackageManager, a11yServiceComponentName); + commonResultBuilder); allResults.addAll(filteredResults); } mCachedResults.addAll(allResults); + return allResults; + } catch (RuntimeException e) { Slog.e(LOG_TAG, "An unknown error occurred while running a11y checker.", e); + return Set.of(); } - return allResults; } private List<AccessibilityHierarchyCheckResult> runChecksOnNode( diff --git a/services/accessibility/java/com/android/server/accessibility/a11ychecker/AccessibilityCheckerUtils.java b/services/accessibility/java/com/android/server/accessibility/a11ychecker/AccessibilityCheckerUtils.java index eb24b027dc3a..a739304fc269 100644 --- a/services/accessibility/java/com/android/server/accessibility/a11ychecker/AccessibilityCheckerUtils.java +++ b/services/accessibility/java/com/android/server/accessibility/a11ychecker/AccessibilityCheckerUtils.java @@ -91,45 +91,55 @@ public class AccessibilityCheckerUtils { AccessibilityCheckClass.TRAVERSAL_ORDER_CHECK)); // LINT.ThenChange(/services/accessibility/java/com/android/server/accessibility/a11ychecker/proto/a11ychecker.proto) - static Set<AndroidAccessibilityCheckerResult> processResults( + + /** + * Returns AccessibilityCheckResultReported.Builder with the common fields for all nodes + * belonging in the same cache pre-filled. + */ + static @Nullable AndroidAccessibilityCheckerResult.Builder getCommonResultBuilder( AccessibilityNodeInfo nodeInfo, - List<AccessibilityHierarchyCheckResult> checkResults, @Nullable String activityClassName, PackageManager packageManager, ComponentName a11yServiceComponentName) { - String appPackageName = nodeInfo.getPackageName().toString(); - String nodePath = AccessibilityNodePathBuilder.createNodePath(nodeInfo); - if (nodePath == null) { - return Set.of(); + if (nodeInfo.getPackageName() == null) { + return null; } - AndroidAccessibilityCheckerResult.Builder commonBuilder; + String appPackageName = nodeInfo.getPackageName().toString(); try { - commonBuilder = AndroidAccessibilityCheckerResult.newBuilder() + return AndroidAccessibilityCheckerResult.newBuilder() .setPackageName(appPackageName) .setAppVersionCode(getAppVersionCode(packageManager, appPackageName)) - .setUiElementPath(nodePath) .setActivityName( getActivityName(packageManager, appPackageName, activityClassName)) .setWindowTitle(getWindowTitle(nodeInfo)) .setSourceComponentName(a11yServiceComponentName) - .setSourceVersionCode( - getAppVersionCode(packageManager, - a11yServiceComponentName.getPackageName())); + .setSourceVersionCode(getAppVersionCode(packageManager, + a11yServiceComponentName.getPackageName())); } catch (PackageManager.NameNotFoundException e) { Slog.e(LOG_TAG, "Unknown package name", e); - return Set.of(); + return null; } + } + static Set<AndroidAccessibilityCheckerResult> processResults( + AccessibilityNodeInfo nodeInfo, + List<AccessibilityHierarchyCheckResult> checkResults, + AndroidAccessibilityCheckerResult.Builder resultBuilder) { + String nodePath = AccessibilityNodePathBuilder.createNodePath(nodeInfo); + if (resultBuilder == null || nodePath == null) { + return Set.of(); + } return checkResults.stream() .filter(checkResult -> checkResult.getType() == AccessibilityCheckResult.AccessibilityCheckResultType.ERROR || checkResult.getType() == AccessibilityCheckResult.AccessibilityCheckResultType.WARNING) - .map(checkResult -> new AndroidAccessibilityCheckerResult.Builder( - commonBuilder).setResultCheckClass( - getCheckClass(checkResult)).setResultType( - getCheckResultType(checkResult)).setResultId( - checkResult.getResultId()).build()) + .map(checkResult -> new AndroidAccessibilityCheckerResult.Builder(resultBuilder) + .setUiElementPath(nodePath) + .setResultCheckClass(getCheckClass(checkResult)) + .setResultType(getCheckResultType(checkResult)) + .setResultId(checkResult.getResultId()) + .build()) .collect(Collectors.toUnmodifiableSet()); } diff --git a/services/tests/servicestests/src/com/android/server/accessibility/a11ychecker/AccessibilityCheckerUtilsTest.java b/services/tests/servicestests/src/com/android/server/accessibility/a11ychecker/AccessibilityCheckerUtilsTest.java index 4ec2fb9ffe6e..cdaeade41159 100644 --- a/services/tests/servicestests/src/com/android/server/accessibility/a11ychecker/AccessibilityCheckerUtilsTest.java +++ b/services/tests/servicestests/src/com/android/server/accessibility/a11ychecker/AccessibilityCheckerUtilsTest.java @@ -89,14 +89,15 @@ public class AccessibilityCheckerUtilsTest { AccessibilityCheckResult.AccessibilityCheckResultType.NOT_RUN, null, 5, null); - Set<AndroidAccessibilityCheckerResult> results = - AccessibilityCheckerUtils.processResults( - mockNodeInfo, - List.of(result1, result2, result3, result4), - null, + + AndroidAccessibilityCheckerResult.Builder resultBuilder = + AccessibilityCheckerUtils.getCommonResultBuilder(mockNodeInfo, null, mMockPackageManager, new ComponentName(TEST_A11Y_SERVICE_SOURCE_PACKAGE_NAME, TEST_A11Y_SERVICE_CLASS_NAME)); + Set<AndroidAccessibilityCheckerResult> results = + AccessibilityCheckerUtils.processResults(mockNodeInfo, + List.of(result1, result2, result3, result4), resultBuilder); assertThat(results).containsExactly( createResult("TargetNode", "", @@ -128,14 +129,14 @@ public class AccessibilityCheckerUtilsTest { TouchTargetSizeCheck.class, AccessibilityCheckResult.AccessibilityCheckResultType.ERROR, null, 2, null); - Set<AndroidAccessibilityCheckerResult> results = - AccessibilityCheckerUtils.processResults( - mockNodeInfo, - List.of(result1, result2), - null, + AndroidAccessibilityCheckerResult.Builder resultBuilder = + AccessibilityCheckerUtils.getCommonResultBuilder(mockNodeInfo, null, mMockPackageManager, new ComponentName(TEST_A11Y_SERVICE_SOURCE_PACKAGE_NAME, TEST_A11Y_SERVICE_CLASS_NAME)); + Set<AndroidAccessibilityCheckerResult> results = + AccessibilityCheckerUtils.processResults(mockNodeInfo, + List.of(result1, result2), resultBuilder); assertThat(results).isEmpty(); } |