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

Commit 4ae520ac authored by Yara Hassan's avatar Yara Hassan
Browse files

Replace AccessibilityCheckResultReported proto with java class

Test: unit tests
Test: th
Bug: 326385939
Flag: com.android.server.accessibility.enable_a11y_checker_logging
Change-Id: Idf9ef52c8d25734863c0d33f5ade4cac967ebe12
parent 6b409d93
Loading
Loading
Loading
Loading
+1 −12
Original line number Diff line number Diff line
@@ -35,7 +35,7 @@ java_library_static {
        "androidx.annotation_annotation",
    ],
    static_libs: [
        "a11ychecker-protos-java-proto-lite",
        "accessibility_protos_lite",
        "com_android_server_accessibility_flags_lib",
        "//frameworks/base/packages/SystemUI/aconfig:com_android_systemui_flags_lib",
    ],
@@ -71,17 +71,6 @@ java_aconfig_library {
    aconfig_declarations: "com_android_server_accessibility_flags",
}

java_library_static {
    name: "a11ychecker-protos-java-proto-lite",
    proto: {
        type: "lite",
        canonical_path_from_root: false,
    },
    srcs: [
        "java/**/a11ychecker/proto/*.proto",
    ],
}

genrule {
    name: "statslog-accessibility-java-gen",
    tools: ["stats-log-api-gen"],
+5 −6
Original line number Diff line number Diff line
@@ -30,7 +30,6 @@ import android.view.accessibility.AccessibilityNodeInfo;

import com.android.internal.annotations.VisibleForTesting;
import com.android.server.accessibility.Flags;
import com.android.server.accessibility.a11ychecker.A11yCheckerProto.AccessibilityCheckResultReported;

import com.google.android.apps.common.testing.accessibility.framework.AccessibilityCheckPreset;
import com.google.android.apps.common.testing.accessibility.framework.AccessibilityHierarchyCheck;
@@ -58,7 +57,7 @@ public final class AccessibilityCheckerManager {
    private final PackageManager mPackageManager;
    private final Set<AccessibilityHierarchyCheck> mHierarchyChecks;
    private final ATFHierarchyBuilder mATFHierarchyBuilder;
    private final Set<AccessibilityCheckResultReported> mCachedResults = new HashSet<>();
    private final Set<AndroidAccessibilityCheckerResult> mCachedResults = new HashSet<>();

    @VisibleForTesting
    final A11yCheckerTimer mTimer = new A11yCheckerTimer();
@@ -85,14 +84,14 @@ public final class AccessibilityCheckerManager {
     * logging. Returns the check results for the given nodes.
     */
    @RequiresPermission(allOf = {android.Manifest.permission.INTERACT_ACROSS_USERS_FULL})
    public Set<AccessibilityCheckResultReported> maybeRunA11yChecker(
    public Set<AndroidAccessibilityCheckerResult> maybeRunA11yChecker(
            List<AccessibilityNodeInfo> nodes, @Nullable String sourceEventClassName,
            ComponentName a11yServiceComponentName, @UserIdInt int userId) {
        if (!shouldRunA11yChecker()) {
            return Set.of();
        }

        Set<AccessibilityCheckResultReported> allResults = new HashSet<>();
        Set<AndroidAccessibilityCheckerResult> allResults = new HashSet<>();
        String defaultBrowserName = mPackageManager.getDefaultBrowserPackageNameAsUser(userId);

        try {
@@ -104,7 +103,7 @@ public final class AccessibilityCheckerManager {
                    continue;
                }
                List<AccessibilityHierarchyCheckResult> checkResults = runChecksOnNode(nodeInfo);
                Set<AccessibilityCheckResultReported> filteredResults =
                Set<AndroidAccessibilityCheckerResult> filteredResults =
                        AccessibilityCheckerUtils.processResults(nodeInfo, checkResults,
                                sourceEventClassName, mPackageManager, a11yServiceComponentName);
                allResults.addAll(filteredResults);
@@ -127,7 +126,7 @@ public final class AccessibilityCheckerManager {
        return checkResults;
    }

    public Set<AccessibilityCheckResultReported> getCachedResults() {
    public Set<AndroidAccessibilityCheckerResult> getCachedResults() {
        return Collections.unmodifiableSet(mCachedResults);
    }

+4 −5
Original line number Diff line number Diff line
@@ -16,10 +16,9 @@

package com.android.server.accessibility.a11ychecker;

import android.text.TextUtils;
import android.util.Slog;

import com.android.server.accessibility.a11ychecker.A11yCheckerProto.AccessibilityCheckResultReported;

import java.util.Set;


@@ -35,11 +34,11 @@ public class AccessibilityCheckerStatsdLogger {
    /**
     * Writes results to statsd.
     */
    public static void logResults(Set<AccessibilityCheckResultReported> results) {
        Slog.i(LOG_TAG, String.format("Writing %d AccessibilityCheckResultReported events",
    public static void logResults(Set<AndroidAccessibilityCheckerResult> results) {
        Slog.i(LOG_TAG, TextUtils.formatSimple("Writing %d AccessibilityCheckResultReported events",
                results.size()));

        for (AccessibilityCheckResultReported result : results) {
        for (AndroidAccessibilityCheckerResult result : results) {
            AccessibilityCheckerStatsLog.write(ATOM_ID,
                    result.getPackageName(),
                    result.getAppVersionCode(),
+11 −11
Original line number Diff line number Diff line
@@ -17,6 +17,8 @@
package com.android.server.accessibility.a11ychecker;


import android.accessibility.AccessibilityCheckClass;
import android.accessibility.AccessibilityCheckResultType;
import android.annotation.Nullable;
import android.content.ComponentName;
import android.content.pm.PackageInfo;
@@ -25,9 +27,6 @@ import android.util.Slog;
import android.view.accessibility.AccessibilityNodeInfo;

import com.android.internal.annotations.VisibleForTesting;
import com.android.server.accessibility.a11ychecker.A11yCheckerProto.AccessibilityCheckClass;
import com.android.server.accessibility.a11ychecker.A11yCheckerProto.AccessibilityCheckResultReported;
import com.android.server.accessibility.a11ychecker.A11yCheckerProto.AccessibilityCheckResultType;

import com.google.android.apps.common.testing.accessibility.framework.AccessibilityCheckResult;
import com.google.android.apps.common.testing.accessibility.framework.AccessibilityHierarchyCheck;
@@ -92,7 +91,7 @@ public class AccessibilityCheckerUtils {
                            AccessibilityCheckClass.TRAVERSAL_ORDER_CHECK));
    // LINT.ThenChange(/services/accessibility/java/com/android/server/accessibility/a11ychecker/proto/a11ychecker.proto)

    static Set<AccessibilityCheckResultReported> processResults(
    static Set<AndroidAccessibilityCheckerResult> processResults(
            AccessibilityNodeInfo nodeInfo,
            List<AccessibilityHierarchyCheckResult> checkResults,
            @Nullable String activityClassName,
@@ -103,16 +102,16 @@ public class AccessibilityCheckerUtils {
        if (nodePath == null) {
            return Set.of();
        }
        AccessibilityCheckResultReported.Builder builder;
        AndroidAccessibilityCheckerResult.Builder commonBuilder;
        try {
            builder = AccessibilityCheckResultReported.newBuilder()
            commonBuilder = AndroidAccessibilityCheckerResult.newBuilder()
                    .setPackageName(appPackageName)
                    .setAppVersionCode(getAppVersionCode(packageManager, appPackageName))
                    .setUiElementPath(nodePath)
                    .setActivityName(
                            getActivityName(packageManager, appPackageName, activityClassName))
                    .setWindowTitle(getWindowTitle(nodeInfo))
                    .setSourceComponentName(a11yServiceComponentName.flattenToString())
                    .setSourceComponentName(a11yServiceComponentName)
                    .setSourceVersionCode(
                            getAppVersionCode(packageManager,
                                    a11yServiceComponentName.getPackageName()));
@@ -126,7 +125,8 @@ public class AccessibilityCheckerUtils {
                        == AccessibilityCheckResult.AccessibilityCheckResultType.ERROR
                        || checkResult.getType()
                        == AccessibilityCheckResult.AccessibilityCheckResultType.WARNING)
                .map(checkResult -> builder.setResultCheckClass(
                .map(checkResult -> new AndroidAccessibilityCheckerResult.Builder(
                        commonBuilder).setResultCheckClass(
                        getCheckClass(checkResult)).setResultType(
                        getCheckResultType(checkResult)).setResultId(
                        checkResult.getResultId()).build())
@@ -188,9 +188,9 @@ public class AccessibilityCheckerUtils {
    private static AccessibilityCheckResultType getCheckResultType(
            AccessibilityHierarchyCheckResult checkResult) {
        return switch (checkResult.getType()) {
            case ERROR -> AccessibilityCheckResultType.ERROR;
            case WARNING -> AccessibilityCheckResultType.WARNING;
            default -> AccessibilityCheckResultType.UNKNOWN_RESULT_TYPE;
            case ERROR -> AccessibilityCheckResultType.ERROR_CHECK_RESULT_TYPE;
            case WARNING -> AccessibilityCheckResultType.WARNING_CHECK_RESULT_TYPE;
            default -> AccessibilityCheckResultType.UNKNOWN_CHECK_RESULT_TYPE;
        };
    }

+196 −0
Original line number Diff line number Diff line
/*
 * Copyright 2024 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.server.accessibility.a11ychecker;

import android.accessibility.AccessibilityCheckClass;
import android.accessibility.AccessibilityCheckResultType;
import android.content.ComponentName;
import android.text.TextUtils;

public class AndroidAccessibilityCheckerResult implements Cloneable {
    // Package name of the app containing the checked View.
    private String mPackageName;
    // Version code of the app containing the checked View.
    private long mAppVersionCode;
    // The path of the View starting from the root element in the window. Each element is
    // represented by the View's resource id, when available, or the View's class name.
    private String mUiElementPath;
    // Class name of the activity containing the checked View.
    private String mActivityName;
    // Title of the window containing the checked View.
    private String mWindowTitle;
    // The component name of the app running the AccessibilityService which provided the a11y node.
    private String mSourceComponentName;
    // Version code of the app running the AccessibilityService that provided the a11y node.
    private long mSourceVersionCode;
    // Class Name of the AccessibilityCheck that produced the result.
    private AccessibilityCheckClass mResultCheckClass;
    // Result type of the AccessibilityCheckResult.
    private AccessibilityCheckResultType mResultType;
    // Result ID of the AccessibilityCheckResult.
    private int mResultId;

    static final class Builder {
        private final AndroidAccessibilityCheckerResult mInstance;

        Builder() {
            mInstance = new AndroidAccessibilityCheckerResult();
        }

        Builder(Builder otherBuilder) {
            mInstance = otherBuilder.mInstance.clone();
        }

        public Builder setPackageName(String packageName) {
            mInstance.mPackageName = packageName;
            return this;
        }

        public Builder setAppVersionCode(long versionCode) {
            mInstance.mAppVersionCode = versionCode;
            return this;
        }

        public Builder setUiElementPath(String uiElementPath) {
            mInstance.mUiElementPath = uiElementPath;
            return this;
        }

        public Builder setActivityName(String activityName) {
            mInstance.mActivityName = activityName;
            return this;
        }

        public Builder setWindowTitle(String windowTitle) {
            mInstance.mWindowTitle = windowTitle;
            return this;
        }

        public Builder setSourceComponentName(ComponentName componentName) {
            mInstance.mSourceComponentName = componentName.flattenToString();
            return this;
        }

        public Builder setSourceVersionCode(long versionCode) {
            mInstance.mSourceVersionCode = versionCode;
            return this;
        }

        public Builder setResultCheckClass(AccessibilityCheckClass checkClass) {
            mInstance.mResultCheckClass = checkClass;
            return this;
        }

        public Builder setResultType(AccessibilityCheckResultType resultType) {
            mInstance.mResultType = resultType;
            return this;
        }

        public Builder setResultId(int resultId) {
            mInstance.mResultId = resultId;
            return this;
        }

        public AndroidAccessibilityCheckerResult build() {
            // TODO: assert all fields are set, etc
            return mInstance;
        }
    }

    static Builder newBuilder() {
        return new Builder();
    }

    public String getPackageName() {
        return mPackageName;
    }

    public long getAppVersionCode() {
        return mAppVersionCode;
    }

    public String getUiElementPath() {
        return mUiElementPath;
    }

    public String getActivityName() {
        return mActivityName;
    }

    public String getWindowTitle() {
        return mWindowTitle;
    }

    public String getSourceComponentName() {
        return mSourceComponentName;
    }

    public long getSourceVersionCode() {
        return mSourceVersionCode;
    }

    public AccessibilityCheckClass getResultCheckClass() {
        return mResultCheckClass;
    }

    public AccessibilityCheckResultType getResultType() {
        return mResultType;
    }

    public int getResultId() {
        return mResultId;
    }

    @Override
    public boolean equals(Object other) {
        if (!(other instanceof AndroidAccessibilityCheckerResult)) {
            return false;
        }
        AndroidAccessibilityCheckerResult otherResult = (AndroidAccessibilityCheckerResult) other;
        return mPackageName.equals(otherResult.mPackageName)
                && mAppVersionCode == otherResult.mAppVersionCode
                && mUiElementPath.equals(otherResult.mUiElementPath)
                && mActivityName.equals(otherResult.mActivityName)
                && mWindowTitle.equals(otherResult.mWindowTitle)
                && mSourceComponentName.equals(otherResult.mSourceComponentName)
                && mSourceVersionCode == otherResult.mSourceVersionCode
                && mResultCheckClass.equals(otherResult.mResultCheckClass)
                && mResultType.equals(otherResult.mResultType)
                && mResultId == otherResult.mResultId;
    }

    @Override
    public int hashCode() {
        return toString().hashCode();
    }

    @Override
    public String toString() {
        return TextUtils.formatSimple("%s:%d:%s:%s:%s:%s:%d:%s:%s:%d", mPackageName,
                mAppVersionCode, mUiElementPath, mActivityName, mWindowTitle, mSourceComponentName,
                mSourceVersionCode, mResultCheckClass.name(), mResultType.name(), mResultId);
    }

    @Override
    public AndroidAccessibilityCheckerResult clone() {
        try {
            return (AndroidAccessibilityCheckerResult) super.clone();
        } catch (CloneNotSupportedException e) {
            return null;
        }
    }
}
Loading