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

Commit a54956a0 authored by Alan Viverette's avatar Alan Viverette
Browse files

Fix accessibility delegation

Ensures that delegate code is run last. Previously, calling the super
method from an accessibility delegate set on a widget would only run
code in the widget's parent. Next, the delegate code would run. Finally,
the widget's code would run. As a result, the widget code would override
any data supplied by the delegate.

By moving all overridden code to internal methods, we ensure that the
call chain for super includes the widget's parent code followed by the
widget's code. The delegate code will always run last.

BUG: 17641433
Change-Id: Ib9d403156c1fc4fb04f65f3c126d1277a44b3740
parent 235312d6
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -588,9 +588,10 @@ public class AppWidgetHostView extends FrameLayout {
        return tv;
    }

    /** @hide */
    @Override
    public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
        super.onInitializeAccessibilityNodeInfo(info);
    public void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) {
        super.onInitializeAccessibilityNodeInfoInternal(info);
        info.setClassName(AppWidgetHostView.class.getName());
    }

+22 −8
Original line number Diff line number Diff line
@@ -5270,8 +5270,10 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
     * @see #sendAccessibilityEvent(int)
     *
     * Note: Called from the default {@link AccessibilityDelegate}.
     *
     * @hide
     */
    void sendAccessibilityEventInternal(int eventType) {
    public void sendAccessibilityEventInternal(int eventType) {
        if (AccessibilityManager.getInstance(mContext).isEnabled()) {
            sendAccessibilityEventUnchecked(AccessibilityEvent.obtain(eventType));
        }
@@ -5304,8 +5306,10 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
     * @see #sendAccessibilityEventUnchecked(AccessibilityEvent)
     *
     * Note: Called from the default {@link AccessibilityDelegate}.
     *
     * @hide
     */
    void sendAccessibilityEventUncheckedInternal(AccessibilityEvent event) {
    public void sendAccessibilityEventUncheckedInternal(AccessibilityEvent event) {
        if (!isShown()) {
            return;
        }
@@ -5355,8 +5359,10 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
     * @see #dispatchPopulateAccessibilityEvent(AccessibilityEvent)
     *
     * Note: Called from the default {@link AccessibilityDelegate}.
     *
     * @hide
     */
    boolean dispatchPopulateAccessibilityEventInternal(AccessibilityEvent event) {
    public boolean dispatchPopulateAccessibilityEventInternal(AccessibilityEvent event) {
        onPopulateAccessibilityEvent(event);
        return false;
    }
@@ -5404,8 +5410,10 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
     * @see #onPopulateAccessibilityEvent(AccessibilityEvent)
     *
     * Note: Called from the default {@link AccessibilityDelegate}.
     *
     * @hide
     */
    void onPopulateAccessibilityEventInternal(AccessibilityEvent event) {
    public void onPopulateAccessibilityEventInternal(AccessibilityEvent event) {
    }
    /**
@@ -5446,8 +5454,10 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
     * @see #onInitializeAccessibilityEvent(AccessibilityEvent)
     *
     * Note: Called from the default {@link AccessibilityDelegate}.
     *
     * @hide
     */
    void onInitializeAccessibilityEventInternal(AccessibilityEvent event) {
    public void onInitializeAccessibilityEventInternal(AccessibilityEvent event) {
        event.setSource(this);
        event.setClassName(View.class.getName());
        event.setPackageName(getContext().getPackageName());
@@ -5502,8 +5512,10 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
    /**
     * @see #createAccessibilityNodeInfo()
     *
     * @hide
     */
    AccessibilityNodeInfo createAccessibilityNodeInfoInternal() {
    public AccessibilityNodeInfo createAccessibilityNodeInfoInternal() {
        AccessibilityNodeProvider provider = getAccessibilityNodeProvider();
        if (provider != null) {
            return provider.createAccessibilityNodeInfo(View.NO_ID);
@@ -5602,8 +5614,10 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
     * @see #onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo)
     *
     * Note: Called from the default {@link AccessibilityDelegate}.
     *
     * @hide
     */
    void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) {
    public void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) {
        Rect bounds = mAttachInfo.mTmpInvalRect;
        getDrawingRect(bounds);
@@ -8185,7 +8199,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
    *
    * Note: Called from the default {@link AccessibilityDelegate}.
    *
    * @hide Until we've refactored all accessibility delegation methods.
    * @hide
    */
    public boolean performAccessibilityActionInternal(int action, Bundle arguments) {
        switch (action) {
+9 −4
Original line number Diff line number Diff line
@@ -773,8 +773,10 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
     * @see #onRequestSendAccessibilityEvent(View, AccessibilityEvent)
     *
     * Note: Called from the default {@link View.AccessibilityDelegate}.
     *
     * @hide
     */
    boolean onRequestSendAccessibilityEventInternal(View child, AccessibilityEvent event) {
    public boolean onRequestSendAccessibilityEventInternal(View child, AccessibilityEvent event) {
        return true;
    }

@@ -2845,8 +2847,9 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
        }
    }

    /** @hide */
    @Override
    boolean dispatchPopulateAccessibilityEventInternal(AccessibilityEvent event) {
    public boolean dispatchPopulateAccessibilityEventInternal(AccessibilityEvent event) {
        boolean handled = false;
        if (includeForAccessibility()) {
            handled = super.dispatchPopulateAccessibilityEventInternal(event);
@@ -2873,8 +2876,9 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
        return false;
    }

    /** @hide */
    @Override
    void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) {
    public void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) {
        super.onInitializeAccessibilityNodeInfoInternal(info);
        if (mAttachInfo != null) {
            final ArrayList<View> childrenForAccessibility = mAttachInfo.mTempArrayList;
@@ -2889,8 +2893,9 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
        }
    }

    /** @hide */
    @Override
    void onInitializeAccessibilityEventInternal(AccessibilityEvent event) {
    public void onInitializeAccessibilityEventInternal(AccessibilityEvent event) {
        super.onInitializeAccessibilityEventInternal(event);
        event.setClassName(ViewGroup.class.getName());
    }
+13 −10
Original line number Diff line number Diff line
@@ -2069,8 +2069,8 @@ public class WebView extends AbsoluteLayout
            return WebView.super.onHoverEvent(event);
        }

        public boolean super_performAccessibilityAction(int action, Bundle arguments) {
            return WebView.super.performAccessibilityAction(action, arguments);
        public boolean super_performAccessibilityActionInternal(int action, Bundle arguments) {
            return WebView.super.performAccessibilityActionInternal(action, arguments);
        }

        public boolean super_performLongClick() {
@@ -2378,23 +2378,26 @@ public class WebView extends AbsoluteLayout
        return mProvider.getViewDelegate().shouldDelayChildPressedState();
    }

    /** @hide */
    @Override
    public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
        super.onInitializeAccessibilityNodeInfo(info);
    public void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) {
        super.onInitializeAccessibilityNodeInfoInternal(info);
        info.setClassName(WebView.class.getName());
        mProvider.getViewDelegate().onInitializeAccessibilityNodeInfo(info);
        mProvider.getViewDelegate().onInitializeAccessibilityNodeInfoInternal(info);
    }

    /** @hide */
    @Override
    public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
        super.onInitializeAccessibilityEvent(event);
    public void onInitializeAccessibilityEventInternal(AccessibilityEvent event) {
        super.onInitializeAccessibilityEventInternal(event);
        event.setClassName(WebView.class.getName());
        mProvider.getViewDelegate().onInitializeAccessibilityEvent(event);
        mProvider.getViewDelegate().onInitializeAccessibilityEventInternal(event);
    }

    /** @hide */
    @Override
    public boolean performAccessibilityAction(int action, Bundle arguments) {
        return mProvider.getViewDelegate().performAccessibilityAction(action, arguments);
    public boolean performAccessibilityActionInternal(int action, Bundle arguments) {
        return mProvider.getViewDelegate().performAccessibilityActionInternal(action, arguments);
    }

    /** @hide */
+3 −3
Original line number Diff line number Diff line
@@ -292,11 +292,11 @@ public interface WebViewProvider {

        public AccessibilityNodeProvider getAccessibilityNodeProvider();

        public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info);
        public void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info);

        public void onInitializeAccessibilityEvent(AccessibilityEvent event);
        public void onInitializeAccessibilityEventInternal(AccessibilityEvent event);

        public boolean performAccessibilityAction(int action, Bundle arguments);
        public boolean performAccessibilityActionInternal(int action, Bundle arguments);

        public void setOverScrollMode(int mode);

Loading