• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
17 package android.support.v4.view.accessibility;
18 
19 import android.accessibilityservice.AccessibilityServiceInfo;
20 import android.os.Build;
21 import android.support.v4.view.accessibility.AccessibilityManagerCompatIcs.AccessibilityStateChangeListenerBridge;
22 import android.view.accessibility.AccessibilityManager;
23 
24 import java.util.Collections;
25 import 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  */
31 public class AccessibilityManagerCompat {
32 
33     interface AccessibilityManagerVersionImpl {
newAccessiblityStateChangeListener( AccessibilityStateChangeListenerCompat listener)34         public Object newAccessiblityStateChangeListener(
35                 AccessibilityStateChangeListenerCompat listener);
addAccessibilityStateChangeListener(AccessibilityManager manager, AccessibilityStateChangeListenerCompat listener)36         public boolean addAccessibilityStateChangeListener(AccessibilityManager manager,
37                 AccessibilityStateChangeListenerCompat listener);
removeAccessibilityStateChangeListener(AccessibilityManager manager, AccessibilityStateChangeListenerCompat listener)38         public boolean removeAccessibilityStateChangeListener(AccessibilityManager manager,
39                 AccessibilityStateChangeListenerCompat listener);
getEnabledAccessibilityServiceList( AccessibilityManager manager,int feedbackTypeFlags)40         public List<AccessibilityServiceInfo> getEnabledAccessibilityServiceList(
41                 AccessibilityManager manager,int feedbackTypeFlags);
getInstalledAccessibilityServiceList( AccessibilityManager manager)42         public List<AccessibilityServiceInfo> getInstalledAccessibilityServiceList(
43                 AccessibilityManager manager);
isTouchExplorationEnabled(AccessibilityManager manager)44         public boolean isTouchExplorationEnabled(AccessibilityManager manager);
45     }
46 
47     static class AccessibilityManagerStubImpl implements AccessibilityManagerVersionImpl {
newAccessiblityStateChangeListener( AccessibilityStateChangeListenerCompat listener)48         public Object newAccessiblityStateChangeListener(
49                 AccessibilityStateChangeListenerCompat listener) {
50             return null;
51         }
52 
addAccessibilityStateChangeListener(AccessibilityManager manager, AccessibilityStateChangeListenerCompat listener)53         public boolean addAccessibilityStateChangeListener(AccessibilityManager manager,
54                 AccessibilityStateChangeListenerCompat listener) {
55             return false;
56         }
57 
removeAccessibilityStateChangeListener(AccessibilityManager manager, AccessibilityStateChangeListenerCompat listener)58         public boolean removeAccessibilityStateChangeListener(AccessibilityManager manager,
59                 AccessibilityStateChangeListenerCompat listener) {
60             return false;
61         }
62 
getEnabledAccessibilityServiceList( AccessibilityManager manager, int feedbackTypeFlags)63         public List<AccessibilityServiceInfo> getEnabledAccessibilityServiceList(
64                 AccessibilityManager manager, int feedbackTypeFlags) {
65             return Collections.emptyList();
66         }
67 
getInstalledAccessibilityServiceList( AccessibilityManager manager)68         public List<AccessibilityServiceInfo> getInstalledAccessibilityServiceList(
69                 AccessibilityManager manager) {
70             return Collections.emptyList();
71         }
72 
isTouchExplorationEnabled(AccessibilityManager manager)73         public boolean isTouchExplorationEnabled(AccessibilityManager manager) {
74             return false;
75         }
76     }
77 
78     static class AccessibilityManagerIcsImpl extends AccessibilityManagerStubImpl {
79 
80         @Override
newAccessiblityStateChangeListener( final AccessibilityStateChangeListenerCompat listener)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
addAccessibilityStateChangeListener(AccessibilityManager manager, AccessibilityStateChangeListenerCompat listener)92         public boolean addAccessibilityStateChangeListener(AccessibilityManager manager,
93                 AccessibilityStateChangeListenerCompat listener) {
94             return AccessibilityManagerCompatIcs.addAccessibilityStateChangeListener(manager,
95                     listener.mListener);
96         }
97 
98         @Override
removeAccessibilityStateChangeListener(AccessibilityManager manager, final AccessibilityStateChangeListenerCompat listener)99         public boolean removeAccessibilityStateChangeListener(AccessibilityManager manager,
100                 final AccessibilityStateChangeListenerCompat listener) {
101             return AccessibilityManagerCompatIcs.removeAccessibilityStateChangeListener(manager,
102                     listener.mListener);
103         }
104 
105         @Override
getEnabledAccessibilityServiceList( AccessibilityManager manager, int feedbackTypeFlags)106         public List<AccessibilityServiceInfo> getEnabledAccessibilityServiceList(
107                 AccessibilityManager manager, int feedbackTypeFlags) {
108             return AccessibilityManagerCompatIcs.getEnabledAccessibilityServiceList(manager,
109                     feedbackTypeFlags);
110         }
111 
112         @Override
getInstalledAccessibilityServiceList( AccessibilityManager manager)113         public List<AccessibilityServiceInfo> getInstalledAccessibilityServiceList(
114                 AccessibilityManager manager) {
115             return AccessibilityManagerCompatIcs.getInstalledAccessibilityServiceList(manager);
116         }
117 
118         @Override
isTouchExplorationEnabled(AccessibilityManager manager)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      * Returns if the touch exploration in the system is enabled.
191      *
192      * @param manager The accessibility manager.
193      * @return True if touch exploration is enabled, false otherwise.
194      */
195     public static boolean isTouchExplorationEnabled(AccessibilityManager manager) {
196         return IMPL.isTouchExplorationEnabled(manager);
197     }
198 
199     /**
200      * Listener for the accessibility state.
201      */
202     public static abstract class AccessibilityStateChangeListenerCompat {
203         final Object mListener;
204 
205         public AccessibilityStateChangeListenerCompat() {
206             mListener = IMPL.newAccessiblityStateChangeListener(this);
207         }
208 
209         /**
210          * Called back on change in the accessibility state.
211          *
212          * @param enabled Whether accessibility is enabled.
213          */
214         public abstract void onAccessibilityStateChanged(boolean enabled);
215     }
216 }
217