AccessibilityEvent.java revision 887e1a17eb9b12448f5929791b564565b2665aab
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
1975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.os.Parcel;
2075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.os.Parcelable;
2175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.text.TextUtils;
2275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
2375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport java.util.ArrayList;
2475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
2575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov/**
2675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * This class represents accessibility events that are sent by the system when
2775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * something notable happens in the user interface. For example, when a
2875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link android.widget.Button} is clicked, a {@link android.view.View} is focused, etc.
2975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * <p>
30736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov * An accessibility event is fired by an individual view which populates the event with
31736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov * a record for its state and requests from its parent to send the event to interested
32736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov * parties. The parent can optionally add a record for itself before dispatching a similar
33736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov * request to its parent. A parent can also choose not to respect the request for sending
34736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov * an event. The accessibility event is sent by the topmost view in the view tree.
35736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov * Therefore, an {@link android.accessibilityservice.AccessibilityService} can explore
36736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov * all records in an accessibility event to obtain more information about the context
37736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov * in which the event was fired.
38736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov * <p>
39736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov * A client can add, remove, and modify records. The getters and setters for individual
40736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov * properties operate on the current record which can be explicitly set by the client. By
41736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov * default current is the first record. Thus, querying a record would require setting
42736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov * it as the current one and interacting with the property getters and setters.
43736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov * <p>
4475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * This class represents various semantically different accessibility event
4575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * types. Each event type has associated a set of related properties. In other
4675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * words, each event type is characterized via a subset of the properties exposed
4775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * by this class. For each event type there is a corresponding constant defined
4875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * in this class. Since some event types are semantically close there are mask
4975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * constants that group them together. Follows a specification of the event
5075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * types and their associated properties:
5175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * <p>
5275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * <b>VIEW TYPES</b> <br>
5375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * <p>
5475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * <b>View clicked</b> - represents the event of clicking on a {@link android.view.View}
5575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * like {@link android.widget.Button}, {@link android.widget.CompoundButton}, etc. <br>
5675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * Type:{@link #TYPE_VIEW_CLICKED} <br>
5775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * Properties:
5875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getClassName()},
5975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getPackageName()},
6075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getEventTime()},
6175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getText()},
6275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #isChecked()},
6375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #isEnabled()},
6475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #isPassword()},
6575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getItemCount()},
6675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getCurrentItemIndex()}
6775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * <p>
6875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * <b>View long clicked</b> - represents the event of long clicking on a {@link android.view.View}
6975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * like {@link android.widget.Button}, {@link android.widget.CompoundButton}, etc. <br>
7075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * Type:{@link #TYPE_VIEW_LONG_CLICKED} <br>
7175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * Properties:
7275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getClassName()},
7375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getPackageName()},
7475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getEventTime()},
7575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getText()},
7675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #isChecked()},
7775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #isEnabled()},
7875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #isPassword()},
7975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getItemCount()},
8075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getCurrentItemIndex()}
8175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * <p>
8275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * <b>View selected</b> - represents the event of selecting an item usually in
8375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * the context of an {@link android.widget.AdapterView}. <br>
8475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * Type: {@link #TYPE_VIEW_SELECTED} <br>
8575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * Properties:
8675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getClassName()},
8775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getPackageName()},
8875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getEventTime()},
8975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getText()},
9075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #isChecked()},
9175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #isEnabled()},
9275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #isPassword()},
9375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getItemCount()},
9475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getCurrentItemIndex()}
9575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * <p>
9675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * <b>View focused</b> - represents the event of focusing a
9775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link android.view.View}. <br>
9875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * Type: {@link #TYPE_VIEW_FOCUSED} <br>
9975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * Properties:
10075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getClassName()},
10175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getPackageName()},
10275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getEventTime()},
10375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getText()},
10475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #isChecked()},
10575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #isEnabled()},
10675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #isPassword()},
10775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getItemCount()},
10875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getCurrentItemIndex()}
10975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * <p>
11075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * <b>View text changed</b> - represents the event of changing the text of an
11175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link android.widget.EditText}. <br>
11275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * Type: {@link #TYPE_VIEW_TEXT_CHANGED} <br>
11375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * Properties:
11475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getClassName()},
11575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getPackageName()},
11675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getEventTime()},
11775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getText()},
11875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #isChecked()},
11975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #isEnabled()},
12075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #isPassword()},
12175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getItemCount()},
12275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getCurrentItemIndex()},
12375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getFromIndex()},
12475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getAddedCount()},
12575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getRemovedCount()},
12675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getBeforeText()}
12775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * <p>
12875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * <b>TRANSITION TYPES</b> <br>
12975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * <p>
13075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * <b>Window state changed</b> - represents the event of opening/closing a
13175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link android.widget.PopupWindow}, {@link android.view.Menu},
13275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link android.app.Dialog}, etc. <br>
13375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * Type: {@link #TYPE_WINDOW_STATE_CHANGED} <br>
13475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * Properties:
13575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getClassName()},
13675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getPackageName()},
13775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getEventTime()},
13875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getText()}
13975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * <p>
14075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * <b>NOTIFICATION TYPES</b> <br>
14175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * <p>
14275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * <b>Notification state changed</b> - represents the event showing/hiding
14375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link android.app.Notification}.
14475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * Type: {@link #TYPE_NOTIFICATION_STATE_CHANGED} <br>
14575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * Properties:
14675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getClassName()},
14775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getPackageName()},
14875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getEventTime()},
14975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getText()}
15075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@link #getParcelableData()}
15175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * <p>
15275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * <b>Security note</b>
15375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * <p>
15475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * Since an event contains the text of its source privacy can be compromised by leaking of
15575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * sensitive information such as passwords. To address this issue any event fired in response
15675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * to manipulation of a PASSWORD field does NOT CONTAIN the text of the password.
15775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov *
15875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * @see android.view.accessibility.AccessibilityManager
15975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * @see android.accessibilityservice.AccessibilityService
16075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov */
161736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganovpublic final class AccessibilityEvent extends AccessibilityRecord implements Parcelable {
16275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
16375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /**
16475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * Invalid selection/focus position.
16575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     *
16675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * @see #getCurrentItemIndex()
16775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
16875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    public static final int INVALID_POSITION = -1;
16975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
17075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /**
17175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * Maximum length of the text fields.
17275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     *
17375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * @see #getBeforeText()
17475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * @see #getText()
175c0a8cd10a5829bf4e94ee073ba6f553128e9d8e9Svetoslav Ganov     * </br>
176c0a8cd10a5829bf4e94ee073ba6f553128e9d8e9Svetoslav Ganov     * Note: This constant is no longer needed since there
177c0a8cd10a5829bf4e94ee073ba6f553128e9d8e9Svetoslav Ganov     *       is no limit on the length of text that is contained
178c0a8cd10a5829bf4e94ee073ba6f553128e9d8e9Svetoslav Ganov     *       in an accessibility event anymore.
17975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
180c0a8cd10a5829bf4e94ee073ba6f553128e9d8e9Svetoslav Ganov    @Deprecated
18175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    public static final int MAX_TEXT_LENGTH = 500;
18275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
18375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /**
18475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * Represents the event of clicking on a {@link android.view.View} like
18575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * {@link android.widget.Button}, {@link android.widget.CompoundButton}, etc.
18675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
18775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    public static final int TYPE_VIEW_CLICKED = 0x00000001;
18875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
18975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /**
19075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * Represents the event of long clicking on a {@link android.view.View} like
19175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * {@link android.widget.Button}, {@link android.widget.CompoundButton}, etc.
19275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
19375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    public static final int TYPE_VIEW_LONG_CLICKED = 0x00000002;
19475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
19575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /**
19675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * Represents the event of selecting an item usually in the context of an
19775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * {@link android.widget.AdapterView}.
19875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
19975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    public static final int TYPE_VIEW_SELECTED = 0x00000004;
20075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
20175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /**
20275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * Represents the event of focusing a {@link android.view.View}.
20375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
20475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    public static final int TYPE_VIEW_FOCUSED = 0x00000008;
20575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
20675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /**
20775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * Represents the event of changing the text of an {@link android.widget.EditText}.
20875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
20975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    public static final int TYPE_VIEW_TEXT_CHANGED = 0x00000010;
21075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
21175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /**
21275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * Represents the event of opening/closing a {@link android.widget.PopupWindow},
21375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * {@link android.view.Menu}, {@link android.app.Dialog}, etc.
21475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
21575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    public static final int TYPE_WINDOW_STATE_CHANGED = 0x00000020;
21675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
21775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /**
21875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * Represents the event showing/hiding a {@link android.app.Notification}.
21975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
22075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    public static final int TYPE_NOTIFICATION_STATE_CHANGED = 0x00000040;
22175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
22275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /**
223736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov     * Represents the event of a hover enter over a {@link android.view.View}.
224736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov     */
225736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov    public static final int TYPE_VIEW_HOVER_ENTER = 0x00000080;
226736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov
227736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov    /**
228736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov     * Represents the event of a hover exit over a {@link android.view.View}.
229736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov     */
230736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov    public static final int TYPE_VIEW_HOVER_EXIT = 0x00000100;
231736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov
232736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov    /**
233736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov     * Represents the event of starting a touch exploration gesture.
234736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov     */
235736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov    public static final int TYPE_TOUCH_EXPLORATION_GESTURE_START = 0x00000200;
236736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov
237736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov    /**
238736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov     * Represents the event of ending a touch exploration gesture.
239736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov     */
240736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov    public static final int TYPE_TOUCH_EXPLORATION_GESTURE_END = 0x00000400;
241736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov
242736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov    /**
24375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * Mask for {@link AccessibilityEvent} all types.
24475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     *
24575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * @see #TYPE_VIEW_CLICKED
24675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * @see #TYPE_VIEW_LONG_CLICKED
24775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * @see #TYPE_VIEW_SELECTED
24875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * @see #TYPE_VIEW_FOCUSED
24975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * @see #TYPE_VIEW_TEXT_CHANGED
25075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * @see #TYPE_WINDOW_STATE_CHANGED
25175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * @see #TYPE_NOTIFICATION_STATE_CHANGED
25275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
25375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    public static final int TYPES_ALL_MASK = 0xFFFFFFFF;
25475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
255736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov    private static final int MAX_POOL_SIZE = 10;
256887e1a17eb9b12448f5929791b564565b2665aabSvetoslav Ganov    private static final Object sPoolLock = new Object();
25775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    private static AccessibilityEvent sPool;
25875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    private static int sPoolSize;
25975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
26075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    private AccessibilityEvent mNext;
261736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov    private boolean mIsInPool;
26275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
26375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    private int mEventType;
2643fb3d7c4e756bd32d5abde0abca9ab52d559bc84Adam Powell    private CharSequence mPackageName;
265736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov    private long mEventTime;
2663fb3d7c4e756bd32d5abde0abca9ab52d559bc84Adam Powell
267736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov    private final ArrayList<AccessibilityRecord> mRecords = new ArrayList<AccessibilityRecord>();
26875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
26975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /*
27075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * Hide constructor from clients.
27175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
27275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    private AccessibilityEvent() {
27375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
27475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    }
27575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
27675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /**
277736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov     * Gets the number of records contained in the event.
27875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     *
279736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov     * @return The number of records.
28075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
281736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov    public int getRecordCount() {
282736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        return mRecords.size();
28375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    }
28475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
28575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /**
286736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov     * Appends an {@link AccessibilityRecord} to the end of event records.
28775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     *
288736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov     * @param record The record to append.
28975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
290736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov    public void appendRecord(AccessibilityRecord record) {
291736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        mRecords.add(record);
29275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    }
29375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
29475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /**
295736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov     * Gets the records at a given index.
29675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     *
297736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov     * @param index The index.
298736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov     * @return The records at the specified index.
29975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
300736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov    public AccessibilityRecord getRecord(int index) {
301736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        return mRecords.get(index);
30275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    }
30375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
30475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /**
30575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * Gets the event type.
30675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     *
30775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * @return The event type.
30875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
30975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    public int getEventType() {
31075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        return mEventType;
31175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    }
31275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
31375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /**
31475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * Sets the event type.
31575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     *
31675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * @param eventType The event type.
31775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
31875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    public void setEventType(int eventType) {
31975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        mEventType = eventType;
32075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    }
32175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
32275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /**
32375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * Gets the time in which this event was sent.
32475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     *
32575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * @return The event time.
32675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
32775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    public long getEventTime() {
32875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        return mEventTime;
32975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    }
33075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
33175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /**
33275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * Sets the time in which this event was sent.
33375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     *
33475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * @param eventTime The event time.
33575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
33675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    public void setEventTime(long eventTime) {
33775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        mEventTime = eventTime;
33875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    }
33975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
34075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /**
34175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * Gets the package name of the source.
34275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     *
34375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * @return The package name.
34475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
34575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    public CharSequence getPackageName() {
34675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        return mPackageName;
34775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    }
34875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
34975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /**
35075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * Sets the package name of the source.
35175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     *
35275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * @param packageName The package name.
35375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
35475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    public void setPackageName(CharSequence packageName) {
35575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        mPackageName = packageName;
35675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    }
35775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
35875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /**
35975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * Returns a cached instance if such is available or a new one is
36075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * instantiated with type property set.
36175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     *
36275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * @param eventType The event type.
36375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * @return An instance.
36475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
36575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    public static AccessibilityEvent obtain(int eventType) {
36675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        AccessibilityEvent event = AccessibilityEvent.obtain();
36775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        event.setEventType(eventType);
36875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        return event;
36975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    }
37075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
37175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /**
37275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * Returns a cached instance if such is available or a new one is
37375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * instantiated.
37475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     *
37575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * @return An instance.
37675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
37775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    public static AccessibilityEvent obtain() {
378887e1a17eb9b12448f5929791b564565b2665aabSvetoslav Ganov        synchronized (sPoolLock) {
37975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov            if (sPool != null) {
38075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov                AccessibilityEvent event = sPool;
38175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov                sPool = sPool.mNext;
38275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov                sPoolSize--;
38375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov                event.mNext = null;
38475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov                event.mIsInPool = false;
38575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov                return event;
38675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov            }
38775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov            return new AccessibilityEvent();
38875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        }
38975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    }
39075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
39175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /**
39275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * Return an instance back to be reused.
39375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * <p>
39475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * <b>Note: You must not touch the object after calling this function.</b>
395887e1a17eb9b12448f5929791b564565b2665aabSvetoslav Ganov     *
396887e1a17eb9b12448f5929791b564565b2665aabSvetoslav Ganov     * @throws IllegalStateException If the event is already recycled.
39775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
398736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov    @Override
39975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    public void recycle() {
40075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        if (mIsInPool) {
401887e1a17eb9b12448f5929791b564565b2665aabSvetoslav Ganov            throw new IllegalStateException("Event already recycled!");
40275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        }
40375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        clear();
404887e1a17eb9b12448f5929791b564565b2665aabSvetoslav Ganov        synchronized (sPoolLock) {
40575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov            if (sPoolSize <= MAX_POOL_SIZE) {
40675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov                mNext = sPool;
40775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov                sPool = this;
40875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov                mIsInPool = true;
40975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov                sPoolSize++;
41075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov            }
41175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        }
41275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    }
41375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
41475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /**
41575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * Clears the state of this instance.
41675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
417736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov    @Override
418736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov    protected void clear() {
419736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        super.clear();
42075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        mEventType = 0;
4213fb3d7c4e756bd32d5abde0abca9ab52d559bc84Adam Powell        mPackageName = null;
422736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        mEventTime = 0;
423736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        while (!mRecords.isEmpty()) {
424736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov            AccessibilityRecord record = mRecords.remove(0);
425736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov            record.recycle();
4263fb3d7c4e756bd32d5abde0abca9ab52d559bc84Adam Powell        }
427ac84d3ba81f08036308b17e1ab919e43987a3df5Svetoslav Ganov    }
428ac84d3ba81f08036308b17e1ab919e43987a3df5Svetoslav Ganov
429ac84d3ba81f08036308b17e1ab919e43987a3df5Svetoslav Ganov    /**
4303fb3d7c4e756bd32d5abde0abca9ab52d559bc84Adam Powell     * Creates a new instance from a {@link Parcel}.
4313fb3d7c4e756bd32d5abde0abca9ab52d559bc84Adam Powell     *
4323fb3d7c4e756bd32d5abde0abca9ab52d559bc84Adam Powell     * @param parcel A parcel containing the state of a {@link AccessibilityEvent}.
433ac84d3ba81f08036308b17e1ab919e43987a3df5Svetoslav Ganov     */
4343fb3d7c4e756bd32d5abde0abca9ab52d559bc84Adam Powell    public void initFromParcel(Parcel parcel) {
4353fb3d7c4e756bd32d5abde0abca9ab52d559bc84Adam Powell        mEventType = parcel.readInt();
4363fb3d7c4e756bd32d5abde0abca9ab52d559bc84Adam Powell        mPackageName = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(parcel);
437736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        mEventTime = parcel.readLong();
438736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        readAccessibilityRecordFromParcel(this, parcel);
439736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov
440736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        // Read the records.
441736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        final int recordCount = parcel.readInt();
442736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        for (int i = 0; i < recordCount; i++) {
443736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov            AccessibilityRecord record = AccessibilityRecord.obtain();
444736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov            readAccessibilityRecordFromParcel(record, parcel);
445736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov            mRecords.add(record);
446736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        }
4473fb3d7c4e756bd32d5abde0abca9ab52d559bc84Adam Powell    }
4483fb3d7c4e756bd32d5abde0abca9ab52d559bc84Adam Powell
449736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov    /**
450736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov     * Reads an {@link AccessibilityRecord} from a parcel.
451736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov     *
452736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov     * @param record The record to initialize.
453736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov     * @param parcel The parcel to read from.
454736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov     */
455736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov    private void readAccessibilityRecordFromParcel(AccessibilityRecord record,
456736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov            Parcel parcel) {
457736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        record.mBooleanProperties = parcel.readInt();
458736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        record.mCurrentItemIndex = parcel.readInt();
459736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        record.mItemCount = parcel.readInt();
460736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        record.mFromIndex = parcel.readInt();
461736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        record.mAddedCount = parcel.readInt();
462736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        record.mRemovedCount = parcel.readInt();
463736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        record.mClassName = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(parcel);
464736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        record.mContentDescription = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(parcel);
465736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        record.mBeforeText = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(parcel);
466736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        record.mParcelableData = parcel.readParcelable(null);
467736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        parcel.readList(record.mText, null);
468736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov    }
469736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov
470736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov    /**
471736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov     * {@inheritDoc}
472736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov     */
47375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    public void writeToParcel(Parcel parcel, int flags) {
47475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        parcel.writeInt(mEventType);
4753fb3d7c4e756bd32d5abde0abca9ab52d559bc84Adam Powell        TextUtils.writeToParcel(mPackageName, parcel, 0);
476736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        parcel.writeLong(mEventTime);
477736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        writeAccessibilityRecordToParcel(this, parcel, flags);
478736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov
479736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        // Write the records.
480736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        final int recordCount = getRecordCount();
481736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        parcel.writeInt(recordCount);
482736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        for (int i = 0; i < recordCount; i++) {
483736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov            AccessibilityRecord record = mRecords.get(i);
484736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov            writeAccessibilityRecordToParcel(record, parcel, flags);
485736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        }
486736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov    }
487736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov
488736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov    /**
489736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov     * Writes an {@link AccessibilityRecord} to a parcel.
490736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov     *
491736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov     * @param record The record to write.
492736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov     * @param parcel The parcel to which to write.
493736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov     */
494736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov    private void writeAccessibilityRecordToParcel(AccessibilityRecord record, Parcel parcel,
495736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov            int flags) {
496736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        parcel.writeInt(record.mBooleanProperties);
497736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        parcel.writeInt(record.mCurrentItemIndex);
498736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        parcel.writeInt(record.mItemCount);
499736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        parcel.writeInt(record.mFromIndex);
500736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        parcel.writeInt(record.mAddedCount);
501736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        parcel.writeInt(record.mRemovedCount);
502736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        TextUtils.writeToParcel(record.mClassName, parcel, flags);
503736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        TextUtils.writeToParcel(record.mContentDescription, parcel, flags);
504736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        TextUtils.writeToParcel(record.mBeforeText, parcel, flags);
505736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        parcel.writeParcelable(record.mParcelableData, flags);
506736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        parcel.writeList(record.mText);
50775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    }
50875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
509736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov    /**
510736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov     * {@inheritDoc}
511736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov     */
51275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    public int describeContents() {
51375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        return 0;
51475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    }
51575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
51675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    @Override
51775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    public String toString() {
51875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        StringBuilder builder = new StringBuilder();
51975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        builder.append("; EventType: " + mEventType);
52075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        builder.append("; EventTime: " + mEventTime);
52175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        builder.append("; PackageName: " + mPackageName);
522736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        builder.append(" \n{\n");
523736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        builder.append(super.toString());
524736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        builder.append("\n");
525736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        for (int i = 0; i < mRecords.size(); i++) {
526736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov            AccessibilityRecord record = mRecords.get(i);
527736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov            builder.append("  Record ");
528736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov            builder.append(i);
529736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov            builder.append(":");
530736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov            builder.append(record.toString());
531736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov            builder.append("\n");
532736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        }
533736c2756bf3c14ae9fef7255c119057f7a2be1edSvetoslav Ganov        builder.append("}\n");
53475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        return builder.toString();
53575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    }
53675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
53775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /**
53875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * @see Parcelable.Creator
53975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
54075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    public static final Parcelable.Creator<AccessibilityEvent> CREATOR =
54175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov            new Parcelable.Creator<AccessibilityEvent>() {
54275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        public AccessibilityEvent createFromParcel(Parcel parcel) {
54375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov            AccessibilityEvent event = AccessibilityEvent.obtain();
54475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov            event.initFromParcel(parcel);
54575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov            return event;
54675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        }
54775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
54875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        public AccessibilityEvent[] newArray(int size) {
54975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov            return new AccessibilityEvent[size];
55075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        }
55175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    };
55275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov}
553