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