AccessibilityManagerCompat.java revision 1ef22af9051a858183b028cc4f7c02c973653be4
1/*
2 * Copyright (C) 2011 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.accessibilityservice.AccessibilityServiceInfo;
20import android.os.Build;
21import android.support.v4.view.accessibility.AccessibilityManagerCompatIcs.AccessibilityStateChangeListenerBridge;
22import android.support.v4.view.accessibility.AccessibilityManagerCompatIcs.AccessibilityStateChangeListenerWrapper;
23import android.support.v4.view.accessibility.AccessibilityManagerCompatKitKat.TouchExplorationStateChangeListenerBridge;
24import android.support.v4.view.accessibility.AccessibilityManagerCompatKitKat.TouchExplorationStateChangeListenerWrapper;
25import android.view.accessibility.AccessibilityManager;
26
27import java.util.Collections;
28import java.util.List;
29
30/**
31 * Helper for accessing features in {@link AccessibilityManager}
32 * introduced after API level 4 in a backwards compatible fashion.
33 */
34public final class AccessibilityManagerCompat {
35
36    interface AccessibilityManagerVersionImpl {
37        AccessibilityStateChangeListenerWrapper newAccessibilityStateChangeListener(
38                AccessibilityStateChangeListener listener);
39        boolean addAccessibilityStateChangeListener(AccessibilityManager manager,
40                AccessibilityStateChangeListener listener);
41        boolean removeAccessibilityStateChangeListener(AccessibilityManager manager,
42                AccessibilityStateChangeListener listener);
43        List<AccessibilityServiceInfo> getEnabledAccessibilityServiceList(
44                AccessibilityManager manager,int feedbackTypeFlags);
45        List<AccessibilityServiceInfo> getInstalledAccessibilityServiceList(
46                AccessibilityManager manager);
47        boolean isTouchExplorationEnabled(AccessibilityManager manager);
48        TouchExplorationStateChangeListenerWrapper newTouchExplorationStateChangeListener(
49                TouchExplorationStateChangeListener listener);
50        boolean addTouchExplorationStateChangeListener(AccessibilityManager manager,
51                TouchExplorationStateChangeListener listener);
52        boolean removeTouchExplorationStateChangeListener(AccessibilityManager manager,
53                TouchExplorationStateChangeListener listener);
54    }
55
56    static class AccessibilityManagerStubImpl implements AccessibilityManagerVersionImpl {
57        @Override
58        public AccessibilityStateChangeListenerWrapper newAccessibilityStateChangeListener(
59                AccessibilityStateChangeListener listener) {
60            return null;
61        }
62
63        @Override
64        public boolean addAccessibilityStateChangeListener(AccessibilityManager manager,
65                AccessibilityStateChangeListener listener) {
66            return false;
67        }
68
69        @Override
70        public boolean removeAccessibilityStateChangeListener(AccessibilityManager manager,
71                AccessibilityStateChangeListener listener) {
72            return false;
73        }
74
75        @Override
76        public List<AccessibilityServiceInfo> getEnabledAccessibilityServiceList(
77                AccessibilityManager manager, int feedbackTypeFlags) {
78            return Collections.emptyList();
79        }
80
81        @Override
82        public List<AccessibilityServiceInfo> getInstalledAccessibilityServiceList(
83                AccessibilityManager manager) {
84            return Collections.emptyList();
85        }
86
87        @Override
88        public boolean isTouchExplorationEnabled(AccessibilityManager manager) {
89            return false;
90        }
91
92        @Override
93        public TouchExplorationStateChangeListenerWrapper newTouchExplorationStateChangeListener(
94                TouchExplorationStateChangeListener listener) {
95            return null;
96        }
97
98        @Override
99        public boolean addTouchExplorationStateChangeListener(AccessibilityManager manager,
100                TouchExplorationStateChangeListener listener) {
101            return false;
102        }
103
104        @Override
105        public boolean removeTouchExplorationStateChangeListener(AccessibilityManager manager,
106                TouchExplorationStateChangeListener listener) {
107            return false;
108        }
109    }
110
111    static class AccessibilityManagerIcsImpl extends AccessibilityManagerStubImpl {
112        @Override
113        public AccessibilityStateChangeListenerWrapper newAccessibilityStateChangeListener(
114                final AccessibilityStateChangeListener listener) {
115            return new AccessibilityStateChangeListenerWrapper(listener,
116                    new AccessibilityStateChangeListenerBridge() {
117                        @Override
118                        public void onAccessibilityStateChanged(boolean enabled) {
119                            listener.onAccessibilityStateChanged(enabled);
120                        }
121                    });
122        }
123
124        @Override
125        public boolean addAccessibilityStateChangeListener(AccessibilityManager manager,
126                AccessibilityStateChangeListener listener) {
127            return AccessibilityManagerCompatIcs.addAccessibilityStateChangeListener(manager,
128                    newAccessibilityStateChangeListener(listener));
129        }
130
131        @Override
132        public boolean removeAccessibilityStateChangeListener(AccessibilityManager manager,
133                AccessibilityStateChangeListener listener) {
134            return AccessibilityManagerCompatIcs.removeAccessibilityStateChangeListener(manager,
135                    newAccessibilityStateChangeListener(listener));
136        }
137
138        @Override
139        public List<AccessibilityServiceInfo> getEnabledAccessibilityServiceList(
140                AccessibilityManager manager, int feedbackTypeFlags) {
141            return AccessibilityManagerCompatIcs.getEnabledAccessibilityServiceList(manager,
142                    feedbackTypeFlags);
143        }
144
145        @Override
146        public List<AccessibilityServiceInfo> getInstalledAccessibilityServiceList(
147                AccessibilityManager manager) {
148            return AccessibilityManagerCompatIcs.getInstalledAccessibilityServiceList(manager);
149        }
150
151        @Override
152        public boolean isTouchExplorationEnabled(AccessibilityManager manager) {
153            return AccessibilityManagerCompatIcs.isTouchExplorationEnabled(manager);
154        }
155    }
156
157    static class AccessibilityManagerKitKatImpl extends AccessibilityManagerIcsImpl {
158        @Override
159        public TouchExplorationStateChangeListenerWrapper newTouchExplorationStateChangeListener(
160                final TouchExplorationStateChangeListener listener) {
161            return new TouchExplorationStateChangeListenerWrapper(listener,
162                    new TouchExplorationStateChangeListenerBridge() {
163                        @Override
164                        public void onTouchExplorationStateChanged(boolean enabled) {
165                            listener.onTouchExplorationStateChanged(enabled);
166                        }
167                    });
168        }
169
170        @Override
171        public boolean addTouchExplorationStateChangeListener(AccessibilityManager manager,
172                TouchExplorationStateChangeListener listener) {
173            return AccessibilityManagerCompatKitKat.addTouchExplorationStateChangeListener(
174                    manager, newTouchExplorationStateChangeListener(listener));
175        }
176
177        @Override
178        public boolean removeTouchExplorationStateChangeListener(AccessibilityManager manager,
179                TouchExplorationStateChangeListener listener) {
180            return AccessibilityManagerCompatKitKat.removeTouchExplorationStateChangeListener(
181                    manager, newTouchExplorationStateChangeListener(listener));
182        }
183    }
184
185    static {
186        if (Build.VERSION.SDK_INT >= 19) { // KitKat
187            IMPL = new AccessibilityManagerKitKatImpl();
188        } else if (Build.VERSION.SDK_INT >= 14) { // ICS
189            IMPL = new AccessibilityManagerIcsImpl();
190        } else {
191            IMPL = new AccessibilityManagerStubImpl();
192        }
193    }
194
195    private static final AccessibilityManagerVersionImpl IMPL;
196
197    /**
198     * Registers an {@link AccessibilityManager.AccessibilityStateChangeListener} for changes in
199     * the global accessibility state of the system.
200     *
201     * @param manager The accessibility manager.
202     * @param listener The listener.
203     * @return True if successfully registered.
204     */
205    public static boolean addAccessibilityStateChangeListener(AccessibilityManager manager,
206            AccessibilityStateChangeListener listener) {
207        return IMPL.addAccessibilityStateChangeListener(manager, listener);
208    }
209
210    /**
211     * Unregisters an {@link AccessibilityManager.AccessibilityStateChangeListener}.
212     *
213     * @param manager The accessibility manager.
214     * @param listener The listener.
215     * @return True if successfully unregistered.
216     */
217    public static boolean removeAccessibilityStateChangeListener(AccessibilityManager manager,
218            AccessibilityStateChangeListener listener) {
219        return IMPL.removeAccessibilityStateChangeListener(manager, listener);
220    }
221
222    /**
223     * Returns the {@link AccessibilityServiceInfo}s of the installed accessibility services.
224     *
225     * @param manager The accessibility manager.
226     * @return An unmodifiable list with {@link AccessibilityServiceInfo}s.
227     */
228    public static List<AccessibilityServiceInfo> getInstalledAccessibilityServiceList(
229            AccessibilityManager manager) {
230        return IMPL.getInstalledAccessibilityServiceList(manager);
231    }
232
233    /**
234     * Returns the {@link AccessibilityServiceInfo}s of the enabled accessibility services
235     * for a given feedback type.
236     *
237     * @param manager The accessibility manager.
238     * @param feedbackTypeFlags The feedback type flags.
239     * @return An unmodifiable list with {@link AccessibilityServiceInfo}s.
240     *
241     * @see AccessibilityServiceInfo#FEEDBACK_AUDIBLE
242     * @see AccessibilityServiceInfo#FEEDBACK_GENERIC
243     * @see AccessibilityServiceInfo#FEEDBACK_HAPTIC
244     * @see AccessibilityServiceInfo#FEEDBACK_SPOKEN
245     * @see AccessibilityServiceInfo#FEEDBACK_VISUAL
246     */
247    public static List<AccessibilityServiceInfo> getEnabledAccessibilityServiceList(
248            AccessibilityManager manager, int feedbackTypeFlags) {
249        return IMPL.getEnabledAccessibilityServiceList(manager, feedbackTypeFlags);
250    }
251
252    /**
253     * Returns if the touch exploration in the system is enabled.
254     *
255     * @param manager The accessibility manager.
256     * @return True if touch exploration is enabled, false otherwise.
257     */
258    public static boolean isTouchExplorationEnabled(AccessibilityManager manager) {
259        return IMPL.isTouchExplorationEnabled(manager);
260    }
261
262    /**
263     * Registers a {@link TouchExplorationStateChangeListener} for changes in
264     * the global touch exploration state of the system.
265     *
266     * @param listener The listener.
267     * @return True if successfully registered.
268     */
269    public static boolean addTouchExplorationStateChangeListener(AccessibilityManager manager,
270            TouchExplorationStateChangeListener listener) {
271        return IMPL.addTouchExplorationStateChangeListener(manager, listener);
272    }
273
274    /**
275     * Unregisters a {@link TouchExplorationStateChangeListener}.
276     *
277     * @param listener The listener.
278     * @return True if successfully unregistered.
279     */
280    public static boolean removeTouchExplorationStateChangeListener(AccessibilityManager manager,
281            TouchExplorationStateChangeListener listener) {
282        return IMPL.removeTouchExplorationStateChangeListener(manager, listener);
283    }
284
285    /**
286     * Listener for the accessibility state.
287     * @deprecated Use {@link AccessibilityStateChangeListener} instead.
288     */
289    @Deprecated
290    public static abstract class AccessibilityStateChangeListenerCompat
291            implements AccessibilityStateChangeListener {
292    }
293
294    /**
295     * Listener for the accessibility state.
296     */
297    public interface AccessibilityStateChangeListener {
298        /**
299         * Called back on change in the accessibility state.
300         *
301         * @param enabled Whether accessibility is enabled.
302         */
303        void onAccessibilityStateChanged(boolean enabled);
304    }
305
306    /**
307     * Listener for the system touch exploration state. To listen for changes to
308     * the touch exploration state on the device, implement this interface and
309     * register it with the system by calling
310     * {@link #addTouchExplorationStateChangeListener}.
311     */
312    public interface TouchExplorationStateChangeListener {
313        /**
314         * Called when the touch exploration enabled state changes.
315         *
316         * @param enabled Whether touch exploration is enabled.
317         */
318        void onTouchExplorationStateChanged(boolean enabled);
319    }
320
321    private AccessibilityManagerCompat() {}
322}
323