AccessibilityNodeProviderCompat.java revision ca55694ec8cfb4cd836a23efe82d45b4c5e4158d
1/*
2 * Copyright (C) 2012 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.v4.view.accessibility;
18
19import android.os.Build;
20import android.os.Bundle;
21import android.view.View;
22import android.view.accessibility.AccessibilityNodeInfo;
23
24import java.util.ArrayList;
25import java.util.List;
26
27/**
28 * Helper for accessing {@link android.view.accessibility.AccessibilityNodeProvider}
29 * introduced after API level 4 in a backwards compatible fashion.
30 */
31public class AccessibilityNodeProviderCompat {
32
33    interface AccessibilityNodeProviderImpl {
34        public Object newAccessibilityNodeProviderBridge(AccessibilityNodeProviderCompat compat);
35    }
36
37    static class AccessibilityNodeProviderStubImpl implements AccessibilityNodeProviderImpl {
38        @Override
39        public Object newAccessibilityNodeProviderBridge(AccessibilityNodeProviderCompat compat) {
40            return null;
41        }
42    }
43
44    static class AccessibilityNodeProviderJellyBeanImpl extends AccessibilityNodeProviderStubImpl {
45        @Override
46        public Object newAccessibilityNodeProviderBridge(
47                final AccessibilityNodeProviderCompat compat) {
48            return AccessibilityNodeProviderCompatJellyBean.newAccessibilityNodeProviderBridge(
49                    new AccessibilityNodeProviderCompatJellyBean.AccessibilityNodeInfoBridge() {
50                        @Override
51                        public boolean performAction(int virtualViewId, int action,
52                                Bundle arguments) {
53                            return compat.performAction(virtualViewId, action, arguments);
54                        }
55
56                        @Override
57                        public List<Object> findAccessibilityNodeInfosByText(
58                                            String text, int virtualViewId) {
59                            List<AccessibilityNodeInfoCompat> compatInfos =
60                                compat.findAccessibilityNodeInfosByText(text, virtualViewId);
61                            List<Object> infos = new ArrayList<Object>();
62                            final int infoCount = compatInfos.size();
63                            for (int i = 0; i < infoCount; i++) {
64                                AccessibilityNodeInfoCompat infoCompat = compatInfos.get(i);
65                                infos.add(infoCompat.getInfo());
66                            }
67                            return infos;
68                        }
69
70                        @Override
71                        public Object createAccessibilityNodeInfo(
72                                int virtualViewId) {
73                            final AccessibilityNodeInfoCompat compatInfo = compat
74                                    .createAccessibilityNodeInfo(virtualViewId);
75                            if (compatInfo == null) {
76                                return null;
77                            } else {
78                                return compatInfo.getInfo();
79                            }
80                        }
81                    });
82        }
83    }
84
85    static class AccessibilityNodeProviderKitKatImpl extends AccessibilityNodeProviderStubImpl {
86        @Override
87        public Object newAccessibilityNodeProviderBridge(
88                final AccessibilityNodeProviderCompat compat) {
89            return AccessibilityNodeProviderCompatKitKat.newAccessibilityNodeProviderBridge(
90                    new AccessibilityNodeProviderCompatKitKat.AccessibilityNodeInfoBridge() {
91                        @Override
92                        public boolean performAction(int virtualViewId, int action,
93                                Bundle arguments) {
94                            return compat.performAction(virtualViewId, action, arguments);
95                        }
96
97                        @Override
98                        public List<Object> findAccessibilityNodeInfosByText(
99                                            String text, int virtualViewId) {
100                            List<AccessibilityNodeInfoCompat> compatInfos =
101                                compat.findAccessibilityNodeInfosByText(text, virtualViewId);
102                            List<Object> infos = new ArrayList<Object>();
103                            final int infoCount = compatInfos.size();
104                            for (int i = 0; i < infoCount; i++) {
105                                AccessibilityNodeInfoCompat infoCompat = compatInfos.get(i);
106                                infos.add(infoCompat.getInfo());
107                            }
108                            return infos;
109                        }
110
111                        @Override
112                        public Object createAccessibilityNodeInfo(
113                                int virtualViewId) {
114                            final AccessibilityNodeInfoCompat compatInfo = compat
115                                    .createAccessibilityNodeInfo(virtualViewId);
116                            if (compatInfo == null) {
117                                return null;
118                            } else {
119                                return compatInfo.getInfo();
120                            }
121                        }
122
123                        @Override
124                        public Object findFocus(int focus) {
125                            return compat.findFocus(focus);
126                        }
127                    });
128        }
129    }
130
131    private static final AccessibilityNodeProviderImpl IMPL;
132
133    private final Object mProvider;
134
135    static {
136        // TODO: Remove code name check when APIs are finalized.
137        if ("KitKat".equals(Build.VERSION.CODENAME) || Build.VERSION.SDK_INT >= 19) { // KitKat
138            IMPL = new AccessibilityNodeProviderKitKatImpl();
139        } else if (Build.VERSION.SDK_INT >= 16) { // JellyBean
140            IMPL = new AccessibilityNodeProviderJellyBeanImpl();
141        } else {
142            IMPL = new AccessibilityNodeProviderStubImpl();
143        }
144    }
145
146    /**
147     * Creates a new instance.
148     */
149    public AccessibilityNodeProviderCompat() {
150        mProvider = IMPL.newAccessibilityNodeProviderBridge(this);
151    }
152
153    /**
154     * Creates a new instance wrapping an
155     * {@link android.view.accessibility.AccessibilityNodeProvider}.
156     *
157     * @param provider The provider.
158     */
159    public AccessibilityNodeProviderCompat(Object provider) {
160        mProvider = provider;
161    }
162
163    /**
164     * @return The wrapped {@link android.view.accessibility.AccessibilityNodeProvider}.
165     */
166    public Object getProvider() {
167        return mProvider;
168    }
169
170    /**
171     * Returns an {@link AccessibilityNodeInfoCompat} representing a virtual view,
172     * i.e. a descendant of the host View, with the given <code>virtualViewId</code>
173     * or the host View itself if <code>virtualViewId</code> equals to {@link View#NO_ID}.
174     * <p>
175     * A virtual descendant is an imaginary View that is reported as a part of the view
176     * hierarchy for accessibility purposes. This enables custom views that draw complex
177     * content to report them selves as a tree of virtual views, thus conveying their
178     * logical structure.
179     * </p>
180     * <p>
181     * The implementer is responsible for obtaining an accessibility node info from the
182     * pool of reusable instances and setting the desired properties of the node info
183     * before returning it.
184     * </p>
185     *
186     * @param virtualViewId A client defined virtual view id.
187     * @return A populated {@link AccessibilityNodeInfoCompat} for a virtual descendant
188     *     or the host View.
189     *
190     * @see AccessibilityNodeInfoCompat
191     */
192    public AccessibilityNodeInfoCompat createAccessibilityNodeInfo(int virtualViewId) {
193        return null;
194    }
195
196    /**
197     * Performs an accessibility action on a virtual view, i.e. a descendant of the
198     * host View, with the given <code>virtualViewId</code> or the host View itself
199     * if <code>virtualViewId</code> equals to {@link View#NO_ID}.
200     *
201     * @param virtualViewId A client defined virtual view id.
202     * @param action The action to perform.
203     * @param arguments Optional arguments.
204     * @return True if the action was performed.
205     *
206     * @see #createAccessibilityNodeInfo(int)
207     * @see AccessibilityNodeInfoCompat
208     */
209    public boolean performAction(int virtualViewId, int action, Bundle arguments) {
210        return false;
211    }
212
213    /**
214     * Finds {@link AccessibilityNodeInfoCompat}s by text. The match is case insensitive
215     * containment. The search is relative to the virtual view, i.e. a descendant of the
216     * host View, with the given <code>virtualViewId</code> or the host View itself
217     * <code>virtualViewId</code> equals to {@link View#NO_ID}.
218     *
219     * @param virtualViewId A client defined virtual view id which defined
220     *     the root of the tree in which to perform the search.
221     * @param text The searched text.
222     * @return A list of node info.
223     *
224     * @see #createAccessibilityNodeInfo(int)
225     * @see AccessibilityNodeInfoCompat
226     */
227    public List<AccessibilityNodeInfoCompat> findAccessibilityNodeInfosByText(String text,
228            int virtualViewId) {
229        return null;
230    }
231
232    /**
233     * Find the virtual view, i.e. a descendant of the host View, that has the
234     * specified focus type.
235     *
236     * @param focus The focus to find. One of
237     *            {@link AccessibilityNodeInfoCompat#FOCUS_INPUT} or
238     *            {@link AccessibilityNodeInfoCompat#FOCUS_ACCESSIBILITY}.
239     * @return The node info of the focused view or null.
240     * @see AccessibilityNodeInfoCompat#FOCUS_INPUT
241     * @see AccessibilityNodeInfoCompat#FOCUS_ACCESSIBILITY
242     */
243    public AccessibilityNodeInfo findFocus(int focus) {
244        return null;
245    }
246}
247