/*
* 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.support.v4.view.accessibility.AccessibilityManagerCompatIcs.AccessibilityStateChangeListenerWrapper;
import android.support.v4.view.accessibility.AccessibilityManagerCompatKitKat.TouchExplorationStateChangeListenerBridge;
import android.support.v4.view.accessibility.AccessibilityManagerCompatKitKat.TouchExplorationStateChangeListenerWrapper;
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 {
AccessibilityStateChangeListenerWrapper newAccessibilityStateChangeListener(
AccessibilityStateChangeListener listener);
boolean addAccessibilityStateChangeListener(AccessibilityManager manager,
AccessibilityStateChangeListener listener);
boolean removeAccessibilityStateChangeListener(AccessibilityManager manager,
AccessibilityStateChangeListener listener);
List<AccessibilityServiceInfo> getEnabledAccessibilityServiceList(
AccessibilityManager manager,int feedbackTypeFlags);
List<AccessibilityServiceInfo> getInstalledAccessibilityServiceList(
AccessibilityManager manager);
boolean isTouchExplorationEnabled(AccessibilityManager manager);
TouchExplorationStateChangeListenerWrapper newTouchExplorationStateChangeListener(
TouchExplorationStateChangeListener listener);
boolean addTouchExplorationStateChangeListener(AccessibilityManager manager,
TouchExplorationStateChangeListener listener);
boolean removeTouchExplorationStateChangeListener(AccessibilityManager manager,
TouchExplorationStateChangeListener listener);
}
static class AccessibilityManagerStubImpl implements AccessibilityManagerVersionImpl {
@Override
public AccessibilityStateChangeListenerWrapper newAccessibilityStateChangeListener(
AccessibilityStateChangeListener listener) {
return null;
}
@Override
public boolean addAccessibilityStateChangeListener(AccessibilityManager manager,
AccessibilityStateChangeListener listener) {
return false;
}
@Override
public boolean removeAccessibilityStateChangeListener(AccessibilityManager manager,
AccessibilityStateChangeListener 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;
}
@Override
public TouchExplorationStateChangeListenerWrapper newTouchExplorationStateChangeListener(
TouchExplorationStateChangeListener listener) {
return null;
}
@Override
public boolean addTouchExplorationStateChangeListener(AccessibilityManager manager,
TouchExplorationStateChangeListener listener) {
return false;
}
@Override
public boolean removeTouchExplorationStateChangeListener(AccessibilityManager manager,
TouchExplorationStateChangeListener listener) {
return false;
}
}
static class AccessibilityManagerIcsImpl extends AccessibilityManagerStubImpl {
@Override
public AccessibilityStateChangeListenerWrapper newAccessibilityStateChangeListener(
final AccessibilityStateChangeListener listener) {
return new AccessibilityStateChangeListenerWrapper(listener,
new AccessibilityStateChangeListenerBridge() {
@Override
public void onAccessibilityStateChanged(boolean enabled) {
listener.onAccessibilityStateChanged(enabled);
}
});
}
@Override
public boolean addAccessibilityStateChangeListener(AccessibilityManager manager,
AccessibilityStateChangeListener listener) {
return AccessibilityManagerCompatIcs.addAccessibilityStateChangeListener(manager,
newAccessibilityStateChangeListener(listener));
}
@Override
public boolean removeAccessibilityStateChangeListener(AccessibilityManager manager,
AccessibilityStateChangeListener listener) {
return AccessibilityManagerCompatIcs.removeAccessibilityStateChangeListener(manager,
newAccessibilityStateChangeListener(listener));
}
@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 class AccessibilityManagerKitKatImpl extends AccessibilityManagerIcsImpl {
@Override
public TouchExplorationStateChangeListenerWrapper newTouchExplorationStateChangeListener(
final TouchExplorationStateChangeListener listener) {
return new TouchExplorationStateChangeListenerWrapper(listener,
new TouchExplorationStateChangeListenerBridge() {
@Override
public void onTouchExplorationStateChanged(boolean enabled) {
listener.onTouchExplorationStateChanged(enabled);
}
});
}
@Override
public boolean addTouchExplorationStateChangeListener(AccessibilityManager manager,
TouchExplorationStateChangeListener listener) {
return AccessibilityManagerCompatKitKat.addTouchExplorationStateChangeListener(
manager, newTouchExplorationStateChangeListener(listener));
}
@Override
public boolean removeTouchExplorationStateChangeListener(AccessibilityManager manager,
TouchExplorationStateChangeListener listener) {
return AccessibilityManagerCompatKitKat.removeTouchExplorationStateChangeListener(
manager, newTouchExplorationStateChangeListener(listener));
}
}
static {
if (Build.VERSION.SDK_INT >= 19) { // KitKat
IMPL = new AccessibilityManagerKitKatImpl();
} else 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,
AccessibilityStateChangeListener 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,
AccessibilityStateChangeListener 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);
}
/**
* Registers a {@link TouchExplorationStateChangeListener} for changes in
* the global touch exploration state of the system.
*
* @param listener The listener.
* @return True if successfully registered.
*/
public static boolean addTouchExplorationStateChangeListener(AccessibilityManager manager,
TouchExplorationStateChangeListener listener) {
return IMPL.addTouchExplorationStateChangeListener(manager, listener);
}
/**
* Unregisters a {@link TouchExplorationStateChangeListener}.
*
* @param listener The listener.
* @return True if successfully unregistered.
*/
public static boolean removeTouchExplorationStateChangeListener(AccessibilityManager manager,
TouchExplorationStateChangeListener listener) {
return IMPL.removeTouchExplorationStateChangeListener(manager, listener);
}
/**
* Listener for the accessibility state.
* @deprecated Use {@link AccessibilityStateChangeListener} instead.
*/
@Deprecated
public static abstract class AccessibilityStateChangeListenerCompat
implements AccessibilityStateChangeListener {
}
/**
* Listener for the accessibility state.
*/
public interface AccessibilityStateChangeListener {
/**
* Called back on change in the accessibility state.
*
* @param enabled Whether accessibility is enabled.
*/
void onAccessibilityStateChanged(boolean enabled);
}
/**
* Listener for the system touch exploration state. To listen for changes to
* the touch exploration state on the device, implement this interface and
* register it with the system by calling
* {@link #addTouchExplorationStateChangeListener}.
*/
public interface TouchExplorationStateChangeListener {
/**
* Called when the touch exploration enabled state changes.
*
* @param enabled Whether touch exploration is enabled.
*/
void onTouchExplorationStateChanged(boolean enabled);
}
private AccessibilityManagerCompat() {}
}