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