AccessibilityManagerCompat.java revision f9c2277244722eca88c784b9cfdcc78df7f94781
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.view.accessibility.AccessibilityManager;
22import android.support.v4.view.accessibility.AccessibilityManagerCompatIcs.AccessibilityStateChangeListenerBridge;
23
24import java.util.Collections;
25import java.util.List;
26
27/**
28 * Helper for accessing newer features in AccessibilityManager.
29 */
30public class AccessibilityManagerCompat {
31
32    interface AccessibilityManagerVersionImpl {
33        public Object newAccessiblityStateChangeListener(
34                AccessibilityStateChangeListenerCompat listener);
35        public boolean addAccessibilityStateChangeListener(AccessibilityManager manager,
36                AccessibilityStateChangeListenerCompat listener);
37        public boolean removeAccessibilityStateChangeListener(AccessibilityManager manager,
38                AccessibilityStateChangeListenerCompat listener);
39        public List<AccessibilityServiceInfo> getEnabledAccessibilityServiceList(
40                AccessibilityManager manager,int feedbackTypeFlags);
41        public List<AccessibilityServiceInfo> getInstalledAccessibilityServiceList(
42                AccessibilityManager manager);
43        public boolean isTouchExplorationEnabled(AccessibilityManager manager);
44    }
45
46    static class AccessibilityManagerStubImpl implements AccessibilityManagerVersionImpl {
47        public Object newAccessiblityStateChangeListener(
48                AccessibilityStateChangeListenerCompat listener) {
49            return null;
50        }
51
52        public boolean addAccessibilityStateChangeListener(AccessibilityManager manager,
53                AccessibilityStateChangeListenerCompat listener) {
54            return false;
55        }
56
57        public boolean removeAccessibilityStateChangeListener(AccessibilityManager manager,
58                AccessibilityStateChangeListenerCompat listener) {
59            return false;
60        }
61
62        public List<AccessibilityServiceInfo> getEnabledAccessibilityServiceList(
63                AccessibilityManager manager, int feedbackTypeFlags) {
64            return Collections.emptyList();
65        }
66
67        public List<AccessibilityServiceInfo> getInstalledAccessibilityServiceList(
68                AccessibilityManager manager) {
69            return Collections.emptyList();
70        }
71
72        public boolean isTouchExplorationEnabled(AccessibilityManager manager) {
73            return false;
74        }
75    }
76
77    static class AccessibilityManagerIcsImpl extends AccessibilityManagerStubImpl {
78
79        @Override
80        public Object newAccessiblityStateChangeListener(
81                final AccessibilityStateChangeListenerCompat listener) {
82            return AccessibilityManagerCompatIcs.newAccessibilityStateChangeListener(
83                new AccessibilityStateChangeListenerBridge() {
84                    public void onAccessibilityStateChanged(boolean enabled) {
85                        listener.onAccessibilityStateChanged(enabled);
86                    }
87                });
88        }
89
90        @Override
91        public boolean addAccessibilityStateChangeListener(AccessibilityManager manager,
92                AccessibilityStateChangeListenerCompat listener) {
93            return AccessibilityManagerCompatIcs.addAccessibilityStateChangeListener(manager,
94                    listener.mListener);
95        }
96
97        @Override
98        public boolean removeAccessibilityStateChangeListener(AccessibilityManager manager,
99                final AccessibilityStateChangeListenerCompat listener) {
100            return AccessibilityManagerCompatIcs.removeAccessibilityStateChangeListener(manager,
101                    listener.mListener);
102        }
103
104        @Override
105        public List<AccessibilityServiceInfo> getEnabledAccessibilityServiceList(
106                AccessibilityManager manager, int feedbackTypeFlags) {
107            return AccessibilityManagerCompatIcs.getEnabledAccessibilityServiceList(manager,
108                    feedbackTypeFlags);
109        }
110
111        @Override
112        public List<AccessibilityServiceInfo> getInstalledAccessibilityServiceList(
113                AccessibilityManager manager) {
114            return AccessibilityManagerCompatIcs.getInstalledAccessibilityServiceList(manager);
115        }
116
117        @Override
118        public boolean isTouchExplorationEnabled(AccessibilityManager manager) {
119            return AccessibilityManagerCompatIcs.isTouchExplorationEnabled(manager);
120        }
121    }
122
123    static {
124        if (Build.VERSION.SDK_INT >= 14) { // ICS
125            IMPL = new AccessibilityManagerIcsImpl();
126        } else {
127            IMPL = new AccessibilityManagerStubImpl();
128        }
129    }
130
131    private static final AccessibilityManagerVersionImpl IMPL;
132
133    /**
134     * Registers an {@link AccessibilityManager.AccessibilityStateChangeListener} for changes in
135     * the global accessibility state of the system.
136     *
137     * @param manager The accessibility manager.
138     * @param listener The listener.
139     * @return True if successfully registered.
140     */
141    public static boolean addAccessibilityStateChangeListener(AccessibilityManager manager,
142            AccessibilityStateChangeListenerCompat listener) {
143        return IMPL.addAccessibilityStateChangeListener(manager, listener);
144    }
145
146    /**
147     * Unregisters an {@link AccessibilityManager.AccessibilityStateChangeListener}.
148     *
149     * @param manager The accessibility manager.
150     * @param listener The listener.
151     * @return True if successfully unregistered.
152     */
153    public static boolean removeAccessibilityStateChangeListener(AccessibilityManager manager,
154            AccessibilityStateChangeListenerCompat listener) {
155        return IMPL.removeAccessibilityStateChangeListener(manager, listener);
156    }
157
158    /**
159     * Returns the {@link AccessibilityServiceInfo}s of the installed accessibility services.
160     *
161     * @param manager The accessibility manager.
162     * @return An unmodifiable list with {@link AccessibilityServiceInfo}s.
163     */
164    public static List<AccessibilityServiceInfo> getInstalledAccessibilityServiceList(
165            AccessibilityManager manager) {
166        return IMPL.getInstalledAccessibilityServiceList(manager);
167    }
168
169    /**
170     * Returns the {@link AccessibilityServiceInfo}s of the enabled accessibility services
171     * for a given feedback type.
172     *
173     * @param manager The accessibility manager.
174     * @param feedbackTypeFlags The feedback type flags.
175     * @return An unmodifiable list with {@link AccessibilityServiceInfo}s.
176     *
177     * @see AccessibilityServiceInfo#FEEDBACK_AUDIBLE
178     * @see AccessibilityServiceInfo#FEEDBACK_GENERIC
179     * @see AccessibilityServiceInfo#FEEDBACK_HAPTIC
180     * @see AccessibilityServiceInfo#FEEDBACK_SPOKEN
181     * @see AccessibilityServiceInfo#FEEDBACK_VISUAL
182     */
183    public static List<AccessibilityServiceInfo> getEnabledAccessibilityServiceList(
184            AccessibilityManager manager, int feedbackTypeFlags) {
185        return IMPL.getEnabledAccessibilityServiceList(manager, feedbackTypeFlags);
186    }
187
188    /**
189     * Listener for the accessibility state.
190     */
191    public static abstract class AccessibilityStateChangeListenerCompat {
192        final Object mListener;
193
194        public AccessibilityStateChangeListenerCompat() {
195            mListener = IMPL.newAccessiblityStateChangeListener(this);
196        }
197
198        /**
199         * Called back on change in the accessibility state.
200         *
201         * @param enabled Whether accessibility is enabled.
202         */
203        public abstract void onAccessibilityStateChanged(boolean enabled);
204    }
205}
206