blob: 734c246cfcec04a8447337d4c20a3b56d7dee811 [file] [log] [blame]
/*
* Copyright (C) 2011 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.support.v4.view.accessibility;
import android.accessibilityservice.AccessibilityServiceInfo;
import android.os.Build;
import android.support.v4.view.accessibility.AccessibilityManagerCompatIcs.AccessibilityStateChangeListenerBridge;
import android.view.accessibility.AccessibilityManager;
import java.util.Collections;
import java.util.List;
/**
* Helper for accessing features in {@link AccessibilityManager}
* introduced after API level 4 in a backwards compatible fashion.
*/
public final class AccessibilityManagerCompat {
interface AccessibilityManagerVersionImpl {
public Object newAccessiblityStateChangeListener(
AccessibilityStateChangeListenerCompat listener);
public boolean addAccessibilityStateChangeListener(AccessibilityManager manager,
AccessibilityStateChangeListenerCompat listener);
public boolean removeAccessibilityStateChangeListener(AccessibilityManager manager,
AccessibilityStateChangeListenerCompat listener);
public List<AccessibilityServiceInfo> getEnabledAccessibilityServiceList(
AccessibilityManager manager,int feedbackTypeFlags);
public List<AccessibilityServiceInfo> getInstalledAccessibilityServiceList(
AccessibilityManager manager);
public boolean isTouchExplorationEnabled(AccessibilityManager manager);
}
static class AccessibilityManagerStubImpl implements AccessibilityManagerVersionImpl {
@Override
public Object newAccessiblityStateChangeListener(
AccessibilityStateChangeListenerCompat listener) {
return null;
}
@Override
public boolean addAccessibilityStateChangeListener(AccessibilityManager manager,
AccessibilityStateChangeListenerCompat listener) {
return false;
}
@Override
public boolean removeAccessibilityStateChangeListener(AccessibilityManager manager,
AccessibilityStateChangeListenerCompat listener) {
return false;
}
@Override
public List<AccessibilityServiceInfo> getEnabledAccessibilityServiceList(
AccessibilityManager manager, int feedbackTypeFlags) {
return Collections.emptyList();
}
@Override
public List<AccessibilityServiceInfo> getInstalledAccessibilityServiceList(
AccessibilityManager manager) {
return Collections.emptyList();
}
@Override
public boolean isTouchExplorationEnabled(AccessibilityManager manager) {
return false;
}
}
static class AccessibilityManagerIcsImpl extends AccessibilityManagerStubImpl {
@Override
public Object newAccessiblityStateChangeListener(
final AccessibilityStateChangeListenerCompat listener) {
return AccessibilityManagerCompatIcs.newAccessibilityStateChangeListener(
new AccessibilityStateChangeListenerBridge() {
@Override
public void onAccessibilityStateChanged(boolean enabled) {
listener.onAccessibilityStateChanged(enabled);
}
});
}
@Override
public boolean addAccessibilityStateChangeListener(AccessibilityManager manager,
AccessibilityStateChangeListenerCompat listener) {
return AccessibilityManagerCompatIcs.addAccessibilityStateChangeListener(manager,
listener.mListener);
}
@Override
public boolean removeAccessibilityStateChangeListener(AccessibilityManager manager,
final AccessibilityStateChangeListenerCompat listener) {
return AccessibilityManagerCompatIcs.removeAccessibilityStateChangeListener(manager,
listener.mListener);
}
@Override
public List<AccessibilityServiceInfo> getEnabledAccessibilityServiceList(
AccessibilityManager manager, int feedbackTypeFlags) {
return AccessibilityManagerCompatIcs.getEnabledAccessibilityServiceList(manager,
feedbackTypeFlags);
}
@Override
public List<AccessibilityServiceInfo> getInstalledAccessibilityServiceList(
AccessibilityManager manager) {
return AccessibilityManagerCompatIcs.getInstalledAccessibilityServiceList(manager);
}
@Override
public boolean isTouchExplorationEnabled(AccessibilityManager manager) {
return AccessibilityManagerCompatIcs.isTouchExplorationEnabled(manager);
}
}
static {
if (Build.VERSION.SDK_INT >= 14) { // ICS
IMPL = new AccessibilityManagerIcsImpl();
} else {
IMPL = new AccessibilityManagerStubImpl();
}
}
private static final AccessibilityManagerVersionImpl IMPL;
/**
* Registers an {@link AccessibilityManager.AccessibilityStateChangeListener} for changes in
* the global accessibility state of the system.
*
* @param manager The accessibility manager.
* @param listener The listener.
* @return True if successfully registered.
*/
public static boolean addAccessibilityStateChangeListener(AccessibilityManager manager,
AccessibilityStateChangeListenerCompat listener) {
return IMPL.addAccessibilityStateChangeListener(manager, listener);
}
/**
* Unregisters an {@link AccessibilityManager.AccessibilityStateChangeListener}.
*
* @param manager The accessibility manager.
* @param listener The listener.
* @return True if successfully unregistered.
*/
public static boolean removeAccessibilityStateChangeListener(AccessibilityManager manager,
AccessibilityStateChangeListenerCompat listener) {
return IMPL.removeAccessibilityStateChangeListener(manager, listener);
}
/**
* Returns the {@link AccessibilityServiceInfo}s of the installed accessibility services.
*
* @param manager The accessibility manager.
* @return An unmodifiable list with {@link AccessibilityServiceInfo}s.
*/
public static List<AccessibilityServiceInfo> getInstalledAccessibilityServiceList(
AccessibilityManager manager) {
return IMPL.getInstalledAccessibilityServiceList(manager);
}
/**
* Returns the {@link AccessibilityServiceInfo}s of the enabled accessibility services
* for a given feedback type.
*
* @param manager The accessibility manager.
* @param feedbackTypeFlags The feedback type flags.
* @return An unmodifiable list with {@link AccessibilityServiceInfo}s.
*
* @see AccessibilityServiceInfo#FEEDBACK_AUDIBLE
* @see AccessibilityServiceInfo#FEEDBACK_GENERIC
* @see AccessibilityServiceInfo#FEEDBACK_HAPTIC
* @see AccessibilityServiceInfo#FEEDBACK_SPOKEN
* @see AccessibilityServiceInfo#FEEDBACK_VISUAL
*/
public static List<AccessibilityServiceInfo> getEnabledAccessibilityServiceList(
AccessibilityManager manager, int feedbackTypeFlags) {
return IMPL.getEnabledAccessibilityServiceList(manager, feedbackTypeFlags);
}
/**
* Returns if the touch exploration in the system is enabled.
*
* @param manager The accessibility manager.
* @return True if touch exploration is enabled, false otherwise.
*/
public static boolean isTouchExplorationEnabled(AccessibilityManager manager) {
return IMPL.isTouchExplorationEnabled(manager);
}
/**
* Listener for the accessibility state.
*/
public static abstract class AccessibilityStateChangeListenerCompat {
final Object mListener;
public AccessibilityStateChangeListenerCompat() {
mListener = IMPL.newAccessiblityStateChangeListener(this);
}
/**
* Called back on change in the accessibility state.
*
* @param enabled Whether accessibility is enabled.
*/
public abstract void onAccessibilityStateChanged(boolean enabled);
}
private AccessibilityManagerCompat() {}
}