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

Commit 5fd804dc authored by Ivan Chiang's avatar Ivan Chiang
Browse files

Fix A11y click fail issue when the item is clickable

Use DocumentHolder.getItemDetails to check whether add
ACTION_CLICK in onInitializeAccessibilityNodeInfo method.

Test: Enable A11y, click items.
Test: atest DocumentsUITests
Change-Id: I6e86d54997d7f295c9b7b38c5669ae544d5b0e4a
Fix: 122017895
parent 99ade1fb
Loading
Loading
Loading
Loading
+1 −2
Original line number Diff line number Diff line
@@ -28,8 +28,7 @@
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:layout_margin="4dp"
    android:focusable="true"
    android:clickable="true">
    android:focusable="true">

    <com.google.android.material.card.MaterialCardView
        android:layout_width="match_parent"
+1 −2
Original line number Diff line number Diff line
@@ -27,8 +27,7 @@
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:layout_margin="4dp"
    android:focusable="true"
    android:clickable="true">
    android:focusable="true">

    <com.google.android.material.card.MaterialCardView
        android:layout_width="match_parent"
+0 −1
Original line number Diff line number Diff line
@@ -22,7 +22,6 @@
    android:layout_height="wrap_content"
    android:background="?android:attr/selectableItemBackground"
    android:focusable="true"
    android:clickable="true"
    android:orientation="horizontal" >


+10 −2
Original line number Diff line number Diff line
@@ -17,12 +17,13 @@
package com.android.documentsui.dirlist;

import android.os.Bundle;
import android.view.View;

import androidx.core.view.AccessibilityDelegateCompat;
import androidx.core.view.accessibility.AccessibilityNodeInfoCompat;
import androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat;
import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.RecyclerViewAccessibilityDelegate;
import android.view.View;

import java.util.function.Function;

@@ -54,7 +55,14 @@ public class AccessibilityEventRouter extends RecyclerViewAccessibilityDelegate
            public void onInitializeAccessibilityNodeInfo(View host,
                    AccessibilityNodeInfoCompat info) {
                super.onInitializeAccessibilityNodeInfo(host, info);
                if (host.isClickable()) {
                final RecyclerView.ViewHolder holder = recyclerView.getChildViewHolder(host);
                // if the viewHolder is a DocumentsHolder instance and the ItemDetails
                // is null, it can't be clicked
                if (holder instanceof DocumentHolder) {
                    if (((DocumentHolder)holder).getItemDetails() != null) {
                        info.addAction(AccessibilityActionCompat.ACTION_CLICK);
                    }
                } else {
                    info.addAction(AccessibilityActionCompat.ACTION_CLICK);
                }
                info.setSelected(host.isActivated());
+16 −7
Original line number Diff line number Diff line
@@ -31,7 +31,7 @@ import java.util.List;

public class TestRecyclerView extends RecyclerView {

    private List<RecyclerView.ViewHolder> holders = new ArrayList<>();
    private List<RecyclerView.ViewHolder> mHolders = new ArrayList<>();
    private TestDocumentsAdapter adapter;
    private RecyclerView.LayoutManager mLayoutManager;

@@ -39,9 +39,18 @@ public class TestRecyclerView extends RecyclerView {
        super(context);
    }

    @Override
    public ViewHolder getChildViewHolder(View child) {
        return mHolders.get(0);
    }

    public void setHolders(List<ViewHolder> holders) {
        mHolders = holders;
    }

    @Override
    public ViewHolder findViewHolderForAdapterPosition(int position) {
        return holders.get(position);
        return mHolders.get(position);
    }

    @Override
@@ -68,9 +77,9 @@ public class TestRecyclerView extends RecyclerView {
    }

    public void setItems(List<String> modelIds) {
        holders = new ArrayList<>();
        mHolders = new ArrayList<>();
        for (String modelId: modelIds) {
            holders.add(new TestViewHolder(Views.createTestView()));
            mHolders.add(new TestViewHolder(Views.createTestView()));
        }
        adapter.updateTestModelIds(modelIds);
    }
@@ -78,16 +87,16 @@ public class TestRecyclerView extends RecyclerView {
    public static TestRecyclerView create(List<String> modelIds) {
        final TestRecyclerView view =
                new TestRecyclerView(InstrumentationRegistry.getTargetContext());
        view.holders = new ArrayList<>();
        view.mHolders = new ArrayList<>();
        for (String modelId: modelIds) {
            view.holders.add(new TestViewHolder(Views.createTestView()));
            view.mHolders.add(new TestViewHolder(Views.createTestView()));
        }
        view.adapter = new TestDocumentsAdapter(modelIds);
        return view;
    }

    public void assertItemViewFocused(int pos) {
        Mockito.verify(holders.get(pos).itemView).requestFocus();
        Mockito.verify(mHolders.get(pos).itemView).requestFocus();
    }

    private static class TestViewHolder extends RecyclerView.ViewHolder {
Loading