1/*
2 * Copyright (C) 2014 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package android.support.v7.widget;
18
19import android.os.Bundle;
20import android.support.v4.view.AccessibilityDelegateCompat;
21import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat;
22import android.view.View;
23import android.view.accessibility.AccessibilityEvent;
24
25/**
26 * The AccessibilityDelegate used by RecyclerView.
27 * <p>
28 * This class handles basic accessibility actions and delegates them to LayoutManager.
29 */
30public class RecyclerViewAccessibilityDelegate extends AccessibilityDelegateCompat {
31    final RecyclerView mRecyclerView;
32
33
34    public RecyclerViewAccessibilityDelegate(RecyclerView recyclerView) {
35        mRecyclerView = recyclerView;
36    }
37
38    @Override
39    public boolean performAccessibilityAction(View host, int action, Bundle args) {
40        if (super.performAccessibilityAction(host, action, args)) {
41            return true;
42        }
43        if (mRecyclerView.getLayoutManager() != null) {
44            return mRecyclerView.getLayoutManager().performAccessibilityAction(action, args);
45        }
46
47        return false;
48    }
49
50    @Override
51    public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfoCompat info) {
52        super.onInitializeAccessibilityNodeInfo(host, info);
53        info.setClassName(RecyclerView.class.getName());
54        if (mRecyclerView.getLayoutManager() != null) {
55            mRecyclerView.getLayoutManager().onInitializeAccessibilityNodeInfo(info);
56        }
57    }
58
59    @Override
60    public void onInitializeAccessibilityEvent(View host, AccessibilityEvent event) {
61        super.onInitializeAccessibilityEvent(host, event);
62        event.setClassName(RecyclerView.class.getName());
63        if (host instanceof RecyclerView) {
64            RecyclerView rv = (RecyclerView) host;
65            if (rv.getLayoutManager() != null) {
66                rv.getLayoutManager().onInitializeAccessibilityEvent(event);
67            }
68        }
69    }
70
71    AccessibilityDelegateCompat getItemDelegate() {
72        return mItemDelegate;
73    }
74
75    final AccessibilityDelegateCompat mItemDelegate = new AccessibilityDelegateCompat() {
76        @Override
77        public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfoCompat info) {
78            super.onInitializeAccessibilityNodeInfo(host, info);
79            if (mRecyclerView.getLayoutManager() != null) {
80                mRecyclerView.getLayoutManager().
81                        onInitializeAccessibilityNodeInfoForItem(host, info);
82            }
83        }
84
85        @Override
86        public boolean performAccessibilityAction(View host, int action, Bundle args) {
87            if (super.performAccessibilityAction(host, action, args)) {
88                return true;
89            }
90            if (mRecyclerView.getLayoutManager() != null) {
91                return mRecyclerView.getLayoutManager().
92                        performAccessibilityActionForItem(host, action, args);
93            }
94            return false;
95        }
96    };
97}
98