175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov/* 275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * Copyright (C) 2009 The Android Open Source Project 375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * 475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * Licensed under the Apache License, Version 2.0 (the "License"); 575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * you may not use this file except in compliance with the License. 675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * You may obtain a copy of the License at 775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * 875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * http://www.apache.org/licenses/LICENSE-2.0 975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * 1075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * Unless required by applicable law or agreed to in writing, software 1175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * distributed under the License is distributed on an "AS IS" BASIS, 1275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * See the License for the specific language governing permissions and 1475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * limitations under the License. 1575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov */ 1675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov 1775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovpackage android.accessibilityservice; 1875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov 19cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganovimport android.content.ComponentName; 20cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganovimport android.content.Context; 21cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganovimport android.content.pm.PackageManager; 22cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganovimport android.content.pm.PackageManager.NameNotFoundException; 23cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganovimport android.content.pm.ResolveInfo; 24cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganovimport android.content.pm.ServiceInfo; 25cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganovimport android.content.res.Resources; 26cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganovimport android.content.res.TypedArray; 27cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganovimport android.content.res.XmlResourceParser; 284213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganovimport android.os.Build; 2975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.os.Parcel; 3075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.os.Parcelable; 31cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganovimport android.util.AttributeSet; 32688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslavimport android.util.SparseArray; 333d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganovimport android.util.TypedValue; 34cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganovimport android.util.Xml; 354213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganovimport android.view.View; 36cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganovimport android.view.accessibility.AccessibilityEvent; 3780943d8daa6ab31ab5c486d57aea406aa0730d58Svetoslav Ganovimport android.view.accessibility.AccessibilityNodeInfo; 38cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov 39cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganovimport org.xmlpull.v1.XmlPullParser; 40cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganovimport org.xmlpull.v1.XmlPullParserException; 41cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov 42688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslavimport com.android.internal.R; 43688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav 44cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganovimport java.io.IOException; 45688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslavimport java.util.ArrayList; 46688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslavimport java.util.Collections; 47688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslavimport java.util.List; 4875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov 4975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov/** 5038e8b4e5bc3c93affdffbc064fd9db5aeccc3e8eSvetoslav Ganov * This class describes an {@link AccessibilityService}. The system notifies an 5138e8b4e5bc3c93affdffbc064fd9db5aeccc3e8eSvetoslav Ganov * {@link AccessibilityService} for {@link android.view.accessibility.AccessibilityEvent}s 5275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * according to the information encapsulated in this class. 5375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * 54e1302edd40c5cc264f842e17e3796e0a11d6f045Joe Fernandez * <div class="special reference"> 55e1302edd40c5cc264f842e17e3796e0a11d6f045Joe Fernandez * <h3>Developer Guides</h3> 56e1302edd40c5cc264f842e17e3796e0a11d6f045Joe Fernandez * <p>For more information about creating AccessibilityServices, read the 57e1302edd40c5cc264f842e17e3796e0a11d6f045Joe Fernandez * <a href="{@docRoot}guide/topics/ui/accessibility/index.html">Accessibility</a> 58e1302edd40c5cc264f842e17e3796e0a11d6f045Joe Fernandez * developer guide.</p> 59e1302edd40c5cc264f842e17e3796e0a11d6f045Joe Fernandez * </div> 60e1302edd40c5cc264f842e17e3796e0a11d6f045Joe Fernandez * 6100d17f7aab54ef055d35da603dab5a7bae751876Scott Main * @attr ref android.R.styleable#AccessibilityService_accessibilityEventTypes 6200d17f7aab54ef055d35da603dab5a7bae751876Scott Main * @attr ref android.R.styleable#AccessibilityService_accessibilityFeedbackType 6300d17f7aab54ef055d35da603dab5a7bae751876Scott Main * @attr ref android.R.styleable#AccessibilityService_accessibilityFlags 6400d17f7aab54ef055d35da603dab5a7bae751876Scott Main * @attr ref android.R.styleable#AccessibilityService_canRequestEnhancedWebAccessibility 6500d17f7aab54ef055d35da603dab5a7bae751876Scott Main * @attr ref android.R.styleable#AccessibilityService_canRequestFilterKeyEvents 6600d17f7aab54ef055d35da603dab5a7bae751876Scott Main * @attr ref android.R.styleable#AccessibilityService_canRequestTouchExplorationMode 6700d17f7aab54ef055d35da603dab5a7bae751876Scott Main * @attr ref android.R.styleable#AccessibilityService_canRetrieveWindowContent 6800d17f7aab54ef055d35da603dab5a7bae751876Scott Main * @attr ref android.R.styleable#AccessibilityService_description 6900d17f7aab54ef055d35da603dab5a7bae751876Scott Main * @attr ref android.R.styleable#AccessibilityService_notificationTimeout 7000d17f7aab54ef055d35da603dab5a7bae751876Scott Main * @attr ref android.R.styleable#AccessibilityService_packageNames 7100d17f7aab54ef055d35da603dab5a7bae751876Scott Main * @attr ref android.R.styleable#AccessibilityService_settingsActivity 7200d17f7aab54ef055d35da603dab5a7bae751876Scott Main * 7375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * @see AccessibilityService 7475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * @see android.view.accessibility.AccessibilityEvent 7538e8b4e5bc3c93affdffbc064fd9db5aeccc3e8eSvetoslav Ganov * @see android.view.accessibility.AccessibilityManager 7675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov */ 7775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovpublic class AccessibilityServiceInfo implements Parcelable { 7875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov 79cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov private static final String TAG_ACCESSIBILITY_SERVICE = "accessibility-service"; 80cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov 8175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov /** 82688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav * Capability: This accessibility service can retrieve the active window content. 8300d17f7aab54ef055d35da603dab5a7bae751876Scott Main * @see android.R.styleable#AccessibilityService_canRetrieveWindowContent 84688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav */ 85688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav public static final int CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT = 0x00000001; 86688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav 87688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav /** 88688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav * Capability: This accessibility service can request touch exploration mode in which 89688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav * touched items are spoken aloud and the UI can be explored via gestures. 9000d17f7aab54ef055d35da603dab5a7bae751876Scott Main * @see android.R.styleable#AccessibilityService_canRequestTouchExplorationMode 91688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav */ 92688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav public static final int CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION = 0x00000002; 93688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav 94688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav /** 95688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav * Capability: This accessibility service can request enhanced web accessibility 96688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav * enhancements. For example, installing scripts to make app content more accessible. 9700d17f7aab54ef055d35da603dab5a7bae751876Scott Main * @see android.R.styleable#AccessibilityService_canRequestEnhancedWebAccessibility 98688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav */ 99688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav public static final int CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 0x00000004; 100688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav 101688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav /** 10200d17f7aab54ef055d35da603dab5a7bae751876Scott Main * Capability: This accessibility service can request to filter the key event stream. 10300d17f7aab54ef055d35da603dab5a7bae751876Scott Main * @see android.R.styleable#AccessibilityService_canRequestFilterKeyEvents 104688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav */ 105688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav public static final int CAPABILITY_CAN_REQUEST_FILTER_KEY_EVENTS = 0x00000008; 106688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav 107688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav private static final SparseArray<CapabilityInfo> sAvailableCapabilityInfos = 108688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav new SparseArray<CapabilityInfo>(); 109688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav static { 110688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav sAvailableCapabilityInfos.put(CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT, 111688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav new CapabilityInfo(CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT, 112688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav R.string.capability_title_canRetrieveWindowContent, 113688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav R.string.capability_desc_canRetrieveWindowContent)); 114688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav sAvailableCapabilityInfos.put(CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION, 115688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav new CapabilityInfo(CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION, 116688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav R.string.capability_title_canRequestTouchExploration, 117688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav R.string.capability_desc_canRequestTouchExploration)); 118688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav sAvailableCapabilityInfos.put(CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY, 119688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav new CapabilityInfo(CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY, 120688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav R.string.capability_title_canRequestEnhancedWebAccessibility, 121688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav R.string.capability_desc_canRequestEnhancedWebAccessibility)); 122688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav sAvailableCapabilityInfos.put(CAPABILITY_CAN_REQUEST_FILTER_KEY_EVENTS, 123688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav new CapabilityInfo(CAPABILITY_CAN_REQUEST_FILTER_KEY_EVENTS, 124688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav R.string.capability_title_canRequestFilterKeyEvents, 125688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav R.string.capability_desc_canRequestFilterKeyEvents)); 126688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav } 127688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav 128688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav /** 12975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * Denotes spoken feedback. 13075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov */ 13175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov public static final int FEEDBACK_SPOKEN = 0x0000001; 13275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov 13375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov /** 13475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * Denotes haptic feedback. 13575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov */ 13675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov public static final int FEEDBACK_HAPTIC = 0x0000002; 13775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov 13875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov /** 13975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * Denotes audible (not spoken) feedback. 14075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov */ 14175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov public static final int FEEDBACK_AUDIBLE = 0x0000004; 14275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov 14375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov /** 14475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * Denotes visual feedback. 14575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov */ 14675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov public static final int FEEDBACK_VISUAL = 0x0000008; 14775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov 14875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov /** 14975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * Denotes generic feedback. 15075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov */ 15175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov public static final int FEEDBACK_GENERIC = 0x0000010; 15275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov 15375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov /** 154eb9862fd4c6ba1745a0f6c997e85643a4ded0643Svetoslav Ganov * Denotes braille feedback. 155eb9862fd4c6ba1745a0f6c997e85643a4ded0643Svetoslav Ganov */ 156eb9862fd4c6ba1745a0f6c997e85643a4ded0643Svetoslav Ganov public static final int FEEDBACK_BRAILLE = 0x0000020; 157eb9862fd4c6ba1745a0f6c997e85643a4ded0643Svetoslav Ganov 158eb9862fd4c6ba1745a0f6c997e85643a4ded0643Svetoslav Ganov /** 15900aabf7d187bc05408199bd687a538b2e68bdc17Svetoslav Ganov * Mask for all feedback types. 16000aabf7d187bc05408199bd687a538b2e68bdc17Svetoslav Ganov * 16100aabf7d187bc05408199bd687a538b2e68bdc17Svetoslav Ganov * @see #FEEDBACK_SPOKEN 16200aabf7d187bc05408199bd687a538b2e68bdc17Svetoslav Ganov * @see #FEEDBACK_HAPTIC 16300aabf7d187bc05408199bd687a538b2e68bdc17Svetoslav Ganov * @see #FEEDBACK_AUDIBLE 16400aabf7d187bc05408199bd687a538b2e68bdc17Svetoslav Ganov * @see #FEEDBACK_VISUAL 16500aabf7d187bc05408199bd687a538b2e68bdc17Svetoslav Ganov * @see #FEEDBACK_GENERIC 166eb9862fd4c6ba1745a0f6c997e85643a4ded0643Svetoslav Ganov * @see #FEEDBACK_BRAILLE 16700aabf7d187bc05408199bd687a538b2e68bdc17Svetoslav Ganov */ 16800aabf7d187bc05408199bd687a538b2e68bdc17Svetoslav Ganov public static final int FEEDBACK_ALL_MASK = 0xFFFFFFFF; 16900aabf7d187bc05408199bd687a538b2e68bdc17Svetoslav Ganov 17000aabf7d187bc05408199bd687a538b2e68bdc17Svetoslav Ganov /** 17175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * If an {@link AccessibilityService} is the default for a given type. 17275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * Default service is invoked only if no package specific one exists. In case of 17375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * more than one package specific service only the earlier registered is notified. 17475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov */ 17575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov public static final int DEFAULT = 0x0000001; 17675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov 17775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov /** 1784213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov * If this flag is set the system will regard views that are not important 1794213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov * for accessibility in addition to the ones that are important for accessibility. 1804213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov * That is, views that are marked as not important for accessibility via 18123be199171bedb05e81864f8941492af066fa667Alan Viverette * {@link View#IMPORTANT_FOR_ACCESSIBILITY_NO} or 18223be199171bedb05e81864f8941492af066fa667Alan Viverette * {@link View#IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS} and views that are 18323be199171bedb05e81864f8941492af066fa667Alan Viverette * marked as potentially important for accessibility via 1844213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov * {@link View#IMPORTANT_FOR_ACCESSIBILITY_AUTO} for which the system has determined 18523be199171bedb05e81864f8941492af066fa667Alan Viverette * that are not important for accessibility, are reported while querying the window 18623be199171bedb05e81864f8941492af066fa667Alan Viverette * content and also the accessibility service will receive accessibility events from 18723be199171bedb05e81864f8941492af066fa667Alan Viverette * them. 1884213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov * <p> 1894213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov * <strong>Note:</strong> For accessibility services targeting API version 1904213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov * {@link Build.VERSION_CODES#JELLY_BEAN} or higher this flag has to be explicitly 1914213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov * set for the system to regard views that are not important for accessibility. For 1924213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov * accessibility services targeting API version lower than 1934213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov * {@link Build.VERSION_CODES#JELLY_BEAN} this flag is ignored and all views are 1944213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov * regarded for accessibility purposes. 1954213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov * </p> 1964213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov * <p> 1974213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov * Usually views not important for accessibility are layout managers that do not 1984213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov * react to user actions, do not draw any content, and do not have any special 1994213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov * semantics in the context of the screen content. For example, a three by three 2004213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov * grid can be implemented as three horizontal linear layouts and one vertical, 2014213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov * or three vertical linear layouts and one horizontal, or one grid layout, etc. 2024213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov * In this context the actual layout mangers used to achieve the grid configuration 2034213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov * are not important, rather it is important that there are nine evenly distributed 2044213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov * elements. 2054213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov * </p> 2064213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov */ 2073ec2e1b94ab502bfa8d5e8750716108f69aa18d2Svetoslav Ganov public static final int FLAG_INCLUDE_NOT_IMPORTANT_VIEWS = 0x0000002; 2083ec2e1b94ab502bfa8d5e8750716108f69aa18d2Svetoslav Ganov 2093ec2e1b94ab502bfa8d5e8750716108f69aa18d2Svetoslav Ganov /** 2103ec2e1b94ab502bfa8d5e8750716108f69aa18d2Svetoslav Ganov * This flag requests that the system gets into touch exploration mode. 2113ec2e1b94ab502bfa8d5e8750716108f69aa18d2Svetoslav Ganov * In this mode a single finger moving on the screen behaves as a mouse 2123ec2e1b94ab502bfa8d5e8750716108f69aa18d2Svetoslav Ganov * pointer hovering over the user interface. The system will also detect 2133ec2e1b94ab502bfa8d5e8750716108f69aa18d2Svetoslav Ganov * certain gestures performed on the touch screen and notify this service. 2143ec2e1b94ab502bfa8d5e8750716108f69aa18d2Svetoslav Ganov * The system will enable touch exploration mode if there is at least one 2153ec2e1b94ab502bfa8d5e8750716108f69aa18d2Svetoslav Ganov * accessibility service that has this flag set. Hence, clearing this 2163ec2e1b94ab502bfa8d5e8750716108f69aa18d2Svetoslav Ganov * flag does not guarantee that the device will not be in touch exploration 2173ec2e1b94ab502bfa8d5e8750716108f69aa18d2Svetoslav Ganov * mode since there may be another enabled service that requested it. 2180ec0418c6eac5076774a74855725d9df53141907Svetoslav * <p> 219447d94684ee73046d769649d8247aacd581bd6e3Svetoslav Ganov * For accessibility services targeting API version higher than 220447d94684ee73046d769649d8247aacd581bd6e3Svetoslav Ganov * {@link Build.VERSION_CODES#JELLY_BEAN_MR1} that want to set 221688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav * this flag have to declare this capability in their meta-data by setting 222688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav * the attribute {@link android.R.attr#canRequestTouchExplorationMode 223688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav * canRequestTouchExplorationMode} to true, otherwise this flag will 224688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav * be ignored. For how to declare the meta-data of a service refer to 225688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav * {@value AccessibilityService#SERVICE_META_DATA}. 2260ec0418c6eac5076774a74855725d9df53141907Svetoslav * </p> 227447d94684ee73046d769649d8247aacd581bd6e3Svetoslav Ganov * <p> 228447d94684ee73046d769649d8247aacd581bd6e3Svetoslav Ganov * Services targeting API version equal to or lower than 229447d94684ee73046d769649d8247aacd581bd6e3Svetoslav Ganov * {@link Build.VERSION_CODES#JELLY_BEAN_MR1} will work normally, i.e. 230447d94684ee73046d769649d8247aacd581bd6e3Svetoslav Ganov * the first time they are run, if this flag is specified, a dialog is 231447d94684ee73046d769649d8247aacd581bd6e3Svetoslav Ganov * shown to the user to confirm enabling explore by touch. 232447d94684ee73046d769649d8247aacd581bd6e3Svetoslav Ganov * </p> 23300d17f7aab54ef055d35da603dab5a7bae751876Scott Main * @see android.R.styleable#AccessibilityService_canRequestTouchExplorationMode 2343ec2e1b94ab502bfa8d5e8750716108f69aa18d2Svetoslav Ganov */ 2350ec0418c6eac5076774a74855725d9df53141907Svetoslav public static final int FLAG_REQUEST_TOUCH_EXPLORATION_MODE = 0x0000004; 2364213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov 2374213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov /** 2383822896e226567c6cd3ef84518d318abd33a7624Svetoslav * This flag requests from the system to enable web accessibility enhancing 2393822896e226567c6cd3ef84518d318abd33a7624Svetoslav * extensions. Such extensions aim to provide improved accessibility support 2403822896e226567c6cd3ef84518d318abd33a7624Svetoslav * for content presented in a {@link android.webkit.WebView}. An example of such 241901309ce5904cbc7b07b01b49ac5cd26b356998aSvetoslav * an extension is injecting JavaScript from a secure source. The system will enable 2423822896e226567c6cd3ef84518d318abd33a7624Svetoslav * enhanced web accessibility if there is at least one accessibility service 2433822896e226567c6cd3ef84518d318abd33a7624Svetoslav * that has this flag set. Hence, clearing this flag does not guarantee that the 2443822896e226567c6cd3ef84518d318abd33a7624Svetoslav * device will not have enhanced web accessibility enabled since there may be 2453822896e226567c6cd3ef84518d318abd33a7624Svetoslav * another enabled service that requested it. 2460ec0418c6eac5076774a74855725d9df53141907Svetoslav * <p> 247688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav * Services that want to set this flag have to declare this capability 248688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav * in their meta-data by setting the attribute {@link android.R.attr 249688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav * #canRequestEnhancedWebAccessibility canRequestEnhancedWebAccessibility} to 250688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav * true, otherwise this flag will be ignored. For how to declare the meta-data 251688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav * of a service refer to {@value AccessibilityService#SERVICE_META_DATA}. 2520ec0418c6eac5076774a74855725d9df53141907Svetoslav * </p> 25300d17f7aab54ef055d35da603dab5a7bae751876Scott Main * @see android.R.styleable#AccessibilityService_canRequestEnhancedWebAccessibility 2543822896e226567c6cd3ef84518d318abd33a7624Svetoslav */ 2553822896e226567c6cd3ef84518d318abd33a7624Svetoslav public static final int FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 0x00000008; 2563822896e226567c6cd3ef84518d318abd33a7624Svetoslav 2573822896e226567c6cd3ef84518d318abd33a7624Svetoslav /** 25880943d8daa6ab31ab5c486d57aea406aa0730d58Svetoslav Ganov * This flag requests that the {@link AccessibilityNodeInfo}s obtained 25980943d8daa6ab31ab5c486d57aea406aa0730d58Svetoslav Ganov * by an {@link AccessibilityService} contain the id of the source view. 26080943d8daa6ab31ab5c486d57aea406aa0730d58Svetoslav Ganov * The source view id will be a fully qualified resource name of the 26180943d8daa6ab31ab5c486d57aea406aa0730d58Svetoslav Ganov * form "package:id/name", for example "foo.bar:id/my_list", and it is 26280943d8daa6ab31ab5c486d57aea406aa0730d58Svetoslav Ganov * useful for UI test automation. This flag is not set by default. 26380943d8daa6ab31ab5c486d57aea406aa0730d58Svetoslav Ganov */ 2643822896e226567c6cd3ef84518d318abd33a7624Svetoslav public static final int FLAG_REPORT_VIEW_IDS = 0x00000010; 26580943d8daa6ab31ab5c486d57aea406aa0730d58Svetoslav Ganov 26680943d8daa6ab31ab5c486d57aea406aa0730d58Svetoslav Ganov /** 267688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav * This flag requests from the system to filter key events. If this flag 268688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav * is set the accessibility service will receive the key events before 269688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav * applications allowing it implement global shortcuts. Setting this flag 270688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav * does not guarantee that this service will filter key events since only 271688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav * one service can do so at any given time. This avoids user confusion due 272688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav * to behavior change in case different key filtering services are enabled. 273688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav * If there is already another key filtering service enabled, this one will 274688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav * not receive key events. 275688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav * <p> 276688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav * Services that want to set this flag have to declare this capability 277688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav * in their meta-data by setting the attribute {@link android.R.attr 278688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav * #canRequestFilterKeyEvents canRequestFilterKeyEvents} to true, 279688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav * otherwise this flag will be ignored. For how to declare the meta-data 280688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav * of a service refer to {@value AccessibilityService#SERVICE_META_DATA}. 281688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav * </p> 28200d17f7aab54ef055d35da603dab5a7bae751876Scott Main * @see android.R.styleable#AccessibilityService_canRequestFilterKeyEvents 283688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav */ 284688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav public static final int FLAG_REQUEST_FILTER_KEY_EVENTS = 0x00000020; 285688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav 286688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav /** 28775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * The event types an {@link AccessibilityService} is interested in. 288cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov * <p> 289cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov * <strong>Can be dynamically set at runtime.</strong> 290cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov * </p> 29175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * @see android.view.accessibility.AccessibilityEvent#TYPE_VIEW_CLICKED 2929b31779eab896bdcc0922473b183c979cc0b874fSvetoslav Ganov * @see android.view.accessibility.AccessibilityEvent#TYPE_VIEW_LONG_CLICKED 29375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * @see android.view.accessibility.AccessibilityEvent#TYPE_VIEW_FOCUSED 29475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * @see android.view.accessibility.AccessibilityEvent#TYPE_VIEW_SELECTED 29575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * @see android.view.accessibility.AccessibilityEvent#TYPE_VIEW_TEXT_CHANGED 29675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * @see android.view.accessibility.AccessibilityEvent#TYPE_WINDOW_STATE_CHANGED 29775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * @see android.view.accessibility.AccessibilityEvent#TYPE_NOTIFICATION_STATE_CHANGED 29838e8b4e5bc3c93affdffbc064fd9db5aeccc3e8eSvetoslav Ganov * @see android.view.accessibility.AccessibilityEvent#TYPE_TOUCH_EXPLORATION_GESTURE_START 29938e8b4e5bc3c93affdffbc064fd9db5aeccc3e8eSvetoslav Ganov * @see android.view.accessibility.AccessibilityEvent#TYPE_TOUCH_EXPLORATION_GESTURE_END 30038e8b4e5bc3c93affdffbc064fd9db5aeccc3e8eSvetoslav Ganov * @see android.view.accessibility.AccessibilityEvent#TYPE_VIEW_HOVER_ENTER 30138e8b4e5bc3c93affdffbc064fd9db5aeccc3e8eSvetoslav Ganov * @see android.view.accessibility.AccessibilityEvent#TYPE_VIEW_HOVER_EXIT 30238e8b4e5bc3c93affdffbc064fd9db5aeccc3e8eSvetoslav Ganov * @see android.view.accessibility.AccessibilityEvent#TYPE_VIEW_SCROLLED 30338e8b4e5bc3c93affdffbc064fd9db5aeccc3e8eSvetoslav Ganov * @see android.view.accessibility.AccessibilityEvent#TYPE_VIEW_TEXT_SELECTION_CHANGED 30438e8b4e5bc3c93affdffbc064fd9db5aeccc3e8eSvetoslav Ganov * @see android.view.accessibility.AccessibilityEvent#TYPE_WINDOW_CONTENT_CHANGED 30575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov */ 30675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov public int eventTypes; 30775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov 30875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov /** 30975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * The package names an {@link AccessibilityService} is interested in. Setting 31038e8b4e5bc3c93affdffbc064fd9db5aeccc3e8eSvetoslav Ganov * to <code>null</code> is equivalent to all packages. 311cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov * <p> 312cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov * <strong>Can be dynamically set at runtime.</strong> 313cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov * </p> 31475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov */ 31575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov public String[] packageNames; 31675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov 31775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov /** 31875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * The feedback type an {@link AccessibilityService} provides. 319cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov * <p> 320cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov * <strong>Can be dynamically set at runtime.</strong> 321cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov * </p> 32275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * @see #FEEDBACK_AUDIBLE 32375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * @see #FEEDBACK_GENERIC 32475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * @see #FEEDBACK_HAPTIC 32575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * @see #FEEDBACK_SPOKEN 32675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * @see #FEEDBACK_VISUAL 327eb9862fd4c6ba1745a0f6c997e85643a4ded0643Svetoslav Ganov * @see #FEEDBACK_BRAILLE 32875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov */ 32975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov public int feedbackType; 33075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov 33175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov /** 33275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * The timeout after the most recent event of a given type before an 33375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link AccessibilityService} is notified. 33475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * <p> 335cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov * <strong>Can be dynamically set at runtime.</strong>. 336cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov * </p> 337cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov * <p> 33838e8b4e5bc3c93affdffbc064fd9db5aeccc3e8eSvetoslav Ganov * <strong>Note:</strong> The event notification timeout is useful to avoid propagating 33938e8b4e5bc3c93affdffbc064fd9db5aeccc3e8eSvetoslav Ganov * events to the client too frequently since this is accomplished via an expensive 34038e8b4e5bc3c93affdffbc064fd9db5aeccc3e8eSvetoslav Ganov * interprocess call. One can think of the timeout as a criteria to determine when 34138e8b4e5bc3c93affdffbc064fd9db5aeccc3e8eSvetoslav Ganov * event generation has settled down. 34275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov */ 34375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov public long notificationTimeout; 34475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov 34575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov /** 34675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * This field represents a set of flags used for configuring an 34775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link AccessibilityService}. 348cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov * <p> 349cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov * <strong>Can be dynamically set at runtime.</strong> 350cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov * </p> 35175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * @see #DEFAULT 3523ec2e1b94ab502bfa8d5e8750716108f69aa18d2Svetoslav Ganov * @see #FLAG_INCLUDE_NOT_IMPORTANT_VIEWS 3533ec2e1b94ab502bfa8d5e8750716108f69aa18d2Svetoslav Ganov * @see #FLAG_REQUEST_TOUCH_EXPLORATION_MODE 354688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav * @see #FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY 355688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav * @see #FLAG_REQUEST_FILTER_KEY_EVENTS 356688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav * @see #FLAG_REPORT_VIEW_IDS 35775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov */ 35875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov public int flags; 35975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov 360cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov /** 361cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov * The unique string Id to identify the accessibility service. 362cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov */ 363cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov private String mId; 364cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov 365cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov /** 366cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov * The Service that implements this accessibility service component. 367cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov */ 368cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov private ResolveInfo mResolveInfo; 369cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov 370cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov /** 371cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov * The accessibility service setting activity's name, used by the system 372cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov * settings to launch the setting activity of this accessibility service. 373cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov */ 374cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov private String mSettingsActivityName; 375cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov 376cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov /** 377688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav * Bit mask with capabilities of this service. 378cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov */ 379688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav private int mCapabilities; 380cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov 381cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov /** 3823d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov * Resource id of the description of the accessibility service. 38335bfedeaba724aeadc6f6c890269cb6bf7ef42f5Svetoslav Ganov */ 3843d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov private int mDescriptionResId; 3853d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov 3863d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov /** 3873d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov * Non localized description of the accessibility service. 3883d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov */ 3893d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov private String mNonLocalizedDescription; 39035bfedeaba724aeadc6f6c890269cb6bf7ef42f5Svetoslav Ganov 39135bfedeaba724aeadc6f6c890269cb6bf7ef42f5Svetoslav Ganov /** 392cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov * Creates a new instance. 393cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov */ 394cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov public AccessibilityServiceInfo() { 395cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov /* do nothing */ 396cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov } 397cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov 398cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov /** 399cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov * Creates a new instance. 400cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov * 401cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov * @param resolveInfo The service resolve info. 402cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov * @param context Context for accessing resources. 403cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov * @throws XmlPullParserException If a XML parsing error occurs. 404cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov * @throws IOException If a XML parsing error occurs. 405cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov * 406cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov * @hide 407cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov */ 408cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov public AccessibilityServiceInfo(ResolveInfo resolveInfo, Context context) 409cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov throws XmlPullParserException, IOException { 410cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov ServiceInfo serviceInfo = resolveInfo.serviceInfo; 411cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov mId = new ComponentName(serviceInfo.packageName, serviceInfo.name).flattenToShortString(); 412cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov mResolveInfo = resolveInfo; 413cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov 414cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov XmlResourceParser parser = null; 415cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov 416cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov try { 417cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov PackageManager packageManager = context.getPackageManager(); 418cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov parser = serviceInfo.loadXmlMetaData(packageManager, 419cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov AccessibilityService.SERVICE_META_DATA); 420cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov if (parser == null) { 421cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov return; 422cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov } 423cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov 424cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov int type = 0; 425cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov while (type != XmlPullParser.END_DOCUMENT && type != XmlPullParser.START_TAG) { 426cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov type = parser.next(); 427cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov } 428cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov 429cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov String nodeName = parser.getName(); 430cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov if (!TAG_ACCESSIBILITY_SERVICE.equals(nodeName)) { 431cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov throw new XmlPullParserException( "Meta-data does not start with" 432cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov + TAG_ACCESSIBILITY_SERVICE + " tag"); 433cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov } 434cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov 435cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov AttributeSet allAttributes = Xml.asAttributeSet(parser); 436cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov Resources resources = packageManager.getResourcesForApplication( 437cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov serviceInfo.applicationInfo); 438cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov TypedArray asAttributes = resources.obtainAttributes(allAttributes, 439cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov com.android.internal.R.styleable.AccessibilityService); 440cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov eventTypes = asAttributes.getInt( 441cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov com.android.internal.R.styleable.AccessibilityService_accessibilityEventTypes, 442cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov 0); 443cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov String packageNamez = asAttributes.getString( 444cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov com.android.internal.R.styleable.AccessibilityService_packageNames); 445cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov if (packageNamez != null) { 446cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov packageNames = packageNamez.split("(\\s)*,(\\s)*"); 447cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov } 448cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov feedbackType = asAttributes.getInt( 449cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov com.android.internal.R.styleable.AccessibilityService_accessibilityFeedbackType, 450cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov 0); 451cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov notificationTimeout = asAttributes.getInt( 452cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov com.android.internal.R.styleable.AccessibilityService_notificationTimeout, 453cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov 0); 454cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov flags = asAttributes.getInt( 455cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov com.android.internal.R.styleable.AccessibilityService_accessibilityFlags, 0); 456cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov mSettingsActivityName = asAttributes.getString( 457cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov com.android.internal.R.styleable.AccessibilityService_settingsActivity); 458688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav if (asAttributes.getBoolean(com.android.internal.R.styleable 459688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav .AccessibilityService_canRetrieveWindowContent, false)) { 460688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav mCapabilities |= CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT; 461688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav } 462688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav if (asAttributes.getBoolean(com.android.internal.R.styleable 463688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav .AccessibilityService_canRequestTouchExplorationMode, false)) { 464688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav mCapabilities |= CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION; 465688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav } 466688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav if (asAttributes.getBoolean(com.android.internal.R.styleable 46711adf6dc2438260c3e0d79cc189bcb4f6f15e9f4Svetoslav .AccessibilityService_canRequestEnhancedWebAccessibility, false)) { 46811adf6dc2438260c3e0d79cc189bcb4f6f15e9f4Svetoslav mCapabilities |= CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY; 469688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav } 470688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav if (asAttributes.getBoolean(com.android.internal.R.styleable 471688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav .AccessibilityService_canRequestFilterKeyEvents, false)) { 472688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav mCapabilities |= CAPABILITY_CAN_REQUEST_FILTER_KEY_EVENTS; 473688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav } 4743d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov TypedValue peekedValue = asAttributes.peekValue( 47535bfedeaba724aeadc6f6c890269cb6bf7ef42f5Svetoslav Ganov com.android.internal.R.styleable.AccessibilityService_description); 4763d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov if (peekedValue != null) { 4773d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov mDescriptionResId = peekedValue.resourceId; 4783d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov CharSequence nonLocalizedDescription = peekedValue.coerceToString(); 4793d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov if (nonLocalizedDescription != null) { 4803d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov mNonLocalizedDescription = nonLocalizedDescription.toString().trim(); 4813d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov } 4823d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov } 483cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov asAttributes.recycle(); 484cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov } catch (NameNotFoundException e) { 485cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov throw new XmlPullParserException( "Unable to create context for: " 486cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov + serviceInfo.packageName); 487cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov } finally { 488cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov if (parser != null) { 489cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov parser.close(); 490cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov } 491cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov } 492cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov } 493cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov 494cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov /** 495cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov * Updates the properties that an AccessibilitySerivice can change dynamically. 496cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov * 497cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov * @param other The info from which to update the properties. 498cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov * 499cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov * @hide 500cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov */ 501cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov public void updateDynamicallyConfigurableProperties(AccessibilityServiceInfo other) { 502cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov eventTypes = other.eventTypes; 503cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov packageNames = other.packageNames; 504cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov feedbackType = other.feedbackType; 505cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov notificationTimeout = other.notificationTimeout; 506cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov flags = other.flags; 507cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov } 508cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov 509cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov /** 51057bf88508e0491caced22c4c592d33aba6d88129Svetoslav * @hide 51157bf88508e0491caced22c4c592d33aba6d88129Svetoslav */ 51257bf88508e0491caced22c4c592d33aba6d88129Svetoslav public void setComponentName(ComponentName component) { 51357bf88508e0491caced22c4c592d33aba6d88129Svetoslav mId = component.flattenToShortString(); 51457bf88508e0491caced22c4c592d33aba6d88129Svetoslav } 51557bf88508e0491caced22c4c592d33aba6d88129Svetoslav 51657bf88508e0491caced22c4c592d33aba6d88129Svetoslav /** 517cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov * The accessibility service id. 518cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov * <p> 519cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov * <strong>Generated by the system.</strong> 520cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov * </p> 521cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov * @return The id. 522cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov */ 523cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov public String getId() { 524cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov return mId; 525cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov } 526cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov 527cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov /** 528cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov * The service {@link ResolveInfo}. 529cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov * <p> 530cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov * <strong>Generated by the system.</strong> 531cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov * </p> 532cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov * @return The info. 533cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov */ 534cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov public ResolveInfo getResolveInfo() { 535cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov return mResolveInfo; 536cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov } 537cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov 538cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov /** 539cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov * The settings activity name. 540cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov * <p> 541cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov * <strong>Statically set from 542cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov * {@link AccessibilityService#SERVICE_META_DATA meta-data}.</strong> 543cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov * </p> 544cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov * @return The settings activity name. 545cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov */ 546cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov public String getSettingsActivityName() { 547cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov return mSettingsActivityName; 548cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov } 549cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov 550cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov /** 55138e8b4e5bc3c93affdffbc064fd9db5aeccc3e8eSvetoslav Ganov * Whether this service can retrieve the current window's content. 552cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov * <p> 553cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov * <strong>Statically set from 554cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov * {@link AccessibilityService#SERVICE_META_DATA meta-data}.</strong> 555cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov * </p> 556fefd20e927b7252d63acb7bb1852c5188e3c1b2eSvetoslav Ganov * @return True if window content can be retrieved. 557688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav * 558688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav * @deprecated Use {@link #getCapabilities()}. 559cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov */ 560cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov public boolean getCanRetrieveWindowContent() { 561688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav return (mCapabilities & CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT) != 0; 562688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav } 563688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav 564688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav /** 565688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav * Returns the bit mask of capabilities this accessibility service has such as 566688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav * being able to retrieve the active window content, etc. 567688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav * 568688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav * @return The capability bit mask. 569688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav * 570688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav * @see #CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT 571688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav * @see #CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION 572688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav * @see #CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY 573688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav * @see #CAPABILITY_FILTER_KEY_EVENTS 574688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav */ 575688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav public int getCapabilities() { 576688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav return mCapabilities; 577cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov } 578cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov 579cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov /** 58011adf6dc2438260c3e0d79cc189bcb4f6f15e9f4Svetoslav * Sets the bit mask of capabilities this accessibility service has such as 58111adf6dc2438260c3e0d79cc189bcb4f6f15e9f4Svetoslav * being able to retrieve the active window content, etc. 58211adf6dc2438260c3e0d79cc189bcb4f6f15e9f4Svetoslav * 58311adf6dc2438260c3e0d79cc189bcb4f6f15e9f4Svetoslav * @param capabilities The capability bit mask. 58411adf6dc2438260c3e0d79cc189bcb4f6f15e9f4Svetoslav * 58511adf6dc2438260c3e0d79cc189bcb4f6f15e9f4Svetoslav * @see #CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT 58611adf6dc2438260c3e0d79cc189bcb4f6f15e9f4Svetoslav * @see #CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION 58711adf6dc2438260c3e0d79cc189bcb4f6f15e9f4Svetoslav * @see #CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY 58811adf6dc2438260c3e0d79cc189bcb4f6f15e9f4Svetoslav * @see #CAPABILITY_FILTER_KEY_EVENTS 58911adf6dc2438260c3e0d79cc189bcb4f6f15e9f4Svetoslav * 59011adf6dc2438260c3e0d79cc189bcb4f6f15e9f4Svetoslav * @hide 59111adf6dc2438260c3e0d79cc189bcb4f6f15e9f4Svetoslav */ 59211adf6dc2438260c3e0d79cc189bcb4f6f15e9f4Svetoslav public void setCapabilities(int capabilities) { 59311adf6dc2438260c3e0d79cc189bcb4f6f15e9f4Svetoslav mCapabilities = capabilities; 59411adf6dc2438260c3e0d79cc189bcb4f6f15e9f4Svetoslav } 59511adf6dc2438260c3e0d79cc189bcb4f6f15e9f4Svetoslav 59611adf6dc2438260c3e0d79cc189bcb4f6f15e9f4Svetoslav /** 5973d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov * Gets the non-localized description of the accessibility service. 59835bfedeaba724aeadc6f6c890269cb6bf7ef42f5Svetoslav Ganov * <p> 59935bfedeaba724aeadc6f6c890269cb6bf7ef42f5Svetoslav Ganov * <strong>Statically set from 60035bfedeaba724aeadc6f6c890269cb6bf7ef42f5Svetoslav Ganov * {@link AccessibilityService#SERVICE_META_DATA meta-data}.</strong> 60135bfedeaba724aeadc6f6c890269cb6bf7ef42f5Svetoslav Ganov * </p> 60235bfedeaba724aeadc6f6c890269cb6bf7ef42f5Svetoslav Ganov * @return The description. 6033d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov * 6043d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov * @deprecated Use {@link #loadDescription(PackageManager)}. 60535bfedeaba724aeadc6f6c890269cb6bf7ef42f5Svetoslav Ganov */ 60635bfedeaba724aeadc6f6c890269cb6bf7ef42f5Svetoslav Ganov public String getDescription() { 6073d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov return mNonLocalizedDescription; 6083d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov } 6093d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov 6103d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov /** 6113d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov * The localized description of the accessibility service. 6123d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov * <p> 6133d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov * <strong>Statically set from 6143d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov * {@link AccessibilityService#SERVICE_META_DATA meta-data}.</strong> 6153d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov * </p> 6163d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov * @return The localized description. 6173d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov */ 6183d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov public String loadDescription(PackageManager packageManager) { 6193d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov if (mDescriptionResId == 0) { 6203d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov return mNonLocalizedDescription; 6213d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov } 6223d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov ServiceInfo serviceInfo = mResolveInfo.serviceInfo; 6233d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov CharSequence description = packageManager.getText(serviceInfo.packageName, 6243d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov mDescriptionResId, serviceInfo.applicationInfo); 6253d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov if (description != null) { 6263d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov return description.toString().trim(); 6273d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov } 6283d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov return null; 62935bfedeaba724aeadc6f6c890269cb6bf7ef42f5Svetoslav Ganov } 63035bfedeaba724aeadc6f6c890269cb6bf7ef42f5Svetoslav Ganov 63135bfedeaba724aeadc6f6c890269cb6bf7ef42f5Svetoslav Ganov /** 632cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov * {@inheritDoc} 633cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov */ 63475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov public int describeContents() { 63575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov return 0; 63675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov } 63775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov 6389b31779eab896bdcc0922473b183c979cc0b874fSvetoslav Ganov public void writeToParcel(Parcel parcel, int flagz) { 63975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov parcel.writeInt(eventTypes); 64075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov parcel.writeStringArray(packageNames); 64175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov parcel.writeInt(feedbackType); 64275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov parcel.writeLong(notificationTimeout); 64375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov parcel.writeInt(flags); 644cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov parcel.writeString(mId); 645cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov parcel.writeParcelable(mResolveInfo, 0); 646cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov parcel.writeString(mSettingsActivityName); 647688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav parcel.writeInt(mCapabilities); 6483d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov parcel.writeInt(mDescriptionResId); 6493d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov parcel.writeString(mNonLocalizedDescription); 650cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov } 651cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov 652cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov private void initFromParcel(Parcel parcel) { 653cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov eventTypes = parcel.readInt(); 654cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov packageNames = parcel.readStringArray(); 655cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov feedbackType = parcel.readInt(); 656cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov notificationTimeout = parcel.readLong(); 657cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov flags = parcel.readInt(); 658cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov mId = parcel.readString(); 659cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov mResolveInfo = parcel.readParcelable(null); 660cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov mSettingsActivityName = parcel.readString(); 661688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav mCapabilities = parcel.readInt(); 6623d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov mDescriptionResId = parcel.readInt(); 6633d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov mNonLocalizedDescription = parcel.readString(); 664cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov } 665cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov 666cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov @Override 66757bf88508e0491caced22c4c592d33aba6d88129Svetoslav public int hashCode() { 66857bf88508e0491caced22c4c592d33aba6d88129Svetoslav return 31 * 1 + ((mId == null) ? 0 : mId.hashCode()); 66957bf88508e0491caced22c4c592d33aba6d88129Svetoslav } 67057bf88508e0491caced22c4c592d33aba6d88129Svetoslav 67157bf88508e0491caced22c4c592d33aba6d88129Svetoslav @Override 67257bf88508e0491caced22c4c592d33aba6d88129Svetoslav public boolean equals(Object obj) { 67357bf88508e0491caced22c4c592d33aba6d88129Svetoslav if (this == obj) { 67457bf88508e0491caced22c4c592d33aba6d88129Svetoslav return true; 67557bf88508e0491caced22c4c592d33aba6d88129Svetoslav } 67657bf88508e0491caced22c4c592d33aba6d88129Svetoslav if (obj == null) { 67757bf88508e0491caced22c4c592d33aba6d88129Svetoslav return false; 67857bf88508e0491caced22c4c592d33aba6d88129Svetoslav } 67957bf88508e0491caced22c4c592d33aba6d88129Svetoslav if (getClass() != obj.getClass()) { 68057bf88508e0491caced22c4c592d33aba6d88129Svetoslav return false; 68157bf88508e0491caced22c4c592d33aba6d88129Svetoslav } 68257bf88508e0491caced22c4c592d33aba6d88129Svetoslav AccessibilityServiceInfo other = (AccessibilityServiceInfo) obj; 68357bf88508e0491caced22c4c592d33aba6d88129Svetoslav if (mId == null) { 68457bf88508e0491caced22c4c592d33aba6d88129Svetoslav if (other.mId != null) { 68557bf88508e0491caced22c4c592d33aba6d88129Svetoslav return false; 68657bf88508e0491caced22c4c592d33aba6d88129Svetoslav } 68757bf88508e0491caced22c4c592d33aba6d88129Svetoslav } else if (!mId.equals(other.mId)) { 68857bf88508e0491caced22c4c592d33aba6d88129Svetoslav return false; 68957bf88508e0491caced22c4c592d33aba6d88129Svetoslav } 69057bf88508e0491caced22c4c592d33aba6d88129Svetoslav return true; 69157bf88508e0491caced22c4c592d33aba6d88129Svetoslav } 69257bf88508e0491caced22c4c592d33aba6d88129Svetoslav 69357bf88508e0491caced22c4c592d33aba6d88129Svetoslav @Override 694cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov public String toString() { 695cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov StringBuilder stringBuilder = new StringBuilder(); 696cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov appendEventTypes(stringBuilder, eventTypes); 697cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov stringBuilder.append(", "); 698cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov appendPackageNames(stringBuilder, packageNames); 699cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov stringBuilder.append(", "); 700cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov appendFeedbackTypes(stringBuilder, feedbackType); 701cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov stringBuilder.append(", "); 702cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov stringBuilder.append("notificationTimeout: ").append(notificationTimeout); 703cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov stringBuilder.append(", "); 704cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov appendFlags(stringBuilder, flags); 705cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov stringBuilder.append(", "); 706cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov stringBuilder.append("id: ").append(mId); 707cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov stringBuilder.append(", "); 708cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov stringBuilder.append("resolveInfo: ").append(mResolveInfo); 709cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov stringBuilder.append(", "); 710cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov stringBuilder.append("settingsActivityName: ").append(mSettingsActivityName); 711cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov stringBuilder.append(", "); 712688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav appendCapabilities(stringBuilder, mCapabilities); 713cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov return stringBuilder.toString(); 714cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov } 715cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov 716cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov private static void appendFeedbackTypes(StringBuilder stringBuilder, int feedbackTypes) { 717cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov stringBuilder.append("feedbackTypes:"); 718cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov stringBuilder.append("["); 719cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov while (feedbackTypes != 0) { 720cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov final int feedbackTypeBit = (1 << Integer.numberOfTrailingZeros(feedbackTypes)); 721cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov stringBuilder.append(feedbackTypeToString(feedbackTypeBit)); 722cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov feedbackTypes &= ~feedbackTypeBit; 723cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov if (feedbackTypes != 0) { 724cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov stringBuilder.append(", "); 725cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov } 726cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov } 727cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov stringBuilder.append("]"); 728cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov } 729cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov 730cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov private static void appendPackageNames(StringBuilder stringBuilder, String[] packageNames) { 731cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov stringBuilder.append("packageNames:"); 732cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov stringBuilder.append("["); 733cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov if (packageNames != null) { 734cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov final int packageNameCount = packageNames.length; 735cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov for (int i = 0; i < packageNameCount; i++) { 736cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov stringBuilder.append(packageNames[i]); 737cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov if (i < packageNameCount - 1) { 738cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov stringBuilder.append(", "); 739cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov } 740cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov } 741cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov } 742cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov stringBuilder.append("]"); 743cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov } 744cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov 745cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov private static void appendEventTypes(StringBuilder stringBuilder, int eventTypes) { 746cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov stringBuilder.append("eventTypes:"); 747cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov stringBuilder.append("["); 748cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov while (eventTypes != 0) { 749cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov final int eventTypeBit = (1 << Integer.numberOfTrailingZeros(eventTypes)); 750cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov stringBuilder.append(AccessibilityEvent.eventTypeToString(eventTypeBit)); 751cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov eventTypes &= ~eventTypeBit; 752cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov if (eventTypes != 0) { 753cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov stringBuilder.append(", "); 754cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov } 755cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov } 756cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov stringBuilder.append("]"); 757cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov } 758cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov 759cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov private static void appendFlags(StringBuilder stringBuilder, int flags) { 760cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov stringBuilder.append("flags:"); 761cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov stringBuilder.append("["); 762cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov while (flags != 0) { 763cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov final int flagBit = (1 << Integer.numberOfTrailingZeros(flags)); 764cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov stringBuilder.append(flagToString(flagBit)); 765cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov flags &= ~flagBit; 766cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov if (flags != 0) { 767cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov stringBuilder.append(", "); 768cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov } 769cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov } 770cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov stringBuilder.append("]"); 771cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov } 772cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov 773688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav private static void appendCapabilities(StringBuilder stringBuilder, int capabilities) { 774688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav stringBuilder.append("capabilities:"); 775688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav stringBuilder.append("["); 776688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav while (capabilities != 0) { 777688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav final int capabilityBit = (1 << Integer.numberOfTrailingZeros(capabilities)); 778688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav stringBuilder.append(capabilityToString(capabilityBit)); 779688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav capabilities &= ~capabilityBit; 780688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav if (capabilities != 0) { 781688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav stringBuilder.append(", "); 782688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav } 783688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav } 784688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav stringBuilder.append("]"); 785688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav } 786688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav 787cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov /** 788cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov * Returns the string representation of a feedback type. For example, 789cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov * {@link #FEEDBACK_SPOKEN} is represented by the string FEEDBACK_SPOKEN. 790cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov * 791cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov * @param feedbackType The feedback type. 792cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov * @return The string representation. 793cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov */ 794cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov public static String feedbackTypeToString(int feedbackType) { 795bb1b9ea8a488eec833b0be18c45dae8505876042Svetoslav Ganov StringBuilder builder = new StringBuilder(); 796bb1b9ea8a488eec833b0be18c45dae8505876042Svetoslav Ganov builder.append("["); 797c6c25f9e28a4de73261106a80ae098347524dd2aSvetoslav Ganov while (feedbackType != 0) { 798bb1b9ea8a488eec833b0be18c45dae8505876042Svetoslav Ganov final int feedbackTypeFlag = 1 << Integer.numberOfTrailingZeros(feedbackType); 799bb1b9ea8a488eec833b0be18c45dae8505876042Svetoslav Ganov feedbackType &= ~feedbackTypeFlag; 800bb1b9ea8a488eec833b0be18c45dae8505876042Svetoslav Ganov switch (feedbackTypeFlag) { 801bb1b9ea8a488eec833b0be18c45dae8505876042Svetoslav Ganov case FEEDBACK_AUDIBLE: 802c6c25f9e28a4de73261106a80ae098347524dd2aSvetoslav Ganov if (builder.length() > 1) { 803c6c25f9e28a4de73261106a80ae098347524dd2aSvetoslav Ganov builder.append(", "); 804c6c25f9e28a4de73261106a80ae098347524dd2aSvetoslav Ganov } 805bb1b9ea8a488eec833b0be18c45dae8505876042Svetoslav Ganov builder.append("FEEDBACK_AUDIBLE"); 806bb1b9ea8a488eec833b0be18c45dae8505876042Svetoslav Ganov break; 807bb1b9ea8a488eec833b0be18c45dae8505876042Svetoslav Ganov case FEEDBACK_HAPTIC: 808c6c25f9e28a4de73261106a80ae098347524dd2aSvetoslav Ganov if (builder.length() > 1) { 809c6c25f9e28a4de73261106a80ae098347524dd2aSvetoslav Ganov builder.append(", "); 810c6c25f9e28a4de73261106a80ae098347524dd2aSvetoslav Ganov } 811bb1b9ea8a488eec833b0be18c45dae8505876042Svetoslav Ganov builder.append("FEEDBACK_HAPTIC"); 812bb1b9ea8a488eec833b0be18c45dae8505876042Svetoslav Ganov break; 813bb1b9ea8a488eec833b0be18c45dae8505876042Svetoslav Ganov case FEEDBACK_GENERIC: 814c6c25f9e28a4de73261106a80ae098347524dd2aSvetoslav Ganov if (builder.length() > 1) { 815c6c25f9e28a4de73261106a80ae098347524dd2aSvetoslav Ganov builder.append(", "); 816c6c25f9e28a4de73261106a80ae098347524dd2aSvetoslav Ganov } 817bb1b9ea8a488eec833b0be18c45dae8505876042Svetoslav Ganov builder.append("FEEDBACK_GENERIC"); 818bb1b9ea8a488eec833b0be18c45dae8505876042Svetoslav Ganov break; 819bb1b9ea8a488eec833b0be18c45dae8505876042Svetoslav Ganov case FEEDBACK_SPOKEN: 820c6c25f9e28a4de73261106a80ae098347524dd2aSvetoslav Ganov if (builder.length() > 1) { 821c6c25f9e28a4de73261106a80ae098347524dd2aSvetoslav Ganov builder.append(", "); 822c6c25f9e28a4de73261106a80ae098347524dd2aSvetoslav Ganov } 823bb1b9ea8a488eec833b0be18c45dae8505876042Svetoslav Ganov builder.append("FEEDBACK_SPOKEN"); 824bb1b9ea8a488eec833b0be18c45dae8505876042Svetoslav Ganov break; 825bb1b9ea8a488eec833b0be18c45dae8505876042Svetoslav Ganov case FEEDBACK_VISUAL: 826c6c25f9e28a4de73261106a80ae098347524dd2aSvetoslav Ganov if (builder.length() > 1) { 827c6c25f9e28a4de73261106a80ae098347524dd2aSvetoslav Ganov builder.append(", "); 828c6c25f9e28a4de73261106a80ae098347524dd2aSvetoslav Ganov } 829bb1b9ea8a488eec833b0be18c45dae8505876042Svetoslav Ganov builder.append("FEEDBACK_VISUAL"); 830bb1b9ea8a488eec833b0be18c45dae8505876042Svetoslav Ganov break; 831eb9862fd4c6ba1745a0f6c997e85643a4ded0643Svetoslav Ganov case FEEDBACK_BRAILLE: 832eb9862fd4c6ba1745a0f6c997e85643a4ded0643Svetoslav Ganov if (builder.length() > 1) { 833eb9862fd4c6ba1745a0f6c997e85643a4ded0643Svetoslav Ganov builder.append(", "); 834eb9862fd4c6ba1745a0f6c997e85643a4ded0643Svetoslav Ganov } 835eb9862fd4c6ba1745a0f6c997e85643a4ded0643Svetoslav Ganov builder.append("FEEDBACK_BRAILLE"); 836eb9862fd4c6ba1745a0f6c997e85643a4ded0643Svetoslav Ganov break; 837bb1b9ea8a488eec833b0be18c45dae8505876042Svetoslav Ganov } 838cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov } 839bb1b9ea8a488eec833b0be18c45dae8505876042Svetoslav Ganov builder.append("]"); 840bb1b9ea8a488eec833b0be18c45dae8505876042Svetoslav Ganov return builder.toString(); 841cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov } 842cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov 843cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov /** 844cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov * Returns the string representation of a flag. For example, 845cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov * {@link #DEFAULT} is represented by the string DEFAULT. 846cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov * 847cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov * @param flag The flag. 848cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov * @return The string representation. 849cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov */ 850cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov public static String flagToString(int flag) { 851cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov switch (flag) { 852cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov case DEFAULT: 853cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov return "DEFAULT"; 8543ec2e1b94ab502bfa8d5e8750716108f69aa18d2Svetoslav Ganov case FLAG_INCLUDE_NOT_IMPORTANT_VIEWS: 8553ec2e1b94ab502bfa8d5e8750716108f69aa18d2Svetoslav Ganov return "FLAG_INCLUDE_NOT_IMPORTANT_VIEWS"; 8563ec2e1b94ab502bfa8d5e8750716108f69aa18d2Svetoslav Ganov case FLAG_REQUEST_TOUCH_EXPLORATION_MODE: 8573ec2e1b94ab502bfa8d5e8750716108f69aa18d2Svetoslav Ganov return "FLAG_REQUEST_TOUCH_EXPLORATION_MODE"; 858688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav case FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY: 859688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav return "FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY"; 860688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav case FLAG_REPORT_VIEW_IDS: 861688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav return "FLAG_REPORT_VIEW_IDS"; 862688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav case FLAG_REQUEST_FILTER_KEY_EVENTS: 863688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav return "FLAG_REQUEST_FILTER_KEY_EVENTS"; 864cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov default: 865cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov return null; 866cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov } 86775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov } 86875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov 86975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov /** 870688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav * Returns the string representation of a capability. For example, 871688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav * {@link #CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT} is represented 872688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav * by the string CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT. 873688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav * 874688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav * @param capability The capability. 875688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav * @return The string representation. 876688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav */ 877688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav public static String capabilityToString(int capability) { 878688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav switch (capability) { 879688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav case CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT: 880688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav return "CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT"; 881688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav case CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION: 882688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav return "CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION"; 883688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav case CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY: 884688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav return "CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY"; 885688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav case CAPABILITY_CAN_REQUEST_FILTER_KEY_EVENTS: 886688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav return "CAPABILITY_CAN_FILTER_KEY_EVENTS"; 887688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav default: 888688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav return "UNKNOWN"; 889688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav } 890688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav } 891688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav 892688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav /** 893688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav * @hide 894688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav * @return The list of {@link CapabilityInfo} objects. 895688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav */ 896688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav public List<CapabilityInfo> getCapabilityInfos() { 897688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav if (mCapabilities == 0) { 898688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav return Collections.emptyList(); 899688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav } 900688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav int capabilities = mCapabilities; 901688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav List<CapabilityInfo> capabilityInfos = new ArrayList<CapabilityInfo>(); 902688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav while (capabilities != 0) { 903688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav final int capabilityBit = 1 << Integer.numberOfTrailingZeros(capabilities); 904688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav capabilities &= ~capabilityBit; 905688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav CapabilityInfo capabilityInfo = sAvailableCapabilityInfos.get(capabilityBit); 906688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav if (capabilityInfo != null) { 907688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav capabilityInfos.add(capabilityInfo); 908688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav } 909688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav } 910688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav return capabilityInfos; 911688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav } 912688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav 913688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav /** 914688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav * @hide 915688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav */ 916688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav public static final class CapabilityInfo { 917688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav public final int capability; 918688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav public final int titleResId; 919688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav public final int descResId; 920688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav 921688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav public CapabilityInfo(int capability, int titleResId, int descResId) { 922688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav this.capability = capability; 923688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav this.titleResId = titleResId; 924688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav this.descResId = descResId; 925688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav } 926688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav } 927688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav 928688a6977cf7673ed0542ab3d839053c4e38a4dbdSvetoslav /** 92975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * @see Parcelable.Creator 93075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov */ 93175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov public static final Parcelable.Creator<AccessibilityServiceInfo> CREATOR = 93275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov new Parcelable.Creator<AccessibilityServiceInfo>() { 93375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov public AccessibilityServiceInfo createFromParcel(Parcel parcel) { 93475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov AccessibilityServiceInfo info = new AccessibilityServiceInfo(); 935cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov info.initFromParcel(parcel); 93675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov return info; 93775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov } 93875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov 93975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov public AccessibilityServiceInfo[] newArray(int size) { 94075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov return new AccessibilityServiceInfo[size]; 94175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov } 94275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov }; 94375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov} 944