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

Commit dcbb3bfb authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Avoid sending content changed a11y events from wrong views"

parents 37584e23 3fb3c590
Loading
Loading
Loading
Loading
+13 −4
Original line number Diff line number Diff line
@@ -11763,6 +11763,14 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
        return null;
    }
    /** @hide */
    View getSelfOrParentImportantForA11y() {
        if (isImportantForAccessibility()) return this;
        ViewParent parent = getParentForAccessibility();
        if (parent instanceof View) return (View) parent;
        return null;
    }
    /**
     * Adds the children of this View relevant for accessibility to the given list
     * as output. Since some Views are not important for accessibility the added
@@ -14978,10 +14986,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
    public void setAlpha(@FloatRange(from=0.0, to=1.0) float alpha) {
        ensureTransformationInfo();
        if (mTransformationInfo.mAlpha != alpha) {
            // Report visibility changes, which can affect children, to accessibility
            if ((alpha == 0) ^ (mTransformationInfo.mAlpha == 0)) {
                notifySubtreeAccessibilityStateChangedIfNeeded();
            }
            float oldAlpha = mTransformationInfo.mAlpha;
            mTransformationInfo.mAlpha = alpha;
            if (onSetAlpha((int) (alpha * 255))) {
                mPrivateFlags |= PFLAG_ALPHA_SET;
@@ -14993,6 +14998,10 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
                invalidateViewProperty(true, false);
                mRenderNode.setAlpha(getFinalAlpha());
            }
            // Report visibility changes, which can affect children, to accessibility
            if ((alpha == 0) ^ (oldAlpha == 0)) {
                notifySubtreeAccessibilityStateChangedIfNeeded();
            }
        }
    }
+14 −0
Original line number Diff line number Diff line
@@ -8305,6 +8305,12 @@ public final class ViewRootImpl implements ViewParent,

        public View mSource;
        public long mLastEventTimeMillis;
        /**
         * Override for {@link AccessibilityEvent#originStackTrace} to provide the stack trace
         * of the original {@link #runOrPost} call instead of one for sending the delayed event
         * from a looper.
         */
        public StackTraceElement[] mOrigin;

        @Override
        public void run() {
@@ -8322,6 +8328,7 @@ public final class ViewRootImpl implements ViewParent,
                AccessibilityEvent event = AccessibilityEvent.obtain();
                event.setEventType(AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED);
                event.setContentChangeTypes(mChangeTypes);
                if (AccessibilityEvent.DEBUG_ORIGIN) event.originStackTrace = mOrigin;
                source.sendAccessibilityEventUnchecked(event);
            } else {
                mLastEventTimeMillis = 0;
@@ -8329,6 +8336,7 @@ public final class ViewRootImpl implements ViewParent,
            // In any case reset to initial state.
            source.resetSubtreeAccessibilityStateChanged();
            mChangeTypes = 0;
            if (AccessibilityEvent.DEBUG_ORIGIN) mOrigin = null;
        }

        public void runOrPost(View source, int changeType) {
@@ -8352,12 +8360,18 @@ public final class ViewRootImpl implements ViewParent,
                // If there is no common predecessor, then mSource points to
                // a removed view, hence in this case always prefer the source.
                View predecessor = getCommonPredecessor(mSource, source);
                if (predecessor != null) {
                    predecessor = predecessor.getSelfOrParentImportantForA11y();
                }
                mSource = (predecessor != null) ? predecessor : source;
                mChangeTypes |= changeType;
                return;
            }
            mSource = source;
            mChangeTypes = changeType;
            if (AccessibilityEvent.DEBUG_ORIGIN) {
                mOrigin = Thread.currentThread().getStackTrace();
            }
            final long timeSinceLastMillis = SystemClock.uptimeMillis() - mLastEventTimeMillis;
            final long minEventIntevalMillis =
                    ViewConfiguration.getSendRecurringAccessibilityEventsInterval();
+42 −3
Original line number Diff line number Diff line
@@ -388,6 +388,8 @@ import java.util.List;
 */
public final class AccessibilityEvent extends AccessibilityRecord implements Parcelable {
    private static final boolean DEBUG = false;
    /** @hide */
    public static final boolean DEBUG_ORIGIN = false;

    /**
     * Invalid selection/focus position.
@@ -748,7 +750,7 @@ public final class AccessibilityEvent extends AccessibilityRecord implements Par

    private static final int MAX_POOL_SIZE = 10;
    private static final SynchronizedPool<AccessibilityEvent> sPool =
            new SynchronizedPool<AccessibilityEvent>(MAX_POOL_SIZE);
            new SynchronizedPool<>(MAX_POOL_SIZE);

    private @EventType int mEventType;
    private CharSequence mPackageName;
@@ -758,6 +760,17 @@ public final class AccessibilityEvent extends AccessibilityRecord implements Par
    int mContentChangeTypes;
    int mWindowChangeTypes;

    /**
     * The stack trace describing where this event originated from on the app side.
     * Only populated if {@link #DEBUG_ORIGIN} is enabled
     * Can be inspected(e.g. printed) from an
     * {@link android.accessibilityservice.AccessibilityService} to trace where particular events
     * are being dispatched from.
     *
     * @hide
     */
    public StackTraceElement[] originStackTrace = null;

