AccessibilityServiceInfo.java revision c6c25f9e28a4de73261106a80ae098347524dd2a
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;
2875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.os.Parcel;
2975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.os.Parcelable;
30cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganovimport android.util.AttributeSet;
313d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganovimport android.util.TypedValue;
32cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganovimport android.util.Xml;
33cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganovimport android.view.accessibility.AccessibilityEvent;
34cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov
35cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganovimport org.xmlpull.v1.XmlPullParser;
36cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganovimport org.xmlpull.v1.XmlPullParserException;
37cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov
38cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganovimport java.io.IOException;
3975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
4075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov/**
4138e8b4e5bc3c93affdffbc064fd9db5aeccc3e8eSvetoslav Ganov * This class describes an {@link AccessibilityService}. The system notifies an
4238e8b4e5bc3c93affdffbc064fd9db5aeccc3e8eSvetoslav Ganov * {@link AccessibilityService} for {@link android.view.accessibility.AccessibilityEvent}s
4375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * according to the information encapsulated in this class.
4475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov *
4575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * @see AccessibilityService
4675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * @see android.view.accessibility.AccessibilityEvent
4738e8b4e5bc3c93affdffbc064fd9db5aeccc3e8eSvetoslav Ganov * @see android.view.accessibility.AccessibilityManager
4875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov */
4975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovpublic class AccessibilityServiceInfo implements Parcelable {
5075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
51cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    private static final String TAG_ACCESSIBILITY_SERVICE = "accessibility-service";
52cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov
5375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /**
5475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * Denotes spoken feedback.
5575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
5675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    public static final int FEEDBACK_SPOKEN = 0x0000001;
5775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
5875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /**
5975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * Denotes haptic feedback.
6075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
6175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    public static final int FEEDBACK_HAPTIC =  0x0000002;
6275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
6375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /**
6475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * Denotes audible (not spoken) feedback.
6575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
6675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    public static final int FEEDBACK_AUDIBLE = 0x0000004;
6775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
6875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /**
6975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * Denotes visual feedback.
7075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
7175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    public static final int FEEDBACK_VISUAL = 0x0000008;
7275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
7375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /**
7475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * Denotes generic feedback.
7575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
7675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    public static final int FEEDBACK_GENERIC = 0x0000010;
7775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
7875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /**
7900aabf7d187bc05408199bd687a538b2e68bdc17Svetoslav Ganov     * Mask for all feedback types.
8000aabf7d187bc05408199bd687a538b2e68bdc17Svetoslav Ganov     *
8100aabf7d187bc05408199bd687a538b2e68bdc17Svetoslav Ganov     * @see #FEEDBACK_SPOKEN
8200aabf7d187bc05408199bd687a538b2e68bdc17Svetoslav Ganov     * @see #FEEDBACK_HAPTIC
8300aabf7d187bc05408199bd687a538b2e68bdc17Svetoslav Ganov     * @see #FEEDBACK_AUDIBLE
8400aabf7d187bc05408199bd687a538b2e68bdc17Svetoslav Ganov     * @see #FEEDBACK_VISUAL
8500aabf7d187bc05408199bd687a538b2e68bdc17Svetoslav Ganov     * @see #FEEDBACK_GENERIC
8600aabf7d187bc05408199bd687a538b2e68bdc17Svetoslav Ganov     */
8700aabf7d187bc05408199bd687a538b2e68bdc17Svetoslav Ganov    public static final int FEEDBACK_ALL_MASK = 0xFFFFFFFF;
8800aabf7d187bc05408199bd687a538b2e68bdc17Svetoslav Ganov
8900aabf7d187bc05408199bd687a538b2e68bdc17Svetoslav Ganov    /**
9075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * If an {@link AccessibilityService} is the default for a given type.
9175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * Default service is invoked only if no package specific one exists. In case of
9275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * more than one package specific service only the earlier registered is notified.
9375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
9475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    public static final int DEFAULT = 0x0000001;
9575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
9675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /**
9775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * The event types an {@link AccessibilityService} is interested in.
98cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * <p>
99cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     *   <strong>Can be dynamically set at runtime.</strong>
100cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * </p>
10175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * @see android.view.accessibility.AccessibilityEvent#TYPE_VIEW_CLICKED
1029b31779eab896bdcc0922473b183c979cc0b874fSvetoslav Ganov     * @see android.view.accessibility.AccessibilityEvent#TYPE_VIEW_LONG_CLICKED
10375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * @see android.view.accessibility.AccessibilityEvent#TYPE_VIEW_FOCUSED
10475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * @see android.view.accessibility.AccessibilityEvent#TYPE_VIEW_SELECTED
10575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * @see android.view.accessibility.AccessibilityEvent#TYPE_VIEW_TEXT_CHANGED
10675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * @see android.view.accessibility.AccessibilityEvent#TYPE_WINDOW_STATE_CHANGED
10775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * @see android.view.accessibility.AccessibilityEvent#TYPE_NOTIFICATION_STATE_CHANGED
10838e8b4e5bc3c93affdffbc064fd9db5aeccc3e8eSvetoslav Ganov     * @see android.view.accessibility.AccessibilityEvent#TYPE_TOUCH_EXPLORATION_GESTURE_START
10938e8b4e5bc3c93affdffbc064fd9db5aeccc3e8eSvetoslav Ganov     * @see android.view.accessibility.AccessibilityEvent#TYPE_TOUCH_EXPLORATION_GESTURE_END
11038e8b4e5bc3c93affdffbc064fd9db5aeccc3e8eSvetoslav Ganov     * @see android.view.accessibility.AccessibilityEvent#TYPE_VIEW_HOVER_ENTER
11138e8b4e5bc3c93affdffbc064fd9db5aeccc3e8eSvetoslav Ganov     * @see android.view.accessibility.AccessibilityEvent#TYPE_VIEW_HOVER_EXIT
11238e8b4e5bc3c93affdffbc064fd9db5aeccc3e8eSvetoslav Ganov     * @see android.view.accessibility.AccessibilityEvent#TYPE_VIEW_SCROLLED
11338e8b4e5bc3c93affdffbc064fd9db5aeccc3e8eSvetoslav Ganov     * @see android.view.accessibility.AccessibilityEvent#TYPE_VIEW_TEXT_SELECTION_CHANGED
11438e8b4e5bc3c93affdffbc064fd9db5aeccc3e8eSvetoslav Ganov     * @see android.view.accessibility.AccessibilityEvent#TYPE_WINDOW_CONTENT_CHANGED
11575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
11675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    public int eventTypes;
11775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
11875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /**
11975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * The package names an {@link AccessibilityService} is interested in. Setting
12038e8b4e5bc3c93affdffbc064fd9db5aeccc3e8eSvetoslav Ganov     * to <code>null</code> is equivalent to all packages.
121cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * <p>
122cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     *   <strong>Can be dynamically set at runtime.</strong>
123cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * </p>
12475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
12575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    public String[] packageNames;
12675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
12775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /**
12875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * The feedback type an {@link AccessibilityService} provides.
129cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * <p>
130cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     *   <strong>Can be dynamically set at runtime.</strong>
131cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * </p>
13275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * @see #FEEDBACK_AUDIBLE
13375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * @see #FEEDBACK_GENERIC
13475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * @see #FEEDBACK_HAPTIC
13575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * @see #FEEDBACK_SPOKEN
13675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * @see #FEEDBACK_VISUAL
13775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
13875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    public int feedbackType;
13975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
14075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /**
14175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * The timeout after the most recent event of a given type before an
14275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * {@link AccessibilityService} is notified.
14375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * <p>
144cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     *   <strong>Can be dynamically set at runtime.</strong>.
145cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * </p>
146cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * <p>
14738e8b4e5bc3c93affdffbc064fd9db5aeccc3e8eSvetoslav Ganov     * <strong>Note:</strong> The event notification timeout is useful to avoid propagating
14838e8b4e5bc3c93affdffbc064fd9db5aeccc3e8eSvetoslav Ganov     *       events to the client too frequently since this is accomplished via an expensive
14938e8b4e5bc3c93affdffbc064fd9db5aeccc3e8eSvetoslav Ganov     *       interprocess call. One can think of the timeout as a criteria to determine when
15038e8b4e5bc3c93affdffbc064fd9db5aeccc3e8eSvetoslav Ganov     *       event generation has settled down.
15175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
15275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    public long notificationTimeout;
15375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
15475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /**
15575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * This field represents a set of flags used for configuring an
15675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * {@link AccessibilityService}.
157cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * <p>
158cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     *   <strong>Can be dynamically set at runtime.</strong>
159cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * </p>
16075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * @see #DEFAULT
16175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
16275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    public int flags;
16375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
164cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    /**
165cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * The unique string Id to identify the accessibility service.
166cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     */
167cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    private String mId;
168cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov
169cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    /**
170cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * The Service that implements this accessibility service component.
171cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     */
172cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    private ResolveInfo mResolveInfo;
173cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov
174cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    /**
175cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * The accessibility service setting activity's name, used by the system
176cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * settings to launch the setting activity of this accessibility service.
177cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     */
178cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    private String mSettingsActivityName;
179cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov
180cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    /**
18138e8b4e5bc3c93affdffbc064fd9db5aeccc3e8eSvetoslav Ganov     * Flag whether this accessibility service can retrieve window content.
182cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     */
183cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    private boolean mCanRetrieveWindowContent;
184cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov
185cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    /**
1863d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov     * Resource id of the description of the accessibility service.
18735bfedeaba724aeadc6f6c890269cb6bf7ef42f5Svetoslav Ganov     */
1883d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov    private int mDescriptionResId;
1893d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov
1903d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov    /**
1913d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov     * Non localized description of the accessibility service.
1923d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov     */
1933d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov    private String mNonLocalizedDescription;
19435bfedeaba724aeadc6f6c890269cb6bf7ef42f5Svetoslav Ganov
19535bfedeaba724aeadc6f6c890269cb6bf7ef42f5Svetoslav Ganov    /**
196cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * Creates a new instance.
197cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     */
198cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    public AccessibilityServiceInfo() {
199cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        /* do nothing */
200cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    }
201cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov
202cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    /**
203cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * Creates a new instance.
204cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     *
205cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * @param resolveInfo The service resolve info.
206cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * @param context Context for accessing resources.
207cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * @throws XmlPullParserException If a XML parsing error occurs.
208cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * @throws IOException If a XML parsing error occurs.
209cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     *
210cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * @hide
211cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     */
212cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    public AccessibilityServiceInfo(ResolveInfo resolveInfo, Context context)
213cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            throws XmlPullParserException, IOException {
214cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        ServiceInfo serviceInfo = resolveInfo.serviceInfo;
215cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        mId = new ComponentName(serviceInfo.packageName, serviceInfo.name).flattenToShortString();
216cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        mResolveInfo = resolveInfo;
217cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov
218cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        XmlResourceParser parser = null;
219cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov
220cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        try {
221cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            PackageManager packageManager = context.getPackageManager();
222cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            parser = serviceInfo.loadXmlMetaData(packageManager,
223cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov                    AccessibilityService.SERVICE_META_DATA);
224cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            if (parser == null) {
225cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov                return;
226cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            }
227cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov
228cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            int type = 0;
229cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            while (type != XmlPullParser.END_DOCUMENT && type != XmlPullParser.START_TAG) {
230cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov                type = parser.next();
231cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            }
232cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov
233cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            String nodeName = parser.getName();
234cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            if (!TAG_ACCESSIBILITY_SERVICE.equals(nodeName)) {
235cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov                throw new XmlPullParserException( "Meta-data does not start with"
236cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov                        + TAG_ACCESSIBILITY_SERVICE + " tag");
237cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            }
238cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov
239cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            AttributeSet allAttributes = Xml.asAttributeSet(parser);
240cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            Resources resources = packageManager.getResourcesForApplication(
241cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov                    serviceInfo.applicationInfo);
242cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            TypedArray asAttributes = resources.obtainAttributes(allAttributes,
243cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov                    com.android.internal.R.styleable.AccessibilityService);
244cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            eventTypes = asAttributes.getInt(
245cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov                    com.android.internal.R.styleable.AccessibilityService_accessibilityEventTypes,
246cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov                    0);
247cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            String packageNamez = asAttributes.getString(
248cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov                    com.android.internal.R.styleable.AccessibilityService_packageNames);
249cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            if (packageNamez != null) {
250cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov                packageNames = packageNamez.split("(\\s)*,(\\s)*");
251cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            }
252cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            feedbackType = asAttributes.getInt(
253cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov                    com.android.internal.R.styleable.AccessibilityService_accessibilityFeedbackType,
254cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov                    0);
255cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            notificationTimeout = asAttributes.getInt(
256cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov                    com.android.internal.R.styleable.AccessibilityService_notificationTimeout,
257cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov                    0);
258cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            flags = asAttributes.getInt(
259cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov                    com.android.internal.R.styleable.AccessibilityService_accessibilityFlags, 0);
260cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            mSettingsActivityName = asAttributes.getString(
261cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov                    com.android.internal.R.styleable.AccessibilityService_settingsActivity);
262cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            mCanRetrieveWindowContent = asAttributes.getBoolean(
263cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov                    com.android.internal.R.styleable.AccessibilityService_canRetrieveWindowContent,
264cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov                    false);
2653d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov            TypedValue peekedValue = asAttributes.peekValue(
26635bfedeaba724aeadc6f6c890269cb6bf7ef42f5Svetoslav Ganov                    com.android.internal.R.styleable.AccessibilityService_description);
2673d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov            if (peekedValue != null) {
2683d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov                mDescriptionResId = peekedValue.resourceId;
2693d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov                CharSequence nonLocalizedDescription = peekedValue.coerceToString();
2703d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov                if (nonLocalizedDescription != null) {
2713d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov                    mNonLocalizedDescription = nonLocalizedDescription.toString().trim();
2723d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov                }
2733d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov            }
274cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            asAttributes.recycle();
275cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        } catch (NameNotFoundException e) {
276cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            throw new XmlPullParserException( "Unable to create context for: "
277cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov                    + serviceInfo.packageName);
278cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        } finally {
279cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            if (parser != null) {
280cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov                parser.close();
281cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            }
282cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        }
283cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    }
284cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov
285cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    /**
286cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * Updates the properties that an AccessibilitySerivice can change dynamically.
287cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     *
288cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * @param other The info from which to update the properties.
289cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     *
290cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * @hide
291cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     */
292cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    public void updateDynamicallyConfigurableProperties(AccessibilityServiceInfo other) {
293cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        eventTypes = other.eventTypes;
294cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        packageNames = other.packageNames;
295cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        feedbackType = other.feedbackType;
296cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        notificationTimeout = other.notificationTimeout;
297cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        flags = other.flags;
298cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    }
299cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov
300cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    /**
301cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * The accessibility service id.
302cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * <p>
303cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     *   <strong>Generated by the system.</strong>
304cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * </p>
305cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * @return The id.
306cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     */
307cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    public String getId() {
308cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        return mId;
309cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    }
310cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov
311cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    /**
312cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * The service {@link ResolveInfo}.
313cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * <p>
314cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     *   <strong>Generated by the system.</strong>
315cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * </p>
316cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * @return The info.
317cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     */
318cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    public ResolveInfo getResolveInfo() {
319cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        return mResolveInfo;
320cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    }
321cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov
322cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    /**
323cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * The settings activity name.
324cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * <p>
325cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     *    <strong>Statically set from
326cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     *    {@link AccessibilityService#SERVICE_META_DATA meta-data}.</strong>
327cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * </p>
328cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * @return The settings activity name.
329cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     */
330cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    public String getSettingsActivityName() {
331cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        return mSettingsActivityName;
332cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    }
333cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov
334cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    /**
33538e8b4e5bc3c93affdffbc064fd9db5aeccc3e8eSvetoslav Ganov     * Whether this service can retrieve the current window's content.
336cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * <p>
337cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     *    <strong>Statically set from
338cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     *    {@link AccessibilityService#SERVICE_META_DATA meta-data}.</strong>
339cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * </p>
34038e8b4e5bc3c93affdffbc064fd9db5aeccc3e8eSvetoslav Ganov     * @return True window content can be retrieved.
341cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     */
342cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    public boolean getCanRetrieveWindowContent() {
343cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        return mCanRetrieveWindowContent;
344cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    }
345cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov
346cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    /**
3473d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov     * Gets the non-localized description of the accessibility service.
34835bfedeaba724aeadc6f6c890269cb6bf7ef42f5Svetoslav Ganov     * <p>
34935bfedeaba724aeadc6f6c890269cb6bf7ef42f5Svetoslav Ganov     *    <strong>Statically set from
35035bfedeaba724aeadc6f6c890269cb6bf7ef42f5Svetoslav Ganov     *    {@link AccessibilityService#SERVICE_META_DATA meta-data}.</strong>
35135bfedeaba724aeadc6f6c890269cb6bf7ef42f5Svetoslav Ganov     * </p>
35235bfedeaba724aeadc6f6c890269cb6bf7ef42f5Svetoslav Ganov     * @return The description.
3533d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov     *
3543d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov     * @deprecated Use {@link #loadDescription(PackageManager)}.
35535bfedeaba724aeadc6f6c890269cb6bf7ef42f5Svetoslav Ganov     */
35635bfedeaba724aeadc6f6c890269cb6bf7ef42f5Svetoslav Ganov    public String getDescription() {
3573d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov        return mNonLocalizedDescription;
3583d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov    }
3593d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov
3603d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov    /**
3613d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov     * The localized description of the accessibility service.
3623d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov     * <p>
3633d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov     *    <strong>Statically set from
3643d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov     *    {@link AccessibilityService#SERVICE_META_DATA meta-data}.</strong>
3653d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov     * </p>
3663d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov     * @return The localized description.
3673d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov     */
3683d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov    public String loadDescription(PackageManager packageManager) {
3693d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov        if (mDescriptionResId == 0) {
3703d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov            return mNonLocalizedDescription;
3713d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov        }
3723d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov        ServiceInfo serviceInfo = mResolveInfo.serviceInfo;
3733d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov        CharSequence description = packageManager.getText(serviceInfo.packageName,
3743d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov                mDescriptionResId, serviceInfo.applicationInfo);
3753d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov        if (description != null) {
3763d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov            return description.toString().trim();
3773d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov        }
3783d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov        return null;
37935bfedeaba724aeadc6f6c890269cb6bf7ef42f5Svetoslav Ganov    }
38035bfedeaba724aeadc6f6c890269cb6bf7ef42f5Svetoslav Ganov
38135bfedeaba724aeadc6f6c890269cb6bf7ef42f5Svetoslav Ganov    /**
382cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * {@inheritDoc}
383cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     */
38475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    public int describeContents() {
38575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        return 0;
38675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    }
38775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
3889b31779eab896bdcc0922473b183c979cc0b874fSvetoslav Ganov    public void writeToParcel(Parcel parcel, int flagz) {
38975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        parcel.writeInt(eventTypes);
39075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        parcel.writeStringArray(packageNames);
39175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        parcel.writeInt(feedbackType);
39275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        parcel.writeLong(notificationTimeout);
39375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        parcel.writeInt(flags);
394cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        parcel.writeString(mId);
395cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        parcel.writeParcelable(mResolveInfo, 0);
396cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        parcel.writeString(mSettingsActivityName);
397cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        parcel.writeInt(mCanRetrieveWindowContent ? 1 : 0);
3983d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov        parcel.writeInt(mDescriptionResId);
3993d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov        parcel.writeString(mNonLocalizedDescription);
400cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    }
401cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov
402cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    private void initFromParcel(Parcel parcel) {
403cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        eventTypes = parcel.readInt();
404cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        packageNames = parcel.readStringArray();
405cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        feedbackType = parcel.readInt();
406cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        notificationTimeout = parcel.readLong();
407cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        flags = parcel.readInt();
408cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        mId = parcel.readString();
409cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        mResolveInfo = parcel.readParcelable(null);
410cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        mSettingsActivityName = parcel.readString();
411cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        mCanRetrieveWindowContent = (parcel.readInt() == 1);
4123d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov        mDescriptionResId = parcel.readInt();
4133d0edd31d8082b7b8b2cdee5efda216179f677b5Svetoslav Ganov        mNonLocalizedDescription = parcel.readString();
414cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    }
415cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov
416cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    @Override
417cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    public String toString() {
418cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        StringBuilder stringBuilder = new StringBuilder();
419cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        appendEventTypes(stringBuilder, eventTypes);
420cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        stringBuilder.append(", ");
421cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        appendPackageNames(stringBuilder, packageNames);
422cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        stringBuilder.append(", ");
423cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        appendFeedbackTypes(stringBuilder, feedbackType);
424cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        stringBuilder.append(", ");
425cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        stringBuilder.append("notificationTimeout: ").append(notificationTimeout);
426cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        stringBuilder.append(", ");
427cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        appendFlags(stringBuilder, flags);
428cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        stringBuilder.append(", ");
429cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        stringBuilder.append("id: ").append(mId);
430cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        stringBuilder.append(", ");
431cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        stringBuilder.append("resolveInfo: ").append(mResolveInfo);
432cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        stringBuilder.append(", ");
433cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        stringBuilder.append("settingsActivityName: ").append(mSettingsActivityName);
434cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        stringBuilder.append(", ");
435cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        stringBuilder.append("retrieveScreenContent: ").append(mCanRetrieveWindowContent);
436cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        return stringBuilder.toString();
437cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    }
438cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov
439cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    private static void appendFeedbackTypes(StringBuilder stringBuilder, int feedbackTypes) {
440cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        stringBuilder.append("feedbackTypes:");
441cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        stringBuilder.append("[");
442cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        while (feedbackTypes != 0) {
443cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            final int feedbackTypeBit = (1 << Integer.numberOfTrailingZeros(feedbackTypes));
444cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            stringBuilder.append(feedbackTypeToString(feedbackTypeBit));
445cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            feedbackTypes &= ~feedbackTypeBit;
446cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            if (feedbackTypes != 0) {
447cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov                stringBuilder.append(", ");
448cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            }
449cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        }
450cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        stringBuilder.append("]");
451cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    }
452cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov
453cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    private static void appendPackageNames(StringBuilder stringBuilder, String[] packageNames) {
454cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        stringBuilder.append("packageNames:");
455cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        stringBuilder.append("[");
456cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        if (packageNames != null) {
457cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            final int packageNameCount = packageNames.length;
458cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            for (int i = 0; i < packageNameCount; i++) {
459cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov                stringBuilder.append(packageNames[i]);
460cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov                if (i < packageNameCount - 1) {
461cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov                    stringBuilder.append(", ");
462cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov                }
463cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            }
464cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        }
465cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        stringBuilder.append("]");
466cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    }
467cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov
468cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    private static void appendEventTypes(StringBuilder stringBuilder, int eventTypes) {
469cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        stringBuilder.append("eventTypes:");
470cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        stringBuilder.append("[");
471cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        while (eventTypes != 0) {
472cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            final int eventTypeBit = (1 << Integer.numberOfTrailingZeros(eventTypes));
473cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            stringBuilder.append(AccessibilityEvent.eventTypeToString(eventTypeBit));
474cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            eventTypes &= ~eventTypeBit;
475cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            if (eventTypes != 0) {
476cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov                stringBuilder.append(", ");
477cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            }
478cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        }
479cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        stringBuilder.append("]");
480cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    }
481cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov
482cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    private static void appendFlags(StringBuilder stringBuilder, int flags) {
483cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        stringBuilder.append("flags:");
484cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        stringBuilder.append("[");
485cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        while (flags != 0) {
486cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            final int flagBit = (1 << Integer.numberOfTrailingZeros(flags));
487cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            stringBuilder.append(flagToString(flagBit));
488cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            flags &= ~flagBit;
489cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            if (flags != 0) {
490cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov                stringBuilder.append(", ");
491cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            }
492cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        }
493cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        stringBuilder.append("]");
494cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    }
495cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov
496cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    /**
497cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * Returns the string representation of a feedback type. For example,
498cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * {@link #FEEDBACK_SPOKEN} is represented by the string FEEDBACK_SPOKEN.
499cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     *
500cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * @param feedbackType The feedback type.
501cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * @return The string representation.
502cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     */
503cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    public static String feedbackTypeToString(int feedbackType) {
504bb1b9ea8a488eec833b0be18c45dae8505876042Svetoslav Ganov        StringBuilder builder = new StringBuilder();
505bb1b9ea8a488eec833b0be18c45dae8505876042Svetoslav Ganov        builder.append("[");
506c6c25f9e28a4de73261106a80ae098347524dd2aSvetoslav Ganov        while (feedbackType != 0) {
507bb1b9ea8a488eec833b0be18c45dae8505876042Svetoslav Ganov            final int feedbackTypeFlag = 1 << Integer.numberOfTrailingZeros(feedbackType);
508bb1b9ea8a488eec833b0be18c45dae8505876042Svetoslav Ganov            feedbackType &= ~feedbackTypeFlag;
509bb1b9ea8a488eec833b0be18c45dae8505876042Svetoslav Ganov            switch (feedbackTypeFlag) {
510bb1b9ea8a488eec833b0be18c45dae8505876042Svetoslav Ganov                case FEEDBACK_AUDIBLE:
511c6c25f9e28a4de73261106a80ae098347524dd2aSvetoslav Ganov                    if (builder.length() > 1) {
512c6c25f9e28a4de73261106a80ae098347524dd2aSvetoslav Ganov                        builder.append(", ");
513c6c25f9e28a4de73261106a80ae098347524dd2aSvetoslav Ganov                    }
514bb1b9ea8a488eec833b0be18c45dae8505876042Svetoslav Ganov                    builder.append("FEEDBACK_AUDIBLE");
515bb1b9ea8a488eec833b0be18c45dae8505876042Svetoslav Ganov                    break;
516bb1b9ea8a488eec833b0be18c45dae8505876042Svetoslav Ganov                case FEEDBACK_HAPTIC:
517c6c25f9e28a4de73261106a80ae098347524dd2aSvetoslav Ganov                    if (builder.length() > 1) {
518c6c25f9e28a4de73261106a80ae098347524dd2aSvetoslav Ganov                        builder.append(", ");
519c6c25f9e28a4de73261106a80ae098347524dd2aSvetoslav Ganov                    }
520bb1b9ea8a488eec833b0be18c45dae8505876042Svetoslav Ganov                    builder.append("FEEDBACK_HAPTIC");
521bb1b9ea8a488eec833b0be18c45dae8505876042Svetoslav Ganov                    break;
522bb1b9ea8a488eec833b0be18c45dae8505876042Svetoslav Ganov                case FEEDBACK_GENERIC:
523c6c25f9e28a4de73261106a80ae098347524dd2aSvetoslav Ganov                    if (builder.length() > 1) {
524c6c25f9e28a4de73261106a80ae098347524dd2aSvetoslav Ganov                        builder.append(", ");
525c6c25f9e28a4de73261106a80ae098347524dd2aSvetoslav Ganov                    }
526bb1b9ea8a488eec833b0be18c45dae8505876042Svetoslav Ganov                    builder.append("FEEDBACK_GENERIC");
527bb1b9ea8a488eec833b0be18c45dae8505876042Svetoslav Ganov                    break;
528bb1b9ea8a488eec833b0be18c45dae8505876042Svetoslav Ganov                case FEEDBACK_SPOKEN:
529c6c25f9e28a4de73261106a80ae098347524dd2aSvetoslav Ganov                    if (builder.length() > 1) {
530c6c25f9e28a4de73261106a80ae098347524dd2aSvetoslav Ganov                        builder.append(", ");
531c6c25f9e28a4de73261106a80ae098347524dd2aSvetoslav Ganov                    }
532bb1b9ea8a488eec833b0be18c45dae8505876042Svetoslav Ganov                    builder.append("FEEDBACK_SPOKEN");
533bb1b9ea8a488eec833b0be18c45dae8505876042Svetoslav Ganov                    break;
534bb1b9ea8a488eec833b0be18c45dae8505876042Svetoslav Ganov                case FEEDBACK_VISUAL:
535c6c25f9e28a4de73261106a80ae098347524dd2aSvetoslav Ganov                    if (builder.length() > 1) {
536c6c25f9e28a4de73261106a80ae098347524dd2aSvetoslav Ganov                        builder.append(", ");
537c6c25f9e28a4de73261106a80ae098347524dd2aSvetoslav Ganov                    }
538bb1b9ea8a488eec833b0be18c45dae8505876042Svetoslav Ganov                    builder.append("FEEDBACK_VISUAL");
539bb1b9ea8a488eec833b0be18c45dae8505876042Svetoslav Ganov                    break;
540bb1b9ea8a488eec833b0be18c45dae8505876042Svetoslav Ganov            }
541cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        }
542bb1b9ea8a488eec833b0be18c45dae8505876042Svetoslav Ganov        builder.append("]");
543bb1b9ea8a488eec833b0be18c45dae8505876042Svetoslav Ganov        return builder.toString();
544cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    }
545cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov
546cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    /**
547cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * Returns the string representation of a flag. For example,
548cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * {@link #DEFAULT} is represented by the string DEFAULT.
549cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     *
550cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * @param flag The flag.
551cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * @return The string representation.
552cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     */
553cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    public static String flagToString(int flag) {
554cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        switch (flag) {
555cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            case DEFAULT:
556cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov                return "DEFAULT";
557cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            default:
558cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov                return null;
559cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        }
56075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    }
56175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
56275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /**
56375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * @see Parcelable.Creator
56475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
56575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    public static final Parcelable.Creator<AccessibilityServiceInfo> CREATOR =
56675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov            new Parcelable.Creator<AccessibilityServiceInfo>() {
56775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        public AccessibilityServiceInfo createFromParcel(Parcel parcel) {
56875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov            AccessibilityServiceInfo info = new AccessibilityServiceInfo();
569cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            info.initFromParcel(parcel);
57075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov            return info;
57175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        }
57275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
57375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        public AccessibilityServiceInfo[] newArray(int size) {
57475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov            return new AccessibilityServiceInfo[size];
57575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        }
57675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    };
57775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov}
578