19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.view;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport com.android.internal.R;
2075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport com.android.internal.view.menu.MenuBuilder;
2175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context;
23e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackbornimport android.content.res.Configuration;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.Resources;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.TypedArray;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Bitmap;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Canvas;
28f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleronimport android.graphics.Interpolator;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.LinearGradient;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Matrix;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Paint;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.PixelFormat;
3375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.graphics.Point;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.PorterDuff;
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.PorterDuffXfermode;
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Rect;
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Region;
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Shader;
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.drawable.ColorDrawable;
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.drawable.Drawable;
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Handler;
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IBinder;
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Message;
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel;
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcelable;
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.RemoteException;
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.SystemClock;
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.SystemProperties;
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AttributeSet;
5075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.util.Config;
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.EventLog;
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
53d928d6837dee4df30b06529164326722075da063Romain Guyimport android.util.Pool;
5475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.util.Poolable;
55d928d6837dee4df30b06529164326722075da063Romain Guyimport android.util.PoolableManager;
5675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.util.Pools;
5775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.util.SparseArray;
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ContextMenu.ContextMenuInfo;
5975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.view.accessibility.AccessibilityEvent;
6075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.view.accessibility.AccessibilityEventSource;
6175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.view.accessibility.AccessibilityManager;
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.animation.Animation;
633ecd58c650371206008efd687933c370e4e28a34Mike Cleronimport android.view.animation.AnimationUtils;
6475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.view.inputmethod.EditorInfo;
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.inputmethod.InputConnection;
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.inputmethod.InputMethodManager;
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.ScrollBarDrawable;
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport java.lang.ref.SoftReference;
7075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport java.lang.reflect.InvocationTargetException;
7175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport java.lang.reflect.Method;
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList;
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Arrays;
74d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guyimport java.util.WeakHashMap;
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This class represents the basic building block for user interface components. A View
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * occupies a rectangular area on the screen and is responsible for drawing and
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * event handling. View is the base class for <em>widgets</em>, which are
818506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy * used to create interactive UI components (buttons, text fields, etc.). The
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.view.ViewGroup} subclass is the base class for <em>layouts</em>, which
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * are invisible containers that hold other Views (or other ViewGroups) and define
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * their layout properties.
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p>
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <div class="special">
888506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy * <p>For an introduction to using this class to develop your
898506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy * application's user interface, read the Developer Guide documentation on
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <strong><a href="{@docRoot}guide/topics/ui/index.html">User Interface</a></strong>. Special topics
918506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy * include:
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <br/><a href="{@docRoot}guide/topics/ui/declaring-layout.html">Declaring Layout</a>
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <br/><a href="{@docRoot}guide/topics/ui/menus.html">Creating Menus</a>
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <br/><a href="{@docRoot}guide/topics/ui/layout-objects.html">Common Layout Objects</a>
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <br/><a href="{@docRoot}guide/topics/ui/binding.html">Binding to Data with AdapterView</a>
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <br/><a href="{@docRoot}guide/topics/ui/ui-events.html">Handling UI Events</a>
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <br/><a href="{@docRoot}guide/topics/ui/themes.html">Applying Styles and Themes</a>
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <br/><a href="{@docRoot}guide/topics/ui/custom-components.html">Building Custom Components</a>
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <br/><a href="{@docRoot}guide/topics/ui/how-android-draws.html">How Android Draws Views</a>.
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p>
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </div>
1028506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy *
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a name="Using"></a>
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Using Views</h3>
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * All of the views in a window are arranged in a single tree. You can add views
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * either from code or by specifying a tree of views in one or more XML layout
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * files. There are many specialized subclasses of views that act as controls or
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * are capable of displaying text, images, or other content.
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p>
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Once you have created a tree of views, there are typically a few types of
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * common operations you may wish to perform:
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul>
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><strong>Set properties:</strong> for example setting the text of a
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.widget.TextView}. The available properties and the methods
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that set them will vary among the different subclasses of views. Note that
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * properties that are known at build time can be set in the XML layout
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * files.</li>
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><strong>Set focus:</strong> The framework will handled moving focus in
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * response to user input. To force focus to a specific view, call
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #requestFocus}.</li>
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><strong>Set up listeners:</strong> Views allow clients to set listeners
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that will be notified when something interesting happens to the view. For
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * example, all views will let you set a listener to be notified when the view
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * gains or loses focus. You can register such a listener using
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #setOnFocusChangeListener}. Other view subclasses offer more
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * specialized listeners. For example, a Button exposes a listener to notify
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * clients when the button is clicked.</li>
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><strong>Set visibility:</strong> You can hide or show views using
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #setVisibility}.</li>
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul>
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p>
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><em>
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Note: The Android framework is responsible for measuring, laying out and
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * drawing views. You should not call methods that perform these actions on
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * views yourself unless you are actually implementing a
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.view.ViewGroup}.
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </em></p>
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a name="Lifecycle"></a>
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Implementing a Custom View</h3>
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * To implement a custom view, you will usually begin by providing overrides for
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * some of the standard methods that the framework calls on all views. You do
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * not need to override all of these methods. In fact, you can start by just
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * overriding {@link #onDraw(android.graphics.Canvas)}.
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <table border="2" width="85%" align="center" cellpadding="5">
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <thead>
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <tr><th>Category</th> <th>Methods</th> <th>Description</th></tr>
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </thead>
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tbody>
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr>
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td rowspan="2">Creation</td>
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td>Constructors</td>
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td>There is a form of the constructor that are called when the view
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         is created from code and a form that is called when the view is
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         inflated from a layout file. The second form should parse and apply
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         any attributes defined in the layout file.
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         </td>
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tr>
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr>
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td><code>{@link #onFinishInflate()}</code></td>
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td>Called after a view and all of its children has been inflated
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         from XML.</td>
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tr>
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr>
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td rowspan="3">Layout</td>
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td><code>{@link #onMeasure}</code></td>
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td>Called to determine the size requirements for this view and all
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         of its children.
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         </td>
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tr>
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr>
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td><code>{@link #onLayout}</code></td>
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td>Called when this view should assign a size and position to all
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         of its children.
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         </td>
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tr>
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr>
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td><code>{@link #onSizeChanged}</code></td>
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td>Called when the size of this view has changed.
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         </td>
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tr>
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr>
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td>Drawing</td>
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td><code>{@link #onDraw}</code></td>
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td>Called when the view should render its content.
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         </td>
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tr>
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr>
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td rowspan="4">Event processing</td>
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td><code>{@link #onKeyDown}</code></td>
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td>Called when a new key event occurs.
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         </td>
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tr>
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr>
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td><code>{@link #onKeyUp}</code></td>
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td>Called when a key up event occurs.
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         </td>
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tr>
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr>
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td><code>{@link #onTrackballEvent}</code></td>
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td>Called when a trackball motion event occurs.
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         </td>
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tr>
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr>
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td><code>{@link #onTouchEvent}</code></td>
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td>Called when a touch screen motion event occurs.
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         </td>
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tr>
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr>
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td rowspan="2">Focus</td>
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td><code>{@link #onFocusChanged}</code></td>
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td>Called when the view gains or loses focus.
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         </td>
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tr>
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr>
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td><code>{@link #onWindowFocusChanged}</code></td>
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td>Called when the window containing the view gains or loses focus.
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         </td>
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tr>
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr>
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td rowspan="3">Attaching</td>
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td><code>{@link #onAttachedToWindow()}</code></td>
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td>Called when the view is attached to a window.
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         </td>
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tr>
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr>
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td><code>{@link #onDetachedFromWindow}</code></td>
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td>Called when the view is detached from its window.
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         </td>
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tr>
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     <tr>
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td><code>{@link #onWindowVisibilityChanged}</code></td>
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         <td>Called when the visibility of the window containing the view
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         has changed.
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         </td>
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tr>
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     </tbody>
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </table>
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p>
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a name="IDs"></a>
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>IDs</h3>
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Views may have an integer id associated with them. These ids are typically
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * assigned in the layout XML files, and are used to find specific views within
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the view tree. A common pattern is to:
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul>
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Define a Button in the layout file and assign it a unique ID.
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <pre>
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * &lt;Button id="@+id/my_button"
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     android:layout_width="wrap_content"
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     android:layout_height="wrap_content"
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     android:text="@string/my_button_text"/&gt;
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </pre></li>
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>From the onCreate method of an Activity, find the Button
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <pre class="prettyprint">
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      Button myButton = (Button) findViewById(R.id.my_button);
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </pre></li>
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul>
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * View IDs need not be unique throughout the tree, but it is good practice to
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * ensure that they are at least unique within the part of the tree you are
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * searching.
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p>
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a name="Position"></a>
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Position</h3>
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The geometry of a view is that of a rectangle. A view has a location,
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * expressed as a pair of <em>left</em> and <em>top</em> coordinates, and
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * two dimensions, expressed as a width and a height. The unit for location
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and dimensions is the pixel.
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p>
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * It is possible to retrieve the location of a view by invoking the methods
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #getLeft()} and {@link #getTop()}. The former returns the left, or X,
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * coordinate of the rectangle representing the view. The latter returns the
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * top, or Y, coordinate of the rectangle representing the view. These methods
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * both return the location of the view relative to its parent. For instance,
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * when getLeft() returns 20, that means the view is located 20 pixels to the
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * right of the left edge of its direct parent.
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p>
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * In addition, several convenience methods are offered to avoid unnecessary
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * computations, namely {@link #getRight()} and {@link #getBottom()}.
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * These methods return the coordinates of the right and bottom edges of the
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * rectangle representing the view. For instance, calling {@link #getRight()}
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is similar to the following computation: <code>getLeft() + getWidth()</code>
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (see <a href="#SizePaddingMargins">Size</a> for more information about the width.)
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p>
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a name="SizePaddingMargins"></a>
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Size, padding and margins</h3>
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The size of a view is expressed with a width and a height. A view actually
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * possess two pairs of width and height values.
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p>
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The first pair is known as <em>measured width</em> and
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <em>measured height</em>. These dimensions define how big a view wants to be
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * within its parent (see <a href="#Layout">Layout</a> for more details.) The
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * measured dimensions can be obtained by calling {@link #getMeasuredWidth()}
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and {@link #getMeasuredHeight()}.
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p>
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The second pair is simply known as <em>width</em> and <em>height</em>, or
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * sometimes <em>drawing width</em> and <em>drawing height</em>. These
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * dimensions define the actual size of the view on screen, at drawing time and
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * after layout. These values may, but do not have to, be different from the
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * measured width and height. The width and height can be obtained by calling
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #getWidth()} and {@link #getHeight()}.
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p>
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * To measure its dimensions, a view takes into account its padding. The padding
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is expressed in pixels for the left, top, right and bottom parts of the view.
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Padding can be used to offset the content of the view by a specific amount of
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * pixels. For instance, a left padding of 2 will push the view's content by
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2 pixels to the right of the left edge. Padding can be set using the
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #setPadding(int, int, int, int)} method and queried by calling
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #getPaddingLeft()}, {@link #getPaddingTop()},
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #getPaddingRight()} and {@link #getPaddingBottom()}.
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p>
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Even though a view can define a padding, it does not provide any support for
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * margins. However, view groups provide such a support. Refer to
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.view.ViewGroup} and
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.view.ViewGroup.MarginLayoutParams} for further information.
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p>
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a name="Layout"></a>
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Layout</h3>
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Layout is a two pass process: a measure pass and a layout pass. The measuring
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * pass is implemented in {@link #measure(int, int)} and is a top-down traversal
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of the view tree. Each view pushes dimension specifications down the tree
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * during the recursion. At the end of the measure pass, every view has stored
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * its measurements. The second pass happens in
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #layout(int,int,int,int)} and is also top-down. During
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this pass each parent is responsible for positioning all of its children
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * using the sizes computed in the measure pass.
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p>
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * When a view's measure() method returns, its {@link #getMeasuredWidth()} and
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #getMeasuredHeight()} values must be set, along with those for all of
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that view's descendants. A view's measured width and measured height values
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * must respect the constraints imposed by the view's parents. This guarantees
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that at the end of the measure pass, all parents accept all of their
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * children's measurements. A parent view may call measure() more than once on
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * its children. For example, the parent may measure each child once with
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * unspecified dimensions to find out how big they want to be, then call
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * measure() on them again with actual numbers if the sum of all the children's
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * unconstrained sizes is too big or too small.
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p>
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The measure pass uses two classes to communicate dimensions. The
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link MeasureSpec} class is used by views to tell their parents how they
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * want to be measured and positioned. The base LayoutParams class just
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * describes how big the view wants to be for both width and height. For each
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * dimension, it can specify one of:
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul>
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> an exact number
383980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy * <li>MATCH_PARENT, which means the view wants to be as big as its parent
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (minus padding)
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> WRAP_CONTENT, which means that the view wants to be just big enough to
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * enclose its content (plus padding).
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul>
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * There are subclasses of LayoutParams for different subclasses of ViewGroup.
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * For example, AbsoluteLayout has its own subclass of LayoutParams which adds
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * an X and Y value.
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p>
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * MeasureSpecs are used to push requirements down the tree from parent to
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * child. A MeasureSpec can be in one of three modes:
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul>
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>UNSPECIFIED: This is used by a parent to determine the desired dimension
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of a child view. For example, a LinearLayout may call measure() on its child
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * with the height set to UNSPECIFIED and a width of EXACTLY 240 to find out how
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * tall the child view wants to be given a width of 240 pixels.
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>EXACTLY: This is used by the parent to impose an exact size on the
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * child. The child must use this size, and guarantee that all of its
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * descendants will fit within this size.
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>AT_MOST: This is used by the parent to impose a maximum size on the
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * child. The child must gurantee that it and all of its descendants will fit
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * within this size.
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul>
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p>
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * To intiate a layout, call {@link #requestLayout}. This method is typically
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * called by a view on itself when it believes that is can no longer fit within
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * its current bounds.
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p>
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a name="Drawing"></a>
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Drawing</h3>
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Drawing is handled by walking the tree and rendering each view that
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * intersects the the invalid region. Because the tree is traversed in-order,
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this means that parents will draw before (i.e., behind) their children, with
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * siblings drawn in the order they appear in the tree.
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If you set a background drawable for a View, then the View will draw it for you
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * before calling back to its <code>onDraw()</code> method.
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p>
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>
4288506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy * Note that the framework will not draw views that are not in the invalid region.
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p>
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * To force a view to draw, call {@link #invalidate()}.
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p>
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a name="EventHandlingThreading"></a>
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Event Handling and Threading</h3>
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The basic cycle of a view is as follows:
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ol>
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>An event comes in and is dispatched to the appropriate view. The view
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * handles the event and notifies any listeners.</li>
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>If in the course of processing the event, the view's bounds may need
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to be changed, the view will call {@link #requestLayout()}.</li>
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>Similarly, if in the course of processing the event the view's appearance
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * may need to be changed, the view will call {@link #invalidate()}.</li>
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>If either {@link #requestLayout()} or {@link #invalidate()} were called,
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the framework will take care of measuring, laying out, and drawing the tree
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as appropriate.</li>
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ol>
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p>
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p><em>Note: The entire view tree is single threaded. You must always be on
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the UI thread when calling any method on any view.</em>
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If you are doing work on other threads and want to update the state of a view
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * from that thread, you should use a {@link Handler}.
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p>
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a name="FocusHandling"></a>
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Focus Handling</h3>
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The framework will handle routine focus movement in response to user input.
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This includes changing the focus as views are removed or hidden, or as new
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * views become available. Views indicate their willingness to take focus
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * through the {@link #isFocusable} method. To change whether a view can take
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * focus, call {@link #setFocusable(boolean)}.  When in touch mode (see notes below)
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * views indicate whether they still would like focus via {@link #isFocusableInTouchMode}
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and can change this via {@link #setFocusableInTouchMode(boolean)}.
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p>
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Focus movement is based on an algorithm which finds the nearest neighbor in a
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * given direction. In rare cases, the default algorithm may not match the
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * intended behavior of the developer. In these situations, you can provide
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * explicit overrides by using these XML attributes in the layout file:
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <pre>
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * nextFocusDown
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * nextFocusLeft
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * nextFocusRight
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * nextFocusUp
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </pre>
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p>
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * To get a particular view to take focus, call {@link #requestFocus()}.
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p>
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a name="TouchMode"></a>
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Touch Mode</h3>
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * When a user is navigating a user interface via directional keys such as a D-pad, it is
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * necessary to give focus to actionable items such as buttons so the user can see
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * what will take input.  If the device has touch capabilities, however, and the user
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * begins interacting with the interface by touching it, it is no longer necessary to
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * always highlight, or give focus to, a particular view.  This motivates a mode
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * for interaction named 'touch mode'.
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p>
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * For a touch capable device, once the user touches the screen, the device
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will enter touch mode.  From this point onward, only views for which
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #isFocusableInTouchMode} is true will be focusable, such as text editing widgets.
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Other views that are touchable, like buttons, will not take focus when touched; they will
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * only fire the on click listeners.
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p>
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Any time a user hits a directional key, such as a D-pad direction, the view device will
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * exit touch mode, and find a view to take focus, so that the user may resume interacting
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * with the user interface without touching the screen again.
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p>
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The touch mode state is maintained across {@link android.app.Activity}s.  Call
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #isInTouchMode} to see whether the device is currently in touch mode.
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p>
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a name="Scrolling"></a>
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Scrolling</h3>
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The framework provides basic support for views that wish to internally
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * scroll their content. This includes keeping track of the X and Y scroll
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * offset as well as mechanisms for drawing scrollbars. See
520f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron * {@link #scrollBy(int, int)}, {@link #scrollTo(int, int)}, and
521f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron * {@link #awakenScrollBars()} for more details.
5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p>
5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a name="Tags"></a>
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Tags</h3>
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unlike IDs, tags are not used to identify views. Tags are essentially an
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * extra piece of information that can be associated with a view. They are most
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * often used as a convenience to store data related to views in the views
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * themselves rather than by putting them in a separate structure.
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p>
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <a name="Animation"></a>
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Animation</h3>
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You can attach an {@link Animation} object to a view using
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #setAnimation(Animation)} or
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #startAnimation(Animation)}. The animation can alter the scale,
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * rotation, translation and alpha of a view over time. If the animation is
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * attached to a view that has children, the animation will affect the entire
5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * subtree rooted by that node. When an animation is started, the framework will
5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * take care of redrawing the appropriate views until the animation completes.
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p>
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
545d6a463a9f23b3901bf729f2f27a6bb8f78b95248Romain Guy * @attr ref android.R.styleable#View_background
546d6a463a9f23b3901bf729f2f27a6bb8f78b95248Romain Guy * @attr ref android.R.styleable#View_clickable
547d6a463a9f23b3901bf729f2f27a6bb8f78b95248Romain Guy * @attr ref android.R.styleable#View_contentDescription
548d6a463a9f23b3901bf729f2f27a6bb8f78b95248Romain Guy * @attr ref android.R.styleable#View_drawingCacheQuality
549d6a463a9f23b3901bf729f2f27a6bb8f78b95248Romain Guy * @attr ref android.R.styleable#View_duplicateParentState
550d6a463a9f23b3901bf729f2f27a6bb8f78b95248Romain Guy * @attr ref android.R.styleable#View_id
551d6a463a9f23b3901bf729f2f27a6bb8f78b95248Romain Guy * @attr ref android.R.styleable#View_fadingEdge
552d6a463a9f23b3901bf729f2f27a6bb8f78b95248Romain Guy * @attr ref android.R.styleable#View_fadingEdgeLength
5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#View_fitsSystemWindows
554d6a463a9f23b3901bf729f2f27a6bb8f78b95248Romain Guy * @attr ref android.R.styleable#View_isScrollContainer
555d6a463a9f23b3901bf729f2f27a6bb8f78b95248Romain Guy * @attr ref android.R.styleable#View_focusable
556d6a463a9f23b3901bf729f2f27a6bb8f78b95248Romain Guy * @attr ref android.R.styleable#View_focusableInTouchMode
557d6a463a9f23b3901bf729f2f27a6bb8f78b95248Romain Guy * @attr ref android.R.styleable#View_hapticFeedbackEnabled
558d6a463a9f23b3901bf729f2f27a6bb8f78b95248Romain Guy * @attr ref android.R.styleable#View_keepScreenOn
559d6a463a9f23b3901bf729f2f27a6bb8f78b95248Romain Guy * @attr ref android.R.styleable#View_longClickable
560d6a463a9f23b3901bf729f2f27a6bb8f78b95248Romain Guy * @attr ref android.R.styleable#View_minHeight
561d6a463a9f23b3901bf729f2f27a6bb8f78b95248Romain Guy * @attr ref android.R.styleable#View_minWidth
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#View_nextFocusDown
5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#View_nextFocusLeft
5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#View_nextFocusRight
5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#View_nextFocusUp
566d6a463a9f23b3901bf729f2f27a6bb8f78b95248Romain Guy * @attr ref android.R.styleable#View_onClick
567d6a463a9f23b3901bf729f2f27a6bb8f78b95248Romain Guy * @attr ref android.R.styleable#View_padding
568d6a463a9f23b3901bf729f2f27a6bb8f78b95248Romain Guy * @attr ref android.R.styleable#View_paddingBottom
569d6a463a9f23b3901bf729f2f27a6bb8f78b95248Romain Guy * @attr ref android.R.styleable#View_paddingLeft
570d6a463a9f23b3901bf729f2f27a6bb8f78b95248Romain Guy * @attr ref android.R.styleable#View_paddingRight
571d6a463a9f23b3901bf729f2f27a6bb8f78b95248Romain Guy * @attr ref android.R.styleable#View_paddingTop
572d6a463a9f23b3901bf729f2f27a6bb8f78b95248Romain Guy * @attr ref android.R.styleable#View_saveEnabled
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#View_scrollX
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#View_scrollY
5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#View_scrollbarSize
576d6a463a9f23b3901bf729f2f27a6bb8f78b95248Romain Guy * @attr ref android.R.styleable#View_scrollbarStyle
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#View_scrollbars
578f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron * @attr ref android.R.styleable#View_scrollbarDefaultDelayBeforeFade
579f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron * @attr ref android.R.styleable#View_scrollbarFadeDuration
580d6a463a9f23b3901bf729f2f27a6bb8f78b95248Romain Guy * @attr ref android.R.styleable#View_scrollbarTrackHorizontal
581d6a463a9f23b3901bf729f2f27a6bb8f78b95248Romain Guy * @attr ref android.R.styleable#View_scrollbarThumbHorizontal
5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#View_scrollbarThumbVertical
5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#View_scrollbarTrackVertical
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#View_scrollbarAlwaysDrawHorizontalTrack
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#View_scrollbarAlwaysDrawVerticalTrack
586d6a463a9f23b3901bf729f2f27a6bb8f78b95248Romain Guy * @attr ref android.R.styleable#View_soundEffectsEnabled
587d6a463a9f23b3901bf729f2f27a6bb8f78b95248Romain Guy * @attr ref android.R.styleable#View_tag
588d6a463a9f23b3901bf729f2f27a6bb8f78b95248Romain Guy * @attr ref android.R.styleable#View_visibility
5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see android.view.ViewGroup
5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
59275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovpublic class View implements Drawable.Callback, KeyEvent.Callback, AccessibilityEventSource {
5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final boolean DBG = false;
5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The logging tag used by this class with android.util.Log.
5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected static final String VIEW_LOG_TAG = "View";
5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Used to mark a View that has no ID.
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int NO_ID = -1;
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This view does not want keystrokes. Use with TAKES_FOCUS_MASK when
6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * calling setFlags.
6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int NOT_FOCUSABLE = 0x00000000;
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This view wants keystrokes. Use with TAKES_FOCUS_MASK when calling
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * setFlags.
6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int FOCUSABLE = 0x00000001;
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Mask for use with setFlags indicating bits used for focus.
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int FOCUSABLE_MASK = 0x00000001;
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This view will adjust its padding to fit sytem windows (e.g. status bar)
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int FITS_SYSTEM_WINDOWS = 0x00000002;
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This view is visible.  Use with {@link #setVisibility}.
6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int VISIBLE = 0x00000000;
6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This view is invisible, but it still takes up space for layout purposes.
6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use with {@link #setVisibility}.
6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int INVISIBLE = 0x00000004;
6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This view is invisible, and it doesn't take any space for layout
6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * purposes. Use with {@link #setVisibility}.
6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int GONE = 0x00000008;
6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Mask for use with setFlags indicating bits used for visibility.
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int VISIBILITY_MASK = 0x0000000C;
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int[] VISIBILITY_FLAGS = {VISIBLE, INVISIBLE, GONE};
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This view is enabled. Intrepretation varies by subclass.
6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use with ENABLED_MASK when calling setFlags.
6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int ENABLED = 0x00000000;
6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This view is disabled. Intrepretation varies by subclass.
6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use with ENABLED_MASK when calling setFlags.
6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int DISABLED = 0x00000020;
6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project   /**
6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    * Mask for use with setFlags indicating bits used for indicating whether
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    * this view is enabled
6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    * {@hide}
6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    */
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int ENABLED_MASK = 0x00000020;
6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This view won't draw. {@link #onDraw} won't be called and further
6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * optimizations
6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * will be performed. It is okay to have this flag set and a background.
6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use with DRAW_MASK when calling setFlags.
6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int WILL_NOT_DRAW = 0x00000080;
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Mask for use with setFlags indicating bits used for indicating whether
6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * this view is will draw
6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int DRAW_MASK = 0x00000080;
6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This view doesn't show scrollbars.</p>
6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int SCROLLBARS_NONE = 0x00000000;
6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This view shows horizontal scrollbars.</p>
6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int SCROLLBARS_HORIZONTAL = 0x00000100;
7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This view shows vertical scrollbars.</p>
7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int SCROLLBARS_VERTICAL = 0x00000200;
7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Mask for use with setFlags indicating bits used for indicating which
7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * scrollbars are enabled.</p>
7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int SCROLLBARS_MASK = 0x00000300;
7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // note 0x00000400 and 0x00000800 are now available for next flags...
7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This view doesn't show fading edges.</p>
7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int FADING_EDGE_NONE = 0x00000000;
7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This view shows horizontal fading edges.</p>
7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int FADING_EDGE_HORIZONTAL = 0x00001000;
7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This view shows vertical fading edges.</p>
7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int FADING_EDGE_VERTICAL = 0x00002000;
7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Mask for use with setFlags indicating bits used for indicating which
7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * fading edges are enabled.</p>
7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int FADING_EDGE_MASK = 0x00003000;
7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Indicates this view can be clicked. When clickable, a View reacts
7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to clicks by notifying the OnClickListener.<p>
7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int CLICKABLE = 0x00004000;
7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Indicates this view is caching its drawing into a bitmap.</p>
7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int DRAWING_CACHE_ENABLED = 0x00008000;
7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Indicates that no icicle should be saved for this view.<p>
7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int SAVE_DISABLED = 0x000010000;
7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Mask for use with setFlags indicating bits used for the saveEnabled
7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * property.</p>
7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int SAVE_DISABLED_MASK = 0x000010000;
7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Indicates that no drawing cache should ever be created for this view.<p>
7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int WILL_NOT_CACHE_DRAWING = 0x000020000;
7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Indicates this view can take / keep focus when int touch mode.</p>
7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int FOCUSABLE_IN_TOUCH_MODE = 0x00040000;
7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Enables low quality mode for the drawing cache.</p>
7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int DRAWING_CACHE_QUALITY_LOW = 0x00080000;
7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Enables high quality mode for the drawing cache.</p>
7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int DRAWING_CACHE_QUALITY_HIGH = 0x00100000;
7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Enables automatic quality mode for the drawing cache.</p>
7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int DRAWING_CACHE_QUALITY_AUTO = 0x00000000;
7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int[] DRAWING_CACHE_QUALITY_FLAGS = {
7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            DRAWING_CACHE_QUALITY_AUTO, DRAWING_CACHE_QUALITY_LOW, DRAWING_CACHE_QUALITY_HIGH
7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Mask for use with setFlags indicating bits used for the cache
8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * quality property.</p>
8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int DRAWING_CACHE_QUALITY_MASK = 0x00180000;
8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Indicates this view can be long clicked. When long clickable, a View
8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * reacts to long clicks by notifying the OnLongClickListener or showing a
8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * context menu.
8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * </p>
8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int LONG_CLICKABLE = 0x00200000;
8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Indicates that this view gets its drawable states from its direct parent
8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and ignores its original internal states.</p>
8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int DUPLICATE_PARENT_STATE = 0x00400000;
8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The scrollbar style to display the scrollbars inside the content area,
8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * without increasing the padding. The scrollbars will be overlaid with
8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * translucency on the view's content.
8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int SCROLLBARS_INSIDE_OVERLAY = 0;
8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The scrollbar style to display the scrollbars inside the padded area,
8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * increasing the padding of the view. The scrollbars will not overlap the
8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * content area of the view.
8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int SCROLLBARS_INSIDE_INSET = 0x01000000;
8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The scrollbar style to display the scrollbars at the edge of the view,
8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * without increasing the padding. The scrollbars will be overlaid with
8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * translucency.
8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int SCROLLBARS_OUTSIDE_OVERLAY = 0x02000000;
8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The scrollbar style to display the scrollbars at the edge of the view,
8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * increasing the padding of the view. The scrollbars will only overlap the
8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * background, if any.
8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int SCROLLBARS_OUTSIDE_INSET = 0x03000000;
8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Mask to check if the scrollbar style is overlay or inset.
8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int SCROLLBARS_INSET_MASK = 0x01000000;
8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Mask to check if the scrollbar style is inside or outside.
8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int SCROLLBARS_OUTSIDE_MASK = 0x02000000;
8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Mask for scrollbar style.
8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int SCROLLBARS_STYLE_MASK = 0x03000000;
8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * View flag indicating that the screen should remain on while the
8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * window containing this view is visible to the user.  This effectively
8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * takes care of automatically setting the WindowManager's
8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link WindowManager.LayoutParams#FLAG_KEEP_SCREEN_ON}.
8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int KEEP_SCREEN_ON = 0x04000000;
8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * View flag indicating whether this view should have sound effects enabled
8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * for events such as clicking and touching.
8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int SOUND_EFFECTS_ENABLED = 0x08000000;
8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * View flag indicating whether this view should have haptic feedback
8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * enabled for events such as long presses.
8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int HAPTIC_FEEDBACK_ENABLED = 0x10000000;
8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
89075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * View flag indicating whether {@link #addFocusables(ArrayList, int, int)}
89175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * should add all focusable Views regardless if they are focusable in touch mode.
89275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
89375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    public static final int FOCUSABLES_ALL = 0x00000000;
89475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
89575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /**
89675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * View flag indicating whether {@link #addFocusables(ArrayList, int, int)}
89775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * should add only Views focusable in touch mode.
89875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
89975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    public static final int FOCUSABLES_TOUCH_MODE = 0x00000001;
90075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
90175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /**
9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use with {@link #focusSearch}. Move focus to the previous selectable
9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * item.
9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int FOCUS_BACKWARD = 0x00000001;
9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use with {@link #focusSearch}. Move focus to the next selectable
9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * item.
9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int FOCUS_FORWARD = 0x00000002;
9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use with {@link #focusSearch}. Move focus to the left.
9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int FOCUS_LEFT = 0x00000011;
9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use with {@link #focusSearch}. Move focus up.
9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int FOCUS_UP = 0x00000021;
9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use with {@link #focusSearch}. Move focus to the right.
9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int FOCUS_RIGHT = 0x00000042;
9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use with {@link #focusSearch}. Move focus down.
9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int FOCUS_DOWN = 0x00000082;
9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Base View state sets
9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Singles
9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Indicates the view has no states set. States are used with
9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.graphics.drawable.Drawable} to change the drawing of the
9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * view depending on its state.
9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.graphics.drawable.Drawable
9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getDrawableState()
9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected static final int[] EMPTY_STATE_SET = {};
9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Indicates the view is enabled. States are used with
9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.graphics.drawable.Drawable} to change the drawing of the
9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * view depending on its state.
9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.graphics.drawable.Drawable
9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getDrawableState()
9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected static final int[] ENABLED_STATE_SET = {R.attr.state_enabled};
9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Indicates the view is focused. States are used with
9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.graphics.drawable.Drawable} to change the drawing of the
9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * view depending on its state.
9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.graphics.drawable.Drawable
9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getDrawableState()
9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected static final int[] FOCUSED_STATE_SET = {R.attr.state_focused};
9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Indicates the view is selected. States are used with
9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.graphics.drawable.Drawable} to change the drawing of the
9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * view depending on its state.
9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.graphics.drawable.Drawable
9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getDrawableState()
9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected static final int[] SELECTED_STATE_SET = {R.attr.state_selected};
9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Indicates the view is pressed. States are used with
9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.graphics.drawable.Drawable} to change the drawing of the
9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * view depending on its state.
9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.graphics.drawable.Drawable
9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getDrawableState()
9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected static final int[] PRESSED_STATE_SET = {R.attr.state_pressed};
9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Indicates the view's window has focus. States are used with
9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.graphics.drawable.Drawable} to change the drawing of the
9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * view depending on its state.
9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.graphics.drawable.Drawable
9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getDrawableState()
9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected static final int[] WINDOW_FOCUSED_STATE_SET =
9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            {R.attr.state_window_focused};
9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Doubles
9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Indicates the view is enabled and has the focus.
9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #ENABLED_STATE_SET
9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #FOCUSED_STATE_SET
9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected static final int[] ENABLED_FOCUSED_STATE_SET =
10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            stateSetUnion(ENABLED_STATE_SET, FOCUSED_STATE_SET);
10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Indicates the view is enabled and selected.
10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #ENABLED_STATE_SET
10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #SELECTED_STATE_SET
10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected static final int[] ENABLED_SELECTED_STATE_SET =
10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            stateSetUnion(ENABLED_STATE_SET, SELECTED_STATE_SET);
10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Indicates the view is enabled and that its window has focus.
10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #ENABLED_STATE_SET
10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #WINDOW_FOCUSED_STATE_SET
10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected static final int[] ENABLED_WINDOW_FOCUSED_STATE_SET =
10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            stateSetUnion(ENABLED_STATE_SET, WINDOW_FOCUSED_STATE_SET);
10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Indicates the view is focused and selected.
10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #FOCUSED_STATE_SET
10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #SELECTED_STATE_SET
10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected static final int[] FOCUSED_SELECTED_STATE_SET =
10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            stateSetUnion(FOCUSED_STATE_SET, SELECTED_STATE_SET);
10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Indicates the view has the focus and that its window has the focus.
10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #FOCUSED_STATE_SET
10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #WINDOW_FOCUSED_STATE_SET
10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected static final int[] FOCUSED_WINDOW_FOCUSED_STATE_SET =
10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            stateSetUnion(FOCUSED_STATE_SET, WINDOW_FOCUSED_STATE_SET);
10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Indicates the view is selected and that its window has the focus.
10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #SELECTED_STATE_SET
10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #WINDOW_FOCUSED_STATE_SET
10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected static final int[] SELECTED_WINDOW_FOCUSED_STATE_SET =
10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            stateSetUnion(SELECTED_STATE_SET, WINDOW_FOCUSED_STATE_SET);
10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Triples
10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Indicates the view is enabled, focused and selected.
10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #ENABLED_STATE_SET
10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #FOCUSED_STATE_SET
10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #SELECTED_STATE_SET
10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected static final int[] ENABLED_FOCUSED_SELECTED_STATE_SET =
10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            stateSetUnion(ENABLED_FOCUSED_STATE_SET, SELECTED_STATE_SET);
10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Indicates the view is enabled, focused and its window has the focus.
10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #ENABLED_STATE_SET
10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #FOCUSED_STATE_SET
10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #WINDOW_FOCUSED_STATE_SET
10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected static final int[] ENABLED_FOCUSED_WINDOW_FOCUSED_STATE_SET =
10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            stateSetUnion(ENABLED_FOCUSED_STATE_SET, WINDOW_FOCUSED_STATE_SET);
10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Indicates the view is enabled, selected and its window has the focus.
10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #ENABLED_STATE_SET
10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #SELECTED_STATE_SET
10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #WINDOW_FOCUSED_STATE_SET
10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected static final int[] ENABLED_SELECTED_WINDOW_FOCUSED_STATE_SET =
10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            stateSetUnion(ENABLED_SELECTED_STATE_SET, WINDOW_FOCUSED_STATE_SET);
10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Indicates the view is focused, selected and its window has the focus.
10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #FOCUSED_STATE_SET
10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #SELECTED_STATE_SET
10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #WINDOW_FOCUSED_STATE_SET
10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected static final int[] FOCUSED_SELECTED_WINDOW_FOCUSED_STATE_SET =
10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            stateSetUnion(FOCUSED_SELECTED_STATE_SET, WINDOW_FOCUSED_STATE_SET);
10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Indicates the view is enabled, focused, selected and its window
10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * has the focus.
10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #ENABLED_STATE_SET
10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #FOCUSED_STATE_SET
10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #SELECTED_STATE_SET
10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #WINDOW_FOCUSED_STATE_SET
10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected static final int[] ENABLED_FOCUSED_SELECTED_WINDOW_FOCUSED_STATE_SET =
10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            stateSetUnion(ENABLED_FOCUSED_SELECTED_STATE_SET,
10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                          WINDOW_FOCUSED_STATE_SET);
10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Indicates the view is pressed and its window has the focus.
10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #PRESSED_STATE_SET
10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #WINDOW_FOCUSED_STATE_SET
10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected static final int[] PRESSED_WINDOW_FOCUSED_STATE_SET =
10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            stateSetUnion(PRESSED_STATE_SET, WINDOW_FOCUSED_STATE_SET);
11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Indicates the view is pressed and selected.
11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #PRESSED_STATE_SET
11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #SELECTED_STATE_SET
11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected static final int[] PRESSED_SELECTED_STATE_SET =
11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            stateSetUnion(PRESSED_STATE_SET, SELECTED_STATE_SET);
11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Indicates the view is pressed, selected and its window has the focus.
11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #PRESSED_STATE_SET
11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #SELECTED_STATE_SET
11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #WINDOW_FOCUSED_STATE_SET
11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected static final int[] PRESSED_SELECTED_WINDOW_FOCUSED_STATE_SET =
11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            stateSetUnion(PRESSED_SELECTED_STATE_SET, WINDOW_FOCUSED_STATE_SET);
11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Indicates the view is pressed and focused.
11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #PRESSED_STATE_SET
11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #FOCUSED_STATE_SET
11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected static final int[] PRESSED_FOCUSED_STATE_SET =
11279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            stateSetUnion(PRESSED_STATE_SET, FOCUSED_STATE_SET);
11289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
11309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Indicates the view is pressed, focused and its window has the focus.
11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #PRESSED_STATE_SET
11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #FOCUSED_STATE_SET
11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #WINDOW_FOCUSED_STATE_SET
11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected static final int[] PRESSED_FOCUSED_WINDOW_FOCUSED_STATE_SET =
11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            stateSetUnion(PRESSED_FOCUSED_STATE_SET, WINDOW_FOCUSED_STATE_SET);
11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Indicates the view is pressed, focused and selected.
11419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #PRESSED_STATE_SET
11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #SELECTED_STATE_SET
11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #FOCUSED_STATE_SET
11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected static final int[] PRESSED_FOCUSED_SELECTED_STATE_SET =
11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            stateSetUnion(PRESSED_FOCUSED_STATE_SET, SELECTED_STATE_SET);
11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Indicates the view is pressed, focused, selected and its window has the focus.
11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #PRESSED_STATE_SET
11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #FOCUSED_STATE_SET
11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #SELECTED_STATE_SET
11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #WINDOW_FOCUSED_STATE_SET
11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected static final int[] PRESSED_FOCUSED_SELECTED_WINDOW_FOCUSED_STATE_SET =
11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            stateSetUnion(PRESSED_FOCUSED_SELECTED_STATE_SET, WINDOW_FOCUSED_STATE_SET);
11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Indicates the view is pressed and enabled.
11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #PRESSED_STATE_SET
11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #ENABLED_STATE_SET
11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected static final int[] PRESSED_ENABLED_STATE_SET =
11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            stateSetUnion(PRESSED_STATE_SET, ENABLED_STATE_SET);
11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Indicates the view is pressed, enabled and its window has the focus.
11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #PRESSED_STATE_SET
11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #ENABLED_STATE_SET
11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #WINDOW_FOCUSED_STATE_SET
11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected static final int[] PRESSED_ENABLED_WINDOW_FOCUSED_STATE_SET =
11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            stateSetUnion(PRESSED_ENABLED_STATE_SET, WINDOW_FOCUSED_STATE_SET);
11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Indicates the view is pressed, enabled and selected.
11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #PRESSED_STATE_SET
11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #ENABLED_STATE_SET
11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #SELECTED_STATE_SET
11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected static final int[] PRESSED_ENABLED_SELECTED_STATE_SET =
11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            stateSetUnion(PRESSED_ENABLED_STATE_SET, SELECTED_STATE_SET);
11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Indicates the view is pressed, enabled, selected and its window has the
11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * focus.
11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #PRESSED_STATE_SET
11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #ENABLED_STATE_SET
11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #SELECTED_STATE_SET
11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #WINDOW_FOCUSED_STATE_SET
11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected static final int[] PRESSED_ENABLED_SELECTED_WINDOW_FOCUSED_STATE_SET =
11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            stateSetUnion(PRESSED_ENABLED_SELECTED_STATE_SET, WINDOW_FOCUSED_STATE_SET);
12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Indicates the view is pressed, enabled and focused.
12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #PRESSED_STATE_SET
12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #ENABLED_STATE_SET
12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #FOCUSED_STATE_SET
12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected static final int[] PRESSED_ENABLED_FOCUSED_STATE_SET =
12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            stateSetUnion(PRESSED_ENABLED_STATE_SET, FOCUSED_STATE_SET);
12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Indicates the view is pressed, enabled, focused and its window has the
12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * focus.
12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #PRESSED_STATE_SET
12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #ENABLED_STATE_SET
12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #FOCUSED_STATE_SET
12189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #WINDOW_FOCUSED_STATE_SET
12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected static final int[] PRESSED_ENABLED_FOCUSED_WINDOW_FOCUSED_STATE_SET =
12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            stateSetUnion(PRESSED_ENABLED_FOCUSED_STATE_SET, WINDOW_FOCUSED_STATE_SET);
12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Indicates the view is pressed, enabled, focused and selected.
12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #PRESSED_STATE_SET
12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #ENABLED_STATE_SET
12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #SELECTED_STATE_SET
12299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #FOCUSED_STATE_SET
12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected static final int[] PRESSED_ENABLED_FOCUSED_SELECTED_STATE_SET =
12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            stateSetUnion(PRESSED_ENABLED_FOCUSED_STATE_SET, SELECTED_STATE_SET);
12339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
12359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Indicates the view is pressed, enabled, focused, selected and its window
12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * has the focus.
12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #PRESSED_STATE_SET
12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #ENABLED_STATE_SET
12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #SELECTED_STATE_SET
12419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #FOCUSED_STATE_SET
12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #WINDOW_FOCUSED_STATE_SET
12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
12449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected static final int[] PRESSED_ENABLED_FOCUSED_SELECTED_WINDOW_FOCUSED_STATE_SET =
12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            stateSetUnion(PRESSED_ENABLED_FOCUSED_SELECTED_STATE_SET, WINDOW_FOCUSED_STATE_SET);
12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The order here is very important to {@link #getDrawableState()}
12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int[][] VIEW_STATE_SETS = {
12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        EMPTY_STATE_SET,                                           // 0 0 0 0 0
12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        WINDOW_FOCUSED_STATE_SET,                                  // 0 0 0 0 1
12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SELECTED_STATE_SET,                                        // 0 0 0 1 0
12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SELECTED_WINDOW_FOCUSED_STATE_SET,                         // 0 0 0 1 1
12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        FOCUSED_STATE_SET,                                         // 0 0 1 0 0
12569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        FOCUSED_WINDOW_FOCUSED_STATE_SET,                          // 0 0 1 0 1
12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        FOCUSED_SELECTED_STATE_SET,                                // 0 0 1 1 0
12589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        FOCUSED_SELECTED_WINDOW_FOCUSED_STATE_SET,                 // 0 0 1 1 1
12599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ENABLED_STATE_SET,                                         // 0 1 0 0 0
12609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ENABLED_WINDOW_FOCUSED_STATE_SET,                          // 0 1 0 0 1
12619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ENABLED_SELECTED_STATE_SET,                                // 0 1 0 1 0
12629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ENABLED_SELECTED_WINDOW_FOCUSED_STATE_SET,                 // 0 1 0 1 1
12639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ENABLED_FOCUSED_STATE_SET,                                 // 0 1 1 0 0
12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ENABLED_FOCUSED_WINDOW_FOCUSED_STATE_SET,                  // 0 1 1 0 1
12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ENABLED_FOCUSED_SELECTED_STATE_SET,                        // 0 1 1 1 0
12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ENABLED_FOCUSED_SELECTED_WINDOW_FOCUSED_STATE_SET,         // 0 1 1 1 1
12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PRESSED_STATE_SET,                                         // 1 0 0 0 0
12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PRESSED_WINDOW_FOCUSED_STATE_SET,                          // 1 0 0 0 1
12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PRESSED_SELECTED_STATE_SET,                                // 1 0 0 1 0
12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PRESSED_SELECTED_WINDOW_FOCUSED_STATE_SET,                 // 1 0 0 1 1
12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PRESSED_FOCUSED_STATE_SET,                                 // 1 0 1 0 0
12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PRESSED_FOCUSED_WINDOW_FOCUSED_STATE_SET,                  // 1 0 1 0 1
12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PRESSED_FOCUSED_SELECTED_STATE_SET,                        // 1 0 1 1 0
12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PRESSED_FOCUSED_SELECTED_WINDOW_FOCUSED_STATE_SET,         // 1 0 1 1 1
12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PRESSED_ENABLED_STATE_SET,                                 // 1 1 0 0 0
12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PRESSED_ENABLED_WINDOW_FOCUSED_STATE_SET,                  // 1 1 0 0 1
12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PRESSED_ENABLED_SELECTED_STATE_SET,                        // 1 1 0 1 0
12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PRESSED_ENABLED_SELECTED_WINDOW_FOCUSED_STATE_SET,         // 1 1 0 1 1
12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PRESSED_ENABLED_FOCUSED_STATE_SET,                         // 1 1 1 0 0
12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PRESSED_ENABLED_FOCUSED_WINDOW_FOCUSED_STATE_SET,          // 1 1 1 0 1
12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PRESSED_ENABLED_FOCUSED_SELECTED_STATE_SET,                // 1 1 1 1 0
12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PRESSED_ENABLED_FOCUSED_SELECTED_WINDOW_FOCUSED_STATE_SET, // 1 1 1 1 1
12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Used by views that contain lists of items. This state indicates that
12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the view is showing the last item.
12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected static final int[] LAST_STATE_SET = {R.attr.state_last};
12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Used by views that contain lists of items. This state indicates that
12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the view is showing the first item.
12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected static final int[] FIRST_STATE_SET = {R.attr.state_first};
12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Used by views that contain lists of items. This state indicates that
12999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the view is showing the middle item.
13009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
13019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected static final int[] MIDDLE_STATE_SET = {R.attr.state_middle};
13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Used by views that contain lists of items. This state indicates that
13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the view is showing only one item.
13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
13079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected static final int[] SINGLE_STATE_SET = {R.attr.state_single};
13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Used by views that contain lists of items. This state indicates that
13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the view is pressed and showing the last item.
13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected static final int[] PRESSED_LAST_STATE_SET = {R.attr.state_last, R.attr.state_pressed};
13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Used by views that contain lists of items. This state indicates that
13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the view is pressed and showing the first item.
13189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
13199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected static final int[] PRESSED_FIRST_STATE_SET = {R.attr.state_first, R.attr.state_pressed};
13219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Used by views that contain lists of items. This state indicates that
13239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the view is pressed and showing the middle item.
13249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
13259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected static final int[] PRESSED_MIDDLE_STATE_SET = {R.attr.state_middle, R.attr.state_pressed};
13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Used by views that contain lists of items. This state indicates that
13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the view is pressed and showing only one item.
13309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
13319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected static final int[] PRESSED_SINGLE_STATE_SET = {R.attr.state_single, R.attr.state_pressed};
13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Temporary Rect currently for use in setBackground().  This will probably
13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * be extended in the future to hold our own class with more than just
13379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * a Rect. :)
13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final ThreadLocal<Rect> sThreadLocal = new ThreadLocal<Rect>();
1340d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy
1341d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy    /**
1342d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy     * Map used to store views' tags.
1343d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy     */
1344d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy    private static WeakHashMap<View, SparseArray<Object>> sTags;
1345d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy
1346d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy    /**
1347d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy     * Lock used to access sTags.
1348d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy     */
1349d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy    private static final Object sTagsLock = new Object();
1350d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy
13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The animation currently associated with this view.
13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected Animation mCurrentAnimation = null;
13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Width as measured during measure pass.
13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @ViewDebug.ExportedProperty
13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected int mMeasuredWidth;
13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Height as measured during measure pass.
13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @ViewDebug.ExportedProperty
13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected int mMeasuredHeight;
13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The view's identifier.
13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
13749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
13759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setId(int)
13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getId()
13779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @ViewDebug.ExportedProperty(resolveId = true)
13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mID = NO_ID;
13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The view's tag.
13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setTag(Object)
13869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getTag()
13879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected Object mTag;
13899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // for mPrivateFlags:
13919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** {@hide} */
13929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int WANTS_FOCUS                    = 0x00000001;
13939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** {@hide} */
13949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int FOCUSED                        = 0x00000002;
13959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** {@hide} */
13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int SELECTED                       = 0x00000004;
13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** {@hide} */
13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int IS_ROOT_NAMESPACE              = 0x00000008;
13999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** {@hide} */
14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int HAS_BOUNDS                     = 0x00000010;
14019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** {@hide} */
14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int DRAWN                          = 0x00000020;
14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
14049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * When this flag is set, this view is running an animation on behalf of its
14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * children and should therefore not cancel invalidate requests, even if they
14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * lie outside of this view's bounds.
14079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
14109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int DRAW_ANIMATION                 = 0x00000040;
14119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** {@hide} */
14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int SKIP_DRAW                      = 0x00000080;
14139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** {@hide} */
14149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int ONLY_DRAWS_BACKGROUND          = 0x00000100;
14159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** {@hide} */
14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int REQUEST_TRANSPARENT_REGIONS    = 0x00000200;
14179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** {@hide} */
14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int DRAWABLE_STATE_DIRTY           = 0x00000400;
14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** {@hide} */
14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int MEASURED_DIMENSION_SET         = 0x00000800;
14219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** {@hide} */
14229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int FORCE_LAYOUT                   = 0x00001000;
14239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int LAYOUT_REQUIRED        = 0x00002000;
14259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int PRESSED                = 0x00004000;
14279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** {@hide} */
14299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int DRAWING_CACHE_VALID            = 0x00008000;
14309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
14319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Flag used to indicate that this view should be drawn once more (and only once
14329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * more) after its animation has completed.
14339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
14349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
14359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int ANIMATION_STARTED              = 0x00010000;
14369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int SAVE_STATE_CALLED      = 0x00020000;
14389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
14409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Indicates that the View returned true when onSetAlpha() was called and that
14419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the alpha must be restored.
14429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
14439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
14449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int ALPHA_SET                      = 0x00040000;
14459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
14479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set by {@link #setScrollContainer(boolean)}.
14489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
14499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int SCROLL_CONTAINER               = 0x00080000;
14509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
14529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set by {@link #setScrollContainer(boolean)}.
14539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
14549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int SCROLL_CONTAINER_ADDED         = 0x00100000;
14559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1457809a7f6080312f3e12f1a3a30eacf0e0c7627305Romain Guy     * View flag indicating whether this view was invalidated (fully or partially.)
1458809a7f6080312f3e12f1a3a30eacf0e0c7627305Romain Guy     *
1459809a7f6080312f3e12f1a3a30eacf0e0c7627305Romain Guy     * @hide
1460809a7f6080312f3e12f1a3a30eacf0e0c7627305Romain Guy     */
1461809a7f6080312f3e12f1a3a30eacf0e0c7627305Romain Guy    static final int DIRTY                          = 0x00200000;
1462809a7f6080312f3e12f1a3a30eacf0e0c7627305Romain Guy
1463809a7f6080312f3e12f1a3a30eacf0e0c7627305Romain Guy    /**
1464809a7f6080312f3e12f1a3a30eacf0e0c7627305Romain Guy     * View flag indicating whether this view was invalidated by an opaque
1465809a7f6080312f3e12f1a3a30eacf0e0c7627305Romain Guy     * invalidate request.
1466809a7f6080312f3e12f1a3a30eacf0e0c7627305Romain Guy     *
1467809a7f6080312f3e12f1a3a30eacf0e0c7627305Romain Guy     * @hide
1468809a7f6080312f3e12f1a3a30eacf0e0c7627305Romain Guy     */
1469809a7f6080312f3e12f1a3a30eacf0e0c7627305Romain Guy    static final int DIRTY_OPAQUE                   = 0x00400000;
1470809a7f6080312f3e12f1a3a30eacf0e0c7627305Romain Guy
1471809a7f6080312f3e12f1a3a30eacf0e0c7627305Romain Guy    /**
1472809a7f6080312f3e12f1a3a30eacf0e0c7627305Romain Guy     * Mask for {@link #DIRTY} and {@link #DIRTY_OPAQUE}.
1473809a7f6080312f3e12f1a3a30eacf0e0c7627305Romain Guy     *
1474809a7f6080312f3e12f1a3a30eacf0e0c7627305Romain Guy     * @hide
1475809a7f6080312f3e12f1a3a30eacf0e0c7627305Romain Guy     */
1476809a7f6080312f3e12f1a3a30eacf0e0c7627305Romain Guy    static final int DIRTY_MASK                     = 0x00600000;
1477809a7f6080312f3e12f1a3a30eacf0e0c7627305Romain Guy
1478809a7f6080312f3e12f1a3a30eacf0e0c7627305Romain Guy    /**
14798f1344f5e7c92f2fd532f65e5584afe0e4cc6b11Romain Guy     * Indicates whether the background is opaque.
14808f1344f5e7c92f2fd532f65e5584afe0e4cc6b11Romain Guy     *
14818f1344f5e7c92f2fd532f65e5584afe0e4cc6b11Romain Guy     * @hide
14828f1344f5e7c92f2fd532f65e5584afe0e4cc6b11Romain Guy     */
14838f1344f5e7c92f2fd532f65e5584afe0e4cc6b11Romain Guy    static final int OPAQUE_BACKGROUND              = 0x00800000;
14848f1344f5e7c92f2fd532f65e5584afe0e4cc6b11Romain Guy
14858f1344f5e7c92f2fd532f65e5584afe0e4cc6b11Romain Guy    /**
14868f1344f5e7c92f2fd532f65e5584afe0e4cc6b11Romain Guy     * Indicates whether the scrollbars are opaque.
14878f1344f5e7c92f2fd532f65e5584afe0e4cc6b11Romain Guy     *
14888f1344f5e7c92f2fd532f65e5584afe0e4cc6b11Romain Guy     * @hide
14898f1344f5e7c92f2fd532f65e5584afe0e4cc6b11Romain Guy     */
14908f1344f5e7c92f2fd532f65e5584afe0e4cc6b11Romain Guy    static final int OPAQUE_SCROLLBARS              = 0x01000000;
14918f1344f5e7c92f2fd532f65e5584afe0e4cc6b11Romain Guy
14928f1344f5e7c92f2fd532f65e5584afe0e4cc6b11Romain Guy    /**
14938f1344f5e7c92f2fd532f65e5584afe0e4cc6b11Romain Guy     * Indicates whether the view is opaque.
14948f1344f5e7c92f2fd532f65e5584afe0e4cc6b11Romain Guy     *
14958f1344f5e7c92f2fd532f65e5584afe0e4cc6b11Romain Guy     * @hide
14968f1344f5e7c92f2fd532f65e5584afe0e4cc6b11Romain Guy     */
14978f1344f5e7c92f2fd532f65e5584afe0e4cc6b11Romain Guy    static final int OPAQUE_MASK                    = 0x01800000;
1498e14579bac59aa84523c2bfbfc3f28c7842ec664dAdam Powell
1499e14579bac59aa84523c2bfbfc3f28c7842ec664dAdam Powell    /**
1500e14579bac59aa84523c2bfbfc3f28c7842ec664dAdam Powell     * Indicates a prepressed state;
1501e14579bac59aa84523c2bfbfc3f28c7842ec664dAdam Powell     * the short time between ACTION_DOWN and recognizing
1502e14579bac59aa84523c2bfbfc3f28c7842ec664dAdam Powell     * a 'real' press. Prepressed is used to recognize quick taps
1503e14579bac59aa84523c2bfbfc3f28c7842ec664dAdam Powell     * even when they are shorter than ViewConfiguration.getTapTimeout().
1504e14579bac59aa84523c2bfbfc3f28c7842ec664dAdam Powell     *
1505e14579bac59aa84523c2bfbfc3f28c7842ec664dAdam Powell     * @hide
1506e14579bac59aa84523c2bfbfc3f28c7842ec664dAdam Powell     */
1507e14579bac59aa84523c2bfbfc3f28c7842ec664dAdam Powell    private static final int PREPRESSED             = 0x02000000;
1508c9fbaabc1bbf847b6e8bf2595068cbd990f3da55Adam Powell
1509c9fbaabc1bbf847b6e8bf2595068cbd990f3da55Adam Powell    /**
15108afa515936e78ccfc5563ca9164dc9a50ca73db4Romain Guy     * Indicates whether the view is temporarily detached.
15118afa515936e78ccfc5563ca9164dc9a50ca73db4Romain Guy     *
15128afa515936e78ccfc5563ca9164dc9a50ca73db4Romain Guy     * @hide
15138afa515936e78ccfc5563ca9164dc9a50ca73db4Romain Guy     */
15148afa515936e78ccfc5563ca9164dc9a50ca73db4Romain Guy    static final int CANCEL_NEXT_UP_EVENT = 0x04000000;
15158568c3a09bff9bd2f7c9462b116bed0537d19342Adam Powell
15168568c3a09bff9bd2f7c9462b116bed0537d19342Adam Powell    /**
15178568c3a09bff9bd2f7c9462b116bed0537d19342Adam Powell     * Indicates that we should awaken scroll bars once attached
15188568c3a09bff9bd2f7c9462b116bed0537d19342Adam Powell     *
15198568c3a09bff9bd2f7c9462b116bed0537d19342Adam Powell     * @hide
15208568c3a09bff9bd2f7c9462b116bed0537d19342Adam Powell     */
15218568c3a09bff9bd2f7c9462b116bed0537d19342Adam Powell    private static final int AWAKEN_SCROLL_BARS_ON_ATTACH = 0x08000000;
15228f1344f5e7c92f2fd532f65e5584afe0e4cc6b11Romain Guy
15238f1344f5e7c92f2fd532f65e5584afe0e4cc6b11Romain Guy    /**
15249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The parent this view is attached to.
15259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
15269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
15279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getParent()
15289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
15299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected ViewParent mParent;
15309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
15329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
15339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
15349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    AttachInfo mAttachInfo;
15359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
15379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
15389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1539809a7f6080312f3e12f1a3a30eacf0e0c7627305Romain Guy    @ViewDebug.ExportedProperty(flagMapping = {
1540809a7f6080312f3e12f1a3a30eacf0e0c7627305Romain Guy        @ViewDebug.FlagToString(mask = FORCE_LAYOUT, equals = FORCE_LAYOUT,
1541809a7f6080312f3e12f1a3a30eacf0e0c7627305Romain Guy                name = "FORCE_LAYOUT"),
1542809a7f6080312f3e12f1a3a30eacf0e0c7627305Romain Guy        @ViewDebug.FlagToString(mask = LAYOUT_REQUIRED, equals = LAYOUT_REQUIRED,
1543809a7f6080312f3e12f1a3a30eacf0e0c7627305Romain Guy                name = "LAYOUT_REQUIRED"),
1544809a7f6080312f3e12f1a3a30eacf0e0c7627305Romain Guy        @ViewDebug.FlagToString(mask = DRAWING_CACHE_VALID, equals = DRAWING_CACHE_VALID,
15455bcdff45bf4ada77ae7c95f520b795876adef75cRomain Guy            name = "DRAWING_CACHE_INVALID", outputIf = false),
1546809a7f6080312f3e12f1a3a30eacf0e0c7627305Romain Guy        @ViewDebug.FlagToString(mask = DRAWN, equals = DRAWN, name = "DRAWN", outputIf = true),
1547809a7f6080312f3e12f1a3a30eacf0e0c7627305Romain Guy        @ViewDebug.FlagToString(mask = DRAWN, equals = DRAWN, name = "NOT_DRAWN", outputIf = false),
1548809a7f6080312f3e12f1a3a30eacf0e0c7627305Romain Guy        @ViewDebug.FlagToString(mask = DIRTY_MASK, equals = DIRTY_OPAQUE, name = "DIRTY_OPAQUE"),
1549809a7f6080312f3e12f1a3a30eacf0e0c7627305Romain Guy        @ViewDebug.FlagToString(mask = DIRTY_MASK, equals = DIRTY, name = "DIRTY")
1550809a7f6080312f3e12f1a3a30eacf0e0c7627305Romain Guy    })
15519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mPrivateFlags;
15529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
15549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Count of how many windows this view has been attached to.
15559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
15569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mWindowAttachCount;
15579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
15599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The layout parameters associated with this view and used by the parent
15609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link android.view.ViewGroup} to determine how this view should be
15619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * laid out.
15629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
15639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
15649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected ViewGroup.LayoutParams mLayoutParams;
15659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
15679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The view flags hold various views states.
15689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
15699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
15709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @ViewDebug.ExportedProperty
15719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mViewFlags;
15729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
15749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The distance in pixels from the left edge of this view's parent
15759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to the left edge of this view.
15769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
15779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
15789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @ViewDebug.ExportedProperty
15799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected int mLeft;
15809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
15819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The distance in pixels from the left edge of this view's parent
15829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to the right edge of this view.
15839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
15849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
15859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @ViewDebug.ExportedProperty
15869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected int mRight;
15879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
15889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The distance in pixels from the top edge of this view's parent
15899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to the top edge of this view.
15909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
15919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
15929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @ViewDebug.ExportedProperty
15939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected int mTop;
15949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
15959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The distance in pixels from the top edge of this view's parent
15969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to the bottom edge of this view.
15979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
15989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
15999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @ViewDebug.ExportedProperty
16009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected int mBottom;
16019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
16039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The offset, in pixels, by which the content of this view is scrolled
16049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * horizontally.
16059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
16069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
16079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @ViewDebug.ExportedProperty
16089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected int mScrollX;
16099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
16109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The offset, in pixels, by which the content of this view is scrolled
16119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * vertically.
16129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
16139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
16149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @ViewDebug.ExportedProperty
16159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected int mScrollY;
16169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
16189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The left padding in pixels, that is the distance in pixels between the
16199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * left edge of this view and the left edge of its content.
16209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
16219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
16229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @ViewDebug.ExportedProperty
16239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected int mPaddingLeft;
16249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
16259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The right padding in pixels, that is the distance in pixels between the
16269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * right edge of this view and the right edge of its content.
16279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
16289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
16299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @ViewDebug.ExportedProperty
16309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected int mPaddingRight;
16319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
16329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The top padding in pixels, that is the distance in pixels between the
16339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * top edge of this view and the top edge of its content.
16349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
16359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
16369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @ViewDebug.ExportedProperty
16379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected int mPaddingTop;
16389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
16399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The bottom padding in pixels, that is the distance in pixels between the
16409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * bottom edge of this view and the bottom edge of its content.
16419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
16429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
16439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @ViewDebug.ExportedProperty
16449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected int mPaddingBottom;
16459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
164775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * Briefly describes the view and is primarily used for accessibility support.
164875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
164975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    private CharSequence mContentDescription;
165075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
165175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /**
16529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Cache the paddingRight set by the user to append to the scrollbar's size.
16539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
16549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @ViewDebug.ExportedProperty
16559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mUserPaddingRight;
16569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
16589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Cache the paddingBottom set by the user to append to the scrollbar's size.
16599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
16609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @ViewDebug.ExportedProperty
16619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mUserPaddingBottom;
16629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1663c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    /**
1664c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project     * @hide
1665c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project     */
1666c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    int mOldWidthMeasureSpec = Integer.MIN_VALUE;
1667c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    /**
1668c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project     * @hide
1669c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project     */
1670c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project    int mOldHeightMeasureSpec = Integer.MIN_VALUE;
16719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Resources mResources = null;
16739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Drawable mBGDrawable;
16759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mBackgroundResource;
16779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean mBackgroundSizeChanged;
16789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
16809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Listener used to dispatch focus change events.
16819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This field should be made private, so it is hidden from the SDK.
16829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
16839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
16849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected OnFocusChangeListener mOnFocusChangeListener;
16859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
16879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Listener used to dispatch click events.
16889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This field should be made private, so it is hidden from the SDK.
16899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
16909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
16919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected OnClickListener mOnClickListener;
16929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
16949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Listener used to dispatch long click events.
16959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This field should be made private, so it is hidden from the SDK.
16969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
16979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
16989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected OnLongClickListener mOnLongClickListener;
16999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
17019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Listener used to build the context menu.
17029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This field should be made private, so it is hidden from the SDK.
17039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
17049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
17059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected OnCreateContextMenuListener mOnCreateContextMenuListener;
17069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private OnKeyListener mOnKeyListener;
17089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private OnTouchListener mOnTouchListener;
17109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
17129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The application environment this view lives in.
17139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This field should be made private, so it is hidden from the SDK.
17149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
17159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
17169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected Context mContext;
17179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private ScrollabilityCache mScrollCache;
17199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int[] mDrawableState = null;
17219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private SoftReference<Bitmap> mDrawingCache;
1723fbd8f69a84163ef1cf52b07966320caf448c2bc9Romain Guy    private SoftReference<Bitmap> mUnscaledDrawingCache;
17249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
17269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * When this view has focus and the next focus is {@link #FOCUS_LEFT},
17279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the user may specify which view to go to next.
17289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
17299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mNextFocusLeftId = View.NO_ID;
17309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
17329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * When this view has focus and the next focus is {@link #FOCUS_RIGHT},
17339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the user may specify which view to go to next.
17349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
17359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mNextFocusRightId = View.NO_ID;
17369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
17389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * When this view has focus and the next focus is {@link #FOCUS_UP},
17399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the user may specify which view to go to next.
17409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
17419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mNextFocusUpId = View.NO_ID;
17429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
17449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * When this view has focus and the next focus is {@link #FOCUS_DOWN},
17459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the user may specify which view to go to next.
17469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
17479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mNextFocusDownId = View.NO_ID;
17489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private CheckForLongPress mPendingCheckForLongPress;
1750e14579bac59aa84523c2bfbfc3f28c7842ec664dAdam Powell    private CheckForTap mPendingCheckForTap = null;
1751a35d7687dda3617b5b8cd4e8876d620223dd1613Adam Powell    private PerformClick mPerformClick;
1752e14579bac59aa84523c2bfbfc3f28c7842ec664dAdam Powell
17539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private UnsetPressedState mUnsetPressedState;
17549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
17569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Whether the long press's action has been invoked.  The tap's action is invoked on the
17579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * up event while a long press is invoked as soon as the long press duration is reached, so
17589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * a long press could be performed before the tap is checked, in which case the tap's action
17599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * should not be invoked.
17609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
17619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean mHasPerformedLongPress;
17629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
17649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The minimum height of the view. We'll try our best to have the height
17659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * of this view to at least this amount.
17669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
17679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @ViewDebug.ExportedProperty
17689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mMinHeight;
17699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
17719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The minimum width of the view. We'll try our best to have the width
17729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * of this view to at least this amount.
17739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
17749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @ViewDebug.ExportedProperty
17759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mMinWidth;
17769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
17789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The delegate to handle touch events that are physically in this view
17799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * but should be handled by another view.
17809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
17819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private TouchDelegate mTouchDelegate = null;
17829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
17849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Solid color to use as a background when creating the drawing cache. Enables
17859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the cache to use 16 bit bitmaps instead of 32 bit.
17869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
17879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mDrawingCacheBackgroundColor = 0;
17889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
17909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Special tree observer used when mAttachInfo is null.
17919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
17929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private ViewTreeObserver mFloatingTreeObserver;
1793e14579bac59aa84523c2bfbfc3f28c7842ec664dAdam Powell
1794e14579bac59aa84523c2bfbfc3f28c7842ec664dAdam Powell    /**
1795e14579bac59aa84523c2bfbfc3f28c7842ec664dAdam Powell     * Cache the touch slop from the context that created the view.
1796e14579bac59aa84523c2bfbfc3f28c7842ec664dAdam Powell     */
1797e14579bac59aa84523c2bfbfc3f28c7842ec664dAdam Powell    private int mTouchSlop;
17989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Used for debug only
18009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static long sInstanceCount = 0;
18019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
18039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Simple constructor to use when creating a view from code.
18049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
18059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param context The Context the view is running in, through which it can
18069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        access the current theme, resources, etc.
18079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
18089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public View(Context context) {
18099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext = context;
18109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mResources = context != null ? context.getResources() : null;
18118f1344f5e7c92f2fd532f65e5584afe0e4cc6b11Romain Guy        mViewFlags = SOUND_EFFECTS_ENABLED | HAPTIC_FEEDBACK_ENABLED;
181282fe564267f276151063b2aa0d26075c3210d75fCarl Shapiro        // Used for debug only
181382fe564267f276151063b2aa0d26075c3210d75fCarl Shapiro        //++sInstanceCount;
1814e14579bac59aa84523c2bfbfc3f28c7842ec664dAdam Powell        mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
18159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
18189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Constructor that is called when inflating a view from XML. This is called
18199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * when a view is being constructed from an XML file, supplying attributes
18209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that were specified in the XML file. This version uses a default style of
18219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * 0, so the only attribute values applied are those in the Context's Theme
18229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and the given AttributeSet.
18239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
18249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
18259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The method onFinishInflate() will be called after all children have been
18269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * added.
18279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
18289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param context The Context the view is running in, through which it can
18299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        access the current theme, resources, etc.
18309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param attrs The attributes of the XML tag that is inflating the view.
18319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #View(Context, AttributeSet, int)
18329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
18339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public View(Context context, AttributeSet attrs) {
18349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        this(context, attrs, 0);
18359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
18389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Perform inflation from XML and apply a class-specific base style. This
18399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * constructor of View allows subclasses to use their own base style when
18409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * they are inflating. For example, a Button class's constructor would call
18419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * this version of the super class constructor and supply
18429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <code>R.attr.buttonStyle</code> for <var>defStyle</var>; this allows
18439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the theme's button style to modify all of the base view attributes (in
18449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * particular its background) as well as the Button class's attributes.
18459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
18469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param context The Context the view is running in, through which it can
18479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        access the current theme, resources, etc.
18489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param attrs The attributes of the XML tag that is inflating the view.
18499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param defStyle The default style to apply to this view. If 0, no style
18509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        will be applied (beyond what is included in the theme). This may
18519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        either be an attribute resource, whose value will be retrieved
18529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        from the current theme, or an explicit style resource.
18539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #View(Context, AttributeSet)
18549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
18559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public View(Context context, AttributeSet attrs, int defStyle) {
18569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        this(context);
18579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray a = context.obtainStyledAttributes(attrs, com.android.internal.R.styleable.View,
18599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                defStyle, 0);
18609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Drawable background = null;
18629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int leftPadding = -1;
18649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int topPadding = -1;
18659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int rightPadding = -1;
18669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int bottomPadding = -1;
18679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int padding = -1;
18699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int viewFlagValues = 0;
18719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int viewFlagMasks = 0;
18729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean setScrollContainer = false;
18748506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
18759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int x = 0;
18769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int y = 0;
18779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int scrollbarStyle = SCROLLBARS_INSIDE_OVERLAY;
18799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int N = a.getIndexCount();
18819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < N; i++) {
18829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int attr = a.getIndex(i);
18839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            switch (attr) {
18849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case com.android.internal.R.styleable.View_background:
18859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    background = a.getDrawable(attr);
18869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
18879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case com.android.internal.R.styleable.View_padding:
18889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    padding = a.getDimensionPixelSize(attr, -1);
18899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
18909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 case com.android.internal.R.styleable.View_paddingLeft:
18919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    leftPadding = a.getDimensionPixelSize(attr, -1);
18929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
18939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case com.android.internal.R.styleable.View_paddingTop:
18949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    topPadding = a.getDimensionPixelSize(attr, -1);
18959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
18969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case com.android.internal.R.styleable.View_paddingRight:
18979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    rightPadding = a.getDimensionPixelSize(attr, -1);
18989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
18999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case com.android.internal.R.styleable.View_paddingBottom:
19009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    bottomPadding = a.getDimensionPixelSize(attr, -1);
19019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
19029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case com.android.internal.R.styleable.View_scrollX:
19039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    x = a.getDimensionPixelOffset(attr, 0);
19049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
19059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case com.android.internal.R.styleable.View_scrollY:
19069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    y = a.getDimensionPixelOffset(attr, 0);
19079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
19089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case com.android.internal.R.styleable.View_id:
19099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mID = a.getResourceId(attr, NO_ID);
19109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
19119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case com.android.internal.R.styleable.View_tag:
19129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mTag = a.getText(attr);
19139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
19149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case com.android.internal.R.styleable.View_fitsSystemWindows:
19159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (a.getBoolean(attr, false)) {
19169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        viewFlagValues |= FITS_SYSTEM_WINDOWS;
19179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        viewFlagMasks |= FITS_SYSTEM_WINDOWS;
19189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
19199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
19209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case com.android.internal.R.styleable.View_focusable:
19219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (a.getBoolean(attr, false)) {
19229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        viewFlagValues |= FOCUSABLE;
19239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        viewFlagMasks |= FOCUSABLE_MASK;
19249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
19259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
19269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case com.android.internal.R.styleable.View_focusableInTouchMode:
19279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (a.getBoolean(attr, false)) {
19289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        viewFlagValues |= FOCUSABLE_IN_TOUCH_MODE | FOCUSABLE;
19299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        viewFlagMasks |= FOCUSABLE_IN_TOUCH_MODE | FOCUSABLE_MASK;
19309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
19319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
19329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case com.android.internal.R.styleable.View_clickable:
19339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (a.getBoolean(attr, false)) {
19349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        viewFlagValues |= CLICKABLE;
19359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        viewFlagMasks |= CLICKABLE;
19369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
19379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
19389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case com.android.internal.R.styleable.View_longClickable:
19399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (a.getBoolean(attr, false)) {
19409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        viewFlagValues |= LONG_CLICKABLE;
19419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        viewFlagMasks |= LONG_CLICKABLE;
19429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
19439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
19449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case com.android.internal.R.styleable.View_saveEnabled:
19459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!a.getBoolean(attr, true)) {
19469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        viewFlagValues |= SAVE_DISABLED;
19479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        viewFlagMasks |= SAVE_DISABLED_MASK;
19489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
19499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
19509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case com.android.internal.R.styleable.View_duplicateParentState:
19519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (a.getBoolean(attr, false)) {
19529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        viewFlagValues |= DUPLICATE_PARENT_STATE;
19539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        viewFlagMasks |= DUPLICATE_PARENT_STATE;
19549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
19559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
19569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case com.android.internal.R.styleable.View_visibility:
19579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final int visibility = a.getInt(attr, 0);
19589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (visibility != 0) {
19599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        viewFlagValues |= VISIBILITY_FLAGS[visibility];
19609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        viewFlagMasks |= VISIBILITY_MASK;
19619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
19629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
19639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case com.android.internal.R.styleable.View_drawingCacheQuality:
19649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final int cacheQuality = a.getInt(attr, 0);
19659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (cacheQuality != 0) {
19669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        viewFlagValues |= DRAWING_CACHE_QUALITY_FLAGS[cacheQuality];
19679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        viewFlagMasks |= DRAWING_CACHE_QUALITY_MASK;
19689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
19699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
197075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov                case com.android.internal.R.styleable.View_contentDescription:
197175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov                    mContentDescription = a.getString(attr);
197275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov                    break;
19739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case com.android.internal.R.styleable.View_soundEffectsEnabled:
19749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!a.getBoolean(attr, true)) {
19759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        viewFlagValues &= ~SOUND_EFFECTS_ENABLED;
19769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        viewFlagMasks |= SOUND_EFFECTS_ENABLED;
19779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
197861ab270c17094ef1373f54d8fb9ade6d287c3a60Karl Rosaen                    break;
19799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case com.android.internal.R.styleable.View_hapticFeedbackEnabled:
19809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!a.getBoolean(attr, true)) {
19819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        viewFlagValues &= ~HAPTIC_FEEDBACK_ENABLED;
19829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        viewFlagMasks |= HAPTIC_FEEDBACK_ENABLED;
19839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
198461ab270c17094ef1373f54d8fb9ade6d287c3a60Karl Rosaen                    break;
19859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case R.styleable.View_scrollbars:
19869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final int scrollbars = a.getInt(attr, SCROLLBARS_NONE);
19879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (scrollbars != SCROLLBARS_NONE) {
19889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        viewFlagValues |= scrollbars;
19899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        viewFlagMasks |= SCROLLBARS_MASK;
19909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        initializeScrollbars(a);
19919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
19929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
19939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case R.styleable.View_fadingEdge:
19949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final int fadingEdge = a.getInt(attr, FADING_EDGE_NONE);
19959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (fadingEdge != FADING_EDGE_NONE) {
19969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        viewFlagValues |= fadingEdge;
19979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        viewFlagMasks |= FADING_EDGE_MASK;
19989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        initializeFadingEdge(a);
19999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
20009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
20019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case R.styleable.View_scrollbarStyle:
20029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    scrollbarStyle = a.getInt(attr, SCROLLBARS_INSIDE_OVERLAY);
20039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (scrollbarStyle != SCROLLBARS_INSIDE_OVERLAY) {
20049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        viewFlagValues |= scrollbarStyle & SCROLLBARS_STYLE_MASK;
20059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        viewFlagMasks |= SCROLLBARS_STYLE_MASK;
20069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
20079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
20089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case R.styleable.View_isScrollContainer:
20099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    setScrollContainer = true;
20109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (a.getBoolean(attr, false)) {
20119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        setScrollContainer(true);
20129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
20139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
20149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case com.android.internal.R.styleable.View_keepScreenOn:
20159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (a.getBoolean(attr, false)) {
20169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        viewFlagValues |= KEEP_SCREEN_ON;
20179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        viewFlagMasks |= KEEP_SCREEN_ON;
20189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
20199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
20209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case R.styleable.View_nextFocusLeft:
20219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mNextFocusLeftId = a.getResourceId(attr, View.NO_ID);
20229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
20239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case R.styleable.View_nextFocusRight:
20249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mNextFocusRightId = a.getResourceId(attr, View.NO_ID);
20259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
20269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case R.styleable.View_nextFocusUp:
20279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mNextFocusUpId = a.getResourceId(attr, View.NO_ID);
20289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
20299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case R.styleable.View_nextFocusDown:
20309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mNextFocusDownId = a.getResourceId(attr, View.NO_ID);
20319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
20329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case R.styleable.View_minWidth:
20339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mMinWidth = a.getDimensionPixelSize(attr, 0);
20349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
20359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case R.styleable.View_minHeight:
20369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mMinHeight = a.getDimensionPixelSize(attr, 0);
20379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
20389a81736176f507489f262344b6e3d55bbe53be7cRomain Guy                case R.styleable.View_onClick:
2039870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy                    if (context.isRestricted()) {
2040870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy                        throw new IllegalStateException("The android:onClick attribute cannot "
2041870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy                                + "be used within a restricted context");
2042870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy                    }
2043870e09fcd2dfdc12ac318962efd28b0420c562bbRomain Guy
20449a81736176f507489f262344b6e3d55bbe53be7cRomain Guy                    final String handlerName = a.getString(attr);
20459a81736176f507489f262344b6e3d55bbe53be7cRomain Guy                    if (handlerName != null) {
20469a81736176f507489f262344b6e3d55bbe53be7cRomain Guy                        setOnClickListener(new OnClickListener() {
20479a81736176f507489f262344b6e3d55bbe53be7cRomain Guy                            private Method mHandler;
20489a81736176f507489f262344b6e3d55bbe53be7cRomain Guy
20499a81736176f507489f262344b6e3d55bbe53be7cRomain Guy                            public void onClick(View v) {
20509a81736176f507489f262344b6e3d55bbe53be7cRomain Guy                                if (mHandler == null) {
20519a81736176f507489f262344b6e3d55bbe53be7cRomain Guy                                    try {
20529a81736176f507489f262344b6e3d55bbe53be7cRomain Guy                                        mHandler = getContext().getClass().getMethod(handlerName,
20539a81736176f507489f262344b6e3d55bbe53be7cRomain Guy                                                View.class);
20549a81736176f507489f262344b6e3d55bbe53be7cRomain Guy                                    } catch (NoSuchMethodException e) {
205542e14d74f3a1e146091e627ae3067651c6dab104Joe Onorato                                        int id = getId();
205642e14d74f3a1e146091e627ae3067651c6dab104Joe Onorato                                        String idText = id == NO_ID ? "" : " with id '"
205742e14d74f3a1e146091e627ae3067651c6dab104Joe Onorato                                                + getContext().getResources().getResourceEntryName(
205842e14d74f3a1e146091e627ae3067651c6dab104Joe Onorato                                                    id) + "'";
20599a81736176f507489f262344b6e3d55bbe53be7cRomain Guy                                        throw new IllegalStateException("Could not find a method " +
206042e14d74f3a1e146091e627ae3067651c6dab104Joe Onorato                                                handlerName + "(View) in the activity "
206142e14d74f3a1e146091e627ae3067651c6dab104Joe Onorato                                                + getContext().getClass() + " for onClick handler"
206242e14d74f3a1e146091e627ae3067651c6dab104Joe Onorato                                                + " on view " + View.this.getClass() + idText, e);
20639a81736176f507489f262344b6e3d55bbe53be7cRomain Guy                                    }
20649a81736176f507489f262344b6e3d55bbe53be7cRomain Guy                                }
20659a81736176f507489f262344b6e3d55bbe53be7cRomain Guy
20669a81736176f507489f262344b6e3d55bbe53be7cRomain Guy                                try {
20679a81736176f507489f262344b6e3d55bbe53be7cRomain Guy                                    mHandler.invoke(getContext(), View.this);
20689a81736176f507489f262344b6e3d55bbe53be7cRomain Guy                                } catch (IllegalAccessException e) {
20699a81736176f507489f262344b6e3d55bbe53be7cRomain Guy                                    throw new IllegalStateException("Could not execute non "
20709a81736176f507489f262344b6e3d55bbe53be7cRomain Guy                                            + "public method of the activity", e);
20719a81736176f507489f262344b6e3d55bbe53be7cRomain Guy                                } catch (InvocationTargetException e) {
20729a81736176f507489f262344b6e3d55bbe53be7cRomain Guy                                    throw new IllegalStateException("Could not execute "
20739a81736176f507489f262344b6e3d55bbe53be7cRomain Guy                                            + "method of the activity", e);
20749a81736176f507489f262344b6e3d55bbe53be7cRomain Guy                                }
20759a81736176f507489f262344b6e3d55bbe53be7cRomain Guy                            }
20769a81736176f507489f262344b6e3d55bbe53be7cRomain Guy                        });
20779a81736176f507489f262344b6e3d55bbe53be7cRomain Guy                    }
20789a81736176f507489f262344b6e3d55bbe53be7cRomain Guy                    break;
20799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (background != null) {
20839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            setBackgroundDrawable(background);
20849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (padding >= 0) {
20879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            leftPadding = padding;
20889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            topPadding = padding;
20899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            rightPadding = padding;
20909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            bottomPadding = padding;
20919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // If the user specified the padding (either with android:padding or
20949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // android:paddingLeft/Top/Right/Bottom), use this padding, otherwise
20959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // use the default padding or the padding from the background drawable
20969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // (stored at this point in mPadding*)
20979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setPadding(leftPadding >= 0 ? leftPadding : mPaddingLeft,
20989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                topPadding >= 0 ? topPadding : mPaddingTop,
20999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                rightPadding >= 0 ? rightPadding : mPaddingRight,
21009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                bottomPadding >= 0 ? bottomPadding : mPaddingBottom);
21019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (viewFlagMasks != 0) {
21039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            setFlags(viewFlagValues, viewFlagMasks);
21049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Needs to be called after mViewFlags is set
21079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (scrollbarStyle != SCROLLBARS_INSIDE_OVERLAY) {
21089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            recomputePadding();
21099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (x != 0 || y != 0) {
21129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            scrollTo(x, y);
21139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!setScrollContainer && (viewFlagValues&SCROLLBARS_VERTICAL) != 0) {
21169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            setScrollContainer(true);
21179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21188f1344f5e7c92f2fd532f65e5584afe0e4cc6b11Romain Guy
21198f1344f5e7c92f2fd532f65e5584afe0e4cc6b11Romain Guy        computeOpaqueFlags();
21208f1344f5e7c92f2fd532f65e5584afe0e4cc6b11Romain Guy
21219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        a.recycle();
21229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
21239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
21259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Non-public constructor for use in testing
21269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
21279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    View() {
21289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
21299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
213082fe564267f276151063b2aa0d26075c3210d75fCarl Shapiro    // Used for debug only
213182fe564267f276151063b2aa0d26075c3210d75fCarl Shapiro    /*
21329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
21339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void finalize() throws Throwable {
21349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super.finalize();
21359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        --sInstanceCount;
21369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
213782fe564267f276151063b2aa0d26075c3210d75fCarl Shapiro    */
21389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
21409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
21419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Initializes the fading edges from a given set of styled attributes. This
21429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * method should be called by subclasses that need fading edges and when an
21439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * instance of these subclasses is created programmatically rather than
21449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * being inflated from XML. This method is automatically called when the XML
21459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is inflated.
21469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * </p>
21479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
21489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param a the styled attributes set to initialize the fading edges from
21499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
21509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void initializeFadingEdge(TypedArray a) {
21519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        initScrollCache();
21529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScrollCache.fadingEdgeLength = a.getDimensionPixelSize(
21549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                R.styleable.View_fadingEdgeLength,
21559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ViewConfiguration.get(mContext).getScaledFadingEdgeLength());
21569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
21579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
21599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the size of the vertical faded edges used to indicate that more
21609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * content in this view is visible.
21619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
21629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The size in pixels of the vertical faded edge or 0 if vertical
21639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         faded edges are not enabled for this view.
21649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @attr ref android.R.styleable#View_fadingEdgeLength
21659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
21669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getVerticalFadingEdgeLength() {
21679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (isVerticalFadingEdgeEnabled()) {
21689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ScrollabilityCache cache = mScrollCache;
21699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (cache != null) {
21709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return cache.fadingEdgeLength;
21719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
21729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
21749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
21759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
21779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set the size of the faded edge used to indicate that more content in this
21789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * view is available.  Will not change whether the fading edge is enabled; use
21799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #setVerticalFadingEdgeEnabled} or {@link #setHorizontalFadingEdgeEnabled}
21809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to enable the fading edge for the vertical or horizontal fading edges.
21819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
21829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param length The size in pixels of the faded edge used to indicate that more
21839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        content in this view is visible.
21849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
21859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setFadingEdgeLength(int length) {
21869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        initScrollCache();
21879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScrollCache.fadingEdgeLength = length;
21889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
21899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
21919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the size of the horizontal faded edges used to indicate that more
21929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * content in this view is visible.
21939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
21949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The size in pixels of the horizontal faded edge or 0 if horizontal
21959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         faded edges are not enabled for this view.
21969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @attr ref android.R.styleable#View_fadingEdgeLength
21979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
21989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getHorizontalFadingEdgeLength() {
21999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (isHorizontalFadingEdgeEnabled()) {
22009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ScrollabilityCache cache = mScrollCache;
22019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (cache != null) {
22029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return cache.fadingEdgeLength;
22039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
22049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
22069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
22079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
22099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the width of the vertical scrollbar.
22109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
22119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The width in pixels of the vertical scrollbar or 0 if there
22129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         is no vertical scrollbar.
22139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
22149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getVerticalScrollbarWidth() {
22159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ScrollabilityCache cache = mScrollCache;
22169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (cache != null) {
22179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ScrollBarDrawable scrollBar = cache.scrollBar;
22189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (scrollBar != null) {
22199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int size = scrollBar.getSize(true);
22209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (size <= 0) {
22219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    size = cache.scrollBarSize;
22229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
22239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return size;
22249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
22259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return 0;
22269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
22289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
22299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
22319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the height of the horizontal scrollbar.
22329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
22339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The height in pixels of the horizontal scrollbar or 0 if
22349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         there is no horizontal scrollbar.
22359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
22369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected int getHorizontalScrollbarHeight() {
22379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ScrollabilityCache cache = mScrollCache;
22389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (cache != null) {
22399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ScrollBarDrawable scrollBar = cache.scrollBar;
22409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (scrollBar != null) {
22419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int size = scrollBar.getSize(false);
22429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (size <= 0) {
22439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    size = cache.scrollBarSize;
22449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
22459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return size;
22469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
22479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return 0;
22489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
22509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
22519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
22539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
22549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Initializes the scrollbars from a given set of styled attributes. This
22559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * method should be called by subclasses that need scrollbars and when an
22569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * instance of these subclasses is created programmatically rather than
22579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * being inflated from XML. This method is automatically called when the XML
22589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is inflated.
22599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * </p>
22609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
22619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param a the styled attributes set to initialize the scrollbars from
22629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
22639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void initializeScrollbars(TypedArray a) {
22649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        initScrollCache();
22659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final ScrollabilityCache scrollabilityCache = mScrollCache;
2267f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron
2268f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron        if (scrollabilityCache.scrollBar == null) {
2269f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron            scrollabilityCache.scrollBar = new ScrollBarDrawable();
2270f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron        }
2271f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron
22728bda24874f1da3ca10e40bd0a11154911337b2acRomain Guy        final boolean fadeScrollbars = a.getBoolean(R.styleable.View_fadeScrollbars, true);
22739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2274f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron        if (!fadeScrollbars) {
2275f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron            scrollabilityCache.state = ScrollabilityCache.ON;
2276f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron        }
2277f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron        scrollabilityCache.fadeScrollBars = fadeScrollbars;
2278f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron
2279f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron
2280f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron        scrollabilityCache.scrollBarFadeDuration = a.getInt(
2281f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron                R.styleable.View_scrollbarFadeDuration, ViewConfiguration
2282f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron                        .getScrollBarFadeDuration());
2283f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron        scrollabilityCache.scrollBarDefaultDelayBeforeFade = a.getInt(
2284f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron                R.styleable.View_scrollbarDefaultDelayBeforeFade,
2285f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron                ViewConfiguration.getScrollDefaultDelay());
2286f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron
2287f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron
22889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        scrollabilityCache.scrollBarSize = a.getDimensionPixelSize(
22899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.styleable.View_scrollbarSize,
22909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ViewConfiguration.get(mContext).getScaledScrollBarSize());
22919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Drawable track = a.getDrawable(R.styleable.View_scrollbarTrackHorizontal);
22939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        scrollabilityCache.scrollBar.setHorizontalTrackDrawable(track);
22949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Drawable thumb = a.getDrawable(R.styleable.View_scrollbarThumbHorizontal);
22969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (thumb != null) {
22979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            scrollabilityCache.scrollBar.setHorizontalThumbDrawable(thumb);
22989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean alwaysDraw = a.getBoolean(R.styleable.View_scrollbarAlwaysDrawHorizontalTrack,
23019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false);
23029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (alwaysDraw) {
23039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            scrollabilityCache.scrollBar.setAlwaysDrawHorizontalTrack(true);
23049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        track = a.getDrawable(R.styleable.View_scrollbarTrackVertical);
23079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        scrollabilityCache.scrollBar.setVerticalTrackDrawable(track);
23089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        thumb = a.getDrawable(R.styleable.View_scrollbarThumbVertical);
23109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (thumb != null) {
23119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            scrollabilityCache.scrollBar.setVerticalThumbDrawable(thumb);
23129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        alwaysDraw = a.getBoolean(R.styleable.View_scrollbarAlwaysDrawVerticalTrack,
23159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                false);
23169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (alwaysDraw) {
23179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            scrollabilityCache.scrollBar.setAlwaysDrawVerticalTrack(true);
23189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Re-apply user/background padding so that scrollbar(s) get added
23219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        recomputePadding();
23229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
23239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
23259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
23269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Initalizes the scrollability cache if necessary.
23279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * </p>
23289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
23299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void initScrollCache() {
23309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mScrollCache == null) {
2331f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron            mScrollCache = new ScrollabilityCache(ViewConfiguration.get(mContext), this);
23329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
23349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
23369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Register a callback to be invoked when focus of this view changed.
23379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
23389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param l The callback that will run.
23399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
23409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setOnFocusChangeListener(OnFocusChangeListener l) {
23419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOnFocusChangeListener = l;
23429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
23439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
23459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the focus-change callback registered for this view.
23469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
23479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The callback, or null if one is not registered.
23489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
23499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public OnFocusChangeListener getOnFocusChangeListener() {
23509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mOnFocusChangeListener;
23519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
23529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
23549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Register a callback to be invoked when this view is clicked. If this view is not
23559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * clickable, it becomes clickable.
23569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
23579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param l The callback that will run
23589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
23599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setClickable(boolean)
23609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
23619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setOnClickListener(OnClickListener l) {
23629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!isClickable()) {
23639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            setClickable(true);
23649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOnClickListener = l;
23669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
23679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
23699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Register a callback to be invoked when this view is clicked and held. If this view is not
23709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * long clickable, it becomes long clickable.
23719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
23729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param l The callback that will run
23739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
23749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setLongClickable(boolean)
23759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
23769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setOnLongClickListener(OnLongClickListener l) {
23779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!isLongClickable()) {
23789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            setLongClickable(true);
23799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOnLongClickListener = l;
23819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
23829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
23849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Register a callback to be invoked when the context menu for this view is
23859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * being built. If this view is not long clickable, it becomes long clickable.
23869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
23879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param l The callback that will run
23889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
23899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
23909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setOnCreateContextMenuListener(OnCreateContextMenuListener l) {
23919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!isLongClickable()) {
23929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            setLongClickable(true);
23939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOnCreateContextMenuListener = l;
23959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
23969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
23989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Call this view's OnClickListener, if it is defined.
23999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
24009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return True there was an assigned OnClickListener that was called, false
24019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         otherwise is returned.
24029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
24039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean performClick() {
240475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED);
240575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
24069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mOnClickListener != null) {
24079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            playSoundEffect(SoundEffectConstants.CLICK);
24089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mOnClickListener.onClick(this);
24099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
24109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
24139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
24149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
24169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Call this view's OnLongClickListener, if it is defined. Invokes the context menu
24179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * if the OnLongClickListener did not consume the event.
24189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
24199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return True there was an assigned OnLongClickListener that was called, false
24209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         otherwise is returned.
24219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
24229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean performLongClick() {
242375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_LONG_CLICKED);
242475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
24259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean handled = false;
24269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mOnLongClickListener != null) {
24279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            handled = mOnLongClickListener.onLongClick(View.this);
24289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!handled) {
24309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            handled = showContextMenu();
24319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (handled) {
24339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            performHapticFeedback(HapticFeedbackConstants.LONG_PRESS);
24349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return handled;
24369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
24379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
24399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Bring up the context menu for this view.
24409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
24419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Whether a context menu was displayed.
24429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
24439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean showContextMenu() {
24449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getParent().showContextMenuForChild(this);
24459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
24469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
24489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Register a callback to be invoked when a key is pressed in this view.
24499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param l the key listener to attach to this view
24509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
24519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setOnKeyListener(OnKeyListener l) {
24529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOnKeyListener = l;
24539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
24549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
24569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Register a callback to be invoked when a touch event is sent to this view.
24579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param l the touch listener to attach to this view
24589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
24599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setOnTouchListener(OnTouchListener l) {
24609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOnTouchListener = l;
24619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
24629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
24649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Give this view focus. This will cause {@link #onFocusChanged} to be called.
24659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
24669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Note: this does not check whether this {@link View} should get focus, it just
24679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * gives it focus no matter what.  It should only be called internally by framework
24689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * code that knows what it is doing, namely {@link #requestFocus(int, Rect)}.
24699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
24709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param direction values are View.FOCUS_UP, View.FOCUS_DOWN,
24719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        View.FOCUS_LEFT or View.FOCUS_RIGHT. This is the direction which
24729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        focus moved when requestFocus() is called. It may not always
24739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        apply, in which case use the default View.FOCUS_DOWN.
24749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param previouslyFocusedRect The rectangle of the view that had focus
24759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        prior in this View's coordinate system.
24769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
24779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void handleFocusGainInternal(int direction, Rect previouslyFocusedRect) {
24789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (DBG) {
24799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            System.out.println(this + " requestFocus()");
24809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((mPrivateFlags & FOCUSED) == 0) {
24839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPrivateFlags |= FOCUSED;
24849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mParent != null) {
24869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mParent.requestChildFocus(this, this);
24879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
24889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            onFocusChanged(true, direction, previouslyFocusedRect);
24909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            refreshDrawableState();
24919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
24939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
24959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Request that a rectangle of this view be visible on the screen,
24969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * scrolling if necessary just enough.
24979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
24989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>A View should call this if it maintains some notion of which part
24999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * of its content is interesting.  For example, a text editing view
25009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * should call this when its cursor moves.
25019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
25029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param rectangle The rectangle.
25039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Whether any parent scrolled.
25049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
25059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean requestRectangleOnScreen(Rect rectangle) {
25069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return requestRectangleOnScreen(rectangle, false);
25079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
25089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
25109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Request that a rectangle of this view be visible on the screen,
25119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * scrolling if necessary just enough.
25129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
25139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>A View should call this if it maintains some notion of which part
25149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * of its content is interesting.  For example, a text editing view
25159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * should call this when its cursor moves.
25169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
25179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>When <code>immediate</code> is set to true, scrolling will not be
25189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * animated.
25199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
25209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param rectangle The rectangle.
25219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param immediate True to forbid animated scrolling, false otherwise
25229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Whether any parent scrolled.
25239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
25249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean requestRectangleOnScreen(Rect rectangle, boolean immediate) {
25259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        View child = this;
25269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ViewParent parent = mParent;
25279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean scrolled = false;
25289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (parent != null) {
25299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            scrolled |= parent.requestChildRectangleOnScreen(child,
25309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    rectangle, immediate);
25319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // offset rect so next call has the rectangle in the
25339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // coordinate system of its direct child.
25349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            rectangle.offset(child.getLeft(), child.getTop());
25359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            rectangle.offset(-child.getScrollX(), -child.getScrollY());
25369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!(parent instanceof View)) {
25389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
25399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
25408506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
25419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            child = (View) parent;
25429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            parent = child.getParent();
25439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return scrolled;
25459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
25469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
25489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called when this view wants to give up focus. This will cause
25499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onFocusChanged} to be called.
25509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
25519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void clearFocus() {
25529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (DBG) {
25539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            System.out.println(this + " clearFocus()");
25549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((mPrivateFlags & FOCUSED) != 0) {
25579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPrivateFlags &= ~FOCUSED;
25589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mParent != null) {
25609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mParent.clearChildFocus(this);
25619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
25629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            onFocusChanged(false, 0, null);
25649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            refreshDrawableState();
25659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
25679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
25699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called to clear the focus of a view that is about to be removed.
25709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Doesn't call clearChildFocus, which prevents this view from taking
25719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * focus again before it has been removed from the parent
25729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
25739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void clearFocusForRemoval() {
25749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((mPrivateFlags & FOCUSED) != 0) {
25759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPrivateFlags &= ~FOCUSED;
25769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            onFocusChanged(false, 0, null);
25789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            refreshDrawableState();
25799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
25819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
25839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called internally by the view system when a new view is getting focus.
25849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This is what clears the old focus.
25859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
25869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void unFocus() {
25879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (DBG) {
25889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            System.out.println(this + " unFocus()");
25899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((mPrivateFlags & FOCUSED) != 0) {
25929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPrivateFlags &= ~FOCUSED;
25939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            onFocusChanged(false, 0, null);
25959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            refreshDrawableState();
25969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
25989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
26009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns true if this view has focus iteself, or is the ancestor of the
26019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * view that has focus.
26029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
26039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return True if this view has or contains focus, false otherwise.
26049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
26059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @ViewDebug.ExportedProperty
26069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean hasFocus() {
26079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (mPrivateFlags & FOCUSED) != 0;
26089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
26099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
26119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns true if this view is focusable or if it contains a reachable View
26129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * for which {@link #hasFocusable()} returns true. A "reachable hasFocusable()"
26139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is a View whose parents do not block descendants focus.
26149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
26159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Only {@link #VISIBLE} views are considered focusable.
26169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
26179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return True if the view is focusable or if the view contains a focusable
26189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         View, false otherwise.
26199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
26209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see ViewGroup#FOCUS_BLOCK_DESCENDANTS
26219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
26229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean hasFocusable() {
26239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (mViewFlags & VISIBILITY_MASK) == VISIBLE && isFocusable();
26249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
26259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
26279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called by the view system when the focus state of this view changes.
26289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * When the focus change event is caused by directional navigation, direction
26299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and previouslyFocusedRect provide insight into where the focus is coming from.
26309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * When overriding, be sure to call up through to the super class so that
26319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the standard focus handling will occur.
26328506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy     *
26339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param gainFocus True if the View has focus; false otherwise.
26349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param direction The direction focus has moved when requestFocus()
26359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                  is called to give this view focus. Values are
2636ea4823c1c7fdee093789850d0f76a3df22ca58d2Romain Guy     *                  {@link #FOCUS_UP}, {@link #FOCUS_DOWN}, {@link #FOCUS_LEFT} or
2637ea4823c1c7fdee093789850d0f76a3df22ca58d2Romain Guy     *                  {@link #FOCUS_RIGHT}. It may not always apply, in which
26389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                  case use the default.
26399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param previouslyFocusedRect The rectangle, in this view's coordinate
26409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        system, of the previously focused view.  If applicable, this will be
26419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        passed in as finer grained information about where the focus is coming
26429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        from (in addition to direction).  Will be <code>null</code> otherwise.
26439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
26449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onFocusChanged(boolean gainFocus, int direction, Rect previouslyFocusedRect) {
264575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        if (gainFocus) {
264675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov            sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED);
264775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        }
264875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
26499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        InputMethodManager imm = InputMethodManager.peekInstance();
26509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!gainFocus) {
26519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (isPressed()) {
26529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                setPressed(false);
26539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
26549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (imm != null && mAttachInfo != null
26559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    && mAttachInfo.mHasWindowFocus) {
26569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                imm.focusOut(this);
26579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2658a2431d0ba24ca7d79d21b2df63f9a58025702c7eRomain Guy            onFocusLost();
26599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (imm != null && mAttachInfo != null
26609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                && mAttachInfo.mHasWindowFocus) {
26619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            imm.focusIn(this);
26629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
26638506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
26649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        invalidate();
26659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mOnFocusChangeListener != null) {
26669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mOnFocusChangeListener.onFocusChange(this, gainFocus);
26679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
266883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn
266983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        if (mAttachInfo != null) {
267083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn            mAttachInfo.mKeyDispatchState.reset(this);
267183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        }
26729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
26739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
267575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * {@inheritDoc}
267675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
267775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    public void sendAccessibilityEvent(int eventType) {
267875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        if (AccessibilityManager.getInstance(mContext).isEnabled()) {
267975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov            sendAccessibilityEventUnchecked(AccessibilityEvent.obtain(eventType));
268075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        }
268175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    }
268275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
268375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /**
268475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * {@inheritDoc}
268575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
268675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    public void sendAccessibilityEventUnchecked(AccessibilityEvent event) {
268775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        event.setClassName(getClass().getName());
268875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        event.setPackageName(getContext().getPackageName());
268975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        event.setEnabled(isEnabled());
269075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        event.setContentDescription(mContentDescription);
269175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
269275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        if (event.getEventType() == AccessibilityEvent.TYPE_VIEW_FOCUSED && mAttachInfo != null) {
269375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov            ArrayList<View> focusablesTempList = mAttachInfo.mFocusablesTempList;
269475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov            getRootView().addFocusables(focusablesTempList, View.FOCUS_FORWARD, FOCUSABLES_ALL);
269575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov            event.setItemCount(focusablesTempList.size());
269675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov            event.setCurrentItemIndex(focusablesTempList.indexOf(this));
269775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov            focusablesTempList.clear();
269875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        }
269975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
270075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        dispatchPopulateAccessibilityEvent(event);
270175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
270275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        AccessibilityManager.getInstance(mContext).sendAccessibilityEvent(event);
270375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    }
270475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
270575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /**
270675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * Dispatches an {@link AccessibilityEvent} to the {@link View} children
270775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * to be populated.
270875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     *
270975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * @param event The event.
271075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     *
271175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * @return True if the event population was completed.
271275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
271375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {
271475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        return false;
271575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    }
271675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
271775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /**
271875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * Gets the {@link View} description. It briefly describes the view and is
271975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * primarily used for accessibility support. Set this property to enable
272075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * better accessibility support for your application. This is especially
272175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * true for views that do not have textual representation (For example,
272275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * ImageButton).
272375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     *
272475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * @return The content descriptiopn.
272575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     *
272675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * @attr ref android.R.styleable#View_contentDescription
272775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
272875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    public CharSequence getContentDescription() {
272975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        return mContentDescription;
273075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    }
273175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
273275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /**
273375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * Sets the {@link View} description. It briefly describes the view and is
273475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * primarily used for accessibility support. Set this property to enable
273575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * better accessibility support for your application. This is especially
273675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * true for views that do not have textual representation (For example,
273775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * ImageButton).
273875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     *
273975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * @param contentDescription The content description.
274075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     *
274175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * @attr ref android.R.styleable#View_contentDescription
274275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
274375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    public void setContentDescription(CharSequence contentDescription) {
274475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        mContentDescription = contentDescription;
274575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    }
274675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
274775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /**
2748a2431d0ba24ca7d79d21b2df63f9a58025702c7eRomain Guy     * Invoked whenever this view loses focus, either by losing window focus or by losing
2749a2431d0ba24ca7d79d21b2df63f9a58025702c7eRomain Guy     * focus within its window. This method can be used to clear any state tied to the
2750a2431d0ba24ca7d79d21b2df63f9a58025702c7eRomain Guy     * focus. For instance, if a button is held pressed with the trackball and the window
2751a2431d0ba24ca7d79d21b2df63f9a58025702c7eRomain Guy     * loses focus, this method can be used to cancel the press.
2752a2431d0ba24ca7d79d21b2df63f9a58025702c7eRomain Guy     *
2753a2431d0ba24ca7d79d21b2df63f9a58025702c7eRomain Guy     * Subclasses of View overriding this method should always call super.onFocusLost().
2754a2431d0ba24ca7d79d21b2df63f9a58025702c7eRomain Guy     *
2755a2431d0ba24ca7d79d21b2df63f9a58025702c7eRomain Guy     * @see #onFocusChanged(boolean, int, android.graphics.Rect)
27568506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy     * @see #onWindowFocusChanged(boolean)
2757a2431d0ba24ca7d79d21b2df63f9a58025702c7eRomain Guy     *
2758a2431d0ba24ca7d79d21b2df63f9a58025702c7eRomain Guy     * @hide pending API council approval
2759a2431d0ba24ca7d79d21b2df63f9a58025702c7eRomain Guy     */
2760a2431d0ba24ca7d79d21b2df63f9a58025702c7eRomain Guy    protected void onFocusLost() {
2761a2431d0ba24ca7d79d21b2df63f9a58025702c7eRomain Guy        resetPressedState();
2762a2431d0ba24ca7d79d21b2df63f9a58025702c7eRomain Guy    }
2763a2431d0ba24ca7d79d21b2df63f9a58025702c7eRomain Guy
2764a2431d0ba24ca7d79d21b2df63f9a58025702c7eRomain Guy    private void resetPressedState() {
2765a2431d0ba24ca7d79d21b2df63f9a58025702c7eRomain Guy        if ((mViewFlags & ENABLED_MASK) == DISABLED) {
2766a2431d0ba24ca7d79d21b2df63f9a58025702c7eRomain Guy            return;
2767a2431d0ba24ca7d79d21b2df63f9a58025702c7eRomain Guy        }
2768a2431d0ba24ca7d79d21b2df63f9a58025702c7eRomain Guy
2769a2431d0ba24ca7d79d21b2df63f9a58025702c7eRomain Guy        if (isPressed()) {
2770a2431d0ba24ca7d79d21b2df63f9a58025702c7eRomain Guy            setPressed(false);
2771a2431d0ba24ca7d79d21b2df63f9a58025702c7eRomain Guy
2772a2431d0ba24ca7d79d21b2df63f9a58025702c7eRomain Guy            if (!mHasPerformedLongPress) {
27731549dd1e6801a0240a2e2769c91181698910f98dMaryam Garrett                removeLongPressCallback();
2774a2431d0ba24ca7d79d21b2df63f9a58025702c7eRomain Guy            }
2775a2431d0ba24ca7d79d21b2df63f9a58025702c7eRomain Guy        }
2776a2431d0ba24ca7d79d21b2df63f9a58025702c7eRomain Guy    }
2777a2431d0ba24ca7d79d21b2df63f9a58025702c7eRomain Guy
2778a2431d0ba24ca7d79d21b2df63f9a58025702c7eRomain Guy    /**
27799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns true if this view has focus
27809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
27819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return True if this view has focus, false otherwise.
27829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
27839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @ViewDebug.ExportedProperty
27849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isFocused() {
27859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (mPrivateFlags & FOCUSED) != 0;
27869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
27879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
27899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Find the view in the hierarchy rooted at this view that currently has
27909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * focus.
27919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
27929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The view that currently has focus, or null if no focused view can
27939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         be found.
27949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
27959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public View findFocus() {
27969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (mPrivateFlags & FOCUSED) != 0 ? this : null;
27979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
27989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
28009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Change whether this view is one of the set of scrollable containers in
28019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * its window.  This will be used to determine whether the window can
28029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * resize or must pan when a soft input area is open -- scrollable
28039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * containers allow the window to use resize mode since the container
28049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * will appropriately shrink.
28059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
28069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setScrollContainer(boolean isScrollContainer) {
28079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (isScrollContainer) {
28089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mAttachInfo != null && (mPrivateFlags&SCROLL_CONTAINER_ADDED) == 0) {
28099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mAttachInfo.mScrollContainers.add(this);
28109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPrivateFlags |= SCROLL_CONTAINER_ADDED;
28119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
28129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPrivateFlags |= SCROLL_CONTAINER;
28139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
28149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((mPrivateFlags&SCROLL_CONTAINER_ADDED) != 0) {
28159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mAttachInfo.mScrollContainers.remove(this);
28169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
28179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPrivateFlags &= ~(SCROLL_CONTAINER|SCROLL_CONTAINER_ADDED);
28189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
28209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
28229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the quality of the drawing cache.
28239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
28249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return One of {@link #DRAWING_CACHE_QUALITY_AUTO},
28259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         {@link #DRAWING_CACHE_QUALITY_LOW}, or {@link #DRAWING_CACHE_QUALITY_HIGH}
28269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
28279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setDrawingCacheQuality(int)
28289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setDrawingCacheEnabled(boolean)
28299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #isDrawingCacheEnabled()
28309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
28319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @attr ref android.R.styleable#View_drawingCacheQuality
28329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
28339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getDrawingCacheQuality() {
28349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mViewFlags & DRAWING_CACHE_QUALITY_MASK;
28359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
28369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
28389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set the drawing cache quality of this view. This value is used only when the
28399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * drawing cache is enabled
28409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
28419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param quality One of {@link #DRAWING_CACHE_QUALITY_AUTO},
28429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        {@link #DRAWING_CACHE_QUALITY_LOW}, or {@link #DRAWING_CACHE_QUALITY_HIGH}
28439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
28449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getDrawingCacheQuality()
28459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setDrawingCacheEnabled(boolean)
28469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #isDrawingCacheEnabled()
28479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
28489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @attr ref android.R.styleable#View_drawingCacheQuality
28499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
28509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setDrawingCacheQuality(int quality) {
28519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setFlags(quality, DRAWING_CACHE_QUALITY_MASK);
28529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
28539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
28559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns whether the screen should remain on, corresponding to the current
28569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * value of {@link #KEEP_SCREEN_ON}.
28579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
28589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns true if {@link #KEEP_SCREEN_ON} is set.
28599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
28609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setKeepScreenOn(boolean)
28619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
28629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @attr ref android.R.styleable#View_keepScreenOn
28639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
28649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean getKeepScreenOn() {
28659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (mViewFlags & KEEP_SCREEN_ON) != 0;
28669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
28679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
28699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Controls whether the screen should remain on, modifying the
28709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * value of {@link #KEEP_SCREEN_ON}.
28719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
28729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param keepScreenOn Supply true to set {@link #KEEP_SCREEN_ON}.
28739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
28749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getKeepScreenOn()
28759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
28769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @attr ref android.R.styleable#View_keepScreenOn
28779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
28789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setKeepScreenOn(boolean keepScreenOn) {
28799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setFlags(keepScreenOn ? KEEP_SCREEN_ON : 0, KEEP_SCREEN_ON);
28809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
28819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
28839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The user specified next focus ID.
28849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
28859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @attr ref android.R.styleable#View_nextFocusLeft
28869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
28879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getNextFocusLeftId() {
28889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mNextFocusLeftId;
28899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
28909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
28929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set the id of the view to use for the next focus
28939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
28949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param nextFocusLeftId
28959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
28969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @attr ref android.R.styleable#View_nextFocusLeft
28979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
28989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setNextFocusLeftId(int nextFocusLeftId) {
28999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mNextFocusLeftId = nextFocusLeftId;
29009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
29019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
29039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The user specified next focus ID.
29049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
29059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @attr ref android.R.styleable#View_nextFocusRight
29069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
29079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getNextFocusRightId() {
29089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mNextFocusRightId;
29099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
29109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
29129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set the id of the view to use for the next focus
29139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
29149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param nextFocusRightId
29159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
29169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @attr ref android.R.styleable#View_nextFocusRight
29179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
29189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setNextFocusRightId(int nextFocusRightId) {
29199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mNextFocusRightId = nextFocusRightId;
29209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
29219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
29239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The user specified next focus ID.
29249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
29259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @attr ref android.R.styleable#View_nextFocusUp
29269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
29279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getNextFocusUpId() {
29289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mNextFocusUpId;
29299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
29309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
29329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set the id of the view to use for the next focus
29339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
29349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param nextFocusUpId
29359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
29369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @attr ref android.R.styleable#View_nextFocusUp
29379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
29389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setNextFocusUpId(int nextFocusUpId) {
29399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mNextFocusUpId = nextFocusUpId;
29409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
29419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
29439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The user specified next focus ID.
29449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
29459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @attr ref android.R.styleable#View_nextFocusDown
29469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
29479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getNextFocusDownId() {
29489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mNextFocusDownId;
29499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
29509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
29529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set the id of the view to use for the next focus
29539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
29549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param nextFocusDownId
29559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
29569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @attr ref android.R.styleable#View_nextFocusDown
29579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
29589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setNextFocusDownId(int nextFocusDownId) {
29599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mNextFocusDownId = nextFocusDownId;
29609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
29619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
29639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the visibility of this view and all of its ancestors
29649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
29659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return True if this view and all of its ancestors are {@link #VISIBLE}
29669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
29679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isShown() {
29689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        View current = this;
29699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //noinspection ConstantConditions
29709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        do {
29719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((current.mViewFlags & VISIBILITY_MASK) != VISIBLE) {
29729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return false;
29739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
29749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ViewParent parent = current.mParent;
29759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (parent == null) {
29769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return false; // We are not attached to the view root
29779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
29789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!(parent instanceof View)) {
29799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return true;
29809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
29819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            current = (View) parent;
29829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } while (current != null);
29839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
29859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
29869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
29889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Apply the insets for system windows to this view, if the FITS_SYSTEM_WINDOWS flag
29899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is set
29909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
29919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param insets Insets for system windows
29929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
29939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return True if this view applied the insets, false otherwise
29949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
29959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected boolean fitSystemWindows(Rect insets) {
29969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((mViewFlags & FITS_SYSTEM_WINDOWS) == FITS_SYSTEM_WINDOWS) {
29979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPaddingLeft = insets.left;
29989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPaddingTop = insets.top;
29999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPaddingRight = insets.right;
30009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPaddingBottom = insets.bottom;
30019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            requestLayout();
30029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
30039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
30059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
30069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
30089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the visibility status for this view.
30099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
30109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return One of {@link #VISIBLE}, {@link #INVISIBLE}, or {@link #GONE}.
30119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @attr ref android.R.styleable#View_visibility
30129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
30139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @ViewDebug.ExportedProperty(mapping = {
3014c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        @ViewDebug.IntToString(from = VISIBLE,   to = "VISIBLE"),
3015c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        @ViewDebug.IntToString(from = INVISIBLE, to = "INVISIBLE"),
3016c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        @ViewDebug.IntToString(from = GONE,      to = "GONE")
30179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    })
30189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getVisibility() {
30199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mViewFlags & VISIBILITY_MASK;
30209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
30219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
30239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set the enabled state of this view.
30249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
30259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param visibility One of {@link #VISIBLE}, {@link #INVISIBLE}, or {@link #GONE}.
30269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @attr ref android.R.styleable#View_visibility
30279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
30289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @RemotableViewMethod
30299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setVisibility(int visibility) {
30309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setFlags(visibility, VISIBILITY_MASK);
30319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mBGDrawable != null) mBGDrawable.setVisible(visibility == VISIBLE, false);
30329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
30339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
30359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the enabled status for this view. The interpretation of the
30369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * enabled state varies by subclass.
30379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
30389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return True if this view is enabled, false otherwise.
30399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
30409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @ViewDebug.ExportedProperty
30419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isEnabled() {
30429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (mViewFlags & ENABLED_MASK) == ENABLED;
30439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
30449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
30469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set the enabled state of this view. The interpretation of the enabled
30479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * state varies by subclass.
30489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
30499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param enabled True if this view is enabled, false otherwise.
30509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
30512b95c2413838c2e2b127ebab8fb4fead7d52e460Jeff Sharkey    @RemotableViewMethod
30529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setEnabled(boolean enabled) {
3053a2ef00b4282dcf122c3bdd6fc23cf772474f6abbAmith Yamasani        if (enabled == isEnabled()) return;
3054a2ef00b4282dcf122c3bdd6fc23cf772474f6abbAmith Yamasani
30559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setFlags(enabled ? ENABLED : DISABLED, ENABLED_MASK);
30569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /*
30589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The View most likely has to change its appearance, so refresh
30599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * the drawable state.
30609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
30619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        refreshDrawableState();
30629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Invalidate too, since the default behavior for views is to be
30649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // be drawn at 50% alpha rather than to change the drawable.
30659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        invalidate();
30669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
30679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
30699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set whether this view can receive the focus.
30709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
30719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Setting this to false will also ensure that this view is not focusable
30729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * in touch mode.
30739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
30749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param focusable If true, this view can receive the focus.
30759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
30769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setFocusableInTouchMode(boolean)
30779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @attr ref android.R.styleable#View_focusable
30789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
30799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setFocusable(boolean focusable) {
30809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!focusable) {
30819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            setFlags(0, FOCUSABLE_IN_TOUCH_MODE);
30829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setFlags(focusable ? FOCUSABLE : NOT_FOCUSABLE, FOCUSABLE_MASK);
30849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
30859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
30879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set whether this view can receive focus while in touch mode.
30889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
30899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Setting this to true will also ensure that this view is focusable.
30909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
30919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param focusableInTouchMode If true, this view can receive the focus while
30929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *   in touch mode.
30939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
30949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setFocusable(boolean)
30959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @attr ref android.R.styleable#View_focusableInTouchMode
30969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
30979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setFocusableInTouchMode(boolean focusableInTouchMode) {
30989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Focusable in touch mode should always be set before the focusable flag
30999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // otherwise, setting the focusable flag will trigger a focusableViewAvailable()
31009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // which, in touch mode, will not successfully request focus on this view
31019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // because the focusable in touch mode flag is not set
31029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setFlags(focusableInTouchMode ? FOCUSABLE_IN_TOUCH_MODE : 0, FOCUSABLE_IN_TOUCH_MODE);
31039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (focusableInTouchMode) {
31049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            setFlags(FOCUSABLE, FOCUSABLE_MASK);
31059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
31079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
31099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set whether this view should have sound effects enabled for events such as
31109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * clicking and touching.
31119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
31129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>You may wish to disable sound effects for a view if you already play sounds,
31139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * for instance, a dial key that plays dtmf tones.
31149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
31159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param soundEffectsEnabled whether sound effects are enabled for this view.
31169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #isSoundEffectsEnabled()
31179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #playSoundEffect(int)
31189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @attr ref android.R.styleable#View_soundEffectsEnabled
31199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
31209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setSoundEffectsEnabled(boolean soundEffectsEnabled) {
31219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setFlags(soundEffectsEnabled ? SOUND_EFFECTS_ENABLED: 0, SOUND_EFFECTS_ENABLED);
31229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
31239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
31259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return whether this view should have sound effects enabled for events such as
31269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *     clicking and touching.
31279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
31289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setSoundEffectsEnabled(boolean)
31299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #playSoundEffect(int)
31309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @attr ref android.R.styleable#View_soundEffectsEnabled
31319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
31329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @ViewDebug.ExportedProperty
31339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isSoundEffectsEnabled() {
31349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return SOUND_EFFECTS_ENABLED == (mViewFlags & SOUND_EFFECTS_ENABLED);
31359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
31369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
31389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set whether this view should have haptic feedback for events such as
31399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * long presses.
31409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
31419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>You may wish to disable haptic feedback if your view already controls
31429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * its own haptic feedback.
31439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
31449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param hapticFeedbackEnabled whether haptic feedback enabled for this view.
31459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #isHapticFeedbackEnabled()
31469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #performHapticFeedback(int)
31479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @attr ref android.R.styleable#View_hapticFeedbackEnabled
31489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
31499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setHapticFeedbackEnabled(boolean hapticFeedbackEnabled) {
31509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setFlags(hapticFeedbackEnabled ? HAPTIC_FEEDBACK_ENABLED: 0, HAPTIC_FEEDBACK_ENABLED);
31519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
31529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
31549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return whether this view should have haptic feedback enabled for events
31559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * long presses.
31569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
31579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setHapticFeedbackEnabled(boolean)
31589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #performHapticFeedback(int)
31599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @attr ref android.R.styleable#View_hapticFeedbackEnabled
31609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
31619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @ViewDebug.ExportedProperty
31629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isHapticFeedbackEnabled() {
31639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return HAPTIC_FEEDBACK_ENABLED == (mViewFlags & HAPTIC_FEEDBACK_ENABLED);
31649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
31659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
31679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If this view doesn't do any drawing on its own, set this flag to
31689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * allow further optimizations. By default, this flag is not set on
31699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * View, but could be set on some View subclasses such as ViewGroup.
31709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
31719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Typically, if you override {@link #onDraw} you should clear this flag.
31729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
31739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param willNotDraw whether or not this View draw on its own
31749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
31759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setWillNotDraw(boolean willNotDraw) {
31769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setFlags(willNotDraw ? WILL_NOT_DRAW : 0, DRAW_MASK);
31779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
31789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
31809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns whether or not this View draws on its own.
31819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
31829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return true if this view has nothing to draw, false otherwise
31839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
31849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @ViewDebug.ExportedProperty
31859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean willNotDraw() {
31869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (mViewFlags & DRAW_MASK) == WILL_NOT_DRAW;
31879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
31889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
31909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * When a View's drawing cache is enabled, drawing is redirected to an
31919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * offscreen bitmap. Some views, like an ImageView, must be able to
31929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * bypass this mechanism if they already draw a single bitmap, to avoid
31939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * unnecessary usage of the memory.
31949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
31959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param willNotCacheDrawing true if this view does not cache its
31969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        drawing, false otherwise
31979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
31989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setWillNotCacheDrawing(boolean willNotCacheDrawing) {
31999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setFlags(willNotCacheDrawing ? WILL_NOT_CACHE_DRAWING : 0, WILL_NOT_CACHE_DRAWING);
32009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
32019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
32039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns whether or not this View can cache its drawing or not.
32049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
32059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return true if this view does not cache its drawing, false otherwise
32069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
32079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @ViewDebug.ExportedProperty
32089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean willNotCacheDrawing() {
32099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (mViewFlags & WILL_NOT_CACHE_DRAWING) == WILL_NOT_CACHE_DRAWING;
32109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
32119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
32139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Indicates whether this view reacts to click events or not.
32149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
32159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return true if the view is clickable, false otherwise
32169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
32179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setClickable(boolean)
32189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @attr ref android.R.styleable#View_clickable
32199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
32209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @ViewDebug.ExportedProperty
32219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isClickable() {
32229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (mViewFlags & CLICKABLE) == CLICKABLE;
32239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
32249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
32269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Enables or disables click events for this view. When a view
32279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is clickable it will change its state to "pressed" on every click.
32289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Subclasses should set the view clickable to visually react to
32299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * user's clicks.
32309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
32319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param clickable true to make the view clickable, false otherwise
32329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
32339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #isClickable()
32349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @attr ref android.R.styleable#View_clickable
32359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
32369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setClickable(boolean clickable) {
32379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setFlags(clickable ? CLICKABLE : 0, CLICKABLE);
32389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
32399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
32419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Indicates whether this view reacts to long click events or not.
32429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
32439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return true if the view is long clickable, false otherwise
32449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
32459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setLongClickable(boolean)
32469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @attr ref android.R.styleable#View_longClickable
32479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
32489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isLongClickable() {
32499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (mViewFlags & LONG_CLICKABLE) == LONG_CLICKABLE;
32509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
32519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
32539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Enables or disables long click events for this view. When a view is long
32549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * clickable it reacts to the user holding down the button for a longer
32559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * duration than a tap. This event can either launch the listener or a
32569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * context menu.
32579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
32589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param longClickable true to make the view long clickable, false otherwise
32599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #isLongClickable()
32609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @attr ref android.R.styleable#View_longClickable
32619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
32629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setLongClickable(boolean longClickable) {
32639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setFlags(longClickable ? LONG_CLICKABLE : 0, LONG_CLICKABLE);
32649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
32659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
32679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the pressed that for this view.
32689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
32699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #isClickable()
32709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setClickable(boolean)
32719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
32729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param pressed Pass true to set the View's internal state to "pressed", or false to reverts
32739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        the View's internal state from a previously set "pressed" state.
32749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
32759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setPressed(boolean pressed) {
32769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pressed) {
32779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPrivateFlags |= PRESSED;
32789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
32799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPrivateFlags &= ~PRESSED;
32809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
32819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        refreshDrawableState();
32829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dispatchSetPressed(pressed);
32839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
32849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
32869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Dispatch setPressed to all of this View's children.
32879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
32889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setPressed(boolean)
32899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
32909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param pressed The new pressed state
32919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
32929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void dispatchSetPressed(boolean pressed) {
32939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
32949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
32969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Indicates whether the view is currently in pressed state. Unless
32979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #setPressed(boolean)} is explicitly called, only clickable views can enter
32989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the pressed state.
32999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
33009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setPressed
33019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #isClickable()
33029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setClickable(boolean)
33039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
33049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return true if the view is currently pressed, false otherwise
33059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
33069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isPressed() {
33079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (mPrivateFlags & PRESSED) == PRESSED;
33089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
33099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
33119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Indicates whether this view will save its state (that is,
33129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * whether its {@link #onSaveInstanceState} method will be called).
33139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
33149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns true if the view state saving is enabled, else false.
33159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
33169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setSaveEnabled(boolean)
33179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @attr ref android.R.styleable#View_saveEnabled
33189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
33199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isSaveEnabled() {
33209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (mViewFlags & SAVE_DISABLED_MASK) != SAVE_DISABLED;
33219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
33229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
33249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Controls whether the saving of this view's state is
33259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * enabled (that is, whether its {@link #onSaveInstanceState} method
33269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * will be called).  Note that even if freezing is enabled, the
33279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * view still must have an id assigned to it (via {@link #setId setId()})
33289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * for its state to be saved.  This flag can only disable the
33299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * saving of this view; any child views may still have their state saved.
33309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
33319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param enabled Set to false to <em>disable</em> state saving, or true
33329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * (the default) to allow it.
33339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
33349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #isSaveEnabled()
33359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setId(int)
33369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onSaveInstanceState()
33379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @attr ref android.R.styleable#View_saveEnabled
33389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
33399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setSaveEnabled(boolean enabled) {
33409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setFlags(enabled ? 0 : SAVE_DISABLED, SAVE_DISABLED_MASK);
33419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
33429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
33459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns whether this View is able to take focus.
33469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
33479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return True if this view can take focus, or false otherwise.
33489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @attr ref android.R.styleable#View_focusable
33499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
33509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @ViewDebug.ExportedProperty
33519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final boolean isFocusable() {
33529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return FOCUSABLE == (mViewFlags & FOCUSABLE_MASK);
33539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
33549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
33569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * When a view is focusable, it may not want to take focus when in touch mode.
33579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * For example, a button would like focus when the user is navigating via a D-pad
33589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * so that the user can click on it, but once the user starts touching the screen,
33599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the button shouldn't take focus
33609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Whether the view is focusable in touch mode.
33619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @attr ref android.R.styleable#View_focusableInTouchMode
33629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
33639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @ViewDebug.ExportedProperty
33649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final boolean isFocusableInTouchMode() {
33659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return FOCUSABLE_IN_TOUCH_MODE == (mViewFlags & FOCUSABLE_IN_TOUCH_MODE);
33669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
33679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
33699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Find the nearest view in the specified direction that can take focus.
33709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This does not actually give focus to that view.
33719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
33729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param direction One of FOCUS_UP, FOCUS_DOWN, FOCUS_LEFT, and FOCUS_RIGHT
33739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
33749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The nearest focusable in the specified direction, or null if none
33759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         can be found.
33769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
33779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public View focusSearch(int direction) {
33789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent != null) {
33799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mParent.focusSearch(this, direction);
33809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
33819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
33829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
33839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
33849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
33869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This method is the last chance for the focused view and its ancestors to
33879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * respond to an arrow key. This is called when the focused view did not
33889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * consume the key internally, nor could the view system find a new view in
33899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the requested direction to give focus to.
33909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
33919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param focused The currently focused view.
33929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param direction The direction focus wants to move. One of FOCUS_UP,
33939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        FOCUS_DOWN, FOCUS_LEFT, and FOCUS_RIGHT.
33949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return True if the this view consumed this unhandled move.
33959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
33969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean dispatchUnhandledMove(View focused, int direction) {
33979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
33989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
33999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
34019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If a user manually specified the next view id for a particular direction,
34029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * use the root to look up the view.  Once a view is found, it is cached
34039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * for future lookups.
34049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param root The root view of the hierarchy containing this view.
34059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param direction One of FOCUS_UP, FOCUS_DOWN, FOCUS_LEFT, and FOCUS_RIGHT
34069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The user specified next view, or null if there is none.
34079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
34089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    View findUserSetNextFocus(View root, int direction) {
34099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (direction) {
34109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case FOCUS_LEFT:
34119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mNextFocusLeftId == View.NO_ID) return null;
34129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return findViewShouldExist(root, mNextFocusLeftId);
34139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case FOCUS_RIGHT:
34149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mNextFocusRightId == View.NO_ID) return null;
34159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return findViewShouldExist(root, mNextFocusRightId);
34169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case FOCUS_UP:
34179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mNextFocusUpId == View.NO_ID) return null;
34189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return findViewShouldExist(root, mNextFocusUpId);
34199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case FOCUS_DOWN:
34209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mNextFocusDownId == View.NO_ID) return null;
34219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return findViewShouldExist(root, mNextFocusDownId);
34229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
34239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
34249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
34259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static View findViewShouldExist(View root, int childViewId) {
34279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        View result = root.findViewById(childViewId);
34289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (result == null) {
34299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w(VIEW_LOG_TAG, "couldn't find next focus view specified "
34309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + "by user for id " + childViewId);
34319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
34329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return result;
34339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
34349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
34369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Find and return all focusable views that are descendants of this view,
34379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * possibly including this view if it is focusable itself.
34389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
34399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param direction The direction of the focus
34409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return A list of focusable views
34419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
34429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ArrayList<View> getFocusables(int direction) {
34439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ArrayList<View> result = new ArrayList<View>(24);
34449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        addFocusables(result, direction);
34459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return result;
34469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
34479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
34499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Add any focusable views that are descendants of this view (possibly
34509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * including this view if it is focusable itself) to views.  If we are in touch mode,
34519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * only add views that are also focusable in touch mode.
34529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
34539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param views Focusable views found so far
34549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param direction The direction of the focus
34559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
34569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void addFocusables(ArrayList<View> views, int direction) {
345775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        addFocusables(views, direction, FOCUSABLES_TOUCH_MODE);
345875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    }
34599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
346075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    /**
346175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * Adds any focusable views that are descendants of this view (possibly
346275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * including this view if it is focusable itself) to views. This method
346375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * adds all focusable views regardless if we are in touch mode or
346475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * only views focusable in touch mode if we are in touch mode depending on
346575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * the focusable mode paramater.
346675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     *
346775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * @param views Focusable views found so far or null if all we are interested is
346875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     *        the number of focusables.
346975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * @param direction The direction of the focus.
347075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * @param focusableMode The type of focusables to be added.
347175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     *
347275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * @see #FOCUSABLES_ALL
347375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     * @see #FOCUSABLES_TOUCH_MODE
347475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov     */
347575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov    public void addFocusables(ArrayList<View> views, int direction, int focusableMode) {
347675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        if (!isFocusable()) {
347775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov            return;
347875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        }
34799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
348075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        if ((focusableMode & FOCUSABLES_TOUCH_MODE) == FOCUSABLES_TOUCH_MODE &&
348175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov                isInTouchMode() && !isFocusableInTouchMode()) {
348275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov            return;
348375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        }
348475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
348575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        if (views != null) {
348675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov            views.add(this);
348775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        }
34889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
34899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
34919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Find and return all touchable views that are descendants of this view,
34929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * possibly including this view if it is touchable itself.
34939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
34949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return A list of touchable views
34959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
34969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ArrayList<View> getTouchables() {
34979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ArrayList<View> result = new ArrayList<View>();
34989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        addTouchables(result);
34999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return result;
35009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
35019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
35039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Add any touchable views that are descendants of this view (possibly
35049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * including this view if it is touchable itself) to views.
35059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
35069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param views Touchable views found so far
35079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
35089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void addTouchables(ArrayList<View> views) {
35099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int viewFlags = mViewFlags;
35109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (((viewFlags & CLICKABLE) == CLICKABLE || (viewFlags & LONG_CLICKABLE) == LONG_CLICKABLE)
35129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                && (viewFlags & ENABLED_MASK) == ENABLED) {
35139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            views.add(this);
35149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
35159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
35169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
35189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Call this to try to give focus to a specific view or to one of its
35199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * descendants.
35209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
35219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * A view will not actually take focus if it is not focusable ({@link #isFocusable} returns false),
35229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * or if it is focusable and it is not focusable in touch mode ({@link #isFocusableInTouchMode})
35239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * while the device is in touch mode.
35249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
35259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * See also {@link #focusSearch}, which is what you call to say that you
35269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * have focus, and you want your parent to look for the next one.
35279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
35289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This is equivalent to calling {@link #requestFocus(int, Rect)} with arguments
35299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #FOCUS_DOWN} and <code>null</code>.
35309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
35319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Whether this view or one of its descendants actually took focus.
35329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
35339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final boolean requestFocus() {
35349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return requestFocus(View.FOCUS_DOWN);
35359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
35369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
35399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Call this to try to give focus to a specific view or to one of its
35409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * descendants and give it a hint about what direction focus is heading.
35419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
35429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * A view will not actually take focus if it is not focusable ({@link #isFocusable} returns false),
35439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * or if it is focusable and it is not focusable in touch mode ({@link #isFocusableInTouchMode})
35449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * while the device is in touch mode.
35459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
35469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * See also {@link #focusSearch}, which is what you call to say that you
35479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * have focus, and you want your parent to look for the next one.
35489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
35499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This is equivalent to calling {@link #requestFocus(int, Rect)} with
35509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <code>null</code> set for the previously focused rectangle.
35519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
35529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param direction One of FOCUS_UP, FOCUS_DOWN, FOCUS_LEFT, and FOCUS_RIGHT
35539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Whether this view or one of its descendants actually took focus.
35549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
35559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final boolean requestFocus(int direction) {
35569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return requestFocus(direction, null);
35579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
35589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
35609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Call this to try to give focus to a specific view or to one of its descendants
35619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and give it hints about the direction and a specific rectangle that the focus
35629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is coming from.  The rectangle can help give larger views a finer grained hint
35639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * about where focus is coming from, and therefore, where to show selection, or
35649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * forward focus change internally.
35659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
35669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * A view will not actually take focus if it is not focusable ({@link #isFocusable} returns false),
35679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * or if it is focusable and it is not focusable in touch mode ({@link #isFocusableInTouchMode})
35689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * while the device is in touch mode.
35699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
35709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * A View will not take focus if it is not visible.
35719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
35729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * A View will not take focus if one of its parents has {@link android.view.ViewGroup#getDescendantFocusability()}
35739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * equal to {@link ViewGroup#FOCUS_BLOCK_DESCENDANTS}.
35749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
35759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * See also {@link #focusSearch}, which is what you call to say that you
35769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * have focus, and you want your parent to look for the next one.
35779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
35789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * You may wish to override this method if your custom {@link View} has an internal
35799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link View} that it wishes to forward the request to.
35809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
35819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param direction One of FOCUS_UP, FOCUS_DOWN, FOCUS_LEFT, and FOCUS_RIGHT
35829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param previouslyFocusedRect The rectangle (in this View's coordinate system)
35839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        to give a finer grained hint about where focus is coming from.  May be null
35849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        if there is no hint.
35859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Whether this view or one of its descendants actually took focus.
35869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
35879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean requestFocus(int direction, Rect previouslyFocusedRect) {
35889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // need to be focusable
35899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((mViewFlags & FOCUSABLE_MASK) != FOCUSABLE ||
35909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                (mViewFlags & VISIBILITY_MASK) != VISIBLE) {
35919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
35929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
35939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // need to be focusable in touch mode if in touch mode
35959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (isInTouchMode() &&
35969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                (FOCUSABLE_IN_TOUCH_MODE != (mViewFlags & FOCUSABLE_IN_TOUCH_MODE))) {
35979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
35989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
35999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // need to not have any parents blocking us
36019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (hasAncestorThatBlocksDescendantFocus()) {
36029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
36039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
36049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        handleFocusGainInternal(direction, previouslyFocusedRect);
36069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
36079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
36089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
36109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Call this to try to give focus to a specific view or to one of its descendants. This is a
36119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * special variant of {@link #requestFocus() } that will allow views that are not focuable in
36129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * touch mode to request focus when they are touched.
36139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
36149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Whether this view or one of its descendants actually took focus.
36159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
36169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #isInTouchMode()
36179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
36189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
36199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final boolean requestFocusFromTouch() {
36209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Leave touch mode if we need to
36219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (isInTouchMode()) {
36229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            View root = getRootView();
36239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (root != null) {
36249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               ViewRoot viewRoot = (ViewRoot)root.getParent();
36259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               if (viewRoot != null) {
36269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                   viewRoot.ensureTouchMode(false);
36279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               }
36289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
36299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
36309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return requestFocus(View.FOCUS_DOWN);
36319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
36329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
36349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Whether any ancestor of this view blocks descendant focus.
36359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
36369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private boolean hasAncestorThatBlocksDescendantFocus() {
36379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ViewParent ancestor = mParent;
36389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (ancestor instanceof ViewGroup) {
36399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final ViewGroup vgAncestor = (ViewGroup) ancestor;
36409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (vgAncestor.getDescendantFocusability() == ViewGroup.FOCUS_BLOCK_DESCENDANTS) {
36419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return true;
36429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
36439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ancestor = vgAncestor.getParent();
36449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
36459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
36469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
36479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
36489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3650a440b002aa59e1455bdfa2c5a1ca51c74bbc19acRomain Guy     * @hide
3651a440b002aa59e1455bdfa2c5a1ca51c74bbc19acRomain Guy     */
3652a440b002aa59e1455bdfa2c5a1ca51c74bbc19acRomain Guy    public void dispatchStartTemporaryDetach() {
3653a440b002aa59e1455bdfa2c5a1ca51c74bbc19acRomain Guy        onStartTemporaryDetach();
3654a440b002aa59e1455bdfa2c5a1ca51c74bbc19acRomain Guy    }
3655a440b002aa59e1455bdfa2c5a1ca51c74bbc19acRomain Guy
3656a440b002aa59e1455bdfa2c5a1ca51c74bbc19acRomain Guy    /**
3657a440b002aa59e1455bdfa2c5a1ca51c74bbc19acRomain Guy     * This is called when a container is going to temporarily detach a child, with
36589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link ViewGroup#detachViewFromParent(View) ViewGroup.detachViewFromParent}.
36599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * It will either be followed by {@link #onFinishTemporaryDetach()} or
3660a440b002aa59e1455bdfa2c5a1ca51c74bbc19acRomain Guy     * {@link #onDetachedFromWindow()} when the container is done.
36619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
36629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onStartTemporaryDetach() {
3663a440b002aa59e1455bdfa2c5a1ca51c74bbc19acRomain Guy        removeUnsetPressCallback();
36648afa515936e78ccfc5563ca9164dc9a50ca73db4Romain Guy        mPrivateFlags |= CANCEL_NEXT_UP_EVENT;
3665a440b002aa59e1455bdfa2c5a1ca51c74bbc19acRomain Guy    }
3666a440b002aa59e1455bdfa2c5a1ca51c74bbc19acRomain Guy
3667a440b002aa59e1455bdfa2c5a1ca51c74bbc19acRomain Guy    /**
3668a440b002aa59e1455bdfa2c5a1ca51c74bbc19acRomain Guy     * @hide
3669a440b002aa59e1455bdfa2c5a1ca51c74bbc19acRomain Guy     */
3670a440b002aa59e1455bdfa2c5a1ca51c74bbc19acRomain Guy    public void dispatchFinishTemporaryDetach() {
3671a440b002aa59e1455bdfa2c5a1ca51c74bbc19acRomain Guy        onFinishTemporaryDetach();
36729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
36738506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
36749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
36759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called after {@link #onStartTemporaryDetach} when the container is done
36769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * changing the view.
36779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
36789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onFinishTemporaryDetach() {
36799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
36808506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
36819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
36829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * capture information of this view for later analysis: developement only
36839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * check dynamic switch to make sure we only dump view
36849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * when ViewDebug.SYSTEM_PROPERTY_CAPTURE_VIEW) is set
36859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
36869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static void captureViewInfo(String subTag, View v) {
3687c39a6e0c51e182338deb8b63d07933b585134929The Android Open Source Project        if (v == null || SystemProperties.getInt(ViewDebug.SYSTEM_PROPERTY_CAPTURE_VIEW, 0) == 0) {
36889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
36899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
36909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ViewDebug.dumpCapturedView(subTag, v);
36919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
36929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
369483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * Return the global {@link KeyEvent.DispatcherState KeyEvent.DispatcherState}
369583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * for this view's window.  Returns null if the view is not currently attached
369683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * to the window.  Normally you will not need to use this directly, but
369783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * just use the standard high-level event callbacks like {@link #onKeyDown}.
369883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     */
369983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    public KeyEvent.DispatcherState getKeyDispatcherState() {
370083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        return mAttachInfo != null ? mAttachInfo.mKeyDispatchState : null;
370183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    }
370283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn
370383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    /**
37049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Dispatch a key event before it is processed by any input method
37059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * associated with the view hierarchy.  This can be used to intercept
37069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * key events in special situations before the IME consumes them; a
37079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * typical example would be handling the BACK key to update the application's
37089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * UI instead of allowing the IME to see it and close itself.
37099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
37109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param event The key event to be dispatched.
37119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return True if the event was handled, false otherwise.
37129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
37139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean dispatchKeyEventPreIme(KeyEvent event) {
37149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return onKeyPreIme(event.getKeyCode(), event);
37159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
37169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
37189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Dispatch a key event to the next view on the focus path. This path runs
37199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * from the top of the view tree down to the currently focused view. If this
37209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * view has focus, it will dispatch to itself. Otherwise it will dispatch
37219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the next node down the focus path. This method also fires any key
37229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * listeners.
37239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
37249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param event The key event to be dispatched.
37259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return True if the event was handled, false otherwise.
37269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
37279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean dispatchKeyEvent(KeyEvent event) {
37289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // If any attached key listener a first crack at the event.
37299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //noinspection SimplifiableIfStatement
37309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (android.util.Config.LOGV) {
37329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            captureViewInfo("captureViewKeyEvent", this);
37339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
37349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mOnKeyListener != null && (mViewFlags & ENABLED_MASK) == ENABLED
37369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                && mOnKeyListener.onKey(this, event.getKeyCode(), event)) {
37379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
37389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
37399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
374083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        return event.dispatch(this, mAttachInfo != null
374183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                ? mAttachInfo.mKeyDispatchState : null, this);
37429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
37439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
37459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Dispatches a key shortcut event.
37469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
37479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param event The key event to be dispatched.
37489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return True if the event was handled by the view, false otherwise.
37499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
37509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean dispatchKeyShortcutEvent(KeyEvent event) {
37519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return onKeyShortcut(event.getKeyCode(), event);
37529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
37539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
37559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Pass the touch screen motion event down to the target view, or this
37569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * view if it is the target.
37579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
37589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param event The motion event to be dispatched.
37599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return True if the event was handled by the view, false otherwise.
37609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
37619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean dispatchTouchEvent(MotionEvent event) {
37629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED &&
37639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mOnTouchListener.onTouch(this, event)) {
37649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
37659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
37669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return onTouchEvent(event);
37679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
37689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
37709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Pass a trackball motion event down to the focused view.
37719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
37729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param event The motion event to be dispatched.
37739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return True if the event was handled by the view, false otherwise.
37749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
37759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean dispatchTrackballEvent(MotionEvent event) {
37769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //Log.i("view", "view=" + this + ", " + event.toString());
37779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return onTrackballEvent(event);
37789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
37799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
37819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called when the window containing this view gains or loses window focus.
37829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * ViewGroups should override to route to their children.
37839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
37849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param hasFocus True if the window containing this view now has focus,
37859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        false otherwise.
37869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
37879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void dispatchWindowFocusChanged(boolean hasFocus) {
37889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        onWindowFocusChanged(hasFocus);
37899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
37909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
37929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called when the window containing this view gains or loses focus.  Note
37939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that this is separate from view focus: to receive key events, both
37949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * your view and its window must have focus.  If a window is displayed
37959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * on top of yours that takes input focus, then your own window will lose
37969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * focus but the view focus will remain unchanged.
37979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
37989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param hasWindowFocus True if the window containing this view now has
37999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        focus, false otherwise.
38009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
38019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onWindowFocusChanged(boolean hasWindowFocus) {
38029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        InputMethodManager imm = InputMethodManager.peekInstance();
38039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!hasWindowFocus) {
38049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (isPressed()) {
38059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                setPressed(false);
38069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
38079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (imm != null && (mPrivateFlags & FOCUSED) != 0) {
38089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                imm.focusOut(this);
38099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
38101549dd1e6801a0240a2e2769c91181698910f98dMaryam Garrett            removeLongPressCallback();
3811a2431d0ba24ca7d79d21b2df63f9a58025702c7eRomain Guy            onFocusLost();
38129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (imm != null && (mPrivateFlags & FOCUSED) != 0) {
38139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            imm.focusIn(this);
38149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
38159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        refreshDrawableState();
38169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
38179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
38199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns true if this view is in a window that currently has window focus.
38209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Note that this is not the same as the view itself having focus.
38219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
38229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return True if this view is in a window that currently has window focus.
38239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
38249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean hasWindowFocus() {
38259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mAttachInfo != null && mAttachInfo.mHasWindowFocus;
38269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
38279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3829326d808b858359464b2ffeb84f2e0a8e0c79b600Adam Powell     * Dispatch a view visibility change down the view hierarchy.
3830326d808b858359464b2ffeb84f2e0a8e0c79b600Adam Powell     * ViewGroups should override to route to their children.
3831326d808b858359464b2ffeb84f2e0a8e0c79b600Adam Powell     * @param changedView The view whose visibility changed. Could be 'this' or
3832326d808b858359464b2ffeb84f2e0a8e0c79b600Adam Powell     * an ancestor view.
383343c9cdffb619f93d9d4525dffd05701dc9c8c4bfRomain Guy     * @param visibility The new visibility of changedView: {@link #VISIBLE},
383443c9cdffb619f93d9d4525dffd05701dc9c8c4bfRomain Guy     * {@link #INVISIBLE} or {@link #GONE}.
3835326d808b858359464b2ffeb84f2e0a8e0c79b600Adam Powell     */
3836326d808b858359464b2ffeb84f2e0a8e0c79b600Adam Powell    protected void dispatchVisibilityChanged(View changedView, int visibility) {
3837326d808b858359464b2ffeb84f2e0a8e0c79b600Adam Powell        onVisibilityChanged(changedView, visibility);
3838326d808b858359464b2ffeb84f2e0a8e0c79b600Adam Powell    }
3839326d808b858359464b2ffeb84f2e0a8e0c79b600Adam Powell
3840326d808b858359464b2ffeb84f2e0a8e0c79b600Adam Powell    /**
3841326d808b858359464b2ffeb84f2e0a8e0c79b600Adam Powell     * Called when the visibility of the view or an ancestor of the view is changed.
3842326d808b858359464b2ffeb84f2e0a8e0c79b600Adam Powell     * @param changedView The view whose visibility changed. Could be 'this' or
3843326d808b858359464b2ffeb84f2e0a8e0c79b600Adam Powell     * an ancestor view.
384443c9cdffb619f93d9d4525dffd05701dc9c8c4bfRomain Guy     * @param visibility The new visibility of changedView: {@link #VISIBLE},
384543c9cdffb619f93d9d4525dffd05701dc9c8c4bfRomain Guy     * {@link #INVISIBLE} or {@link #GONE}.
3846326d808b858359464b2ffeb84f2e0a8e0c79b600Adam Powell     */
3847326d808b858359464b2ffeb84f2e0a8e0c79b600Adam Powell    protected void onVisibilityChanged(View changedView, int visibility) {
38488568c3a09bff9bd2f7c9462b116bed0537d19342Adam Powell        if (visibility == VISIBLE) {
38498568c3a09bff9bd2f7c9462b116bed0537d19342Adam Powell            if (mAttachInfo != null) {
38508568c3a09bff9bd2f7c9462b116bed0537d19342Adam Powell                initialAwakenScrollBars();
38518568c3a09bff9bd2f7c9462b116bed0537d19342Adam Powell            } else {
38528568c3a09bff9bd2f7c9462b116bed0537d19342Adam Powell                mPrivateFlags |= AWAKEN_SCROLL_BARS_ON_ATTACH;
38538568c3a09bff9bd2f7c9462b116bed0537d19342Adam Powell            }
38548568c3a09bff9bd2f7c9462b116bed0537d19342Adam Powell        }
3855326d808b858359464b2ffeb84f2e0a8e0c79b600Adam Powell    }
3856326d808b858359464b2ffeb84f2e0a8e0c79b600Adam Powell
3857326d808b858359464b2ffeb84f2e0a8e0c79b600Adam Powell    /**
385843c9cdffb619f93d9d4525dffd05701dc9c8c4bfRomain Guy     * Dispatch a hint about whether this view is displayed. For instance, when
385943c9cdffb619f93d9d4525dffd05701dc9c8c4bfRomain Guy     * a View moves out of the screen, it might receives a display hint indicating
386043c9cdffb619f93d9d4525dffd05701dc9c8c4bfRomain Guy     * the view is not displayed. Applications should not <em>rely</em> on this hint
386143c9cdffb619f93d9d4525dffd05701dc9c8c4bfRomain Guy     * as there is no guarantee that they will receive one.
386243c9cdffb619f93d9d4525dffd05701dc9c8c4bfRomain Guy     *
386343c9cdffb619f93d9d4525dffd05701dc9c8c4bfRomain Guy     * @param hint A hint about whether or not this view is displayed:
386443c9cdffb619f93d9d4525dffd05701dc9c8c4bfRomain Guy     * {@link #VISIBLE} or {@link #INVISIBLE}.
386543c9cdffb619f93d9d4525dffd05701dc9c8c4bfRomain Guy     */
386643c9cdffb619f93d9d4525dffd05701dc9c8c4bfRomain Guy    public void dispatchDisplayHint(int hint) {
386743c9cdffb619f93d9d4525dffd05701dc9c8c4bfRomain Guy        onDisplayHint(hint);
386843c9cdffb619f93d9d4525dffd05701dc9c8c4bfRomain Guy    }
386943c9cdffb619f93d9d4525dffd05701dc9c8c4bfRomain Guy
387043c9cdffb619f93d9d4525dffd05701dc9c8c4bfRomain Guy    /**
387143c9cdffb619f93d9d4525dffd05701dc9c8c4bfRomain Guy     * Gives this view a hint about whether is displayed or not. For instance, when
387243c9cdffb619f93d9d4525dffd05701dc9c8c4bfRomain Guy     * a View moves out of the screen, it might receives a display hint indicating
387343c9cdffb619f93d9d4525dffd05701dc9c8c4bfRomain Guy     * the view is not displayed. Applications should not <em>rely</em> on this hint
387443c9cdffb619f93d9d4525dffd05701dc9c8c4bfRomain Guy     * as there is no guarantee that they will receive one.
387543c9cdffb619f93d9d4525dffd05701dc9c8c4bfRomain Guy     *
387643c9cdffb619f93d9d4525dffd05701dc9c8c4bfRomain Guy     * @param hint A hint about whether or not this view is displayed:
387743c9cdffb619f93d9d4525dffd05701dc9c8c4bfRomain Guy     * {@link #VISIBLE} or {@link #INVISIBLE}.
387843c9cdffb619f93d9d4525dffd05701dc9c8c4bfRomain Guy     */
387943c9cdffb619f93d9d4525dffd05701dc9c8c4bfRomain Guy    protected void onDisplayHint(int hint) {
388043c9cdffb619f93d9d4525dffd05701dc9c8c4bfRomain Guy    }
388143c9cdffb619f93d9d4525dffd05701dc9c8c4bfRomain Guy
388243c9cdffb619f93d9d4525dffd05701dc9c8c4bfRomain Guy    /**
38839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Dispatch a window visibility change down the view hierarchy.
38849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * ViewGroups should override to route to their children.
38859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
38869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param visibility The new visibility of the window.
38879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
38889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onWindowVisibilityChanged
38899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
38909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void dispatchWindowVisibilityChanged(int visibility) {
38919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        onWindowVisibilityChanged(visibility);
38929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
38939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
38949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
38959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called when the window containing has change its visibility
38969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * (between {@link #GONE}, {@link #INVISIBLE}, and {@link #VISIBLE}).  Note
38979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that this tells you whether or not your window is being made visible
38989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to the window manager; this does <em>not</em> tell you whether or not
38999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * your window is obscured by other windows on the screen, even if it
39009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is itself visible.
39019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
39029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param visibility The new visibility of the window.
39039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
39049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onWindowVisibilityChanged(int visibility) {
39058568c3a09bff9bd2f7c9462b116bed0537d19342Adam Powell        if (visibility == VISIBLE) {
39068568c3a09bff9bd2f7c9462b116bed0537d19342Adam Powell            initialAwakenScrollBars();
39078568c3a09bff9bd2f7c9462b116bed0537d19342Adam Powell        }
39089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
39099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
39109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
39119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the current visibility of the window this view is attached to
39129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * (either {@link #GONE}, {@link #INVISIBLE}, or {@link #VISIBLE}).
39139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
39149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns the current visibility of the view's window.
39159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
39169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getWindowVisibility() {
39179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mAttachInfo != null ? mAttachInfo.mWindowVisibility : GONE;
39189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
39199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
39209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
39219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the overall visible display size in which the window this view is
39229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * attached to has been positioned in.  This takes into account screen
39239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * decorations above the window, for both cases where the window itself
39249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is being position inside of them or the window is being placed under
39259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * then and covered insets are used for the window to position its content
39269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * inside.  In effect, this tells you the available area where content can
39279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * be placed and remain visible to users.
39289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
39299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This function requires an IPC back to the window manager to retrieve
39309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the requested information, so should not be used in performance critical
39319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * code like drawing.
39329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
39339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param outRect Filled in with the visible display frame.  If the view
39349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is not attached to a window, this is simply the raw display size.
39359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
39369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void getWindowVisibleDisplayFrame(Rect outRect) {
39379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mAttachInfo != null) {
39389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
39399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mAttachInfo.mSession.getDisplayFrame(mAttachInfo.mWindow, outRect);
39409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
39419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
39429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
39439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // XXX This is really broken, and probably all needs to be done
39449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // in the window manager, and we need to know more about whether
39459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // we want the area behind or in front of the IME.
39469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final Rect insets = mAttachInfo.mVisibleInsets;
39479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outRect.left += insets.left;
39489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outRect.top += insets.top;
39499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outRect.right -= insets.right;
39509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            outRect.bottom -= insets.bottom;
39519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
39529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
39539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Display d = WindowManagerImpl.getDefault().getDefaultDisplay();
39549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        outRect.set(0, 0, d.getWidth(), d.getHeight());
39559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
39569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
39579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3958e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn     * Dispatch a notification about a resource configuration change down
3959e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn     * the view hierarchy.
3960e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn     * ViewGroups should override to route to their children.
3961e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn     *
3962e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn     * @param newConfig The new resource configuration.
3963e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn     *
3964e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn     * @see #onConfigurationChanged
3965e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn     */
3966e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn    public void dispatchConfigurationChanged(Configuration newConfig) {
3967e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn        onConfigurationChanged(newConfig);
3968e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn    }
3969e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn
3970e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn    /**
3971e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn     * Called when the current configuration of the resources being used
3972e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn     * by the application have changed.  You can use this to decide when
3973e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn     * to reload resources that can changed based on orientation and other
3974e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn     * configuration characterstics.  You only need to use this if you are
3975e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn     * not relying on the normal {@link android.app.Activity} mechanism of
3976e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn     * recreating the activity instance upon a configuration change.
3977e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn     *
3978e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn     * @param newConfig The new resource configuration.
3979e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn     */
3980e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn    protected void onConfigurationChanged(Configuration newConfig) {
3981e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn    }
3982e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn
3983e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn    /**
39849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Private function to aggregate all per-view attributes in to the view
39859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * root.
39869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
39879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void dispatchCollectViewAttributes(int visibility) {
39889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        performCollectViewAttributes(visibility);
39899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
39909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
39919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void performCollectViewAttributes(int visibility) {
39929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //noinspection PointlessBitwiseExpression
39939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (((visibility | mViewFlags) & (VISIBILITY_MASK | KEEP_SCREEN_ON))
39949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                == (VISIBLE | KEEP_SCREEN_ON)) {
39959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mAttachInfo.mKeepScreenOn = true;
39969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
39979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
39989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
39999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void needGlobalAttributesUpdate(boolean force) {
40009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AttachInfo ai = mAttachInfo;
40019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (ai != null) {
40029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (ai.mKeepScreenOn || force) {
40039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ai.mRecomputeGlobalAttributes = true;
40049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
40059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
40069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
40079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
40099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns whether the device is currently in touch mode.  Touch mode is entered
40109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * once the user begins interacting with the device by touch, and affects various
40119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * things like whether focus is always visible to the user.
40129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
40139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Whether the device is in touch mode.
40149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
40159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @ViewDebug.ExportedProperty
40169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isInTouchMode() {
40179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mAttachInfo != null) {
40189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mAttachInfo.mInTouchMode;
40199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
40209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ViewRoot.isInTouchMode();
40219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
40229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
40239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
40259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the context the view is running in, through which it can
40269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * access the current theme, resources, etc.
40279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
40289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The view's Context.
40299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
40309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @ViewDebug.CapturedViewProperty
40319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final Context getContext() {
40329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mContext;
40339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
40349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
40369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Handle a key event before it is processed by any input method
40379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * associated with the view hierarchy.  This can be used to intercept
40389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * key events in special situations before the IME consumes them; a
40399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * typical example would be handling the BACK key to update the application's
40409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * UI instead of allowing the IME to see it and close itself.
40419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
40429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param keyCode The value in event.getKeyCode().
40439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param event Description of the key event.
40449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return If you handled the event, return true. If you want to allow the
40459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         event to be handled by the next receiver, return false.
40469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
40479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onKeyPreIme(int keyCode, KeyEvent event) {
40489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
40499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
40509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
40529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Default implementation of {@link KeyEvent.Callback#onKeyMultiple(int, int, KeyEvent)
40539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * KeyEvent.Callback.onKeyMultiple()}: perform press of the view
40549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * when {@link KeyEvent#KEYCODE_DPAD_CENTER} or {@link KeyEvent#KEYCODE_ENTER}
40559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is released, if the view is enabled and clickable.
40569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
40579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param keyCode A key code that represents the button pressed, from
40589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                {@link android.view.KeyEvent}.
40599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param event   The KeyEvent object that defines the button action.
40609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
40619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onKeyDown(int keyCode, KeyEvent event) {
40629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean result = false;
40639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (keyCode) {
40659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case KeyEvent.KEYCODE_DPAD_CENTER:
40669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case KeyEvent.KEYCODE_ENTER: {
40679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if ((mViewFlags & ENABLED_MASK) == DISABLED) {
40689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return true;
40699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
40709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Long clickable items don't necessarily have to be clickable
40719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (((mViewFlags & CLICKABLE) == CLICKABLE ||
40729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        (mViewFlags & LONG_CLICKABLE) == LONG_CLICKABLE) &&
40739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        (event.getRepeatCount() == 0)) {
40749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    setPressed(true);
40759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if ((mViewFlags & LONG_CLICKABLE) == LONG_CLICKABLE) {
4076e14579bac59aa84523c2bfbfc3f28c7842ec664dAdam Powell                        postCheckForLongClick(0);
40779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
40789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return true;
40799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
40809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
40819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
40829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
40839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return result;
40849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
40859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
40869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
408783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * Default implementation of {@link KeyEvent.Callback#onKeyLongPress(int, KeyEvent)
408883fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * KeyEvent.Callback.onKeyLongPress()}: always returns false (doesn't handle
408983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     * the event).
409083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn     */
409183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    public boolean onKeyLongPress(int keyCode, KeyEvent event) {
409283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        return false;
409383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    }
409483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn
409583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn    /**
40969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Default implementation of {@link KeyEvent.Callback#onKeyMultiple(int, int, KeyEvent)
40979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * KeyEvent.Callback.onKeyMultiple()}: perform clicking of the view
40989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * when {@link KeyEvent#KEYCODE_DPAD_CENTER} or
40999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link KeyEvent#KEYCODE_ENTER} is released.
41009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
41019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param keyCode A key code that represents the button pressed, from
41029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                {@link android.view.KeyEvent}.
41039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param event   The KeyEvent object that defines the button action.
41049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
41059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onKeyUp(int keyCode, KeyEvent event) {
41069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean result = false;
41079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
41089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (keyCode) {
41099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case KeyEvent.KEYCODE_DPAD_CENTER:
41109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case KeyEvent.KEYCODE_ENTER: {
41119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if ((mViewFlags & ENABLED_MASK) == DISABLED) {
41129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return true;
41139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
41149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if ((mViewFlags & CLICKABLE) == CLICKABLE && isPressed()) {
41159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    setPressed(false);
41169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
41179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!mHasPerformedLongPress) {
41189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // This is a tap, so remove the longpress check
41191549dd1e6801a0240a2e2769c91181698910f98dMaryam Garrett                        removeLongPressCallback();
41209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
41219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        result = performClick();
41229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
41239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
41249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                break;
41259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
41269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
41279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return result;
41289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
41299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
41309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
41319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Default implementation of {@link KeyEvent.Callback#onKeyMultiple(int, int, KeyEvent)
41329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * KeyEvent.Callback.onKeyMultiple()}: always returns false (doesn't handle
41339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the event).
41349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
41359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param keyCode     A key code that represents the button pressed, from
41369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                    {@link android.view.KeyEvent}.
41379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param repeatCount The number of times the action was made.
41389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param event       The KeyEvent object that defines the button action.
41399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
41409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onKeyMultiple(int keyCode, int repeatCount, KeyEvent event) {
41419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
41429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
41439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
41449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
41459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called when an unhandled key shortcut event occurs.
41469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
41479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param keyCode The value in event.getKeyCode().
41489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param event Description of the key event.
41499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return If you handled the event, return true. If you want to allow the
41509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         event to be handled by the next receiver, return false.
41519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
41529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onKeyShortcut(int keyCode, KeyEvent event) {
41539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
41549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
41559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
41569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
41579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Check whether the called view is a text editor, in which case it
41589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * would make sense to automatically display a soft input window for
41599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * it.  Subclasses should override this if they implement
41609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onCreateInputConnection(EditorInfo)} to return true if
4161b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project     * a call on that method would return a non-null InputConnection, and
4162b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project     * they are really a first-class editor that the user would normally
4163b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project     * start typing on when the go into a window containing your view.
41648506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy     *
4165b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project     * <p>The default implementation always returns false.  This does
4166b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project     * <em>not</em> mean that its {@link #onCreateInputConnection(EditorInfo)}
4167b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project     * will not be called or the user can not otherwise perform edits on your
4168b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project     * view; it is just a hint to the system that this is not the primary
4169b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project     * purpose of this view.
41708506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy     *
41719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns true if this view is a text editor, else false.
41729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
41739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onCheckIsTextEditor() {
41749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
41759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
41768506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
41779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
41789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Create a new InputConnection for an InputMethod to interact
41799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * with the view.  The default implementation returns null, since it doesn't
41809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * support input methods.  You can override this to implement such support.
41819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This is only needed for views that take focus and text input.
41828506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy     *
41839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>When implementing this, you probably also want to implement
41849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onCheckIsTextEditor()} to indicate you will return a
41859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * non-null InputConnection.
41869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
41879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param outAttrs Fill in with attribute information about the connection.
41889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
41899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
41909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
41919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
41929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
41939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4194b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project     * Called by the {@link android.view.inputmethod.InputMethodManager}
4195b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project     * when a view who is not the current
4196b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project     * input connection target is trying to make a call on the manager.  The
4197b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project     * default implementation returns false; you can override this to return
4198b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project     * true for certain views if you are performing InputConnection proxying
4199b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project     * to them.
4200b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project     * @param view The View that is making the InputMethodManager call.
4201b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project     * @return Return true to allow the call, false to reject.
4202b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project     */
4203b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project    public boolean checkInputConnectionProxy(View view) {
4204b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project        return false;
4205b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project    }
42068506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
4207b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project    /**
42089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Show the context menu for this view. It is not safe to hold on to the
42099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * menu after returning from this method.
42109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
42119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param menu The context menu to populate
42129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
42139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void createContextMenu(ContextMenu menu) {
42149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ContextMenuInfo menuInfo = getContextMenuInfo();
42159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
42169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Sets the current menu info so all items added to menu will have
42179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // my extra info set.
42189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ((MenuBuilder)menu).setCurrentMenuInfo(menuInfo);
42199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
42209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        onCreateContextMenu(menu);
42219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mOnCreateContextMenuListener != null) {
42229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mOnCreateContextMenuListener.onCreateContextMenu(menu, this, menuInfo);
42239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
42249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
42259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Clear the extra information so subsequent items that aren't mine don't
42269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // have my extra info.
42279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ((MenuBuilder)menu).setCurrentMenuInfo(null);
42289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
42299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent != null) {
42309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParent.createContextMenu(menu);
42319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
42329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
42339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
42349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
42359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Views should implement this if they have extra information to associate
42369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * with the context menu. The return result is supplied as a parameter to
42379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the {@link OnCreateContextMenuListener#onCreateContextMenu(ContextMenu, View, ContextMenuInfo)}
42389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * callback.
42399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
42409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Extra information about the item for which the context menu
42419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         should be shown. This information will vary across different
42429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         subclasses of View.
42439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
42449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected ContextMenuInfo getContextMenuInfo() {
42459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
42469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
42479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
42489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
42499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Views should implement this if the view itself is going to add items to
42509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the context menu.
42519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
42529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param menu the context menu to populate
42539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
42549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onCreateContextMenu(ContextMenu menu) {
42559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
42569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
42579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
42589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Implement this method to handle trackball motion events.  The
42599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <em>relative</em> movement of the trackball since the last event
42609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * can be retrieve with {@link MotionEvent#getX MotionEvent.getX()} and
42619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link MotionEvent#getY MotionEvent.getY()}.  These are normalized so
42629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that a movement of 1 corresponds to the user pressing one DPAD key (so
42639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * they will often be fractional values, representing the more fine-grained
42649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * movement information available from a trackball).
42659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
42669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param event The motion event.
42679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return True if the event was handled, false otherwise.
42689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
42699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onTrackballEvent(MotionEvent event) {
42709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
42719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
42729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
42739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
42749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Implement this method to handle touch screen motion events.
42759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
42769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param event The motion event.
42779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return True if the event was handled, false otherwise.
42789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
42799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean onTouchEvent(MotionEvent event) {
42809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int viewFlags = mViewFlags;
42819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
42829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((viewFlags & ENABLED_MASK) == DISABLED) {
42839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // A disabled view that is clickable still consumes the touch
42849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // events, it just doesn't respond to them.
42859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return (((viewFlags & CLICKABLE) == CLICKABLE ||
42869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    (viewFlags & LONG_CLICKABLE) == LONG_CLICKABLE));
42879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
42889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
42899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mTouchDelegate != null) {
42909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mTouchDelegate.onTouchEvent(event)) {
42919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return true;
42929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
42939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
42949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
42959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (((viewFlags & CLICKABLE) == CLICKABLE ||
42969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                (viewFlags & LONG_CLICKABLE) == LONG_CLICKABLE)) {
42979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            switch (event.getAction()) {
42989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case MotionEvent.ACTION_UP:
4299e14579bac59aa84523c2bfbfc3f28c7842ec664dAdam Powell                    boolean prepressed = (mPrivateFlags & PREPRESSED) != 0;
4300e14579bac59aa84523c2bfbfc3f28c7842ec664dAdam Powell                    if ((mPrivateFlags & PRESSED) != 0 || prepressed) {
43019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // take focus if we don't have it already and we should in
43029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // touch mode.
43039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        boolean focusTaken = false;
43049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (isFocusable() && isFocusableInTouchMode() && !isFocused()) {
43059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            focusTaken = requestFocus();
43069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
43079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
43089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (!mHasPerformedLongPress) {
43099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // This is a tap, so remove the longpress check
43101549dd1e6801a0240a2e2769c91181698910f98dMaryam Garrett                            removeLongPressCallback();
43119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
43129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // Only perform take click actions if we were in the pressed state
43139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (!focusTaken) {
4314a35d7687dda3617b5b8cd4e8876d620223dd1613Adam Powell                                // Use a Runnable and post this rather than calling
4315a35d7687dda3617b5b8cd4e8876d620223dd1613Adam Powell                                // performClick directly. This lets other visual state
4316a35d7687dda3617b5b8cd4e8876d620223dd1613Adam Powell                                // of the view update before click actions start.
4317a35d7687dda3617b5b8cd4e8876d620223dd1613Adam Powell                                if (mPerformClick == null) {
4318a35d7687dda3617b5b8cd4e8876d620223dd1613Adam Powell                                    mPerformClick = new PerformClick();
4319a35d7687dda3617b5b8cd4e8876d620223dd1613Adam Powell                                }
4320a35d7687dda3617b5b8cd4e8876d620223dd1613Adam Powell                                if (!post(mPerformClick)) {
4321a35d7687dda3617b5b8cd4e8876d620223dd1613Adam Powell                                    performClick();
4322a35d7687dda3617b5b8cd4e8876d620223dd1613Adam Powell                                }
43239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
43249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
43259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
43269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (mUnsetPressedState == null) {
43279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mUnsetPressedState = new UnsetPressedState();
43289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
43299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4330e14579bac59aa84523c2bfbfc3f28c7842ec664dAdam Powell                        if (prepressed) {
4331e14579bac59aa84523c2bfbfc3f28c7842ec664dAdam Powell                            mPrivateFlags |= PRESSED;
4332e14579bac59aa84523c2bfbfc3f28c7842ec664dAdam Powell                            refreshDrawableState();
4333e14579bac59aa84523c2bfbfc3f28c7842ec664dAdam Powell                            postDelayed(mUnsetPressedState,
4334e14579bac59aa84523c2bfbfc3f28c7842ec664dAdam Powell                                    ViewConfiguration.getPressedStateDuration());
4335e14579bac59aa84523c2bfbfc3f28c7842ec664dAdam Powell                        } else if (!post(mUnsetPressedState)) {
43369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // If the post failed, unpress right now
43379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mUnsetPressedState.run();
43389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
4339e14579bac59aa84523c2bfbfc3f28c7842ec664dAdam Powell                        removeTapCallback();
43409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
43419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
43429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
43439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case MotionEvent.ACTION_DOWN:
4344e14579bac59aa84523c2bfbfc3f28c7842ec664dAdam Powell                    if (mPendingCheckForTap == null) {
4345e14579bac59aa84523c2bfbfc3f28c7842ec664dAdam Powell                        mPendingCheckForTap = new CheckForTap();
43469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
4347e14579bac59aa84523c2bfbfc3f28c7842ec664dAdam Powell                    mPrivateFlags |= PREPRESSED;
43483b0233959cc181baca896620b42e3cb6ceca2808Adam Powell                    mHasPerformedLongPress = false;
4349e14579bac59aa84523c2bfbfc3f28c7842ec664dAdam Powell                    postDelayed(mPendingCheckForTap, ViewConfiguration.getTapTimeout());
43509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
43519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
43529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case MotionEvent.ACTION_CANCEL:
43539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mPrivateFlags &= ~PRESSED;
43549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    refreshDrawableState();
4355e14579bac59aa84523c2bfbfc3f28c7842ec664dAdam Powell                    removeTapCallback();
43569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
43579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
43589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case MotionEvent.ACTION_MOVE:
43599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final int x = (int) event.getX();
43609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final int y = (int) event.getY();
43619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
43629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Be lenient about moving outside of buttons
4363e14579bac59aa84523c2bfbfc3f28c7842ec664dAdam Powell                    int slop = mTouchSlop;
43649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if ((x < 0 - slop) || (x >= getWidth() + slop) ||
43659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            (y < 0 - slop) || (y >= getHeight() + slop)) {
43669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        // Outside button
4367e14579bac59aa84523c2bfbfc3f28c7842ec664dAdam Powell                        removeTapCallback();
43689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if ((mPrivateFlags & PRESSED) != 0) {
4369e14579bac59aa84523c2bfbfc3f28c7842ec664dAdam Powell                            // Remove any future long press/tap checks
43701549dd1e6801a0240a2e2769c91181698910f98dMaryam Garrett                            removeLongPressCallback();
43719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
43729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            // Need to switch from pressed to not pressed
43739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mPrivateFlags &= ~PRESSED;
43749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            refreshDrawableState();
43759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
43769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
43779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    break;
43789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
43799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
43809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
43819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
43829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
43839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
43849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
43859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
43861549dd1e6801a0240a2e2769c91181698910f98dMaryam Garrett     * Remove the longpress detection timer.
43871549dd1e6801a0240a2e2769c91181698910f98dMaryam Garrett     */
43881549dd1e6801a0240a2e2769c91181698910f98dMaryam Garrett    private void removeLongPressCallback() {
43891549dd1e6801a0240a2e2769c91181698910f98dMaryam Garrett        if (mPendingCheckForLongPress != null) {
43901549dd1e6801a0240a2e2769c91181698910f98dMaryam Garrett          removeCallbacks(mPendingCheckForLongPress);
43911549dd1e6801a0240a2e2769c91181698910f98dMaryam Garrett        }
43921549dd1e6801a0240a2e2769c91181698910f98dMaryam Garrett    }
4393e14579bac59aa84523c2bfbfc3f28c7842ec664dAdam Powell
4394e14579bac59aa84523c2bfbfc3f28c7842ec664dAdam Powell    /**
4395a440b002aa59e1455bdfa2c5a1ca51c74bbc19acRomain Guy     * Remove the prepress detection timer.
4396a440b002aa59e1455bdfa2c5a1ca51c74bbc19acRomain Guy     */
4397a440b002aa59e1455bdfa2c5a1ca51c74bbc19acRomain Guy    private void removeUnsetPressCallback() {
4398a440b002aa59e1455bdfa2c5a1ca51c74bbc19acRomain Guy        if ((mPrivateFlags & PRESSED) != 0 && mUnsetPressedState != null) {
4399a440b002aa59e1455bdfa2c5a1ca51c74bbc19acRomain Guy            setPressed(false);
4400a440b002aa59e1455bdfa2c5a1ca51c74bbc19acRomain Guy            removeCallbacks(mUnsetPressedState);
4401a440b002aa59e1455bdfa2c5a1ca51c74bbc19acRomain Guy        }
4402a440b002aa59e1455bdfa2c5a1ca51c74bbc19acRomain Guy    }
4403a440b002aa59e1455bdfa2c5a1ca51c74bbc19acRomain Guy
4404a440b002aa59e1455bdfa2c5a1ca51c74bbc19acRomain Guy    /**
4405e14579bac59aa84523c2bfbfc3f28c7842ec664dAdam Powell     * Remove the tap detection timer.
4406e14579bac59aa84523c2bfbfc3f28c7842ec664dAdam Powell     */
4407e14579bac59aa84523c2bfbfc3f28c7842ec664dAdam Powell    private void removeTapCallback() {
4408e14579bac59aa84523c2bfbfc3f28c7842ec664dAdam Powell        if (mPendingCheckForTap != null) {
4409e14579bac59aa84523c2bfbfc3f28c7842ec664dAdam Powell            mPrivateFlags &= ~PREPRESSED;
4410e14579bac59aa84523c2bfbfc3f28c7842ec664dAdam Powell            removeCallbacks(mPendingCheckForTap);
4411e14579bac59aa84523c2bfbfc3f28c7842ec664dAdam Powell        }
4412e14579bac59aa84523c2bfbfc3f28c7842ec664dAdam Powell    }
44131549dd1e6801a0240a2e2769c91181698910f98dMaryam Garrett
44141549dd1e6801a0240a2e2769c91181698910f98dMaryam Garrett    /**
44159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Cancels a pending long press.  Your subclass can use this if you
44169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * want the context menu to come up if the user presses and holds
44179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * at the same place, but you don't want it to come up if they press
44189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and then move around enough to cause scrolling.
44199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
44209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void cancelLongPress() {
44211549dd1e6801a0240a2e2769c91181698910f98dMaryam Garrett        removeLongPressCallback();
4422732ebb1bc3d7760fd424b84e0235ea9946100102Adam Powell
4423732ebb1bc3d7760fd424b84e0235ea9946100102Adam Powell        /*
4424732ebb1bc3d7760fd424b84e0235ea9946100102Adam Powell         * The prepressed state handled by the tap callback is a display
4425732ebb1bc3d7760fd424b84e0235ea9946100102Adam Powell         * construct, but the tap callback will post a long press callback
4426732ebb1bc3d7760fd424b84e0235ea9946100102Adam Powell         * less its own timeout. Remove it here.
4427732ebb1bc3d7760fd424b84e0235ea9946100102Adam Powell         */
4428732ebb1bc3d7760fd424b84e0235ea9946100102Adam Powell        removeTapCallback();
44299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
44309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
44329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the TouchDelegate for this View.
44339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
44349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setTouchDelegate(TouchDelegate delegate) {
44359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTouchDelegate = delegate;
44369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
44379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
44399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Gets the TouchDelegate for this View.
44409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
44419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public TouchDelegate getTouchDelegate() {
44429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mTouchDelegate;
44439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
44449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
44469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set flags controlling behavior of this view.
44479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
44489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param flags Constant indicating the value which should be set
44499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param mask Constant indicating the bit range that should be changed
44509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
44519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void setFlags(int flags, int mask) {
44529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int old = mViewFlags;
44539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mViewFlags = (mViewFlags & ~mask) | (flags & mask);
44549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int changed = mViewFlags ^ old;
44569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (changed == 0) {
44579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
44589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
44599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int privateFlags = mPrivateFlags;
44609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /* Check if the FOCUSABLE bit has changed */
44629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (((changed & FOCUSABLE_MASK) != 0) &&
44639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ((privateFlags & HAS_BOUNDS) !=0)) {
44649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (((old & FOCUSABLE_MASK) == FOCUSABLE)
44659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    && ((privateFlags & FOCUSED) != 0)) {
44669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /* Give up focus if we are no longer focusable */
44679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                clearFocus();
44689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (((old & FOCUSABLE_MASK) == NOT_FOCUSABLE)
44699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    && ((privateFlags & FOCUSED) == 0)) {
44709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /*
44719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * Tell the view system that we are now available to take focus
44729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * if no one else already has it.
44739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
44749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mParent != null) mParent.focusableViewAvailable(this);
44759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
44769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
44779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags & VISIBILITY_MASK) == VISIBLE) {
44799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((changed & VISIBILITY_MASK) != 0) {
44809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /*
44819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * If this view is becoming visible, set the DRAWN flag so that
44829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * the next invalidate() will not be skipped.
44839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
44849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPrivateFlags |= DRAWN;
44859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                needGlobalAttributesUpdate(true);
44879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // a view becoming visible is worth notifying the parent
44899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // about in case nothing has focus.  even if this specific view
44909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // isn't focusable, it may contain something that is, so let
44919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // the root view try to give this focus if nothing else does.
44929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if ((mParent != null) && (mBottom > mTop) && (mRight > mLeft)) {
44939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mParent.focusableViewAvailable(this);
44949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
44959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
44969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
44979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
44989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /* Check if the GONE bit has changed */
44999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((changed & GONE) != 0) {
45009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            needGlobalAttributesUpdate(false);
45019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            requestLayout();
45029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            invalidate();
45039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4504ecd80ee31c23ac067bb420f44f046682c499e83cRomain Guy            if (((mViewFlags & VISIBILITY_MASK) == GONE)) {
4505ecd80ee31c23ac067bb420f44f046682c499e83cRomain Guy                if (hasFocus()) clearFocus();
4506ecd80ee31c23ac067bb420f44f046682c499e83cRomain Guy                destroyDrawingCache();
45079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
45089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mAttachInfo != null) {
45099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mAttachInfo.mViewVisibilityChanged = true;
45109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
45119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
45129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /* Check if the VISIBLE bit has changed */
45149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((changed & INVISIBLE) != 0) {
45159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            needGlobalAttributesUpdate(false);
45169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            invalidate();
45179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (((mViewFlags & VISIBILITY_MASK) == INVISIBLE) && hasFocus()) {
45199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // root view becoming invisible shouldn't clear focus
45209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (getRootView() != this) {
45219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    clearFocus();
45229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
45239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
45249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mAttachInfo != null) {
45259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mAttachInfo.mViewVisibilityChanged = true;
45269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
45279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
45289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4529326d808b858359464b2ffeb84f2e0a8e0c79b600Adam Powell        if ((changed & VISIBILITY_MASK) != 0) {
4530326d808b858359464b2ffeb84f2e0a8e0c79b600Adam Powell            dispatchVisibilityChanged(this, (flags & VISIBILITY_MASK));
4531326d808b858359464b2ffeb84f2e0a8e0c79b600Adam Powell        }
4532326d808b858359464b2ffeb84f2e0a8e0c79b600Adam Powell
45339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((changed & WILL_NOT_CACHE_DRAWING) != 0) {
45349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            destroyDrawingCache();
45359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
45369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((changed & DRAWING_CACHE_ENABLED) != 0) {
45389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            destroyDrawingCache();
45399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPrivateFlags &= ~DRAWING_CACHE_VALID;
45409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
45419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((changed & DRAWING_CACHE_QUALITY_MASK) != 0) {
45439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            destroyDrawingCache();
45449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPrivateFlags &= ~DRAWING_CACHE_VALID;
45459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
45469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((changed & DRAW_MASK) != 0) {
45489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((mViewFlags & WILL_NOT_DRAW) != 0) {
45499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mBGDrawable != null) {
45509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mPrivateFlags &= ~SKIP_DRAW;
45519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mPrivateFlags |= ONLY_DRAWS_BACKGROUND;
45529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
45539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mPrivateFlags |= SKIP_DRAW;
45549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
45559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
45569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPrivateFlags &= ~SKIP_DRAW;
45579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
45589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            requestLayout();
45599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            invalidate();
45609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
45619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((changed & KEEP_SCREEN_ON) != 0) {
45639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mParent != null) {
45649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mParent.recomputeViewAttributes(this);
45659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
45669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
45679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
45689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
45709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Change the view's z order in the tree, so it's on top of other sibling
45719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * views
45729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
45739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void bringToFront() {
45749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent != null) {
45759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParent.bringChildToFront(this);
45769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
45779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
45789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
45809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This is called in response to an internal scroll in this view (i.e., the
45819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * view scrolled its own contents). This is typically as a result of
45829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #scrollBy(int, int)} or {@link #scrollTo(int, int)} having been
45839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * called.
45849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
45859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param l Current horizontal scroll origin.
45869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param t Current vertical scroll origin.
45879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param oldl Previous horizontal scroll origin.
45889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param oldt Previous vertical scroll origin.
45899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
45909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onScrollChanged(int l, int t, int oldl, int oldt) {
45919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBackgroundSizeChanged = true;
45929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final AttachInfo ai = mAttachInfo;
45949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (ai != null) {
45959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ai.mViewScrollChanged = true;
45969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
45979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
45989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
45999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
46009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This is called during layout when the size of this view has changed. If
46019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * you were just added to the view hierarchy, you're called with the old
46029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * values of 0.
46039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
46049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param w Current width of this view.
46059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param h Current height of this view.
46069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param oldw Old width of this view.
46079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param oldh Old height of this view.
46089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
46099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
46109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
46119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
46129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
46139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called by draw to draw the child views. This may be overridden
46149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * by derived classes to gain control just before its children are drawn
46159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * (but after its own view has been drawn).
46169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param canvas the canvas on which to draw the view
46179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
46189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void dispatchDraw(Canvas canvas) {
46199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
46209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
46219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
46229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Gets the parent of this view. Note that the parent is a
46239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * ViewParent and not necessarily a View.
46249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
46259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Parent of this view.
46269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
46279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final ViewParent getParent() {
46289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mParent;
46299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
46309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
46319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
46329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the scrolled left position of this view. This is the left edge of
46339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the displayed part of your view. You do not need to draw any pixels
46349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * farther left, since those are outside of the frame of your view on
46359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * screen.
46369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
46379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The left edge of the displayed part of your view, in pixels.
46389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
46399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final int getScrollX() {
46409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mScrollX;
46419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
46429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
46439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
46449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the scrolled top position of this view. This is the top edge of
46459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the displayed part of your view. You do not need to draw any pixels above
46469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * it, since those are outside of the frame of your view on screen.
46479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
46489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The top edge of the displayed part of your view, in pixels.
46499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
46509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final int getScrollY() {
46519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mScrollY;
46529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
46539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
46549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
46559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the width of the your view.
46569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
46579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The width of your view, in pixels.
46589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
46599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @ViewDebug.ExportedProperty
46609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final int getWidth() {
46619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mRight - mLeft;
46629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
46639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
46649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
46659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the height of your view.
46669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
46679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The height of your view, in pixels.
46689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
46699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @ViewDebug.ExportedProperty
46709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final int getHeight() {
46719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mBottom - mTop;
46729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
46739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
46749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
46759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the visible drawing bounds of your view. Fills in the output
46769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * rectangle with the values from getScrollX(), getScrollY(),
46779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * getWidth(), and getHeight().
46789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
46799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param outRect The (scrolled) drawing bounds of the view.
46809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
46819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void getDrawingRect(Rect outRect) {
46829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        outRect.left = mScrollX;
46839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        outRect.top = mScrollY;
46849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        outRect.right = mScrollX + (mRight - mLeft);
46859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        outRect.bottom = mScrollY + (mBottom - mTop);
46869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
46879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
46889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
46899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The width of this view as measured in the most recent call to measure().
46909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This should be used during measurement and layout calculations only. Use
46919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #getWidth()} to see how wide a view is after layout.
46929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
46939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The measured width of this view.
46949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
46959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final int getMeasuredWidth() {
46969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mMeasuredWidth;
46979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
46989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
46999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
47009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The height of this view as measured in the most recent call to measure().
47019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This should be used during measurement and layout calculations only. Use
47029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #getHeight()} to see how tall a view is after layout.
47039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
47049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The measured height of this view.
47059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
47069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final int getMeasuredHeight() {
47079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mMeasuredHeight;
47089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
47099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
47109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
47119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Top position of this view relative to its parent.
47129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
47139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The top of this view, in pixels.
47149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
47159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @ViewDebug.CapturedViewProperty
47169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final int getTop() {
47179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mTop;
47189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
47199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
47209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
47219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Bottom position of this view relative to its parent.
47229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
47239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The bottom of this view, in pixels.
47249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
47259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @ViewDebug.CapturedViewProperty
47269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final int getBottom() {
47279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mBottom;
47289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
47299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
47309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
47319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Left position of this view relative to its parent.
47329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
47339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The left edge of this view, in pixels.
47349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
47359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @ViewDebug.CapturedViewProperty
47369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final int getLeft() {
47379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mLeft;
47389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
47399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
47409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
47419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Right position of this view relative to its parent.
47429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
47439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The right edge of this view, in pixels.
47449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
47459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @ViewDebug.CapturedViewProperty
47469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final int getRight() {
47479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mRight;
47489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
47499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
47509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
47519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Hit rectangle in parent's coordinates
47529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
47539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param outRect The hit rectangle of the view.
47549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
47559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void getHitRect(Rect outRect) {
47569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        outRect.set(mLeft, mTop, mRight, mBottom);
47579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
47589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
47599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
47609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * When a view has focus and the user navigates away from it, the next view is searched for
47619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * starting from the rectangle filled in by this method.
47629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
47639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * By default, the rectange is the {@link #getDrawingRect})of the view.  However, if your
47649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * view maintains some idea of internal selection, such as a cursor, or a selected row
47659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * or column, you should override this method and fill in a more specific rectangle.
47669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
47679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param r The rectangle to fill in, in this view's coordinates.
47689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
47699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void getFocusedRect(Rect r) {
47709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getDrawingRect(r);
47719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
47729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
47739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
47749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If some part of this view is not clipped by any of its parents, then
47759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * return that area in r in global (root) coordinates. To convert r to local
47769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * coordinates, offset it by -globalOffset (e.g. r.offset(-globalOffset.x,
47779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * -globalOffset.y)) If the view is completely clipped or translated out,
47789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * return false.
47799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
47809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param r If true is returned, r holds the global coordinates of the
47819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        visible portion of this view.
47829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param globalOffset If true is returned, globalOffset holds the dx,dy
47839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        between this view and its root. globalOffet may be null.
47849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return true if r is non-empty (i.e. part of the view is visible at the
47859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         root level.
47869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
47879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean getGlobalVisibleRect(Rect r, Point globalOffset) {
47889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int width = mRight - mLeft;
47899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int height = mBottom - mTop;
47909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (width > 0 && height > 0) {
47919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            r.set(0, 0, width, height);
47929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (globalOffset != null) {
47939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                globalOffset.set(-mScrollX, -mScrollY);
47949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
47959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mParent == null || mParent.getChildVisibleRect(this, r, globalOffset);
47969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
47979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
47989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
47999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
48009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final boolean getGlobalVisibleRect(Rect r) {
48019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getGlobalVisibleRect(r, null);
48029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
48039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
48049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final boolean getLocalVisibleRect(Rect r) {
48059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Point offset = new Point();
48069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (getGlobalVisibleRect(r, offset)) {
48079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            r.offset(-offset.x, -offset.y); // make r local
48089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
48099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
48109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
48119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
48129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
48139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
48149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Offset this view's vertical location by the specified number of pixels.
48159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
48169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param offset the number of pixels to offset the view by
48179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
48189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void offsetTopAndBottom(int offset) {
48199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTop += offset;
48209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBottom += offset;
48219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
48229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
48239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
48249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Offset this view's horizontal location by the specified amount of pixels.
48259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
48269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param offset the numer of pixels to offset the view by
48279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
48289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void offsetLeftAndRight(int offset) {
48299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLeft += offset;
48309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRight += offset;
48319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
48329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
48339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
48349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Get the LayoutParams associated with this view. All views should have
48359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * layout parameters. These supply parameters to the <i>parent</i> of this
48369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * view specifying how it should be arranged. There are many subclasses of
48379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * ViewGroup.LayoutParams, and these correspond to the different subclasses
48389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * of ViewGroup that are responsible for arranging their children.
48399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The LayoutParams associated with this view
48409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
48419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @ViewDebug.ExportedProperty(deepExport = true, prefix = "layout_")
48429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ViewGroup.LayoutParams getLayoutParams() {
48439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mLayoutParams;
48449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
48459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
48469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
48479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set the layout parameters associated with this view. These supply
48489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * parameters to the <i>parent</i> of this view specifying how it should be
48499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * arranged. There are many subclasses of ViewGroup.LayoutParams, and these
48509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * correspond to the different subclasses of ViewGroup that are responsible
48519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * for arranging their children.
48529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
48539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param params the layout parameters for this view
48549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
48559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setLayoutParams(ViewGroup.LayoutParams params) {
48569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (params == null) {
48579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new NullPointerException("params == null");
48589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
48599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLayoutParams = params;
48609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        requestLayout();
48619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
48629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
48639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
48649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set the scrolled position of your view. This will cause a call to
48659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onScrollChanged(int, int, int, int)} and the view will be
48669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * invalidated.
48679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param x the x position to scroll to
48689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param y the y position to scroll to
48699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
48709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void scrollTo(int x, int y) {
48719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mScrollX != x || mScrollY != y) {
48729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int oldX = mScrollX;
48739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int oldY = mScrollY;
48749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mScrollX = x;
48759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mScrollY = y;
48769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            onScrollChanged(mScrollX, mScrollY, oldX, oldY);
4877f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron            if (!awakenScrollBars()) {
4878f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron                invalidate();
4879f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron            }
48809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
48819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
48829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
48839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
48849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Move the scrolled position of your view. This will cause a call to
48859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onScrollChanged(int, int, int, int)} and the view will be
48869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * invalidated.
48879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param x the amount of pixels to scroll by horizontally
48889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param y the amount of pixels to scroll by vertically
48899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
48909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void scrollBy(int x, int y) {
48919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        scrollTo(mScrollX + x, mScrollY + y);
48929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
48939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
48949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4895f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron     * <p>Trigger the scrollbars to draw. When invoked this method starts an
4896f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron     * animation to fade the scrollbars out after a default delay. If a subclass
4897f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron     * provides animated scrolling, the start delay should equal the duration
4898f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron     * of the scrolling animation.</p>
4899f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron     *
4900f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron     * <p>The animation starts only if at least one of the scrollbars is
4901f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron     * enabled, as specified by {@link #isHorizontalScrollBarEnabled()} and
4902f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron     * {@link #isVerticalScrollBarEnabled()}. When the animation is started,
4903f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron     * this method returns true, and false otherwise. If the animation is
4904f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron     * started, this method calls {@link #invalidate()}; in that case the
4905f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron     * caller should not call {@link #invalidate()}.</p>
4906f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron     *
4907f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron     * <p>This method should be invoked every time a subclass directly updates
4908fe81d386a818b386ffc0d5a789236531ab4e264fMike Cleron     * the scroll parameters.</p>
4909f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron     *
4910f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron     * <p>This method is automatically invoked by {@link #scrollBy(int, int)}
4911f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron     * and {@link #scrollTo(int, int)}.</p>
4912f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron     *
4913f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron     * @return true if the animation is played, false otherwise
4914f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron     *
4915f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron     * @see #awakenScrollBars(int)
4916f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron     * @see #scrollBy(int, int)
4917f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron     * @see #scrollTo(int, int)
4918f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron     * @see #isHorizontalScrollBarEnabled()
4919f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron     * @see #isVerticalScrollBarEnabled()
4920f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron     * @see #setHorizontalScrollBarEnabled(boolean)
4921f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron     * @see #setVerticalScrollBarEnabled(boolean)
4922f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron     */
4923f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron    protected boolean awakenScrollBars() {
4924f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron        return mScrollCache != null &&
4925290947bbf830a1ea335b01bcd8155c699b6713caMike Cleron                awakenScrollBars(mScrollCache.scrollBarDefaultDelayBeforeFade, true);
4926f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron    }
4927f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron
4928f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron    /**
49298568c3a09bff9bd2f7c9462b116bed0537d19342Adam Powell     * Trigger the scrollbars to draw.
49308568c3a09bff9bd2f7c9462b116bed0537d19342Adam Powell     * This method differs from awakenScrollBars() only in its default duration.
49318568c3a09bff9bd2f7c9462b116bed0537d19342Adam Powell     * initialAwakenScrollBars() will show the scroll bars for longer than
49328568c3a09bff9bd2f7c9462b116bed0537d19342Adam Powell     * usual to give the user more of a chance to notice them.
49338568c3a09bff9bd2f7c9462b116bed0537d19342Adam Powell     *
49348568c3a09bff9bd2f7c9462b116bed0537d19342Adam Powell     * @return true if the animation is played, false otherwise.
49358568c3a09bff9bd2f7c9462b116bed0537d19342Adam Powell     */
49368568c3a09bff9bd2f7c9462b116bed0537d19342Adam Powell    private boolean initialAwakenScrollBars() {
49378568c3a09bff9bd2f7c9462b116bed0537d19342Adam Powell        return mScrollCache != null &&
49388568c3a09bff9bd2f7c9462b116bed0537d19342Adam Powell                awakenScrollBars(mScrollCache.scrollBarDefaultDelayBeforeFade * 4, true);
49398568c3a09bff9bd2f7c9462b116bed0537d19342Adam Powell    }
49408568c3a09bff9bd2f7c9462b116bed0537d19342Adam Powell
49418568c3a09bff9bd2f7c9462b116bed0537d19342Adam Powell    /**
4942f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron     * <p>
4943f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron     * Trigger the scrollbars to draw. When invoked this method starts an
4944f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron     * animation to fade the scrollbars out after a fixed delay. If a subclass
4945f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron     * provides animated scrolling, the start delay should equal the duration of
4946f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron     * the scrolling animation.
4947f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron     * </p>
4948f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron     *
4949f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron     * <p>
4950f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron     * The animation starts only if at least one of the scrollbars is enabled,
4951f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron     * as specified by {@link #isHorizontalScrollBarEnabled()} and
4952f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron     * {@link #isVerticalScrollBarEnabled()}. When the animation is started,
4953f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron     * this method returns true, and false otherwise. If the animation is
4954f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron     * started, this method calls {@link #invalidate()}; in that case the caller
4955f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron     * should not call {@link #invalidate()}.
4956f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron     * </p>
4957f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron     *
4958f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron     * <p>
4959f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron     * This method should be invoked everytime a subclass directly updates the
4960fe81d386a818b386ffc0d5a789236531ab4e264fMike Cleron     * scroll parameters.
4961f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron     * </p>
4962f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron     *
4963f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron     * @param startDelay the delay, in milliseconds, after which the animation
4964f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron     *        should start; when the delay is 0, the animation starts
4965f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron     *        immediately
4966f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron     * @return true if the animation is played, false otherwise
4967f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron     *
4968f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron     * @see #scrollBy(int, int)
4969f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron     * @see #scrollTo(int, int)
4970f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron     * @see #isHorizontalScrollBarEnabled()
4971f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron     * @see #isVerticalScrollBarEnabled()
4972f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron     * @see #setHorizontalScrollBarEnabled(boolean)
4973f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron     * @see #setVerticalScrollBarEnabled(boolean)
4974f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron     */
4975f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron    protected boolean awakenScrollBars(int startDelay) {
4976290947bbf830a1ea335b01bcd8155c699b6713caMike Cleron        return awakenScrollBars(startDelay, true);
4977290947bbf830a1ea335b01bcd8155c699b6713caMike Cleron    }
4978290947bbf830a1ea335b01bcd8155c699b6713caMike Cleron
4979290947bbf830a1ea335b01bcd8155c699b6713caMike Cleron    /**
4980290947bbf830a1ea335b01bcd8155c699b6713caMike Cleron     * <p>
4981290947bbf830a1ea335b01bcd8155c699b6713caMike Cleron     * Trigger the scrollbars to draw. When invoked this method starts an
4982290947bbf830a1ea335b01bcd8155c699b6713caMike Cleron     * animation to fade the scrollbars out after a fixed delay. If a subclass
4983290947bbf830a1ea335b01bcd8155c699b6713caMike Cleron     * provides animated scrolling, the start delay should equal the duration of
4984290947bbf830a1ea335b01bcd8155c699b6713caMike Cleron     * the scrolling animation.
4985290947bbf830a1ea335b01bcd8155c699b6713caMike Cleron     * </p>
4986290947bbf830a1ea335b01bcd8155c699b6713caMike Cleron     *
4987290947bbf830a1ea335b01bcd8155c699b6713caMike Cleron     * <p>
4988290947bbf830a1ea335b01bcd8155c699b6713caMike Cleron     * The animation starts only if at least one of the scrollbars is enabled,
4989290947bbf830a1ea335b01bcd8155c699b6713caMike Cleron     * as specified by {@link #isHorizontalScrollBarEnabled()} and
4990290947bbf830a1ea335b01bcd8155c699b6713caMike Cleron     * {@link #isVerticalScrollBarEnabled()}. When the animation is started,
4991290947bbf830a1ea335b01bcd8155c699b6713caMike Cleron     * this method returns true, and false otherwise. If the animation is
4992290947bbf830a1ea335b01bcd8155c699b6713caMike Cleron     * started, this method calls {@link #invalidate()} if the invalidate parameter
4993290947bbf830a1ea335b01bcd8155c699b6713caMike Cleron     * is set to true; in that case the caller
4994290947bbf830a1ea335b01bcd8155c699b6713caMike Cleron     * should not call {@link #invalidate()}.
4995290947bbf830a1ea335b01bcd8155c699b6713caMike Cleron     * </p>
4996290947bbf830a1ea335b01bcd8155c699b6713caMike Cleron     *
4997290947bbf830a1ea335b01bcd8155c699b6713caMike Cleron     * <p>
4998290947bbf830a1ea335b01bcd8155c699b6713caMike Cleron     * This method should be invoked everytime a subclass directly updates the
4999290947bbf830a1ea335b01bcd8155c699b6713caMike Cleron     * scroll parameters.
5000290947bbf830a1ea335b01bcd8155c699b6713caMike Cleron     * </p>
5001290947bbf830a1ea335b01bcd8155c699b6713caMike Cleron     *
5002290947bbf830a1ea335b01bcd8155c699b6713caMike Cleron     * @param startDelay the delay, in milliseconds, after which the animation
5003290947bbf830a1ea335b01bcd8155c699b6713caMike Cleron     *        should start; when the delay is 0, the animation starts
5004290947bbf830a1ea335b01bcd8155c699b6713caMike Cleron     *        immediately
5005290947bbf830a1ea335b01bcd8155c699b6713caMike Cleron     *
5006290947bbf830a1ea335b01bcd8155c699b6713caMike Cleron     * @param invalidate Wheter this method should call invalidate
5007290947bbf830a1ea335b01bcd8155c699b6713caMike Cleron     *
5008290947bbf830a1ea335b01bcd8155c699b6713caMike Cleron     * @return true if the animation is played, false otherwise
5009290947bbf830a1ea335b01bcd8155c699b6713caMike Cleron     *
5010290947bbf830a1ea335b01bcd8155c699b6713caMike Cleron     * @see #scrollBy(int, int)
5011290947bbf830a1ea335b01bcd8155c699b6713caMike Cleron     * @see #scrollTo(int, int)
5012290947bbf830a1ea335b01bcd8155c699b6713caMike Cleron     * @see #isHorizontalScrollBarEnabled()
5013290947bbf830a1ea335b01bcd8155c699b6713caMike Cleron     * @see #isVerticalScrollBarEnabled()
5014290947bbf830a1ea335b01bcd8155c699b6713caMike Cleron     * @see #setHorizontalScrollBarEnabled(boolean)
5015290947bbf830a1ea335b01bcd8155c699b6713caMike Cleron     * @see #setVerticalScrollBarEnabled(boolean)
5016290947bbf830a1ea335b01bcd8155c699b6713caMike Cleron     */
5017290947bbf830a1ea335b01bcd8155c699b6713caMike Cleron    protected boolean awakenScrollBars(int startDelay, boolean invalidate) {
5018f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron        final ScrollabilityCache scrollCache = mScrollCache;
5019f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron
5020f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron        if (scrollCache == null || !scrollCache.fadeScrollBars) {
5021f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron            return false;
5022f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron        }
5023f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron
5024f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron        if (scrollCache.scrollBar == null) {
5025f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron            scrollCache.scrollBar = new ScrollBarDrawable();
5026f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron        }
5027f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron
5028f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron        if (isHorizontalScrollBarEnabled() || isVerticalScrollBarEnabled()) {
5029f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron
5030290947bbf830a1ea335b01bcd8155c699b6713caMike Cleron            if (invalidate) {
5031290947bbf830a1ea335b01bcd8155c699b6713caMike Cleron                // Invalidate to show the scrollbars
5032290947bbf830a1ea335b01bcd8155c699b6713caMike Cleron                invalidate();
5033290947bbf830a1ea335b01bcd8155c699b6713caMike Cleron            }
5034f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron
5035f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron            if (scrollCache.state == ScrollabilityCache.OFF) {
5036f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron                // FIXME: this is copied from WindowManagerService.
5037f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron                // We should get this value from the system when it
5038f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron                // is possible to do so.
5039f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron                final int KEY_REPEAT_FIRST_DELAY = 750;
5040f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron                startDelay = Math.max(KEY_REPEAT_FIRST_DELAY, startDelay);
5041f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron            }
5042f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron
5043f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron            // Tell mScrollCache when we should start fading. This may
5044f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron            // extend the fade start time if one was already scheduled
50453ecd58c650371206008efd687933c370e4e28a34Mike Cleron            long fadeStartTime = AnimationUtils.currentAnimationTimeMillis() + startDelay;
5046f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron            scrollCache.fadeStartTime = fadeStartTime;
5047f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron            scrollCache.state = ScrollabilityCache.ON;
5048f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron
5049f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron            // Schedule our fader to run, unscheduling any old ones first
5050f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron            if (mAttachInfo != null) {
5051f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron                mAttachInfo.mHandler.removeCallbacks(scrollCache);
5052f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron                mAttachInfo.mHandler.postAtTime(scrollCache, fadeStartTime);
5053f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron            }
5054f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron
5055f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron            return true;
5056f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron        }
5057f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron
5058f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron        return false;
5059f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron    }
5060f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron
5061f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron    /**
50629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Mark the the area defined by dirty as needing to be drawn. If the view is
50639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * visible, {@link #onDraw} will be called at some point in the future.
50649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This must be called from a UI thread. To call from a non-UI thread, call
50659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #postInvalidate()}.
50669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
50679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * WARNING: This method is destructive to dirty.
50689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param dirty the rectangle representing the bounds of the dirty region
50699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
50709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void invalidate(Rect dirty) {
50719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (ViewDebug.TRACE_HIERARCHY) {
50729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ViewDebug.trace(this, ViewDebug.HierarchyTraceType.INVALIDATE);
50739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
50749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
50759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((mPrivateFlags & (DRAWN | HAS_BOUNDS)) == (DRAWN | HAS_BOUNDS)) {
50769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPrivateFlags &= ~DRAWING_CACHE_VALID;
50779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final ViewParent p = mParent;
50789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final AttachInfo ai = mAttachInfo;
50799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (p != null && ai != null) {
50809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int scrollX = mScrollX;
50819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int scrollY = mScrollY;
50829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final Rect r = ai.mTmpInvalRect;
50839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                r.set(dirty.left - scrollX, dirty.top - scrollY,
50849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        dirty.right - scrollX, dirty.bottom - scrollY);
50859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mParent.invalidateChild(this, r);
50869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
50879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
50889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
50899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
50909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
50919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Mark the the area defined by the rect (l,t,r,b) as needing to be drawn.
50929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The coordinates of the dirty rect are relative to the view.
50939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If the view is visible, {@link #onDraw} will be called at some point
50949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * in the future. This must be called from a UI thread. To call
50959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * from a non-UI thread, call {@link #postInvalidate()}.
50969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param l the left position of the dirty region
50979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param t the top position of the dirty region
50989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param r the right position of the dirty region
50999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param b the bottom position of the dirty region
51009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
51019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void invalidate(int l, int t, int r, int b) {
51029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (ViewDebug.TRACE_HIERARCHY) {
51039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ViewDebug.trace(this, ViewDebug.HierarchyTraceType.INVALIDATE);
51049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
51059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
51069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((mPrivateFlags & (DRAWN | HAS_BOUNDS)) == (DRAWN | HAS_BOUNDS)) {
51079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPrivateFlags &= ~DRAWING_CACHE_VALID;
51089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final ViewParent p = mParent;
51099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final AttachInfo ai = mAttachInfo;
51109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (p != null && ai != null && l < r && t < b) {
51119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int scrollX = mScrollX;
51129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int scrollY = mScrollY;
51139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final Rect tmpr = ai.mTmpInvalRect;
51149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                tmpr.set(l - scrollX, t - scrollY, r - scrollX, b - scrollY);
51159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                p.invalidateChild(this, tmpr);
51169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
51179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
51189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
51199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
51209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
51219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Invalidate the whole view. If the view is visible, {@link #onDraw} will
51229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * be called at some point in the future. This must be called from a
51239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * UI thread. To call from a non-UI thread, call {@link #postInvalidate()}.
51249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
51259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void invalidate() {
51269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (ViewDebug.TRACE_HIERARCHY) {
51279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ViewDebug.trace(this, ViewDebug.HierarchyTraceType.INVALIDATE);
51289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
51299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
51309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((mPrivateFlags & (DRAWN | HAS_BOUNDS)) == (DRAWN | HAS_BOUNDS)) {
51319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPrivateFlags &= ~DRAWN & ~DRAWING_CACHE_VALID;
51329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final ViewParent p = mParent;
51339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final AttachInfo ai = mAttachInfo;
51349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (p != null && ai != null) {
51359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final Rect r = ai.mTmpInvalRect;
51369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                r.set(0, 0, mRight - mLeft, mBottom - mTop);
51379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Don't call invalidate -- we don't want to internally scroll
51389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // our own bounds
51399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                p.invalidateChild(this, r);
51409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
51419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
51429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
51439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
51449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
514524443ea3992e372e47daa50266b0f2ec38cac388Romain Guy     * Indicates whether this View is opaque. An opaque View guarantees that it will
514624443ea3992e372e47daa50266b0f2ec38cac388Romain Guy     * draw all the pixels overlapping its bounds using a fully opaque color.
514724443ea3992e372e47daa50266b0f2ec38cac388Romain Guy     *
514824443ea3992e372e47daa50266b0f2ec38cac388Romain Guy     * Subclasses of View should override this method whenever possible to indicate
514924443ea3992e372e47daa50266b0f2ec38cac388Romain Guy     * whether an instance is opaque. Opaque Views are treated in a special way by
515024443ea3992e372e47daa50266b0f2ec38cac388Romain Guy     * the View hierarchy, possibly allowing it to perform optimizations during
515124443ea3992e372e47daa50266b0f2ec38cac388Romain Guy     * invalidate/draw passes.
51528506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy     *
515324443ea3992e372e47daa50266b0f2ec38cac388Romain Guy     * @return True if this View is guaranteed to be fully opaque, false otherwise.
515424443ea3992e372e47daa50266b0f2ec38cac388Romain Guy     */
515583b2107c4d2f07f46b6ae663115421749486f8b1Romain Guy    @ViewDebug.ExportedProperty
515624443ea3992e372e47daa50266b0f2ec38cac388Romain Guy    public boolean isOpaque() {
51578f1344f5e7c92f2fd532f65e5584afe0e4cc6b11Romain Guy        return (mPrivateFlags & OPAQUE_MASK) == OPAQUE_MASK;
51588f1344f5e7c92f2fd532f65e5584afe0e4cc6b11Romain Guy    }
51598f1344f5e7c92f2fd532f65e5584afe0e4cc6b11Romain Guy
51608f1344f5e7c92f2fd532f65e5584afe0e4cc6b11Romain Guy    private void computeOpaqueFlags() {
51618f1344f5e7c92f2fd532f65e5584afe0e4cc6b11Romain Guy        // Opaque if:
51628f1344f5e7c92f2fd532f65e5584afe0e4cc6b11Romain Guy        //   - Has a background
51638f1344f5e7c92f2fd532f65e5584afe0e4cc6b11Romain Guy        //   - Background is opaque
51648f1344f5e7c92f2fd532f65e5584afe0e4cc6b11Romain Guy        //   - Doesn't have scrollbars or scrollbars are inside overlay
51658f1344f5e7c92f2fd532f65e5584afe0e4cc6b11Romain Guy
51668f1344f5e7c92f2fd532f65e5584afe0e4cc6b11Romain Guy        if (mBGDrawable != null && mBGDrawable.getOpacity() == PixelFormat.OPAQUE) {
51678f1344f5e7c92f2fd532f65e5584afe0e4cc6b11Romain Guy            mPrivateFlags |= OPAQUE_BACKGROUND;
51688f1344f5e7c92f2fd532f65e5584afe0e4cc6b11Romain Guy        } else {
51698f1344f5e7c92f2fd532f65e5584afe0e4cc6b11Romain Guy            mPrivateFlags &= ~OPAQUE_BACKGROUND;
51708f1344f5e7c92f2fd532f65e5584afe0e4cc6b11Romain Guy        }
51718f1344f5e7c92f2fd532f65e5584afe0e4cc6b11Romain Guy
51728f1344f5e7c92f2fd532f65e5584afe0e4cc6b11Romain Guy        final int flags = mViewFlags;
51738f1344f5e7c92f2fd532f65e5584afe0e4cc6b11Romain Guy        if (((flags & SCROLLBARS_VERTICAL) == 0 && (flags & SCROLLBARS_HORIZONTAL) == 0) ||
51748f1344f5e7c92f2fd532f65e5584afe0e4cc6b11Romain Guy                (flags & SCROLLBARS_STYLE_MASK) == SCROLLBARS_INSIDE_OVERLAY) {
51758f1344f5e7c92f2fd532f65e5584afe0e4cc6b11Romain Guy            mPrivateFlags |= OPAQUE_SCROLLBARS;
51768f1344f5e7c92f2fd532f65e5584afe0e4cc6b11Romain Guy        } else {
51778f1344f5e7c92f2fd532f65e5584afe0e4cc6b11Romain Guy            mPrivateFlags &= ~OPAQUE_SCROLLBARS;
51788f1344f5e7c92f2fd532f65e5584afe0e4cc6b11Romain Guy        }
51798f1344f5e7c92f2fd532f65e5584afe0e4cc6b11Romain Guy    }
51808f1344f5e7c92f2fd532f65e5584afe0e4cc6b11Romain Guy
51818f1344f5e7c92f2fd532f65e5584afe0e4cc6b11Romain Guy    /**
51828f1344f5e7c92f2fd532f65e5584afe0e4cc6b11Romain Guy     * @hide
51838f1344f5e7c92f2fd532f65e5584afe0e4cc6b11Romain Guy     */
51848f1344f5e7c92f2fd532f65e5584afe0e4cc6b11Romain Guy    protected boolean hasOpaqueScrollbars() {
51858f1344f5e7c92f2fd532f65e5584afe0e4cc6b11Romain Guy        return (mPrivateFlags & OPAQUE_SCROLLBARS) == OPAQUE_SCROLLBARS;
518624443ea3992e372e47daa50266b0f2ec38cac388Romain Guy    }
518724443ea3992e372e47daa50266b0f2ec38cac388Romain Guy
518824443ea3992e372e47daa50266b0f2ec38cac388Romain Guy    /**
51899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return A handler associated with the thread running the View. This
51909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * handler can be used to pump events in the UI events queue.
51919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
51929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Handler getHandler() {
51939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mAttachInfo != null) {
51949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mAttachInfo.mHandler;
51959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
51969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
51979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
51989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
51999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
52009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Causes the Runnable to be added to the message queue.
52019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The runnable will be run on the user interface thread.
52029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
52039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param action The Runnable that will be executed.
52049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
52059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns true if the Runnable was successfully placed in to the
52069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         message queue.  Returns false on failure, usually because the
52079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         looper processing the message queue is exiting.
52089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
52099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean post(Runnable action) {
52109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Handler handler;
52119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mAttachInfo != null) {
52129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            handler = mAttachInfo.mHandler;
52139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
52149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Assume that post will succeed later
52159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ViewRoot.getRunQueue().post(action);
52169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
52179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
52189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return handler.post(action);
52209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
52219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
52239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Causes the Runnable to be added to the message queue, to be run
52249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * after the specified amount of time elapses.
52259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The runnable will be run on the user interface thread.
52269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
52279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param action The Runnable that will be executed.
52289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param delayMillis The delay (in milliseconds) until the Runnable
52299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        will be executed.
52309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
52319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return true if the Runnable was successfully placed in to the
52329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         message queue.  Returns false on failure, usually because the
52339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         looper processing the message queue is exiting.  Note that a
52349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         result of true does not mean the Runnable will be processed --
52359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         if the looper is quit before the delivery time of the message
52369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         occurs then the message will be dropped.
52379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
52389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean postDelayed(Runnable action, long delayMillis) {
52399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Handler handler;
52409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mAttachInfo != null) {
52419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            handler = mAttachInfo.mHandler;
52429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
52439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Assume that post will succeed later
52449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ViewRoot.getRunQueue().postDelayed(action, delayMillis);
52459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
52469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
52479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return handler.postDelayed(action, delayMillis);
52499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
52509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
52529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Removes the specified Runnable from the message queue.
52539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
52549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param action The Runnable to remove from the message handling queue
52559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
52569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return true if this view could ask the Handler to remove the Runnable,
52579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         false otherwise. When the returned value is true, the Runnable
52589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         may or may not have been actually removed from the message queue
52599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         (for instance, if the Runnable was not in the queue already.)
52609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
52619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean removeCallbacks(Runnable action) {
52629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Handler handler;
52639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mAttachInfo != null) {
52649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            handler = mAttachInfo.mHandler;
52659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
52669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Assume that post will succeed later
52679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ViewRoot.getRunQueue().removeCallbacks(action);
52689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return true;
52699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
52709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        handler.removeCallbacks(action);
52729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
52739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
52749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
52769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Cause an invalidate to happen on a subsequent cycle through the event loop.
52779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Use this to invalidate the View from a non-UI thread.
52789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
52799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #invalidate()
52809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
52819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void postInvalidate() {
52829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        postInvalidateDelayed(0);
52839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
52849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
52859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
52869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Cause an invalidate of the specified area to happen on a subsequent cycle
52879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * through the event loop. Use this to invalidate the View from a non-UI thread.
52889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
52899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param left The left coordinate of the rectangle to invalidate.
52909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param top The top coordinate of the rectangle to invalidate.
52919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param right The right coordinate of the rectangle to invalidate.
52929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param bottom The bottom coordinate of the rectangle to invalidate.
52939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
52949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #invalidate(int, int, int, int)
52959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #invalidate(Rect)
52969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
52979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void postInvalidate(int left, int top, int right, int bottom) {
52989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        postInvalidateDelayed(0, left, top, right, bottom);
52999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
53009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
53019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
53029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Cause an invalidate to happen on a subsequent cycle through the event
53039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * loop. Waits for the specified amount of time.
53049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
53059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param delayMilliseconds the duration in milliseconds to delay the
53069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         invalidation by
53079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
53089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void postInvalidateDelayed(long delayMilliseconds) {
53099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // We try only with the AttachInfo because there's no point in invalidating
53109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // if we are not attached to our window
53119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mAttachInfo != null) {
53129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Message msg = Message.obtain();
53139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            msg.what = AttachInfo.INVALIDATE_MSG;
53149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            msg.obj = this;
53159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mAttachInfo.mHandler.sendMessageDelayed(msg, delayMilliseconds);
53169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
53179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
53189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
53199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
53209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Cause an invalidate of the specified area to happen on a subsequent cycle
53219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * through the event loop. Waits for the specified amount of time.
53229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
53239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param delayMilliseconds the duration in milliseconds to delay the
53249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         invalidation by
53259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param left The left coordinate of the rectangle to invalidate.
53269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param top The top coordinate of the rectangle to invalidate.
53279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param right The right coordinate of the rectangle to invalidate.
53289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param bottom The bottom coordinate of the rectangle to invalidate.
53299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
53309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void postInvalidateDelayed(long delayMilliseconds, int left, int top,
53319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int right, int bottom) {
53329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
53339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // We try only with the AttachInfo because there's no point in invalidating
53349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // if we are not attached to our window
53359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mAttachInfo != null) {
53369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final AttachInfo.InvalidateInfo info = AttachInfo.InvalidateInfo.acquire();
53379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            info.target = this;
53389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            info.left = left;
53399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            info.top = top;
53409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            info.right = right;
53419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            info.bottom = bottom;
53429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
53439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final Message msg = Message.obtain();
53449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            msg.what = AttachInfo.INVALIDATE_RECT_MSG;
53459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            msg.obj = info;
53469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mAttachInfo.mHandler.sendMessageDelayed(msg, delayMilliseconds);
53479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
53489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
53499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
53509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
53519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called by a parent to request that a child update its values for mScrollX
53529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and mScrollY if necessary. This will typically be done if the child is
53539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * animating a scroll using a {@link android.widget.Scroller Scroller}
53549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * object.
53559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
53569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void computeScroll() {
53579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
53589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
53599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
53609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Indicate whether the horizontal edges are faded when the view is
53619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * scrolled horizontally.</p>
53629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
53639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return true if the horizontal edges should are faded on scroll, false
53649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         otherwise
53659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
53669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setHorizontalFadingEdgeEnabled(boolean)
53679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @attr ref android.R.styleable#View_fadingEdge
53689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
53699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isHorizontalFadingEdgeEnabled() {
53709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (mViewFlags & FADING_EDGE_HORIZONTAL) == FADING_EDGE_HORIZONTAL;
53719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
53729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
53739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
53749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Define whether the horizontal edges should be faded when this view
53759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is scrolled horizontally.</p>
53769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
53779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param horizontalFadingEdgeEnabled true if the horizontal edges should
53789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                                    be faded when the view is scrolled
53799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                                    horizontally
53809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
53819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #isHorizontalFadingEdgeEnabled()
53829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @attr ref android.R.styleable#View_fadingEdge
53839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
53849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setHorizontalFadingEdgeEnabled(boolean horizontalFadingEdgeEnabled) {
53859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (isHorizontalFadingEdgeEnabled() != horizontalFadingEdgeEnabled) {
53869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (horizontalFadingEdgeEnabled) {
53879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                initScrollCache();
53889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
53899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
53909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mViewFlags ^= FADING_EDGE_HORIZONTAL;
53919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
53929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
53939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
53949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
53959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Indicate whether the vertical edges are faded when the view is
53969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * scrolled horizontally.</p>
53979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
53989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return true if the vertical edges should are faded on scroll, false
53999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         otherwise
54009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
54019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setVerticalFadingEdgeEnabled(boolean)
54029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @attr ref android.R.styleable#View_fadingEdge
54039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
54049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isVerticalFadingEdgeEnabled() {
54059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (mViewFlags & FADING_EDGE_VERTICAL) == FADING_EDGE_VERTICAL;
54069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
54079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
54089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
54099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Define whether the vertical edges should be faded when this view
54109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is scrolled vertically.</p>
54119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
54129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param verticalFadingEdgeEnabled true if the vertical edges should
54139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                                  be faded when the view is scrolled
54149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                                  vertically
54159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
54169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #isVerticalFadingEdgeEnabled()
54179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @attr ref android.R.styleable#View_fadingEdge
54189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
54199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setVerticalFadingEdgeEnabled(boolean verticalFadingEdgeEnabled) {
54209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (isVerticalFadingEdgeEnabled() != verticalFadingEdgeEnabled) {
54219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (verticalFadingEdgeEnabled) {
54229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                initScrollCache();
54239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
54249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
54259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mViewFlags ^= FADING_EDGE_VERTICAL;
54269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
54279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
54289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
54299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
54309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the strength, or intensity, of the top faded edge. The strength is
54319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * a value between 0.0 (no fade) and 1.0 (full fade). The default implementation
54329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * returns 0.0 or 1.0 but no value in between.
54339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
54349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Subclasses should override this method to provide a smoother fade transition
54359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * when scrolling occurs.
54369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
54379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the intensity of the top fade as a float between 0.0f and 1.0f
54389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
54399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected float getTopFadingEdgeStrength() {
54409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return computeVerticalScrollOffset() > 0 ? 1.0f : 0.0f;
54419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
54429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
54439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
54449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the strength, or intensity, of the bottom faded edge. The strength is
54459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * a value between 0.0 (no fade) and 1.0 (full fade). The default implementation
54469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * returns 0.0 or 1.0 but no value in between.
54479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
54489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Subclasses should override this method to provide a smoother fade transition
54499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * when scrolling occurs.
54509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
54519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the intensity of the bottom fade as a float between 0.0f and 1.0f
54529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
54539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected float getBottomFadingEdgeStrength() {
54549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return computeVerticalScrollOffset() + computeVerticalScrollExtent() <
54559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                computeVerticalScrollRange() ? 1.0f : 0.0f;
54569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
54579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
54589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
54599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the strength, or intensity, of the left faded edge. The strength is
54609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * a value between 0.0 (no fade) and 1.0 (full fade). The default implementation
54619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * returns 0.0 or 1.0 but no value in between.
54629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
54639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Subclasses should override this method to provide a smoother fade transition
54649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * when scrolling occurs.
54659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
54669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the intensity of the left fade as a float between 0.0f and 1.0f
54679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
54689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected float getLeftFadingEdgeStrength() {
54699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return computeHorizontalScrollOffset() > 0 ? 1.0f : 0.0f;
54709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
54719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
54729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
54739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the strength, or intensity, of the right faded edge. The strength is
54749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * a value between 0.0 (no fade) and 1.0 (full fade). The default implementation
54759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * returns 0.0 or 1.0 but no value in between.
54769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
54779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Subclasses should override this method to provide a smoother fade transition
54789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * when scrolling occurs.
54799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
54809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the intensity of the right fade as a float between 0.0f and 1.0f
54819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
54829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected float getRightFadingEdgeStrength() {
54839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return computeHorizontalScrollOffset() + computeHorizontalScrollExtent() <
54849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                computeHorizontalScrollRange() ? 1.0f : 0.0f;
54859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
54869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
54879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
54889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Indicate whether the horizontal scrollbar should be drawn or not. The
54899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * scrollbar is not drawn by default.</p>
54909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
54919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return true if the horizontal scrollbar should be painted, false
54929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         otherwise
54939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
54949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setHorizontalScrollBarEnabled(boolean)
54959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
54969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isHorizontalScrollBarEnabled() {
54979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (mViewFlags & SCROLLBARS_HORIZONTAL) == SCROLLBARS_HORIZONTAL;
54989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
54999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
55009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
55019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Define whether the horizontal scrollbar should be drawn or not. The
55029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * scrollbar is not drawn by default.</p>
55039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
55049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param horizontalScrollBarEnabled true if the horizontal scrollbar should
55059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                                   be painted
55069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
55079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #isHorizontalScrollBarEnabled()
55089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
55099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setHorizontalScrollBarEnabled(boolean horizontalScrollBarEnabled) {
55109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (isHorizontalScrollBarEnabled() != horizontalScrollBarEnabled) {
55119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mViewFlags ^= SCROLLBARS_HORIZONTAL;
55128f1344f5e7c92f2fd532f65e5584afe0e4cc6b11Romain Guy            computeOpaqueFlags();
55139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            recomputePadding();
55149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
55159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
55169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
55179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
55189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Indicate whether the vertical scrollbar should be drawn or not. The
55199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * scrollbar is not drawn by default.</p>
55209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
55219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return true if the vertical scrollbar should be painted, false
55229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         otherwise
55239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
55249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setVerticalScrollBarEnabled(boolean)
55259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
55269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isVerticalScrollBarEnabled() {
55279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (mViewFlags & SCROLLBARS_VERTICAL) == SCROLLBARS_VERTICAL;
55289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
55299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
55309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
55319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Define whether the vertical scrollbar should be drawn or not. The
55329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * scrollbar is not drawn by default.</p>
55339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
55349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param verticalScrollBarEnabled true if the vertical scrollbar should
55359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                                 be painted
55369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
55379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #isVerticalScrollBarEnabled()
55389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
55399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setVerticalScrollBarEnabled(boolean verticalScrollBarEnabled) {
55409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (isVerticalScrollBarEnabled() != verticalScrollBarEnabled) {
55419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mViewFlags ^= SCROLLBARS_VERTICAL;
55428f1344f5e7c92f2fd532f65e5584afe0e4cc6b11Romain Guy            computeOpaqueFlags();
55439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            recomputePadding();
55449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
55459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
55469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
55479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void recomputePadding() {
55489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setPadding(mPaddingLeft, mPaddingTop, mUserPaddingRight, mUserPaddingBottom);
55499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5550fe81d386a818b386ffc0d5a789236531ab4e264fMike Cleron
5551fe81d386a818b386ffc0d5a789236531ab4e264fMike Cleron    /**
5552fe81d386a818b386ffc0d5a789236531ab4e264fMike Cleron     * Define whether scrollbars will fade when the view is not scrolling.
5553fe81d386a818b386ffc0d5a789236531ab4e264fMike Cleron     *
5554fe81d386a818b386ffc0d5a789236531ab4e264fMike Cleron     * @param fadeScrollbars wheter to enable fading
5555fe81d386a818b386ffc0d5a789236531ab4e264fMike Cleron     *
5556fe81d386a818b386ffc0d5a789236531ab4e264fMike Cleron     */
5557fe81d386a818b386ffc0d5a789236531ab4e264fMike Cleron    public void setScrollbarFadingEnabled(boolean fadeScrollbars) {
5558fe81d386a818b386ffc0d5a789236531ab4e264fMike Cleron        initScrollCache();
5559fe81d386a818b386ffc0d5a789236531ab4e264fMike Cleron        final ScrollabilityCache scrollabilityCache = mScrollCache;
5560fe81d386a818b386ffc0d5a789236531ab4e264fMike Cleron        scrollabilityCache.fadeScrollBars = fadeScrollbars;
556152f0a6495277469bd7ede29ef89bc34cb2aa8a85Mike Cleron        if (fadeScrollbars) {
556252f0a6495277469bd7ede29ef89bc34cb2aa8a85Mike Cleron            scrollabilityCache.state = ScrollabilityCache.OFF;
556352f0a6495277469bd7ede29ef89bc34cb2aa8a85Mike Cleron        } else {
5564fe81d386a818b386ffc0d5a789236531ab4e264fMike Cleron            scrollabilityCache.state = ScrollabilityCache.ON;
5565fe81d386a818b386ffc0d5a789236531ab4e264fMike Cleron        }
5566fe81d386a818b386ffc0d5a789236531ab4e264fMike Cleron    }
5567fe81d386a818b386ffc0d5a789236531ab4e264fMike Cleron
55689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
556952f0a6495277469bd7ede29ef89bc34cb2aa8a85Mike Cleron     *
557052f0a6495277469bd7ede29ef89bc34cb2aa8a85Mike Cleron     * Returns true if scrollbars will fade when this view is not scrolling
557152f0a6495277469bd7ede29ef89bc34cb2aa8a85Mike Cleron     *
557252f0a6495277469bd7ede29ef89bc34cb2aa8a85Mike Cleron     * @return true if scrollbar fading is enabled
557352f0a6495277469bd7ede29ef89bc34cb2aa8a85Mike Cleron     */
557452f0a6495277469bd7ede29ef89bc34cb2aa8a85Mike Cleron    public boolean isScrollbarFadingEnabled() {
557552f0a6495277469bd7ede29ef89bc34cb2aa8a85Mike Cleron        return mScrollCache != null && mScrollCache.fadeScrollBars;
557652f0a6495277469bd7ede29ef89bc34cb2aa8a85Mike Cleron    }
557752f0a6495277469bd7ede29ef89bc34cb2aa8a85Mike Cleron
557852f0a6495277469bd7ede29ef89bc34cb2aa8a85Mike Cleron    /**
55799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Specify the style of the scrollbars. The scrollbars can be overlaid or
55809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * inset. When inset, they add to the padding of the view. And the scrollbars
55819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * can be drawn inside the padding area or on the edge of the view. For example,
55829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * if a view has a background drawable and you want to draw the scrollbars
55839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * inside the padding specified by the drawable, you can use
55849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * SCROLLBARS_INSIDE_OVERLAY or SCROLLBARS_INSIDE_INSET. If you want them to
55859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * appear at the edge of the view, ignoring the padding, then you can use
55869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * SCROLLBARS_OUTSIDE_OVERLAY or SCROLLBARS_OUTSIDE_INSET.</p>
55879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param style the style of the scrollbars. Should be one of
55889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * SCROLLBARS_INSIDE_OVERLAY, SCROLLBARS_INSIDE_INSET,
55899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * SCROLLBARS_OUTSIDE_OVERLAY or SCROLLBARS_OUTSIDE_INSET.
55909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #SCROLLBARS_INSIDE_OVERLAY
55919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #SCROLLBARS_INSIDE_INSET
55929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #SCROLLBARS_OUTSIDE_OVERLAY
55939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #SCROLLBARS_OUTSIDE_INSET
55949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
55959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setScrollBarStyle(int style) {
55969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (style != (mViewFlags & SCROLLBARS_STYLE_MASK)) {
55979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mViewFlags = (mViewFlags & ~SCROLLBARS_STYLE_MASK) | (style & SCROLLBARS_STYLE_MASK);
55988f1344f5e7c92f2fd532f65e5584afe0e4cc6b11Romain Guy            computeOpaqueFlags();
55999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            recomputePadding();
56009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
56019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
56029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
56039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
56049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Returns the current scrollbar style.</p>
56059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the current scrollbar style
56069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #SCROLLBARS_INSIDE_OVERLAY
56079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #SCROLLBARS_INSIDE_INSET
56089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #SCROLLBARS_OUTSIDE_OVERLAY
56099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #SCROLLBARS_OUTSIDE_INSET
56109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
56119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getScrollBarStyle() {
56129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mViewFlags & SCROLLBARS_STYLE_MASK;
56139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
56149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
56159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
56169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Compute the horizontal range that the horizontal scrollbar
56179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * represents.</p>
56189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
56199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>The range is expressed in arbitrary units that must be the same as the
56209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * units used by {@link #computeHorizontalScrollExtent()} and
56219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #computeHorizontalScrollOffset()}.</p>
56229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
56239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>The default range is the drawing width of this view.</p>
56249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
56259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the total horizontal range represented by the horizontal
56269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         scrollbar
56279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
56289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #computeHorizontalScrollExtent()
56299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #computeHorizontalScrollOffset()
56309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.widget.ScrollBarDrawable
56319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
56329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected int computeHorizontalScrollRange() {
56339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getWidth();
56349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
56359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
56369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
56379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Compute the horizontal offset of the horizontal scrollbar's thumb
56389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * within the horizontal range. This value is used to compute the position
56399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * of the thumb within the scrollbar's track.</p>
56409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
56419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>The range is expressed in arbitrary units that must be the same as the
56429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * units used by {@link #computeHorizontalScrollRange()} and
56439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #computeHorizontalScrollExtent()}.</p>
56449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
56459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>The default offset is the scroll offset of this view.</p>
56469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
56479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the horizontal offset of the scrollbar's thumb
56489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
56499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #computeHorizontalScrollRange()
56509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #computeHorizontalScrollExtent()
56519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.widget.ScrollBarDrawable
56529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
56539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected int computeHorizontalScrollOffset() {
56549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mScrollX;
56559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
56569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
56579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
56589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Compute the horizontal extent of the horizontal scrollbar's thumb
56599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * within the horizontal range. This value is used to compute the length
56609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * of the thumb within the scrollbar's track.</p>
56619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
56629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>The range is expressed in arbitrary units that must be the same as the
56639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * units used by {@link #computeHorizontalScrollRange()} and
56649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #computeHorizontalScrollOffset()}.</p>
56659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
56669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>The default extent is the drawing width of this view.</p>
56679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
56689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the horizontal extent of the scrollbar's thumb
56699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
56709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #computeHorizontalScrollRange()
56719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #computeHorizontalScrollOffset()
56729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.widget.ScrollBarDrawable
56739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
56749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected int computeHorizontalScrollExtent() {
56759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getWidth();
56769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
56779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
56789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
56799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Compute the vertical range that the vertical scrollbar represents.</p>
56809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
56819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>The range is expressed in arbitrary units that must be the same as the
56829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * units used by {@link #computeVerticalScrollExtent()} and
56839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #computeVerticalScrollOffset()}.</p>
56849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
56859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the total vertical range represented by the vertical scrollbar
56869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
56879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>The default range is the drawing height of this view.</p>
56889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
56899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #computeVerticalScrollExtent()
56909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #computeVerticalScrollOffset()
56919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.widget.ScrollBarDrawable
56929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
56939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected int computeVerticalScrollRange() {
56949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getHeight();
56959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
56969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
56979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
56989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Compute the vertical offset of the vertical scrollbar's thumb
56999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * within the horizontal range. This value is used to compute the position
57009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * of the thumb within the scrollbar's track.</p>
57019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
57029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>The range is expressed in arbitrary units that must be the same as the
57039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * units used by {@link #computeVerticalScrollRange()} and
57049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #computeVerticalScrollExtent()}.</p>
57059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
57069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>The default offset is the scroll offset of this view.</p>
57079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
57089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the vertical offset of the scrollbar's thumb
57099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
57109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #computeVerticalScrollRange()
57119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #computeVerticalScrollExtent()
57129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.widget.ScrollBarDrawable
57139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
57149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected int computeVerticalScrollOffset() {
57159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mScrollY;
57169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
57179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
57189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
57199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Compute the vertical extent of the horizontal scrollbar's thumb
57209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * within the vertical range. This value is used to compute the length
57219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * of the thumb within the scrollbar's track.</p>
57229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
57239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>The range is expressed in arbitrary units that must be the same as the
572452964243dc95f74ac2ab9a96d031a36931a11931Gilles Debunne     * units used by {@link #computeVerticalScrollRange()} and
57259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #computeVerticalScrollOffset()}.</p>
57269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
57279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>The default extent is the drawing height of this view.</p>
57289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
57299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the vertical extent of the scrollbar's thumb
57309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
57319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #computeVerticalScrollRange()
57329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #computeVerticalScrollOffset()
57339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.widget.ScrollBarDrawable
57349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
57359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected int computeVerticalScrollExtent() {
57369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getHeight();
57379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
57389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
57399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
57409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Request the drawing of the horizontal and the vertical scrollbar. The
57419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * scrollbars are painted only if they have been awakened first.</p>
57429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
57439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param canvas the canvas on which to draw the scrollbars
5744f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron     *
5745f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron     * @see #awakenScrollBars(int)
57469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
57471d5b3a631cfcbfd2ea264f29a11a1366a16593b0Romain Guy    protected final void onDrawScrollBars(Canvas canvas) {
57489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // scrollbars are drawn only when the animation is running
57499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final ScrollabilityCache cache = mScrollCache;
57509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (cache != null) {
5751f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron
5752f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron            int state = cache.state;
5753f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron
5754f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron            if (state == ScrollabilityCache.OFF) {
5755f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron                return;
5756f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron            }
5757f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron
5758f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron            boolean invalidate = false;
5759f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron
5760f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron            if (state == ScrollabilityCache.FADING) {
5761f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron                // We're fading -- get our fade interpolation
5762f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron                if (cache.interpolatorValues == null) {
5763f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron                    cache.interpolatorValues = new float[1];
5764f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron                }
5765f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron
5766f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron                float[] values = cache.interpolatorValues;
5767f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron
5768f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron                // Stops the animation if we're done
5769f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron                if (cache.scrollBarInterpolator.timeToValues(values) ==
5770f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron                        Interpolator.Result.FREEZE_END) {
5771f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron                    cache.state = ScrollabilityCache.OFF;
5772f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron                } else {
5773f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron                    cache.scrollBar.setAlpha(Math.round(values[0]));
5774f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron                }
5775f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron
5776f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron                // This will make the scroll bars inval themselves after
5777f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron                // drawing. We only want this when we're fading so that
5778f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron                // we prevent excessive redraws
5779f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron                invalidate = true;
5780f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron            } else {
5781f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron                // We're just on -- but we may have been fading before so
5782f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron                // reset alpha
5783f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron                cache.scrollBar.setAlpha(255);
5784f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron            }
5785f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron
5786f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron
57879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int viewFlags = mViewFlags;
57889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
57899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final boolean drawHorizontalScrollBar =
57909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                (viewFlags & SCROLLBARS_HORIZONTAL) == SCROLLBARS_HORIZONTAL;
57919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final boolean drawVerticalScrollBar =
57929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                (viewFlags & SCROLLBARS_VERTICAL) == SCROLLBARS_VERTICAL
57939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                && !isVerticalScrollBarHidden();
57949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
57959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (drawVerticalScrollBar || drawHorizontalScrollBar) {
57969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int width = mRight - mLeft;
57979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int height = mBottom - mTop;
57989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
57999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final ScrollBarDrawable scrollBar = cache.scrollBar;
58009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int size = scrollBar.getSize(false);
58019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (size <= 0) {
58029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    size = cache.scrollBarSize;
58039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
58049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5805e8853fc57093e781fa7c659c6eb4da3be9f8695aMike Reed                final int scrollX = mScrollX;
5806e8853fc57093e781fa7c659c6eb4da3be9f8695aMike Reed                final int scrollY = mScrollY;
5807e8853fc57093e781fa7c659c6eb4da3be9f8695aMike Reed                final int inside = (viewFlags & SCROLLBARS_OUTSIDE_MASK) == 0 ? ~0 : 0;
5808e8853fc57093e781fa7c659c6eb4da3be9f8695aMike Reed
5809f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron                int left, top, right, bottom;
5810f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron
58119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (drawHorizontalScrollBar) {
5812f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron                    scrollBar.setParameters(computeHorizontalScrollRange(),
5813e8853fc57093e781fa7c659c6eb4da3be9f8695aMike Reed                                            computeHorizontalScrollOffset(),
5814e8853fc57093e781fa7c659c6eb4da3be9f8695aMike Reed                                            computeHorizontalScrollExtent(), false);
5815e8853fc57093e781fa7c659c6eb4da3be9f8695aMike Reed                    final int verticalScrollBarGap = drawVerticalScrollBar ?
5816f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron                            getVerticalScrollbarWidth() : 0;
5817f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron                    top = scrollY + height - size - (mUserPaddingBottom & inside);
5818f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron                    left = scrollX + (mPaddingLeft & inside);
5819f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron                    right = scrollX + width - (mUserPaddingRight & inside) - verticalScrollBarGap;
5820f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron                    bottom = top + size;
5821f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron                    onDrawHorizontalScrollBar(canvas, scrollBar, left, top, right, bottom);
5822f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron                    if (invalidate) {
5823f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron                        invalidate(left, top, right, bottom);
5824f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron                    }
58259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
58269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
58279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (drawVerticalScrollBar) {
5828e8853fc57093e781fa7c659c6eb4da3be9f8695aMike Reed                    scrollBar.setParameters(computeVerticalScrollRange(),
5829e8853fc57093e781fa7c659c6eb4da3be9f8695aMike Reed                                            computeVerticalScrollOffset(),
5830e8853fc57093e781fa7c659c6eb4da3be9f8695aMike Reed                                            computeVerticalScrollExtent(), true);
5831e8853fc57093e781fa7c659c6eb4da3be9f8695aMike Reed                    // TODO: Deal with RTL languages to position scrollbar on left
5832f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron                    left = scrollX + width - size - (mUserPaddingRight & inside);
5833f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron                    top = scrollY + (mPaddingTop & inside);
5834f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron                    right = left + size;
5835f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron                    bottom = scrollY + height - (mUserPaddingBottom & inside);
5836f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron                    onDrawVerticalScrollBar(canvas, scrollBar, left, top, right, bottom);
5837f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron                    if (invalidate) {
5838f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron                        invalidate(left, top, right, bottom);
5839f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron                    }
58409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
58419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
58429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
58439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
58448506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
58459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
58468506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy     * Override this if the vertical scrollbar needs to be hidden in a subclass, like when
58479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * FastScroller is visible.
58489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return whether to temporarily hide the vertical scrollbar
58499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
58509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
58519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected boolean isVerticalScrollBarHidden() {
58529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
58539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
58549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
58559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
58569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Draw the horizontal scrollbar if
58579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #isHorizontalScrollBarEnabled()} returns true.</p>
58589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
58599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param canvas the canvas on which to draw the scrollbar
58609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param scrollBar the scrollbar's drawable
58619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
58629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #isHorizontalScrollBarEnabled()
58639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #computeHorizontalScrollRange()
58649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #computeHorizontalScrollExtent()
58659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #computeHorizontalScrollOffset()
58669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.widget.ScrollBarDrawable
5867f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron     * @hide
58684d6fe5ffdc62625726e5785edb0e01586d6072bfMike Reed     */
5869e8853fc57093e781fa7c659c6eb4da3be9f8695aMike Reed    protected void onDrawHorizontalScrollBar(Canvas canvas,
5870e8853fc57093e781fa7c659c6eb4da3be9f8695aMike Reed                                             Drawable scrollBar,
5871e8853fc57093e781fa7c659c6eb4da3be9f8695aMike Reed                                             int l, int t, int r, int b) {
58724d6fe5ffdc62625726e5785edb0e01586d6072bfMike Reed        scrollBar.setBounds(l, t, r, b);
58734d6fe5ffdc62625726e5785edb0e01586d6072bfMike Reed        scrollBar.draw(canvas);
58744d6fe5ffdc62625726e5785edb0e01586d6072bfMike Reed    }
5875e8853fc57093e781fa7c659c6eb4da3be9f8695aMike Reed
58764d6fe5ffdc62625726e5785edb0e01586d6072bfMike Reed    /**
58779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Draw the vertical scrollbar if {@link #isVerticalScrollBarEnabled()}
58789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * returns true.</p>
58799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
58809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param canvas the canvas on which to draw the scrollbar
58819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param scrollBar the scrollbar's drawable
58829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
58839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #isVerticalScrollBarEnabled()
58849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #computeVerticalScrollRange()
58859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #computeVerticalScrollExtent()
58869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #computeVerticalScrollOffset()
58879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.widget.ScrollBarDrawable
5888e8853fc57093e781fa7c659c6eb4da3be9f8695aMike Reed     * @hide
58899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5890e8853fc57093e781fa7c659c6eb4da3be9f8695aMike Reed    protected void onDrawVerticalScrollBar(Canvas canvas,
5891e8853fc57093e781fa7c659c6eb4da3be9f8695aMike Reed                                           Drawable scrollBar,
5892e8853fc57093e781fa7c659c6eb4da3be9f8695aMike Reed                                           int l, int t, int r, int b) {
5893e8853fc57093e781fa7c659c6eb4da3be9f8695aMike Reed        scrollBar.setBounds(l, t, r, b);
5894e8853fc57093e781fa7c659c6eb4da3be9f8695aMike Reed        scrollBar.draw(canvas);
58959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
58969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
58979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
58989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Implement this to do your drawing.
58999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
59009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param canvas the canvas on which the background will be drawn
59019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
59029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onDraw(Canvas canvas) {
59039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
59049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
59059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*
59069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Caller is responsible for calling requestLayout if necessary.
59079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * (This allows addViewInLayout to not request a new layout.)
59089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
59099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void assignParent(ViewParent parent) {
59109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent == null) {
59119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParent = parent;
59129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (parent == null) {
59139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParent = null;
59149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
59159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new RuntimeException("view " + this + " being added, but"
59169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " it already has a parent");
59179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
59189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
59199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
59209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
59219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This is called when the view is attached to a window.  At this point it
59229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * has a Surface and will start drawing.  Note that this function is
59239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * guaranteed to be called before {@link #onDraw}, however it may be called
59249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * any time before the first onDraw -- including before or after
59259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onMeasure}.
59269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
59279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onDetachedFromWindow()
59289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
59299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onAttachedToWindow() {
59309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((mPrivateFlags & REQUEST_TRANSPARENT_REGIONS) != 0) {
59319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParent.requestTransparentRegion(this);
59329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
59338568c3a09bff9bd2f7c9462b116bed0537d19342Adam Powell        if ((mPrivateFlags & AWAKEN_SCROLL_BARS_ON_ATTACH) != 0) {
59348568c3a09bff9bd2f7c9462b116bed0537d19342Adam Powell            initialAwakenScrollBars();
59358568c3a09bff9bd2f7c9462b116bed0537d19342Adam Powell            mPrivateFlags &= ~AWAKEN_SCROLL_BARS_ON_ATTACH;
59368568c3a09bff9bd2f7c9462b116bed0537d19342Adam Powell        }
59379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
59389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
59399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
59409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This is called when the view is detached from a window.  At this point it
59419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * no longer has a surface for drawing.
59429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
59439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onAttachedToWindow()
59449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
59459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onDetachedFromWindow() {
59468afa515936e78ccfc5563ca9164dc9a50ca73db4Romain Guy        mPrivateFlags &= ~CANCEL_NEXT_UP_EVENT;
5947a440b002aa59e1455bdfa2c5a1ca51c74bbc19acRomain Guy        removeUnsetPressCallback();
59481549dd1e6801a0240a2e2769c91181698910f98dMaryam Garrett        removeLongPressCallback();
59499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        destroyDrawingCache();
59509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
59519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
59529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
59539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The number of times this view has been attached to a window
59549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
59559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected int getWindowAttachCount() {
59569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mWindowAttachCount;
59579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
59589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
59599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
59609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve a unique token identifying the window this view is attached to.
59619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Return the window's token for use in
59629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link WindowManager.LayoutParams#token WindowManager.LayoutParams.token}.
59639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
59649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public IBinder getWindowToken() {
59659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mAttachInfo != null ? mAttachInfo.mWindowToken : null;
59669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
59679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
59689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
59699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve a unique token identifying the top-level "real" window of
59709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the window that this view is attached to.  That is, this is like
59719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #getWindowToken}, except if the window this view in is a panel
59729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * window (attached to another containing window), then the token of
59739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the containing window is returned instead.
59749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
59759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns the associated window token, either
59769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #getWindowToken()} or the containing window's token.
59779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
59789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public IBinder getApplicationWindowToken() {
59799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AttachInfo ai = mAttachInfo;
59809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (ai != null) {
59819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IBinder appWindowToken = ai.mPanelParentWindowToken;
59829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (appWindowToken == null) {
59839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                appWindowToken = ai.mWindowToken;
59849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
59859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return appWindowToken;
59869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
59879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
59889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
59899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
59909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
59919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve private session object this view hierarchy is using to
59929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * communicate with the window manager.
59939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the session object to communicate with the window manager
59949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
59959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /*package*/ IWindowSession getWindowSession() {
59969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mAttachInfo != null ? mAttachInfo.mSession : null;
59979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
59989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
59999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
60009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param info the {@link android.view.View.AttachInfo} to associated with
60019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        this view
60029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
60039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void dispatchAttachedToWindow(AttachInfo info, int visibility) {
60049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //System.out.println("Attached! " + this);
60059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAttachInfo = info;
60069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWindowAttachCount++;
60079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mFloatingTreeObserver != null) {
60089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            info.mTreeObserver.merge(mFloatingTreeObserver);
60099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mFloatingTreeObserver = null;
60109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
60119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((mPrivateFlags&SCROLL_CONTAINER) != 0) {
60129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mAttachInfo.mScrollContainers.add(this);
60139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPrivateFlags |= SCROLL_CONTAINER_ADDED;
60149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
60159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        performCollectViewAttributes(visibility);
60169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        onAttachedToWindow();
60179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int vis = info.mWindowVisibility;
60189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (vis != GONE) {
60199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            onWindowVisibilityChanged(vis);
60209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
60219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
60229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
60239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void dispatchDetachedFromWindow() {
60249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //System.out.println("Detached! " + this);
60259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AttachInfo info = mAttachInfo;
60269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (info != null) {
60279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int vis = info.mWindowVisibility;
60289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (vis != GONE) {
60299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                onWindowVisibilityChanged(GONE);
60309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
60319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
60329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
60339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        onDetachedFromWindow();
60349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((mPrivateFlags&SCROLL_CONTAINER_ADDED) != 0) {
60359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mAttachInfo.mScrollContainers.remove(this);
60369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPrivateFlags &= ~SCROLL_CONTAINER_ADDED;
60379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
60389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAttachInfo = null;
60399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
60409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
60419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
60429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Store this view hierarchy's frozen state into the given container.
60439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
60449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param container The SparseArray in which to save the view's state.
60459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
60469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #restoreHierarchyState
60479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #dispatchSaveInstanceState
60489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onSaveInstanceState
60499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
60509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void saveHierarchyState(SparseArray<Parcelable> container) {
60519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dispatchSaveInstanceState(container);
60529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
60539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
60549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
60559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called by {@link #saveHierarchyState} to store the state for this view and its children.
60569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * May be overridden to modify how freezing happens to a view's children; for example, some
60579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * views may want to not store state for their children.
60589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
60599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param container The SparseArray in which to save the view's state.
60609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
60619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #dispatchRestoreInstanceState
60629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #saveHierarchyState
60639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onSaveInstanceState
60649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
60659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void dispatchSaveInstanceState(SparseArray<Parcelable> container) {
60669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mID != NO_ID && (mViewFlags & SAVE_DISABLED_MASK) == 0) {
60679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPrivateFlags &= ~SAVE_STATE_CALLED;
60689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Parcelable state = onSaveInstanceState();
60699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((mPrivateFlags & SAVE_STATE_CALLED) == 0) {
60709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new IllegalStateException(
60719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        "Derived class did not call super.onSaveInstanceState()");
60729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
60739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (state != null) {
60749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Log.i("View", "Freezing #" + Integer.toHexString(mID)
60759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // + ": " + state);
60769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                container.put(mID, state);
60779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
60789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
60799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
60809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
60819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
60829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Hook allowing a view to generate a representation of its internal state
60839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that can later be used to create a new instance with that same state.
60849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This state should only contain information that is not persistent or can
60859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * not be reconstructed later. For example, you will never store your
60869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * current position on screen because that will be computed again when a
60879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * new instance of the view is placed in its view hierarchy.
60889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
60899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Some examples of things you may store here: the current cursor position
60909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * in a text view (but usually not the text itself since that is stored in a
60919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * content provider or other persistent storage), the currently selected
60929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * item in a list view.
60939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
60949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns a Parcelable object containing the view's current dynamic
60959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         state, or null if there is nothing interesting to save. The
60969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         default implementation returns null.
60979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onRestoreInstanceState
60989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #saveHierarchyState
60999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #dispatchSaveInstanceState
61009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setSaveEnabled(boolean)
61019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
61029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected Parcelable onSaveInstanceState() {
61039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPrivateFlags |= SAVE_STATE_CALLED;
61049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return BaseSavedState.EMPTY_STATE;
61059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
61069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
61079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
61089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Restore this view hierarchy's frozen state from the given container.
61099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
61109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param container The SparseArray which holds previously frozen states.
61119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
61129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #saveHierarchyState
61139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #dispatchRestoreInstanceState
61149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onRestoreInstanceState
61159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
61169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void restoreHierarchyState(SparseArray<Parcelable> container) {
61179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dispatchRestoreInstanceState(container);
61189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
61199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
61209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
61219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called by {@link #restoreHierarchyState} to retrieve the state for this view and its
61229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * children. May be overridden to modify how restoreing happens to a view's children; for
61239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * example, some views may want to not store state for their children.
61249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
61259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param container The SparseArray which holds previously saved state.
61269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
61279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #dispatchSaveInstanceState
61289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #restoreHierarchyState
61299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onRestoreInstanceState
61309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
61319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void dispatchRestoreInstanceState(SparseArray<Parcelable> container) {
61329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mID != NO_ID) {
61339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Parcelable state = container.get(mID);
61349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (state != null) {
61359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Log.i("View", "Restoreing #" + Integer.toHexString(mID)
61369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // + ": " + state);
61379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPrivateFlags &= ~SAVE_STATE_CALLED;
61389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                onRestoreInstanceState(state);
61399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if ((mPrivateFlags & SAVE_STATE_CALLED) == 0) {
61409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    throw new IllegalStateException(
61419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            "Derived class did not call super.onRestoreInstanceState()");
61429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
61439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
61449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
61459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
61469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
61479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
61489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Hook allowing a view to re-apply a representation of its internal state that had previously
61499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * been generated by {@link #onSaveInstanceState}. This function will never be called with a
61509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * null state.
61519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
61529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param state The frozen state that had previously been returned by
61539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        {@link #onSaveInstanceState}.
61549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
61559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onSaveInstanceState
61569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #restoreHierarchyState
61579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #dispatchRestoreInstanceState
61589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
61599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onRestoreInstanceState(Parcelable state) {
61609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPrivateFlags |= SAVE_STATE_CALLED;
61619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (state != BaseSavedState.EMPTY_STATE && state != null) {
6162237c1ceea36024cf4194212e713806e3ce8a1c49Romain Guy            throw new IllegalArgumentException("Wrong state class, expecting View State but "
6163237c1ceea36024cf4194212e713806e3ce8a1c49Romain Guy                    + "received " + state.getClass().toString() + " instead. This usually happens "
6164237c1ceea36024cf4194212e713806e3ce8a1c49Romain Guy                    + "when two views of different type have the same id in the same hierarchy. "
6165237c1ceea36024cf4194212e713806e3ce8a1c49Romain Guy                    + "This view's id is " + ViewDebug.resolveId(mContext, getId()) + ". Make sure "
6166237c1ceea36024cf4194212e713806e3ce8a1c49Romain Guy                    + "other views do not use the same id.");
61679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
61689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
61699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
61709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
61719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Return the time at which the drawing of the view hierarchy started.</p>
61729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
61739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the drawing start time in milliseconds
61749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
61759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getDrawingTime() {
61769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mAttachInfo != null ? mAttachInfo.mDrawingTime : 0;
61779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
61789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
61799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
61809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Enables or disables the duplication of the parent's state into this view. When
61819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * duplication is enabled, this view gets its drawable state from its parent rather
61829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * than from its own internal properties.</p>
61839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
61849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Note: in the current implementation, setting this property to true after the
61859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * view was added to a ViewGroup might have no effect at all. This property should
61869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * always be used from XML or set to true before adding this view to a ViewGroup.</p>
61879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
61889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Note: if this view's parent addStateFromChildren property is enabled and this
61899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * property is enabled, an exception will be thrown.</p>
61909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
61919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param enabled True to enable duplication of the parent's drawable state, false
61929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                to disable it.
61939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
61949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getDrawableState()
61959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #isDuplicateParentStateEnabled()
61969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
61979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setDuplicateParentStateEnabled(boolean enabled) {
61989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setFlags(enabled ? DUPLICATE_PARENT_STATE : 0, DUPLICATE_PARENT_STATE);
61999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
62009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
62019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
62029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Indicates whether this duplicates its drawable state from its parent.</p>
62039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
62049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return True if this view's drawable state is duplicated from the parent,
62059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         false otherwise
62069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
62079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getDrawableState()
62089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setDuplicateParentStateEnabled(boolean)
62099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
62109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isDuplicateParentStateEnabled() {
62119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (mViewFlags & DUPLICATE_PARENT_STATE) == DUPLICATE_PARENT_STATE;
62129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
62139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
62149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
62159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Enables or disables the drawing cache. When the drawing cache is enabled, the next call
62169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to {@link #getDrawingCache()} or {@link #buildDrawingCache()} will draw the view in a
62179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * bitmap. Calling {@link #draw(android.graphics.Canvas)} will not draw from the cache when
62189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the cache is enabled. To benefit from the cache, you must request the drawing cache by
62199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * calling {@link #getDrawingCache()} and draw it on screen if the returned bitmap is not
62209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * null.</p>
62219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
62229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param enabled true to enable the drawing cache, false otherwise
62239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
62249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #isDrawingCacheEnabled()
62259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getDrawingCache()
62269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #buildDrawingCache()
62279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
62289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setDrawingCacheEnabled(boolean enabled) {
62299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setFlags(enabled ? DRAWING_CACHE_ENABLED : 0, DRAWING_CACHE_ENABLED);
62309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
62319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
62329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
62339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Indicates whether the drawing cache is enabled for this view.</p>
62349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
62359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return true if the drawing cache is enabled
62369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
62379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setDrawingCacheEnabled(boolean)
62389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getDrawingCache()
62399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
62409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @ViewDebug.ExportedProperty
62419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isDrawingCacheEnabled() {
62429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (mViewFlags & DRAWING_CACHE_ENABLED) == DRAWING_CACHE_ENABLED;
62439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
62449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
62459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6246fbd8f69a84163ef1cf52b07966320caf448c2bc9Romain Guy     * <p>Calling this method is equivalent to calling <code>getDrawingCache(false)</code>.</p>
6247fbd8f69a84163ef1cf52b07966320caf448c2bc9Romain Guy     *
6248fbd8f69a84163ef1cf52b07966320caf448c2bc9Romain Guy     * @return A non-scaled bitmap representing this view or null if cache is disabled.
6249fbd8f69a84163ef1cf52b07966320caf448c2bc9Romain Guy     *
6250fbd8f69a84163ef1cf52b07966320caf448c2bc9Romain Guy     * @see #getDrawingCache(boolean)
6251fbd8f69a84163ef1cf52b07966320caf448c2bc9Romain Guy     */
6252fbd8f69a84163ef1cf52b07966320caf448c2bc9Romain Guy    public Bitmap getDrawingCache() {
6253fbd8f69a84163ef1cf52b07966320caf448c2bc9Romain Guy        return getDrawingCache(false);
6254fbd8f69a84163ef1cf52b07966320caf448c2bc9Romain Guy    }
6255fbd8f69a84163ef1cf52b07966320caf448c2bc9Romain Guy
6256fbd8f69a84163ef1cf52b07966320caf448c2bc9Romain Guy    /**
62579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Returns the bitmap in which this view drawing is cached. The returned bitmap
62589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is null when caching is disabled. If caching is enabled and the cache is not ready,
62599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * this method will create it. Calling {@link #draw(android.graphics.Canvas)} will not
62609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * draw from the cache when the cache is enabled. To benefit from the cache, you must
62619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * request the drawing cache by calling this method and draw it on screen if the
62629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * returned bitmap is not null.</p>
6263fbd8f69a84163ef1cf52b07966320caf448c2bc9Romain Guy     *
6264fbd8f69a84163ef1cf52b07966320caf448c2bc9Romain Guy     * <p>Note about auto scaling in compatibility mode: When auto scaling is not enabled,
6265fbd8f69a84163ef1cf52b07966320caf448c2bc9Romain Guy     * this method will create a bitmap of the same size as this view. Because this bitmap
6266fbd8f69a84163ef1cf52b07966320caf448c2bc9Romain Guy     * will be drawn scaled by the parent ViewGroup, the result on screen might show
6267fbd8f69a84163ef1cf52b07966320caf448c2bc9Romain Guy     * scaling artifacts. To avoid such artifacts, you should call this method by setting
6268fbd8f69a84163ef1cf52b07966320caf448c2bc9Romain Guy     * the auto scaling to true. Doing so, however, will generate a bitmap of a different
6269fbd8f69a84163ef1cf52b07966320caf448c2bc9Romain Guy     * size than the view. This implies that your application must be able to handle this
6270fbd8f69a84163ef1cf52b07966320caf448c2bc9Romain Guy     * size.</p>
6271fbd8f69a84163ef1cf52b07966320caf448c2bc9Romain Guy     *
6272fbd8f69a84163ef1cf52b07966320caf448c2bc9Romain Guy     * @param autoScale Indicates whether the generated bitmap should be scaled based on
6273fbd8f69a84163ef1cf52b07966320caf448c2bc9Romain Guy     *        the current density of the screen when the application is in compatibility
6274fbd8f69a84163ef1cf52b07966320caf448c2bc9Romain Guy     *        mode.
6275fbd8f69a84163ef1cf52b07966320caf448c2bc9Romain Guy     *
6276fbd8f69a84163ef1cf52b07966320caf448c2bc9Romain Guy     * @return A bitmap representing this view or null if cache is disabled.
6277fbd8f69a84163ef1cf52b07966320caf448c2bc9Romain Guy     *
62789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setDrawingCacheEnabled(boolean)
62799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #isDrawingCacheEnabled()
6280fbd8f69a84163ef1cf52b07966320caf448c2bc9Romain Guy     * @see #buildDrawingCache(boolean)
62819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #destroyDrawingCache()
62829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6283fbd8f69a84163ef1cf52b07966320caf448c2bc9Romain Guy    public Bitmap getDrawingCache(boolean autoScale) {
62849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((mViewFlags & WILL_NOT_CACHE_DRAWING) == WILL_NOT_CACHE_DRAWING) {
62859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
62869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
62879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((mViewFlags & DRAWING_CACHE_ENABLED) == DRAWING_CACHE_ENABLED) {
6288fbd8f69a84163ef1cf52b07966320caf448c2bc9Romain Guy            buildDrawingCache(autoScale);
62899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6290fbd8f69a84163ef1cf52b07966320caf448c2bc9Romain Guy        return autoScale ? (mDrawingCache == null ? null : mDrawingCache.get()) :
6291fbd8f69a84163ef1cf52b07966320caf448c2bc9Romain Guy                (mUnscaledDrawingCache == null ? null : mUnscaledDrawingCache.get());
62929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
62939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
62949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
62959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Frees the resources used by the drawing cache. If you call
62969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #buildDrawingCache()} manually without calling
62979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #setDrawingCacheEnabled(boolean) setDrawingCacheEnabled(true)}, you
62989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * should cleanup the cache with this method afterwards.</p>
62999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
63009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setDrawingCacheEnabled(boolean)
63019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #buildDrawingCache()
63029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getDrawingCache()
63039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
63049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void destroyDrawingCache() {
63059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mDrawingCache != null) {
63069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final Bitmap bitmap = mDrawingCache.get();
63079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (bitmap != null) bitmap.recycle();
63089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDrawingCache = null;
63099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6310fbd8f69a84163ef1cf52b07966320caf448c2bc9Romain Guy        if (mUnscaledDrawingCache != null) {
6311fbd8f69a84163ef1cf52b07966320caf448c2bc9Romain Guy            final Bitmap bitmap = mUnscaledDrawingCache.get();
6312fbd8f69a84163ef1cf52b07966320caf448c2bc9Romain Guy            if (bitmap != null) bitmap.recycle();
6313fbd8f69a84163ef1cf52b07966320caf448c2bc9Romain Guy            mUnscaledDrawingCache = null;
6314fbd8f69a84163ef1cf52b07966320caf448c2bc9Romain Guy        }
63159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
63169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
63179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
63189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Setting a solid background color for the drawing cache's bitmaps will improve
63199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * perfromance and memory usage. Note, though that this should only be used if this
63209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * view will always be drawn on top of a solid color.
63219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
63229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param color The background color to use for the drawing cache's bitmap
63239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
63249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setDrawingCacheEnabled(boolean)
63259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #buildDrawingCache()
63269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getDrawingCache()
63279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
63289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setDrawingCacheBackgroundColor(int color) {
632952e2ef8cac0cd6d78c2c2f5783846e03c636a54cRomain Guy        if (color != mDrawingCacheBackgroundColor) {
633052e2ef8cac0cd6d78c2c2f5783846e03c636a54cRomain Guy            mDrawingCacheBackgroundColor = color;
633152e2ef8cac0cd6d78c2c2f5783846e03c636a54cRomain Guy            mPrivateFlags &= ~DRAWING_CACHE_VALID;
633252e2ef8cac0cd6d78c2c2f5783846e03c636a54cRomain Guy        }
63339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
63349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
63359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
63369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setDrawingCacheBackgroundColor(int)
63379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
63389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The background color to used for the drawing cache's bitmap
63399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
63409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getDrawingCacheBackgroundColor() {
63419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mDrawingCacheBackgroundColor;
63429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
63439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
63449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6345fbd8f69a84163ef1cf52b07966320caf448c2bc9Romain Guy     * <p>Calling this method is equivalent to calling <code>buildDrawingCache(false)</code>.</p>
6346fbd8f69a84163ef1cf52b07966320caf448c2bc9Romain Guy     *
6347fbd8f69a84163ef1cf52b07966320caf448c2bc9Romain Guy     * @see #buildDrawingCache(boolean)
6348fbd8f69a84163ef1cf52b07966320caf448c2bc9Romain Guy     */
6349fbd8f69a84163ef1cf52b07966320caf448c2bc9Romain Guy    public void buildDrawingCache() {
6350fbd8f69a84163ef1cf52b07966320caf448c2bc9Romain Guy        buildDrawingCache(false);
6351fbd8f69a84163ef1cf52b07966320caf448c2bc9Romain Guy    }
6352fbd8f69a84163ef1cf52b07966320caf448c2bc9Romain Guy
6353fbd8f69a84163ef1cf52b07966320caf448c2bc9Romain Guy    /**
63549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Forces the drawing cache to be built if the drawing cache is invalid.</p>
63559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
63569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>If you call {@link #buildDrawingCache()} manually without calling
63579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #setDrawingCacheEnabled(boolean) setDrawingCacheEnabled(true)}, you
63589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * should cleanup the cache by calling {@link #destroyDrawingCache()} afterwards.</p>
6359fbd8f69a84163ef1cf52b07966320caf448c2bc9Romain Guy     *
6360fbd8f69a84163ef1cf52b07966320caf448c2bc9Romain Guy     * <p>Note about auto scaling in compatibility mode: When auto scaling is not enabled,
6361fbd8f69a84163ef1cf52b07966320caf448c2bc9Romain Guy     * this method will create a bitmap of the same size as this view. Because this bitmap
6362fbd8f69a84163ef1cf52b07966320caf448c2bc9Romain Guy     * will be drawn scaled by the parent ViewGroup, the result on screen might show
6363fbd8f69a84163ef1cf52b07966320caf448c2bc9Romain Guy     * scaling artifacts. To avoid such artifacts, you should call this method by setting
6364fbd8f69a84163ef1cf52b07966320caf448c2bc9Romain Guy     * the auto scaling to true. Doing so, however, will generate a bitmap of a different
6365fbd8f69a84163ef1cf52b07966320caf448c2bc9Romain Guy     * size than the view. This implies that your application must be able to handle this
6366fbd8f69a84163ef1cf52b07966320caf448c2bc9Romain Guy     * size.</p>
63679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
63689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getDrawingCache()
63699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #destroyDrawingCache()
63709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6371fbd8f69a84163ef1cf52b07966320caf448c2bc9Romain Guy    public void buildDrawingCache(boolean autoScale) {
6372fbd8f69a84163ef1cf52b07966320caf448c2bc9Romain Guy        if ((mPrivateFlags & DRAWING_CACHE_VALID) == 0 || (autoScale ?
6373fbd8f69a84163ef1cf52b07966320caf448c2bc9Romain Guy                (mDrawingCache == null || mDrawingCache.get() == null) :
6374fbd8f69a84163ef1cf52b07966320caf448c2bc9Romain Guy                (mUnscaledDrawingCache == null || mUnscaledDrawingCache.get() == null))) {
63759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
63769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (ViewDebug.TRACE_HIERARCHY) {
63779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ViewDebug.trace(this, ViewDebug.HierarchyTraceType.BUILD_CACHE);
63789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
637913922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy            if (Config.DEBUG && ViewDebug.profileDrawing) {
63809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                EventLog.writeEvent(60002, hashCode());
63819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
63829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
63838506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy            int width = mRight - mLeft;
63848506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy            int height = mBottom - mTop;
63858506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
63868506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy            final AttachInfo attachInfo = mAttachInfo;
6387e11232287296eefc82cd895b8392079feedb37ccRomain Guy            final boolean scalingRequired = attachInfo != null && attachInfo.mScalingRequired;
6388fbd8f69a84163ef1cf52b07966320caf448c2bc9Romain Guy
6389e11232287296eefc82cd895b8392079feedb37ccRomain Guy            if (autoScale && scalingRequired) {
6390fbd8f69a84163ef1cf52b07966320caf448c2bc9Romain Guy                width = (int) ((width * attachInfo.mApplicationScale) + 0.5f);
6391fbd8f69a84163ef1cf52b07966320caf448c2bc9Romain Guy                height = (int) ((height * attachInfo.mApplicationScale) + 0.5f);
63928506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy            }
63939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
63949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int drawingCacheBackgroundColor = mDrawingCacheBackgroundColor;
639535b38cefcc92f1ed599a652ac5736ab9e9e75039Romain Guy            final boolean opaque = drawingCacheBackgroundColor != 0 || isOpaque();
6396a62e4705d51e6f36ba1c02350813b6a12af49703Romain Guy            final boolean translucentWindow = attachInfo != null && attachInfo.mTranslucentWindow;
63979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
63989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (width <= 0 || height <= 0 ||
639935b38cefcc92f1ed599a652ac5736ab9e9e75039Romain Guy                     // Projected bitmap size in bytes
640035b38cefcc92f1ed599a652ac5736ab9e9e75039Romain Guy                    (width * height * (opaque && !translucentWindow ? 2 : 4) >
64019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            ViewConfiguration.get(mContext).getScaledMaximumDrawingCacheSize())) {
64029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                destroyDrawingCache();
64039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
64049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
64059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
64069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean clear = true;
6407fbd8f69a84163ef1cf52b07966320caf448c2bc9Romain Guy            Bitmap bitmap = autoScale ? (mDrawingCache == null ? null : mDrawingCache.get()) :
6408fbd8f69a84163ef1cf52b07966320caf448c2bc9Romain Guy                    (mUnscaledDrawingCache == null ? null : mUnscaledDrawingCache.get());
64099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
64109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (bitmap == null || bitmap.getWidth() != width || bitmap.getHeight() != height) {
64119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Bitmap.Config quality;
64129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!opaque) {
64139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    switch (mViewFlags & DRAWING_CACHE_QUALITY_MASK) {
64149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        case DRAWING_CACHE_QUALITY_AUTO:
64159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            quality = Bitmap.Config.ARGB_8888;
64169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            break;
64179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        case DRAWING_CACHE_QUALITY_LOW:
64189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            quality = Bitmap.Config.ARGB_4444;
64199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            break;
64209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        case DRAWING_CACHE_QUALITY_HIGH:
64219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            quality = Bitmap.Config.ARGB_8888;
64229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            break;
64239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        default:
64249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            quality = Bitmap.Config.ARGB_8888;
64259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            break;
64269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
64279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
642835b38cefcc92f1ed599a652ac5736ab9e9e75039Romain Guy                    // Optimization for translucent windows
642935b38cefcc92f1ed599a652ac5736ab9e9e75039Romain Guy                    // If the window is translucent, use a 32 bits bitmap to benefit from memcpy()
643035b38cefcc92f1ed599a652ac5736ab9e9e75039Romain Guy                    quality = translucentWindow ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565;
64319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
64329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
64339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Try to cleanup memory
64349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (bitmap != null) bitmap.recycle();
64359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
64369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
64379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    bitmap = Bitmap.createBitmap(width, height, quality);
643811ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn                    bitmap.setDensity(getResources().getDisplayMetrics().densityDpi);
6439fbd8f69a84163ef1cf52b07966320caf448c2bc9Romain Guy                    if (autoScale) {
6440fbd8f69a84163ef1cf52b07966320caf448c2bc9Romain Guy                        mDrawingCache = new SoftReference<Bitmap>(bitmap);
6441fbd8f69a84163ef1cf52b07966320caf448c2bc9Romain Guy                    } else {
6442fbd8f69a84163ef1cf52b07966320caf448c2bc9Romain Guy                        mUnscaledDrawingCache = new SoftReference<Bitmap>(bitmap);
6443fbd8f69a84163ef1cf52b07966320caf448c2bc9Romain Guy                    }
644435b38cefcc92f1ed599a652ac5736ab9e9e75039Romain Guy                    if (opaque && translucentWindow) bitmap.setHasAlpha(false);
64459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (OutOfMemoryError e) {
64469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // If there is not enough memory to create the bitmap cache, just
64479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // ignore the issue as bitmap caches are not required to draw the
64489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // view hierarchy
6449fbd8f69a84163ef1cf52b07966320caf448c2bc9Romain Guy                    if (autoScale) {
6450fbd8f69a84163ef1cf52b07966320caf448c2bc9Romain Guy                        mDrawingCache = null;
6451fbd8f69a84163ef1cf52b07966320caf448c2bc9Romain Guy                    } else {
6452fbd8f69a84163ef1cf52b07966320caf448c2bc9Romain Guy                        mUnscaledDrawingCache = null;
6453fbd8f69a84163ef1cf52b07966320caf448c2bc9Romain Guy                    }
64549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return;
64559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
64569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
64579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                clear = drawingCacheBackgroundColor != 0;
64589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
64599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
64609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Canvas canvas;
64619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (attachInfo != null) {
64629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                canvas = attachInfo.mCanvas;
64639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (canvas == null) {
64649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    canvas = new Canvas();
64659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
64669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                canvas.setBitmap(bitmap);
64679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Temporarily clobber the cached Canvas in case one of our children
64689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // is also using a drawing cache. Without this, the children would
64699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // steal the canvas by attaching their own bitmap to it and bad, bad
64709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // thing would happen (invisible views, corrupted drawings, etc.)
64719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                attachInfo.mCanvas = null;
64729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
64739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // This case should hopefully never or seldom happen
64749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                canvas = new Canvas(bitmap);
64759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
64769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
64779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (clear) {
64789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                bitmap.eraseColor(drawingCacheBackgroundColor);
64799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
64809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
64819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            computeScroll();
64829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int restoreCount = canvas.save();
6483fbd8f69a84163ef1cf52b07966320caf448c2bc9Romain Guy
6484e11232287296eefc82cd895b8392079feedb37ccRomain Guy            if (autoScale && scalingRequired) {
6485fbd8f69a84163ef1cf52b07966320caf448c2bc9Romain Guy                final float scale = attachInfo.mApplicationScale;
6486fbd8f69a84163ef1cf52b07966320caf448c2bc9Romain Guy                canvas.scale(scale, scale);
6487fbd8f69a84163ef1cf52b07966320caf448c2bc9Romain Guy            }
6488fbd8f69a84163ef1cf52b07966320caf448c2bc9Romain Guy
64899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            canvas.translate(-mScrollX, -mScrollY);
64909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
64915bcdff45bf4ada77ae7c95f520b795876adef75cRomain Guy            mPrivateFlags |= DRAWN;
6492ecd80ee31c23ac067bb420f44f046682c499e83cRomain Guy            mPrivateFlags |= DRAWING_CACHE_VALID;
64939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
64949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Fast path for layouts with no backgrounds
64959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((mPrivateFlags & SKIP_DRAW) == SKIP_DRAW) {
64969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (ViewDebug.TRACE_HIERARCHY) {
64979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ViewDebug.trace(this, ViewDebug.HierarchyTraceType.DRAW);
64989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
64995bcdff45bf4ada77ae7c95f520b795876adef75cRomain Guy                mPrivateFlags &= ~DIRTY_MASK;
65009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                dispatchDraw(canvas);
65019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
65029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                draw(canvas);
65039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
65049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
65059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            canvas.restoreToCount(restoreCount);
65069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
65079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (attachInfo != null) {
65089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Restore the cached Canvas for our siblings
65099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                attachInfo.mCanvas = canvas;
65109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
65119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
65129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
65139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
65149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6515958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn     * Create a snapshot of the view into a bitmap.  We should probably make
6516958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn     * some form of this public, but should think about the API.
6517958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn     */
6518223ff5c0586adbbd1d6d57a3a4d176222e8b7434Romain Guy    Bitmap createSnapshot(Bitmap.Config quality, int backgroundColor, boolean skipChildren) {
65198cae124af2142687a6833dbaab8a43df6dd67b43Dianne Hackborn        int width = mRight - mLeft;
65208cae124af2142687a6833dbaab8a43df6dd67b43Dianne Hackborn        int height = mBottom - mTop;
6521958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn
65228cae124af2142687a6833dbaab8a43df6dd67b43Dianne Hackborn        final AttachInfo attachInfo = mAttachInfo;
65238c11e31143726c9457280c6c0ec83472763c0de9Romain Guy        final float scale = attachInfo != null ? attachInfo.mApplicationScale : 1.0f;
65248cae124af2142687a6833dbaab8a43df6dd67b43Dianne Hackborn        width = (int) ((width * scale) + 0.5f);
65258cae124af2142687a6833dbaab8a43df6dd67b43Dianne Hackborn        height = (int) ((height * scale) + 0.5f);
65268cae124af2142687a6833dbaab8a43df6dd67b43Dianne Hackborn
65278c11e31143726c9457280c6c0ec83472763c0de9Romain Guy        Bitmap bitmap = Bitmap.createBitmap(width > 0 ? width : 1, height > 0 ? height : 1, quality);
6528958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn        if (bitmap == null) {
6529958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn            throw new OutOfMemoryError();
6530958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn        }
6531958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn
65328cae124af2142687a6833dbaab8a43df6dd67b43Dianne Hackborn        bitmap.setDensity(getResources().getDisplayMetrics().densityDpi);
65338cae124af2142687a6833dbaab8a43df6dd67b43Dianne Hackborn
6534958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn        Canvas canvas;
6535958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn        if (attachInfo != null) {
6536958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn            canvas = attachInfo.mCanvas;
6537958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn            if (canvas == null) {
6538958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn                canvas = new Canvas();
6539958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn            }
6540958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn            canvas.setBitmap(bitmap);
6541958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn            // Temporarily clobber the cached Canvas in case one of our children
6542958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn            // is also using a drawing cache. Without this, the children would
6543958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn            // steal the canvas by attaching their own bitmap to it and bad, bad
6544958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn            // things would happen (invisible views, corrupted drawings, etc.)
6545958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn            attachInfo.mCanvas = null;
6546958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn        } else {
6547958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn            // This case should hopefully never or seldom happen
6548958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn            canvas = new Canvas(bitmap);
6549958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn        }
6550958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn
65515bcdff45bf4ada77ae7c95f520b795876adef75cRomain Guy        if ((backgroundColor & 0xff000000) != 0) {
6552958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn            bitmap.eraseColor(backgroundColor);
6553958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn        }
6554958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn
6555958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn        computeScroll();
6556958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn        final int restoreCount = canvas.save();
65578cae124af2142687a6833dbaab8a43df6dd67b43Dianne Hackborn        canvas.scale(scale, scale);
6558958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn        canvas.translate(-mScrollX, -mScrollY);
6559958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn
65605bcdff45bf4ada77ae7c95f520b795876adef75cRomain Guy        // Temporarily remove the dirty mask
65615bcdff45bf4ada77ae7c95f520b795876adef75cRomain Guy        int flags = mPrivateFlags;
65625bcdff45bf4ada77ae7c95f520b795876adef75cRomain Guy        mPrivateFlags &= ~DIRTY_MASK;
65635bcdff45bf4ada77ae7c95f520b795876adef75cRomain Guy
6564958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn        // Fast path for layouts with no backgrounds
6565958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn        if ((mPrivateFlags & SKIP_DRAW) == SKIP_DRAW) {
6566958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn            dispatchDraw(canvas);
6567958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn        } else {
6568958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn            draw(canvas);
6569958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn        }
6570958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn
65715bcdff45bf4ada77ae7c95f520b795876adef75cRomain Guy        mPrivateFlags = flags;
65725bcdff45bf4ada77ae7c95f520b795876adef75cRomain Guy
6573958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn        canvas.restoreToCount(restoreCount);
6574958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn
6575958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn        if (attachInfo != null) {
6576958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn            // Restore the cached Canvas for our siblings
6577958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn            attachInfo.mCanvas = canvas;
6578958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn        }
65798506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
6580958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn        return bitmap;
6581958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn    }
6582958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn
6583958b9adc086f126dcd757d29f0d7f443ae9064b2Dianne Hackborn    /**
65849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Indicates whether this View is currently in edit mode. A View is usually
65859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * in edit mode when displayed within a developer tool. For instance, if
65869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * this View is being drawn by a visual user interface builder, this method
65879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * should return true.
65889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
65899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Subclasses should check the return value of this method to provide
65909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * different behaviors if their normal behavior might interfere with the
65919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * host environment. For instance: the class spawns a thread in its
65929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * constructor, the drawing code relies on device-specific features, etc.
65939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
65949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This method is usually checked in the drawing code of custom widgets.
65959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
65969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return True if this View is in edit mode, false otherwise.
65979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
65989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isInEditMode() {
65999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
66009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
66019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
66029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
66039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If the View draws content inside its padding and enables fading edges,
66049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * it needs to support padding offsets. Padding offsets are added to the
66059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * fading edges to extend the length of the fade so that it covers pixels
66069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * drawn inside the padding.
66079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
66089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Subclasses of this class should override this method if they need
66099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to draw content inside the padding.
66109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
66119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return True if padding offset must be applied, false otherwise.
66129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
66139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getLeftPaddingOffset()
66149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getRightPaddingOffset()
66159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getTopPaddingOffset()
66169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getBottomPaddingOffset()
66179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
66189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @since CURRENT
66199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
66209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected boolean isPaddingOffsetRequired() {
66219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
66229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
66239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
66249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
66259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Amount by which to extend the left fading region. Called only when
66269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #isPaddingOffsetRequired()} returns true.
66279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
66289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The left padding offset in pixels.
66299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
66309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #isPaddingOffsetRequired()
66319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
66329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @since CURRENT
66339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
66349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected int getLeftPaddingOffset() {
66359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
66369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
66379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
66389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
66399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Amount by which to extend the right fading region. Called only when
66409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #isPaddingOffsetRequired()} returns true.
66419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
66429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The right padding offset in pixels.
66439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
66449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #isPaddingOffsetRequired()
66459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
66469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @since CURRENT
66479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
66489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected int getRightPaddingOffset() {
66499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
66509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
66519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
66529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
66539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Amount by which to extend the top fading region. Called only when
66549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #isPaddingOffsetRequired()} returns true.
66559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
66569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The top padding offset in pixels.
66579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
66589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #isPaddingOffsetRequired()
66599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
66609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @since CURRENT
66619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
66629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected int getTopPaddingOffset() {
66639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
66649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
66659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
66669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
66679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Amount by which to extend the bottom fading region. Called only when
66689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #isPaddingOffsetRequired()} returns true.
66699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
66709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The bottom padding offset in pixels.
66719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
66729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #isPaddingOffsetRequired()
66739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
66749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @since CURRENT
66759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
66769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected int getBottomPaddingOffset() {
66779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
66789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
66799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
66809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
66819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Manually render this view (and all of its children) to the given Canvas.
66829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The view must have already done a full layout before this function is
66839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * called.  When implementing a view, do not override this method; instead,
66849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * you should implement {@link #onDraw}.
66859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
66869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param canvas The Canvas to which the View is rendered.
66879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
66889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void draw(Canvas canvas) {
66899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (ViewDebug.TRACE_HIERARCHY) {
66909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ViewDebug.trace(this, ViewDebug.HierarchyTraceType.DRAW);
66919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
66929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
66935bcdff45bf4ada77ae7c95f520b795876adef75cRomain Guy        final int privateFlags = mPrivateFlags;
66945bcdff45bf4ada77ae7c95f520b795876adef75cRomain Guy        final boolean dirtyOpaque = (privateFlags & DIRTY_MASK) == DIRTY_OPAQUE &&
66955bcdff45bf4ada77ae7c95f520b795876adef75cRomain Guy                (mAttachInfo == null || !mAttachInfo.mIgnoreDirtyState);
66965bcdff45bf4ada77ae7c95f520b795876adef75cRomain Guy        mPrivateFlags = (privateFlags & ~DIRTY_MASK) | DRAWN;
669724443ea3992e372e47daa50266b0f2ec38cac388Romain Guy
66989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /*
66999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Draw traversal performs several drawing steps which must be executed
67009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * in the appropriate order:
67019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
67029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *      1. Draw the background
67039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *      2. If necessary, save the canvas' layers to prepare for fading
67049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *      3. Draw view's content
67059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *      4. Draw children
67069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *      5. If necessary, draw the fading edges and restore layers
67079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *      6. Draw decorations (scrollbars for instance)
67089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
67099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
67109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Step 1, draw the background, if needed
67119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int saveCount;
67129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
671324443ea3992e372e47daa50266b0f2ec38cac388Romain Guy        if (!dirtyOpaque) {
671424443ea3992e372e47daa50266b0f2ec38cac388Romain Guy            final Drawable background = mBGDrawable;
671524443ea3992e372e47daa50266b0f2ec38cac388Romain Guy            if (background != null) {
671624443ea3992e372e47daa50266b0f2ec38cac388Romain Guy                final int scrollX = mScrollX;
671724443ea3992e372e47daa50266b0f2ec38cac388Romain Guy                final int scrollY = mScrollY;
67189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
671924443ea3992e372e47daa50266b0f2ec38cac388Romain Guy                if (mBackgroundSizeChanged) {
672024443ea3992e372e47daa50266b0f2ec38cac388Romain Guy                    background.setBounds(0, 0,  mRight - mLeft, mBottom - mTop);
672124443ea3992e372e47daa50266b0f2ec38cac388Romain Guy                    mBackgroundSizeChanged = false;
672224443ea3992e372e47daa50266b0f2ec38cac388Romain Guy                }
67239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
672424443ea3992e372e47daa50266b0f2ec38cac388Romain Guy                if ((scrollX | scrollY) == 0) {
672524443ea3992e372e47daa50266b0f2ec38cac388Romain Guy                    background.draw(canvas);
672624443ea3992e372e47daa50266b0f2ec38cac388Romain Guy                } else {
672724443ea3992e372e47daa50266b0f2ec38cac388Romain Guy                    canvas.translate(scrollX, scrollY);
672824443ea3992e372e47daa50266b0f2ec38cac388Romain Guy                    background.draw(canvas);
672924443ea3992e372e47daa50266b0f2ec38cac388Romain Guy                    canvas.translate(-scrollX, -scrollY);
673024443ea3992e372e47daa50266b0f2ec38cac388Romain Guy                }
67319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
67329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
67339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
67349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // skip step 2 & 5 if possible (common case)
67359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int viewFlags = mViewFlags;
67369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean horizontalEdges = (viewFlags & FADING_EDGE_HORIZONTAL) != 0;
67379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean verticalEdges = (viewFlags & FADING_EDGE_VERTICAL) != 0;
67389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!verticalEdges && !horizontalEdges) {
67399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Step 3, draw the content
674024443ea3992e372e47daa50266b0f2ec38cac388Romain Guy            if (!dirtyOpaque) onDraw(canvas);
67419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
67429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Step 4, draw the children
67439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dispatchDraw(canvas);
67449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
67459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Step 6, draw decorations (scrollbars)
67469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            onDrawScrollBars(canvas);
67479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
67489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // we're done...
67499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
67509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
67519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
67529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /*
67539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Here we do the full fledged routine...
67549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * (this is an uncommon case where speed matters less,
67559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * this is why we repeat some of the tests that have been
67569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * done above)
67579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
67589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
67599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean drawTop = false;
67609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean drawBottom = false;
67619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean drawLeft = false;
67629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean drawRight = false;
67639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
67649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        float topFadeStrength = 0.0f;
67659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        float bottomFadeStrength = 0.0f;
67669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        float leftFadeStrength = 0.0f;
67679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        float rightFadeStrength = 0.0f;
67689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
67699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Step 2, save the canvas' layers
67709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int paddingLeft = mPaddingLeft;
67719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int paddingTop = mPaddingTop;
67729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
67739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final boolean offsetRequired = isPaddingOffsetRequired();
67749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (offsetRequired) {
67759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            paddingLeft += getLeftPaddingOffset();
67769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            paddingTop += getTopPaddingOffset();
67779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
67789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
67799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int left = mScrollX + paddingLeft;
67809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int right = left + mRight - mLeft - mPaddingRight - paddingLeft;
67819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int top = mScrollY + paddingTop;
67829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int bottom = top + mBottom - mTop - mPaddingBottom - paddingTop;
67839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
67849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (offsetRequired) {
67859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            right += getRightPaddingOffset();
67869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            bottom += getBottomPaddingOffset();
67879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
67889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
67899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final ScrollabilityCache scrollabilityCache = mScrollCache;
67909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int length = scrollabilityCache.fadingEdgeLength;
67919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
67929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // clip the fade length if top and bottom fades overlap
67939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // overlapping fades produce odd-looking artifacts
67949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (verticalEdges && (top + length > bottom - length)) {
67959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            length = (bottom - top) / 2;
67969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
67979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
67989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // also clip horizontal fades if necessary
67999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (horizontalEdges && (left + length > right - length)) {
68009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            length = (right - left) / 2;
68019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
68029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
68039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (verticalEdges) {
68049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            topFadeStrength = Math.max(0.0f, Math.min(1.0f, getTopFadingEdgeStrength()));
68059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            drawTop = topFadeStrength >= 0.0f;
68069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            bottomFadeStrength = Math.max(0.0f, Math.min(1.0f, getBottomFadingEdgeStrength()));
68079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            drawBottom = bottomFadeStrength >= 0.0f;
68089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
68099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
68109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (horizontalEdges) {
68119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            leftFadeStrength = Math.max(0.0f, Math.min(1.0f, getLeftFadingEdgeStrength()));
68129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            drawLeft = leftFadeStrength >= 0.0f;
68139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            rightFadeStrength = Math.max(0.0f, Math.min(1.0f, getRightFadingEdgeStrength()));
68149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            drawRight = rightFadeStrength >= 0.0f;
68159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
68169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
68179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        saveCount = canvas.getSaveCount();
68189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
68199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int solidColor = getSolidColor();
68209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (solidColor == 0) {
68219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int flags = Canvas.HAS_ALPHA_LAYER_SAVE_FLAG;
68229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
68239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (drawTop) {
68249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                canvas.saveLayer(left, top, right, top + length, null, flags);
68259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
68269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
68279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (drawBottom) {
68289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                canvas.saveLayer(left, bottom - length, right, bottom, null, flags);
68299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
68309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
68319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (drawLeft) {
68329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                canvas.saveLayer(left, top, left + length, bottom, null, flags);
68339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
68349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
68359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (drawRight) {
68369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                canvas.saveLayer(right - length, top, right, bottom, null, flags);
68379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
68389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
68399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            scrollabilityCache.setFadeColor(solidColor);
68409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
68419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
68429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Step 3, draw the content
684324443ea3992e372e47daa50266b0f2ec38cac388Romain Guy        if (!dirtyOpaque) onDraw(canvas);
68449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
68459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Step 4, draw the children
68469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dispatchDraw(canvas);
68479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
68489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Step 5, draw the fade effect and restore layers
68499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final Paint p = scrollabilityCache.paint;
68509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final Matrix matrix = scrollabilityCache.matrix;
68519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final Shader fade = scrollabilityCache.shader;
68529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final float fadeHeight = scrollabilityCache.fadingEdgeLength;
68539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
68549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (drawTop) {
68559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            matrix.setScale(1, fadeHeight * topFadeStrength);
68569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            matrix.postTranslate(left, top);
68579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            fade.setLocalMatrix(matrix);
68589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            canvas.drawRect(left, top, right, top + length, p);
68599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
68609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
68619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (drawBottom) {
68629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            matrix.setScale(1, fadeHeight * bottomFadeStrength);
68639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            matrix.postRotate(180);
68649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            matrix.postTranslate(left, bottom);
68659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            fade.setLocalMatrix(matrix);
68669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            canvas.drawRect(left, bottom - length, right, bottom, p);
68679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
68689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
68699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (drawLeft) {
68709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            matrix.setScale(1, fadeHeight * leftFadeStrength);
68719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            matrix.postRotate(-90);
68729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            matrix.postTranslate(left, top);
68739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            fade.setLocalMatrix(matrix);
68749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            canvas.drawRect(left, top, left + length, bottom, p);
68759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
68769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
68779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (drawRight) {
68789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            matrix.setScale(1, fadeHeight * rightFadeStrength);
68799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            matrix.postRotate(90);
68809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            matrix.postTranslate(right, top);
68819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            fade.setLocalMatrix(matrix);
68829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            canvas.drawRect(right - length, top, right, bottom, p);
68839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
68849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
68859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        canvas.restoreToCount(saveCount);
68869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
68879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Step 6, draw decorations (scrollbars)
68889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        onDrawScrollBars(canvas);
68899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
68909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
68919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
68929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Override this if your view is known to always be drawn on top of a solid color background,
68939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and needs to draw fading edges. Returning a non-zero color enables the view system to
68949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * optimize the drawing of the fading edges. If you do return a non-zero color, the alpha
68959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * should be set to 0xFF.
68969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
68979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setVerticalFadingEdgeEnabled
68989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setHorizontalFadingEdgeEnabled
68999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
69009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The known solid color background for this view, or 0 if the color may vary
69019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
69029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getSolidColor() {
69039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
69049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
69059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
69069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
69079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Build a human readable string representation of the specified view flags.
69089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
69099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param flags the view flags to convert to a string
69109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return a String representing the supplied flags
69119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
69129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static String printFlags(int flags) {
69139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String output = "";
69149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int numFlags = 0;
69159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags & FOCUSABLE_MASK) == FOCUSABLE) {
69169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            output += "TAKES_FOCUS";
69179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            numFlags++;
69189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
69199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
69209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (flags & VISIBILITY_MASK) {
69219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case INVISIBLE:
69229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (numFlags > 0) {
69239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                output += " ";
69249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
69259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            output += "INVISIBLE";
69269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // USELESS HERE numFlags++;
69279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
69289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case GONE:
69299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (numFlags > 0) {
69309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                output += " ";
69319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
69329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            output += "GONE";
69339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // USELESS HERE numFlags++;
69349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
69359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        default:
69369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
69379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
69389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return output;
69399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
69409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
69419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
69429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Build a human readable string representation of the specified private
69439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * view flags.
69449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
69459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param privateFlags the private view flags to convert to a string
69469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return a String representing the supplied flags
69479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
69489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static String printPrivateFlags(int privateFlags) {
69499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String output = "";
69509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int numFlags = 0;
69519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
69529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((privateFlags & WANTS_FOCUS) == WANTS_FOCUS) {
69539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            output += "WANTS_FOCUS";
69549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            numFlags++;
69559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
69569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
69579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((privateFlags & FOCUSED) == FOCUSED) {
69589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (numFlags > 0) {
69599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                output += " ";
69609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
69619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            output += "FOCUSED";
69629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            numFlags++;
69639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
69649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
69659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((privateFlags & SELECTED) == SELECTED) {
69669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (numFlags > 0) {
69679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                output += " ";
69689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
69699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            output += "SELECTED";
69709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            numFlags++;
69719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
69729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
69739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((privateFlags & IS_ROOT_NAMESPACE) == IS_ROOT_NAMESPACE) {
69749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (numFlags > 0) {
69759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                output += " ";
69769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
69779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            output += "IS_ROOT_NAMESPACE";
69789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            numFlags++;
69799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
69809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
69819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((privateFlags & HAS_BOUNDS) == HAS_BOUNDS) {
69829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (numFlags > 0) {
69839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                output += " ";
69849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
69859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            output += "HAS_BOUNDS";
69869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            numFlags++;
69879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
69889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
69899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((privateFlags & DRAWN) == DRAWN) {
69909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (numFlags > 0) {
69919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                output += " ";
69929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
69939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            output += "DRAWN";
69949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // USELESS HERE numFlags++;
69959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
69969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return output;
69979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
69989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
69999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
70009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Indicates whether or not this view's layout will be requested during
70019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the next hierarchy layout pass.</p>
70029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
70039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return true if the layout will be forced during next layout pass
70049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
70059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isLayoutRequested() {
70069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (mPrivateFlags & FORCE_LAYOUT) == FORCE_LAYOUT;
70079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
70089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
70099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
70109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Assign a size and position to a view and all of its
70119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * descendants
70129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
70139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This is the second phase of the layout mechanism.
70149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * (The first is measuring). In this phase, each parent calls
70159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * layout on all of its children to position them.
70169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This is typically done using the child measurements
70179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that were stored in the measure pass().
70189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
70199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Derived classes with children should override
70209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * onLayout. In that method, they should
70219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * call layout on each of their their children.
70229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
70239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param l Left position, relative to parent
70249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param t Top position, relative to parent
70259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param r Right position, relative to parent
70269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param b Bottom position, relative to parent
70279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
70289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void layout(int l, int t, int r, int b) {
70299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean changed = setFrame(l, t, r, b);
70309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (changed || (mPrivateFlags & LAYOUT_REQUIRED) == LAYOUT_REQUIRED) {
70319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (ViewDebug.TRACE_HIERARCHY) {
70329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ViewDebug.trace(this, ViewDebug.HierarchyTraceType.ON_LAYOUT);
70339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
70349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
70359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            onLayout(changed, l, t, r, b);
70369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPrivateFlags &= ~LAYOUT_REQUIRED;
70379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
70389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPrivateFlags &= ~FORCE_LAYOUT;
70399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
70409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
70419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
70429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Called from layout when this view should
70439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * assign a size and position to each of its children.
70449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
70459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Derived classes with children should override
70469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * this method and call layout on each of
70479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * their their children.
70489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param changed This is a new size or position for this view
70499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param left Left position, relative to parent
70509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param top Top position, relative to parent
70519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param right Right position, relative to parent
70529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param bottom Bottom position, relative to parent
70539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
70549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
70559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
70569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
70579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
70589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Assign a size and position to this view.
70599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
70609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This is called from layout.
70619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
70629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param left Left position, relative to parent
70639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param top Top position, relative to parent
70649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param right Right position, relative to parent
70659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param bottom Bottom position, relative to parent
70669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return true if the new size and position are different than the
70679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         previous ones
70689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
70699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
70709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected boolean setFrame(int left, int top, int right, int bottom) {
70719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean changed = false;
70729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
70739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (DBG) {
707464f59342d41849bd365cb43fad7505d5e3daa417Mitsuru Oshima            Log.d("View", this + " View.setFrame(" + left + "," + top + ","
70759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + right + "," + bottom + ")");
70769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
70779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
70789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mLeft != left || mRight != right || mTop != top || mBottom != bottom) {
70799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            changed = true;
70809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
70819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Remember our drawn bit
70829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int drawn = mPrivateFlags & DRAWN;
70839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
70849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Invalidate our old position
70859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            invalidate();
70869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
70879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
70889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int oldWidth = mRight - mLeft;
70899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int oldHeight = mBottom - mTop;
70909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
70919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLeft = left;
70929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTop = top;
70939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRight = right;
70949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mBottom = bottom;
70959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
70969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPrivateFlags |= HAS_BOUNDS;
70979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
70989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int newWidth = right - left;
70999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int newHeight = bottom - top;
71009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
71019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (newWidth != oldWidth || newHeight != oldHeight) {
71029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                onSizeChanged(newWidth, newHeight, oldWidth, oldHeight);
71039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
71049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
71059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((mViewFlags & VISIBILITY_MASK) == VISIBLE) {
71069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // If we are visible, force the DRAWN bit to on so that
71079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // this invalidate will go through (at least to our parent).
71089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // This is because someone may have invalidated this view
71099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // before this call to setFrame came in, therby clearing
71109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // the DRAWN bit.
71119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPrivateFlags |= DRAWN;
71129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                invalidate();
71139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
71149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
71159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Reset drawn bit to original value (invalidate turns it off)
71169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPrivateFlags |= drawn;
71179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
71189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mBackgroundSizeChanged = true;
71199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
71209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return changed;
71219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
71229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
71239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
71249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Finalize inflating a view from XML.  This is called as the last phase
71259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * of inflation, after all child views have been added.
71269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
71279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Even if the subclass overrides onFinishInflate, they should always be
71289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * sure to call the super method, so that we get called.
71299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
71309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onFinishInflate() {
71319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
71329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
71339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
71349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the resources associated with this view.
71359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
71369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Resources object.
71379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
71389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Resources getResources() {
71399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mResources;
71409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
71419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
71429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
71439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Invalidates the specified Drawable.
71449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
71459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param drawable the drawable to invalidate
71469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
71479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void invalidateDrawable(Drawable drawable) {
71489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (verifyDrawable(drawable)) {
71499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final Rect dirty = drawable.getBounds();
71509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int scrollX = mScrollX;
71519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int scrollY = mScrollY;
71529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
71539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            invalidate(dirty.left + scrollX, dirty.top + scrollY,
71549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    dirty.right + scrollX, dirty.bottom + scrollY);
71559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
71569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
71579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
71589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
71599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Schedules an action on a drawable to occur at a specified time.
71609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
71619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param who the recipient of the action
71629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param what the action to run on the drawable
71639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param when the time at which the action must occur. Uses the
71649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        {@link SystemClock#uptimeMillis} timebase.
71659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
71669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void scheduleDrawable(Drawable who, Runnable what, long when) {
71679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (verifyDrawable(who) && what != null && mAttachInfo != null) {
71689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mAttachInfo.mHandler.postAtTime(what, who, when);
71699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
71709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
71719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
71729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
71739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Cancels a scheduled action on a drawable.
71749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
71759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param who the recipient of the action
71769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param what the action to cancel
71779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
71789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void unscheduleDrawable(Drawable who, Runnable what) {
71799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (verifyDrawable(who) && what != null && mAttachInfo != null) {
71809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mAttachInfo.mHandler.removeCallbacks(what, who);
71819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
71829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
71839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
71849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
71859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Unschedule any events associated with the given Drawable.  This can be
71869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * used when selecting a new Drawable into a view, so that the previous
71879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * one is completely unscheduled.
71889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
71899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param who The Drawable to unschedule.
71909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
71919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #drawableStateChanged
71929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
71939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void unscheduleDrawable(Drawable who) {
71949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mAttachInfo != null) {
71959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mAttachInfo.mHandler.removeCallbacksAndMessages(who);
71969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
71979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
71989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
71999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
72009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If your view subclass is displaying its own Drawable objects, it should
72019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * override this function and return true for any Drawable it is
72029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * displaying.  This allows animations for those drawables to be
72039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * scheduled.
72049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
72059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Be sure to call through to the super class when overriding this
72069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * function.
72079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
72089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param who The Drawable to verify.  Return true if it is one you are
72099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            displaying, else return the result of calling through to the
72109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            super class.
72119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
72129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return boolean If true than the Drawable is being displayed in the
72139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         view; else false and it is not allowed to animate.
72149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
72159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #unscheduleDrawable
72169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #drawableStateChanged
72179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
72189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected boolean verifyDrawable(Drawable who) {
72199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return who == mBGDrawable;
72209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
72219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
72229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
72239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This function is called whenever the state of the view changes in such
72249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * a way that it impacts the state of drawables being shown.
72259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
72269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Be sure to call through to the superclass when overriding this
72279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * function.
72289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
72299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see Drawable#setState
72309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
72319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void drawableStateChanged() {
72329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Drawable d = mBGDrawable;
72339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (d != null && d.isStateful()) {
72349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            d.setState(getDrawableState());
72359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
72369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
72379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
72389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
72399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Call this to force a view to update its drawable state. This will cause
72409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * drawableStateChanged to be called on this view. Views that are interested
72419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * in the new state should call getDrawableState.
72429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
72439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #drawableStateChanged
72449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getDrawableState
72459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
72469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void refreshDrawableState() {
72479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPrivateFlags |= DRAWABLE_STATE_DIRTY;
72489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        drawableStateChanged();
72499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
72509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ViewParent parent = mParent;
72519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (parent != null) {
72529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            parent.childDrawableStateChanged(this);
72539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
72549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
72559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
72569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
72579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return an array of resource IDs of the drawable states representing the
72589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * current state of the view.
72599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
72609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The current drawable state
72619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
72629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see Drawable#setState
72639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #drawableStateChanged
72649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onCreateDrawableState
72659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
72669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final int[] getDrawableState() {
72679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((mDrawableState != null) && ((mPrivateFlags & DRAWABLE_STATE_DIRTY) == 0)) {
72689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mDrawableState;
72699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
72709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mDrawableState = onCreateDrawableState(0);
72719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPrivateFlags &= ~DRAWABLE_STATE_DIRTY;
72729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mDrawableState;
72739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
72749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
72759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
72769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
72779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Generate the new {@link android.graphics.drawable.Drawable} state for
72789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * this view. This is called by the view
72799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * system when the cached Drawable state is determined to be invalid.  To
72809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * retrieve the current state, you should use {@link #getDrawableState}.
72819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
72829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param extraSpace if non-zero, this is the number of extra entries you
72839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * would like in the returned array in which you can place your own
72849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * states.
72859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
72869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns an array holding the current {@link Drawable} state of
72879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the view.
72889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
72899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #mergeDrawableStates
72909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
72919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected int[] onCreateDrawableState(int extraSpace) {
72929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((mViewFlags & DUPLICATE_PARENT_STATE) == DUPLICATE_PARENT_STATE &&
72939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mParent instanceof View) {
72949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ((View) mParent).onCreateDrawableState(extraSpace);
72959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
72969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
72979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int[] drawableState;
72989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
72999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int privateFlags = mPrivateFlags;
73009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
73019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int viewStateIndex = (((privateFlags & PRESSED) != 0) ? 1 : 0);
73029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
73039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        viewStateIndex = (viewStateIndex << 1)
73049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + (((mViewFlags & ENABLED_MASK) == ENABLED) ? 1 : 0);
73059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
73069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        viewStateIndex = (viewStateIndex << 1) + (isFocused() ? 1 : 0);
73079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
73089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        viewStateIndex = (viewStateIndex << 1)
73099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + (((privateFlags & SELECTED) != 0) ? 1 : 0);
73109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
73119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final boolean hasWindowFocus = hasWindowFocus();
73129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        viewStateIndex = (viewStateIndex << 1) + (hasWindowFocus ? 1 : 0);
73139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
73149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        drawableState = VIEW_STATE_SETS[viewStateIndex];
73159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
73169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //noinspection ConstantIfStatement
73179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (false) {
73189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.i("View", "drawableStateIndex=" + viewStateIndex);
73199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.i("View", toString()
73209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " pressed=" + ((privateFlags & PRESSED) != 0)
73219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " en=" + ((mViewFlags & ENABLED_MASK) == ENABLED)
73229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " fo=" + hasFocus()
73239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " sl=" + ((privateFlags & SELECTED) != 0)
73249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " wf=" + hasWindowFocus
73259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + ": " + Arrays.toString(drawableState));
73269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
73279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
73289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (extraSpace == 0) {
73299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return drawableState;
73309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
73319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
73329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int[] fullState;
73339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (drawableState != null) {
73349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            fullState = new int[drawableState.length + extraSpace];
73359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            System.arraycopy(drawableState, 0, fullState, 0, drawableState.length);
73369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
73379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            fullState = new int[extraSpace];
73389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
73399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
73409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return fullState;
73419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
73429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
73439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
73449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Merge your own state values in <var>additionalState</var> into the base
73459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * state values <var>baseState</var> that were returned by
73469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onCreateDrawableState}.
73479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
73489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param baseState The base state values returned by
73499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onCreateDrawableState}, which will be modified to also hold your
73509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * own additional state values.
73519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
73529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param additionalState The additional state values you would like
73539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * added to <var>baseState</var>; this array is not modified.
73549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
73559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return As a convenience, the <var>baseState</var> array you originally
73569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * passed into the function is returned.
73579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
73589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onCreateDrawableState
73599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
73609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected static int[] mergeDrawableStates(int[] baseState, int[] additionalState) {
73619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int N = baseState.length;
73629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int i = N - 1;
73639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (i >= 0 && baseState[i] == 0) {
73649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            i--;
73659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
73669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        System.arraycopy(additionalState, 0, baseState, i + 1, additionalState.length);
73679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return baseState;
73689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
73699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
73709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
73719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the background color for this view.
73729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param color the color of the background
73739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
73748354fa65ebf4f44dd189d1d6f33767cf009b5769Bjorn Bringert    @RemotableViewMethod
73759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setBackgroundColor(int color) {
73769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setBackgroundDrawable(new ColorDrawable(color));
73779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
73789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
73799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
73809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set the background to a given resource. The resource should refer to
73817cd88e171391dd0c876bf7d928d946a70cf95373Wink Saville     * a Drawable object or 0 to remove the background.
73829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param resid The identifier of the resource.
73839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @attr ref android.R.styleable#View_background
73849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
73858354fa65ebf4f44dd189d1d6f33767cf009b5769Bjorn Bringert    @RemotableViewMethod
73869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setBackgroundResource(int resid) {
73879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (resid != 0 && resid == mBackgroundResource) {
73889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
73899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
73909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
73919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Drawable d= null;
73929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (resid != 0) {
73939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            d = mResources.getDrawable(resid);
73949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
73959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setBackgroundDrawable(d);
73969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
73979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBackgroundResource = resid;
73989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
73999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
74009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
74019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set the background to a given Drawable, or remove the background. If the
74029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * background has padding, this View's padding is set to the background's
74039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * padding. However, when a background is removed, this View's padding isn't
74049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * touched. If setting the padding is desired, please use
74059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #setPadding(int, int, int, int)}.
74069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
74079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param d The Drawable to use as the background, or null to remove the
74089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        background
74099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
74109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setBackgroundDrawable(Drawable d) {
74119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean requestLayout = false;
74129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
74139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBackgroundResource = 0;
74149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
74159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /*
74169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Regardless of whether we're setting a new background or not, we want
74179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * to clear the previous drawable.
74189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
74199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mBGDrawable != null) {
74209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mBGDrawable.setCallback(null);
74219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            unscheduleDrawable(mBGDrawable);
74229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
74239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
74249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (d != null) {
74259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Rect padding = sThreadLocal.get();
74269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (padding == null) {
74279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                padding = new Rect();
74289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sThreadLocal.set(padding);
74299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
74309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (d.getPadding(padding)) {
74319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                setPadding(padding.left, padding.top, padding.right, padding.bottom);
74329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
74339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
74349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Compare the minimum sizes of the old Drawable and the new.  If there isn't an old or
74359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // if it has a different minimum size, we should layout again
74369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mBGDrawable == null || mBGDrawable.getMinimumHeight() != d.getMinimumHeight() ||
74379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mBGDrawable.getMinimumWidth() != d.getMinimumWidth()) {
74389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                requestLayout = true;
74399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
74409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
74419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            d.setCallback(this);
74429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (d.isStateful()) {
74439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                d.setState(getDrawableState());
74449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
74459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            d.setVisible(getVisibility() == VISIBLE, false);
74469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mBGDrawable = d;
74479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
74489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((mPrivateFlags & SKIP_DRAW) != 0) {
74499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPrivateFlags &= ~SKIP_DRAW;
74509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPrivateFlags |= ONLY_DRAWS_BACKGROUND;
74519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                requestLayout = true;
74529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
74539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
74549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /* Remove the background */
74559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mBGDrawable = null;
74569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
74579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((mPrivateFlags & ONLY_DRAWS_BACKGROUND) != 0) {
74589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /*
74599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * This view ONLY drew the background before and we're removing
74609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * the background, so now it won't draw anything
74619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * (hence we SKIP_DRAW)
74629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
74639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPrivateFlags &= ~ONLY_DRAWS_BACKGROUND;
74649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPrivateFlags |= SKIP_DRAW;
74659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
74669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
74679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /*
74689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * When the background is set, we try to apply its padding to this
74699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * View. When the background is removed, we don't touch this View's
74709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * padding. This is noted in the Javadocs. Hence, we don't need to
74719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * requestLayout(), the invalidate() below is sufficient.
74729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
74739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
74749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // The old background's minimum size could have affected this
74759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // View's layout, so let's requestLayout
74769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            requestLayout = true;
74779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
74789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
74798f1344f5e7c92f2fd532f65e5584afe0e4cc6b11Romain Guy        computeOpaqueFlags();
74808f1344f5e7c92f2fd532f65e5584afe0e4cc6b11Romain Guy
74819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (requestLayout) {
74829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            requestLayout();
74839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
74849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
74859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBackgroundSizeChanged = true;
74869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        invalidate();
74879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
74889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
74899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
74909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Gets the background drawable
74919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The drawable used as the background for this view, if any.
74929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
74939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Drawable getBackground() {
74949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mBGDrawable;
74959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
74969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
74979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
74989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the padding. The view may add on the space required to display
74999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the scrollbars, depending on the style and visibility of the scrollbars.
75009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * So the values returned from {@link #getPaddingLeft}, {@link #getPaddingTop},
75019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #getPaddingRight} and {@link #getPaddingBottom} may be different
75029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * from the values set in this call.
75039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
75049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @attr ref android.R.styleable#View_padding
75059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @attr ref android.R.styleable#View_paddingBottom
75069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @attr ref android.R.styleable#View_paddingLeft
75079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @attr ref android.R.styleable#View_paddingRight
75089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @attr ref android.R.styleable#View_paddingTop
75099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param left the left padding in pixels
75109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param top the top padding in pixels
75119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param right the right padding in pixels
75129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param bottom the bottom padding in pixels
75139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
75149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setPadding(int left, int top, int right, int bottom) {
75159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean changed = false;
75169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
75179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUserPaddingRight = right;
75189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUserPaddingBottom = bottom;
75199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7520b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project        final int viewFlags = mViewFlags;
75218506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
7522b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project        // Common case is there are no scroll bars.
7523b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project        if ((viewFlags & (SCROLLBARS_VERTICAL|SCROLLBARS_HORIZONTAL)) != 0) {
7524b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project            // TODO: Deal with RTL languages to adjust left padding instead of right.
7525b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project            if ((viewFlags & SCROLLBARS_VERTICAL) != 0) {
7526b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project                right += (viewFlags & SCROLLBARS_INSET_MASK) == 0
7527b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project                        ? 0 : getVerticalScrollbarWidth();
7528b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project            }
7529b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project            if ((viewFlags & SCROLLBARS_HORIZONTAL) == 0) {
7530b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project                bottom += (viewFlags & SCROLLBARS_INSET_MASK) == 0
7531b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project                        ? 0 : getHorizontalScrollbarHeight();
7532b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project            }
7533b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project        }
75348506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
7535b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project        if (mPaddingLeft != left) {
75369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            changed = true;
75379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPaddingLeft = left;
75389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
75399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPaddingTop != top) {
75409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            changed = true;
75419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPaddingTop = top;
75429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7543b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project        if (mPaddingRight != right) {
75449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            changed = true;
7545b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project            mPaddingRight = right;
75469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7547b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project        if (mPaddingBottom != bottom) {
75489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            changed = true;
7549b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project            mPaddingBottom = bottom;
75509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
75519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
75529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (changed) {
75539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            requestLayout();
75549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
75559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
75569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
75579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
75589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the top padding of this view.
75599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
75609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the top padding in pixels
75619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
75629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getPaddingTop() {
75639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mPaddingTop;
75649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
75659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
75669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
75679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the bottom padding of this view. If there are inset and enabled
75689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * scrollbars, this value may include the space required to display the
75699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * scrollbars as well.
75709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
75719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the bottom padding in pixels
75729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
75739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getPaddingBottom() {
75749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mPaddingBottom;
75759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
75769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
75779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
75789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the left padding of this view. If there are inset and enabled
75799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * scrollbars, this value may include the space required to display the
75809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * scrollbars as well.
75819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
75829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the left padding in pixels
75839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
75849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getPaddingLeft() {
75859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mPaddingLeft;
75869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
75879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
75889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
75899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the right padding of this view. If there are inset and enabled
75909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * scrollbars, this value may include the space required to display the
75919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * scrollbars as well.
75929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
75939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the right padding in pixels
75949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
75959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getPaddingRight() {
75969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mPaddingRight;
75979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
75989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
75999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
76009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Changes the selection state of this view. A view can be selected or not.
76019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Note that selection is not the same as focus. Views are typically
76029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * selected in the context of an AdapterView like ListView or GridView;
76039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the selected view is the view that is highlighted.
76049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
76059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param selected true if the view must be selected, false otherwise
76069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
76079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setSelected(boolean selected) {
76089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (((mPrivateFlags & SELECTED) != 0) != selected) {
76099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPrivateFlags = (mPrivateFlags & ~SELECTED) | (selected ? SELECTED : 0);
7610a2431d0ba24ca7d79d21b2df63f9a58025702c7eRomain Guy            if (!selected) resetPressedState();
76119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            invalidate();
76129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            refreshDrawableState();
76139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            dispatchSetSelected(selected);
76149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
76159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
76169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
76179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
76189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Dispatch setSelected to all of this View's children.
76199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
76209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setSelected(boolean)
76219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
76229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param selected The new selected state
76239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
76249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void dispatchSetSelected(boolean selected) {
76259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
76269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
76279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
76289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Indicates the selection state of this view.
76299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
76309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return true if the view is selected, false otherwise
76319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
76329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @ViewDebug.ExportedProperty
76339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isSelected() {
76349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (mPrivateFlags & SELECTED) != 0;
76359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
76369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
76379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
76389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the ViewTreeObserver for this view's hierarchy. The view tree
76399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * observer can be used to get notifications when global events, like
76409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * layout, happen.
76419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
76429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The returned ViewTreeObserver observer is not guaranteed to remain
76439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * valid for the lifetime of this View. If the caller of this method keeps
76449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * a long-lived reference to ViewTreeObserver, it should always check for
76459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the return value of {@link ViewTreeObserver#isAlive()}.
76469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
76479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The ViewTreeObserver for this view's hierarchy.
76489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
76499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ViewTreeObserver getViewTreeObserver() {
76509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mAttachInfo != null) {
76519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mAttachInfo.mTreeObserver;
76529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
76539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mFloatingTreeObserver == null) {
76549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mFloatingTreeObserver = new ViewTreeObserver();
76559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
76569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mFloatingTreeObserver;
76579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
76589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
76599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
76609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Finds the topmost view in the current view hierarchy.</p>
76619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
76629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the topmost view containing this view
76639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
76649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public View getRootView() {
76659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mAttachInfo != null) {
76669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final View v = mAttachInfo.mRootView;
76679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (v != null) {
76689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return v;
76699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
76709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
76718506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
76729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        View parent = this;
76739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
76749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (parent.mParent != null && parent.mParent instanceof View) {
76759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            parent = (View) parent.mParent;
76769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
76779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
76789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return parent;
76799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
76809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
76819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
76829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Computes the coordinates of this view on the screen. The argument
76839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * must be an array of two integers. After the method returns, the array
76849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * contains the x and y location in that order.</p>
76859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
76869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param location an array of two integers in which to hold the coordinates
76879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
76889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void getLocationOnScreen(int[] location) {
76899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        getLocationInWindow(location);
76909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
76919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final AttachInfo info = mAttachInfo;
7692779398e7eb462ca1562eee50a919305849582e08Romain Guy        if (info != null) {
7693779398e7eb462ca1562eee50a919305849582e08Romain Guy            location[0] += info.mWindowLeft;
7694779398e7eb462ca1562eee50a919305849582e08Romain Guy            location[1] += info.mWindowTop;
7695779398e7eb462ca1562eee50a919305849582e08Romain Guy        }
76969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
76979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
76989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
76999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Computes the coordinates of this view in its window. The argument
77009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * must be an array of two integers. After the method returns, the array
77019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * contains the x and y location in that order.</p>
77029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
77039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param location an array of two integers in which to hold the coordinates
77049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
77059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void getLocationInWindow(int[] location) {
77069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (location == null || location.length < 2) {
77079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new IllegalArgumentException("location must be an array of "
77089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + "two integers");
77099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
77109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
77119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        location[0] = mLeft;
77129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        location[1] = mTop;
77139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
77149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ViewParent viewParent = mParent;
77159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (viewParent instanceof View) {
77169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final View view = (View)viewParent;
77179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            location[0] += view.mLeft - view.mScrollX;
77189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            location[1] += view.mTop - view.mScrollY;
77199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            viewParent = view.mParent;
77209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
77218506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
77229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (viewParent instanceof ViewRoot) {
77239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // *cough*
77249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final ViewRoot vr = (ViewRoot)viewParent;
77259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            location[1] -= vr.mCurScrollY;
77269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
77279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
77289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
77299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
77309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
77319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param id the id of the view to be found
77329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the view of the specified id, null if cannot be found
77339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
77349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected View findViewTraversal(int id) {
77359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (id == mID) {
77369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return this;
77379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
77389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
77399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
77409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
77419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
77429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
77439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param tag the tag of the view to be found
77449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the view of specified tag, null if cannot be found
77459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
77469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected View findViewWithTagTraversal(Object tag) {
77479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (tag != null && tag.equals(mTag)) {
77489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return this;
77499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
77509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
77519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
77529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
77539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
77549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Look for a child view with the given id.  If this view has the given
77559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * id, return this view.
77569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
77579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param id The id to search for.
77589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The view that has the given id in the hierarchy or null
77599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
77609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final View findViewById(int id) {
77619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (id < 0) {
77629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
77639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
77649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return findViewTraversal(id);
77659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
77669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
77679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
77689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Look for a child view with the given tag.  If this view has the given
77699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * tag, return this view.
77709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
77719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param tag The tag to search for, using "tag.equals(getTag())".
77729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The View that has the given tag in the hierarchy or null
77739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
77749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final View findViewWithTag(Object tag) {
77759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (tag == null) {
77769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
77779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
77789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return findViewWithTagTraversal(tag);
77799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
77809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
77819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
77829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the identifier for this view. The identifier does not have to be
77839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * unique in this view's hierarchy. The identifier should be a positive
77849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * number.
77859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
77869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #NO_ID
77879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getId
77889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #findViewById
77899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
77909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param id a number used to identify the view
77919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
77929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @attr ref android.R.styleable#View_id
77939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
77949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setId(int id) {
77959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mID = id;
77969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
77979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
77989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
77999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
78009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
78019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param isRoot true if the view belongs to the root namespace, false
78029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        otherwise
78039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
78049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setIsRootNamespace(boolean isRoot) {
78059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (isRoot) {
78069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPrivateFlags |= IS_ROOT_NAMESPACE;
78079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
78089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPrivateFlags &= ~IS_ROOT_NAMESPACE;
78099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
78109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
78119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
78129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
78139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
78149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
78159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return true if the view belongs to the root namespace, false otherwise
78169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
78179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isRootNamespace() {
78189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (mPrivateFlags&IS_ROOT_NAMESPACE) != 0;
78199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
78209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
78219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
78229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns this view's identifier.
78239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
78249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return a positive integer used to identify the view or {@link #NO_ID}
78259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         if the view has no ID
78269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
78279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setId
78289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #findViewById
78299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @attr ref android.R.styleable#View_id
78309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
78319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @ViewDebug.CapturedViewProperty
78329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getId() {
78339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mID;
78349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
78359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
78369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
78379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns this view's tag.
78389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
78399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the Object stored in this view as a tag
7840d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy     *
7841d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy     * @see #setTag(Object)
7842d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy     * @see #getTag(int)
78439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
78449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @ViewDebug.ExportedProperty
78459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Object getTag() {
78469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mTag;
78479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
78489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
78499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
78509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the tag associated with this view. A tag can be used to mark
78519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * a view in its hierarchy and does not have to be unique within the
78529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * hierarchy. Tags can also be used to store data within a view without
78539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * resorting to another data structure.
78549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
78559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param tag an Object to tag the view with
7856d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy     *
7857d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy     * @see #getTag()
7858d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy     * @see #setTag(int, Object)
78599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
78609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setTag(final Object tag) {
78619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTag = tag;
78629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
78639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
78649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
7865d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy     * Returns the tag associated with this view and the specified key.
7866d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy     *
7867d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy     * @param key The key identifying the tag
7868d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy     *
7869d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy     * @return the Object stored in this view as a tag
7870d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy     *
7871d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy     * @see #setTag(int, Object)
78728506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy     * @see #getTag()
7873d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy     */
7874d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy    public Object getTag(int key) {
7875d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy        SparseArray<Object> tags = null;
7876d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy        synchronized (sTagsLock) {
7877d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy            if (sTags != null) {
7878d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy                tags = sTags.get(this);
7879d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy            }
7880d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy        }
7881d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy
7882d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy        if (tags != null) return tags.get(key);
7883d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy        return null;
7884d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy    }
7885d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy
7886d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy    /**
7887d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy     * Sets a tag associated with this view and a key. A tag can be used
7888d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy     * to mark a view in its hierarchy and does not have to be unique within
7889d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy     * the hierarchy. Tags can also be used to store data within a view
7890d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy     * without resorting to another data structure.
7891d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy     *
7892d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy     * The specified key should be an id declared in the resources of the
7893d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy     * application to ensure it is unique. Keys identified as belonging to
7894d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy     * the Android framework or not associated with any package will cause
7895d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy     * an {@link IllegalArgumentException} to be thrown.
7896d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy     *
7897d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy     * @param key The key identifying the tag
7898d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy     * @param tag An Object to tag the view with
7899d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy     *
7900d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy     * @throws IllegalArgumentException If they specified key is not valid
7901d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy     *
7902d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy     * @see #setTag(Object)
7903d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy     * @see #getTag(int)
7904d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy     */
7905d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy    public void setTag(int key, final Object tag) {
7906d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy        // If the package id is 0x00 or 0x01, it's either an undefined package
7907d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy        // or a framework id
7908d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy        if ((key >>> 24) < 2) {
7909d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy            throw new IllegalArgumentException("The key must be an application-specific "
7910d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy                    + "resource id.");
7911d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy        }
7912d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy
7913d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy        setTagInternal(this, key, tag);
7914d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy    }
7915d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy
7916d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy    /**
7917d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy     * Variation of {@link #setTag(int, Object)} that enforces the key to be a
7918d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy     * framework id.
7919d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy     *
7920d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy     * @hide
7921d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy     */
7922d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy    public void setTagInternal(int key, Object tag) {
7923d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy        if ((key >>> 24) != 0x1) {
7924d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy            throw new IllegalArgumentException("The key must be a framework-specific "
7925d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy                    + "resource id.");
7926d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy        }
7927d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy
79288506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy        setTagInternal(this, key, tag);
7929d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy    }
7930d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy
7931d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy    private static void setTagInternal(View view, int key, Object tag) {
7932d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy        SparseArray<Object> tags = null;
7933d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy        synchronized (sTagsLock) {
7934d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy            if (sTags == null) {
7935d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy                sTags = new WeakHashMap<View, SparseArray<Object>>();
7936d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy            } else {
7937d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy                tags = sTags.get(view);
7938d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy            }
7939d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy        }
7940d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy
7941d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy        if (tags == null) {
7942d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy            tags = new SparseArray<Object>(2);
7943d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy            synchronized (sTagsLock) {
7944d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy                sTags.put(view, tags);
7945d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy            }
7946d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy        }
7947d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy
7948d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy        tags.put(key, tag);
7949d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy    }
7950d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy
7951d90a33111b3f1d0b2fff7ba9bafabc63fdb67d3aRomain Guy    /**
795213922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy     * @param consistency The type of consistency. See ViewDebug for more information.
795313922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy     *
795413922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy     * @hide
795513922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy     */
795613922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy    protected boolean dispatchConsistencyCheck(int consistency) {
795713922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy        return onConsistencyCheck(consistency);
795813922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy    }
795913922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy
796013922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy    /**
796113922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy     * Method that subclasses should implement to check their consistency. The type of
796213922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy     * consistency check is indicated by the bit field passed as a parameter.
79638506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy     *
796413922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy     * @param consistency The type of consistency. See ViewDebug for more information.
796513922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy     *
796613922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy     * @throws IllegalStateException if the view is in an inconsistent state.
796713922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy     *
796813922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy     * @hide
796913922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy     */
797013922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy    protected boolean onConsistencyCheck(int consistency) {
797113922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy        boolean result = true;
797213922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy
797313922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy        final boolean checkLayout = (consistency & ViewDebug.CONSISTENCY_LAYOUT) != 0;
797413922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy        final boolean checkDrawing = (consistency & ViewDebug.CONSISTENCY_DRAWING) != 0;
797513922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy
797613922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy        if (checkLayout) {
797713922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy            if (getParent() == null) {
797813922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy                result = false;
797913922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy                android.util.Log.d(ViewDebug.CONSISTENCY_LOG_TAG,
798013922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy                        "View " + this + " does not have a parent.");
798113922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy            }
798213922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy
798313922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy            if (mAttachInfo == null) {
798413922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy                result = false;
798513922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy                android.util.Log.d(ViewDebug.CONSISTENCY_LOG_TAG,
798613922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy                        "View " + this + " is not attached to a window.");
798713922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy            }
798813922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy        }
798913922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy
799013922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy        if (checkDrawing) {
799113922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy            // Do not check the DIRTY/DRAWN flags because views can call invalidate()
799213922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy            // from their draw() method
799313922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy
799413922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy            if ((mPrivateFlags & DRAWN) != DRAWN &&
799513922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy                    (mPrivateFlags & DRAWING_CACHE_VALID) == DRAWING_CACHE_VALID) {
799613922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy                result = false;
799713922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy                android.util.Log.d(ViewDebug.CONSISTENCY_LOG_TAG,
799813922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy                        "View " + this + " was invalidated but its drawing cache is valid.");
799913922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy            }
800013922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy        }
800113922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy
800213922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy        return result;
800313922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy    }
800413922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy
800513922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy    /**
80069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Prints information about this view in the log output, with the tag
80079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #VIEW_LOG_TAG}.
80089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
80099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
80109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
80119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void debug() {
80129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        debug(0);
80139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
80149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
80159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
80169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Prints information about this view in the log output, with the tag
80179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #VIEW_LOG_TAG}. Each line in the output is preceded with an
80189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * indentation defined by the <code>depth</code>.
80199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
80209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param depth the indentation level
80219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
80229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
80239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
80249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void debug(int depth) {
80259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String output = debugIndent(depth - 1);
80269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
80279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        output += "+ " + this;
80289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int id = getId();
80299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (id != -1) {
80309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            output += " (id=" + id + ")";
80319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
80329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Object tag = getTag();
80339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (tag != null) {
80349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            output += " (tag=" + tag + ")";
80359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
80369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Log.d(VIEW_LOG_TAG, output);
80379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
80389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((mPrivateFlags & FOCUSED) != 0) {
80399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            output = debugIndent(depth) + " FOCUSED";
80409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.d(VIEW_LOG_TAG, output);
80419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
80429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
80439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        output = debugIndent(depth);
80449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        output += "frame={" + mLeft + ", " + mTop + ", " + mRight
80459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + ", " + mBottom + "} scroll={" + mScrollX + ", " + mScrollY
80469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + "} ";
80479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Log.d(VIEW_LOG_TAG, output);
80489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
80499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPaddingLeft != 0 || mPaddingTop != 0 || mPaddingRight != 0
80509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                || mPaddingBottom != 0) {
80519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            output = debugIndent(depth);
80529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            output += "padding={" + mPaddingLeft + ", " + mPaddingTop
80539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + ", " + mPaddingRight + ", " + mPaddingBottom + "}";
80549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.d(VIEW_LOG_TAG, output);
80559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
80569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
80579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        output = debugIndent(depth);
80589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        output += "mMeasureWidth=" + mMeasuredWidth +
80599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                " mMeasureHeight=" + mMeasuredHeight;
80609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Log.d(VIEW_LOG_TAG, output);
80619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
80629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        output = debugIndent(depth);
80639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mLayoutParams == null) {
80649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            output += "BAD! no layout params";
80659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
80669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            output = mLayoutParams.debug(output);
80679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
80689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Log.d(VIEW_LOG_TAG, output);
80699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
80709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        output = debugIndent(depth);
80719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        output += "flags={";
80729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        output += View.printFlags(mViewFlags);
80739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        output += "}";
80749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Log.d(VIEW_LOG_TAG, output);
80759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
80769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        output = debugIndent(depth);
80779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        output += "privateFlags={";
80789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        output += View.printPrivateFlags(mPrivateFlags);
80799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        output += "}";
80809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Log.d(VIEW_LOG_TAG, output);
80819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
80829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
80839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
80849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Creates an string of whitespaces used for indentation.
80859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
80869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param depth the indentation level
80879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return a String containing (depth * 2 + 3) * 2 white spaces
80889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
80899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
80909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
80919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected static String debugIndent(int depth) {
80929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        StringBuilder spaces = new StringBuilder((depth * 2 + 3) * 2);
80939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < (depth * 2) + 3; i++) {
80949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            spaces.append(' ').append(' ');
80959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
80969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return spaces.toString();
80979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
80989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
80999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
81009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>Return the offset of the widget's text baseline from the widget's top
81019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * boundary. If this widget does not support baseline alignment, this
81029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * method returns -1. </p>
81039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
81049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the offset of the baseline within the widget's bounds or -1
81059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         if baseline alignment is not supported
81069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
81079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @ViewDebug.ExportedProperty
81089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getBaseline() {
81099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return -1;
81109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
81119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
81129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
81139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Call this when something has changed which has invalidated the
81149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * layout of this view. This will schedule a layout pass of the view
81159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * tree.
81169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
81179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void requestLayout() {
81189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (ViewDebug.TRACE_HIERARCHY) {
81199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ViewDebug.trace(this, ViewDebug.HierarchyTraceType.REQUEST_LAYOUT);
81209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
81219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
81229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPrivateFlags |= FORCE_LAYOUT;
81239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
81249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mParent != null && !mParent.isLayoutRequested()) {
81259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mParent.requestLayout();
81269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
81279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
81289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
81299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
81309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Forces this view to be laid out during the next layout pass.
81319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This method does not call requestLayout() or forceLayout()
81329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * on the parent.
81339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
81349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void forceLayout() {
81359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPrivateFlags |= FORCE_LAYOUT;
81369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
81379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
81389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
81399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
81409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This is called to find out how big a view should be. The parent
81419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * supplies constraint information in the width and height parameters.
81429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * </p>
81439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
81449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
81459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The actual mesurement work of a view is performed in
81469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onMeasure(int, int)}, called by this method. Therefore, only
81479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onMeasure(int, int)} can and must be overriden by subclasses.
81489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * </p>
81499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
81509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
81519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param widthMeasureSpec Horizontal space requirements as imposed by the
81529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        parent
81539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param heightMeasureSpec Vertical space requirements as imposed by the
81549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        parent
81559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
81569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #onMeasure(int, int)
81579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
81589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final void measure(int widthMeasureSpec, int heightMeasureSpec) {
81599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((mPrivateFlags & FORCE_LAYOUT) == FORCE_LAYOUT ||
81609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                widthMeasureSpec != mOldWidthMeasureSpec ||
81619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                heightMeasureSpec != mOldHeightMeasureSpec) {
81629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
81639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // first clears the measured dimension flag
81649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPrivateFlags &= ~MEASURED_DIMENSION_SET;
81659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
81669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (ViewDebug.TRACE_HIERARCHY) {
81679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ViewDebug.trace(this, ViewDebug.HierarchyTraceType.ON_MEASURE);
81689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
81699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
81709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // measure ourselves, this should set the measured dimension flag back
81719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            onMeasure(widthMeasureSpec, heightMeasureSpec);
81729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
81739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // flag not set, setMeasuredDimension() was not invoked, we raise
81749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // an exception to warn the developer
81759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((mPrivateFlags & MEASURED_DIMENSION_SET) != MEASURED_DIMENSION_SET) {
81769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                throw new IllegalStateException("onMeasure() did not set the"
81779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " measured dimension by calling"
81789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " setMeasuredDimension()");
81799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
81809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
81819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPrivateFlags |= LAYOUT_REQUIRED;
81829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
81839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
81849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOldWidthMeasureSpec = widthMeasureSpec;
81859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOldHeightMeasureSpec = heightMeasureSpec;
81869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
81879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
81889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
81899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
81909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Measure the view and its content to determine the measured width and the
81919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * measured height. This method is invoked by {@link #measure(int, int)} and
81929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * should be overriden by subclasses to provide accurate and efficient
81939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * measurement of their contents.
81949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * </p>
81959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
81969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
81979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <strong>CONTRACT:</strong> When overriding this method, you
81989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <em>must</em> call {@link #setMeasuredDimension(int, int)} to store the
81999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * measured width and height of this view. Failure to do so will trigger an
82009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <code>IllegalStateException</code>, thrown by
82019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #measure(int, int)}. Calling the superclass'
82029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #onMeasure(int, int)} is a valid use.
82039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * </p>
82049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
82059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
82069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The base class implementation of measure defaults to the background size,
82079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * unless a larger size is allowed by the MeasureSpec. Subclasses should
82089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * override {@link #onMeasure(int, int)} to provide better measurements of
82099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * their content.
82109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * </p>
82119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
82129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
82139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If this method is overridden, it is the subclass's responsibility to make
82149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * sure the measured height and width are at least the view's minimum height
82159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and width ({@link #getSuggestedMinimumHeight()} and
82169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #getSuggestedMinimumWidth()}).
82179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * </p>
82189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
82199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param widthMeasureSpec horizontal space requirements as imposed by the parent.
82209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                         The requirements are encoded with
82219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                         {@link android.view.View.MeasureSpec}.
82229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param heightMeasureSpec vertical space requirements as imposed by the parent.
82239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                         The requirements are encoded with
82249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                         {@link android.view.View.MeasureSpec}.
82259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
82269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getMeasuredWidth()
82279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getMeasuredHeight()
82289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setMeasuredDimension(int, int)
82299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getSuggestedMinimumHeight()
82309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getSuggestedMinimumWidth()
82319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.view.View.MeasureSpec#getMode(int)
82329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.view.View.MeasureSpec#getSize(int)
82339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
82349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
82359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setMeasuredDimension(getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec),
82369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec));
82379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
82389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
82399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
82409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>This mehod must be called by {@link #onMeasure(int, int)} to store the
82419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * measured width and measured height. Failing to do so will trigger an
82429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * exception at measurement time.</p>
82439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
82449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param measuredWidth the measured width of this view
82459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param measuredHeight the measured height of this view
82469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
82479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected final void setMeasuredDimension(int measuredWidth, int measuredHeight) {
82489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMeasuredWidth = measuredWidth;
82499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMeasuredHeight = measuredHeight;
82509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
82519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPrivateFlags |= MEASURED_DIMENSION_SET;
82529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
82539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
82549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
82559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Utility to reconcile a desired size with constraints imposed by a MeasureSpec.
82569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Will take the desired size, unless a different size is imposed by the constraints.
82579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
82589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param size How big the view wants to be
82599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param measureSpec Constraints imposed by the parent
82609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The size this view should be.
82619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
82629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static int resolveSize(int size, int measureSpec) {
82639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int result = size;
82649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int specMode = MeasureSpec.getMode(measureSpec);
82659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int specSize =  MeasureSpec.getSize(measureSpec);
82669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (specMode) {
82679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case MeasureSpec.UNSPECIFIED:
82689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            result = size;
82699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
82709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case MeasureSpec.AT_MOST:
82719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            result = Math.min(size, specSize);
82729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
82739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case MeasureSpec.EXACTLY:
82749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            result = specSize;
82759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
82769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
82779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return result;
82789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
82799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
82809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
82819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Utility to return a default size. Uses the supplied size if the
82829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * MeasureSpec imposed no contraints. Will get larger if allowed
82839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * by the MeasureSpec.
82849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
82859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param size Default size for this view
82869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param measureSpec Constraints imposed by the parent
82879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The size this view should be.
82889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
82899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static int getDefaultSize(int size, int measureSpec) {
82909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int result = size;
82919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int specMode = MeasureSpec.getMode(measureSpec);
82929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int specSize =  MeasureSpec.getSize(measureSpec);
82939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
82949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (specMode) {
82959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case MeasureSpec.UNSPECIFIED:
82969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            result = size;
82979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
82989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case MeasureSpec.AT_MOST:
82999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case MeasureSpec.EXACTLY:
83009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            result = specSize;
83019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
83029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
83039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return result;
83049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
83059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
83069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
83079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the suggested minimum height that the view should use. This
83089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * returns the maximum of the view's minimum height
83099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and the background's minimum height
83109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * ({@link android.graphics.drawable.Drawable#getMinimumHeight()}).
83119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
83129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * When being used in {@link #onMeasure(int, int)}, the caller should still
83139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * ensure the returned height is within the requirements of the parent.
83149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
83159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The suggested minimum height of the view.
83169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
83179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected int getSuggestedMinimumHeight() {
83189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int suggestedMinHeight = mMinHeight;
83199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
83209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mBGDrawable != null) {
83219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int bgMinHeight = mBGDrawable.getMinimumHeight();
83229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (suggestedMinHeight < bgMinHeight) {
83239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                suggestedMinHeight = bgMinHeight;
83249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
83259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
83269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
83279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return suggestedMinHeight;
83289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
83299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
83309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
83319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the suggested minimum width that the view should use. This
83329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * returns the maximum of the view's minimum width)
83339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * and the background's minimum width
83349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *  ({@link android.graphics.drawable.Drawable#getMinimumWidth()}).
83359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
83369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * When being used in {@link #onMeasure(int, int)}, the caller should still
83379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * ensure the returned width is within the requirements of the parent.
83389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
83399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The suggested minimum width of the view.
83409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
83419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected int getSuggestedMinimumWidth() {
83429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int suggestedMinWidth = mMinWidth;
83439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
83449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mBGDrawable != null) {
83459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int bgMinWidth = mBGDrawable.getMinimumWidth();
83469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (suggestedMinWidth < bgMinWidth) {
83479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                suggestedMinWidth = bgMinWidth;
83489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
83499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
83509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
83519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return suggestedMinWidth;
83529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
83539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
83549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
83559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the minimum height of the view. It is not guaranteed the view will
83569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * be able to achieve this minimum height (for example, if its parent layout
83579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * constrains it with less available height).
83589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
83599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param minHeight The minimum height the view will try to be.
83609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
83619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setMinimumHeight(int minHeight) {
83629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMinHeight = minHeight;
83639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
83649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
83659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
83669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the minimum width of the view. It is not guaranteed the view will
83679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * be able to achieve this minimum width (for example, if its parent layout
83689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * constrains it with less available width).
83699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
83709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param minWidth The minimum width the view will try to be.
83719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
83729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setMinimumWidth(int minWidth) {
83739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mMinWidth = minWidth;
83749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
83759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
83769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
83779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Get the animation currently associated with this view.
83789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
83799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The animation that is currently playing or
83809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *         scheduled to play for this view.
83819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
83829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Animation getAnimation() {
83839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mCurrentAnimation;
83849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
83859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
83869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
83879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Start the specified animation now.
83889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
83899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param animation the animation to start now
83909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
83919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void startAnimation(Animation animation) {
83929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        animation.setStartTime(Animation.START_ON_FIRST_FRAME);
83939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setAnimation(animation);
83949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        invalidate();
83959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
83969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
83979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
83989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Cancels any animations for this view.
83999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
84009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void clearAnimation() {
8401305a2eb8e5957a4f3db2734a8918faf1a39fb9a4Romain Guy        if (mCurrentAnimation != null) {
8402b4a107d8269d1a75b8f270e0516c1fa3b517f8f9Romain Guy            mCurrentAnimation.detach();
8403305a2eb8e5957a4f3db2734a8918faf1a39fb9a4Romain Guy        }
84049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCurrentAnimation = null;
84059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
84069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
84079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
84089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the next animation to play for this view.
84099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If you want the animation to play immediately, use
84109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * startAnimation. This method provides allows fine-grained
84119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * control over the start time and invalidation, but you
84129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * must make sure that 1) the animation has a start time set, and
84139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * 2) the view will be invalidated when the animation is supposed to
84149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * start.
84159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
84169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param animation The next animation, or null.
84179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
84189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setAnimation(Animation animation) {
84199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCurrentAnimation = animation;
84209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (animation != null) {
84219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            animation.reset();
84229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
84239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
84249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
84259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
84269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Invoked by a parent ViewGroup to notify the start of the animation
84279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * currently associated with this view. If you override this method,
84289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * always call super.onAnimationStart();
84299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
84309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setAnimation(android.view.animation.Animation)
84319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getAnimation()
84329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
84339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onAnimationStart() {
84349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPrivateFlags |= ANIMATION_STARTED;
84359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
84369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
84379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
84389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Invoked by a parent ViewGroup to notify the end of the animation
84399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * currently associated with this view. If you override this method,
84409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * always call super.onAnimationEnd();
84419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
84429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setAnimation(android.view.animation.Animation)
84439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getAnimation()
84449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
84459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void onAnimationEnd() {
84469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPrivateFlags &= ~ANIMATION_STARTED;
84479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
84489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
84499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
84509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Invoked if there is a Transform that involves alpha. Subclass that can
84519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * draw themselves with the specified alpha should return true, and then
84529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * respect that alpha when their onDraw() is called. If this returns false
84539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * then the view may be redirected to draw into an offscreen buffer to
84549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * fulfill the request, which will look fine, but may be slower than if the
84559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * subclass handles it internally. The default implementation returns false.
84569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
84579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param alpha The alpha (0..255) to apply to the view's drawing
84589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return true if the view can draw with the specified alpha.
84599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
84609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected boolean onSetAlpha(int alpha) {
84619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return false;
84629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
84639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
84649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
84659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This is used by the RootView to perform an optimization when
84669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the view hierarchy contains one or several SurfaceView.
84679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * SurfaceView is always considered transparent, but its children are not,
84689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * therefore all View objects remove themselves from the global transparent
84699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * region (passed as a parameter to this function).
84709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
84719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param region The transparent region for this ViewRoot (window).
84729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
84739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Returns true if the effective visibility of the view at this
84749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * point is opaque, regardless of the transparent region; returns false
84759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * if it is possible for underlying windows to be seen behind the view.
84769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
84779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
84789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
84799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean gatherTransparentRegion(Region region) {
84809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final AttachInfo attachInfo = mAttachInfo;
84819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (region != null && attachInfo != null) {
84829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int pflags = mPrivateFlags;
84839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((pflags & SKIP_DRAW) == 0) {
84849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // The SKIP_DRAW flag IS NOT set, so this view draws. We need to
84859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // remove it from the transparent region.
84869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int[] location = attachInfo.mTransparentLocation;
84879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                getLocationInWindow(location);
84889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                region.op(location[0], location[1], location[0] + mRight - mLeft,
84899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        location[1] + mBottom - mTop, Region.Op.DIFFERENCE);
84909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if ((pflags & ONLY_DRAWS_BACKGROUND) != 0 && mBGDrawable != null) {
84919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // The ONLY_DRAWS_BACKGROUND flag IS set and the background drawable
84929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // exists, so we remove the background drawable's non-transparent
84939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // parts from this transparent region.
84949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                applyDrawableToTransparentRegion(mBGDrawable, region);
84959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
84969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
84979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return true;
84989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
84999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
85009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
85019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Play a sound effect for this view.
85029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
85039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>The framework will play sound effects for some built in actions, such as
85049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * clicking, but you may wish to play these effects in your widget,
85059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * for instance, for internal navigation.
85069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
85079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>The sound effect will only be played if sound effects are enabled by the user, and
85089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #isSoundEffectsEnabled()} is true.
85099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
85109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param soundConstant One of the constants defined in {@link SoundEffectConstants}
85119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
85129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void playSoundEffect(int soundConstant) {
85139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mAttachInfo == null || mAttachInfo.mRootCallbacks == null || !isSoundEffectsEnabled()) {
85149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
85159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
85169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAttachInfo.mRootCallbacks.playSoundEffect(soundConstant);
85179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
85189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
85199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8520f8a7ceaef2e7d5cd530c9426bde91b6fa9a40b75Andy Stadler     * BZZZTT!!1!
85218506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy     *
8522f8a7ceaef2e7d5cd530c9426bde91b6fa9a40b75Andy Stadler     * <p>Provide haptic feedback to the user for this view.
85239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
85249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>The framework will provide haptic feedback for some built in actions,
85259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * such as long presses, but you may wish to provide feedback for your
85269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * own widget.
85279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
85289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>The feedback will only be performed if
85299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link #isHapticFeedbackEnabled()} is true.
85309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
85319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param feedbackConstant One of the constants defined in
85329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link HapticFeedbackConstants}
85339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
85349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean performHapticFeedback(int feedbackConstant) {
85359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return performHapticFeedback(feedbackConstant, 0);
85369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
85379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
85389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8539f8a7ceaef2e7d5cd530c9426bde91b6fa9a40b75Andy Stadler     * BZZZTT!!1!
85408506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy     *
8541f8a7ceaef2e7d5cd530c9426bde91b6fa9a40b75Andy Stadler     * <p>Like {@link #performHapticFeedback(int)}, with additional options.
85429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
85439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param feedbackConstant One of the constants defined in
85449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link HapticFeedbackConstants}
85459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param flags Additional flags as per {@link HapticFeedbackConstants}.
85469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
85479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean performHapticFeedback(int feedbackConstant, int flags) {
85489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mAttachInfo == null) {
85499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
85509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
85519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((flags&HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING) == 0
85529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                && !isHapticFeedbackEnabled()) {
85539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return false;
85549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
85559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mAttachInfo.mRootCallbacks.performHapticFeedback(
85569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                feedbackConstant,
85579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                (flags&HapticFeedbackConstants.FLAG_IGNORE_GLOBAL_SETTING) != 0);
85589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
85599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
85609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8561ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn     * This needs to be a better API (NOT ON VIEW) before it is exposed.  If
8562ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn     * it is ever exposed at all.
856329e4a3c566f435c32f0b95e4ac8e8b33cac6fabaDianne Hackborn     * @hide
8564ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn     */
8565ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn    public void onCloseSystemDialogs(String reason) {
8566ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn    }
8567ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn
8568ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn    /**
85699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Given a Drawable whose bounds have been set to draw into this view,
85709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * update a Region being computed for {@link #gatherTransparentRegion} so
85719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * that any non-transparent parts of the Drawable are removed from the
85729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * given transparent region.
85739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
85749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param dr The Drawable whose transparency is to be applied to the region.
85759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param region A Region holding the current transparency information,
85769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * where any parts of the region that are set are considered to be
85779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * transparent.  On return, this region will be modified to have the
85789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * transparency information reduced by the corresponding parts of the
85799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Drawable that are not transparent.
85809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@hide}
85819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
85829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void applyDrawableToTransparentRegion(Drawable dr, Region region) {
85839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (DBG) {
85849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.i("View", "Getting transparent region for: " + this);
85859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
85869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final Region r = dr.getTransparentRegion();
85879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final Rect db = dr.getBounds();
85889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final AttachInfo attachInfo = mAttachInfo;
85899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (r != null && attachInfo != null) {
85909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int w = getRight()-getLeft();
85919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int h = getBottom()-getTop();
85929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (db.left > 0) {
85939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                //Log.i("VIEW", "Drawable left " + db.left + " > view 0");
85949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                r.op(0, 0, db.left, h, Region.Op.UNION);
85959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
85969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (db.right < w) {
85979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                //Log.i("VIEW", "Drawable right " + db.right + " < view " + w);
85989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                r.op(db.right, 0, w, h, Region.Op.UNION);
85999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
86009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (db.top > 0) {
86019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                //Log.i("VIEW", "Drawable top " + db.top + " > view 0");
86029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                r.op(0, 0, w, db.top, Region.Op.UNION);
86039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
86049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (db.bottom < h) {
86059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                //Log.i("VIEW", "Drawable bottom " + db.bottom + " < view " + h);
86069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                r.op(0, db.bottom, w, h, Region.Op.UNION);
86079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
86089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int[] location = attachInfo.mTransparentLocation;
86099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            getLocationInWindow(location);
86109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            r.translate(location[0], location[1]);
86119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            region.op(r, Region.Op.INTERSECT);
86129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
86139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            region.op(db, Region.Op.DIFFERENCE);
86149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
86159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
86169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8617e14579bac59aa84523c2bfbfc3f28c7842ec664dAdam Powell    private void postCheckForLongClick(int delayOffset) {
86189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mHasPerformedLongPress = false;
86199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
86209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPendingCheckForLongPress == null) {
86219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPendingCheckForLongPress = new CheckForLongPress();
86229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
86239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPendingCheckForLongPress.rememberWindowAttachCount();
8624e14579bac59aa84523c2bfbfc3f28c7842ec664dAdam Powell        postDelayed(mPendingCheckForLongPress,
8625e14579bac59aa84523c2bfbfc3f28c7842ec664dAdam Powell                ViewConfiguration.getLongPressTimeout() - delayOffset);
86269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
86279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
86289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static int[] stateSetUnion(final int[] stateSet1,
86299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                       final int[] stateSet2) {
86309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int stateSet1Length = stateSet1.length;
86319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int stateSet2Length = stateSet2.length;
86329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int[] newSet = new int[stateSet1Length + stateSet2Length];
86339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int k = 0;
86349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int i = 0;
86359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int j = 0;
86369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // This is a merge of the two input state sets and assumes that the
86379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // input sets are sorted by the order imposed by ViewDrawableStates.
86389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int viewState : R.styleable.ViewDrawableStates) {
86399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (i < stateSet1Length && stateSet1[i] == viewState) {
86409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                newSet[k++] = viewState;
86419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                i++;
86429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (j < stateSet2Length && stateSet2[j] == viewState) {
86439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                newSet[k++] = viewState;
86449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                j++;
86459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
86469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (k > 1) {
86479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                assert(newSet[k - 1] > newSet[k - 2]);
86489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
86499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
86509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return newSet;
86519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
86529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
86539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
86549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Inflate a view from an XML resource.  This convenience method wraps the {@link
86559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * LayoutInflater} class, which provides a full range of options for view inflation.
86569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
86579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param context The Context object for your activity or application.
86589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param resource The resource ID to inflate
86599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param root A view group that will be the parent.  Used to properly inflate the
86609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * layout_* parameters.
86619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see LayoutInflater
86629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
86639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static View inflate(Context context, int resource, ViewGroup root) {
86649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        LayoutInflater factory = LayoutInflater.from(context);
86659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return factory.inflate(resource, root);
86669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8667a440b002aa59e1455bdfa2c5a1ca51c74bbc19acRomain Guy
86689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
86699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * A MeasureSpec encapsulates the layout requirements passed from parent to child.
86709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Each MeasureSpec represents a requirement for either the width or the height.
86719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * A MeasureSpec is comprised of a size and a mode. There are three possible
86729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * modes:
86739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <dl>
86749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <dt>UNSPECIFIED</dt>
86759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <dd>
86769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The parent has not imposed any constraint on the child. It can be whatever size
86779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * it wants.
86789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * </dd>
86799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
86809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <dt>EXACTLY</dt>
86819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <dd>
86829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The parent has determined an exact size for the child. The child is going to be
86839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * given those bounds regardless of how big it wants to be.
86849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * </dd>
86859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
86869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <dt>AT_MOST</dt>
86879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <dd>
86889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The child can be as large as it wants up to the specified size.
86899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * </dd>
86909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * </dl>
86919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
86929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * MeasureSpecs are implemented as ints to reduce object allocation. This class
86939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is provided to pack and unpack the &lt;size, mode&gt; tuple into the int.
86949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
86959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static class MeasureSpec {
86969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private static final int MODE_SHIFT = 30;
86979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private static final int MODE_MASK  = 0x3 << MODE_SHIFT;
86989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
86999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
87009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Measure specification mode: The parent has not imposed any constraint
87019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * on the child. It can be whatever size it wants.
87029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
87039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int UNSPECIFIED = 0 << MODE_SHIFT;
87049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
87059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
87069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Measure specification mode: The parent has determined an exact size
87079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * for the child. The child is going to be given those bounds regardless
87089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * of how big it wants to be.
87099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
87109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int EXACTLY     = 1 << MODE_SHIFT;
87119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
87129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
87139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Measure specification mode: The child can be as large as it wants up
87149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * to the specified size.
87159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
87169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final int AT_MOST     = 2 << MODE_SHIFT;
87179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
87189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
87199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Creates a measure specification based on the supplied size and mode.
87209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
87219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The mode must always be one of the following:
87229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <ul>
87239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *  <li>{@link android.view.View.MeasureSpec#UNSPECIFIED}</li>
87249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *  <li>{@link android.view.View.MeasureSpec#EXACTLY}</li>
87259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *  <li>{@link android.view.View.MeasureSpec#AT_MOST}</li>
87269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * </ul>
87279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
87289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param size the size of the measure specification
87299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param mode the mode of the measure specification
87309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @return the measure specification based on size and mode
87319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
87329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static int makeMeasureSpec(int size, int mode) {
87339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return size + mode;
87349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
87359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
87369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
87379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Extracts the mode from the supplied measure specification.
87389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
87399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param measureSpec the measure specification to extract the mode from
87409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @return {@link android.view.View.MeasureSpec#UNSPECIFIED},
87419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *         {@link android.view.View.MeasureSpec#AT_MOST} or
87429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *         {@link android.view.View.MeasureSpec#EXACTLY}
87439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
87449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static int getMode(int measureSpec) {
87459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return (measureSpec & MODE_MASK);
87469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
87479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
87489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
87499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Extracts the size from the supplied measure specification.
87509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
87519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param measureSpec the measure specification to extract the size from
87529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @return the size in pixels defined in the supplied measure specification
87539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
87549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static int getSize(int measureSpec) {
87559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return (measureSpec & ~MODE_MASK);
87569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
87579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
87589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
87599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Returns a String representation of the specified measure
87609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * specification.
87619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
87629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param measureSpec the measure specification to convert to a String
87639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @return a String with the following format: "MeasureSpec: MODE SIZE"
87649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
87659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static String toString(int measureSpec) {
87669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mode = getMode(measureSpec);
87679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int size = getSize(measureSpec);
87689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
87699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            StringBuilder sb = new StringBuilder("MeasureSpec: ");
87709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
87719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mode == UNSPECIFIED)
87729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sb.append("UNSPECIFIED ");
87739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            else if (mode == EXACTLY)
87749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sb.append("EXACTLY ");
87759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            else if (mode == AT_MOST)
87769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sb.append("AT_MOST ");
87779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            else
87789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sb.append(mode).append(" ");
87799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
87809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sb.append(size);
87819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return sb.toString();
87829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
87839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
87849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
87859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    class CheckForLongPress implements Runnable {
87869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
87879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private int mOriginalWindowAttachCount;
87889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
87899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void run() {
8790105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            if (isPressed() && (mParent != null)
87919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    && mOriginalWindowAttachCount == mWindowAttachCount) {
87929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (performLongClick()) {
87939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mHasPerformedLongPress = true;
87949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
87959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
87969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
87979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
87989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void rememberWindowAttachCount() {
87999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mOriginalWindowAttachCount = mWindowAttachCount;
88009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
88019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8802e14579bac59aa84523c2bfbfc3f28c7842ec664dAdam Powell
8803e14579bac59aa84523c2bfbfc3f28c7842ec664dAdam Powell    private final class CheckForTap implements Runnable {
8804e14579bac59aa84523c2bfbfc3f28c7842ec664dAdam Powell        public void run() {
8805e14579bac59aa84523c2bfbfc3f28c7842ec664dAdam Powell            mPrivateFlags &= ~PREPRESSED;
8806e14579bac59aa84523c2bfbfc3f28c7842ec664dAdam Powell            mPrivateFlags |= PRESSED;
8807e14579bac59aa84523c2bfbfc3f28c7842ec664dAdam Powell            refreshDrawableState();
8808e14579bac59aa84523c2bfbfc3f28c7842ec664dAdam Powell            if ((mViewFlags & LONG_CLICKABLE) == LONG_CLICKABLE) {
8809e14579bac59aa84523c2bfbfc3f28c7842ec664dAdam Powell                postCheckForLongClick(ViewConfiguration.getTapTimeout());
8810e14579bac59aa84523c2bfbfc3f28c7842ec664dAdam Powell            }
8811e14579bac59aa84523c2bfbfc3f28c7842ec664dAdam Powell        }
8812e14579bac59aa84523c2bfbfc3f28c7842ec664dAdam Powell    }
88139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8814a35d7687dda3617b5b8cd4e8876d620223dd1613Adam Powell    private final class PerformClick implements Runnable {
8815a35d7687dda3617b5b8cd4e8876d620223dd1613Adam Powell        public void run() {
8816a35d7687dda3617b5b8cd4e8876d620223dd1613Adam Powell            performClick();
8817a35d7687dda3617b5b8cd4e8876d620223dd1613Adam Powell        }
8818a35d7687dda3617b5b8cd4e8876d620223dd1613Adam Powell    }
8819a35d7687dda3617b5b8cd4e8876d620223dd1613Adam Powell
88209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
88219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Interface definition for a callback to be invoked when a key event is
88229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * dispatched to this view. The callback will be invoked before the key
88239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * event is given to the view.
88249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
88259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public interface OnKeyListener {
88269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
88279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Called when a key is dispatched to a view. This allows listeners to
88289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * get a chance to respond before the target view.
88299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
88309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param v The view the key has been dispatched to.
88319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param keyCode The code for the physical key that was pressed
88329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param event The KeyEvent object containing full information about
88339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *        the event.
88349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @return True if the listener has consumed the event, false otherwise.
88359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
88369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean onKey(View v, int keyCode, KeyEvent event);
88379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
88389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
88399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
88409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Interface definition for a callback to be invoked when a touch event is
88419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * dispatched to this view. The callback will be invoked before the touch
88429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * event is given to the view.
88439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
88449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public interface OnTouchListener {
88459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
88469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Called when a touch event is dispatched to a view. This allows listeners to
88479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * get a chance to respond before the target view.
88489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
88499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param v The view the touch event has been dispatched to.
88509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param event The MotionEvent object containing full information about
88519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *        the event.
88529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @return True if the listener has consumed the event, false otherwise.
88539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
88549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean onTouch(View v, MotionEvent event);
88559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
88569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
88579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
88589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Interface definition for a callback to be invoked when a view has been clicked and held.
88599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
88609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public interface OnLongClickListener {
88619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
88629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Called when a view has been clicked and held.
88639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
88649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param v The view that was clicked and held.
88659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
88669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * return True if the callback consumed the long click, false otherwise
88679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
88689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean onLongClick(View v);
88699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
88709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
88719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
88729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Interface definition for a callback to be invoked when the focus state of
88739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * a view changed.
88749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
88759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public interface OnFocusChangeListener {
88769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
88779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Called when the focus state of a view has changed.
88789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
88799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param v The view whose state has changed.
88809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param hasFocus The new focus state of v.
88819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
88829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void onFocusChange(View v, boolean hasFocus);
88839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
88849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
88859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
88869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Interface definition for a callback to be invoked when a view is clicked.
88879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
88889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public interface OnClickListener {
88899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
88909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Called when a view has been clicked.
88919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
88929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param v The view that was clicked.
88939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
88949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void onClick(View v);
88959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
88969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
88979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
88989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Interface definition for a callback to be invoked when the context menu
88999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * for this view is being built.
89009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
89019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public interface OnCreateContextMenuListener {
89029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
89039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Called when the context menu for this view is being built. It is not
89049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * safe to hold onto the menu after this method returns.
89059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
89069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param menu The context menu that is being built
89079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param v The view for which the context menu is being built
89089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param menuInfo Extra information about the item for which the
89099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *            context menu should be shown. This information will vary
89109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *            depending on the class of v.
89119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
89129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo);
89139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
89149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
89159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final class UnsetPressedState implements Runnable {
89169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void run() {
89179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            setPressed(false);
89189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
89199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
89209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
89219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
89229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Base class for derived classes that want to save and restore their own
89239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * state in {@link android.view.View#onSaveInstanceState()}.
89249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
89259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static class BaseSavedState extends AbsSavedState {
89269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
89279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Constructor used when reading from a parcel. Reads the state of the superclass.
89289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
89299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param source
89309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
89319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public BaseSavedState(Parcel source) {
89329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(source);
89339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
89349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
89359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
89369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Constructor called by derived classes when creating their SavedState objects
89379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
89389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param superState The state of the superclass of this view
89399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
89409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public BaseSavedState(Parcelable superState) {
89419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            super(superState);
89429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
89439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
89449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final Parcelable.Creator<BaseSavedState> CREATOR =
89459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                new Parcelable.Creator<BaseSavedState>() {
89469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public BaseSavedState createFromParcel(Parcel in) {
89479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return new BaseSavedState(in);
89489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
89499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
89509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public BaseSavedState[] newArray(int size) {
89519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return new BaseSavedState[size];
89529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
89539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        };
89549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
89559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
89569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
89579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * A set of information given to a view when it is attached to its parent
89589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * window.
89599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
89609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static class AttachInfo {
89619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        interface Callbacks {
89629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void playSoundEffect(int effectId);
89639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean performHapticFeedback(int effectId, boolean always);
89649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
89659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
89669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
89679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * InvalidateInfo is used to post invalidate(int, int, int, int) messages
89689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * to a Handler. This class contains the target (View) to invalidate and
89699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * the coordinates of the dirty rectangle.
89709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
89719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * For performance purposes, this class also implements a pool of up to
89729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * POOL_LIMIT objects that get reused. This reduces memory allocations
89739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * whenever possible.
89749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
8975d928d6837dee4df30b06529164326722075da063Romain Guy        static class InvalidateInfo implements Poolable<InvalidateInfo> {
89769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            private static final int POOL_LIMIT = 10;
89772e9bbce84d9697a9dcccd02cec55dc485d985746Romain Guy            private static final Pool<InvalidateInfo> sPool = Pools.synchronizedPool(
89782e9bbce84d9697a9dcccd02cec55dc485d985746Romain Guy                    Pools.finitePool(new PoolableManager<InvalidateInfo>() {
8979d928d6837dee4df30b06529164326722075da063Romain Guy                        public InvalidateInfo newInstance() {
8980d928d6837dee4df30b06529164326722075da063Romain Guy                            return new InvalidateInfo();
8981d928d6837dee4df30b06529164326722075da063Romain Guy                        }
89829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8983d928d6837dee4df30b06529164326722075da063Romain Guy                        public void onAcquired(InvalidateInfo element) {
8984d928d6837dee4df30b06529164326722075da063Romain Guy                        }
8985d928d6837dee4df30b06529164326722075da063Romain Guy
8986d928d6837dee4df30b06529164326722075da063Romain Guy                        public void onReleased(InvalidateInfo element) {
8987d928d6837dee4df30b06529164326722075da063Romain Guy                        }
8988d928d6837dee4df30b06529164326722075da063Romain Guy                    }, POOL_LIMIT)
8989d928d6837dee4df30b06529164326722075da063Romain Guy            );
89909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8991d928d6837dee4df30b06529164326722075da063Romain Guy            private InvalidateInfo mNext;
89929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
89939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            View target;
89949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
89959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int left;
89969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int top;
89979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int right;
89989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int bottom;
89999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9000d928d6837dee4df30b06529164326722075da063Romain Guy            public void setNextPoolable(InvalidateInfo element) {
9001d928d6837dee4df30b06529164326722075da063Romain Guy                mNext = element;
9002d928d6837dee4df30b06529164326722075da063Romain Guy            }
90039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9004d928d6837dee4df30b06529164326722075da063Romain Guy            public InvalidateInfo getNextPoolable() {
9005d928d6837dee4df30b06529164326722075da063Romain Guy                return mNext;
9006d928d6837dee4df30b06529164326722075da063Romain Guy            }
90079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9008d928d6837dee4df30b06529164326722075da063Romain Guy            static InvalidateInfo acquire() {
9009d928d6837dee4df30b06529164326722075da063Romain Guy                return sPool.acquire();
90109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
90119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
90129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void release() {
9013d928d6837dee4df30b06529164326722075da063Romain Guy                sPool.release(this);
90149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
90159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
90169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
90179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final IWindowSession mSession;
90189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
90199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final IWindow mWindow;
90209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
90219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final IBinder mWindowToken;
90229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
90239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final Callbacks mRootCallbacks;
90249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
90259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
90269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The top view of the hierarchy.
90279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
90289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        View mRootView;
90298506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
90309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IBinder mPanelParentWindowToken;
90319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Surface mSurface;
90329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
90339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
90348506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy         * Scale factor used by the compatibility mode
90358506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy         */
90368506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy        float mApplicationScale;
90378506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
90388506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy        /**
90398506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy         * Indicates whether the application is in compatibility mode
90408506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy         */
90418506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy        boolean mScalingRequired;
90428506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
90438506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy        /**
90449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Left position of this view's window
90459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
90469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int mWindowLeft;
90479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
90489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
90499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Top position of this view's window
90509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
90519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int mWindowTop;
90529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
90539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
905435b38cefcc92f1ed599a652ac5736ab9e9e75039Romain Guy         * Indicates whether the window is translucent/transparent
905535b38cefcc92f1ed599a652ac5736ab9e9e75039Romain Guy         */
905635b38cefcc92f1ed599a652ac5736ab9e9e75039Romain Guy        boolean mTranslucentWindow;
905735b38cefcc92f1ed599a652ac5736ab9e9e75039Romain Guy
905835b38cefcc92f1ed599a652ac5736ab9e9e75039Romain Guy        /**
90599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * For windows that are full-screen but using insets to layout inside
90609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * of the screen decorations, these are the current insets for the
90619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * content of the window.
90629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
90639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final Rect mContentInsets = new Rect();
90649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
90659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
90669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * For windows that are full-screen but using insets to layout inside
90679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * of the screen decorations, these are the current insets for the
90689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * actual visible parts of the window.
90699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
90709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final Rect mVisibleInsets = new Rect();
90719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
90729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
90739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The internal insets given by this window.  This value is
90749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * supplied by the client (through
90759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * {@link ViewTreeObserver.OnComputeInternalInsetsListener}) and will
90769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * be given to the window manager when changed to be used in laying
90779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * out windows behind it.
90789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
90799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final ViewTreeObserver.InternalInsetsInfo mGivenInternalInsets
90809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                = new ViewTreeObserver.InternalInsetsInfo();
90819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
90829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
90839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * All views in the window's hierarchy that serve as scroll containers,
90849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * used to determine if the window can be resized or must be panned
90859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * to adjust for a soft input area.
90869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
90879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final ArrayList<View> mScrollContainers = new ArrayList<View>();
90889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
908983fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn        final KeyEvent.DispatcherState mKeyDispatchState
909083fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn                = new KeyEvent.DispatcherState();
909183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn
90929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
90939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Indicates whether the view's window currently has the focus.
90949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
90959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean mHasWindowFocus;
90969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
90979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
90989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The current visibility of the window.
90999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
91009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int mWindowVisibility;
91019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
91029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
91039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Indicates the time at which drawing started to occur.
91049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
91059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mDrawingTime;
91069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
91079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
91085bcdff45bf4ada77ae7c95f520b795876adef75cRomain Guy         * Indicates whether or not ignoring the DIRTY_MASK flags.
91095bcdff45bf4ada77ae7c95f520b795876adef75cRomain Guy         */
91105bcdff45bf4ada77ae7c95f520b795876adef75cRomain Guy        boolean mIgnoreDirtyState;
91115bcdff45bf4ada77ae7c95f520b795876adef75cRomain Guy
91125bcdff45bf4ada77ae7c95f520b795876adef75cRomain Guy        /**
91139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Indicates whether the view's window is currently in touch mode.
91149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
91159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean mInTouchMode;
91169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
91179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
91189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Indicates that ViewRoot should trigger a global layout change
91199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * the next time it performs a traversal
91209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
91219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean mRecomputeGlobalAttributes;
91229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
91239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
91249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Set during a traveral if any views want to keep the screen on.
91259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
91269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean mKeepScreenOn;
91279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
91289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
91299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Set if the visibility of any views has changed.
91309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
91319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean mViewVisibilityChanged;
91329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
91339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
91349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Set to true if a view has been scrolled.
91359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
91369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean mViewScrollChanged;
91379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
91389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
91399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Global to the view hierarchy used as a temporary for dealing with
91409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * x/y points in the transparent region computations.
91419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
91429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int[] mTransparentLocation = new int[2];
91439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
91449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
91459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Global to the view hierarchy used as a temporary for dealing with
91469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * x/y points in the ViewGroup.invalidateChild implementation.
91479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
91489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int[] mInvalidateChildLocation = new int[2];
91499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
91509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
91519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The view tree observer used to dispatch global events like
91529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * layout, pre-draw, touch mode change, etc.
91539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
91549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final ViewTreeObserver mTreeObserver = new ViewTreeObserver();
91559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
91569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
91579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * A Canvas used by the view hierarchy to perform bitmap caching.
91589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
91599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Canvas mCanvas;
91609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
91619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
91629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * A Handler supplied by a view's {@link android.view.ViewRoot}. This
91639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * handler can be used to pump events in the UI events queue.
91649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
91659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final Handler mHandler;
91669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
91679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
91689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Identifier for messages requesting the view to be invalidated.
91699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Such messages should be sent to {@link #mHandler}.
91709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
91719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        static final int INVALIDATE_MSG = 0x1;
91729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
91739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
91749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Identifier for messages requesting the view to invalidate a region.
91759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Such messages should be sent to {@link #mHandler}.
91769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
91779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        static final int INVALIDATE_RECT_MSG = 0x2;
91789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
91799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
91809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Temporary for use in computing invalidate rectangles while
91819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * calling up the hierarchy.
91829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
91839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final Rect mTmpInvalRect = new Rect();
918475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
918575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        /**
918675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov         * Temporary list for use in collecting focusable descendents of a view.
918775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov         */
918875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov        final ArrayList<View> mFocusablesTempList = new ArrayList<View>(24);
918975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
91909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
91919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Creates a new set of attachment information with the specified
91929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * events handler and thread.
91939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
91949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param handler the events handler the view must use
91959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
91969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        AttachInfo(IWindowSession session, IWindow window,
91979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Handler handler, Callbacks effectPlayer) {
91989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mSession = session;
91999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWindow = window;
92009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWindowToken = window.asBinder();
92019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mHandler = handler;
92029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mRootCallbacks = effectPlayer;
92039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
92049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
92059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
92069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
92079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>ScrollabilityCache holds various fields used by a View when scrolling
92089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * is supported. This avoids keeping too many unused fields in most
92099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * instances of View.</p>
92109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9211f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron    private static class ScrollabilityCache implements Runnable {
9212f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron
9213f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron        /**
9214f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron         * Scrollbars are not visible
9215f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron         */
9216f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron        public static final int OFF = 0;
9217f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron
9218f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron        /**
9219f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron         * Scrollbars are visible
9220f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron         */
9221f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron        public static final int ON = 1;
9222f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron
9223f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron        /**
9224f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron         * Scrollbars are fading away
9225f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron         */
9226f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron        public static final int FADING = 2;
9227f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron
9228f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron        public boolean fadeScrollBars;
9229f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron
92309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int fadingEdgeLength;
9231f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron        public int scrollBarDefaultDelayBeforeFade;
9232f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron        public int scrollBarFadeDuration;
92339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
92349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int scrollBarSize;
92359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public ScrollBarDrawable scrollBar;
9236f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron        public float[] interpolatorValues;
9237f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron        public View host;
92389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
92399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final Paint paint;
92409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final Matrix matrix;
92419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Shader shader;
92429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9243f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron        public final Interpolator scrollBarInterpolator = new Interpolator(1, 2);
9244f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron
9245f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron        private final float[] mOpaque = {255.0f};
9246f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron        private final float[] mTransparent = {0.0f};
9247f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron
9248f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron        /**
9249f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron         * When fading should start. This time moves into the future every time
9250f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron         * a new scroll happens. Measured based on SystemClock.uptimeMillis()
9251f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron         */
9252f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron        public long fadeStartTime;
9253f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron
9254f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron
9255f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron        /**
9256f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron         * The current state of the scrollbars: ON, OFF, or FADING
9257f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron         */
9258f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron        public int state = OFF;
9259f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron
92609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private int mLastColor;
92619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9262f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron        public ScrollabilityCache(ViewConfiguration configuration, View host) {
92639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            fadingEdgeLength = configuration.getScaledFadingEdgeLength();
92649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            scrollBarSize = configuration.getScaledScrollBarSize();
926535b38cefcc92f1ed599a652ac5736ab9e9e75039Romain Guy            scrollBarDefaultDelayBeforeFade = ViewConfiguration.getScrollDefaultDelay();
926635b38cefcc92f1ed599a652ac5736ab9e9e75039Romain Guy            scrollBarFadeDuration = ViewConfiguration.getScrollBarFadeDuration();
92679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
92689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            paint = new Paint();
92699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            matrix = new Matrix();
92709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // use use a height of 1, and then wack the matrix each time we
92719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // actually use it.
92729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            shader = new LinearGradient(0, 0, 0, 1, 0xFF000000, 0, Shader.TileMode.CLAMP);
92738506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
92749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            paint.setShader(shader);
92759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT));
9276f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron            this.host = host;
92779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
92788506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
92799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void setFadeColor(int color) {
92809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (color != 0 && color != mLastColor) {
92819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLastColor = color;
92829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                color |= 0xFF000000;
92838506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
9284e55e1a78857b5d952f593c912655011fced355d5Romain Guy                shader = new LinearGradient(0, 0, 0, 1, color | 0xFF000000,
9285e55e1a78857b5d952f593c912655011fced355d5Romain Guy                        color & 0x00FFFFFF, Shader.TileMode.CLAMP);
92868506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy
92879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                paint.setShader(shader);
92889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Restore the default transfer mode (src_over)
92899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                paint.setXfermode(null);
92909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
92919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9292f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron
9293f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron        public void run() {
92943ecd58c650371206008efd687933c370e4e28a34Mike Cleron            long now = AnimationUtils.currentAnimationTimeMillis();
9295f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron            if (now >= fadeStartTime) {
9296f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron
9297f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron                // the animation fades the scrollbars out by changing
9298f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron                // the opacity (alpha) from fully opaque to fully
9299f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron                // transparent
9300f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron                int nextFrame = (int) now;
9301f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron                int framesCount = 0;
9302f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron
9303f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron                Interpolator interpolator = scrollBarInterpolator;
9304f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron
9305f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron                // Start opaque
9306f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron                interpolator.setKeyFrame(framesCount++, nextFrame, mOpaque);
9307f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron
9308f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron                // End transparent
9309f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron                nextFrame += scrollBarFadeDuration;
9310f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron                interpolator.setKeyFrame(framesCount, nextFrame, mTransparent);
9311f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron
9312f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron                state = FADING;
9313f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron
9314f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron                // Kick off the fade animation
9315f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron                host.invalidate();
9316f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron            }
9317f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron        }
9318f116bf8884b5b58aae261d148003811aa4a7c6e9Mike Cleron
93199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
93209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
9321