AccessibilityEvent.java revision 34e350daf89aed09ac748c2185f4506772a63b3f
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.view.accessibility;
1875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
198643aa0179e598e78d938c59035389054535a229Svetoslav Ganovimport android.accessibilityservice.IAccessibilityServiceConnection;
2075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.os.Parcel;
2175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.os.Parcelable;
2275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.text.TextUtils;
2375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
2475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport java.util.ArrayList;
25eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganovimport java.util.List;
2675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
2775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov/**
2875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * This class represents accessibility events that are sent by the system when
2975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * something notable happens in the user interface. For example, when a
3075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link android.widget.Button} is clicked, a {@link android.view.View} is focused, etc.
3175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * <p>
32736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov * An accessibility event is fired by an individual view which populates the event with
33736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov * a record for its state and requests from its parent to send the event to interested
34736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov * parties. The parent can optionally add a record for itself before dispatching a similar
35736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov * request to its parent. A parent can also choose not to respect the request for sending
36736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov * an event. The accessibility event is sent by the topmost view in the view tree.
37736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov * Therefore, an {@link android.accessibilityservice.AccessibilityService} can explore
38736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov * all records in an accessibility event to obtain more information about the context
39736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov * in which the event was fired.
40736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov * <p>
41736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov * A client can add, remove, and modify records. The getters and setters for individual
42736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov * properties operate on the current record which can be explicitly set by the client. By
43736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov * default current is the first record. Thus, querying a record would require setting
44736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov * it as the current one and interacting with the property getters and setters.
45736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov * <p>
4675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * This class represents various semantically different accessibility event
4775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * types. Each event type has associated a set of related properties. In other
4875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * words, each event type is characterized via a subset of the properties exposed
4975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * by this class. For each event type there is a corresponding constant defined
5075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * in this class. Since some event types are semantically close there are mask
5175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * constants that group them together. Follows a specification of the event
5275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * types and their associated properties:
5375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * <p>
5475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * <b>VIEW TYPES</b> <br>
5575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * <p>
5675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * <b>View clicked</b> - represents the event of clicking on a {@link android.view.View}
5775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * like {@link android.widget.Button}, {@link android.widget.CompoundButton}, etc. <br>
5875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * Type:{@link #TYPE_VIEW_CLICKED} <br>
5975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * Properties:
6075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getClassName()},
6175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getPackageName()},
6275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getEventTime()},
6375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getText()},
6475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #isChecked()},
6575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #isEnabled()},
6675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #isPassword()},
6775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getItemCount()},
6875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getCurrentItemIndex()}
6975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * <p>
7075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * <b>View long clicked</b> - represents the event of long clicking on a {@link android.view.View}
7175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * like {@link android.widget.Button}, {@link android.widget.CompoundButton}, etc. <br>
7275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * Type:{@link #TYPE_VIEW_LONG_CLICKED} <br>
7375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * Properties:
7475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getClassName()},
7575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getPackageName()},
7675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getEventTime()},
7775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getText()},
7875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #isChecked()},
7975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #isEnabled()},
8075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #isPassword()},
8175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getItemCount()},
8275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getCurrentItemIndex()}
8375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * <p>
8475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * <b>View selected</b> - represents the event of selecting an item usually in
8575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * the context of an {@link android.widget.AdapterView}. <br>
8675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * Type: {@link #TYPE_VIEW_SELECTED} <br>
8775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * Properties:
8875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getClassName()},
8975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getPackageName()},
9075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getEventTime()},
9175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getText()},
9275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #isChecked()},
9375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #isEnabled()},
9475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #isPassword()},
9575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getItemCount()},
9675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getCurrentItemIndex()}
9775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * <p>
9875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * <b>View focused</b> - represents the event of focusing a
9975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link android.view.View}. <br>
10075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * Type: {@link #TYPE_VIEW_FOCUSED} <br>
10175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * Properties:
10275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getClassName()},
10375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getPackageName()},
10475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getEventTime()},
10575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getText()},
10675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #isChecked()},
10775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #isEnabled()},
10875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #isPassword()},
10975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getItemCount()},
11075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getCurrentItemIndex()}
11175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * <p>
11275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * <b>View text changed</b> - represents the event of changing the text of an
11375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link android.widget.EditText}. <br>
11475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * Type: {@link #TYPE_VIEW_TEXT_CHANGED} <br>
11575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * Properties:
11675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getClassName()},
11775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getPackageName()},
11875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getEventTime()},
11975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getText()},
12075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #isChecked()},
12175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #isEnabled()},
12275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #isPassword()},
12375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getItemCount()},
12475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getCurrentItemIndex()},
12575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getFromIndex()},
12675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getAddedCount()},
12775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getRemovedCount()},
12875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getBeforeText()}
12975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * <p>
13075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * <b>TRANSITION TYPES</b> <br>
13175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * <p>
132eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov * <b>Window state changed</b> - represents the event of opening a
13375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link android.widget.PopupWindow}, {@link android.view.Menu},
13475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link android.app.Dialog}, etc. <br>
13575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * Type: {@link #TYPE_WINDOW_STATE_CHANGED} <br>
13675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * Properties:
13775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getClassName()},
13875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getPackageName()},
13975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getEventTime()},
14075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getText()}
14175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * <p>
142eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov * <b>Window content changed</b> - represents the event of change in the
143eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov * content of a window. This change can be adding/removing view, changing
144eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov * a view size, etc.<br>
145eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov * Type: {@link #TYPE_WINDOW_CONTENT_CHANGED} <br>
146eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov * Properties:
147eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov * {@link #getClassName()},
148eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov * {@link #getPackageName()},
149eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov * {@link #getEventTime()},
150eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov * {@link #getText()}
151eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov * <p>
15275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * <b>NOTIFICATION TYPES</b> <br>
15375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * <p>
15475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * <b>Notification state changed</b> - represents the event showing/hiding
15575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link android.app.Notification}.
15675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * Type: {@link #TYPE_NOTIFICATION_STATE_CHANGED} <br>
15775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * Properties:
15875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getClassName()},
15975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getPackageName()},
16075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getEventTime()},
16175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getText()}
16275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getParcelableData()}
16375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * <p>
16475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * <b>Security note</b>
16575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * <p>
16675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * Since an event contains the text of its source privacy can be compromised by leaking of
16775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * sensitive information such as passwords. To address this issue any event fired in response
16875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * to manipulation of a PASSWORD field does NOT CONTAIN the text of the password.
16975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov *
17075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * @see android.view.accessibility.AccessibilityManager
17175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * @see android.accessibilityservice.AccessibilityService
17275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov */
173736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganovpublic final class AccessibilityEvent extends AccessibilityRecord implements Parcelable {
1748643aa0179e598e78d938c59035389054535a229Svetoslav Ganov    private static final boolean DEBUG = false;
17575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
17675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /**
17775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * Invalid selection/focus position.
17875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     *
17975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * @see #getCurrentItemIndex()
18075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
18175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    public static final int INVALID_POSITION = -1;
18275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
18375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /**
18475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * Maximum length of the text fields.
18575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     *
18675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * @see #getBeforeText()
18775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * @see #getText()
188c0a8cd10a5829bf4e94ee073ba6f553128e9d8e9Svetoslav Ganov     * </br>
189c0a8cd10a5829bf4e94ee073ba6f553128e9d8e9Svetoslav Ganov     * Note: This constant is no longer needed since there
190c0a8cd10a5829bf4e94ee073ba6f553128e9d8e9Svetoslav Ganov     *       is no limit on the length of text that is contained
191c0a8cd10a5829bf4e94ee073ba6f553128e9d8e9Svetoslav Ganov     *       in an accessibility event anymore.
19275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
193c0a8cd10a5829bf4e94ee073ba6f553128e9d8e9Svetoslav Ganov    @Deprecated
19475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    public static final int MAX_TEXT_LENGTH = 500;
19575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
19675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /**
19775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * Represents the event of clicking on a {@link android.view.View} like
19875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * {@link android.widget.Button}, {@link android.widget.CompoundButton}, etc.
19975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
20075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    public static final int TYPE_VIEW_CLICKED = 0x00000001;
20175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
20275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /**
20375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * Represents the event of long clicking on a {@link android.view.View} like
20475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * {@link android.widget.Button}, {@link android.widget.CompoundButton}, etc.
20575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
20675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    public static final int TYPE_VIEW_LONG_CLICKED = 0x00000002;
20775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
20875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /**
20975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * Represents the event of selecting an item usually in the context of an
21075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * {@link android.widget.AdapterView}.
21175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
21275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    public static final int TYPE_VIEW_SELECTED = 0x00000004;
21375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
21475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /**
21575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * Represents the event of focusing a {@link android.view.View}.
21675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
21775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    public static final int TYPE_VIEW_FOCUSED = 0x00000008;
21875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
21975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /**
22075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * Represents the event of changing the text of an {@link android.widget.EditText}.
22175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
22275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    public static final int TYPE_VIEW_TEXT_CHANGED = 0x00000010;
22375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
22475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /**
22575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * Represents the event of opening/closing a {@link android.widget.PopupWindow},
22675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * {@link android.view.Menu}, {@link android.app.Dialog}, etc.
22775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
22875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    public static final int TYPE_WINDOW_STATE_CHANGED = 0x00000020;
22975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
23075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /**
23175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * Represents the event showing/hiding a {@link android.app.Notification}.
23275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
23375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    public static final int TYPE_NOTIFICATION_STATE_CHANGED = 0x00000040;
23475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
23575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /**
236736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov     * Represents the event of a hover enter over a {@link android.view.View}.
237736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov     */
238736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov    public static final int TYPE_VIEW_HOVER_ENTER = 0x00000080;
239736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov
240736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov    /**
241736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov     * Represents the event of a hover exit over a {@link android.view.View}.
242736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov     */
243736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov    public static final int TYPE_VIEW_HOVER_EXIT = 0x00000100;
244736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov
245736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov    /**
246736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov     * Represents the event of starting a touch exploration gesture.
247736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov     */
248736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov    public static final int TYPE_TOUCH_EXPLORATION_GESTURE_START = 0x00000200;
249736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov
250736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov    /**
251736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov     * Represents the event of ending a touch exploration gesture.
252736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov     */
253736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov    public static final int TYPE_TOUCH_EXPLORATION_GESTURE_END = 0x00000400;
254736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov
255736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov    /**
256eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov     * Represents the event of changing the content of a window.
257eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov     */
258eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov    public static final int TYPE_WINDOW_CONTENT_CHANGED = 0x00000800;
259eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov
260eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov    /**
26175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * Mask for {@link AccessibilityEvent} all types.
26275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     *
26375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * @see #TYPE_VIEW_CLICKED
26475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * @see #TYPE_VIEW_LONG_CLICKED
26575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * @see #TYPE_VIEW_SELECTED
26675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * @see #TYPE_VIEW_FOCUSED
26775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * @see #TYPE_VIEW_TEXT_CHANGED
26875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * @see #TYPE_WINDOW_STATE_CHANGED
26975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * @see #TYPE_NOTIFICATION_STATE_CHANGED
27075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
27175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    public static final int TYPES_ALL_MASK = 0xFFFFFFFF;
27275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
273736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov    private static final int MAX_POOL_SIZE = 10;
274887e1a17eb9b12448f5929791b564565b2665aabSvetoslav Ganov    private static final Object sPoolLock = new Object();
27575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    private static AccessibilityEvent sPool;
27675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    private static int sPoolSize;
27775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    private AccessibilityEvent mNext;
278736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov    private boolean mIsInPool;
27975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
28075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    private int mEventType;
2813fb3d7c4e756bd32d5abde0abca9ab52d559bc84Adam Powell    private CharSequence mPackageName;
282736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov    private long mEventTime;
2833fb3d7c4e756bd32d5abde0abca9ab52d559bc84Adam Powell
284736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov    private final ArrayList<AccessibilityRecord> mRecords = new ArrayList<AccessibilityRecord>();
28575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
28675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /*
28775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * Hide constructor from clients.
28875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
28975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    private AccessibilityEvent() {
2908643aa0179e598e78d938c59035389054535a229Svetoslav Ganov    }
29175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
2928643aa0179e598e78d938c59035389054535a229Svetoslav Ganov    /**
2938643aa0179e598e78d938c59035389054535a229Svetoslav Ganov     * Initialize an event from another one.
2948643aa0179e598e78d938c59035389054535a229Svetoslav Ganov     *
2958643aa0179e598e78d938c59035389054535a229Svetoslav Ganov     * @param event The event to initialize from.
2968643aa0179e598e78d938c59035389054535a229Svetoslav Ganov     */
2978643aa0179e598e78d938c59035389054535a229Svetoslav Ganov    void init(AccessibilityEvent event) {
2988643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        super.init(event);
2998643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        mEventType = event.mEventType;
3008643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        mEventTime = event.mEventTime;
3018643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        mPackageName = event.mPackageName;
302eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov    }
303eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov
304eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov    /**
305eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov     * Sets the connection for interacting with the AccessibilityManagerService.
306eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov     *
307eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov     * @param connection The connection.
308eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov     *
309eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov     * @hide
310eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov     */
311eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov    @Override
312eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov    public void setConnection(IAccessibilityServiceConnection connection) {
313eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov        super.setConnection(connection);
314eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov        List<AccessibilityRecord> records = mRecords;
315eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov        final int recordCount = records.size();
316eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov        for (int i = 0; i < recordCount; i++) {
317eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov            AccessibilityRecord record = records.get(i);
318eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov            record.setConnection(connection);
319eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov        }
320eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov    }
321eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov
322eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov    /**
323eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov     * Sets if this instance is sealed.
324eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov     *
325eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov     * @param sealed Whether is sealed.
326eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov     *
327eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov     * @hide
328eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov     */
329eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov    @Override
330eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov    public void setSealed(boolean sealed) {
331eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov        super.setSealed(sealed);
332eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov        List<AccessibilityRecord> records = mRecords;
333eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov        final int recordCount = records.size();
334eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov        for (int i = 0; i < recordCount; i++) {
335eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov            AccessibilityRecord record = records.get(i);
336eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov            record.setSealed(sealed);
337eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov        }
33875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    }
33975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
34075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /**
341736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov     * Gets the number of records contained in the event.
34275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     *
343736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov     * @return The number of records.
34475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
345736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov    public int getRecordCount() {
346736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        return mRecords.size();
34775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    }
34875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
34975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /**
350736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov     * Appends an {@link AccessibilityRecord} to the end of event records.
35175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     *
352736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov     * @param record The record to append.
3538643aa0179e598e78d938c59035389054535a229Svetoslav Ganov     *
3548643aa0179e598e78d938c59035389054535a229Svetoslav Ganov     * @throws IllegalStateException If called from an AccessibilityService.
35575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
356736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov    public void appendRecord(AccessibilityRecord record) {
3578643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        enforceNotSealed();
358736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        mRecords.add(record);
35975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    }
36075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
36175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /**
362736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov     * Gets the records at a given index.
36375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     *
364736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov     * @param index The index.
365736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov     * @return The records at the specified index.
36675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
367736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov    public AccessibilityRecord getRecord(int index) {
368736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        return mRecords.get(index);
36975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    }
37075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
37175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /**
37275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * Gets the event type.
37375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     *
37475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * @return The event type.
37575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
37675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    public int getEventType() {
37775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        return mEventType;
37875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    }
37975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
38075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /**
38175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * Sets the event type.
38275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     *
38375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * @param eventType The event type.
3848643aa0179e598e78d938c59035389054535a229Svetoslav Ganov     *
3858643aa0179e598e78d938c59035389054535a229Svetoslav Ganov     * @throws IllegalStateException If called from an AccessibilityService.
38675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
38775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    public void setEventType(int eventType) {
3888643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        enforceNotSealed();
38975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        mEventType = eventType;
39075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    }
39175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
39275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /**
39375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * Gets the time in which this event was sent.
39475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     *
39575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * @return The event time.
39675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
39775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    public long getEventTime() {
39875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        return mEventTime;
39975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    }
40075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
40175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /**
40275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * Sets the time in which this event was sent.
40375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     *
40475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * @param eventTime The event time.
4058643aa0179e598e78d938c59035389054535a229Svetoslav Ganov     *
4068643aa0179e598e78d938c59035389054535a229Svetoslav Ganov     * @throws IllegalStateException If called from an AccessibilityService.
40775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
40875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    public void setEventTime(long eventTime) {
4098643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        enforceNotSealed();
41075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        mEventTime = eventTime;
41175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    }
41275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
41375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /**
41475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * Gets the package name of the source.
41575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     *
41675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * @return The package name.
41775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
41875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    public CharSequence getPackageName() {
41975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        return mPackageName;
42075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    }
42175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
42275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /**
42375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * Sets the package name of the source.
42475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     *
42575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * @param packageName The package name.
4268643aa0179e598e78d938c59035389054535a229Svetoslav Ganov     *
4278643aa0179e598e78d938c59035389054535a229Svetoslav Ganov     * @throws IllegalStateException If called from an AccessibilityService.
42875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
42975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    public void setPackageName(CharSequence packageName) {
4308643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        enforceNotSealed();
43175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        mPackageName = packageName;
43275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    }
43375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
43475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /**
43575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * Returns a cached instance if such is available or a new one is
43675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * instantiated with type property set.
43775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     *
43875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * @param eventType The event type.
43975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * @return An instance.
44075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
44175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    public static AccessibilityEvent obtain(int eventType) {
44275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        AccessibilityEvent event = AccessibilityEvent.obtain();
44375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        event.setEventType(eventType);
44475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        return event;
44575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    }
44675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
44775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /**
44875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * Returns a cached instance if such is available or a new one is
4498643aa0179e598e78d938c59035389054535a229Svetoslav Ganov     * instantiated with type property set.
4508643aa0179e598e78d938c59035389054535a229Svetoslav Ganov     *
4518643aa0179e598e78d938c59035389054535a229Svetoslav Ganov     * @param event The other event.
4528643aa0179e598e78d938c59035389054535a229Svetoslav Ganov     * @return An instance.
4538643aa0179e598e78d938c59035389054535a229Svetoslav Ganov     */
4548643aa0179e598e78d938c59035389054535a229Svetoslav Ganov    public static AccessibilityEvent obtain(AccessibilityEvent event) {
4558643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        AccessibilityEvent eventClone = AccessibilityEvent.obtain();
4568643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        eventClone.init(event);
4578643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
4588643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        final int recordCount = event.mRecords.size();
4598643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        for (int i = 0; i < recordCount; i++) {
4608643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            AccessibilityRecord record = event.mRecords.get(i);
4618643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            AccessibilityRecord recordClone = AccessibilityRecord.obtain(record);
4628643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            eventClone.mRecords.add(recordClone);
4638643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        }
4648643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
4658643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        return eventClone;
4668643aa0179e598e78d938c59035389054535a229Svetoslav Ganov    }
4678643aa0179e598e78d938c59035389054535a229Svetoslav Ganov
4688643aa0179e598e78d938c59035389054535a229Svetoslav Ganov    /**
4698643aa0179e598e78d938c59035389054535a229Svetoslav Ganov     * Returns a cached instance if such is available or a new one is
47075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * instantiated.
47175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     *
47275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * @return An instance.
47375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
47475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    public static AccessibilityEvent obtain() {
475887e1a17eb9b12448f5929791b564565b2665aabSvetoslav Ganov        synchronized (sPoolLock) {
47675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov            if (sPool != null) {
47775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov                AccessibilityEvent event = sPool;
47875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov                sPool = sPool.mNext;
47975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov                sPoolSize--;
48075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov                event.mNext = null;
48175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov                event.mIsInPool = false;
48275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov                return event;
48375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov            }
48475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov            return new AccessibilityEvent();
48575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        }
48675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    }
48775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
48875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /**
48975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * Return an instance back to be reused.
49075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * <p>
49175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * <b>Note: You must not touch the object after calling this function.</b>
492887e1a17eb9b12448f5929791b564565b2665aabSvetoslav Ganov     *
493887e1a17eb9b12448f5929791b564565b2665aabSvetoslav Ganov     * @throws IllegalStateException If the event is already recycled.
49475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
495736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov    @Override
49675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    public void recycle() {
49775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        if (mIsInPool) {
498887e1a17eb9b12448f5929791b564565b2665aabSvetoslav Ganov            throw new IllegalStateException("Event already recycled!");
49975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        }
50075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        clear();
501887e1a17eb9b12448f5929791b564565b2665aabSvetoslav Ganov        synchronized (sPoolLock) {
50275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov            if (sPoolSize <= MAX_POOL_SIZE) {
50375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov                mNext = sPool;
50475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov                sPool = this;
50575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov                mIsInPool = true;
50675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov                sPoolSize++;
50775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov            }
50875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        }
50975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    }
51075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
51175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /**
51275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * Clears the state of this instance.
5138643aa0179e598e78d938c59035389054535a229Svetoslav Ganov     *
5148643aa0179e598e78d938c59035389054535a229Svetoslav Ganov     * @hide
51575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
516736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov    @Override
517736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov    protected void clear() {
518736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        super.clear();
51975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        mEventType = 0;
5203fb3d7c4e756bd32d5abde0abca9ab52d559bc84Adam Powell        mPackageName = null;
521736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        mEventTime = 0;
522736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        while (!mRecords.isEmpty()) {
523736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov            AccessibilityRecord record = mRecords.remove(0);
524736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov            record.recycle();
5253fb3d7c4e756bd32d5abde0abca9ab52d559bc84Adam Powell        }
526ac84d3ba81f08036308b17e1ab919e43987a3df5Svetoslav Ganov    }
527ac84d3ba81f08036308b17e1ab919e43987a3df5Svetoslav Ganov
528ac84d3ba81f08036308b17e1ab919e43987a3df5Svetoslav Ganov    /**
5293fb3d7c4e756bd32d5abde0abca9ab52d559bc84Adam Powell     * Creates a new instance from a {@link Parcel}.
5303fb3d7c4e756bd32d5abde0abca9ab52d559bc84Adam Powell     *
5313fb3d7c4e756bd32d5abde0abca9ab52d559bc84Adam Powell     * @param parcel A parcel containing the state of a {@link AccessibilityEvent}.
532ac84d3ba81f08036308b17e1ab919e43987a3df5Svetoslav Ganov     */
5333fb3d7c4e756bd32d5abde0abca9ab52d559bc84Adam Powell    public void initFromParcel(Parcel parcel) {
5348643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        if (parcel.readInt() == 1) {
5358643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            mConnection = IAccessibilityServiceConnection.Stub.asInterface(
5368643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                    parcel.readStrongBinder());
5378643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        }
5388643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        setSealed(parcel.readInt() == 1);
5393fb3d7c4e756bd32d5abde0abca9ab52d559bc84Adam Powell        mEventType = parcel.readInt();
5403fb3d7c4e756bd32d5abde0abca9ab52d559bc84Adam Powell        mPackageName = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(parcel);
541736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        mEventTime = parcel.readLong();
542736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        readAccessibilityRecordFromParcel(this, parcel);
543736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov
544736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        // Read the records.
545736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        final int recordCount = parcel.readInt();
546736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        for (int i = 0; i < recordCount; i++) {
547736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov            AccessibilityRecord record = AccessibilityRecord.obtain();
548eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov            // Do this to write the connection only once.
549eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov            record.setConnection(mConnection);
55034e350daf89aed09ac748c2185f4506772a63b3fSvetoslav Ganov            readAccessibilityRecordFromParcel(record, parcel);
551736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov            mRecords.add(record);
552736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        }
5533fb3d7c4e756bd32d5abde0abca9ab52d559bc84Adam Powell    }
5543fb3d7c4e756bd32d5abde0abca9ab52d559bc84Adam Powell
555736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov    /**
556736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov     * Reads an {@link AccessibilityRecord} from a parcel.
557736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov     *
558736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov     * @param record The record to initialize.
559736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov     * @param parcel The parcel to read from.
560736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov     */
561736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov    private void readAccessibilityRecordFromParcel(AccessibilityRecord record,
562736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov            Parcel parcel) {
563736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        record.mBooleanProperties = parcel.readInt();
564736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        record.mCurrentItemIndex = parcel.readInt();
565736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        record.mItemCount = parcel.readInt();
566736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        record.mFromIndex = parcel.readInt();
567736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        record.mAddedCount = parcel.readInt();
568736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        record.mRemovedCount = parcel.readInt();
569736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        record.mClassName = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(parcel);
570736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        record.mContentDescription = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(parcel);
571736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        record.mBeforeText = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(parcel);
572736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        record.mParcelableData = parcel.readParcelable(null);
573736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        parcel.readList(record.mText, null);
574eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov        record.mSourceWindowId = parcel.readInt();
575eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov        record.mSourceViewId = parcel.readInt();
576eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov        record.mSealed = (parcel.readInt() == 1);
577736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov    }
578736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov
579736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov    /**
580736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov     * {@inheritDoc}
581736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov     */
58275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    public void writeToParcel(Parcel parcel, int flags) {
5838643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        if (mConnection == null) {
5848643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            parcel.writeInt(0);
5858643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        } else {
5868643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            parcel.writeInt(1);
5878643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            parcel.writeStrongBinder(mConnection.asBinder());
5888643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        }
5898643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        parcel.writeInt(isSealed() ? 1 : 0);
59075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        parcel.writeInt(mEventType);
5913fb3d7c4e756bd32d5abde0abca9ab52d559bc84Adam Powell        TextUtils.writeToParcel(mPackageName, parcel, 0);
592736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        parcel.writeLong(mEventTime);
593736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        writeAccessibilityRecordToParcel(this, parcel, flags);
594736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov
595736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        // Write the records.
596736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        final int recordCount = getRecordCount();
597736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        parcel.writeInt(recordCount);
598736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        for (int i = 0; i < recordCount; i++) {
599736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov            AccessibilityRecord record = mRecords.get(i);
600736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov            writeAccessibilityRecordToParcel(record, parcel, flags);
601736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        }
602736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov    }
603736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov
604736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov    /**
605736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov     * Writes an {@link AccessibilityRecord} to a parcel.
606736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov     *
607736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov     * @param record The record to write.
608736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov     * @param parcel The parcel to which to write.
609736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov     */
610736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov    private void writeAccessibilityRecordToParcel(AccessibilityRecord record, Parcel parcel,
611736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov            int flags) {
612736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        parcel.writeInt(record.mBooleanProperties);
613736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        parcel.writeInt(record.mCurrentItemIndex);
614736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        parcel.writeInt(record.mItemCount);
615736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        parcel.writeInt(record.mFromIndex);
616736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        parcel.writeInt(record.mAddedCount);
617736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        parcel.writeInt(record.mRemovedCount);
618736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        TextUtils.writeToParcel(record.mClassName, parcel, flags);
619736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        TextUtils.writeToParcel(record.mContentDescription, parcel, flags);
620736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        TextUtils.writeToParcel(record.mBeforeText, parcel, flags);
621736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        parcel.writeParcelable(record.mParcelableData, flags);
622736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        parcel.writeList(record.mText);
623eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov        parcel.writeInt(record.mSourceWindowId);
624eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov        parcel.writeInt(record.mSourceViewId);
625eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov        parcel.writeInt(record.mSealed ? 1 : 0);
62675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    }
62775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
628736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov    /**
629736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov     * {@inheritDoc}
630736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov     */
63175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    public int describeContents() {
63275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        return 0;
63375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    }
63475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
63575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    @Override
63675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    public String toString() {
63775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        StringBuilder builder = new StringBuilder();
638cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        builder.append("; EventType: ").append(eventTypeToString(mEventType));
639cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        builder.append("; EventTime: ").append(mEventTime);
640cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        builder.append("; PackageName: ").append(mPackageName);
641736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        builder.append(super.toString());
6428643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        if (DEBUG) {
643736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov            builder.append("\n");
644eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov            builder.append("; sourceWindowId: ").append(mSourceWindowId);
645eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov            builder.append("; sourceViewId: ").append(mSourceViewId);
6468643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            for (int i = 0; i < mRecords.size(); i++) {
6478643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                AccessibilityRecord record = mRecords.get(i);
6488643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                builder.append("  Record ");
6498643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                builder.append(i);
6508643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                builder.append(":");
6518643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                builder.append(" [ ClassName: " + record.mClassName);
6528643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                builder.append("; Text: " + record.mText);
6538643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                builder.append("; ContentDescription: " + record.mContentDescription);
6548643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                builder.append("; ItemCount: " + record.mItemCount);
6558643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                builder.append("; CurrentItemIndex: " + record.mCurrentItemIndex);
6568643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                builder.append("; IsEnabled: " + record.isEnabled());
6578643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                builder.append("; IsPassword: " + record.isPassword());
6588643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                builder.append("; IsChecked: " + record.isChecked());
6598643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                builder.append("; IsFullScreen: " + record.isFullScreen());
6608643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                builder.append("; BeforeText: " + record.mBeforeText);
6618643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                builder.append("; FromIndex: " + record.mFromIndex);
6628643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                builder.append("; AddedCount: " + record.mAddedCount);
6638643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                builder.append("; RemovedCount: " + record.mRemovedCount);
6648643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                builder.append("; ParcelableData: " + record.mParcelableData);
6658643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                builder.append(" ]");
6668643aa0179e598e78d938c59035389054535a229Svetoslav Ganov                builder.append("\n");
6678643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            }
6688643aa0179e598e78d938c59035389054535a229Svetoslav Ganov        } else {
6698643aa0179e598e78d938c59035389054535a229Svetoslav Ganov            builder.append("; recordCount: ").append(getAddedCount());
670736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        }
67175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        return builder.toString();
67275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    }
67375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
67475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /**
675cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * Returns the string representation of an event type. For example,
676cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * {@link #TYPE_VIEW_CLICKED} is represented by the string TYPE_VIEW_CLICKED.
677cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     *
678cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * @param feedbackType The event type
679cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     * @return The string representation.
680cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov     */
681cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    public static String eventTypeToString(int feedbackType) {
682cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        switch (feedbackType) {
683cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            case TYPE_VIEW_CLICKED:
684cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov                return "TYPE_VIEW_CLICKED";
685cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            case TYPE_VIEW_LONG_CLICKED:
686cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov                return "TYPE_VIEW_LONG_CLICKED";
687cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            case TYPE_VIEW_SELECTED:
688cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov                return "TYPE_VIEW_SELECTED";
689cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            case TYPE_VIEW_FOCUSED:
690cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov                return "TYPE_VIEW_FOCUSED";
691cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            case TYPE_VIEW_TEXT_CHANGED:
692cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov                return "TYPE_VIEW_TEXT_CHANGED";
693cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            case TYPE_WINDOW_STATE_CHANGED:
694cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov                return "TYPE_WINDOW_STATE_CHANGED";
695cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            case TYPE_VIEW_HOVER_ENTER:
696cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov                return "TYPE_VIEW_HOVER_ENTER";
697cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            case TYPE_VIEW_HOVER_EXIT:
698cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov                return "TYPE_VIEW_HOVER_EXIT";
699cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            case TYPE_NOTIFICATION_STATE_CHANGED:
700cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov                return "TYPE_NOTIFICATION_STATE_CHANGED";
701cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            case TYPE_TOUCH_EXPLORATION_GESTURE_START:
702cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov                return "TYPE_TOUCH_EXPLORATION_GESTURE_START";
703cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            case TYPE_TOUCH_EXPLORATION_GESTURE_END:
704cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov                return "TYPE_TOUCH_EXPLORATION_GESTURE_END";
705eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov            case TYPE_WINDOW_CONTENT_CHANGED:
706eeee4d2c01d3c4ed99e4891dbc75c7de69a803faSvetoslav Ganov                return "TYPE_WINDOW_CONTENT_CHANGED";
707cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov            default:
708cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov                return null;
709cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov        }
710cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    }
711cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov
712cc4053e031371456fe54d51bbad1db721db4ae38Svetoslav Ganov    /**
71375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * @see Parcelable.Creator
71475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
71575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    public static final Parcelable.Creator<AccessibilityEvent> CREATOR =
71675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov            new Parcelable.Creator<AccessibilityEvent>() {
71775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        public AccessibilityEvent createFromParcel(Parcel parcel) {
71875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov            AccessibilityEvent event = AccessibilityEvent.obtain();
71975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov            event.initFromParcel(parcel);
72075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov            return event;
72175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        }
72275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
72375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        public AccessibilityEvent[] newArray(int size) {
72475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov            return new AccessibilityEvent[size];
72575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        }
72675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    };
72775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov}
728