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

Commit 5b2081dc authored by Alan Viverette's avatar Alan Viverette
Browse files

Implement new accessibility APIs in lists, text view

Sets contentInvalid for TextViews with errors, sets collection
and item properties in AbsListView, GridView, and ListView.

BUG: 10391326
Change-Id: I91191c8ce1e10a1112f74215e30b26349396344b
parent 116c12ef
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -30370,6 +30370,7 @@ package android.widget {
    method protected void layoutChildren();
    method protected void layoutChildren();
    method public void onFilterComplete(int);
    method public void onFilterComplete(int);
    method public void onGlobalLayout();
    method public void onGlobalLayout();
    method public void onInitializeAccessibilityNodeInfoForItem(android.view.View, int, android.view.accessibility.AccessibilityNodeInfo);
    method public boolean onRemoteAdapterConnected();
    method public boolean onRemoteAdapterConnected();
    method public void onRemoteAdapterDisconnected();
    method public void onRemoteAdapterDisconnected();
    method public void onRestoreInstanceState(android.os.Parcelable);
    method public void onRestoreInstanceState(android.os.Parcelable);
+40 −27
Original line number Original line Diff line number Diff line
@@ -2309,33 +2309,7 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
            super.onInitializeAccessibilityNodeInfo(host, info);
            super.onInitializeAccessibilityNodeInfo(host, info);


            final int position = getPositionForView(host);
            final int position = getPositionForView(host);
            final ListAdapter adapter = getAdapter();
            onInitializeAccessibilityNodeInfoForItem(host, position, info);

            if ((position == INVALID_POSITION) || (adapter == null)) {
                return;
            }

            if (!isEnabled() || !adapter.isEnabled(position)) {
                return;
            }

            if (position == getSelectedItemPosition()) {
                info.setSelected(true);
                info.addAction(AccessibilityNodeInfo.ACTION_CLEAR_SELECTION);
            } else {
                info.addAction(AccessibilityNodeInfo.ACTION_SELECT);
            }

            if (isClickable()) {
                info.addAction(AccessibilityNodeInfo.ACTION_CLICK);
                info.setClickable(true);
            }

            if (isLongClickable()) {
                info.addAction(AccessibilityNodeInfo.ACTION_LONG_CLICK);
                info.setLongClickable(true);
            }

        }
        }


        @Override
        @Override
