ViewGroup.java revision b08013c312e3d849029a2f4c11889274c00f438d
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 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.R; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 22e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackbornimport android.content.res.Configuration; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.TypedArray; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Bitmap; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Canvas; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Paint; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Rect; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.RectF; 2975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.graphics.Region; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcelable; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.SystemClock; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AttributeSet; 3375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.util.Config; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.EventLog; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.SparseArray; 3775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.view.accessibility.AccessibilityEvent; 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.animation.Animation; 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.animation.AnimationUtils; 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.animation.LayoutAnimationController; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.animation.Transformation; 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList; 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A <code>ViewGroup</code> is a special view that can contain other views 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (called children.) The view group is the base class for layouts and views 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * containers. This class also defines the 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.view.ViewGroup.LayoutParams} class which serves as the base 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * class for layouts parameters. 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p> 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Also see {@link LayoutParams} for layout attributes. 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p> 57d6a463a9f23b3901bf729f2f27a6bb8f78b95248Romain Guy * 58d6a463a9f23b3901bf729f2f27a6bb8f78b95248Romain Guy * @attr ref android.R.styleable#ViewGroup_clipChildren 59d6a463a9f23b3901bf729f2f27a6bb8f78b95248Romain Guy * @attr ref android.R.styleable#ViewGroup_clipToPadding 60d6a463a9f23b3901bf729f2f27a6bb8f78b95248Romain Guy * @attr ref android.R.styleable#ViewGroup_layoutAnimation 61d6a463a9f23b3901bf729f2f27a6bb8f78b95248Romain Guy * @attr ref android.R.styleable#ViewGroup_animationCache 62d6a463a9f23b3901bf729f2f27a6bb8f78b95248Romain Guy * @attr ref android.R.styleable#ViewGroup_persistentDrawingCache 63d6a463a9f23b3901bf729f2f27a6bb8f78b95248Romain Guy * @attr ref android.R.styleable#ViewGroup_alwaysDrawnWithCache 64d6a463a9f23b3901bf729f2f27a6bb8f78b95248Romain Guy * @attr ref android.R.styleable#ViewGroup_addStatesFromChildren 65d6a463a9f23b3901bf729f2f27a6bb8f78b95248Romain Guy * @attr ref android.R.styleable#ViewGroup_descendantFocusability 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic abstract class ViewGroup extends View implements ViewParent, ViewManager { 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final boolean DBG = false; 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Views which have been hidden or removed which need to be animated on 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * their way out. 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This field should be made private, so it is hidden from the SDK. 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide} 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected ArrayList<View> mDisappearingChildren; 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Listener used to propagate events indicating when children are added 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and/or removed from a view group. 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This field should be made private, so it is hidden from the SDK. 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide} 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected OnHierarchyChangeListener mOnHierarchyChangeListener; 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The view contained within this ViewGroup that has or contains focus. 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private View mFocused; 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The current transformation to apply on the child being drawn 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Transformation mChildTransformation; 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private RectF mInvalidateRegion; 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Target of Motion events 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private View mMotionTarget; 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final Rect mTempRect = new Rect(); 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Layout animation 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private LayoutAnimationController mLayoutAnimationController; 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Animation.AnimationListener mAnimationListener; 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Internal flags. 1038506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy * 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This field should be made private, so it is hidden from the SDK. 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide} 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected int mGroupFlags; 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // When set, ViewGroup invalidates only the child's rectangle 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Set by default 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int FLAG_CLIP_CHILDREN = 0x1; 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // When set, ViewGroup excludes the padding area from the invalidate rectangle 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Set by default 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int FLAG_CLIP_TO_PADDING = 0x2; 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // When set, dispatchDraw() will invoke invalidate(); this is set by drawChild() when 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // a child needs to be invalidated and FLAG_OPTIMIZE_INVALIDATE is set 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int FLAG_INVALIDATE_REQUIRED = 0x4; 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // When set, dispatchDraw() will run the layout animation and unset the flag 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int FLAG_RUN_ANIMATION = 0x8; 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // When set, there is either no layout animation on the ViewGroup or the layout 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // animation is over 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Set by default 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int FLAG_ANIMATION_DONE = 0x10; 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If set, this ViewGroup has padding; if unset there is no padding and we don't need 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // to clip it, even if FLAG_CLIP_TO_PADDING is set 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int FLAG_PADDING_NOT_NULL = 0x20; 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // When set, this ViewGroup caches its children in a Bitmap before starting a layout animation 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Set by default 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int FLAG_ANIMATION_CACHE = 0x40; 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // When set, this ViewGroup converts calls to invalidate(Rect) to invalidate() during a 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // layout animation; this avoid clobbering the hierarchy 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Automatically set when the layout animation starts, depending on the animation's 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // characteristics 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int FLAG_OPTIMIZE_INVALIDATE = 0x80; 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // When set, the next call to drawChild() will clear mChildTransformation's matrix 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int FLAG_CLEAR_TRANSFORMATION = 0x100; 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // When set, this ViewGroup invokes mAnimationListener.onAnimationEnd() and removes 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // the children's Bitmap caches if necessary 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // This flag is set when the layout animation is over (after FLAG_ANIMATION_DONE is set) 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int FLAG_NOTIFY_ANIMATION_LISTENER = 0x200; 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * When set, the drawing method will call {@link #getChildDrawingOrder(int, int)} 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to get the index of the child to draw for that iteration. 154293451e4f005a26386db873f5192f86585cc79bcRomain Guy * 155293451e4f005a26386db873f5192f86585cc79bcRomain Guy * @hide 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected static final int FLAG_USE_CHILD_DRAWING_ORDER = 0x400; 1588506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * When set, this ViewGroup supports static transformations on children; this causes 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #getChildStaticTransformation(View, android.view.animation.Transformation)} to be 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * invoked when a child is drawn. 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Any subclass overriding 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #getChildStaticTransformation(View, android.view.animation.Transformation)} should 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * set this flags in {@link #mGroupFlags}. 1678506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy * 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide} 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected static final int FLAG_SUPPORT_STATIC_TRANSFORMATIONS = 0x800; 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // When the previous drawChild() invocation used an alpha value that was lower than 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // 1.0 and set it in mCachePaint 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int FLAG_ALPHA_LOWER_THAN_ONE = 0x1000; 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * When set, this ViewGroup's drawable states also include those 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of its children. 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int FLAG_ADD_STATES_FROM_CHILDREN = 0x2000; 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * When set, this ViewGroup tries to always draw its children using their drawing cache. 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int FLAG_ALWAYS_DRAWN_WITH_CACHE = 0x4000; 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * When set, and if FLAG_ALWAYS_DRAWN_WITH_CACHE is not set, this ViewGroup will try to 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * draw its children with their drawing cache. 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int FLAG_CHILDREN_DRAWN_WITH_CACHE = 0x8000; 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * When set, this group will go through its list of children to notify them of 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * any drawable state change. 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int FLAG_NOTIFY_CHILDREN_ON_DRAWABLE_STATE_CHANGE = 0x10000; 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int FLAG_MASK_FOCUSABILITY = 0x60000; 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This view will get focus before any of its descendants. 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int FOCUS_BEFORE_DESCENDANTS = 0x20000; 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This view will get focus only if none of its descendants want it. 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int FOCUS_AFTER_DESCENDANTS = 0x40000; 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This view will block any of its descendants from getting focus, even 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if they are focusable. 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int FOCUS_BLOCK_DESCENDANTS = 0x60000; 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Used to map between enum in attrubutes and flag values. 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int[] DESCENDANT_FOCUSABILITY_FLAGS = 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {FOCUS_BEFORE_DESCENDANTS, FOCUS_AFTER_DESCENDANTS, 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FOCUS_BLOCK_DESCENDANTS}; 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * When set, this ViewGroup should not intercept touch events. 226110486f932510fb49bfeff978b0b0e0237ee0656Adam Powell * {@hide} 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 228110486f932510fb49bfeff978b0b0e0237ee0656Adam Powell protected static final int FLAG_DISALLOW_INTERCEPT = 0x80000; 2298506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 231b08013c312e3d849029a2f4c11889274c00f438dAdam Powell * When set, at least one child of this ViewGroup will return true from hasOverlay. 232b08013c312e3d849029a2f4c11889274c00f438dAdam Powell */ 233b08013c312e3d849029a2f4c11889274c00f438dAdam Powell private static final int FLAG_CHILD_HAS_OVERLAY = 0x100000; 234b08013c312e3d849029a2f4c11889274c00f438dAdam Powell 235b08013c312e3d849029a2f4c11889274c00f438dAdam Powell /** 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Indicates which types of drawing caches are to be kept in memory. 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This field should be made private, so it is hidden from the SDK. 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide} 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected int mPersistentDrawingCache; 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Used to indicate that no drawing cache should be kept in memory. 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int PERSISTENT_NO_CACHE = 0x0; 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Used to indicate that the animation drawing cache should be kept in memory. 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int PERSISTENT_ANIMATION_CACHE = 0x1; 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Used to indicate that the scrolling drawing cache should be kept in memory. 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int PERSISTENT_SCROLLING_CACHE = 0x2; 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Used to indicate that all drawing caches should be kept in memory. 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int PERSISTENT_ALL_CACHES = 0x3; 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * We clip to padding when FLAG_CLIP_TO_PADDING and FLAG_PADDING_NOT_NULL 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * are set at the same time. 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected static final int CLIP_TO_PADDING_MASK = FLAG_CLIP_TO_PADDING | FLAG_PADDING_NOT_NULL; 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Index of the child's left position in the mLocation array 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int CHILD_LEFT_INDEX = 0; 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Index of the child's top position in the mLocation array 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int CHILD_TOP_INDEX = 1; 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Child views of this ViewGroup 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private View[] mChildren; 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Number of valid children in the mChildren array, the rest should be null or not 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // considered as children 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mChildrenCount; 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int ARRAY_INITIAL_CAPACITY = 12; 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int ARRAY_CAPACITY_INCREMENT = 12; 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Used to draw cached views 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final Paint mCachePaint = new Paint(); 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ViewGroup(Context context) { 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(context); 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project initViewGroup(); 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ViewGroup(Context context, AttributeSet attrs) { 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(context, attrs); 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project initViewGroup(); 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project initFromAttributes(context, attrs); 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ViewGroup(Context context, AttributeSet attrs, int defStyle) { 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(context, attrs, defStyle); 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project initViewGroup(); 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project initFromAttributes(context, attrs); 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void initViewGroup() { 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ViewGroup doesn't draw by default 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setFlags(WILL_NOT_DRAW, DRAW_MASK); 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mGroupFlags |= FLAG_CLIP_CHILDREN; 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mGroupFlags |= FLAG_CLIP_TO_PADDING; 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mGroupFlags |= FLAG_ANIMATION_DONE; 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mGroupFlags |= FLAG_ANIMATION_CACHE; 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mGroupFlags |= FLAG_ALWAYS_DRAWN_WITH_CACHE; 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setDescendantFocusability(FOCUS_BEFORE_DESCENDANTS); 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mChildren = new View[ARRAY_INITIAL_CAPACITY]; 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mChildrenCount = 0; 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCachePaint.setDither(false); 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPersistentDrawingCache = PERSISTENT_SCROLLING_CACHE; 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void initFromAttributes(Context context, AttributeSet attrs) { 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray a = context.obtainStyledAttributes(attrs, 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project R.styleable.ViewGroup); 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = a.getIndexCount(); 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < N; i++) { 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int attr = a.getIndex(i); 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (attr) { 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case R.styleable.ViewGroup_clipChildren: 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setClipChildren(a.getBoolean(attr, true)); 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case R.styleable.ViewGroup_clipToPadding: 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setClipToPadding(a.getBoolean(attr, true)); 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case R.styleable.ViewGroup_animationCache: 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setAnimationCacheEnabled(a.getBoolean(attr, true)); 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case R.styleable.ViewGroup_persistentDrawingCache: 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setPersistentDrawingCache(a.getInt(attr, PERSISTENT_SCROLLING_CACHE)); 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case R.styleable.ViewGroup_addStatesFromChildren: 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setAddStatesFromChildren(a.getBoolean(attr, false)); 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case R.styleable.ViewGroup_alwaysDrawnWithCache: 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setAlwaysDrawnWithCacheEnabled(a.getBoolean(attr, true)); 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case R.styleable.ViewGroup_layoutAnimation: 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int id = a.getResourceId(attr, -1); 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (id > 0) { 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setLayoutAnimation(AnimationUtils.loadLayoutAnimation(mContext, id)); 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case R.styleable.ViewGroup_descendantFocusability: 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setDescendantFocusability(DESCENDANT_FOCUSABILITY_FLAGS[a.getInt(attr, 0)]); 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.recycle(); 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Gets the descendant focusability of this view group. The descendant 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * focusability defines the relationship between this view group and its 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * descendants when looking for a view to take focus in 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #requestFocus(int, android.graphics.Rect)}. 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return one of {@link #FOCUS_BEFORE_DESCENDANTS}, {@link #FOCUS_AFTER_DESCENDANTS}, 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #FOCUS_BLOCK_DESCENDANTS}. 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 371bea95162ca25bd00b0479d93739b6283795c3986Konstantin Lopyrev @ViewDebug.ExportedProperty(category = "focus", mapping = { 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @ViewDebug.IntToString(from = FOCUS_BEFORE_DESCENDANTS, to = "FOCUS_BEFORE_DESCENDANTS"), 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @ViewDebug.IntToString(from = FOCUS_AFTER_DESCENDANTS, to = "FOCUS_AFTER_DESCENDANTS"), 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @ViewDebug.IntToString(from = FOCUS_BLOCK_DESCENDANTS, to = "FOCUS_BLOCK_DESCENDANTS") 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }) 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getDescendantFocusability() { 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mGroupFlags & FLAG_MASK_FOCUSABILITY; 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set the descendant focusability of this view group. This defines the relationship 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * between this view group and its descendants when looking for a view to 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * take focus in {@link #requestFocus(int, android.graphics.Rect)}. 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param focusability one of {@link #FOCUS_BEFORE_DESCENDANTS}, {@link #FOCUS_AFTER_DESCENDANTS}, 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #FOCUS_BLOCK_DESCENDANTS}. 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setDescendantFocusability(int focusability) { 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (focusability) { 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case FOCUS_BEFORE_DESCENDANTS: 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case FOCUS_AFTER_DESCENDANTS: 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case FOCUS_BLOCK_DESCENDANTS: 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException("must be one of FOCUS_BEFORE_DESCENDANTS, " 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + "FOCUS_AFTER_DESCENDANTS, FOCUS_BLOCK_DESCENDANTS"); 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mGroupFlags &= ~FLAG_MASK_FOCUSABILITY; 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mGroupFlags |= (focusability & FLAG_MASK_FOCUSABILITY); 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void handleFocusGainInternal(int direction, Rect previouslyFocusedRect) { 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mFocused != null) { 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFocused.unFocus(); 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFocused = null; 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.handleFocusGainInternal(direction, previouslyFocusedRect); 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void requestChildFocus(View child, View focused) { 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DBG) { 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(this + " requestChildFocus()"); 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (getDescendantFocusability() == FOCUS_BLOCK_DESCENDANTS) { 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Unfocus us, if necessary 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.unFocus(); 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // We had a previous notion of who had focus. Clear it. 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mFocused != child) { 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mFocused != null) { 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFocused.unFocus(); 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFocused = child; 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mParent != null) { 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParent.requestChildFocus(this, focused); 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void focusableViewAvailable(View v) { 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mParent != null 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // shortcut: don't report a new focusable view if we block our descendants from 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // getting focus 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (getDescendantFocusability() != FOCUS_BLOCK_DESCENDANTS) 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // shortcut: don't report a new focusable view if we already are focused 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // (and we don't prefer our descendants) 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // note: knowing that mFocused is non-null is not a good enough reason 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // to break the traversal since in that case we'd actually have to find 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // the focused view and make sure it wasn't FOCUS_AFTER_DESCENDANTS and 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // an ancestor of v; this will get checked for at ViewRoot 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && !(isFocused() && getDescendantFocusability() != FOCUS_AFTER_DESCENDANTS)) { 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParent.focusableViewAvailable(v); 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean showContextMenuForChild(View originalView) { 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mParent != null && mParent.showContextMenuForChild(originalView); 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Find the nearest view in the specified direction that wants to take 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * focus. 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param focused The view that currently has focus 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param direction One of FOCUS_UP, FOCUS_DOWN, FOCUS_LEFT, and 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * FOCUS_RIGHT, or 0 for not applicable. 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public View focusSearch(View focused, int direction) { 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (isRootNamespace()) { 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // root namespace means we should consider ourselves the top of the 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // tree for focus searching; otherwise we could be focus searching 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // into other tabs. see LocalActivityManager and TabHost for more info 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return FocusFinder.getInstance().findNextFocus(this, focused, direction); 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (mParent != null) { 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mParent.focusSearch(focused, direction); 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean requestChildRectangleOnScreen(View child, Rect rectangle, boolean immediate) { 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean dispatchUnhandledMove(View focused, int direction) { 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mFocused != null && 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFocused.dispatchUnhandledMove(focused, direction); 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void clearChildFocus(View child) { 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DBG) { 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(this + " clearChildFocus()"); 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFocused = null; 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mParent != null) { 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParent.clearChildFocus(this); 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void clearFocus() { 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.clearFocus(); 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // clear any child focus if it exists 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mFocused != null) { 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFocused.clearFocus(); 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void unFocus() { 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DBG) { 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(this + " unFocus()"); 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.unFocus(); 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mFocused != null) { 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFocused.unFocus(); 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFocused = null; 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the focused child of this view, if any. The child may have focus 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or contain focus. 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the focused child or null. 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public View getFocusedChild() { 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mFocused; 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns true if this view has or contains focus 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true if this view has or contains focus 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean hasFocus() { 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (mPrivateFlags & FOCUSED) != 0 || mFocused != null; 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (non-Javadoc) 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see android.view.View#findFocus() 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public View findFocus() { 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DBG) { 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println("Find focus in " + this + ": flags=" 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + isFocused() + ", child=" + mFocused); 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (isFocused()) { 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return this; 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mFocused != null) { 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mFocused.findFocus(); 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean hasFocusable() { 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((mViewFlags & VISIBILITY_MASK) != VISIBLE) { 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (isFocusable()) { 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int descendantFocusability = getDescendantFocusability(); 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (descendantFocusability != FOCUS_BLOCK_DESCENDANTS) { 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int count = mChildrenCount; 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final View[] children = mChildren; 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < count; i++) { 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final View child = children[i]; 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (child.hasFocusable()) { 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void addFocusables(ArrayList<View> views, int direction) { 62375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov addFocusables(views, direction, FOCUSABLES_TOUCH_MODE); 62475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov } 62575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov 62675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov /** 62775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov * {@inheritDoc} 62875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov */ 62975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov @Override 63075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov public void addFocusables(ArrayList<View> views, int direction, int focusableMode) { 6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int focusableCount = views.size(); 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int descendantFocusability = getDescendantFocusability(); 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (descendantFocusability != FOCUS_BLOCK_DESCENDANTS) { 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int count = mChildrenCount; 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final View[] children = mChildren; 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < count; i++) { 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final View child = children[i]; 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((child.mViewFlags & VISIBILITY_MASK) == VISIBLE) { 64275986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov child.addFocusables(views, direction, focusableMode); 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // we add ourselves (if focusable) in all cases except for when we are 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // FOCUS_AFTER_DESCENDANTS and there are some descendants focusable. this is 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // to avoid the focus search finding layouts when a more precise search 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // among the focusable children would be more interesting. 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ( 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project descendantFocusability != FOCUS_AFTER_DESCENDANTS || 6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // No focusable descendants 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (focusableCount == views.size())) { 65575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov super.addFocusables(views, direction, focusableMode); 6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void dispatchWindowFocusChanged(boolean hasFocus) { 6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.dispatchWindowFocusChanged(hasFocus); 6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int count = mChildrenCount; 6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final View[] children = mChildren; 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < count; i++) { 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project children[i].dispatchWindowFocusChanged(hasFocus); 6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void addTouchables(ArrayList<View> views) { 6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.addTouchables(views); 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int count = mChildrenCount; 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final View[] children = mChildren; 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < count; i++) { 6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final View child = children[i]; 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((child.mViewFlags & VISIBILITY_MASK) == VISIBLE) { 6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project child.addTouchables(views); 6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 68943c9cdffb619f93d9d4525dffd05701dc9c8c4bfRomain Guy 69043c9cdffb619f93d9d4525dffd05701dc9c8c4bfRomain Guy /** 69143c9cdffb619f93d9d4525dffd05701dc9c8c4bfRomain Guy * {@inheritDoc} 69243c9cdffb619f93d9d4525dffd05701dc9c8c4bfRomain Guy */ 69343c9cdffb619f93d9d4525dffd05701dc9c8c4bfRomain Guy @Override 69443c9cdffb619f93d9d4525dffd05701dc9c8c4bfRomain Guy public void dispatchDisplayHint(int hint) { 69543c9cdffb619f93d9d4525dffd05701dc9c8c4bfRomain Guy super.dispatchDisplayHint(hint); 69643c9cdffb619f93d9d4525dffd05701dc9c8c4bfRomain Guy final int count = mChildrenCount; 69743c9cdffb619f93d9d4525dffd05701dc9c8c4bfRomain Guy final View[] children = mChildren; 69843c9cdffb619f93d9d4525dffd05701dc9c8c4bfRomain Guy for (int i = 0; i < count; i++) { 69943c9cdffb619f93d9d4525dffd05701dc9c8c4bfRomain Guy children[i].dispatchDisplayHint(hint); 70043c9cdffb619f93d9d4525dffd05701dc9c8c4bfRomain Guy } 70143c9cdffb619f93d9d4525dffd05701dc9c8c4bfRomain Guy } 7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 707326d808b858359464b2ffeb84f2e0a8e0c79b600Adam Powell protected void dispatchVisibilityChanged(View changedView, int visibility) { 708326d808b858359464b2ffeb84f2e0a8e0c79b600Adam Powell super.dispatchVisibilityChanged(changedView, visibility); 709326d808b858359464b2ffeb84f2e0a8e0c79b600Adam Powell final int count = mChildrenCount; 710326d808b858359464b2ffeb84f2e0a8e0c79b600Adam Powell final View[] children = mChildren; 711326d808b858359464b2ffeb84f2e0a8e0c79b600Adam Powell for (int i = 0; i < count; i++) { 712326d808b858359464b2ffeb84f2e0a8e0c79b600Adam Powell children[i].dispatchVisibilityChanged(changedView, visibility); 713326d808b858359464b2ffeb84f2e0a8e0c79b600Adam Powell } 714326d808b858359464b2ffeb84f2e0a8e0c79b600Adam Powell } 715326d808b858359464b2ffeb84f2e0a8e0c79b600Adam Powell 716326d808b858359464b2ffeb84f2e0a8e0c79b600Adam Powell /** 717326d808b858359464b2ffeb84f2e0a8e0c79b600Adam Powell * {@inheritDoc} 718326d808b858359464b2ffeb84f2e0a8e0c79b600Adam Powell */ 719326d808b858359464b2ffeb84f2e0a8e0c79b600Adam Powell @Override 7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void dispatchWindowVisibilityChanged(int visibility) { 7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.dispatchWindowVisibilityChanged(visibility); 7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int count = mChildrenCount; 7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final View[] children = mChildren; 7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < count; i++) { 7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project children[i].dispatchWindowVisibilityChanged(visibility); 7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 731e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn */ 732e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn @Override 733e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn public void dispatchConfigurationChanged(Configuration newConfig) { 734e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn super.dispatchConfigurationChanged(newConfig); 735e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn final int count = mChildrenCount; 736e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn final View[] children = mChildren; 737e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn for (int i = 0; i < count; i++) { 738e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn children[i].dispatchConfigurationChanged(newConfig); 739e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn } 740e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn } 741e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn 742e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn /** 743e36d6e277e49475076b7872d36ea6a5c5b996e9dDianne Hackborn * {@inheritDoc} 7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void recomputeViewAttributes(View child) { 7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ViewParent parent = mParent; 7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parent != null) parent.recomputeViewAttributes(this); 7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7498506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy 7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void dispatchCollectViewAttributes(int visibility) { 7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project visibility |= mViewFlags&VISIBILITY_MASK; 7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.dispatchCollectViewAttributes(visibility); 7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int count = mChildrenCount; 7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final View[] children = mChildren; 7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < count; i++) { 7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project children[i].dispatchCollectViewAttributes(visibility); 7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void bringChildToFront(View child) { 7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int index = indexOfChild(child); 7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (index >= 0) { 7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project removeFromArray(index); 7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addInArray(child, mChildrenCount); 7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project child.mParent = this; 7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean dispatchKeyEventPreIme(KeyEvent event) { 7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((mPrivateFlags & (FOCUSED | HAS_BOUNDS)) == (FOCUSED | HAS_BOUNDS)) { 7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return super.dispatchKeyEventPreIme(event); 7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (mFocused != null && (mFocused.mPrivateFlags & HAS_BOUNDS) == HAS_BOUNDS) { 7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mFocused.dispatchKeyEventPreIme(event); 7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean dispatchKeyEvent(KeyEvent event) { 7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((mPrivateFlags & (FOCUSED | HAS_BOUNDS)) == (FOCUSED | HAS_BOUNDS)) { 7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return super.dispatchKeyEvent(event); 7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (mFocused != null && (mFocused.mPrivateFlags & HAS_BOUNDS) == HAS_BOUNDS) { 7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mFocused.dispatchKeyEvent(event); 7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean dispatchKeyShortcutEvent(KeyEvent event) { 8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((mPrivateFlags & (FOCUSED | HAS_BOUNDS)) == (FOCUSED | HAS_BOUNDS)) { 8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return super.dispatchKeyShortcutEvent(event); 8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (mFocused != null && (mFocused.mPrivateFlags & HAS_BOUNDS) == HAS_BOUNDS) { 8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mFocused.dispatchKeyShortcutEvent(event); 8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean dispatchTrackballEvent(MotionEvent event) { 8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((mPrivateFlags & (FOCUSED | HAS_BOUNDS)) == (FOCUSED | HAS_BOUNDS)) { 8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return super.dispatchTrackballEvent(event); 8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (mFocused != null && (mFocused.mPrivateFlags & HAS_BOUNDS) == HAS_BOUNDS) { 8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mFocused.dispatchTrackballEvent(event); 8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean dispatchTouchEvent(MotionEvent ev) { 83085a3176704b5bfbeece9bd928369fbb76eec7dc6Jeff Brown if (!onFilterTouchEventForSecurity(ev)) { 83185a3176704b5bfbeece9bd928369fbb76eec7dc6Jeff Brown return false; 83285a3176704b5bfbeece9bd928369fbb76eec7dc6Jeff Brown } 83385a3176704b5bfbeece9bd928369fbb76eec7dc6Jeff Brown 8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int action = ev.getAction(); 8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final float xf = ev.getX(); 8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final float yf = ev.getY(); 8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final float scrolledXFloat = xf + mScrollX; 8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final float scrolledYFloat = yf + mScrollY; 8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Rect frame = mTempRect; 8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean disallowIntercept = (mGroupFlags & FLAG_DISALLOW_INTERCEPT) != 0; 8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (action == MotionEvent.ACTION_DOWN) { 8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mMotionTarget != null) { 8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // this is weird, we got a pen down, but we thought it was 8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // already down! 8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // XXX: We should probably send an ACTION_UP to the current 8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // target. 8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMotionTarget = null; 8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If we're disallowing intercept or if we're allowing and we didn't 8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // intercept 8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (disallowIntercept || !onInterceptTouchEvent(ev)) { 8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // reset this event's action (just to protect ourselves) 8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ev.setAction(MotionEvent.ACTION_DOWN); 8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // We know we want to dispatch the event down, find a child 8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // who can handle it, start with the front-most child. 8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int scrolledXInt = (int) scrolledXFloat; 8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int scrolledYInt = (int) scrolledYFloat; 8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final View[] children = mChildren; 8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int count = mChildrenCount; 862b08013c312e3d849029a2f4c11889274c00f438dAdam Powell 863b08013c312e3d849029a2f4c11889274c00f438dAdam Powell // Check for children with overlays first. They don't rely on hit rects to determine 864b08013c312e3d849029a2f4c11889274c00f438dAdam Powell // if they can accept a new touch event. 865b08013c312e3d849029a2f4c11889274c00f438dAdam Powell if ((mGroupFlags & FLAG_CHILD_HAS_OVERLAY) == FLAG_CHILD_HAS_OVERLAY) { 866b08013c312e3d849029a2f4c11889274c00f438dAdam Powell for (int i = count - 1; i >= 0; i--) { 867b08013c312e3d849029a2f4c11889274c00f438dAdam Powell final View child = children[i]; 868b08013c312e3d849029a2f4c11889274c00f438dAdam Powell // Don't let children respond to events as an overlay during an animation. 869b08013c312e3d849029a2f4c11889274c00f438dAdam Powell if ((child.mViewFlags & VISIBILITY_MASK) == VISIBLE 870b08013c312e3d849029a2f4c11889274c00f438dAdam Powell && child.getAnimation() == null 871b08013c312e3d849029a2f4c11889274c00f438dAdam Powell && child.isOverlayEnabled()) { 872b08013c312e3d849029a2f4c11889274c00f438dAdam Powell // offset the event to the view's coordinate system 873b08013c312e3d849029a2f4c11889274c00f438dAdam Powell final float xc = scrolledXFloat - child.mLeft; 874b08013c312e3d849029a2f4c11889274c00f438dAdam Powell final float yc = scrolledYFloat - child.mTop; 875b08013c312e3d849029a2f4c11889274c00f438dAdam Powell ev.setLocation(xc, yc); 876b08013c312e3d849029a2f4c11889274c00f438dAdam Powell child.mPrivateFlags &= ~CANCEL_NEXT_UP_EVENT; 877b08013c312e3d849029a2f4c11889274c00f438dAdam Powell if (child.dispatchTouchEvent(ev)) { 878b08013c312e3d849029a2f4c11889274c00f438dAdam Powell // Event handled, we have a target now. 879b08013c312e3d849029a2f4c11889274c00f438dAdam Powell mMotionTarget = child; 880b08013c312e3d849029a2f4c11889274c00f438dAdam Powell return true; 881b08013c312e3d849029a2f4c11889274c00f438dAdam Powell } 882b08013c312e3d849029a2f4c11889274c00f438dAdam Powell // The event didn't get handled, try the next view. 883b08013c312e3d849029a2f4c11889274c00f438dAdam Powell // Don't reset the event's location, it's not 884b08013c312e3d849029a2f4c11889274c00f438dAdam Powell // necessary here. 885b08013c312e3d849029a2f4c11889274c00f438dAdam Powell } 886b08013c312e3d849029a2f4c11889274c00f438dAdam Powell } 887b08013c312e3d849029a2f4c11889274c00f438dAdam Powell } 888b08013c312e3d849029a2f4c11889274c00f438dAdam Powell 889b08013c312e3d849029a2f4c11889274c00f438dAdam Powell // Now check views normally. 8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = count - 1; i >= 0; i--) { 8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final View child = children[i]; 8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((child.mViewFlags & VISIBILITY_MASK) == VISIBLE 8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || child.getAnimation() != null) { 8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project child.getHitRect(frame); 8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (frame.contains(scrolledXInt, scrolledYInt)) { 8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // offset the event to the view's coordinate system 8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final float xc = scrolledXFloat - child.mLeft; 8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final float yc = scrolledYFloat - child.mTop; 8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ev.setLocation(xc, yc); 9008afa515936e78ccfc5563ca9164dc9a50ca73db4Romain Guy child.mPrivateFlags &= ~CANCEL_NEXT_UP_EVENT; 9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (child.dispatchTouchEvent(ev)) { 9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Event handled, we have a target now. 9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMotionTarget = child; 9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The event didn't get handled, try the next view. 9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Don't reset the event's location, it's not 9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // necessary here. 9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9148506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy 9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean isUpOrCancel = (action == MotionEvent.ACTION_UP) || 9168506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy (action == MotionEvent.ACTION_CANCEL); 9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (isUpOrCancel) { 9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Note, we've already copied the previous state to our local 9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // variable, so this takes effect on the next event 9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mGroupFlags &= ~FLAG_DISALLOW_INTERCEPT; 9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9238506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy 9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The event wasn't an ACTION_DOWN, dispatch it to our target if 9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // we have one. 9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final View target = mMotionTarget; 9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (target == null) { 9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // We don't have a target, this means we're handling the 9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // event as a regular view. 9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ev.setLocation(xf, yf); 9318afa515936e78ccfc5563ca9164dc9a50ca73db4Romain Guy if ((mPrivateFlags & CANCEL_NEXT_UP_EVENT) != 0) { 9328afa515936e78ccfc5563ca9164dc9a50ca73db4Romain Guy ev.setAction(MotionEvent.ACTION_CANCEL); 9338afa515936e78ccfc5563ca9164dc9a50ca73db4Romain Guy mPrivateFlags &= ~CANCEL_NEXT_UP_EVENT; 9348afa515936e78ccfc5563ca9164dc9a50ca73db4Romain Guy } 9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return super.dispatchTouchEvent(ev); 9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // if have a target, see if we're allowed to and want to intercept its 9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // events 9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!disallowIntercept && onInterceptTouchEvent(ev)) { 9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final float xc = scrolledXFloat - (float) target.mLeft; 9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final float yc = scrolledYFloat - (float) target.mTop; 9438afa515936e78ccfc5563ca9164dc9a50ca73db4Romain Guy mPrivateFlags &= ~CANCEL_NEXT_UP_EVENT; 9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ev.setAction(MotionEvent.ACTION_CANCEL); 9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ev.setLocation(xc, yc); 9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!target.dispatchTouchEvent(ev)) { 9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // target didn't handle ACTION_CANCEL. not much we can do 9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // but they should have. 9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // clear the target 9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMotionTarget = null; 9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Don't dispatch this event to our own view, because we already 9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // saw it when intercepting; we just want to give the following 9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // event to the normal onTouchEvent(). 9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (isUpOrCancel) { 9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMotionTarget = null; 9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // finally offset the event to the target's coordinate system and 9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // dispatch the event. 9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final float xc = scrolledXFloat - (float) target.mLeft; 9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final float yc = scrolledYFloat - (float) target.mTop; 9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ev.setLocation(xc, yc); 9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9688afa515936e78ccfc5563ca9164dc9a50ca73db4Romain Guy if ((target.mPrivateFlags & CANCEL_NEXT_UP_EVENT) != 0) { 9698afa515936e78ccfc5563ca9164dc9a50ca73db4Romain Guy ev.setAction(MotionEvent.ACTION_CANCEL); 9708afa515936e78ccfc5563ca9164dc9a50ca73db4Romain Guy target.mPrivateFlags &= ~CANCEL_NEXT_UP_EVENT; 9718afa515936e78ccfc5563ca9164dc9a50ca73db4Romain Guy mMotionTarget = null; 9728afa515936e78ccfc5563ca9164dc9a50ca73db4Romain Guy } 9738afa515936e78ccfc5563ca9164dc9a50ca73db4Romain Guy 9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return target.dispatchTouchEvent(ev); 9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void requestDisallowInterceptTouchEvent(boolean disallowIntercept) { 9818506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy 9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (disallowIntercept == ((mGroupFlags & FLAG_DISALLOW_INTERCEPT) != 0)) { 9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // We're already in this state, assume our ancestors are too 9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9868506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy 9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (disallowIntercept) { 9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mGroupFlags |= FLAG_DISALLOW_INTERCEPT; 9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mGroupFlags &= ~FLAG_DISALLOW_INTERCEPT; 9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9928506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy 9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Pass it up to our parent 9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mParent != null) { 9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParent.requestDisallowInterceptTouchEvent(disallowIntercept); 9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Implement this method to intercept all touch screen motion events. This 10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * allows you to watch events as they are dispatched to your children, and 10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * take ownership of the current gesture at any point. 10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Using this function takes some care, as it has a fairly complicated 10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * interaction with {@link View#onTouchEvent(MotionEvent) 10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * View.onTouchEvent(MotionEvent)}, and using it requires implementing 10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that method as well as this one in the correct way. Events will be 10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * received in the following order: 10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ol> 10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> You will receive the down event here. 10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> The down event will be handled either by a child of this view 10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * group, or given to your own onTouchEvent() method to handle; this means 10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you should implement onTouchEvent() to return true, so you will 10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * continue to see the rest of the gesture (instead of looking for 10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a parent view to handle it). Also, by returning true from 10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * onTouchEvent(), you will not receive any following 10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * events in onInterceptTouchEvent() and all touch processing must 10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * happen in onTouchEvent() like normal. 10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> For as long as you return false from this function, each following 10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * event (up to and including the final up) will be delivered first here 10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and then to the target's onTouchEvent(). 10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> If you return true from here, you will not receive any 10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * following events: the target view will receive the same event but 10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * with the action {@link MotionEvent#ACTION_CANCEL}, and all further 10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * events will be delivered to your onTouchEvent() method and no longer 10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * appear here. 10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ol> 10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param ev The motion event being dispatched down the hierarchy. 10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Return true to steal motion events from the children and have 10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * them dispatched to this ViewGroup through onTouchEvent(). 10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The current target will receive an ACTION_CANCEL event, and no further 10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * messages will be delivered here. 10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean onInterceptTouchEvent(MotionEvent ev) { 10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Looks for a view to give focus to respecting the setting specified by 10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #getDescendantFocusability()}. 10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Uses {@link #onRequestFocusInDescendants(int, android.graphics.Rect)} to 10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * find focus within the children of this group when appropriate. 10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #FOCUS_BEFORE_DESCENDANTS 10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #FOCUS_AFTER_DESCENDANTS 10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #FOCUS_BLOCK_DESCENDANTS 10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #onRequestFocusInDescendants 10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean requestFocus(int direction, Rect previouslyFocusedRect) { 10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DBG) { 10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(this + " ViewGroup.requestFocus direction=" 10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + direction); 10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int descendantFocusability = getDescendantFocusability(); 10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (descendantFocusability) { 10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case FOCUS_BLOCK_DESCENDANTS: 10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return super.requestFocus(direction, previouslyFocusedRect); 10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case FOCUS_BEFORE_DESCENDANTS: { 10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final boolean took = super.requestFocus(direction, previouslyFocusedRect); 10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return took ? took : onRequestFocusInDescendants(direction, previouslyFocusedRect); 10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case FOCUS_AFTER_DESCENDANTS: { 10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final boolean took = onRequestFocusInDescendants(direction, previouslyFocusedRect); 10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return took ? took : super.requestFocus(direction, previouslyFocusedRect); 10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalStateException("descendant focusability must be " 10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + "one of FOCUS_BEFORE_DESCENDANTS, FOCUS_AFTER_DESCENDANTS, FOCUS_BLOCK_DESCENDANTS " 10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + "but is " + descendantFocusability); 10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Look for a descendant to call {@link View#requestFocus} on. 10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Called by {@link ViewGroup#requestFocus(int, android.graphics.Rect)} 10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * when it wants to request focus within its children. Override this to 10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * customize how your {@link ViewGroup} requests focus within its children. 10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param direction One of FOCUS_UP, FOCUS_DOWN, FOCUS_LEFT, and FOCUS_RIGHT 10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param previouslyFocusedRect The rectangle (in this View's coordinate system) 10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to give a finer grained hint about where focus is coming from. May be null 10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if there is no hint. 10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Whether focus was taken. 10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @SuppressWarnings({"ConstantConditions"}) 10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected boolean onRequestFocusInDescendants(int direction, 10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Rect previouslyFocusedRect) { 10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int index; 10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int increment; 10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int end; 10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int count = mChildrenCount; 10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((direction & FOCUS_FORWARD) != 0) { 10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project index = 0; 11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project increment = 1; 11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project end = count; 11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project index = count - 1; 11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project increment = -1; 11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project end = -1; 11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final View[] children = mChildren; 11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = index; i != end; i += increment) { 11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project View child = children[i]; 11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((child.mViewFlags & VISIBILITY_MASK) == VISIBLE) { 11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (child.requestFocus(direction, previouslyFocusedRect)) { 11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1118a440b002aa59e1455bdfa2c5a1ca51c74bbc19acRomain Guy 1119a440b002aa59e1455bdfa2c5a1ca51c74bbc19acRomain Guy /** 1120a440b002aa59e1455bdfa2c5a1ca51c74bbc19acRomain Guy * {@inheritDoc} 1121dcc490f20103a4bbd879ea040ce67779d211c2d7Romain Guy * 1122dcc490f20103a4bbd879ea040ce67779d211c2d7Romain Guy * @hide 1123a440b002aa59e1455bdfa2c5a1ca51c74bbc19acRomain Guy */ 1124a440b002aa59e1455bdfa2c5a1ca51c74bbc19acRomain Guy @Override 1125a440b002aa59e1455bdfa2c5a1ca51c74bbc19acRomain Guy public void dispatchStartTemporaryDetach() { 1126a440b002aa59e1455bdfa2c5a1ca51c74bbc19acRomain Guy super.dispatchStartTemporaryDetach(); 1127a440b002aa59e1455bdfa2c5a1ca51c74bbc19acRomain Guy final int count = mChildrenCount; 1128a440b002aa59e1455bdfa2c5a1ca51c74bbc19acRomain Guy final View[] children = mChildren; 1129a440b002aa59e1455bdfa2c5a1ca51c74bbc19acRomain Guy for (int i = 0; i < count; i++) { 1130a440b002aa59e1455bdfa2c5a1ca51c74bbc19acRomain Guy children[i].dispatchStartTemporaryDetach(); 1131a440b002aa59e1455bdfa2c5a1ca51c74bbc19acRomain Guy } 1132a440b002aa59e1455bdfa2c5a1ca51c74bbc19acRomain Guy } 1133a440b002aa59e1455bdfa2c5a1ca51c74bbc19acRomain Guy 1134a440b002aa59e1455bdfa2c5a1ca51c74bbc19acRomain Guy /** 1135a440b002aa59e1455bdfa2c5a1ca51c74bbc19acRomain Guy * {@inheritDoc} 1136dcc490f20103a4bbd879ea040ce67779d211c2d7Romain Guy * 1137dcc490f20103a4bbd879ea040ce67779d211c2d7Romain Guy * @hide 1138a440b002aa59e1455bdfa2c5a1ca51c74bbc19acRomain Guy */ 1139a440b002aa59e1455bdfa2c5a1ca51c74bbc19acRomain Guy @Override 1140a440b002aa59e1455bdfa2c5a1ca51c74bbc19acRomain Guy public void dispatchFinishTemporaryDetach() { 1141a440b002aa59e1455bdfa2c5a1ca51c74bbc19acRomain Guy super.dispatchFinishTemporaryDetach(); 1142a440b002aa59e1455bdfa2c5a1ca51c74bbc19acRomain Guy final int count = mChildrenCount; 1143a440b002aa59e1455bdfa2c5a1ca51c74bbc19acRomain Guy final View[] children = mChildren; 1144a440b002aa59e1455bdfa2c5a1ca51c74bbc19acRomain Guy for (int i = 0; i < count; i++) { 1145a440b002aa59e1455bdfa2c5a1ca51c74bbc19acRomain Guy children[i].dispatchFinishTemporaryDetach(); 1146a440b002aa59e1455bdfa2c5a1ca51c74bbc19acRomain Guy } 1147a440b002aa59e1455bdfa2c5a1ca51c74bbc19acRomain Guy } 11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void dispatchAttachedToWindow(AttachInfo info, int visibility) { 11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.dispatchAttachedToWindow(info, visibility); 11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project visibility |= mViewFlags & VISIBILITY_MASK; 11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int count = mChildrenCount; 11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final View[] children = mChildren; 11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < count; i++) { 11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project children[i].dispatchAttachedToWindow(info, visibility); 11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 116375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov @Override 116475986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) { 116575986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov boolean populated = false; 116675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov for (int i = 0, count = getChildCount(); i < count; i++) { 116775986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov populated |= getChildAt(i).dispatchPopulateAccessibilityEvent(event); 116875986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov } 116975986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov return populated; 117075986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov } 117175986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov 11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void dispatchDetachedFromWindow() { 11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If we still have a motion target, we are still in the process of 11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // dispatching motion events to a child; we need to get rid of that 11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // child to avoid dispatching events to it after the window is torn 11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // down. To make sure we keep the child in a consistent state, we 11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // first send it an ACTION_CANCEL motion event. 11829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mMotionTarget != null) { 11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long now = SystemClock.uptimeMillis(); 11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final MotionEvent event = MotionEvent.obtain(now, now, 11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project MotionEvent.ACTION_CANCEL, 0.0f, 0.0f, 0); 11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMotionTarget.dispatchTouchEvent(event); 11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project event.recycle(); 11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMotionTarget = null; 11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int count = mChildrenCount; 11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final View[] children = mChildren; 11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < count; i++) { 11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project children[i].dispatchDetachedFromWindow(); 11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.dispatchDetachedFromWindow(); 11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setPadding(int left, int top, int right, int bottom) { 12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.setPadding(left, top, right, bottom); 12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((mPaddingLeft | mPaddingTop | mPaddingRight | mPaddingRight) != 0) { 12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mGroupFlags |= FLAG_PADDING_NOT_NULL; 12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mGroupFlags &= ~FLAG_PADDING_NOT_NULL; 12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void dispatchSaveInstanceState(SparseArray<Parcelable> container) { 12189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.dispatchSaveInstanceState(container); 12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int count = mChildrenCount; 12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final View[] children = mChildren; 12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < count; i++) { 12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project children[i].dispatchSaveInstanceState(container); 12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Perform dispatching of a {@link #saveHierarchyState freeze()} to only this view, 12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * not to its children. For use when overriding 12299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #dispatchSaveInstanceState dispatchFreeze()} to allow subclasses to freeze 12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * their own state but not the state of their children. 12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param container the container 12339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void dispatchFreezeSelfOnly(SparseArray<Parcelable> container) { 12359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.dispatchSaveInstanceState(container); 12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void dispatchRestoreInstanceState(SparseArray<Parcelable> container) { 12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.dispatchRestoreInstanceState(container); 12449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int count = mChildrenCount; 12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final View[] children = mChildren; 12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < count; i++) { 12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project children[i].dispatchRestoreInstanceState(container); 12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Perform dispatching of a {@link #restoreHierarchyState thaw()} to only this view, 12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * not to its children. For use when overriding 12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #dispatchRestoreInstanceState dispatchThaw()} to allow subclasses to thaw 12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * their own state but not the state of their children. 12569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param container the container 12589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void dispatchThawSelfOnly(SparseArray<Parcelable> container) { 12609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.dispatchRestoreInstanceState(container); 12619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Enables or disables the drawing cache for each child of this view group. 12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param enabled true to enable the cache, false to dispose of it 12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void setChildrenDrawingCacheEnabled(boolean enabled) { 12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (enabled || (mPersistentDrawingCache & PERSISTENT_ALL_CACHES) != PERSISTENT_ALL_CACHES) { 12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final View[] children = mChildren; 12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int count = mChildrenCount; 12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < count; i++) { 12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project children[i].setDrawingCacheEnabled(enabled); 12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onAnimationStart() { 12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.onAnimationStart(); 12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // When this ViewGroup's animation starts, build the cache for the children 12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((mGroupFlags & FLAG_ANIMATION_CACHE) == FLAG_ANIMATION_CACHE) { 12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int count = mChildrenCount; 12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final View[] children = mChildren; 12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < count; i++) { 12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final View child = children[i]; 12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((child.mViewFlags & VISIBILITY_MASK) == VISIBLE) { 12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project child.setDrawingCacheEnabled(true); 1291fbd8f69a84163ef1cf52b07966320caf448c2bc9Romain Guy child.buildDrawingCache(true); 12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mGroupFlags |= FLAG_CHILDREN_DRAWN_WITH_CACHE; 12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 13009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onAnimationEnd() { 13019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.onAnimationEnd(); 13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // When this ViewGroup's animation ends, destroy the cache of the children 13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((mGroupFlags & FLAG_ANIMATION_CACHE) == FLAG_ANIMATION_CACHE) { 13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mGroupFlags &= ~FLAG_CHILDREN_DRAWN_WITH_CACHE; 13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((mPersistentDrawingCache & PERSISTENT_ANIMATION_CACHE) == 0) { 13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setChildrenDrawingCacheEnabled(false); 13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1313223ff5c0586adbbd1d6d57a3a4d176222e8b7434Romain Guy @Override 1314223ff5c0586adbbd1d6d57a3a4d176222e8b7434Romain Guy Bitmap createSnapshot(Bitmap.Config quality, int backgroundColor, boolean skipChildren) { 131565554f27855ce1764123604b061b10346f8b8404Romain Guy int count = mChildrenCount; 131665554f27855ce1764123604b061b10346f8b8404Romain Guy int[] visibilities = null; 131765554f27855ce1764123604b061b10346f8b8404Romain Guy 1318223ff5c0586adbbd1d6d57a3a4d176222e8b7434Romain Guy if (skipChildren) { 131965554f27855ce1764123604b061b10346f8b8404Romain Guy visibilities = new int[count]; 132065554f27855ce1764123604b061b10346f8b8404Romain Guy for (int i = 0; i < count; i++) { 132165554f27855ce1764123604b061b10346f8b8404Romain Guy View child = getChildAt(i); 132265554f27855ce1764123604b061b10346f8b8404Romain Guy visibilities[i] = child.getVisibility(); 132365554f27855ce1764123604b061b10346f8b8404Romain Guy if (visibilities[i] == View.VISIBLE) { 132465554f27855ce1764123604b061b10346f8b8404Romain Guy child.setVisibility(INVISIBLE); 132565554f27855ce1764123604b061b10346f8b8404Romain Guy } 132665554f27855ce1764123604b061b10346f8b8404Romain Guy } 1327223ff5c0586adbbd1d6d57a3a4d176222e8b7434Romain Guy } 1328223ff5c0586adbbd1d6d57a3a4d176222e8b7434Romain Guy 1329223ff5c0586adbbd1d6d57a3a4d176222e8b7434Romain Guy Bitmap b = super.createSnapshot(quality, backgroundColor, skipChildren); 133065554f27855ce1764123604b061b10346f8b8404Romain Guy 133165554f27855ce1764123604b061b10346f8b8404Romain Guy if (skipChildren) { 133265554f27855ce1764123604b061b10346f8b8404Romain Guy for (int i = 0; i < count; i++) { 133365554f27855ce1764123604b061b10346f8b8404Romain Guy getChildAt(i).setVisibility(visibilities[i]); 133465554f27855ce1764123604b061b10346f8b8404Romain Guy } 133565554f27855ce1764123604b061b10346f8b8404Romain Guy } 1336223ff5c0586adbbd1d6d57a3a4d176222e8b7434Romain Guy 1337223ff5c0586adbbd1d6d57a3a4d176222e8b7434Romain Guy return b; 1338223ff5c0586adbbd1d6d57a3a4d176222e8b7434Romain Guy } 1339223ff5c0586adbbd1d6d57a3a4d176222e8b7434Romain Guy 13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 13449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void dispatchDraw(Canvas canvas) { 13459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int count = mChildrenCount; 13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final View[] children = mChildren; 13479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int flags = mGroupFlags; 13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags & FLAG_RUN_ANIMATION) != 0 && canAnimate()) { 13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final boolean cache = (mGroupFlags & FLAG_ANIMATION_CACHE) == FLAG_ANIMATION_CACHE; 13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < count; i++) { 13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final View child = children[i]; 13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((child.mViewFlags & VISIBILITY_MASK) == VISIBLE) { 13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final LayoutParams params = child.getLayoutParams(); 13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project attachLayoutAnimationParameters(child, params, i, count); 13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bindLayoutAnimation(child); 13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (cache) { 13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project child.setDrawingCacheEnabled(true); 1360fbd8f69a84163ef1cf52b07966320caf448c2bc9Romain Guy child.buildDrawingCache(true); 13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final LayoutAnimationController controller = mLayoutAnimationController; 13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (controller.willOverlap()) { 13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mGroupFlags |= FLAG_OPTIMIZE_INVALIDATE; 13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project controller.start(); 13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mGroupFlags &= ~FLAG_RUN_ANIMATION; 13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mGroupFlags &= ~FLAG_ANIMATION_DONE; 13749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (cache) { 13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mGroupFlags |= FLAG_CHILDREN_DRAWN_WITH_CACHE; 13779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mAnimationListener != null) { 13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAnimationListener.onAnimationStart(controller.getAnimation()); 13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int saveCount = 0; 13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final boolean clipToPadding = (flags & CLIP_TO_PADDING_MASK) == CLIP_TO_PADDING_MASK; 13869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (clipToPadding) { 13879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project saveCount = canvas.save(); 13888f2d94fd77836dac14319735e40f46b18b04216dRomain Guy canvas.clipRect(mScrollX + mPaddingLeft, mScrollY + mPaddingTop, 13898f2d94fd77836dac14319735e40f46b18b04216dRomain Guy mScrollX + mRight - mLeft - mPaddingRight, 13908f2d94fd77836dac14319735e40f46b18b04216dRomain Guy mScrollY + mBottom - mTop - mPaddingBottom); 13919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // We will draw our child's animation, let's reset the flag 13959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPrivateFlags &= ~DRAW_ANIMATION; 13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mGroupFlags &= ~FLAG_INVALIDATE_REQUIRED; 13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean more = false; 13999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long drawingTime = getDrawingTime(); 14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags & FLAG_USE_CHILD_DRAWING_ORDER) == 0) { 14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < count; i++) { 14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final View child = children[i]; 14049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((child.mViewFlags & VISIBILITY_MASK) == VISIBLE || child.getAnimation() != null) { 14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project more |= drawChild(canvas, child, drawingTime); 14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < count; i++) { 14109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final View child = children[getChildDrawingOrder(count, i)]; 14119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((child.mViewFlags & VISIBILITY_MASK) == VISIBLE || child.getAnimation() != null) { 14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project more |= drawChild(canvas, child, drawingTime); 14139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Draw any disappearing views that have animations 14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDisappearingChildren != null) { 14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ArrayList<View> disappearingChildren = mDisappearingChildren; 14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int disappearingCount = disappearingChildren.size() - 1; 14219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Go backwards -- we may delete as animations finish 14229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = disappearingCount; i >= 0; i--) { 14239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final View child = disappearingChildren.get(i); 14249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project more |= drawChild(canvas, child, drawingTime); 14259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (clipToPadding) { 14299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project canvas.restoreToCount(saveCount); 14309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // mGroupFlags might have been updated by drawChild() 14339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project flags = mGroupFlags; 14349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags & FLAG_INVALIDATE_REQUIRED) == FLAG_INVALIDATE_REQUIRED) { 14369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project invalidate(); 14379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags & FLAG_ANIMATION_DONE) == 0 && (flags & FLAG_NOTIFY_ANIMATION_LISTENER) == 0 && 14409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayoutAnimationController.isDone() && !more) { 14419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // We want to erase the drawing cache and notify the listener after the 14429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // next frame is drawn because one extra invalidate() is caused by 14439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // drawChild() after the animation is over 14449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mGroupFlags |= FLAG_NOTIFY_ANIMATION_LISTENER; 14459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Runnable end = new Runnable() { 14469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void run() { 14479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project notifyAnimationListener(); 14489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 14509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project post(end); 14519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14538506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy 14549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 14559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the index of the child to draw for this iteration. Override this 14569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if you want to change the drawing order of children. By default, it 14579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * returns i. 14589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 1459293451e4f005a26386db873f5192f86585cc79bcRomain Guy * NOTE: In order for this method to be called, you must enable child ordering 1460293451e4f005a26386db873f5192f86585cc79bcRomain Guy * first by calling {@link #setChildrenDrawingOrderEnabled(boolean)}. 14618506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy * 14629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param i The current iteration. 14639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The index of the child to draw this iteration. 1464293451e4f005a26386db873f5192f86585cc79bcRomain Guy * 1465293451e4f005a26386db873f5192f86585cc79bcRomain Guy * @see #setChildrenDrawingOrderEnabled(boolean) 1466293451e4f005a26386db873f5192f86585cc79bcRomain Guy * @see #isChildrenDrawingOrderEnabled() 14679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 14689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected int getChildDrawingOrder(int childCount, int i) { 14699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return i; 14709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14718506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy 14729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void notifyAnimationListener() { 14739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mGroupFlags &= ~FLAG_NOTIFY_ANIMATION_LISTENER; 14749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mGroupFlags |= FLAG_ANIMATION_DONE; 14759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mAnimationListener != null) { 14779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Runnable end = new Runnable() { 14789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void run() { 14799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAnimationListener.onAnimationEnd(mLayoutAnimationController.getAnimation()); 14809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 14829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project post(end); 14839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((mGroupFlags & FLAG_ANIMATION_CACHE) == FLAG_ANIMATION_CACHE) { 14869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mGroupFlags &= ~FLAG_CHILDREN_DRAWN_WITH_CACHE; 14879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((mPersistentDrawingCache & PERSISTENT_ANIMATION_CACHE) == 0) { 14889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setChildrenDrawingCacheEnabled(false); 14899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project invalidate(); 14939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 14969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Draw one child of this View Group. This method is responsible for getting 14979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the canvas in the right state. This includes clipping, translating so 14989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that the child's scrolled origin is at 0, 0, and applying any animation 14999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * transformations. 15009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 15019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param canvas The canvas on which to draw the child 15029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param child Who to draw 15039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param drawingTime The time at which draw is occuring 15049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return True if an invalidate() was issued 15059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 15069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected boolean drawChild(Canvas canvas, View child, long drawingTime) { 15079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean more = false; 15089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int cl = child.mLeft; 15109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int ct = child.mTop; 15119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int cr = child.mRight; 15129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int cb = child.mBottom; 15139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int flags = mGroupFlags; 15159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags & FLAG_CLEAR_TRANSFORMATION) == FLAG_CLEAR_TRANSFORMATION) { 15179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mChildTransformation != null) { 15189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mChildTransformation.clear(); 15199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mGroupFlags &= ~FLAG_CLEAR_TRANSFORMATION; 15219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Transformation transformToApply = null; 15249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Animation a = child.getAnimation(); 15259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean concatMatrix = false; 15269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (a != null) { 15289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mInvalidateRegion == null) { 15299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInvalidateRegion = new RectF(); 15309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final RectF region = mInvalidateRegion; 15329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final boolean initialized = a.isInitialized(); 15349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!initialized) { 15358f2d94fd77836dac14319735e40f46b18b04216dRomain Guy a.initialize(cr - cl, cb - ct, getWidth(), getHeight()); 15368f2d94fd77836dac14319735e40f46b18b04216dRomain Guy a.initializeInvalidateRegion(0, 0, cr - cl, cb - ct); 15379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project child.onAnimationStart(); 15389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mChildTransformation == null) { 15419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mChildTransformation = new Transformation(); 15429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project more = a.getTransformation(drawingTime, mChildTransformation); 15449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project transformToApply = mChildTransformation; 15459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project concatMatrix = a.willChangeTransformationMatrix(); 15479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (more) { 15499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!a.willChangeBounds()) { 15509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags & (FLAG_OPTIMIZE_INVALIDATE | FLAG_ANIMATION_DONE)) == 15519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FLAG_OPTIMIZE_INVALIDATE) { 15529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mGroupFlags |= FLAG_INVALIDATE_REQUIRED; 15539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if ((flags & FLAG_INVALIDATE_REQUIRED) == 0) { 15549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The child need to draw an animation, potentially offscreen, so 15559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // make sure we do not cancel invalidate requests 15569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPrivateFlags |= DRAW_ANIMATION; 15579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project invalidate(cl, ct, cr, cb); 15589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 15608f2d94fd77836dac14319735e40f46b18b04216dRomain Guy a.getInvalidateRegion(0, 0, cr - cl, cb - ct, region, transformToApply); 15619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The child need to draw an animation, potentially offscreen, so 15639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // make sure we do not cancel invalidate requests 15649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPrivateFlags |= DRAW_ANIMATION; 15654df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project 15664df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project final int left = cl + (int) region.left; 15674df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project final int top = ct + (int) region.top; 15684df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project invalidate(left, top, left + (int) region.width(), top + (int) region.height()); 15699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if ((flags & FLAG_SUPPORT_STATIC_TRANSFORMATIONS) == 15729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FLAG_SUPPORT_STATIC_TRANSFORMATIONS) { 15739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mChildTransformation == null) { 15749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mChildTransformation = new Transformation(); 15759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final boolean hasTransform = getChildStaticTransformation(child, mChildTransformation); 15779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (hasTransform) { 15789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int transformType = mChildTransformation.getTransformationType(); 15799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project transformToApply = transformType != Transformation.TYPE_IDENTITY ? 15809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mChildTransformation : null; 15819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project concatMatrix = (transformType & Transformation.TYPE_MATRIX) != 0; 15829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15855bcdff45bf4ada77ae7c95f520b795876adef75cRomain Guy // Sets the flag as early as possible to allow draw() implementations 1586986003d46add147714ce7e16c9fefa8c18042fc8Romain Guy // to call invalidate() successfully when doing animations 15875bcdff45bf4ada77ae7c95f520b795876adef75cRomain Guy child.mPrivateFlags |= DRAWN; 1588986003d46add147714ce7e16c9fefa8c18042fc8Romain Guy 15899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!concatMatrix && canvas.quickReject(cl, ct, cr, cb, Canvas.EdgeType.BW) && 15909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (child.mPrivateFlags & DRAW_ANIMATION) == 0) { 15919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return more; 15929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project child.computeScroll(); 15959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int sx = child.mScrollX; 15979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int sy = child.mScrollY; 15989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15998506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy boolean scalingRequired = false; 16009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Bitmap cache = null; 16019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags & FLAG_CHILDREN_DRAWN_WITH_CACHE) == FLAG_CHILDREN_DRAWN_WITH_CACHE || 16029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (flags & FLAG_ALWAYS_DRAWN_WITH_CACHE) == FLAG_ALWAYS_DRAWN_WITH_CACHE) { 1603fbd8f69a84163ef1cf52b07966320caf448c2bc9Romain Guy cache = child.getDrawingCache(true); 1604cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy if (mAttachInfo != null) scalingRequired = mAttachInfo.mScalingRequired; 16059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final boolean hasNoCache = cache == null; 16089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int restoreTo = canvas.save(); 16109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (hasNoCache) { 16119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project canvas.translate(cl - sx, ct - sy); 16129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 16139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project canvas.translate(cl, ct); 16148506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy if (scalingRequired) { 1615cafdea61a85c8f5d0646cc9413a09346c637f43fRomain Guy // mAttachInfo cannot be null, otherwise scalingRequired == false 16168506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy final float scale = 1.0f / mAttachInfo.mApplicationScale; 16178506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy canvas.scale(scale, scale); 16188506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy } 16199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float alpha = 1.0f; 16229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (transformToApply != null) { 16249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (concatMatrix) { 16259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int transX = 0; 16269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int transY = 0; 16279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (hasNoCache) { 16289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project transX = -sx; 16299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project transY = -sy; 16309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Undo the scroll translation, apply the transformation matrix, 16329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // then redo the scroll translate to get the correct result. 16339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project canvas.translate(-transX, -transY); 16349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project canvas.concat(transformToApply.getMatrix()); 16359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project canvas.translate(transX, transY); 16369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mGroupFlags |= FLAG_CLEAR_TRANSFORMATION; 16379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project alpha = transformToApply.getAlpha(); 16409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (alpha < 1.0f) { 16419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mGroupFlags |= FLAG_CLEAR_TRANSFORMATION; 16429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (alpha < 1.0f && hasNoCache) { 16459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int multipliedAlpha = (int) (255 * alpha); 16469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!child.onSetAlpha(multipliedAlpha)) { 16479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project canvas.saveLayerAlpha(sx, sy, sx + cr - cl, sy + cb - ct, multipliedAlpha, 16489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Canvas.HAS_ALPHA_LAYER_SAVE_FLAG | Canvas.CLIP_TO_LAYER_SAVE_FLAG); 16499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 16509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project child.mPrivateFlags |= ALPHA_SET; 16519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if ((child.mPrivateFlags & ALPHA_SET) == ALPHA_SET) { 16549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project child.onSetAlpha(255); 16559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags & FLAG_CLIP_CHILDREN) == FLAG_CLIP_CHILDREN) { 16589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (hasNoCache) { 16598f2d94fd77836dac14319735e40f46b18b04216dRomain Guy canvas.clipRect(sx, sy, sx + (cr - cl), sy + (cb - ct)); 16609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 16618506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy if (!scalingRequired) { 16628506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy canvas.clipRect(0, 0, cr - cl, cb - ct); 16638506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy } else { 16648506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy canvas.clipRect(0, 0, cache.getWidth(), cache.getHeight()); 16658506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy } 16669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (hasNoCache) { 16709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Fast path for layouts with no backgrounds 16719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((child.mPrivateFlags & SKIP_DRAW) == SKIP_DRAW) { 16729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ViewDebug.TRACE_HIERARCHY) { 16739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ViewDebug.trace(this, ViewDebug.HierarchyTraceType.DRAW); 16749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16758506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy child.mPrivateFlags &= ~DIRTY_MASK; 16769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project child.dispatchDraw(canvas); 16779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 16789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project child.draw(canvas); 16799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 16819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Paint cachePaint = mCachePaint; 16829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (alpha < 1.0f) { 16839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cachePaint.setAlpha((int) (alpha * 255)); 16849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mGroupFlags |= FLAG_ALPHA_LOWER_THAN_ONE; 16859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if ((flags & FLAG_ALPHA_LOWER_THAN_ONE) == FLAG_ALPHA_LOWER_THAN_ONE) { 16869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cachePaint.setAlpha(255); 16879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mGroupFlags &= ~FLAG_ALPHA_LOWER_THAN_ONE; 16889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 168913922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy if (Config.DEBUG && ViewDebug.profileDrawing) { 16909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project EventLog.writeEvent(60003, hashCode()); 16919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project canvas.drawBitmap(cache, 0.0f, 0.0f, cachePaint); 16939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project canvas.restoreToCount(restoreTo); 16969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (a != null && !more) { 16989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project child.onSetAlpha(255); 16999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project finishAnimatingView(child, a); 17009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return more; 17039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 17069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * By default, children are clipped to their bounds before drawing. This 17079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * allows view groups to override this behavior for animations, etc. 17089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 17099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param clipChildren true to clip children to their bounds, 17109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * false otherwise 17119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#ViewGroup_clipChildren 17129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 17139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setClipChildren(boolean clipChildren) { 17149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setBooleanFlag(FLAG_CLIP_CHILDREN, clipChildren); 17159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 17189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * By default, children are clipped to the padding of the ViewGroup. This 17199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * allows view groups to override this behavior 17209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 17219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param clipToPadding true to clip children to the padding of the 17229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * group, false otherwise 17239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#ViewGroup_clipToPadding 17249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 17259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setClipToPadding(boolean clipToPadding) { 17269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setBooleanFlag(FLAG_CLIP_TO_PADDING, clipToPadding); 17279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 17309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 17319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 17329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 17339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void dispatchSetSelected(boolean selected) { 17349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final View[] children = mChildren; 17359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int count = mChildrenCount; 17369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < count; i++) { 17379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project children[i].setSelected(selected); 17389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17408506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy 17419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 17429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void dispatchSetPressed(boolean pressed) { 17439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final View[] children = mChildren; 17449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int count = mChildrenCount; 17459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < count; i++) { 17469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project children[i].setPressed(pressed); 17479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 17519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * When this property is set to true, this ViewGroup supports static transformations on 17529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * children; this causes 17539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #getChildStaticTransformation(View, android.view.animation.Transformation)} to be 17549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * invoked when a child is drawn. 17559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 17569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Any subclass overriding 17579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #getChildStaticTransformation(View, android.view.animation.Transformation)} should 17589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * set this property to true. 17599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 17609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param enabled True to enable static transformations on children, false otherwise. 17619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 17629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #FLAG_SUPPORT_STATIC_TRANSFORMATIONS 17639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 17649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void setStaticTransformationsEnabled(boolean enabled) { 17659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setBooleanFlag(FLAG_SUPPORT_STATIC_TRANSFORMATIONS, enabled); 17669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 17699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 17709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 17718506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy * @see #setStaticTransformationsEnabled(boolean) 17729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 17739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected boolean getChildStaticTransformation(View child, Transformation t) { 17749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 17759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 17789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide} 17799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 17809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 17819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected View findViewTraversal(int id) { 17829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (id == mID) { 17839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return this; 17849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final View[] where = mChildren; 17879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int len = mChildrenCount; 17889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < len; i++) { 17909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project View v = where[i]; 17919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((v.mPrivateFlags & IS_ROOT_NAMESPACE) == 0) { 17939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project v = v.findViewById(id); 17949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (v != null) { 17969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return v; 17979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 18029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 18059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide} 18069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 18079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 18089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected View findViewWithTagTraversal(Object tag) { 18099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (tag != null && tag.equals(mTag)) { 18109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return this; 18119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final View[] where = mChildren; 18149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int len = mChildrenCount; 18159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < len; i++) { 18179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project View v = where[i]; 18189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((v.mPrivateFlags & IS_ROOT_NAMESPACE) == 0) { 18209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project v = v.findViewWithTag(tag); 18219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (v != null) { 18239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return v; 18249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 18299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 18329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Adds a child view. If no layout parameters are already set on the child, the 18339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * default parameters for this ViewGroup are set on the child. 18349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 18359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param child the child view to add 18369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 18379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #generateDefaultLayoutParams() 18389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 18399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void addView(View child) { 18409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addView(child, -1); 18419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 18449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Adds a child view. If no layout parameters are already set on the child, the 18459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * default parameters for this ViewGroup are set on the child. 18469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 18479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param child the child view to add 18489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param index the position at which to add the child 18499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 18509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #generateDefaultLayoutParams() 18519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 18529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void addView(View child, int index) { 18539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LayoutParams params = child.getLayoutParams(); 18549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (params == null) { 18559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project params = generateDefaultLayoutParams(); 18569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (params == null) { 18579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException("generateDefaultLayoutParams() cannot return null"); 18589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addView(child, index, params); 18619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 18649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Adds a child view with this ViewGroup's default layout parameters and the 18659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * specified width and height. 18669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 18679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param child the child view to add 18689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 18699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void addView(View child, int width, int height) { 18709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final LayoutParams params = generateDefaultLayoutParams(); 18719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project params.width = width; 18729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project params.height = height; 18739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addView(child, -1, params); 18749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 18779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Adds a child view with the specified layout parameters. 18789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 18799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param child the child view to add 18809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param params the layout parameters to set on the child 18819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 18829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void addView(View child, LayoutParams params) { 18839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addView(child, -1, params); 18849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 18879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Adds a child view with the specified layout parameters. 18889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 18899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param child the child view to add 18909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param index the position at which to add the child 18919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param params the layout parameters to set on the child 18929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 18939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void addView(View child, int index, LayoutParams params) { 18949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DBG) { 18959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println(this + " addView"); 18969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // addViewInner() will call child.requestLayout() when setting the new LayoutParams 18999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // therefore, we call requestLayout() on ourselves before, so that the child's request 19009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // will be blocked at our level 19019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project requestLayout(); 19029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project invalidate(); 19039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addViewInner(child, index, params, false); 19049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 19079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 19089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 19099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void updateViewLayout(View view, ViewGroup.LayoutParams params) { 19109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkLayoutParams(params)) { 19119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException("Invalid LayoutParams supplied to " + this); 19129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (view.mParent != this) { 19149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException("Given view not a child of " + this); 19159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project view.setLayoutParams(params); 19179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 19209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 19219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 19229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected boolean checkLayoutParams(ViewGroup.LayoutParams p) { 19239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return p != null; 19249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 19279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Interface definition for a callback to be invoked when the hierarchy 19289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * within this view changed. The hierarchy changes whenever a child is added 19299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to or removed from this view. 19309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 19319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public interface OnHierarchyChangeListener { 19329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 19339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Called when a new child is added to a parent view. 19349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 19359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param parent the view in which a child was added 19369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param child the new child view added in the hierarchy 19379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 19389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void onChildViewAdded(View parent, View child); 19399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 19419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Called when a child is removed from a parent view. 19429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 19439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param parent the view from which the child was removed 19449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param child the child removed from the hierarchy 19459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 19469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void onChildViewRemoved(View parent, View child); 19479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 19509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Register a callback to be invoked when a child is added to or removed 19519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * from this view. 19529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 19539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param listener the callback to invoke on hierarchy change 19549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 19559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setOnHierarchyChangeListener(OnHierarchyChangeListener listener) { 19569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOnHierarchyChangeListener = listener; 19579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 19609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Adds a view during layout. This is useful if in your onLayout() method, 19619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you need to add more views (as does the list view for example). 19629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 19639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If index is negative, it means put it at the end of the list. 19649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 19659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param child the view to add to the group 19669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param index the index at which the child must be added 19679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param params the layout parameters to associate with the child 19689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true if the child was added, false otherwise 19699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 19709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected boolean addViewInLayout(View child, int index, LayoutParams params) { 19719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return addViewInLayout(child, index, params, false); 19729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 19759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Adds a view during layout. This is useful if in your onLayout() method, 19769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you need to add more views (as does the list view for example). 19779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 19789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If index is negative, it means put it at the end of the list. 19799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 19809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param child the view to add to the group 19819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param index the index at which the child must be added 19829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param params the layout parameters to associate with the child 19839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param preventRequestLayout if true, calling this method will not trigger a 19849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * layout request on child 19859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true if the child was added, false otherwise 19869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 19879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected boolean addViewInLayout(View child, int index, LayoutParams params, 19889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean preventRequestLayout) { 19899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project child.mParent = null; 19909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addViewInner(child, index, params, preventRequestLayout); 199124443ea3992e372e47daa50266b0f2ec38cac388Romain Guy child.mPrivateFlags = (child.mPrivateFlags & ~DIRTY_MASK) | DRAWN; 19929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 19939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 19969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Prevents the specified child to be laid out during the next layout pass. 19979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 19989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param child the child on which to perform the cleanup 19999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 20009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void cleanupLayoutState(View child) { 20019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project child.mPrivateFlags &= ~View.FORCE_LAYOUT; 20029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void addViewInner(View child, int index, LayoutParams params, 20059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean preventRequestLayout) { 20069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (child.getParent() != null) { 20089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalStateException("The specified child already has a parent. " + 20099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "You must call removeView() on the child's parent first."); 20109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!checkLayoutParams(params)) { 20139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project params = generateLayoutParams(params); 20149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (preventRequestLayout) { 20179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project child.mLayoutParams = params; 20189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 20199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project child.setLayoutParams(params); 20209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (index < 0) { 20239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project index = mChildrenCount; 20249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addInArray(child, index); 20279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // tell our children 20299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (preventRequestLayout) { 20309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project child.assignParent(this); 20319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 20329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project child.mParent = this; 20339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (child.hasFocus()) { 20369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project requestChildFocus(child, child.findFocus()); 20379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20388506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy 20399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AttachInfo ai = mAttachInfo; 20409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ai != null) { 20418506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy boolean lastKeepOn = ai.mKeepScreenOn; 20429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.mKeepScreenOn = false; 20439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project child.dispatchAttachedToWindow(mAttachInfo, (mViewFlags&VISIBILITY_MASK)); 20449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ai.mKeepScreenOn) { 20459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project needGlobalAttributesUpdate(true); 20469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.mKeepScreenOn = lastKeepOn; 20489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mOnHierarchyChangeListener != null) { 20519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOnHierarchyChangeListener.onChildViewAdded(this, child); 20529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((child.mViewFlags & DUPLICATE_PARENT_STATE) == DUPLICATE_PARENT_STATE) { 20559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mGroupFlags |= FLAG_NOTIFY_CHILDREN_ON_DRAWABLE_STATE_CHANGE; 20569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void addInArray(View child, int index) { 20609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project View[] children = mChildren; 20619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int count = mChildrenCount; 20629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int size = children.length; 20639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (index == count) { 20649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (size == count) { 20659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mChildren = new View[size + ARRAY_CAPACITY_INCREMENT]; 20669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.arraycopy(children, 0, mChildren, 0, size); 20679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project children = mChildren; 20689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project children[mChildrenCount++] = child; 20709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (index < count) { 20719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (size == count) { 20729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mChildren = new View[size + ARRAY_CAPACITY_INCREMENT]; 20739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.arraycopy(children, 0, mChildren, 0, index); 20749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.arraycopy(children, index, mChildren, index + 1, count - index); 20759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project children = mChildren; 20769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 20779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.arraycopy(children, index, children, index + 1, count - index); 20789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project children[index] = child; 20809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mChildrenCount++; 20819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 20829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IndexOutOfBoundsException("index=" + index + " count=" + count); 20839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // This method also sets the child's mParent to null 20879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void removeFromArray(int index) { 20889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final View[] children = mChildren; 20899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project children[index].mParent = null; 20909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int count = mChildrenCount; 20919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (index == count - 1) { 20929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project children[--mChildrenCount] = null; 20939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (index >= 0 && index < count) { 20949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.arraycopy(children, index + 1, children, index, count - index - 1); 20959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project children[--mChildrenCount] = null; 20969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 20979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IndexOutOfBoundsException(); 20989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // This method also sets the children's mParent to null 21029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void removeFromArray(int start, int count) { 21039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final View[] children = mChildren; 21049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int childrenCount = mChildrenCount; 21059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project start = Math.max(0, start); 21079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int end = Math.min(childrenCount, start + count); 21089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (start == end) { 21109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 21119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (end == childrenCount) { 21149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = start; i < end; i++) { 21159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project children[i].mParent = null; 21169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project children[i] = null; 21179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 21199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = start; i < end; i++) { 21209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project children[i].mParent = null; 21219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Since we're looping above, we might as well do the copy, but is arraycopy() 21249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // faster than the extra 2 bounds checks we would do in the loop? 21259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.arraycopy(children, end, children, start, childrenCount - end); 21269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = childrenCount - (end - start); i < childrenCount; i++) { 21289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project children[i] = null; 21299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mChildrenCount -= (end - start); 21339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void bindLayoutAnimation(View child) { 21369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Animation a = mLayoutAnimationController.getAnimationForView(child); 21379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project child.setAnimation(a); 21389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 21419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Subclasses should override this method to set layout animation 21429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * parameters on the supplied child. 21439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 21449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param child the child to associate with animation parameters 21459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param params the child's layout parameters which hold the animation 21469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * parameters 21479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param index the index of the child in the view group 21489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param count the number of children in the view group 21499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 21509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void attachLayoutAnimationParameters(View child, 21519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LayoutParams params, int index, int count) { 21529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LayoutAnimationController.AnimationParameters animationParams = 21539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project params.layoutAnimationParameters; 21549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (animationParams == null) { 21559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project animationParams = new LayoutAnimationController.AnimationParameters(); 21569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project params.layoutAnimationParameters = animationParams; 21579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project animationParams.count = count; 21609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project animationParams.index = index; 21619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 21649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 21659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 21669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void removeView(View view) { 21679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project removeViewInternal(view); 21689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project requestLayout(); 21699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project invalidate(); 21709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 21739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Removes a view during layout. This is useful if in your onLayout() method, 21749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you need to remove more views. 21759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 21769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param view the view to remove from the group 21779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 21789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void removeViewInLayout(View view) { 21799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project removeViewInternal(view); 21809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 21839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Removes a range of views during layout. This is useful if in your onLayout() method, 21849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you need to remove more views. 21859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 21869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param start the index of the first view to remove from the group 21879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param count the number of views to remove from the group 21889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 21899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void removeViewsInLayout(int start, int count) { 21909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project removeViewsInternal(start, count); 21919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 21949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Removes the view at the specified position in the group. 21959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 21969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param index the position in the group of the view to remove 21979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 21989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void removeViewAt(int index) { 21999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project removeViewInternal(index, getChildAt(index)); 22009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project requestLayout(); 22019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project invalidate(); 22029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 22059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Removes the specified range of views from the group. 22069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 22079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param start the first position in the group of the range of views to remove 22089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param count the number of views to remove 22099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 22109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void removeViews(int start, int count) { 22119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project removeViewsInternal(start, count); 22129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project requestLayout(); 22139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project invalidate(); 22149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void removeViewInternal(View view) { 22179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int index = indexOfChild(view); 22189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (index >= 0) { 22199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project removeViewInternal(index, view); 22209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void removeViewInternal(int index, View view) { 22249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean clearChildFocus = false; 22259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (view == mFocused) { 22269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project view.clearFocusForRemoval(); 22279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project clearChildFocus = true; 22289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (view.getAnimation() != null) { 22319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addDisappearingView(view); 22329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (view.mAttachInfo != null) { 22339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project view.dispatchDetachedFromWindow(); 22349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mOnHierarchyChangeListener != null) { 22379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOnHierarchyChangeListener.onChildViewRemoved(this, view); 22389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project needGlobalAttributesUpdate(false); 22418506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy 22429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project removeFromArray(index); 22439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (clearChildFocus) { 22459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project clearChildFocus(view); 22469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void removeViewsInternal(int start, int count) { 22509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final OnHierarchyChangeListener onHierarchyChangeListener = mOnHierarchyChangeListener; 22519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final boolean notifyListener = onHierarchyChangeListener != null; 22529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final View focused = mFocused; 22539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final boolean detach = mAttachInfo != null; 22549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project View clearChildFocus = null; 22559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final View[] children = mChildren; 22579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int end = start + count; 22589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = start; i < end; i++) { 22609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final View view = children[i]; 22619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (view == focused) { 22639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project view.clearFocusForRemoval(); 22649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project clearChildFocus = view; 22659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (view.getAnimation() != null) { 22689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addDisappearingView(view); 22699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (detach) { 22709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project view.dispatchDetachedFromWindow(); 22719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project needGlobalAttributesUpdate(false); 22748506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy 22759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (notifyListener) { 22769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project onHierarchyChangeListener.onChildViewRemoved(this, view); 22779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project removeFromArray(start, count); 22819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (clearChildFocus != null) { 22839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project clearChildFocus(clearChildFocus); 22849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 22889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Call this method to remove all child views from the 22899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * ViewGroup. 22909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 22919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void removeAllViews() { 22929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project removeAllViewsInLayout(); 22939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project requestLayout(); 22949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project invalidate(); 22959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 22989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Called by a ViewGroup subclass to remove child views from itself, 22999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * when it must first know its size on screen before it can calculate how many 23009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * child views it will render. An example is a Gallery or a ListView, which 23019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * may "have" 50 children, but actually only render the number of children 23029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that can currently fit inside the object on screen. Do not call 23039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this method unless you are extending ViewGroup and understand the 23049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * view measuring and layout pipeline. 23059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 23069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void removeAllViewsInLayout() { 23079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int count = mChildrenCount; 23089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (count <= 0) { 23099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 23109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final View[] children = mChildren; 23139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mChildrenCount = 0; 23149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final OnHierarchyChangeListener listener = mOnHierarchyChangeListener; 23169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final boolean notify = listener != null; 23179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final View focused = mFocused; 23189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final boolean detach = mAttachInfo != null; 23199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project View clearChildFocus = null; 23209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project needGlobalAttributesUpdate(false); 23228506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy 23239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = count - 1; i >= 0; i--) { 23249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final View view = children[i]; 23259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (view == focused) { 23279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project view.clearFocusForRemoval(); 23289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project clearChildFocus = view; 23299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (view.getAnimation() != null) { 23329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addDisappearingView(view); 23339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (detach) { 23349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project view.dispatchDetachedFromWindow(); 23359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (notify) { 23389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project listener.onChildViewRemoved(this, view); 23399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project view.mParent = null; 23429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project children[i] = null; 23439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (clearChildFocus != null) { 23469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project clearChildFocus(clearChildFocus); 23479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2348b08013c312e3d849029a2f4c11889274c00f438dAdam Powell 2349b08013c312e3d849029a2f4c11889274c00f438dAdam Powell mGroupFlags &= ~FLAG_CHILD_HAS_OVERLAY; 23509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 23539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Finishes the removal of a detached view. This method will dispatch the detached from 23549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * window event and notify the hierarchy change listener. 23559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 23569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param child the child to be definitely removed from the view hierarchy 23579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param animate if true and the view has an animation, the view is placed in the 23589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * disappearing views list, otherwise, it is detached from the window 23599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 23609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #attachViewToParent(View, int, android.view.ViewGroup.LayoutParams) 23619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #detachAllViewsFromParent() 23629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #detachViewFromParent(View) 23639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #detachViewFromParent(int) 23649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 23659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void removeDetachedView(View child, boolean animate) { 23669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (child == mFocused) { 23679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project child.clearFocus(); 23689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23698506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy 23709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (animate && child.getAnimation() != null) { 23719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addDisappearingView(child); 23729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (child.mAttachInfo != null) { 23739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project child.dispatchDetachedFromWindow(); 23749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mOnHierarchyChangeListener != null) { 23779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOnHierarchyChangeListener.onChildViewRemoved(this, child); 23789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 23829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Attaches a view to this view group. Attaching a view assigns this group as the parent, 23839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * sets the layout parameters and puts the view in the list of children so it can be retrieved 23849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * by calling {@link #getChildAt(int)}. 23859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 23869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This method should be called only for view which were detached from their parent. 23879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 23889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param child the child to attach 23899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param index the index at which the child should be attached 23909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param params the layout parameters of the child 23919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 23929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #removeDetachedView(View, boolean) 23939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #detachAllViewsFromParent() 23949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #detachViewFromParent(View) 23959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #detachViewFromParent(int) 23969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 23979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void attachViewToParent(View child, int index, LayoutParams params) { 23989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project child.mLayoutParams = params; 23999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (index < 0) { 24019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project index = mChildrenCount; 24029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project addInArray(child, index); 24059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project child.mParent = this; 2407bc9fdc92603112b3462024c8d0096b4eca3001c3Romain Guy child.mPrivateFlags = (child.mPrivateFlags & ~DIRTY_MASK & ~DRAWING_CACHE_VALID) | DRAWN; 24089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (child.hasFocus()) { 24109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project requestChildFocus(child, child.findFocus()); 24119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 24159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Detaches a view from its parent. Detaching a view should be temporary and followed 24169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * either by a call to {@link #attachViewToParent(View, int, android.view.ViewGroup.LayoutParams)} 24179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or a call to {@link #removeDetachedView(View, boolean)}. When a view is detached, 24189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * its parent is null and cannot be retrieved by a call to {@link #getChildAt(int)}. 24199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 24209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param child the child to detach 24219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 24229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #detachViewFromParent(int) 24239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #detachViewsFromParent(int, int) 24249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #detachAllViewsFromParent() 24259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #attachViewToParent(View, int, android.view.ViewGroup.LayoutParams) 24269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #removeDetachedView(View, boolean) 24279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 24289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void detachViewFromParent(View child) { 24299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project removeFromArray(indexOfChild(child)); 24309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 24339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Detaches a view from its parent. Detaching a view should be temporary and followed 24349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * either by a call to {@link #attachViewToParent(View, int, android.view.ViewGroup.LayoutParams)} 24359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or a call to {@link #removeDetachedView(View, boolean)}. When a view is detached, 24369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * its parent is null and cannot be retrieved by a call to {@link #getChildAt(int)}. 24379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 24389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param index the index of the child to detach 24399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 24409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #detachViewFromParent(View) 24419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #detachAllViewsFromParent() 24429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #detachViewsFromParent(int, int) 24439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #attachViewToParent(View, int, android.view.ViewGroup.LayoutParams) 24449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #removeDetachedView(View, boolean) 24459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 24469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void detachViewFromParent(int index) { 24479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project removeFromArray(index); 24489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 24519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Detaches a range of view from their parent. Detaching a view should be temporary and followed 24529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * either by a call to {@link #attachViewToParent(View, int, android.view.ViewGroup.LayoutParams)} 24539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or a call to {@link #removeDetachedView(View, boolean)}. When a view is detached, its 24549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * parent is null and cannot be retrieved by a call to {@link #getChildAt(int)}. 24559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 24569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param start the first index of the childrend range to detach 24579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param count the number of children to detach 24589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 24599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #detachViewFromParent(View) 24609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #detachViewFromParent(int) 24619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #detachAllViewsFromParent() 24629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #attachViewToParent(View, int, android.view.ViewGroup.LayoutParams) 24639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #removeDetachedView(View, boolean) 24649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 24659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void detachViewsFromParent(int start, int count) { 24669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project removeFromArray(start, count); 24679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 24709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Detaches all views from the parent. Detaching a view should be temporary and followed 24719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * either by a call to {@link #attachViewToParent(View, int, android.view.ViewGroup.LayoutParams)} 24729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or a call to {@link #removeDetachedView(View, boolean)}. When a view is detached, 24739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * its parent is null and cannot be retrieved by a call to {@link #getChildAt(int)}. 24749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 24759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #detachViewFromParent(View) 24769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #detachViewFromParent(int) 24779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #detachViewsFromParent(int, int) 24789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #attachViewToParent(View, int, android.view.ViewGroup.LayoutParams) 24799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #removeDetachedView(View, boolean) 24809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 24819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void detachAllViewsFromParent() { 24829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int count = mChildrenCount; 24839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (count <= 0) { 24849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 24859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final View[] children = mChildren; 24889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mChildrenCount = 0; 24899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = count - 1; i >= 0; i--) { 24919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project children[i].mParent = null; 24929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project children[i] = null; 24939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 24979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Don't call or override this method. It is used for the implementation of 24989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the view hierarchy. 24999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 25009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void invalidateChild(View child, final Rect dirty) { 25019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ViewDebug.TRACE_HIERARCHY) { 25029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ViewDebug.trace(this, ViewDebug.HierarchyTraceType.INVALIDATE_CHILD); 25039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ViewParent parent = this; 25069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final AttachInfo attachInfo = mAttachInfo; 25089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (attachInfo != null) { 25099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int[] location = attachInfo.mInvalidateChildLocation; 25109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project location[CHILD_LEFT_INDEX] = child.mLeft; 25119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project location[CHILD_TOP_INDEX] = child.mTop; 25129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If the child is drawing an animation, we want to copy this flag onto 25149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ourselves and the parent to make sure the invalidate request goes 25159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // through 25169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final boolean drawAnimation = (child.mPrivateFlags & DRAW_ANIMATION) == DRAW_ANIMATION; 251724443ea3992e372e47daa50266b0f2ec38cac388Romain Guy 251824443ea3992e372e47daa50266b0f2ec38cac388Romain Guy // Check whether the child that requests the invalidate is fully opaque 2519ec25df9fbc685be384f8dd764fa224a4d923e9d8Romain Guy final boolean isOpaque = child.isOpaque() && !drawAnimation && 2520ec25df9fbc685be384f8dd764fa224a4d923e9d8Romain Guy child.getAnimation() != null; 252124443ea3992e372e47daa50266b0f2ec38cac388Romain Guy // Mark the child as dirty, using the appropriate flag 252224443ea3992e372e47daa50266b0f2ec38cac388Romain Guy // Make sure we do not set both flags at the same time 252324443ea3992e372e47daa50266b0f2ec38cac388Romain Guy final int opaqueFlag = isOpaque ? DIRTY_OPAQUE : DIRTY; 252424443ea3992e372e47daa50266b0f2ec38cac388Romain Guy 25259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project do { 252624443ea3992e372e47daa50266b0f2ec38cac388Romain Guy View view = null; 252724443ea3992e372e47daa50266b0f2ec38cac388Romain Guy if (parent instanceof View) { 252824443ea3992e372e47daa50266b0f2ec38cac388Romain Guy view = (View) parent; 252924443ea3992e372e47daa50266b0f2ec38cac388Romain Guy } 253024443ea3992e372e47daa50266b0f2ec38cac388Romain Guy 2531bb93d5598daa3312318c29401815bddf1df8c4deRomain Guy if (drawAnimation) { 253224443ea3992e372e47daa50266b0f2ec38cac388Romain Guy if (view != null) { 253324443ea3992e372e47daa50266b0f2ec38cac388Romain Guy view.mPrivateFlags |= DRAW_ANIMATION; 2534bb93d5598daa3312318c29401815bddf1df8c4deRomain Guy } else if (parent instanceof ViewRoot) { 2535bb93d5598daa3312318c29401815bddf1df8c4deRomain Guy ((ViewRoot) parent).mIsAnimating = true; 2536bb93d5598daa3312318c29401815bddf1df8c4deRomain Guy } 25379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 253824443ea3992e372e47daa50266b0f2ec38cac388Romain Guy 253924443ea3992e372e47daa50266b0f2ec38cac388Romain Guy // If the parent is dirty opaque or not dirty, mark it dirty with the opaque 254024443ea3992e372e47daa50266b0f2ec38cac388Romain Guy // flag coming from the child that initiated the invalidate 254124443ea3992e372e47daa50266b0f2ec38cac388Romain Guy if (view != null && (view.mPrivateFlags & DIRTY_MASK) != DIRTY) { 254224443ea3992e372e47daa50266b0f2ec38cac388Romain Guy view.mPrivateFlags = (view.mPrivateFlags & ~DIRTY_MASK) | opaqueFlag; 254324443ea3992e372e47daa50266b0f2ec38cac388Romain Guy } 254424443ea3992e372e47daa50266b0f2ec38cac388Romain Guy 25459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parent = parent.invalidateChildInParent(location, dirty); 25469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } while (parent != null); 25479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 25519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Don't call or override this method. It is used for the implementation of 25529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the view hierarchy. 25539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 25549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This implementation returns null if this ViewGroup does not have a parent, 25559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if this ViewGroup is already fully invalidated or if the dirty rectangle 25569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * does not intersect with this ViewGroup's bounds. 25579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 25589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ViewParent invalidateChildInParent(final int[] location, final Rect dirty) { 25599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ViewDebug.TRACE_HIERARCHY) { 25609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ViewDebug.trace(this, ViewDebug.HierarchyTraceType.INVALIDATE_CHILD_IN_PARENT); 25619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((mPrivateFlags & DRAWN) == DRAWN) { 25649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((mGroupFlags & (FLAG_OPTIMIZE_INVALIDATE | FLAG_ANIMATION_DONE)) != 25659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FLAG_OPTIMIZE_INVALIDATE) { 25669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dirty.offset(location[CHILD_LEFT_INDEX] - mScrollX, 25679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project location[CHILD_TOP_INDEX] - mScrollY); 25689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int left = mLeft; 25709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int top = mTop; 25719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2572b08013c312e3d849029a2f4c11889274c00f438dAdam Powell if ((mGroupFlags & FLAG_CHILD_HAS_OVERLAY) == FLAG_CHILD_HAS_OVERLAY || 2573b08013c312e3d849029a2f4c11889274c00f438dAdam Powell dirty.intersect(0, 0, mRight - left, mBottom - top) || 25749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (mPrivateFlags & DRAW_ANIMATION) == DRAW_ANIMATION) { 25759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPrivateFlags &= ~DRAWING_CACHE_VALID; 25769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project location[CHILD_LEFT_INDEX] = left; 25789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project location[CHILD_TOP_INDEX] = top; 25799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mParent; 25819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 25839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPrivateFlags &= ~DRAWN & ~DRAWING_CACHE_VALID; 25849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project location[CHILD_LEFT_INDEX] = mLeft; 25869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project location[CHILD_TOP_INDEX] = mTop; 25879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dirty.set(0, 0, mRight - location[CHILD_LEFT_INDEX], 25899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBottom - location[CHILD_TOP_INDEX]); 25909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mParent; 25929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 25969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 25999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Offset a rectangle that is in a descendant's coordinate 26009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * space into our coordinate space. 26019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param descendant A descendant of this view 26029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param rect A rectangle defined in descendant's coordinate space. 26039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 26049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void offsetDescendantRectToMyCoords(View descendant, Rect rect) { 26059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project offsetRectBetweenParentAndChild(descendant, rect, true, false); 26069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 26099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Offset a rectangle that is in our coordinate space into an ancestor's 26109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * coordinate space. 26119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param descendant A descendant of this view 26129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param rect A rectangle defined in descendant's coordinate space. 26139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 26149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void offsetRectIntoDescendantCoords(View descendant, Rect rect) { 26159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project offsetRectBetweenParentAndChild(descendant, rect, false, false); 26169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 26199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Helper method that offsets a rect either from parent to descendant or 26209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * descendant to parent. 26219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 26229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void offsetRectBetweenParentAndChild(View descendant, Rect rect, 26239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean offsetFromChildToParent, boolean clipToBounds) { 26249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // already in the same coord system :) 26269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (descendant == this) { 26279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 26289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ViewParent theParent = descendant.mParent; 26319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // search and offset up to the parent 26339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((theParent != null) 26349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (theParent instanceof View) 26359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (theParent != this)) { 26369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (offsetFromChildToParent) { 26389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rect.offset(descendant.mLeft - descendant.mScrollX, 26399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project descendant.mTop - descendant.mScrollY); 26409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (clipToBounds) { 26419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project View p = (View) theParent; 26429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rect.intersect(0, 0, p.mRight - p.mLeft, p.mBottom - p.mTop); 26439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 26459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (clipToBounds) { 26469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project View p = (View) theParent; 26479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rect.intersect(0, 0, p.mRight - p.mLeft, p.mBottom - p.mTop); 26489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rect.offset(descendant.mScrollX - descendant.mLeft, 26509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project descendant.mScrollY - descendant.mTop); 26519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project descendant = (View) theParent; 26549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project theParent = descendant.mParent; 26559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // now that we are up to this view, need to offset one more time 26589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // to get into our coordinate space 26599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (theParent == this) { 26609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (offsetFromChildToParent) { 26619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rect.offset(descendant.mLeft - descendant.mScrollX, 26629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project descendant.mTop - descendant.mScrollY); 26639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 26649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rect.offset(descendant.mScrollX - descendant.mLeft, 26659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project descendant.mScrollY - descendant.mTop); 26669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 26689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException("parameter must be a descendant of this view"); 26699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 26739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Offset the vertical location of all children of this view by the specified number of pixels. 26749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 26759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param offset the number of pixels to offset 26769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 26779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide 26789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 26799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void offsetChildrenTopAndBottom(int offset) { 26809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int count = mChildrenCount; 26819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final View[] children = mChildren; 26829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < count; i++) { 26849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final View v = children[i]; 26859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project v.mTop += offset; 26869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project v.mBottom += offset; 26879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 26919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 26929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 26939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean getChildVisibleRect(View child, Rect r, android.graphics.Point offset) { 26949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int dx = child.mLeft - mScrollX; 26959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int dy = child.mTop - mScrollY; 26969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (offset != null) { 26979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project offset.x += dx; 26989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project offset.y += dy; 26999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r.offset(dx, dy); 27019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return r.intersect(0, 0, mRight - mLeft, mBottom - mTop) && 27029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (mParent == null || mParent.getChildVisibleRect(this, r, offset)); 27039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 27069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 27079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 27089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 27099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected abstract void onLayout(boolean changed, 27109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int l, int t, int r, int b); 27119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 27139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Indicates whether the view group has the ability to animate its children 27149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * after the first layout. 27159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 27169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true if the children can be animated, false otherwise 27179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 27189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected boolean canAnimate() { 27199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mLayoutAnimationController != null; 27209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 27239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Runs the layout animation. Calling this method triggers a relayout of 27249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this view group. 27259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 27269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void startLayoutAnimation() { 27279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mLayoutAnimationController != null) { 27289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mGroupFlags |= FLAG_RUN_ANIMATION; 27299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project requestLayout(); 27309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 27349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Schedules the layout animation to be played after the next layout pass 27359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of this view group. This can be used to restart the layout animation 27369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * when the content of the view group changes or when the activity is 27379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * paused and resumed. 27389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 27399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void scheduleLayoutAnimation() { 27409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mGroupFlags |= FLAG_RUN_ANIMATION; 27419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 27449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the layout animation controller used to animate the group's 27459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * children after the first layout. 27469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 27479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param controller the animation controller 27489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 27499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setLayoutAnimation(LayoutAnimationController controller) { 27509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLayoutAnimationController = controller; 27519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mLayoutAnimationController != null) { 27529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mGroupFlags |= FLAG_RUN_ANIMATION; 27539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 27579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the layout animation controller used to animate the group's 27589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * children. 27599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 27609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the current animation controller 27619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 27629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public LayoutAnimationController getLayoutAnimation() { 27639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mLayoutAnimationController; 27649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 27679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Indicates whether the children's drawing cache is used during a layout 27689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * animation. By default, the drawing cache is enabled but this will prevent 27699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * nested layout animations from working. To nest animations, you must disable 27709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the cache. 27719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 27729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true if the animation cache is enabled, false otherwise 27739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 27749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setAnimationCacheEnabled(boolean) 27759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see View#setDrawingCacheEnabled(boolean) 27769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 27779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @ViewDebug.ExportedProperty 27789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isAnimationCacheEnabled() { 27799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (mGroupFlags & FLAG_ANIMATION_CACHE) == FLAG_ANIMATION_CACHE; 27809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 27839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Enables or disables the children's drawing cache during a layout animation. 27849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * By default, the drawing cache is enabled but this will prevent nested 27859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * layout animations from working. To nest animations, you must disable the 27869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * cache. 27879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 27889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param enabled true to enable the animation cache, false otherwise 27899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 27909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #isAnimationCacheEnabled() 27919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see View#setDrawingCacheEnabled(boolean) 27929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 27939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setAnimationCacheEnabled(boolean enabled) { 27949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setBooleanFlag(FLAG_ANIMATION_CACHE, enabled); 27959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 27989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Indicates whether this ViewGroup will always try to draw its children using their 27999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * drawing cache. By default this property is enabled. 28009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 28019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true if the animation cache is enabled, false otherwise 28029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 28039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setAlwaysDrawnWithCacheEnabled(boolean) 28049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setChildrenDrawnWithCacheEnabled(boolean) 28059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see View#setDrawingCacheEnabled(boolean) 28069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2807bea95162ca25bd00b0479d93739b6283795c3986Konstantin Lopyrev @ViewDebug.ExportedProperty(category = "drawing") 28089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isAlwaysDrawnWithCacheEnabled() { 28099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (mGroupFlags & FLAG_ALWAYS_DRAWN_WITH_CACHE) == FLAG_ALWAYS_DRAWN_WITH_CACHE; 28109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 28139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Indicates whether this ViewGroup will always try to draw its children using their 28149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * drawing cache. This property can be set to true when the cache rendering is 28159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * slightly different from the children's normal rendering. Renderings can be different, 28169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * for instance, when the cache's quality is set to low. 28179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 28189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * When this property is disabled, the ViewGroup will use the drawing cache of its 28199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * children only when asked to. It's usually the task of subclasses to tell ViewGroup 28209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * when to start using the drawing cache and when to stop using it. 28219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 28229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param always true to always draw with the drawing cache, false otherwise 28239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 28249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #isAlwaysDrawnWithCacheEnabled() 28259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setChildrenDrawnWithCacheEnabled(boolean) 28269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see View#setDrawingCacheEnabled(boolean) 28279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see View#setDrawingCacheQuality(int) 28289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 28299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setAlwaysDrawnWithCacheEnabled(boolean always) { 28309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setBooleanFlag(FLAG_ALWAYS_DRAWN_WITH_CACHE, always); 28319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 28349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Indicates whether the ViewGroup is currently drawing its children using 28359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * their drawing cache. 28369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 28379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true if children should be drawn with their cache, false otherwise 28389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 28399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setAlwaysDrawnWithCacheEnabled(boolean) 28409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setChildrenDrawnWithCacheEnabled(boolean) 28419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2842bea95162ca25bd00b0479d93739b6283795c3986Konstantin Lopyrev @ViewDebug.ExportedProperty(category = "drawing") 28439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected boolean isChildrenDrawnWithCacheEnabled() { 28449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (mGroupFlags & FLAG_CHILDREN_DRAWN_WITH_CACHE) == FLAG_CHILDREN_DRAWN_WITH_CACHE; 28459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 28489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Tells the ViewGroup to draw its children using their drawing cache. This property 28499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is ignored when {@link #isAlwaysDrawnWithCacheEnabled()} is true. A child's drawing cache 28509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will be used only if it has been enabled. 28519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 28529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Subclasses should call this method to start and stop using the drawing cache when 28539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * they perform performance sensitive operations, like scrolling or animating. 28549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 28559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param enabled true if children should be drawn with their cache, false otherwise 28569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 28579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setAlwaysDrawnWithCacheEnabled(boolean) 28589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #isChildrenDrawnWithCacheEnabled() 28599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 28609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void setChildrenDrawnWithCacheEnabled(boolean enabled) { 28619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setBooleanFlag(FLAG_CHILDREN_DRAWN_WITH_CACHE, enabled); 28629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2864293451e4f005a26386db873f5192f86585cc79bcRomain Guy /** 2865293451e4f005a26386db873f5192f86585cc79bcRomain Guy * Indicates whether the ViewGroup is drawing its children in the order defined by 2866293451e4f005a26386db873f5192f86585cc79bcRomain Guy * {@link #getChildDrawingOrder(int, int)}. 2867293451e4f005a26386db873f5192f86585cc79bcRomain Guy * 2868293451e4f005a26386db873f5192f86585cc79bcRomain Guy * @return true if children drawing order is defined by {@link #getChildDrawingOrder(int, int)}, 2869293451e4f005a26386db873f5192f86585cc79bcRomain Guy * false otherwise 2870293451e4f005a26386db873f5192f86585cc79bcRomain Guy * 2871293451e4f005a26386db873f5192f86585cc79bcRomain Guy * @see #setChildrenDrawingOrderEnabled(boolean) 2872293451e4f005a26386db873f5192f86585cc79bcRomain Guy * @see #getChildDrawingOrder(int, int) 2873293451e4f005a26386db873f5192f86585cc79bcRomain Guy */ 2874bea95162ca25bd00b0479d93739b6283795c3986Konstantin Lopyrev @ViewDebug.ExportedProperty(category = "drawing") 2875293451e4f005a26386db873f5192f86585cc79bcRomain Guy protected boolean isChildrenDrawingOrderEnabled() { 2876293451e4f005a26386db873f5192f86585cc79bcRomain Guy return (mGroupFlags & FLAG_USE_CHILD_DRAWING_ORDER) == FLAG_USE_CHILD_DRAWING_ORDER; 2877293451e4f005a26386db873f5192f86585cc79bcRomain Guy } 2878293451e4f005a26386db873f5192f86585cc79bcRomain Guy 2879293451e4f005a26386db873f5192f86585cc79bcRomain Guy /** 2880293451e4f005a26386db873f5192f86585cc79bcRomain Guy * Tells the ViewGroup whether to draw its children in the order defined by the method 2881293451e4f005a26386db873f5192f86585cc79bcRomain Guy * {@link #getChildDrawingOrder(int, int)}. 2882293451e4f005a26386db873f5192f86585cc79bcRomain Guy * 2883293451e4f005a26386db873f5192f86585cc79bcRomain Guy * @param enabled true if the order of the children when drawing is determined by 2884293451e4f005a26386db873f5192f86585cc79bcRomain Guy * {@link #getChildDrawingOrder(int, int)}, false otherwise 2885293451e4f005a26386db873f5192f86585cc79bcRomain Guy * 2886293451e4f005a26386db873f5192f86585cc79bcRomain Guy * @see #isChildrenDrawingOrderEnabled() 2887293451e4f005a26386db873f5192f86585cc79bcRomain Guy * @see #getChildDrawingOrder(int, int) 2888293451e4f005a26386db873f5192f86585cc79bcRomain Guy */ 2889293451e4f005a26386db873f5192f86585cc79bcRomain Guy protected void setChildrenDrawingOrderEnabled(boolean enabled) { 2890293451e4f005a26386db873f5192f86585cc79bcRomain Guy setBooleanFlag(FLAG_USE_CHILD_DRAWING_ORDER, enabled); 2891293451e4f005a26386db873f5192f86585cc79bcRomain Guy } 2892293451e4f005a26386db873f5192f86585cc79bcRomain Guy 28939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void setBooleanFlag(int flag, boolean value) { 28949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (value) { 28959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mGroupFlags |= flag; 28969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 28979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mGroupFlags &= ~flag; 28989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 29029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns an integer indicating what types of drawing caches are kept in memory. 29039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 29049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setPersistentDrawingCache(int) 29059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setAnimationCacheEnabled(boolean) 29069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 29079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return one or a combination of {@link #PERSISTENT_NO_CACHE}, 29089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #PERSISTENT_ANIMATION_CACHE}, {@link #PERSISTENT_SCROLLING_CACHE} 29099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and {@link #PERSISTENT_ALL_CACHES} 29109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2911bea95162ca25bd00b0479d93739b6283795c3986Konstantin Lopyrev @ViewDebug.ExportedProperty(category = "drawing", mapping = { 29129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @ViewDebug.IntToString(from = PERSISTENT_NO_CACHE, to = "NONE"), 29139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @ViewDebug.IntToString(from = PERSISTENT_ALL_CACHES, to = "ANIMATION"), 29149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @ViewDebug.IntToString(from = PERSISTENT_SCROLLING_CACHE, to = "SCROLLING"), 29159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @ViewDebug.IntToString(from = PERSISTENT_ALL_CACHES, to = "ALL") 29169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }) 29179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getPersistentDrawingCache() { 29189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPersistentDrawingCache; 29199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 29229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Indicates what types of drawing caches should be kept in memory after 29239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * they have been created. 29249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 29259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #getPersistentDrawingCache() 29269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setAnimationCacheEnabled(boolean) 29279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 29289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param drawingCacheToKeep one or a combination of {@link #PERSISTENT_NO_CACHE}, 29299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #PERSISTENT_ANIMATION_CACHE}, {@link #PERSISTENT_SCROLLING_CACHE} 29309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and {@link #PERSISTENT_ALL_CACHES} 29319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 29329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setPersistentDrawingCache(int drawingCacheToKeep) { 29339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPersistentDrawingCache = drawingCacheToKeep & PERSISTENT_ALL_CACHES; 29349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 29379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns a new set of layout parameters based on the supplied attributes set. 29389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 29399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param attrs the attributes to build the layout parameters from 29409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 29419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return an instance of {@link android.view.ViewGroup.LayoutParams} or one 29429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of its descendants 29439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 29449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public LayoutParams generateLayoutParams(AttributeSet attrs) { 29459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new LayoutParams(getContext(), attrs); 29469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 29499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns a safe set of layout parameters based on the supplied layout params. 29509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * When a ViewGroup is passed a View whose layout params do not pass the test of 29519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #checkLayoutParams(android.view.ViewGroup.LayoutParams)}, this method 29529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is invoked. This method should return a new set of layout params suitable for 29539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this ViewGroup, possibly by copying the appropriate attributes from the 29549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * specified set of layout params. 29559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 29569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param p The layout parameters to convert into a suitable set of layout parameters 29579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * for this ViewGroup. 29589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 29599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return an instance of {@link android.view.ViewGroup.LayoutParams} or one 29609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of its descendants 29619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 29629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected LayoutParams generateLayoutParams(ViewGroup.LayoutParams p) { 29639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return p; 29649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 29679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns a set of default layout parameters. These parameters are requested 29689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * when the View passed to {@link #addView(View)} has no layout parameters 29699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * already set. If null is returned, an exception is thrown from addView. 29709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 29719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return a set of default layout parameters or null 29729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 29739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected LayoutParams generateDefaultLayoutParams() { 29749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 29759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 297813922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy * @hide 297913922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy */ 298013922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy @Override 298113922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy protected boolean dispatchConsistencyCheck(int consistency) { 298213922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy boolean result = super.dispatchConsistencyCheck(consistency); 298313922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy 298413922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy final int count = mChildrenCount; 298513922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy final View[] children = mChildren; 298613922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy for (int i = 0; i < count; i++) { 298713922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy if (!children[i].dispatchConsistencyCheck(consistency)) result = false; 298813922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy } 298913922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy 299013922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy return result; 299113922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy } 299213922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy 299313922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy /** 299413922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy * @hide 299513922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy */ 299613922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy @Override 299713922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy protected boolean onConsistencyCheck(int consistency) { 299813922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy boolean result = super.onConsistencyCheck(consistency); 299913922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy 300013922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy final boolean checkLayout = (consistency & ViewDebug.CONSISTENCY_LAYOUT) != 0; 300113922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy final boolean checkDrawing = (consistency & ViewDebug.CONSISTENCY_DRAWING) != 0; 300213922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy 300313922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy if (checkLayout) { 300413922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy final int count = mChildrenCount; 300513922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy final View[] children = mChildren; 300613922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy for (int i = 0; i < count; i++) { 300713922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy if (children[i].getParent() != this) { 300813922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy result = false; 300913922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy android.util.Log.d(ViewDebug.CONSISTENCY_LOG_TAG, 301013922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy "View " + children[i] + " has no parent/a parent that is not " + this); 301113922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy } 301213922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy } 301313922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy } 301413922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy 301513922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy if (checkDrawing) { 301613922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy // If this group is dirty, check that the parent is dirty as well 301713922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy if ((mPrivateFlags & DIRTY_MASK) != 0) { 301813922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy final ViewParent parent = getParent(); 301913922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy if (parent != null && !(parent instanceof ViewRoot)) { 302013922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy if ((((View) parent).mPrivateFlags & DIRTY_MASK) == 0) { 302113922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy result = false; 302213922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy android.util.Log.d(ViewDebug.CONSISTENCY_LOG_TAG, 302313922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy "ViewGroup " + this + " is dirty but its parent is not: " + this); 302413922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy } 302513922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy } 302613922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy } 302713922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy } 302813922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy 302913922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy return result; 303013922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy } 303113922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy 303213922e03037d71a538f24ddf61c0b61bb4eb5af0Romain Guy /** 30339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 30349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 30359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 30369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void debug(int depth) { 30379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.debug(depth); 30389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String output; 30399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mFocused != null) { 30419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project output = debugIndent(depth); 30429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project output += "mFocused"; 30439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.d(VIEW_LOG_TAG, output); 30449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mChildrenCount != 0) { 30469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project output = debugIndent(depth); 30479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project output += "{"; 30489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.d(VIEW_LOG_TAG, output); 30499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int count = mChildrenCount; 30519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < count; i++) { 30529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project View child = mChildren[i]; 30539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project child.debug(depth + 1); 30549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mChildrenCount != 0) { 30579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project output = debugIndent(depth); 30589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project output += "}"; 30599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.d(VIEW_LOG_TAG, output); 30609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 30649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the position in the group of the specified child view. 30659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 30669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param child the view for which to get the position 30679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return a positive integer representing the position of the view in the 30689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * group, or -1 if the view does not exist in the group 30699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 30709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int indexOfChild(View child) { 30719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int count = mChildrenCount; 30729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final View[] children = mChildren; 30739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < count; i++) { 30749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (children[i] == child) { 30759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return i; 30769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 30799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 30829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the number of children in the group. 30839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 30849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return a positive integer representing the number of children in 30859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the group 30869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 30879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getChildCount() { 30889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mChildrenCount; 30899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 30929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the view at the specified position in the group. 30939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 30949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param index the position at which to get the view from 30959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the view at the specified position or null if the position 30969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * does not exist within the group 30979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 30989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public View getChildAt(int index) { 30999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 31009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mChildren[index]; 31019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IndexOutOfBoundsException ex) { 31029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 31039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 31079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Ask all of the children of this view to measure themselves, taking into 31089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * account both the MeasureSpec requirements for this view and its padding. 31099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * We skip children that are in the GONE state The heavy lifting is done in 31109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * getChildMeasureSpec. 31119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 31129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param widthMeasureSpec The width requirements for this view 31139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param heightMeasureSpec The height requirements for this view 31149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 31159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void measureChildren(int widthMeasureSpec, int heightMeasureSpec) { 31169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int size = mChildrenCount; 31179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final View[] children = mChildren; 31189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < size; ++i) { 31199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final View child = children[i]; 31209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((child.mViewFlags & VISIBILITY_MASK) != GONE) { 31219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project measureChild(child, widthMeasureSpec, heightMeasureSpec); 31229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 31279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Ask one of the children of this view to measure itself, taking into 31289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * account both the MeasureSpec requirements for this view and its padding. 31299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The heavy lifting is done in getChildMeasureSpec. 31309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 31319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param child The child to measure 31329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param parentWidthMeasureSpec The width requirements for this view 31339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param parentHeightMeasureSpec The height requirements for this view 31349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 31359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void measureChild(View child, int parentWidthMeasureSpec, 31369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int parentHeightMeasureSpec) { 31379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final LayoutParams lp = child.getLayoutParams(); 31389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int childWidthMeasureSpec = getChildMeasureSpec(parentWidthMeasureSpec, 31409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPaddingLeft + mPaddingRight, lp.width); 31419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int childHeightMeasureSpec = getChildMeasureSpec(parentHeightMeasureSpec, 31429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPaddingTop + mPaddingBottom, lp.height); 31439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project child.measure(childWidthMeasureSpec, childHeightMeasureSpec); 31459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 31489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Ask one of the children of this view to measure itself, taking into 31499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * account both the MeasureSpec requirements for this view and its padding 31509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and margins. The child must have MarginLayoutParams The heavy lifting is 31519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * done in getChildMeasureSpec. 31529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 31539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param child The child to measure 31549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param parentWidthMeasureSpec The width requirements for this view 31559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param widthUsed Extra space that has been used up by the parent 31569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * horizontally (possibly by other children of the parent) 31579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param parentHeightMeasureSpec The height requirements for this view 31589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param heightUsed Extra space that has been used up by the parent 31599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * vertically (possibly by other children of the parent) 31609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 31619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void measureChildWithMargins(View child, 31629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int parentWidthMeasureSpec, int widthUsed, 31639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int parentHeightMeasureSpec, int heightUsed) { 31649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final MarginLayoutParams lp = (MarginLayoutParams) child.getLayoutParams(); 31659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int childWidthMeasureSpec = getChildMeasureSpec(parentWidthMeasureSpec, 31679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPaddingLeft + mPaddingRight + lp.leftMargin + lp.rightMargin 31689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + widthUsed, lp.width); 31699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int childHeightMeasureSpec = getChildMeasureSpec(parentHeightMeasureSpec, 31709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPaddingTop + mPaddingBottom + lp.topMargin + lp.bottomMargin 31719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + heightUsed, lp.height); 31729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project child.measure(childWidthMeasureSpec, childHeightMeasureSpec); 31749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 31779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Does the hard part of measureChildren: figuring out the MeasureSpec to 31789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * pass to a particular child. This method figures out the right MeasureSpec 31799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * for one dimension (height or width) of one child view. 31809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 31819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The goal is to combine information from our MeasureSpec with the 31829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * LayoutParams of the child to get the best possible results. For example, 31839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if the this view knows its size (because its MeasureSpec has a mode of 31849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * EXACTLY), and the child has indicated in its LayoutParams that it wants 31859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to be the same size as the parent, the parent should ask the child to 31869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * layout given an exact size. 31879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 31889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param spec The requirements for this view 31899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param padding The padding of this view for the current dimension and 31909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * margins, if applicable 31919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param childDimension How big the child wants to be in the current 31929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * dimension 31939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return a MeasureSpec integer for the child 31949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 31959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static int getChildMeasureSpec(int spec, int padding, int childDimension) { 31969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int specMode = MeasureSpec.getMode(spec); 31979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int specSize = MeasureSpec.getSize(spec); 31989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int size = Math.max(0, specSize - padding); 32009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int resultSize = 0; 32029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int resultMode = 0; 32039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (specMode) { 32059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Parent has imposed an exact size on us 32069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case MeasureSpec.EXACTLY: 32079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (childDimension >= 0) { 32089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project resultSize = childDimension; 32099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project resultMode = MeasureSpec.EXACTLY; 3210980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy } else if (childDimension == LayoutParams.MATCH_PARENT) { 32119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Child wants to be our size. So be it. 32129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project resultSize = size; 32139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project resultMode = MeasureSpec.EXACTLY; 32149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (childDimension == LayoutParams.WRAP_CONTENT) { 32159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Child wants to determine its own size. It can't be 32169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // bigger than us. 32179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project resultSize = size; 32189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project resultMode = MeasureSpec.AT_MOST; 32199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 32219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Parent has imposed a maximum size on us 32239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case MeasureSpec.AT_MOST: 32249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (childDimension >= 0) { 32259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Child wants a specific size... so be it 32269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project resultSize = childDimension; 32279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project resultMode = MeasureSpec.EXACTLY; 3228980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy } else if (childDimension == LayoutParams.MATCH_PARENT) { 32299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Child wants to be our size, but our size is not fixed. 32309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Constrain child to not be bigger than us. 32319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project resultSize = size; 32329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project resultMode = MeasureSpec.AT_MOST; 32339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (childDimension == LayoutParams.WRAP_CONTENT) { 32349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Child wants to determine its own size. It can't be 32359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // bigger than us. 32369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project resultSize = size; 32379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project resultMode = MeasureSpec.AT_MOST; 32389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 32409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Parent asked to see how big we want to be 32429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case MeasureSpec.UNSPECIFIED: 32439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (childDimension >= 0) { 32449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Child wants a specific size... let him have it 32459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project resultSize = childDimension; 32469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project resultMode = MeasureSpec.EXACTLY; 3247980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy } else if (childDimension == LayoutParams.MATCH_PARENT) { 32489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Child wants to be our size... find out how big it should 32499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // be 32509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project resultSize = 0; 32519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project resultMode = MeasureSpec.UNSPECIFIED; 32529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (childDimension == LayoutParams.WRAP_CONTENT) { 32539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Child wants to determine its own size.... find out how 32549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // big it should be 32559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project resultSize = 0; 32569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project resultMode = MeasureSpec.UNSPECIFIED; 32579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 32599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return MeasureSpec.makeMeasureSpec(resultSize, resultMode); 32619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 32659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Removes any pending animations for views that have been removed. Call 32669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this if you don't want animations for exiting views to stack up. 32679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 32689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void clearDisappearingChildren() { 32699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDisappearingChildren != null) { 32709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDisappearingChildren.clear(); 32719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 32759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Add a view which is removed from mChildren but still needs animation 32769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 32779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param v View to add 32789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 32799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void addDisappearingView(View v) { 32809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ArrayList<View> disappearingChildren = mDisappearingChildren; 32819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (disappearingChildren == null) { 32839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project disappearingChildren = mDisappearingChildren = new ArrayList<View>(); 32849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project disappearingChildren.add(v); 32879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 32909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Cleanup a view when its animation is done. This may mean removing it from 32919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the list of disappearing views. 32929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 32939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param view The view whose animation has finished 32949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param animation The animation, cannot be null 32959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 32969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void finishAnimatingView(final View view, Animation animation) { 32979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ArrayList<View> disappearingChildren = mDisappearingChildren; 32989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (disappearingChildren != null) { 32999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (disappearingChildren.contains(view)) { 33009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project disappearingChildren.remove(view); 33019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (view.mAttachInfo != null) { 33039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project view.dispatchDetachedFromWindow(); 33049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project view.clearAnimation(); 33079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mGroupFlags |= FLAG_INVALIDATE_REQUIRED; 33089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (animation != null && !animation.getFillAfter()) { 33129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project view.clearAnimation(); 33139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((view.mPrivateFlags & ANIMATION_STARTED) == ANIMATION_STARTED) { 33169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project view.onAnimationEnd(); 33179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Should be performed by onAnimationEnd() but this avoid an infinite loop, 33189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // so we'd rather be safe than sorry 33199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project view.mPrivateFlags &= ~ANIMATION_STARTED; 33209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Draw one more frame after the animation is done 33219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mGroupFlags |= FLAG_INVALIDATE_REQUIRED; 33229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 33269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 33279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 33289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 33299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean gatherTransparentRegion(Region region) { 33309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If no transparent regions requested, we are always opaque. 33319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final boolean meOpaque = (mPrivateFlags & View.REQUEST_TRANSPARENT_REGIONS) == 0; 33329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (meOpaque && region == null) { 33339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The caller doesn't care about the region, so stop now. 33349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 33359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.gatherTransparentRegion(region); 33379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final View[] children = mChildren; 33389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int count = mChildrenCount; 33399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean noneOfTheChildrenAreTransparent = true; 33409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < count; i++) { 33419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final View child = children[i]; 33429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((child.mViewFlags & VISIBILITY_MASK) != GONE || child.getAnimation() != null) { 33439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!child.gatherTransparentRegion(region)) { 33449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project noneOfTheChildrenAreTransparent = false; 33459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return meOpaque || noneOfTheChildrenAreTransparent; 33499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 33529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 33539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 33549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void requestTransparentRegion(View child) { 33559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (child != null) { 33569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project child.mPrivateFlags |= View.REQUEST_TRANSPARENT_REGIONS; 33579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mParent != null) { 33589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParent.requestTransparentRegion(this); 33599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33628506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy 33639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 33659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected boolean fitSystemWindows(Rect insets) { 33669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean done = super.fitSystemWindows(insets); 33679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!done) { 33689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int count = mChildrenCount; 33699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final View[] children = mChildren; 33709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < count; i++) { 33719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project done = children[i].fitSystemWindows(insets); 33729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (done) { 33739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 33749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return done; 33789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 33819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the animation listener to which layout animation events are 33829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * sent. 33839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 33849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return an {@link android.view.animation.Animation.AnimationListener} 33859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 33869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Animation.AnimationListener getLayoutAnimationListener() { 33879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mAnimationListener; 33889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 33919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void drawableStateChanged() { 33929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.drawableStateChanged(); 33939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((mGroupFlags & FLAG_NOTIFY_CHILDREN_ON_DRAWABLE_STATE_CHANGE) != 0) { 33959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((mGroupFlags & FLAG_ADD_STATES_FROM_CHILDREN) != 0) { 33969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalStateException("addStateFromChildren cannot be enabled if a" 33979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " child has duplicateParentState set to true"); 33989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final View[] children = mChildren; 34019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int count = mChildrenCount; 34029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < count; i++) { 34049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final View child = children[i]; 34059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((child.mViewFlags & DUPLICATE_PARENT_STATE) != 0) { 34069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project child.refreshDrawableState(); 34079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 34139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected int[] onCreateDrawableState(int extraSpace) { 34149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((mGroupFlags & FLAG_ADD_STATES_FROM_CHILDREN) == 0) { 34159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return super.onCreateDrawableState(extraSpace); 34169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int need = 0; 34199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int n = getChildCount(); 34209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < n; i++) { 34219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int[] childState = getChildAt(i).getDrawableState(); 34229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (childState != null) { 34249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project need += childState.length; 34259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int[] state = super.onCreateDrawableState(extraSpace + need); 34299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < n; i++) { 34319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int[] childState = getChildAt(i).getDrawableState(); 34329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (childState != null) { 34349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project state = mergeDrawableStates(state, childState); 34359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return state; 34399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 34429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets whether this ViewGroup's drawable states also include 34439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * its children's drawable states. This is used, for example, to 34449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * make a group appear to be focused when its child EditText or button 34459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is focused. 34469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 34479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setAddStatesFromChildren(boolean addsStates) { 34489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (addsStates) { 34499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mGroupFlags |= FLAG_ADD_STATES_FROM_CHILDREN; 34509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 34519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mGroupFlags &= ~FLAG_ADD_STATES_FROM_CHILDREN; 34529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project refreshDrawableState(); 34559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 34589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns whether this ViewGroup's drawable states also include 34599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * its children's drawable states. This is used, for example, to 34609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * make a group appear to be focused when its child EditText or button 34619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is focused. 34629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 34639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean addStatesFromChildren() { 34649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (mGroupFlags & FLAG_ADD_STATES_FROM_CHILDREN) != 0; 34659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 34689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If {link #addStatesFromChildren} is true, refreshes this group's 34699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * drawable state (to include the states from its children). 34709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 34719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void childDrawableStateChanged(View child) { 34729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((mGroupFlags & FLAG_ADD_STATES_FROM_CHILDREN) != 0) { 34739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project refreshDrawableState(); 34749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 34789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Specifies the animation listener to which layout animation events must 34799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * be sent. Only 34809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.view.animation.Animation.AnimationListener#onAnimationStart(Animation)} 34819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and 34829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.view.animation.Animation.AnimationListener#onAnimationEnd(Animation)} 34839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * are invoked. 34849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 34859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param animationListener the layout animation listener 34869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 34879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setLayoutAnimationListener(Animation.AnimationListener animationListener) { 34889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAnimationListener = animationListener; 34899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3492b08013c312e3d849029a2f4c11889274c00f438dAdam Powell * Called when a child's overlay state changes between enabled/disabled. 3493b08013c312e3d849029a2f4c11889274c00f438dAdam Powell * @param child Child view whose state has changed or null 3494b08013c312e3d849029a2f4c11889274c00f438dAdam Powell * @hide 3495b08013c312e3d849029a2f4c11889274c00f438dAdam Powell */ 3496b08013c312e3d849029a2f4c11889274c00f438dAdam Powell public void childOverlayStateChanged(View child) { 3497b08013c312e3d849029a2f4c11889274c00f438dAdam Powell boolean childHasOverlay = false; 3498b08013c312e3d849029a2f4c11889274c00f438dAdam Powell if (child != null) { 3499b08013c312e3d849029a2f4c11889274c00f438dAdam Powell childHasOverlay = child.isOverlayEnabled(); 3500b08013c312e3d849029a2f4c11889274c00f438dAdam Powell } else { 3501b08013c312e3d849029a2f4c11889274c00f438dAdam Powell final int childCount = getChildCount(); 3502b08013c312e3d849029a2f4c11889274c00f438dAdam Powell for (int i = 0; i < childCount; i++) { 3503b08013c312e3d849029a2f4c11889274c00f438dAdam Powell if (childHasOverlay |= getChildAt(i).isOverlayEnabled()) { 3504b08013c312e3d849029a2f4c11889274c00f438dAdam Powell break; 3505b08013c312e3d849029a2f4c11889274c00f438dAdam Powell } 3506b08013c312e3d849029a2f4c11889274c00f438dAdam Powell } 3507b08013c312e3d849029a2f4c11889274c00f438dAdam Powell } 3508b08013c312e3d849029a2f4c11889274c00f438dAdam Powell 3509b08013c312e3d849029a2f4c11889274c00f438dAdam Powell final boolean hasChildWithOverlay = childHasOverlay || 3510b08013c312e3d849029a2f4c11889274c00f438dAdam Powell (mGroupFlags & FLAG_CHILD_HAS_OVERLAY) == FLAG_CHILD_HAS_OVERLAY; 3511b08013c312e3d849029a2f4c11889274c00f438dAdam Powell 3512b08013c312e3d849029a2f4c11889274c00f438dAdam Powell final boolean oldValue = isOverlayEnabled(); 3513b08013c312e3d849029a2f4c11889274c00f438dAdam Powell mGroupFlags = (mGroupFlags & ~FLAG_CHILD_HAS_OVERLAY) | 3514b08013c312e3d849029a2f4c11889274c00f438dAdam Powell (hasChildWithOverlay ? FLAG_CHILD_HAS_OVERLAY : 0); 3515b08013c312e3d849029a2f4c11889274c00f438dAdam Powell if (isOverlayEnabled() != oldValue) { 3516b08013c312e3d849029a2f4c11889274c00f438dAdam Powell final ViewParent parent = getParent(); 3517b08013c312e3d849029a2f4c11889274c00f438dAdam Powell if (parent != null) { 3518b08013c312e3d849029a2f4c11889274c00f438dAdam Powell try { 3519b08013c312e3d849029a2f4c11889274c00f438dAdam Powell parent.childOverlayStateChanged(this); 3520b08013c312e3d849029a2f4c11889274c00f438dAdam Powell } catch (AbstractMethodError e) { 3521b08013c312e3d849029a2f4c11889274c00f438dAdam Powell Log.e("ViewGroup", "Could not propagate hasOverlay state", e); 3522b08013c312e3d849029a2f4c11889274c00f438dAdam Powell } 3523b08013c312e3d849029a2f4c11889274c00f438dAdam Powell } 3524b08013c312e3d849029a2f4c11889274c00f438dAdam Powell } 3525b08013c312e3d849029a2f4c11889274c00f438dAdam Powell } 3526b08013c312e3d849029a2f4c11889274c00f438dAdam Powell 3527b08013c312e3d849029a2f4c11889274c00f438dAdam Powell /** 3528b08013c312e3d849029a2f4c11889274c00f438dAdam Powell * @hide 3529b08013c312e3d849029a2f4c11889274c00f438dAdam Powell */ 3530b08013c312e3d849029a2f4c11889274c00f438dAdam Powell public boolean isOverlayEnabled() { 3531b08013c312e3d849029a2f4c11889274c00f438dAdam Powell return super.isOverlayEnabled() || 3532b08013c312e3d849029a2f4c11889274c00f438dAdam Powell ((mGroupFlags & FLAG_CHILD_HAS_OVERLAY) == FLAG_CHILD_HAS_OVERLAY); 3533b08013c312e3d849029a2f4c11889274c00f438dAdam Powell } 3534b08013c312e3d849029a2f4c11889274c00f438dAdam Powell 3535b08013c312e3d849029a2f4c11889274c00f438dAdam Powell /** 3536b08013c312e3d849029a2f4c11889274c00f438dAdam Powell * @hide 3537b08013c312e3d849029a2f4c11889274c00f438dAdam Powell */ 3538b08013c312e3d849029a2f4c11889274c00f438dAdam Powell @Override 3539b08013c312e3d849029a2f4c11889274c00f438dAdam Powell public void onDrawOverlay(Canvas canvas) { 3540b08013c312e3d849029a2f4c11889274c00f438dAdam Powell if ((mGroupFlags & FLAG_CHILD_HAS_OVERLAY) == FLAG_CHILD_HAS_OVERLAY) { 3541b08013c312e3d849029a2f4c11889274c00f438dAdam Powell final int childCount = getChildCount(); 3542b08013c312e3d849029a2f4c11889274c00f438dAdam Powell for (int i = 0; i < childCount; i++) { 3543b08013c312e3d849029a2f4c11889274c00f438dAdam Powell final View child = getChildAt(i); 3544b08013c312e3d849029a2f4c11889274c00f438dAdam Powell if (child.isOverlayEnabled()) { 3545b08013c312e3d849029a2f4c11889274c00f438dAdam Powell canvas.translate(child.mLeft + child.mScrollX, child.mTop + child.mScrollY); 3546b08013c312e3d849029a2f4c11889274c00f438dAdam Powell child.onDrawOverlay(canvas); 3547b08013c312e3d849029a2f4c11889274c00f438dAdam Powell canvas.translate(-(child.mLeft + child.mScrollX), 3548b08013c312e3d849029a2f4c11889274c00f438dAdam Powell -(child.mTop + child.mScrollY)); 3549b08013c312e3d849029a2f4c11889274c00f438dAdam Powell } 3550b08013c312e3d849029a2f4c11889274c00f438dAdam Powell } 3551b08013c312e3d849029a2f4c11889274c00f438dAdam Powell } 3552b08013c312e3d849029a2f4c11889274c00f438dAdam Powell } 3553b08013c312e3d849029a2f4c11889274c00f438dAdam Powell 3554b08013c312e3d849029a2f4c11889274c00f438dAdam Powell /** 35559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * LayoutParams are used by views to tell their parents how they want to be 35569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * laid out. See 35579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.R.styleable#ViewGroup_Layout ViewGroup Layout Attributes} 35589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * for a list of all child view attributes that this class supports. 35598506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy * 35609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 35619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The base LayoutParams class just describes how big the view wants to be 35629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * for both width and height. For each dimension, it can specify one of: 35639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 35643d5f648f8fe61507107b900fc3c4cf79b19572c6Dirk Dougherty * <li>FILL_PARENT (renamed MATCH_PARENT in API Level 8 and higher), which 35653d5f648f8fe61507107b900fc3c4cf79b19572c6Dirk Dougherty * means that the view wants to be as big as its parent (minus padding) 35669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> WRAP_CONTENT, which means that the view wants to be just big enough 35679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to enclose its content (plus padding) 35683d5f648f8fe61507107b900fc3c4cf79b19572c6Dirk Dougherty * <li> an exact number 35699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 35709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * There are subclasses of LayoutParams for different subclasses of 35719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * ViewGroup. For example, AbsoluteLayout has its own subclass of 35729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * LayoutParams which adds an X and Y value. 35739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 35749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#ViewGroup_Layout_layout_height 35759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#ViewGroup_Layout_layout_width 35769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 35779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static class LayoutParams { 35789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 35793d5f648f8fe61507107b900fc3c4cf79b19572c6Dirk Dougherty * Special value for the height or width requested by a View. 35803d5f648f8fe61507107b900fc3c4cf79b19572c6Dirk Dougherty * FILL_PARENT means that the view wants to be as big as its parent, 35813d5f648f8fe61507107b900fc3c4cf79b19572c6Dirk Dougherty * minus the parent's padding, if any. This value is deprecated 35823d5f648f8fe61507107b900fc3c4cf79b19572c6Dirk Dougherty * starting in API Level 8 and replaced by {@link #MATCH_PARENT}. 35839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3584980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy @SuppressWarnings({"UnusedDeclaration"}) 3585980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy @Deprecated 35869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int FILL_PARENT = -1; 35879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 35889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 35899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Special value for the height or width requested by a View. 3590f5c6eff63d19a9f7a970a4f90619edac873c006dGilles Debunne * MATCH_PARENT means that the view wants to be as big as its parent, 35913d5f648f8fe61507107b900fc3c4cf79b19572c6Dirk Dougherty * minus the parent's padding, if any. Introduced in API Level 8. 3592980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy */ 3593980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy public static final int MATCH_PARENT = -1; 3594980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy 3595980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy /** 3596980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy * Special value for the height or width requested by a View. 35979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WRAP_CONTENT means that the view wants to be just large enough to fit 35989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * its own internal content, taking its own padding into account. 35999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 36009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int WRAP_CONTENT = -2; 36019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 36029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 36033d5f648f8fe61507107b900fc3c4cf79b19572c6Dirk Dougherty * Information about how wide the view wants to be. Can be one of the 36043d5f648f8fe61507107b900fc3c4cf79b19572c6Dirk Dougherty * constants FILL_PARENT (replaced by MATCH_PARENT , 36053d5f648f8fe61507107b900fc3c4cf79b19572c6Dirk Dougherty * in API Level 8) or WRAP_CONTENT. or an exact size. 36069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3607bea95162ca25bd00b0479d93739b6283795c3986Konstantin Lopyrev @ViewDebug.ExportedProperty(category = "layout", mapping = { 3608980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy @ViewDebug.IntToString(from = MATCH_PARENT, to = "MATCH_PARENT"), 36099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @ViewDebug.IntToString(from = WRAP_CONTENT, to = "WRAP_CONTENT") 36109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }) 36119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int width; 36129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 36139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 36143d5f648f8fe61507107b900fc3c4cf79b19572c6Dirk Dougherty * Information about how tall the view wants to be. Can be one of the 36153d5f648f8fe61507107b900fc3c4cf79b19572c6Dirk Dougherty * constants FILL_PARENT (replaced by MATCH_PARENT , 36163d5f648f8fe61507107b900fc3c4cf79b19572c6Dirk Dougherty * in API Level 8) or WRAP_CONTENT. or an exact size. 36179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3618bea95162ca25bd00b0479d93739b6283795c3986Konstantin Lopyrev @ViewDebug.ExportedProperty(category = "layout", mapping = { 3619980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy @ViewDebug.IntToString(from = MATCH_PARENT, to = "MATCH_PARENT"), 36209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @ViewDebug.IntToString(from = WRAP_CONTENT, to = "WRAP_CONTENT") 36219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }) 36229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int height; 36239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 36249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 36259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Used to animate layouts. 36269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 36279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public LayoutAnimationController.AnimationParameters layoutAnimationParameters; 36289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 36299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 36309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Creates a new set of layout parameters. The values are extracted from 36319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the supplied attributes set and context. The XML attributes mapped 36329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to this set of layout parameters are: 36339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 36349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 36359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><code>layout_width</code>: the width, either an exact value, 36363d5f648f8fe61507107b900fc3c4cf79b19572c6Dirk Dougherty * {@link #WRAP_CONTENT}, or {@link #FILL_PARENT} (replaced by 36373d5f648f8fe61507107b900fc3c4cf79b19572c6Dirk Dougherty * {@link #MATCH_PARENT} in API Level 8)</li> 36389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li><code>layout_height</code>: the height, either an exact value, 36393d5f648f8fe61507107b900fc3c4cf79b19572c6Dirk Dougherty * {@link #WRAP_CONTENT}, or {@link #FILL_PARENT} (replaced by 36403d5f648f8fe61507107b900fc3c4cf79b19572c6Dirk Dougherty * {@link #MATCH_PARENT} in API Level 8)</li> 36419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 36429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 36439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param c the application environment 36449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param attrs the set of attributes from which to extract the layout 36459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * parameters' values 36469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 36479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public LayoutParams(Context c, AttributeSet attrs) { 36489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray a = c.obtainStyledAttributes(attrs, R.styleable.ViewGroup_Layout); 36499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setBaseAttributes(a, 36509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project R.styleable.ViewGroup_Layout_layout_width, 36519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project R.styleable.ViewGroup_Layout_layout_height); 36529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.recycle(); 36539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 36559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 36569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Creates a new set of layout parameters with the specified width 36579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and height. 36589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 36593d5f648f8fe61507107b900fc3c4cf79b19572c6Dirk Dougherty * @param width the width, either {@link #WRAP_CONTENT}, 36603d5f648f8fe61507107b900fc3c4cf79b19572c6Dirk Dougherty * {@link #FILL_PARENT} (replaced by {@link #MATCH_PARENT} in 36613d5f648f8fe61507107b900fc3c4cf79b19572c6Dirk Dougherty * API Level 8), or a fixed size in pixels 36623d5f648f8fe61507107b900fc3c4cf79b19572c6Dirk Dougherty * @param height the height, either {@link #WRAP_CONTENT}, 36633d5f648f8fe61507107b900fc3c4cf79b19572c6Dirk Dougherty * {@link #FILL_PARENT} (replaced by {@link #MATCH_PARENT} in 36643d5f648f8fe61507107b900fc3c4cf79b19572c6Dirk Dougherty * API Level 8), or a fixed size in pixels 36659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 36669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public LayoutParams(int width, int height) { 36679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.width = width; 36689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.height = height; 36699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 36719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 36729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copy constructor. Clones the width and height values of the source. 36739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 36749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param source The layout params to copy from. 36759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 36769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public LayoutParams(LayoutParams source) { 36779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.width = source.width; 36789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.height = source.height; 36799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 36819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 36829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Used internally by MarginLayoutParams. 36839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide 36849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 36859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LayoutParams() { 36869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 36889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 36899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Extracts the layout parameters from the supplied attributes. 36909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 36919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param a the style attributes to extract the parameters from 36929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param widthAttr the identifier of the width attribute 36939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param heightAttr the identifier of the height attribute 36949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 36959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void setBaseAttributes(TypedArray a, int widthAttr, int heightAttr) { 36969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project width = a.getLayoutDimension(widthAttr, "layout_width"); 36979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project height = a.getLayoutDimension(heightAttr, "layout_height"); 36989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 37009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 37019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns a String representation of this set of layout parameters. 37029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 37039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param output the String to prepend to the internal representation 37049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return a String with the following format: output + 37059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * "ViewGroup.LayoutParams={ width=WIDTH, height=HEIGHT }" 37068506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy * 37079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide 37089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 37099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String debug(String output) { 37109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return output + "ViewGroup.LayoutParams={ width=" 37119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + sizeToString(width) + ", height=" + sizeToString(height) + " }"; 37129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 37149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 37159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Converts the specified size to a readable String. 37169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 37179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param size the size to convert 37189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return a String instance representing the supplied size 37198506ab4ac062d0e1ccde136e5e2f4081560e0c11Romain Guy * 37209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide 37219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 37229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected static String sizeToString(int size) { 37239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (size == WRAP_CONTENT) { 37249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "wrap-content"; 37259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3726980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy if (size == MATCH_PARENT) { 3727980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy return "match-parent"; 37289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return String.valueOf(size); 37309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 37339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 37349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Per-child layout information for layouts that support margins. 37359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See 37369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.R.styleable#ViewGroup_MarginLayout ViewGroup Margin Layout Attributes} 37379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * for a list of all child view attributes that this class supports. 37389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 37399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static class MarginLayoutParams extends ViewGroup.LayoutParams { 37409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 37419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The left margin in pixels of the child. 37429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3743bea95162ca25bd00b0479d93739b6283795c3986Konstantin Lopyrev @ViewDebug.ExportedProperty(category = "layout") 37449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int leftMargin; 37459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 37469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 37479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The top margin in pixels of the child. 37489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3749bea95162ca25bd00b0479d93739b6283795c3986Konstantin Lopyrev @ViewDebug.ExportedProperty(category = "layout") 37509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int topMargin; 37519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 37529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 37539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The right margin in pixels of the child. 37549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3755bea95162ca25bd00b0479d93739b6283795c3986Konstantin Lopyrev @ViewDebug.ExportedProperty(category = "layout") 37569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int rightMargin; 37579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 37589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 37599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The bottom margin in pixels of the child. 37609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3761bea95162ca25bd00b0479d93739b6283795c3986Konstantin Lopyrev @ViewDebug.ExportedProperty(category = "layout") 37629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int bottomMargin; 37639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 37649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 37659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Creates a new set of layout parameters. The values are extracted from 37669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the supplied attributes set and context. 37679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 37689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param c the application environment 37699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param attrs the set of attributes from which to extract the layout 37709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * parameters' values 37719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 37729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public MarginLayoutParams(Context c, AttributeSet attrs) { 37739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(); 37749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 37759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray a = c.obtainStyledAttributes(attrs, R.styleable.ViewGroup_MarginLayout); 37769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setBaseAttributes(a, 37779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project R.styleable.ViewGroup_MarginLayout_layout_width, 37789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project R.styleable.ViewGroup_MarginLayout_layout_height); 37799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 37809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int margin = a.getDimensionPixelSize( 37819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.ViewGroup_MarginLayout_layout_margin, -1); 37829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (margin >= 0) { 37839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project leftMargin = margin; 37849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project topMargin = margin; 37859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rightMargin= margin; 37869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bottomMargin = margin; 37879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 37889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project leftMargin = a.getDimensionPixelSize( 37899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project R.styleable.ViewGroup_MarginLayout_layout_marginLeft, 0); 37909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project topMargin = a.getDimensionPixelSize( 37919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project R.styleable.ViewGroup_MarginLayout_layout_marginTop, 0); 37929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rightMargin = a.getDimensionPixelSize( 37939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project R.styleable.ViewGroup_MarginLayout_layout_marginRight, 0); 37949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bottomMargin = a.getDimensionPixelSize( 37959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project R.styleable.ViewGroup_MarginLayout_layout_marginBottom, 0); 37969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 37979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 37989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.recycle(); 37999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 38009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 38019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 38029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 38039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 38049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public MarginLayoutParams(int width, int height) { 38059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(width, height); 38069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 38079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 38089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 38099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copy constructor. Clones the width, height and margin values of the source. 38109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 38119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param source The layout params to copy from. 38129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 38139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public MarginLayoutParams(MarginLayoutParams source) { 38149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.width = source.width; 38159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.height = source.height; 38169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 38179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.leftMargin = source.leftMargin; 38189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.topMargin = source.topMargin; 38199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.rightMargin = source.rightMargin; 38209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.bottomMargin = source.bottomMargin; 38219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 38229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 38239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 38249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 38259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 38269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public MarginLayoutParams(LayoutParams source) { 38279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(source); 38289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 38299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 38309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 38319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the margins, in pixels. 38329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 38339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param left the left margin size 38349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param top the top margin size 38359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param right the right margin size 38369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param bottom the bottom margin size 38379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 38389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#ViewGroup_MarginLayout_layout_marginLeft 38399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#ViewGroup_MarginLayout_layout_marginTop 38409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#ViewGroup_MarginLayout_layout_marginRight 38419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#ViewGroup_MarginLayout_layout_marginBottom 38429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 38439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setMargins(int left, int top, int right, int bottom) { 38449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project leftMargin = left; 38459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project topMargin = top; 38469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rightMargin = right; 38479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bottomMargin = bottom; 38489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 38499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 38509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3851