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.widget;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.TypedArray;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AttributeSet;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ViewGroup;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.animation.Animation;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.animation.AnimationUtils;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Base class for a {@link FrameLayout} container that will perform animations
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * when switching between its views.
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#ViewAnimator_inAnimation
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @attr ref android.R.styleable#ViewAnimator_outAnimation
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class ViewAnimator extends FrameLayout {
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mWhichChild = 0;
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mFirstTime = true;
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mAnimateFirstTime = true;
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Animation mInAnimation;
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Animation mOutAnimation;
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ViewAnimator(Context context) {
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super(context);
461162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey        initViewAnimator(context, null);
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ViewAnimator(Context context, AttributeSet attrs) {
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super(context, attrs);
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TypedArray a = context.obtainStyledAttributes(attrs, com.android.internal.R.styleable.ViewAnimator);
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int resource = a.getResourceId(com.android.internal.R.styleable.ViewAnimator_inAnimation, 0);
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (resource > 0) {
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            setInAnimation(context, resource);
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        resource = a.getResourceId(com.android.internal.R.styleable.ViewAnimator_outAnimation, 0);
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (resource > 0) {
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            setOutAnimation(context, resource);
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        a.recycle();
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
641162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey        initViewAnimator(context, attrs);
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
671162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey    /**
681162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey     * Initialize this {@link ViewAnimator}, possibly setting
691162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey     * {@link #setMeasureAllChildren(boolean)} based on {@link FrameLayout} flags.
701162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey     */
711162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey    private void initViewAnimator(Context context, AttributeSet attrs) {
721162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey        if (attrs == null) {
731162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey            // For compatibility, always measure children when undefined.
741162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey            mMeasureAllChildren = true;
751162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey            return;
761162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey        }
771162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey
781162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey        // For compatibility, default to measure children, but allow XML
791162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey        // attribute to override.
801162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey        final TypedArray a = context.obtainStyledAttributes(attrs,
811162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey                com.android.internal.R.styleable.FrameLayout);
821162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey        final boolean measureAllChildren = a.getBoolean(
831162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey                com.android.internal.R.styleable.FrameLayout_measureAllChildren, true);
841162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey        setMeasureAllChildren(measureAllChildren);
851162fd77a8ff8467c96204c00bcaf941aef6aa85Jeff Sharkey        a.recycle();
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets which child view will be displayed.
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param whichChild the index of the child view to display
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setDisplayedChild(int whichChild) {
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWhichChild = whichChild;
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (whichChild >= getChildCount()) {
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWhichChild = 0;
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (whichChild < 0) {
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWhichChild = getChildCount() - 1;
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean hasFocus = getFocusedChild() != null;
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // This will clear old focus if we had it
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        showOnly(mWhichChild);
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (hasFocus) {
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Try to retake focus if we had it
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            requestFocus(FOCUS_FORWARD);
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the index of the currently displayed child view.
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getDisplayedChild() {
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mWhichChild;
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Manually shows the next child.
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void showNext() {
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setDisplayedChild(mWhichChild + 1);
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Manually shows the previous child.
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void showPrevious() {
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setDisplayedChild(mWhichChild - 1);
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Shows only the specified child. The other displays Views exit the screen
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * with the {@link #getOutAnimation() out animation} and the specified child
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * enters the screen with the {@link #getInAnimation() in animation}.
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param childIndex The index of the child to be shown.
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void showOnly(int childIndex) {
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int count = getChildCount();
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < count; i++) {
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final View child = getChildAt(i);
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (i == childIndex) {
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if ((!mFirstTime || mAnimateFirstTime) && mInAnimation != null) {
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    child.startAnimation(mInAnimation);
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                child.setVisibility(View.VISIBLE);
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mFirstTime = false;
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mOutAnimation != null && child.getVisibility() == View.VISIBLE) {
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    child.startAnimation(mOutAnimation);
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else if (child.getAnimation() == mInAnimation)
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    child.clearAnimation();
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                child.setVisibility(View.GONE);
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void addView(View child, int index, ViewGroup.LayoutParams params) {
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super.addView(child, index, params);
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (getChildCount() == 1) {
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            child.setVisibility(View.VISIBLE);
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            child.setVisibility(View.GONE);
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void removeAllViews() {
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super.removeAllViews();
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWhichChild = 0;
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFirstTime = true;
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void removeView(View view) {
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int index = indexOfChild(view);
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (index >= 0) {
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            removeViewAt(index);
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void removeViewAt(int index) {
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super.removeViewAt(index);
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int childCount = getChildCount();
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (childCount == 0) {
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWhichChild = 0;
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mFirstTime = true;
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (mWhichChild >= childCount) {
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Displayed is above child count, so float down to top of stack
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            setDisplayedChild(childCount - 1);
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (mWhichChild == index) {
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Displayed was removed, so show the new child living in its place
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            setDisplayedChild(mWhichChild);
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void removeViewInLayout(View view) {
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        removeView(view);
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void removeViews(int start, int count) {
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super.removeViews(start, count);
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (getChildCount() == 0) {
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWhichChild = 0;
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mFirstTime = true;
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (mWhichChild >= start && mWhichChild < start + count) {
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Try showing new displayed child, wrapping if needed
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            setDisplayedChild(mWhichChild);
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void removeViewsInLayout(int start, int count) {
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        removeViews(start, count);
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the View corresponding to the currently displayed child.
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return The View currently displayed.
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getDisplayedChild()
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public View getCurrentView() {
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getChildAt(mWhichChild);
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the current animation used to animate a View that enters the screen.
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return An Animation or null if none is set.
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setInAnimation(android.view.animation.Animation)
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setInAnimation(android.content.Context, int)
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Animation getInAnimation() {
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mInAnimation;
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Specifies the animation used to animate a View that enters the screen.
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param inAnimation The animation started when a View enters the screen.
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getInAnimation()
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setInAnimation(android.content.Context, int)
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setInAnimation(Animation inAnimation) {
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mInAnimation = inAnimation;
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the current animation used to animate a View that exits the screen.
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return An Animation or null if none is set.
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setOutAnimation(android.view.animation.Animation)
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setOutAnimation(android.content.Context, int)
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Animation getOutAnimation() {
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mOutAnimation;
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Specifies the animation used to animate a View that exit the screen.
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param outAnimation The animation started when a View exit the screen.
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getOutAnimation()
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setOutAnimation(android.content.Context, int)
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setOutAnimation(Animation outAnimation) {
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOutAnimation = outAnimation;
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Specifies the animation used to animate a View that enters the screen.
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param context The application's environment.
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param resourceID The resource id of the animation.
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getInAnimation()
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setInAnimation(android.view.animation.Animation)
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setInAnimation(Context context, int resourceID) {
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setInAnimation(AnimationUtils.loadAnimation(context, resourceID));
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Specifies the animation used to animate a View that exit the screen.
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param context The application's environment.
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param resourceID The resource id of the animation.
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getOutAnimation()
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setOutAnimation(android.view.animation.Animation)
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setOutAnimation(Context context, int resourceID) {
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setOutAnimation(AnimationUtils.loadAnimation(context, resourceID));
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Indicates whether the current View should be animated the first time
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the ViewAnimation is displayed.
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param animate True to animate the current View the first time it is displayed,
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                false otherwise.
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setAnimateFirstView(boolean animate) {
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mAnimateFirstTime = animate;
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getBaseline() {
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (getCurrentView() != null) ? getCurrentView().getBaseline() : super.getBaseline();
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
318