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 * <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"/> 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 <size, mode> 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