aboutsummaryrefslogtreecommitdiffstats
path: root/src/android/support/v4/accessibilityservice/AccessibilityServiceInfoCompat.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/android/support/v4/accessibilityservice/AccessibilityServiceInfoCompat.java')
-rw-r--r--src/android/support/v4/accessibilityservice/AccessibilityServiceInfoCompat.java452
1 files changed, 452 insertions, 0 deletions
diff --git a/src/android/support/v4/accessibilityservice/AccessibilityServiceInfoCompat.java b/src/android/support/v4/accessibilityservice/AccessibilityServiceInfoCompat.java
new file mode 100644
index 0000000..a67e162
--- /dev/null
+++ b/src/android/support/v4/accessibilityservice/AccessibilityServiceInfoCompat.java
@@ -0,0 +1,452 @@
+/*
+ * 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.accessibilityservice;
+
+import android.accessibilityservice.AccessibilityService;
+import android.accessibilityservice.AccessibilityServiceInfo;
+import android.content.pm.ResolveInfo;
+import android.os.Build;
+import android.view.View;
+
+/**
+ * Helper for accessing features in {@link android.accessibilityservice.AccessibilityService}
+ * introduced after API level 4 in a backwards compatible fashion.
+ */
+public class AccessibilityServiceInfoCompat {
+
+ static interface AccessibilityServiceInfoVersionImpl {
+ public String getId(AccessibilityServiceInfo info);
+ public ResolveInfo getResolveInfo(AccessibilityServiceInfo info);
+ public boolean getCanRetrieveWindowContent(AccessibilityServiceInfo info);
+ public String getDescription(AccessibilityServiceInfo info);
+ public String getSettingsActivityName(AccessibilityServiceInfo info);
+ public int getCapabilities(AccessibilityServiceInfo info);
+ }
+
+ static class AccessibilityServiceInfoStubImpl implements AccessibilityServiceInfoVersionImpl {
+
+ @Override
+ public boolean getCanRetrieveWindowContent(AccessibilityServiceInfo info) {
+ return false;
+ }
+
+ @Override
+ public String getDescription(AccessibilityServiceInfo info) {
+ return null;
+ }
+
+ @Override
+ public String getId(AccessibilityServiceInfo info) {
+ return null;
+ }
+
+ @Override
+ public ResolveInfo getResolveInfo(AccessibilityServiceInfo info) {
+ return null;
+ }
+
+ @Override
+ public String getSettingsActivityName(AccessibilityServiceInfo info) {
+ return null;
+ }
+
+ @Override
+ public int getCapabilities(AccessibilityServiceInfo info) {
+ return 0;
+ }
+ }
+
+ static class AccessibilityServiceInfoIcsImpl extends AccessibilityServiceInfoStubImpl {
+
+ @Override
+ public boolean getCanRetrieveWindowContent(AccessibilityServiceInfo info) {
+ return AccessibilityServiceInfoCompatIcs.getCanRetrieveWindowContent(info);
+ }
+
+ @Override
+ public String getDescription(AccessibilityServiceInfo info) {
+ return AccessibilityServiceInfoCompatIcs.getDescription(info);
+ }
+
+ @Override
+ public String getId(AccessibilityServiceInfo info) {
+ return AccessibilityServiceInfoCompatIcs.getId(info);
+ }
+
+ @Override
+ public ResolveInfo getResolveInfo(AccessibilityServiceInfo info) {
+ return AccessibilityServiceInfoCompatIcs.getResolveInfo(info);
+ }
+
+ @Override
+ public String getSettingsActivityName(AccessibilityServiceInfo info) {
+ return AccessibilityServiceInfoCompatIcs.getSettingsActivityName(info);
+ }
+
+ @Override
+ public int getCapabilities(AccessibilityServiceInfo info) {
+ if (getCanRetrieveWindowContent(info)) {
+ return CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT;
+ }
+ return 0;
+ }
+ }
+
+ static {
+ if (Build.VERSION.SDK_INT >= 14) { // ICS
+ IMPL = new AccessibilityServiceInfoIcsImpl();
+ } else {
+ IMPL = new AccessibilityServiceInfoStubImpl();
+ }
+ }
+
+ // Capabilities
+
+ private static final AccessibilityServiceInfoVersionImpl IMPL;
+
+ /**
+ * Capability: This accessibility service can retrieve the active window content.
+ */
+ public static final int CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT = 0x00000001;
+
+ /**
+ * Capability: This accessibility service can request touch exploration mode in which
+ * touched items are spoken aloud and the UI can be explored via gestures.
+ */
+ public static final int CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION = 0x00000002;
+
+ /**
+ * Capability: This accessibility service can request enhanced web accessibility
+ * enhancements. For example, installing scripts to make app content more accessible.
+ */
+ public static final int CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 0x00000004;
+
+ /**
+ * Capability: This accessibility service can filter the key event stream.
+ */
+ public static final int CAPABILITY_CAN_FILTER_KEY_EVENTS = 0x00000008;
+
+ // Feedback types
+
+ /**
+ * Denotes braille feedback.
+ */
+ public static final int FEEDBACK_BRAILLE = 0x0000020;
+
+ /**
+ * Mask for all feedback types.
+ *
+ * @see AccessibilityServiceInfo#FEEDBACK_SPOKEN
+ * @see AccessibilityServiceInfo#FEEDBACK_HAPTIC
+ * @see AccessibilityServiceInfo#FEEDBACK_AUDIBLE
+ * @see AccessibilityServiceInfo#FEEDBACK_VISUAL
+ * @see AccessibilityServiceInfo#FEEDBACK_GENERIC
+ * @see FEEDBACK_BRAILLE
+ */
+ @SuppressWarnings("javadoc")
+ public static final int FEEDBACK_ALL_MASK = 0xFFFFFFFF;
+
+ // Flags
+
+ /**
+ * If an {@link AccessibilityService} is the default for a given type.
+ * Default service is invoked only if no package specific one exists. In case of
+ * more than one package specific service only the earlier registered is notified.
+ */
+ public static final int DEFAULT = 0x0000001;
+
+ /**
+ * If this flag is set the system will regard views that are not important
+ * for accessibility in addition to the ones that are important for accessibility.
+ * That is, views that are marked as not important for accessibility via
+ * {@link View#IMPORTANT_FOR_ACCESSIBILITY_NO} or
+ * {@link View#IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS} and views that are
+ * marked as potentially important for accessibility via
+ * {@link View#IMPORTANT_FOR_ACCESSIBILITY_AUTO} for which the system has determined
+ * that are not important for accessibility, are both reported while querying the
+ * window content and also the accessibility service will receive accessibility events
+ * from them.
+ * <p>
+ * <strong>Note:</strong> For accessibility services targeting API version
+ * {@link Build.VERSION_CODES#JELLY_BEAN} or higher this flag has to be explicitly
+ * set for the system to regard views that are not important for accessibility. For
+ * accessibility services targeting API version lower than
+ * {@link Build.VERSION_CODES#JELLY_BEAN} this flag is ignored and all views are
+ * regarded for accessibility purposes.
+ * </p>
+ * <p>
+ * Usually views not important for accessibility are layout managers that do not
+ * react to user actions, do not draw any content, and do not have any special
+ * semantics in the context of the screen content. For example, a three by three
+ * grid can be implemented as three horizontal linear layouts and one vertical,
+ * or three vertical linear layouts and one horizontal, or one grid layout, etc.
+ * In this context the actual layout mangers used to achieve the grid configuration
+ * are not important, rather it is important that there are nine evenly distributed
+ * elements.
+ * </p>
+ */
+ @SuppressWarnings("javadoc")
+ public static final int FLAG_INCLUDE_NOT_IMPORTANT_VIEWS = 0x0000002;
+
+ /**
+ * This flag requests that the system gets into touch exploration mode.
+ * In this mode a single finger moving on the screen behaves as a mouse
+ * pointer hovering over the user interface. The system will also detect
+ * certain gestures performed on the touch screen and notify this service.
+ * The system will enable touch exploration mode if there is at least one
+ * accessibility service that has this flag set. Hence, clearing this
+ * flag does not guarantee that the device will not be in touch exploration
+ * mode since there may be another enabled service that requested it.
+ * <p>
+ * For accessibility services targeting API version higher than
+ * {@link Build.VERSION_CODES#JELLY_BEAN_MR1} that want to set
+ * this flag have to declare this capability in their meta-data by setting
+ * the attribute canRequestTouchExplorationMode to true, otherwise this flag
+ * will be ignored. For how to declare the meta-data of a service refer to
+ * {@value AccessibilityService#SERVICE_META_DATA}.
+ * </p>
+ * <p>
+ * Services targeting API version equal to or lower than
+ * {@link Build.VERSION_CODES#JELLY_BEAN_MR1} will work normally, i.e.
+ * the first time they are run, if this flag is specified, a dialog is
+ * shown to the user to confirm enabling explore by touch.
+ * </p>
+ */
+ @SuppressWarnings("javadoc")
+ public static final int FLAG_REQUEST_TOUCH_EXPLORATION_MODE = 0x0000004;
+
+ /**
+ * This flag requests from the system to enable web accessibility enhancing
+ * extensions. Such extensions aim to provide improved accessibility support
+ * for content presented in a {@link android.webkit.WebView}. An example of such
+ * an extension is injecting JavaScript from a secure source. The system will enable
+ * enhanced web accessibility if there is at least one accessibility service
+ * that has this flag set. Hence, clearing this flag does not guarantee that the
+ * device will not have enhanced web accessibility enabled since there may be
+ * another enabled service that requested it.
+ * <p>
+ * Services that want to set this flag have to declare this capability
+ * in their meta-data by setting the attribute canRequestEnhancedWebAccessibility
+ * to true, otherwise this flag will be ignored. For how to declare the meta-data
+ * of a service refer to {@value AccessibilityService#SERVICE_META_DATA}.
+ * </p>
+ */
+ public static final int FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 0x00000008;
+
+ /**
+ * This flag requests that the AccessibilityNodeInfos obtained
+ * by an {@link AccessibilityService} contain the id of the source view.
+ * The source view id will be a fully qualified resource name of the
+ * form "package:id/name", for example "foo.bar:id/my_list", and it is
+ * useful for UI test automation. This flag is not set by default.
+ */
+ public static final int FLAG_REPORT_VIEW_IDS = 0x00000010;
+
+ /**
+ * This flag requests from the system to filter key events. If this flag
+ * is set the accessibility service will receive the key events before
+ * applications allowing it implement global shortcuts. Setting this flag
+ * does not guarantee that this service will filter key events since only
+ * one service can do so at any given time. This avoids user confusion due
+ * to behavior change in case different key filtering services are enabled.
+ * If there is already another key filtering service enabled, this one will
+ * not receive key events.
+ * <p>
+ * Services that want to set this flag have to declare this capability
+ * in their meta-data by setting the attribute canRequestFilterKeyEvents
+ * to true, otherwise this flag will be ignored. For how to declare the meta
+ * -data of a service refer to {@value AccessibilityService#SERVICE_META_DATA}.
+ * </p>
+ */
+ public static final int FLAG_REQUEST_FILTER_KEY_EVENTS = 0x00000020;
+
+ /*
+ * Hide constructor
+ */
+ private AccessibilityServiceInfoCompat() {
+
+ }
+
+ /**
+ * The accessibility service id.
+ * <p>
+ * <strong>Generated by the system.</strong>
+ * </p>
+ *
+ * @return The id.
+ */
+ public static String getId(AccessibilityServiceInfo info) {
+ return IMPL.getId(info);
+ }
+
+ /**
+ * The service {@link ResolveInfo}.
+ * <p>
+ * <strong>Generated by the system.</strong>
+ * </p>
+ *
+ * @return The info.
+ */
+ public static ResolveInfo getResolveInfo(AccessibilityServiceInfo info) {
+ return IMPL.getResolveInfo(info);
+ }
+
+ /**
+ * The settings activity name.
+ * <p>
+ * <strong>Statically set from {@link AccessibilityService#SERVICE_META_DATA
+ * meta-data}.</strong>
+ * </p>
+ *
+ * @return The settings activity name.
+ */
+ public static String getSettingsActivityName(AccessibilityServiceInfo info) {
+ return IMPL.getSettingsActivityName(info);
+ }
+
+ /**
+ * Whether this service can retrieve the current window's content.
+ * <p>
+ * <strong>Statically set from {@link AccessibilityService#SERVICE_META_DATA
+ * meta-data}.</strong>
+ * </p>
+ *
+ * @return True window content can be retrieved.
+ */
+ public static boolean getCanRetrieveWindowContent(AccessibilityServiceInfo info) {
+ return IMPL.getCanRetrieveWindowContent(info);
+ }
+
+ /**
+ * Description of the accessibility service.
+ * <p>
+ * <strong>Statically set from {@link AccessibilityService#SERVICE_META_DATA
+ * meta-data}.</strong>
+ * </p>
+ *
+ * @return The description.
+ */
+ public static String getDescription(AccessibilityServiceInfo info) {
+ return IMPL.getDescription(info);
+ }
+
+ /**
+ * Returns the string representation of a feedback type. For example,
+ * {@link AccessibilityServiceInfo#FEEDBACK_SPOKEN} is represented by the
+ * string FEEDBACK_SPOKEN.
+ *
+ * @param feedbackType The feedback type.
+ * @return The string representation.
+ */
+ public static String feedbackTypeToString(int feedbackType) {
+ int fbt = feedbackType;
+ StringBuilder builder = new StringBuilder();
+ builder.append("[");
+ while (fbt > 0) {
+ final int feedbackTypeFlag = 1 << Integer.numberOfTrailingZeros(fbt);
+ fbt &= ~feedbackTypeFlag;
+ if (builder.length() > 1) {
+ builder.append(", ");
+ }
+ switch (feedbackTypeFlag) {
+ case AccessibilityServiceInfo.FEEDBACK_AUDIBLE:
+ builder.append("FEEDBACK_AUDIBLE");
+ break;
+ case AccessibilityServiceInfo.FEEDBACK_HAPTIC:
+ builder.append("FEEDBACK_HAPTIC");
+ break;
+ case AccessibilityServiceInfo.FEEDBACK_GENERIC:
+ builder.append("FEEDBACK_GENERIC");
+ break;
+ case AccessibilityServiceInfo.FEEDBACK_SPOKEN:
+ builder.append("FEEDBACK_SPOKEN");
+ break;
+ case AccessibilityServiceInfo.FEEDBACK_VISUAL:
+ builder.append("FEEDBACK_VISUAL");
+ break;
+ }
+ }
+ builder.append("]");
+ return builder.toString();
+ }
+
+ /**
+ * Returns the string representation of a flag. For example,
+ * {@link AccessibilityServiceInfo#DEFAULT} is represented by the
+ * string DEFAULT.
+ *
+ * @param flag The flag.
+ * @return The string representation.
+ */
+ public static String flagToString(int flag) {
+ switch (flag) {
+ case DEFAULT:
+ return "DEFAULT";
+ case FLAG_INCLUDE_NOT_IMPORTANT_VIEWS:
+ return "FLAG_INCLUDE_NOT_IMPORTANT_VIEWS";
+ case FLAG_REQUEST_TOUCH_EXPLORATION_MODE:
+ return "FLAG_REQUEST_TOUCH_EXPLORATION_MODE";
+ case FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY:
+ return "FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY";
+ case FLAG_REPORT_VIEW_IDS:
+ return "FLAG_REPORT_VIEW_IDS";
+ case FLAG_REQUEST_FILTER_KEY_EVENTS:
+ return "FLAG_REQUEST_FILTER_KEY_EVENTS";
+ default:
+ return null;
+ }
+ }
+
+ /**
+ * Returns the bit mask of capabilities this accessibility service has such as
+ * being able to retrieve the active window content, etc.
+ *
+ * @param info The service info whose capabilities to get.
+ * @return The capability bit mask.
+ *
+ * @see #CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT
+ * @see #CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION
+ * @see #CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY
+ * @see #CAPABILITY_CAN_FILTER_KEY_EVENTS
+ */
+ public static int getCapabilities(AccessibilityServiceInfo info) {
+ return IMPL.getCapabilities(info);
+ }
+
+ /**
+ * Returns the string representation of a capability. For example,
+ * {@link #CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT} is represented
+ * by the string CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT.
+ *
+ * @param capability The capability.
+ * @return The string representation.
+ */
+ public static String capabilityToString(int capability) {
+ switch (capability) {
+ case CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT:
+ return "CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT";
+ case CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION:
+ return "CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION";
+ case CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY:
+ return "CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY";
+ case CAPABILITY_CAN_FILTER_KEY_EVENTS:
+ return "CAPABILITY_CAN_FILTER_KEY_EVENTS";
+ default:
+ return "UNKNOWN";
+ }
+ }
+}