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