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