    private ArrayList<AccessibilityRecord> mRecords;

    /*
@@ -780,6 +793,7 @@ public final class AccessibilityEvent extends AccessibilityRecord implements Par
        mWindowChangeTypes = event.mWindowChangeTypes;
        mEventTime = event.mEventTime;
        mPackageName = event.mPackageName;
        if (DEBUG_ORIGIN) originStackTrace = event.originStackTrace;
    }

    /**
@@ -1104,7 +1118,9 @@ public final class AccessibilityEvent extends AccessibilityRecord implements Par
     */
    public static AccessibilityEvent obtain() {
        AccessibilityEvent event = sPool.acquire();
        return (event != null) ? event : new AccessibilityEvent();
        if (event == null) event = new AccessibilityEvent();
        if (DEBUG_ORIGIN) event.originStackTrace = Thread.currentThread().getStackTrace();
        return event;
    }

    /**
@@ -1142,6 +1158,7 @@ public final class AccessibilityEvent extends AccessibilityRecord implements Par
                record.recycle();
            }
        }
        if (DEBUG_ORIGIN) originStackTrace = null;
    }

    /**
@@ -1164,7 +1181,7 @@ public final class AccessibilityEvent extends AccessibilityRecord implements Par
        // Read the records.
        final int recordCount = parcel.readInt();
        if (recordCount > 0) {
            mRecords = new ArrayList<AccessibilityRecord>(recordCount);
            mRecords = new ArrayList<>(recordCount);
            for (int i = 0; i < recordCount; i++) {
                AccessibilityRecord record = AccessibilityRecord.obtain();
                readAccessibilityRecordFromParcel(record, parcel);
@@ -1172,6 +1189,17 @@ public final class AccessibilityEvent extends AccessibilityRecord implements Par
                mRecords.add(record);
            }
        }

        if (DEBUG_ORIGIN) {
            originStackTrace = new StackTraceElement[parcel.readInt()];
            for (int i = 0; i < originStackTrace.length; i++) {
                originStackTrace[i] = new StackTraceElement(
                        parcel.readString(),
                        parcel.readString(),
                        parcel.readString(),
                        parcel.readInt());
            }
        }
    }

    /**
@@ -1227,6 +1255,17 @@ public final class AccessibilityEvent extends AccessibilityRecord implements Par
            AccessibilityRecord record = mRecords.get(i);
            writeAccessibilityRecordToParcel(record, parcel, flags);
        }

        if (DEBUG_ORIGIN) {
            if (originStackTrace == null) originStackTrace = Thread.currentThread().getStackTrace();
            parcel.writeInt(originStackTrace.length);
            for (StackTraceElement element : originStackTrace) {
                parcel.writeString(element.getClassName());
                parcel.writeString(element.getMethodName());
                parcel.writeString(element.getFileName());
                parcel.writeInt(element.getLineNumber());
            }
        }
    }

    /**
+9 −2
Original line number Diff line number Diff line
@@ -326,12 +326,14 @@ public final class AccessibilityInteractionClient
                            accessibilityWindowId, accessibilityNodeId);
                    if (cachedInfo != null) {
                        if (DEBUG) {
                            Log.i(LOG_TAG, "Node cache hit");
                            Log.i(LOG_TAG, "Node cache hit for "
                                    + idToString(accessibilityWindowId, accessibilityNodeId));
                        }
                        return cachedInfo;
                    }
                    if (DEBUG) {
                        Log.i(LOG_TAG, "Node cache miss");
                        Log.i(LOG_TAG, "Node cache miss for "
                                + idToString(accessibilityWindowId, accessibilityNodeId));
                    }
                }
                final int interactionId = mInteractionIdCounter.getAndIncrement();
@@ -368,6 +370,11 @@ public final class AccessibilityInteractionClient
        return null;
    }

    private static String idToString(int accessibilityWindowId, long accessibilityNodeId) {
        return accessibilityWindowId + "/"
                + AccessibilityNodeInfo.idToString(accessibilityNodeId);
    }

    /**
     * Finds an {@link AccessibilityNodeInfo} by View id. The search is performed in
     * the window whose id is specified and starts from the node whose accessibility
+3 −2
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@

package android.view.accessibility;

import static android.accessibilityservice.AccessibilityServiceInfo.FLAG_ENABLE_ACCESSIBILITY_VOLUME;

import android.Manifest;
import android.accessibilityservice.AccessibilityServiceInfo;
import android.accessibilityservice.AccessibilityServiceInfo.FeedbackType;
@@ -44,6 +46,7 @@ import android.util.SparseArray;
import android.view.IWindow;
import android.view.View;
import android.view.accessibility.AccessibilityEvent.EventType;

import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.IntPair;

@@ -51,8 +54,6 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import static android.accessibilityservice.AccessibilityServiceInfo.FLAG_ENABLE_ACCESSIBILITY_VOLUME;

/**
 * System level service that serves as an event dispatch for {@link AccessibilityEvent}s,
 * and provides facilities for querying the accessibility state of the system.
Loading