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

Commit bc666bea authored by Daniel Norman's avatar Daniel Norman
Browse files

Tweak behavior of isAccessibilityDataPrivate() to reduce CPU usage.

Changes:
- Cache the value of isAccessibilityDataPrivate().
- Change callers to check if the a11y service isAccessibilityTool
  first where possible, to prevent unnecessary calls to
  isAccessibilityDataPrivate() for "happy use case" users (anyone
  not using a non-a11y-tool).

Using simpleperf during UI benchmark test, % of CPU in frameworks.jar
from isAccessibilityDataPrivate():
  - before: 71.6% ( :O )
  - after: 0.25%

Bug: 242267091
Test: atest com.android.uibench.microbenchmark.UiBenchBrowseContentScrollNoBitmapUploadMicrobenchmark#testBrowseContentScrollNoBitmapUpload
Change-Id: Ie0c89c2fb893be1c7347a0acfb0ede0993034ee6
parent 60bb7c9b
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -166,8 +166,8 @@ public final class AccessibilityInteractionController {
    }

    private boolean isVisibleToAccessibilityService(View view) {
        return view != null && (!view.isAccessibilityDataPrivate()
                || mA11yManager.isRequestFromAccessibilityTool());
        return view != null && (mA11yManager.isRequestFromAccessibilityTool()
                || !view.isAccessibilityDataPrivate());
    }

    public void findAccessibilityNodeInfoByAccessibilityIdClientThread(
+36 −28
Original line number Diff line number Diff line
@@ -4571,7 +4571,9 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
     * {@link android.accessibilityservice.AccessibilityServiceInfo#isAccessibilityTool} property
     * set to true.
     */
    private int mAccessibilityDataPrivate = ACCESSIBILITY_DATA_PRIVATE_AUTO;
    private int mExplicitAccessibilityDataPrivate = ACCESSIBILITY_DATA_PRIVATE_AUTO;
    /** Used to calculate and cache {@link #isAccessibilityDataPrivate()}. */
    private int mInferredAccessibilityDataPrivate = ACCESSIBILITY_DATA_PRIVATE_AUTO;
    /**
     * Specifies the id of a view for which this view serves as a label for
@@ -13256,6 +13258,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
    public void setFilterTouchesWhenObscured(boolean enabled) {
        setFlags(enabled ? FILTER_TOUCHES_WHEN_OBSCURED : 0,
                FILTER_TOUCHES_WHEN_OBSCURED);
        calculateAccessibilityDataPrivate();
    }
    /**
@@ -14458,8 +14461,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
    @UnsupportedAppUsage
    public boolean includeForAccessibility() {
        if (mAttachInfo != null) {
            if (isAccessibilityDataPrivate() && !AccessibilityManager.getInstance(
                    mContext).isRequestFromAccessibilityTool()) {
            if (!AccessibilityManager.getInstance(mContext).isRequestFromAccessibilityTool()
                    && isAccessibilityDataPrivate()) {
                return false;
            }
@@ -14486,33 +14489,37 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
     */
    @ViewDebug.ExportedProperty(category = "accessibility")
    public boolean isAccessibilityDataPrivate() {
        if (mAccessibilityDataPrivate == ACCESSIBILITY_DATA_PRIVATE_YES) {
            return true;
        if (mInferredAccessibilityDataPrivate == ACCESSIBILITY_DATA_PRIVATE_AUTO) {
            calculateAccessibilityDataPrivate();
        }
        if (mAccessibilityDataPrivate == ACCESSIBILITY_DATA_PRIVATE_NO) {
            return false;
        return mInferredAccessibilityDataPrivate == ACCESSIBILITY_DATA_PRIVATE_YES;
    }
    /**
     * Calculate and cache the inferred value for {@link #isAccessibilityDataPrivate()}.
     *
     * <p>
     * <strong>Note:</strong> This method needs to be called any time one of the below conditions
     * changes, to recalculate the new value.
     * </p>
     */
    void calculateAccessibilityDataPrivate() {
        // Use the explicit value if set.
        if (mExplicitAccessibilityDataPrivate != ACCESSIBILITY_DATA_PRIVATE_AUTO) {
            mInferredAccessibilityDataPrivate = mExplicitAccessibilityDataPrivate;
        } else if (mAttachInfo != null && mAttachInfo.mWindowSecure) {
            // Views inside FLAG_SECURE windows default to accessibilityDataPrivate.
        if (mAttachInfo != null && mAttachInfo.mWindowSecure) {
            return true;
        }
            mInferredAccessibilityDataPrivate = ACCESSIBILITY_DATA_PRIVATE_YES;
        } else if (getFilterTouchesWhenObscured()) {
            // Views that set filterTouchesWhenObscured default to accessibilityDataPrivate.
        if (getFilterTouchesWhenObscured()) {
            return true;
        }
            mInferredAccessibilityDataPrivate = ACCESSIBILITY_DATA_PRIVATE_YES;
        } else if (mParent instanceof View && ((View) mParent).isAccessibilityDataPrivate()) {
            // Descendants of an accessibilityDataPrivate View are also accessibilityDataPrivate.
        ViewParent parent = mParent;
        while (parent instanceof View) {
            if (((View) parent).isAccessibilityDataPrivate()) {
                return true;
            }
            parent = parent.getParent();
        }
            mInferredAccessibilityDataPrivate = ACCESSIBILITY_DATA_PRIVATE_YES;
        } else {
            // Otherwise, default to not accessibilityDataPrivate.
        return false;
            mInferredAccessibilityDataPrivate = ACCESSIBILITY_DATA_PRIVATE_NO;
        }
    }
    /**
@@ -14523,7 +14530,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
     */
    public void setAccessibilityDataPrivate(
            @AccessibilityDataPrivate int accessibilityDataPrivate) {
        mAccessibilityDataPrivate = accessibilityDataPrivate;
        mExplicitAccessibilityDataPrivate = accessibilityDataPrivate;
        calculateAccessibilityDataPrivate();
    }
    /**
+8 −0
Original line number Diff line number Diff line
@@ -3918,6 +3918,14 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
        return false;
    }

    @Override
    void calculateAccessibilityDataPrivate() {
        super.calculateAccessibilityDataPrivate();
        for (int i = 0; i < mChildrenCount; i++) {
            mChildren[i].calculateAccessibilityDataPrivate();
        }
    }

    @Override
    @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
    void dispatchDetachedFromWindow() {