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