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;
323d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganovimport android.util.TypedValue;
33cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganovimport android.util.Xml;
344213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganovimport android.view.View;
35cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganovimport android.view.accessibility.AccessibilityEvent;
36cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov
37cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganovimport org.xmlpull.v1.XmlPullParser;
38cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganovimport org.xmlpull.v1.XmlPullParserException;
39cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov
40cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganovimport java.io.IOException;
4175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
4275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov/**
4338e8b4e5bc3c93affdffbc064fd9db5aeccc3e8eSvetoslav Ganov * This class describes an {@link AccessibilityService}. The system notifies an
4438e8b4e5bc3c93affdffbc064fd9db5aeccc3e8eSvetoslav Ganov * {@link AccessibilityService} for {@link android.view.accessibility.AccessibilityEvent}s
4575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * according to the information encapsulated in this class.
4675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov *
47e1302edd40c5cc264f842e17e3796e0a11d6f045Joe Fernandez * <div class="special reference">
48e1302edd40c5cc264f842e17e3796e0a11d6f045Joe Fernandez * <h3>Developer Guides</h3>
49e1302edd40c5cc264f842e17e3796e0a11d6f045Joe Fernandez * <p>For more information about creating AccessibilityServices, read the
50e1302edd40c5cc264f842e17e3796e0a11d6f045Joe Fernandez * <a href="{@docRoot}guide/topics/ui/accessibility/index.html">Accessibility</a>
51e1302edd40c5cc264f842e17e3796e0a11d6f045Joe Fernandez * developer guide.</p>
52e1302edd40c5cc264f842e17e3796e0a11d6f045Joe Fernandez * </div>
53e1302edd40c5cc264f842e17e3796e0a11d6f045Joe Fernandez *
5475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * @see AccessibilityService
5575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * @see android.view.accessibility.AccessibilityEvent
5638e8b4e5bc3c93affdffbc064fd9db5aeccc3e8eSvetoslav Ganov * @see android.view.accessibility.AccessibilityManager
5775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov */
5875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovpublic class AccessibilityServiceInfo implements Parcelable {
5975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
60cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    private static final String TAG_ACCESSIBILITY_SERVICE = "accessibility-service";
61cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov
6275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /**
6375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * Denotes spoken feedback.
6475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
6575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    public static final int FEEDBACK_SPOKEN = 0x0000001;
6675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
6775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /**
6875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * Denotes haptic feedback.
6975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
7075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    public static final int FEEDBACK_HAPTIC =  0x0000002;
7175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
7275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /**
7375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * Denotes audible (not spoken) feedback.
7475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
7575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    public static final int FEEDBACK_AUDIBLE = 0x0000004;
7675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
7775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /**
7875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * Denotes visual feedback.
7975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
8075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    public static final int FEEDBACK_VISUAL = 0x0000008;
8175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
8275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /**
8375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * Denotes generic feedback.
8475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
8575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    public static final int FEEDBACK_GENERIC = 0x0000010;
8675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
8775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /**
88eb9862fd4c6ba1745a0f6c997e85643a4ded0643Svetoslav Ganov     * Denotes braille feedback.
89eb9862fd4c6ba1745a0f6c997e85643a4ded0643Svetoslav Ganov     */
90eb9862fd4c6ba1745a0f6c997e85643a4ded0643Svetoslav Ganov    public static final int FEEDBACK_BRAILLE = 0x0000020;
91eb9862fd4c6ba1745a0f6c997e85643a4ded0643Svetoslav Ganov
92eb9862fd4c6ba1745a0f6c997e85643a4ded0643Svetoslav Ganov    /**
9300aabf7d187bc05408199bd687a538b2e68bdc17Svetoslav Ganov     * Mask for all feedback types.
9400aabf7d187bc05408199bd687a538b2e68bdc17Svetoslav Ganov     *
9500aabf7d187bc05408199bd687a538b2e68bdc17Svetoslav Ganov     * @see #FEEDBACK_SPOKEN
9600aabf7d187bc05408199bd687a538b2e68bdc17Svetoslav Ganov     * @see #FEEDBACK_HAPTIC
9700aabf7d187bc05408199bd687a538b2e68bdc17Svetoslav Ganov     * @see #FEEDBACK_AUDIBLE
9800aabf7d187bc05408199bd687a538b2e68bdc17Svetoslav Ganov     * @see #FEEDBACK_VISUAL
9900aabf7d187bc05408199bd687a538b2e68bdc17Svetoslav Ganov     * @see #FEEDBACK_GENERIC
100eb9862fd4c6ba1745a0f6c997e85643a4ded0643Svetoslav Ganov     * @see #FEEDBACK_BRAILLE
10100aabf7d187bc05408199bd687a538b2e68bdc17Svetoslav Ganov     */
10200aabf7d187bc05408199bd687a538b2e68bdc17Svetoslav Ganov    public static final int FEEDBACK_ALL_MASK = 0xFFFFFFFF;
10300aabf7d187bc05408199bd687a538b2e68bdc17Svetoslav Ganov
10400aabf7d187bc05408199bd687a538b2e68bdc17Svetoslav Ganov    /**
10575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * If an {@link AccessibilityService} is the default for a given type.
10675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * Default service is invoked only if no package specific one exists. In case of
10775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * more than one package specific service only the earlier registered is notified.
10875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
10975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    public static final int DEFAULT = 0x0000001;
11075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
11175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /**
1124213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov     * If this flag is set the system will regard views that are not important
1134213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov     * for accessibility in addition to the ones that are important for accessibility.
1144213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov     * That is, views that are marked as not important for accessibility via
1154213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov     * {@link View#IMPORTANT_FOR_ACCESSIBILITY_NO} and views that are marked as
1164213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov     * potentially important for accessibility via
1174213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov     * {@link View#IMPORTANT_FOR_ACCESSIBILITY_AUTO} for which the system has determined
1184213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov     * that are not important for accessibility, are both reported while querying the
1194213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov     * window content and also the accessibility service will receive accessibility events
1204213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov     * from them.
1214213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov     * <p>
1224213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov     * <strong>Note:</strong> For accessibility services targeting API version
1234213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov     * {@link Build.VERSION_CODES#JELLY_BEAN} or higher this flag has to be explicitly
1244213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov     * set for the system to regard views that are not important for accessibility. For
1254213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov     * accessibility services targeting API version lower than
1264213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov     * {@link Build.VERSION_CODES#JELLY_BEAN} this flag is ignored and all views are
1274213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov     * regarded for accessibility purposes.
1284213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov     * </p>
1294213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov     * <p>
1304213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov     * Usually views not important for accessibility are layout managers that do not
1314213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov     * react to user actions, do not draw any content, and do not have any special
1324213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov     * semantics in the context of the screen content. For example, a three by three
1334213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov     * grid can be implemented as three horizontal linear layouts and one vertical,
1344213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov     * or three vertical linear layouts and one horizontal, or one grid layout, etc.
1354213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov     * In this context the actual layout mangers used to achieve the grid configuration
1364213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov     * are not important, rather it is important that there are nine evenly distributed
1374213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov     * elements.
1384213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov     * </p>
1394213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov     */
1403ec2e1b94ab502bfa8d5e8750716108f69aa18d2Svetoslav Ganov    public static final int FLAG_INCLUDE_NOT_IMPORTANT_VIEWS = 0x0000002;
1413ec2e1b94ab502bfa8d5e8750716108f69aa18d2Svetoslav Ganov
1423ec2e1b94ab502bfa8d5e8750716108f69aa18d2Svetoslav Ganov    /**
1433ec2e1b94ab502bfa8d5e8750716108f69aa18d2Svetoslav Ganov     * This flag requests that the system gets into touch exploration mode.
1443ec2e1b94ab502bfa8d5e8750716108f69aa18d2Svetoslav Ganov     * In this mode a single finger moving on the screen behaves as a mouse
1453ec2e1b94ab502bfa8d5e8750716108f69aa18d2Svetoslav Ganov     * pointer hovering over the user interface. The system will also detect
1463ec2e1b94ab502bfa8d5e8750716108f69aa18d2Svetoslav Ganov     * certain gestures performed on the touch screen and notify this service.
1473ec2e1b94ab502bfa8d5e8750716108f69aa18d2Svetoslav Ganov     * The system will enable touch exploration mode if there is at least one
1483ec2e1b94ab502bfa8d5e8750716108f69aa18d2Svetoslav Ganov     * accessibility service that has this flag set. Hence, clearing this
1493ec2e1b94ab502bfa8d5e8750716108f69aa18d2Svetoslav Ganov     * flag does not guarantee that the device will not be in touch exploration
1503ec2e1b94ab502bfa8d5e8750716108f69aa18d2Svetoslav Ganov     * mode since there may be another enabled service that requested it.
1513ec2e1b94ab502bfa8d5e8750716108f69aa18d2Svetoslav Ganov     */
1523ec2e1b94ab502bfa8d5e8750716108f69aa18d2Svetoslav Ganov    public static final int FLAG_REQUEST_TOUCH_EXPLORATION_MODE= 0x0000004;
1534213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov
1544213804541a8b05cd0587b138a2fd9a3b7fd9350Svetoslav Ganov    /**
15575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * The event types an {@link AccessibilityService} is interested in.
156cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * <p>
157cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     *   <strong>Can be dynamically set at runtime.</strong>
158cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * </p>
15975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * @see android.view.accessibility.AccessibilityEvent#TYPE_VIEW_CLICKED
1609b31779eab896bdcc0922473b183c979cc0b874fSvetoslav Ganov     * @see android.view.accessibility.AccessibilityEvent#TYPE_VIEW_LONG_CLICKED
16175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * @see android.view.accessibility.AccessibilityEvent#TYPE_VIEW_FOCUSED
16275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * @see android.view.accessibility.AccessibilityEvent#TYPE_VIEW_SELECTED
16375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * @see android.view.accessibility.AccessibilityEvent#TYPE_VIEW_TEXT_CHANGED
16475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * @see android.view.accessibility.AccessibilityEvent#TYPE_WINDOW_STATE_CHANGED
16575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * @see android.view.accessibility.AccessibilityEvent#TYPE_NOTIFICATION_STATE_CHANGED
16638e8b4e5bc3c93affdffbc064fd9db5aeccc3e8eSvetoslav Ganov     * @see android.view.accessibility.AccessibilityEvent#TYPE_TOUCH_EXPLORATION_GESTURE_START
16738e8b4e5bc3c93affdffbc064fd9db5aeccc3e8eSvetoslav Ganov     * @see android.view.accessibility.AccessibilityEvent#TYPE_TOUCH_EXPLORATION_GESTURE_END
16838e8b4e5bc3c93affdffbc064fd9db5aeccc3e8eSvetoslav Ganov     * @see android.view.accessibility.AccessibilityEvent#TYPE_VIEW_HOVER_ENTER
16938e8b4e5bc3c93affdffbc064fd9db5aeccc3e8eSvetoslav Ganov     * @see android.view.accessibility.AccessibilityEvent#TYPE_VIEW_HOVER_EXIT
17038e8b4e5bc3c93affdffbc064fd9db5aeccc3e8eSvetoslav Ganov     * @see android.view.accessibility.AccessibilityEvent#TYPE_VIEW_SCROLLED
17138e8b4e5bc3c93affdffbc064fd9db5aeccc3e8eSvetoslav Ganov     * @see android.view.accessibility.AccessibilityEvent#TYPE_VIEW_TEXT_SELECTION_CHANGED
17238e8b4e5bc3c93affdffbc064fd9db5aeccc3e8eSvetoslav Ganov     * @see android.view.accessibility.AccessibilityEvent#TYPE_WINDOW_CONTENT_CHANGED
17375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
17475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    public int eventTypes;
17575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
17675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /**
17775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * The package names an {@link AccessibilityService} is interested in. Setting
17838e8b4e5bc3c93affdffbc064fd9db5aeccc3e8eSvetoslav Ganov     * to <code>null</code> is equivalent to all packages.
179cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * <p>
180cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     *   <strong>Can be dynamically set at runtime.</strong>
181cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * </p>
18275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
18375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    public String[] packageNames;
18475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
18575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /**
18675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * The feedback type an {@link AccessibilityService} provides.
187cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * <p>
188cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     *   <strong>Can be dynamically set at runtime.</strong>
189cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * </p>
19075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * @see #FEEDBACK_AUDIBLE
19175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * @see #FEEDBACK_GENERIC
19275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * @see #FEEDBACK_HAPTIC
19375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * @see #FEEDBACK_SPOKEN
19475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * @see #FEEDBACK_VISUAL
195eb9862fd4c6ba1745a0f6c997e85643a4ded0643Svetoslav Ganov     * @see #FEEDBACK_BRAILLE
19675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
19775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    public int feedbackType;
19875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
19975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /**
20075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * The timeout after the most recent event of a given type before an
20175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * {@link AccessibilityService} is notified.
20275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * <p>
203cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     *   <strong>Can be dynamically set at runtime.</strong>.
204cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * </p>
205cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * <p>
20638e8b4e5bc3c93affdffbc064fd9db5aeccc3e8eSvetoslav Ganov     * <strong>Note:</strong> The event notification timeout is useful to avoid propagating
20738e8b4e5bc3c93affdffbc064fd9db5aeccc3e8eSvetoslav Ganov     *       events to the client too frequently since this is accomplished via an expensive
20838e8b4e5bc3c93affdffbc064fd9db5aeccc3e8eSvetoslav Ganov     *       interprocess call. One can think of the timeout as a criteria to determine when
20938e8b4e5bc3c93affdffbc064fd9db5aeccc3e8eSvetoslav Ganov     *       event generation has settled down.
21075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
21175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    public long notificationTimeout;
21275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
21375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /**
21475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * This field represents a set of flags used for configuring an
21575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * {@link AccessibilityService}.
216cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * <p>
217cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     *   <strong>Can be dynamically set at runtime.</strong>
218cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * </p>
21975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * @see #DEFAULT
2203ec2e1b94ab502bfa8d5e8750716108f69aa18d2Svetoslav Ganov     * @see #FLAG_INCLUDE_NOT_IMPORTANT_VIEWS
2213ec2e1b94ab502bfa8d5e8750716108f69aa18d2Svetoslav Ganov     * @see #FLAG_REQUEST_TOUCH_EXPLORATION_MODE
22275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
22375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    public int flags;
22475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
225cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    /**
226cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * The unique string Id to identify the accessibility service.
227cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     */
228cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    private String mId;
229cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov
230cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    /**
231cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * The Service that implements this accessibility service component.
232cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     */
233cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    private ResolveInfo mResolveInfo;
234cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov
235cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    /**
236cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * The accessibility service setting activity's name, used by the system
237cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * settings to launch the setting activity of this accessibility service.
238cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     */
239cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    private String mSettingsActivityName;
240cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov
241cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    /**
24238e8b4e5bc3c93affdffbc064fd9db5aeccc3e8eSvetoslav Ganov     * Flag whether this accessibility service can retrieve window content.
243cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     */
244cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    private boolean mCanRetrieveWindowContent;
245cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov
246cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    /**
2473d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov     * Resource id of the description of the accessibility service.
24835bfedeaba724aeadc6f6c890269cb6bf7ef42f5Svetoslav Ganov     */
2493d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov    private int mDescriptionResId;
2503d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov
2513d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov    /**
2523d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov     * Non localized description of the accessibility service.
2533d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov     */
2543d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov    private String mNonLocalizedDescription;
25535bfedeaba724aeadc6f6c890269cb6bf7ef42f5Svetoslav Ganov
25635bfedeaba724aeadc6f6c890269cb6bf7ef42f5Svetoslav Ganov    /**
257cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * Creates a new instance.
258cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     */
259cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    public AccessibilityServiceInfo() {
260cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        /* do nothing */
261cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    }
262cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov
263cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    /**
264cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * Creates a new instance.
265cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     *
266cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * @param resolveInfo The service resolve info.
267cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * @param context Context for accessing resources.
268cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * @throws XmlPullParserException If a XML parsing error occurs.
269cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * @throws IOException If a XML parsing error occurs.
270cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     *
271cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * @hide
272cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     */
273cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    public AccessibilityServiceInfo(ResolveInfo resolveInfo, Context context)
274cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            throws XmlPullParserException, IOException {
275cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        ServiceInfo serviceInfo = resolveInfo.serviceInfo;
276cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        mId = new ComponentName(serviceInfo.packageName, serviceInfo.name).flattenToShortString();
277cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        mResolveInfo = resolveInfo;
278cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov
279cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        XmlResourceParser parser = null;
280cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov
281cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        try {
282cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            PackageManager packageManager = context.getPackageManager();
283cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            parser = serviceInfo.loadXmlMetaData(packageManager,
284cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov                    AccessibilityService.SERVICE_META_DATA);
285cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            if (parser == null) {
286cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov                return;
287cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            }
288cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov
289cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            int type = 0;
290cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            while (type != XmlPullParser.END_DOCUMENT && type != XmlPullParser.START_TAG) {
291cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov                type = parser.next();
292cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            }
293cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov
294cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            String nodeName = parser.getName();
295cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            if (!TAG_ACCESSIBILITY_SERVICE.equals(nodeName)) {
296cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov                throw new XmlPullParserException( "Meta-data does not start with"
297cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov                        + TAG_ACCESSIBILITY_SERVICE + " tag");
298cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            }
299cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov
300cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            AttributeSet allAttributes = Xml.asAttributeSet(parser);
301cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            Resources resources = packageManager.getResourcesForApplication(
302cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov                    serviceInfo.applicationInfo);
303cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            TypedArray asAttributes = resources.obtainAttributes(allAttributes,
304cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov                    com.android.internal.R.styleable.AccessibilityService);
305cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            eventTypes = asAttributes.getInt(
306cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov                    com.android.internal.R.styleable.AccessibilityService_accessibilityEventTypes,
307cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov                    0);
308cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            String packageNamez = asAttributes.getString(
309cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov                    com.android.internal.R.styleable.AccessibilityService_packageNames);
310cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            if (packageNamez != null) {
311cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov                packageNames = packageNamez.split("(\\s)*,(\\s)*");
312cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            }
313cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            feedbackType = asAttributes.getInt(
314cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov                    com.android.internal.R.styleable.AccessibilityService_accessibilityFeedbackType,
315cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov                    0);
316cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            notificationTimeout = asAttributes.getInt(
317cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov                    com.android.internal.R.styleable.AccessibilityService_notificationTimeout,
318cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov                    0);
319cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            flags = asAttributes.getInt(
320cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov                    com.android.internal.R.styleable.AccessibilityService_accessibilityFlags, 0);
321cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            mSettingsActivityName = asAttributes.getString(
322cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov                    com.android.internal.R.styleable.AccessibilityService_settingsActivity);
323cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            mCanRetrieveWindowContent = asAttributes.getBoolean(
324cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov                    com.android.internal.R.styleable.AccessibilityService_canRetrieveWindowContent,
325cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov                    false);
3263d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov            TypedValue peekedValue = asAttributes.peekValue(
32735bfedeaba724aeadc6f6c890269cb6bf7ef42f5Svetoslav Ganov                    com.android.internal.R.styleable.AccessibilityService_description);
3283d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov            if (peekedValue != null) {
3293d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov                mDescriptionResId = peekedValue.resourceId;
3303d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov                CharSequence nonLocalizedDescription = peekedValue.coerceToString();
3313d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov                if (nonLocalizedDescription != null) {
3323d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov                    mNonLocalizedDescription = nonLocalizedDescription.toString().trim();
3333d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov                }
3343d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov            }
335cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            asAttributes.recycle();
336cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        } catch (NameNotFoundException e) {
337cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            throw new XmlPullParserException( "Unable to create context for: "
338cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov                    + serviceInfo.packageName);
339cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        } finally {
340cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            if (parser != null) {
341cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov                parser.close();
342cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            }
343cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        }
344cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    }
345cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov
346cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    /**
347cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * Updates the properties that an AccessibilitySerivice can change dynamically.
348cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     *
349cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * @param other The info from which to update the properties.
350cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     *
351cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * @hide
352cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     */
353cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    public void updateDynamicallyConfigurableProperties(AccessibilityServiceInfo other) {
354cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        eventTypes = other.eventTypes;
355cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        packageNames = other.packageNames;
356cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        feedbackType = other.feedbackType;
357cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        notificationTimeout = other.notificationTimeout;
358cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        flags = other.flags;
359cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    }
360cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov
361cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    /**
362cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * The accessibility service id.
363cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * <p>
364cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     *   <strong>Generated by the system.</strong>
365cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * </p>
366cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * @return The id.
367cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     */
368cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    public String getId() {
369cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        return mId;
370cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    }
371cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov
372cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    /**
373cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * The service {@link ResolveInfo}.
374cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * <p>
375cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     *   <strong>Generated by the system.</strong>
376cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * </p>
377cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * @return The info.
378cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     */
379cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    public ResolveInfo getResolveInfo() {
380cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        return mResolveInfo;
381cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    }
382cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov
383cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    /**
384cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * The settings activity name.
385cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * <p>
386cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     *    <strong>Statically set from
387cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     *    {@link AccessibilityService#SERVICE_META_DATA meta-data}.</strong>
388cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * </p>
389cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * @return The settings activity name.
390cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     */
391cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    public String getSettingsActivityName() {
392cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        return mSettingsActivityName;
393cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    }
394cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov
395cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    /**
39638e8b4e5bc3c93affdffbc064fd9db5aeccc3e8eSvetoslav Ganov     * Whether this service can retrieve the current window's content.
397cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * <p>
398cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     *    <strong>Statically set from
399cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     *    {@link AccessibilityService#SERVICE_META_DATA meta-data}.</strong>
400cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * </p>
401fefd20e927b7252d63acb7bb1852c5188e3c1b2eSvetoslav Ganov     * @return True if window content can be retrieved.
402cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     */
403cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    public boolean getCanRetrieveWindowContent() {
404cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        return mCanRetrieveWindowContent;
405cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    }
406cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov
407cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    /**
4083d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov     * Gets the non-localized description of the accessibility service.
40935bfedeaba724aeadc6f6c890269cb6bf7ef42f5Svetoslav Ganov     * <p>
41035bfedeaba724aeadc6f6c890269cb6bf7ef42f5Svetoslav Ganov     *    <strong>Statically set from
41135bfedeaba724aeadc6f6c890269cb6bf7ef42f5Svetoslav Ganov     *    {@link AccessibilityService#SERVICE_META_DATA meta-data}.</strong>
41235bfedeaba724aeadc6f6c890269cb6bf7ef42f5Svetoslav Ganov     * </p>
41335bfedeaba724aeadc6f6c890269cb6bf7ef42f5Svetoslav Ganov     * @return The description.
4143d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov     *
4153d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov     * @deprecated Use {@link #loadDescription(PackageManager)}.
41635bfedeaba724aeadc6f6c890269cb6bf7ef42f5Svetoslav Ganov     */
41735bfedeaba724aeadc6f6c890269cb6bf7ef42f5Svetoslav Ganov    public String getDescription() {
4183d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov        return mNonLocalizedDescription;
4193d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov    }
4203d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov
4213d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov    /**
4223d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov     * The localized description of the accessibility service.
4233d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov     * <p>
4243d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov     *    <strong>Statically set from
4253d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov     *    {@link AccessibilityService#SERVICE_META_DATA meta-data}.</strong>
4263d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov     * </p>
4273d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov     * @return The localized description.
4283d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov     */
4293d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov    public String loadDescription(PackageManager packageManager) {
4303d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov        if (mDescriptionResId == 0) {
4313d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov            return mNonLocalizedDescription;
4323d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov        }
4333d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov        ServiceInfo serviceInfo = mResolveInfo.serviceInfo;
4343d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov        CharSequence description = packageManager.getText(serviceInfo.packageName,
4353d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov                mDescriptionResId, serviceInfo.applicationInfo);
4363d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov        if (description != null) {
4373d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov            return description.toString().trim();
4383d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov        }
4393d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov        return null;
44035bfedeaba724aeadc6f6c890269cb6bf7ef42f5Svetoslav Ganov    }
44135bfedeaba724aeadc6f6c890269cb6bf7ef42f5Svetoslav Ganov
44235bfedeaba724aeadc6f6c890269cb6bf7ef42f5Svetoslav Ganov    /**
443cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * {@inheritDoc}
444cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     */
44575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    public int describeContents() {
44675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        return 0;
44775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    }
44875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
4499b31779eab896bdcc0922473b183c979cc0b874fSvetoslav Ganov    public void writeToParcel(Parcel parcel, int flagz) {
45075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        parcel.writeInt(eventTypes);
45175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        parcel.writeStringArray(packageNames);
45275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        parcel.writeInt(feedbackType);
45375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        parcel.writeLong(notificationTimeout);
45475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        parcel.writeInt(flags);
455cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        parcel.writeString(mId);
456cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        parcel.writeParcelable(mResolveInfo, 0);
457cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        parcel.writeString(mSettingsActivityName);
458cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        parcel.writeInt(mCanRetrieveWindowContent ? 1 : 0);
4593d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov        parcel.writeInt(mDescriptionResId);
4603d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov        parcel.writeString(mNonLocalizedDescription);
461cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    }
462cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov
463cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    private void initFromParcel(Parcel parcel) {
464cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        eventTypes = parcel.readInt();
465cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        packageNames = parcel.readStringArray();
466cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        feedbackType = parcel.readInt();
467cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        notificationTimeout = parcel.readLong();
468cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        flags = parcel.readInt();
469cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        mId = parcel.readString();
470cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        mResolveInfo = parcel.readParcelable(null);
471cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        mSettingsActivityName = parcel.readString();
472cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        mCanRetrieveWindowContent = (parcel.readInt() == 1);
4733d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov        mDescriptionResId = parcel.readInt();
4743d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov        mNonLocalizedDescription = parcel.readString();
475cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    }
476cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov
477cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    @Override
478cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    public String toString() {
479cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        StringBuilder stringBuilder = new StringBuilder();
480cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        appendEventTypes(stringBuilder, eventTypes);
481cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        stringBuilder.append(", ");
482cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        appendPackageNames(stringBuilder, packageNames);
483cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        stringBuilder.append(", ");
484cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        appendFeedbackTypes(stringBuilder, feedbackType);
485cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        stringBuilder.append(", ");
486cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        stringBuilder.append("notificationTimeout: ").append(notificationTimeout);
487cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        stringBuilder.append(", ");
488cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        appendFlags(stringBuilder, flags);
489cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        stringBuilder.append(", ");
490cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        stringBuilder.append("id: ").append(mId);
491cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        stringBuilder.append(", ");
492cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        stringBuilder.append("resolveInfo: ").append(mResolveInfo);
493cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        stringBuilder.append(", ");
494cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        stringBuilder.append("settingsActivityName: ").append(mSettingsActivityName);
495cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        stringBuilder.append(", ");
496cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        stringBuilder.append("retrieveScreenContent: ").append(mCanRetrieveWindowContent);
497cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        return stringBuilder.toString();
498cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    }
499cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov
500cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    private static void appendFeedbackTypes(StringBuilder stringBuilder, int feedbackTypes) {
501cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        stringBuilder.append("feedbackTypes:");
502cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        stringBuilder.append("[");
503cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        while (feedbackTypes != 0) {
504cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            final int feedbackTypeBit = (1 << Integer.numberOfTrailingZeros(feedbackTypes));
505cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            stringBuilder.append(feedbackTypeToString(feedbackTypeBit));
506cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            feedbackTypes &= ~feedbackTypeBit;
507cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            if (feedbackTypes != 0) {
508cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov                stringBuilder.append(", ");
509cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            }
510cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        }
511cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        stringBuilder.append("]");
512cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    }
513cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov
514cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    private static void appendPackageNames(StringBuilder stringBuilder, String[] packageNames) {
515cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        stringBuilder.append("packageNames:");
516cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        stringBuilder.append("[");
517cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        if (packageNames != null) {
518cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            final int packageNameCount = packageNames.length;
519cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            for (int i = 0; i < packageNameCount; i++) {
520cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov                stringBuilder.append(packageNames[i]);
521cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov                if (i < packageNameCount - 1) {
522cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov                    stringBuilder.append(", ");
523cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov                }
524cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            }
525cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        }
526cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        stringBuilder.append("]");
527cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    }
528cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov
529cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    private static void appendEventTypes(StringBuilder stringBuilder, int eventTypes) {
530cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        stringBuilder.append("eventTypes:");
531cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        stringBuilder.append("[");
532cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        while (eventTypes != 0) {
533cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            final int eventTypeBit = (1 << Integer.numberOfTrailingZeros(eventTypes));
534cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            stringBuilder.append(AccessibilityEvent.eventTypeToString(eventTypeBit));
535cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            eventTypes &= ~eventTypeBit;
536cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            if (eventTypes != 0) {
537cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov                stringBuilder.append(", ");
538cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            }
539cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        }
540cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        stringBuilder.append("]");
541cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    }
542cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov
543cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    private static void appendFlags(StringBuilder stringBuilder, int flags) {
544cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        stringBuilder.append("flags:");
545cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        stringBuilder.append("[");
546cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        while (flags != 0) {
547cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            final int flagBit = (1 << Integer.numberOfTrailingZeros(flags));
548cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            stringBuilder.append(flagToString(flagBit));
549cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            flags &= ~flagBit;
550cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            if (flags != 0) {
551cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov                stringBuilder.append(", ");
552cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            }
553cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        }
554cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        stringBuilder.append("]");
555cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    }
556cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov
557cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    /**
558cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * Returns the string representation of a feedback type. For example,
559cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * {@link #FEEDBACK_SPOKEN} is represented by the string FEEDBACK_SPOKEN.
560cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     *
561cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * @param feedbackType The feedback type.
562cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * @return The string representation.
563cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     */
564cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    public static String feedbackTypeToString(int feedbackType) {
565bb1b9ea8a488eec833b0be18c45dae8505876042Svetoslav Ganov        StringBuilder builder = new StringBuilder();
566bb1b9ea8a488eec833b0be18c45dae8505876042Svetoslav Ganov        builder.append("[");
567c6c25f9e28a4de73261106a80ae098347524dd2aSvetoslav Ganov        while (feedbackType != 0) {
568bb1b9ea8a488eec833b0be18c45dae8505876042Svetoslav Ganov            final int feedbackTypeFlag = 1 << Integer.numberOfTrailingZeros(feedbackType);
569bb1b9ea8a488eec833b0be18c45dae8505876042Svetoslav Ganov            feedbackType &= ~feedbackTypeFlag;
570bb1b9ea8a488eec833b0be18c45dae8505876042Svetoslav Ganov            switch (feedbackTypeFlag) {
571bb1b9ea8a488eec833b0be18c45dae8505876042Svetoslav Ganov                case FEEDBACK_AUDIBLE:
572c6c25f9e28a4de73261106a80ae098347524dd2aSvetoslav Ganov                    if (builder.length() > 1) {
573c6c25f9e28a4de73261106a80ae098347524dd2aSvetoslav Ganov                        builder.append(", ");
574c6c25f9e28a4de73261106a80ae098347524dd2aSvetoslav Ganov                    }
575bb1b9ea8a488eec833b0be18c45dae8505876042Svetoslav Ganov                    builder.append("FEEDBACK_AUDIBLE");
576bb1b9ea8a488eec833b0be18c45dae8505876042Svetoslav Ganov                    break;
577bb1b9ea8a488eec833b0be18c45dae8505876042Svetoslav Ganov                case FEEDBACK_HAPTIC:
578c6c25f9e28a4de73261106a80ae098347524dd2aSvetoslav Ganov                    if (builder.length() > 1) {
579c6c25f9e28a4de73261106a80ae098347524dd2aSvetoslav Ganov                        builder.append(", ");
580c6c25f9e28a4de73261106a80ae098347524dd2aSvetoslav Ganov                    }
581bb1b9ea8a488eec833b0be18c45dae8505876042Svetoslav Ganov                    builder.append("FEEDBACK_HAPTIC");
582bb1b9ea8a488eec833b0be18c45dae8505876042Svetoslav Ganov                    break;
583bb1b9ea8a488eec833b0be18c45dae8505876042Svetoslav Ganov                case FEEDBACK_GENERIC:
584c6c25f9e28a4de73261106a80ae098347524dd2aSvetoslav Ganov                    if (builder.length() > 1) {
585c6c25f9e28a4de73261106a80ae098347524dd2aSvetoslav Ganov                        builder.append(", ");
586c6c25f9e28a4de73261106a80ae098347524dd2aSvetoslav Ganov                    }
587bb1b9ea8a488eec833b0be18c45dae8505876042Svetoslav Ganov                    builder.append("FEEDBACK_GENERIC");
588bb1b9ea8a488eec833b0be18c45dae8505876042Svetoslav Ganov                    break;
589bb1b9ea8a488eec833b0be18c45dae8505876042Svetoslav Ganov                case FEEDBACK_SPOKEN:
590c6c25f9e28a4de73261106a80ae098347524dd2aSvetoslav Ganov                    if (builder.length() > 1) {
591c6c25f9e28a4de73261106a80ae098347524dd2aSvetoslav Ganov                        builder.append(", ");
592c6c25f9e28a4de73261106a80ae098347524dd2aSvetoslav Ganov                    }
593bb1b9ea8a488eec833b0be18c45dae8505876042Svetoslav Ganov                    builder.append("FEEDBACK_SPOKEN");
594bb1b9ea8a488eec833b0be18c45dae8505876042Svetoslav Ganov                    break;
595bb1b9ea8a488eec833b0be18c45dae8505876042Svetoslav Ganov                case FEEDBACK_VISUAL:
596c6c25f9e28a4de73261106a80ae098347524dd2aSvetoslav Ganov                    if (builder.length() > 1) {
597c6c25f9e28a4de73261106a80ae098347524dd2aSvetoslav Ganov                        builder.append(", ");
598c6c25f9e28a4de73261106a80ae098347524dd2aSvetoslav Ganov                    }
599bb1b9ea8a488eec833b0be18c45dae8505876042Svetoslav Ganov                    builder.append("FEEDBACK_VISUAL");
600bb1b9ea8a488eec833b0be18c45dae8505876042Svetoslav Ganov                    break;
601eb9862fd4c6ba1745a0f6c997e85643a4ded0643Svetoslav Ganov                case FEEDBACK_BRAILLE:
602eb9862fd4c6ba1745a0f6c997e85643a4ded0643Svetoslav Ganov                    if (builder.length() > 1) {
603eb9862fd4c6ba1745a0f6c997e85643a4ded0643Svetoslav Ganov                        builder.append(", ");
604eb9862fd4c6ba1745a0f6c997e85643a4ded0643Svetoslav Ganov                    }
605eb9862fd4c6ba1745a0f6c997e85643a4ded0643Svetoslav Ganov                    builder.append("FEEDBACK_BRAILLE");
606eb9862fd4c6ba1745a0f6c997e85643a4ded0643Svetoslav Ganov                    break;
607bb1b9ea8a488eec833b0be18c45dae8505876042Svetoslav Ganov            }
608cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        }
609bb1b9ea8a488eec833b0be18c45dae8505876042Svetoslav Ganov        builder.append("]");
610bb1b9ea8a488eec833b0be18c45dae8505876042Svetoslav Ganov        return builder.toString();
611cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    }
612cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov
613cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    /**
614cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * Returns the string representation of a flag. For example,
615cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * {@link #DEFAULT} is represented by the string DEFAULT.
616cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     *
617cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * @param flag The flag.
618cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * @return The string representation.
619cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     */
620cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    public static String flagToString(int flag) {
621cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        switch (flag) {
622cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            case DEFAULT:
623cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov                return "DEFAULT";
6243ec2e1b94ab502bfa8d5e8750716108f69aa18d2Svetoslav Ganov            case FLAG_INCLUDE_NOT_IMPORTANT_VIEWS:
6253ec2e1b94ab502bfa8d5e8750716108f69aa18d2Svetoslav Ganov                return "FLAG_INCLUDE_NOT_IMPORTANT_VIEWS";
6263ec2e1b94ab502bfa8d5e8750716108f69aa18d2Svetoslav Ganov            case FLAG_REQUEST_TOUCH_EXPLORATION_MODE:
6273ec2e1b94ab502bfa8d5e8750716108f69aa18d2Svetoslav Ganov                return "FLAG_REQUEST_TOUCH_EXPLORATION_MODE";
628cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            default:
629cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov                return null;
630cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        }
63175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    }
63275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
63375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /**
63475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * @see Parcelable.Creator
63575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
63675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    public static final Parcelable.Creator<AccessibilityServiceInfo> CREATOR =
63775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov            new Parcelable.Creator<AccessibilityServiceInfo>() {
63875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        public AccessibilityServiceInfo createFromParcel(Parcel parcel) {
63975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov            AccessibilityServiceInfo info = new AccessibilityServiceInfo();
640cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            info.initFromParcel(parcel);
64175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov            return info;
64275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        }
64375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
64475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        public AccessibilityServiceInfo[] newArray(int size) {
64575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov            return new AccessibilityServiceInfo[size];
64675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        }
64775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    };
64875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov}
649