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

Commit 031d9c13 authored by Svetoslav Ganov's avatar Svetoslav Ganov
Browse files

Adding accessibility delegate mechanism for backwards compatibility support.

1. Added an AccessibilityDelegate class in View which can be set by
   a client that wants to cutomize accessibility behavior via
   composition as opposed to inheritance. Insead overriding a new method in
   View thus being bound to the API version that introduced this
   method a developer can conditionally inject the accessibility
   customization if the platform API version is heigh enough. The
   developer will have to override the method of interest of the
   delegate. The default implementation of the delegate methods is
   the same as that of View in the case that there is no delegate
   set. If a delegate is set calling an accessibility related method
   on View will be handed off to the corresponsing method of the
   delegate.

bug:5259555

Change-Id: I00e750e22e5e7164a1b571cb3d12ecaf4ab93db4
parent 5e875259
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
@@ -22950,6 +22950,7 @@ package android.view {
    method public void scrollTo(int, int);
    method public void sendAccessibilityEvent(int);
    method public void sendAccessibilityEventUnchecked(android.view.accessibility.AccessibilityEvent);
    method public void setAccessibilityDelegate(android.view.View.AccessibilityDelegate);
    method public void setActivated(boolean);
    method public void setAlpha(float);
    method public void setAnimation(android.view.animation.Animation);
@@ -23126,6 +23127,17 @@ package android.view {
    field public static android.util.Property Y;
  }
  public static class View.AccessibilityDelegate {
    ctor public View.AccessibilityDelegate();
    method public boolean dispatchPopulateAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
    method public void onInitializeAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
    method public void onInitializeAccessibilityNodeInfo(android.view.View, android.view.accessibility.AccessibilityNodeInfo);
    method public void onPopulateAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
    method public boolean onRequestSendAccessibilityEvent(android.view.ViewGroup, android.view.View, android.view.accessibility.AccessibilityEvent);
    method public void sendAccessibilityEvent(android.view.View, int);
    method public void sendAccessibilityEventUnchecked(android.view.View, android.view.accessibility.AccessibilityEvent);
  }
  public static class View.BaseSavedState extends android.view.AbsSavedState {
    ctor public View.BaseSavedState(android.os.Parcel);
    ctor public View.BaseSavedState(android.os.Parcelable);
+344 −8

File changed.

Preview size limit exceeded, changes collapsed.

+24 −4
Original line number Diff line number Diff line
@@ -34,6 +34,7 @@ import android.os.SystemClock;
import android.util.AttributeSet;
import android.util.Log;
import android.util.SparseArray;
import android.view.View.AccessibilityDelegate;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityNodeInfo;
import android.view.animation.Animation;
@@ -606,6 +607,12 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
    /**
     * Called when a child has requested sending an {@link AccessibilityEvent} and
     * gives an opportunity to its parent to augment the event.
     * <p>
     * If an {@link AccessibilityDelegate} has been specified via calling
     * {@link #setAccessibilityDelegate(AccessibilityDelegate)} its
     * {@link AccessibilityDelegate#onRequestSendAccessibilityEvent(ViewGroup, View, AccessibilityEvent)}
     * is responsible for handling this call.
     * </p>
     *
     * @param child The child which requests sending the event.
     * @param event The event to be sent.
@@ -614,6 +621,19 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
     * @see #requestSendAccessibilityEvent(View, AccessibilityEvent)
     */
    public boolean onRequestSendAccessibilityEvent(View child, AccessibilityEvent event) {
        if (mAccessibilityDelegate != null) {
            return mAccessibilityDelegate.onRequestSendAccessibilityEvent(this, child, event);
        } else {
            return onRequestSendAccessibilityEventInternal(child, event);
        }
    }

    /**
     * @see #onRequestSendAccessibilityEvent(View, AccessibilityEvent)
     *
     * Note: Called from the default {@link View.AccessibilityDelegate}.
     */
    boolean onRequestSendAccessibilityEventInternal(View child, AccessibilityEvent event) {
        return true;
    }

@@ -2142,9 +2162,9 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
    }

    @Override
    public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {
    boolean dispatchPopulateAccessibilityEventInternal(AccessibilityEvent event) {
        // We first get a chance to populate the event.
        onPopulateAccessibilityEvent(event);
        super.dispatchPopulateAccessibilityEventInternal(event);
        // Let our children have a shot in populating the event.
        for (int i = 0, count = getChildCount(); i < count; i++) {
            View child = getChildAt(i);
@@ -2159,8 +2179,8 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager
    }

    @Override
    public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
        super.onInitializeAccessibilityNodeInfo(info);
    void onInitializeAccessibilityNodeInfoInternal(AccessibilityNodeInfo info) {
        super.onInitializeAccessibilityNodeInfoInternal(info);
        // If the view is not the topmost one in the view hierarchy and it is
        // marked as the logical root of a view hierarchy, do not go any deeper.
        if ((!(getParent() instanceof ViewRootImpl)) && (mPrivateFlags & IS_ROOT_NAMESPACE) != 0) {
+1 −0
Original line number Diff line number Diff line
@@ -896,6 +896,7 @@ public abstract class AdapterView<T extends Adapter> extends ViewGroup {

    @Override
    public void onPopulateAccessibilityEvent(AccessibilityEvent event) {
        super.onPopulateAccessibilityEvent(event);
        // We send selection events only from AdapterView to avoid
        // generation of such event for each child.
        getSelectedView().dispatchPopulateAccessibilityEvent(event);
+1 −0
Original line number Diff line number Diff line
@@ -212,6 +212,7 @@ public class ImageView extends View {

    @Override
    public void onPopulateAccessibilityEvent(AccessibilityEvent event) {
        super.onPopulateAccessibilityEvent(event);
        CharSequence contentDescription = getContentDescription();
        if (!TextUtils.isEmpty(contentDescription)) {
            event.getText().add(contentDescription);
Loading