@@ -2388,6 +2362,45 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
        }
        }
    }
    }


    /**
     * Initializes an {@link AccessibilityNodeInfo} with information about a
     * particular item in the list.
     *
     * @param view View representing the list item.
     * @param position Position of the list item within the adapter.
     * @param info Node info to populate.
     */
    public void onInitializeAccessibilityNodeInfoForItem(
            View view, int position, AccessibilityNodeInfo info) {
        final ListAdapter adapter = getAdapter();
        if (position == INVALID_POSITION || adapter == null) {
            // The item doesn't exist, so there's not much we can do here.
            return;
        }

        if (!isEnabled() || !adapter.isEnabled(position)) {
            info.setEnabled(false);
            return;
        }

        if (position == getSelectedItemPosition()) {
            info.setSelected(true);
            info.addAction(AccessibilityNodeInfo.ACTION_CLEAR_SELECTION);
        } else {
            info.addAction(AccessibilityNodeInfo.ACTION_SELECT);
        }

        if (isClickable()) {
            info.addAction(AccessibilityNodeInfo.ACTION_CLICK);
            info.setClickable(true);
        }

        if (isLongClickable()) {
            info.addAction(AccessibilityNodeInfo.ACTION_LONG_CLICK);
            info.setLongClickable(true);
        }
    }

    void positionSelector(int position, View sel) {
    void positionSelector(int position, View sel) {
        if (position != INVALID_POSITION) {
        if (position != INVALID_POSITION) {
            mSelectorPosition = position;
            mSelectorPosition = position;
+35 −0
Original line number Original line Diff line number Diff line
@@ -30,7 +30,10 @@ import android.view.ViewDebug;
import android.view.ViewGroup;
import android.view.ViewGroup;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityNodeInfo;
import android.view.accessibility.AccessibilityNodeInfo;
import android.view.accessibility.AccessibilityNodeInfo.CollectionInfo;
import android.view.accessibility.AccessibilityNodeInfo.CollectionItemInfo;
import android.view.animation.GridLayoutAnimationController;
import android.view.animation.GridLayoutAnimationController;
import android.widget.AbsListView.LayoutParams;
import android.widget.RemoteViews.RemoteView;
import android.widget.RemoteViews.RemoteView;




@@ -2259,5 +2262,37 @@ public class GridView extends AbsListView {
    public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
    public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
        super.onInitializeAccessibilityNodeInfo(info);
        super.onInitializeAccessibilityNodeInfo(info);
        info.setClassName(GridView.class.getName());
        info.setClassName(GridView.class.getName());

        final int columnsCount = getNumColumns();
        final int rowsCount = getCount() / columnsCount;
        final CollectionInfo collectionInfo = CollectionInfo.obtain(columnsCount, rowsCount, false);
        info.setCollectionInfo(collectionInfo);
    }

    @Override
    public void onInitializeAccessibilityNodeInfoForItem(
            View view, int position, AccessibilityNodeInfo info) {
        super.onInitializeAccessibilityNodeInfoForItem(view, position, info);

        final int count = getCount();
        final int columnsCount = getNumColumns();
        final int rowsCount = count / columnsCount;

        final int row;
        final int column;
        if (!mStackFromBottom) {
            column = position % columnsCount;
            row = position / columnsCount;
        } else {
            final int invertedIndex = count - 1 - position;

            column = columnsCount - 1 - (invertedIndex % columnsCount);
            row = rowsCount - 1 - invertedIndex / columnsCount;
        }

        final LayoutParams lp = (LayoutParams) view.getLayoutParams();
        final boolean isHeading = lp != null && lp.viewType != ITEM_VIEW_TYPE_HEADER_OR_FOOTER;
        final CollectionItemInfo itemInfo = CollectionItemInfo.obtain(column, 1, row, 1, isHeading);
        info.setCollectionItemInfo(itemInfo);
    }
    }
}
}
+17 −0
Original line number Original line Diff line number Diff line
@@ -42,6 +42,8 @@ import android.view.ViewParent;
import android.view.ViewRootImpl;
import android.view.ViewRootImpl;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityNodeInfo;
import android.view.accessibility.AccessibilityNodeInfo;
import android.view.accessibility.AccessibilityNodeInfo.CollectionInfo;
import android.view.accessibility.AccessibilityNodeInfo.CollectionItemInfo;
import android.widget.RemoteViews.RemoteView;
import android.widget.RemoteViews.RemoteView;


import java.util.ArrayList;
import java.util.ArrayList;
@@ -3778,5 +3780,20 @@ public class ListView extends AbsListView {
    public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
    public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
        super.onInitializeAccessibilityNodeInfo(info);
        super.onInitializeAccessibilityNodeInfo(info);
        info.setClassName(ListView.class.getName());
        info.setClassName(ListView.class.getName());

        final int count = getCount();
        final CollectionInfo collectionInfo = CollectionInfo.obtain(1, count, false);
        info.setCollectionInfo(collectionInfo);
    }

    @Override
    public void onInitializeAccessibilityNodeInfoForItem(
            View view, int position, AccessibilityNodeInfo info) {
        super.onInitializeAccessibilityNodeInfoForItem(view, position, info);

        final LayoutParams lp = (LayoutParams) view.getLayoutParams();
        final boolean isHeading = lp != null && lp.viewType != ITEM_VIEW_TYPE_HEADER_OR_FOOTER;
        final CollectionItemInfo itemInfo = CollectionItemInfo.obtain(0, 1, position, 1, isHeading);
        info.setCollectionItemInfo(itemInfo);
    }
    }
}
}
+5 −0
Original line number Original line Diff line number Diff line
@@ -4406,6 +4406,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
    public void setError(CharSequence error, Drawable icon) {
    public void setError(CharSequence error, Drawable icon) {
        createEditorIfNeeded();
        createEditorIfNeeded();
        mEditor.setError(error, icon);
        mEditor.setError(error, icon);
        notifyViewAccessibilityStateChangedIfNeeded();
    }
    }


    @Override
    @Override
@@ -8147,6 +8148,10 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener


        if (mEditor != null) {
        if (mEditor != null) {
            info.setInputType(mEditor.mInputType);
            info.setInputType(mEditor.mInputType);

            if (mEditor.mError != null) {
                info.setContentInvalid(true);
            }
        }
        }


        if (!TextUtils.isEmpty(mText)) {
        if (!TextUtils.isEmpty(mText)) {