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