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