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