PlaybackOverlayFragment.java revision 1e5725d52c7ec12b184dcfce6bfafa80aed35230
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2014 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"); you may not use this file except
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in compliance with the License. You may obtain a copy of the License at
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software distributed under the License
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or implied. See the License for the specific language governing permissions and limitations under
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the License.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.support.v17.leanback.app;
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Color;
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.drawable.ColorDrawable;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.animation.Animator;
196793fc328ab4532202d86f64fe4fdbc3fb047bc4riddle_hsuimport android.animation.AnimatorInflater;
20e23149f1555303940d212b742707518b7f9f84abWale Ogunwaleimport android.animation.TimeInterpolator;
21e23149f1555303940d212b742707518b7f9f84abWale Ogunwaleimport android.animation.ValueAnimator;
22e23149f1555303940d212b742707518b7f9f84abWale Ogunwaleimport android.animation.ValueAnimator.AnimatorUpdateListener;
23c8230519728b14065effd3b7d4eca273ff86160cDianne Hackbornimport android.content.Context;
24b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackbornimport android.os.Bundle;
2589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackbornimport android.os.Handler;
2689ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackbornimport android.os.Message;
274eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport android.support.v7.widget.RecyclerView;
284eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport android.support.v17.leanback.R;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.support.v17.leanback.animation.LogAccelerateInterpolator;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.support.v17.leanback.animation.LogDecelerateInterpolator;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.support.v17.leanback.widget.ItemBridgeAdapter;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.support.v17.leanback.widget.ObjectAdapter;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.support.v17.leanback.widget.ObjectAdapter.DataObserver;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.support.v17.leanback.widget.VerticalGridView;
35c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackbornimport android.util.Log;
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.KeyEvent;
37e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackbornimport android.view.LayoutInflater;
385719028766f51512beffa623db7ee682851570a0Joe Onoratoimport android.view.MotionEvent;
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View;
40a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackbornimport android.view.ViewGroup;
415719028766f51512beffa623db7ee682851570a0Joe Onoratoimport android.view.animation.Interpolator;
421ebccf531d1049853b3b0630035434619682c016Dianne Hackbornimport android.view.animation.LinearInterpolator;
43cf4b2542fae9d6c5d3788c6a935824094fb1c1eaYusuke Sato
44f02b60aa4f367516f40cf3d60fffae0c6fe3e1b8Dianne Hackborn
45390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn/**
461ebccf531d1049853b3b0630035434619682c016Dianne Hackborn * A fragment for displaying playback controls and related content.
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The {@link android.support.v17.leanback.widget.PlaybackControlsRow} is expected to be
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * at position 0 in the adapter.
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class PlaybackOverlayFragment extends DetailsFragment {
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * No background.
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
55be4e6aaa0252dd7da28b7aa85beba982538efa46Dianne Hackborn    public static final int BG_NONE = 0;
56e23149f1555303940d212b742707518b7f9f84abWale Ogunwale
57e23149f1555303940d212b742707518b7f9f84abWale Ogunwale    /**
582cd3fb5aa71cd32cd67ddfaafaca8f85a7ac13c6Adam Lesinski     * A dark translucent background.
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
60a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn    public static final int BG_DARK = 1;
61a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn
62a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn    /**
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * A light translucent background.
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
65d23e0d6901935588f9472bd7073fea0009581e9bDianne Hackborn    public static final int BG_LIGHT = 2;
66d23e0d6901935588f9472bd7073fea0009581e9bDianne Hackborn
67fee756ff91ab4d8f0e09ddb050d22d88ebb66ae7Dianne Hackborn    public static class OnFadeCompleteListener {
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void onFadeInComplete() {
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void onFadeOutComplete() {
714eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        }
72099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn    }
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
744de5a3ac6655f76b67af38712ae5aeb6d7c15938Dianne Hackborn    private static final String TAG = "PlaybackOverlayFragment";
75b3d4cb369e37b1b7e85832cc035226dc7cc8f380Dianne Hackborn    private static final boolean DEBUG = false;
76b3d4cb369e37b1b7e85832cc035226dc7cc8f380Dianne Hackborn    private static final int ANIMATION_MULTIPLIER = 1;
77b3d4cb369e37b1b7e85832cc035226dc7cc8f380Dianne Hackborn
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static int START_FADE_OUT = 1;
79dd71fc8baeee0d09008d0fa67d6bf3d23cf21baaDianne Hackborn
80f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn    // Fading status
81f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn    private static final int IDLE = 0;
82f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn    private static final int IN = 1;
8335f72be50b8a2d11bce591dcdac5dc3fa336dac0Dianne Hackborn    private static final int OUT = 2;
8435f72be50b8a2d11bce591dcdac5dc3fa336dac0Dianne Hackborn
85f0a44183cd49cd937bf6c4f17f20fd615e441dc4Thierry Strudel    private int mAlignPosition;
863bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn    private View mRootView;
87f0a44183cd49cd937bf6c4f17f20fd615e441dc4Thierry Strudel    private int mBackgroundType = BG_DARK;
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mBgDarkColor;
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mBgLightColor;
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mShowTimeMs;
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mFadeTranslateY;
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private OnFadeCompleteListener mFadeCompleteListener;
934de5a3ac6655f76b67af38712ae5aeb6d7c15938Dianne Hackborn    private boolean mFadingEnabled = true;
9406de2ea752171f52a4e6e6872cb3a0689e591dcbDianne Hackborn    private int mFadingStatus = IDLE;
9506de2ea752171f52a4e6e6872cb3a0689e591dcbDianne Hackborn    private int mBgAlpha;
96e535a5827b7b7c7c70f4701d74051c9bb5eb0b98Srinath Sridharan    private ValueAnimator mBgFadeInAnimator, mBgFadeOutAnimator;
97ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn    private ValueAnimator mControlRowFadeInAnimator, mControlRowFadeOutAnimator;
986793fc328ab4532202d86f64fe4fdbc3fb047bc4riddle_hsu    private ValueAnimator mOtherRowFadeInAnimator, mOtherRowFadeOutAnimator;
996793fc328ab4532202d86f64fe4fdbc3fb047bc4riddle_hsu    private boolean mTranslateAnimationEnabled;
1006793fc328ab4532202d86f64fe4fdbc3fb047bc4riddle_hsu    private RecyclerView.ItemAnimator mItemAnimator;
1016793fc328ab4532202d86f64fe4fdbc3fb047bc4riddle_hsu
10233eb07f5759b85a5617f8057d8a335019c7d24ddTim Murray    private final Animator.AnimatorListener mFadeListener =
10333eb07f5759b85a5617f8057d8a335019c7d24ddTim Murray            new Animator.AnimatorListener() {
104e02c88af7935c72fb90a478375e61e4a94465587Dianne Hackborn        @Override
105cbd9a52f256087426feb19ac6e51eff772e81375Dianne Hackborn        public void onAnimationStart(Animator animation) {
10635f72be50b8a2d11bce591dcdac5dc3fa336dac0Dianne Hackborn            enableVerticalGridAnimations(false);
107b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn        }
1082286cdc0cab77e61b75e6fe9a45b91f6e57cd46dDianne Hackborn        @Override
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void onAnimationRepeat(Animator animation) {
110d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey        }
111684bf34ee8acc41931fac23762b13e14a22011dbDianne Hackborn        @Override
112c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        public void onAnimationCancel(Animator animation) {
113f0754f5ba7a45b517cffcb3c2c96f2a32aeac06dDianne Hackborn        }
114d993a573d7fcf1a69d35528cae4dd96581c9aacdWale Ogunwale        @Override
115d993a573d7fcf1a69d35528cae4dd96581c9aacdWale Ogunwale        public void onAnimationEnd(Animator animation) {
116d993a573d7fcf1a69d35528cae4dd96581c9aacdWale Ogunwale            if (DEBUG) Log.v(TAG, "onAnimationEnd " + mBgAlpha);
117d993a573d7fcf1a69d35528cae4dd96581c9aacdWale Ogunwale            if (mBgAlpha > 0) {
118d993a573d7fcf1a69d35528cae4dd96581c9aacdWale Ogunwale                enableVerticalGridAnimations(true);
119d993a573d7fcf1a69d35528cae4dd96581c9aacdWale Ogunwale                startFadeTimer();
120d993a573d7fcf1a69d35528cae4dd96581c9aacdWale Ogunwale                if (mFadeCompleteListener != null) {
121d993a573d7fcf1a69d35528cae4dd96581c9aacdWale Ogunwale                    mFadeCompleteListener.onFadeInComplete();
122d993a573d7fcf1a69d35528cae4dd96581c9aacdWale Ogunwale                }
123d993a573d7fcf1a69d35528cae4dd96581c9aacdWale Ogunwale            } else {
124d993a573d7fcf1a69d35528cae4dd96581c9aacdWale Ogunwale                if (getVerticalGridView() != null) {
125d993a573d7fcf1a69d35528cae4dd96581c9aacdWale Ogunwale                    // Reset focus to the controls row
126c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn                    getVerticalGridView().setSelectedPosition(0);
127c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn                }
128f0f94d129b6eb3c48624e915898d86d4f2de59ffDianne Hackborn                if (mFadeCompleteListener != null) {
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mFadeCompleteListener.onFadeOutComplete();
13035f72be50b8a2d11bce591dcdac5dc3fa336dac0Dianne Hackborn                }
131d412563922f46feb4d3c3ba1500f34bddd21d73cDianne Hackborn            }
132c8230519728b14065effd3b7d4eca273ff86160cDianne Hackborn            mFadingStatus = IDLE;
133ab4bb9d1fec685dab0fce9232c9a3477fab356b3Dianne Hackborn        }
134bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkey    };
135fcc95a6d2c749d6b77eca14bf301d665d858a840Dianne Hackborn
136ab4bb9d1fec685dab0fce9232c9a3477fab356b3Dianne Hackborn    private final Handler mHandler = new Handler() {
1379357b11a798b804b69907f93437229cac1d82468Dianne Hackborn        @Override
138f965f4038cfe775bfee973850d62caf3138076c8Dianne Hackborn        public void handleMessage(Message message) {
139906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn            if (message.what == START_FADE_OUT && mFadingEnabled) {
140906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn                fade(false);
1418ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn            }
1421b64e0d8657463c0f7ce9b068a16a522cdfe7d28Dianne Hackborn        }
143340417356d92d0db71d0692344e66886ca795dfdDianne Hackborn    };
1443f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown
145d509bc93e6d13d46c45707d76ae95a6f735fc037yangzhenyu    private final VerticalGridView.OnTouchInterceptListener mOnTouchInterceptListener =
1469adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            new VerticalGridView.OnTouchInterceptListener() {
147287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn        public boolean onInterceptTouchEvent(MotionEvent event) {
148287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            return onInterceptInputEvent();
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
150fd12af4e768fec852c4c5dfee3b9bd7403b4b347Dianne Hackborn    };
1511a40564f3c2256f683c9a145487fc21a58093dc3Dianne Hackborn
152fd12af4e768fec852c4c5dfee3b9bd7403b4b347Dianne Hackborn    private final VerticalGridView.OnMotionInterceptListener mOnMotionInterceptListener =
153dd71fc8baeee0d09008d0fa67d6bf3d23cf21baaDianne Hackborn            new VerticalGridView.OnMotionInterceptListener() {
154be4e6aaa0252dd7da28b7aa85beba982538efa46Dianne Hackborn        public boolean onInterceptMotionEvent(MotionEvent event) {
155de42bb61ad0e4947a38bdedfba6a20b5292025c3Dianne Hackborn            return onInterceptInputEvent();
156dd9b82c283815747b75fe4434c65e4b6c9c9b54fDianne Hackborn        }
157de42bb61ad0e4947a38bdedfba6a20b5292025c3Dianne Hackborn    };
158fee756ff91ab4d8f0e09ddb050d22d88ebb66ae7Dianne Hackborn
159de42bb61ad0e4947a38bdedfba6a20b5292025c3Dianne Hackborn    private final VerticalGridView.OnKeyInterceptListener mOnKeyInterceptListener =
160810c052d9b117217152c2a609ccec056a2a61d1ePrimiano Tucci            new VerticalGridView.OnKeyInterceptListener() {
161810c052d9b117217152c2a609ccec056a2a61d1ePrimiano Tucci        public boolean onInterceptKeyEvent(KeyEvent event) {
162d23e0d6901935588f9472bd7073fea0009581e9bDianne Hackborn            return onInterceptInputEvent();
163d23e0d6901935588f9472bd7073fea0009581e9bDianne Hackborn        }
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
165d23e0d6901935588f9472bd7073fea0009581e9bDianne Hackborn
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void setBgAlpha(int alpha) {
167d23e0d6901935588f9472bd7073fea0009581e9bDianne Hackborn        mBgAlpha = alpha;
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mRootView != null) {
169d23e0d6901935588f9472bd7073fea0009581e9bDianne Hackborn            mRootView.getBackground().setAlpha(alpha);
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
171d23e0d6901935588f9472bd7073fea0009581e9bDianne Hackborn    }
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
173d23e0d6901935588f9472bd7073fea0009581e9bDianne Hackborn    private void enableVerticalGridAnimations(boolean enable) {
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (getVerticalGridView() == null) {
175d23e0d6901935588f9472bd7073fea0009581e9bDianne Hackborn            return;
176bf36ee2b0c49241e073da14ee1e1a08b8550f3b9Dianne Hackborn        }
177bf36ee2b0c49241e073da14ee1e1a08b8550f3b9Dianne Hackborn        if (enable && mItemAnimator != null) {
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            getVerticalGridView().setItemAnimator(mItemAnimator);
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (!enable) {
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mItemAnimator = getVerticalGridView().getItemAnimator();
18158d380d2af8079075e4773a3e5ca6c2820760e3dChristopher Tate            getVerticalGridView().setItemAnimator(null);
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Enables or disables view fading.  If enabled,
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * the view will be faded in when the fragment starts,
188fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang     * and will fade out after a time period.  The timeout
189dd71fc8baeee0d09008d0fa67d6bf3d23cf21baaDianne Hackborn     * period is reset each time {@link #tickle} is called.
190f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn     *
191fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang     */
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setFadingEnabled(boolean enabled) {
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (DEBUG) Log.v(TAG, "setFadingEnabled " + enabled);
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (enabled != mFadingEnabled) {
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mFadingEnabled = enabled;
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (isResumed()) {
197f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski                if (mFadingEnabled) {
198f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski                    if (mFadingStatus == IDLE && !mHandler.hasMessages(START_FADE_OUT)) {
199f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski                        startFadeTimer();
200f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski                    }
201b5f3b5c2e5108b875fdb21726eeca41f58d59d49Amith Yamasani                } else {
202b5f3b5c2e5108b875fdb21726eeca41f58d59d49Amith Yamasani                    // Ensure fully opaque
203a1b79bfd7a15006a93da933695359765e0fee495Felipe Leme                    mHandler.removeMessages(START_FADE_OUT);
204a1b79bfd7a15006a93da933695359765e0fee495Felipe Leme                    fade(true);
205b5f3b5c2e5108b875fdb21726eeca41f58d59d49Amith Yamasani                }
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2071ebccf531d1049853b3b0630035434619682c016Dianne Hackborn        }
2081ebccf531d1049853b3b0630035434619682c016Dianne Hackborn    }
209a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn
210a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn    /**
211a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn     * Returns true if view fading is enabled.
212a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn     */
213a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn    public boolean isFadingEnabled() {
214b3d4cb369e37b1b7e85832cc035226dc7cc8f380Dianne Hackborn        return mFadingEnabled;
215b3d4cb369e37b1b7e85832cc035226dc7cc8f380Dianne Hackborn    }
216b3d4cb369e37b1b7e85832cc035226dc7cc8f380Dianne Hackborn
217b3d4cb369e37b1b7e85832cc035226dc7cc8f380Dianne Hackborn    /**
218b3d4cb369e37b1b7e85832cc035226dc7cc8f380Dianne Hackborn     * Sets the listener to be called when fade in or out has completed.
219b3d4cb369e37b1b7e85832cc035226dc7cc8f380Dianne Hackborn     */
220b3d4cb369e37b1b7e85832cc035226dc7cc8f380Dianne Hackborn    public void setFadeCompleteListener(OnFadeCompleteListener listener) {
221b3d4cb369e37b1b7e85832cc035226dc7cc8f380Dianne Hackborn        mFadeCompleteListener = listener;
222b3d4cb369e37b1b7e85832cc035226dc7cc8f380Dianne Hackborn    }
223b3d4cb369e37b1b7e85832cc035226dc7cc8f380Dianne Hackborn
224b3d4cb369e37b1b7e85832cc035226dc7cc8f380Dianne Hackborn    /**
225f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn     * Returns the listener to be called when fade in or out has completed.
226f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn     */
227f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn    public OnFadeCompleteListener getFadeCompleteListener() {
228f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn        return mFadeCompleteListener;
229f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn    }
230f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn
231f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn    /**
232f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn     * Tickles the playback controls.  Fades in the view if it was faded out,
233f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn     * otherwise resets the fade out timer.  Tickling on input events is handled
234f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn     * by the fragment.
235cfc837f7fa43362b5049f648fe1bfdf5a010cc1cDianne Hackborn     */
236cfc837f7fa43362b5049f648fe1bfdf5a010cc1cDianne Hackborn    public void tickle() {
237cfc837f7fa43362b5049f648fe1bfdf5a010cc1cDianne Hackborn        if (DEBUG) Log.v(TAG, "tickle enabled " + mFadingEnabled + " isResumed " + isResumed());
238cfc837f7fa43362b5049f648fe1bfdf5a010cc1cDianne Hackborn        if (!mFadingEnabled || !isResumed()) {
239cfc837f7fa43362b5049f648fe1bfdf5a010cc1cDianne Hackborn            return;
240cfc837f7fa43362b5049f648fe1bfdf5a010cc1cDianne Hackborn        }
241fee756ff91ab4d8f0e09ddb050d22d88ebb66ae7Dianne Hackborn        if (mHandler.hasMessages(START_FADE_OUT)) {
242fee756ff91ab4d8f0e09ddb050d22d88ebb66ae7Dianne Hackborn            // Restart the timer
243fee756ff91ab4d8f0e09ddb050d22d88ebb66ae7Dianne Hackborn            startFadeTimer();
244fee756ff91ab4d8f0e09ddb050d22d88ebb66ae7Dianne Hackborn        } else {
245fee756ff91ab4d8f0e09ddb050d22d88ebb66ae7Dianne Hackborn            fade(true);
246fee756ff91ab4d8f0e09ddb050d22d88ebb66ae7Dianne Hackborn        }
247fee756ff91ab4d8f0e09ddb050d22d88ebb66ae7Dianne Hackborn    }
248fee756ff91ab4d8f0e09ddb050d22d88ebb66ae7Dianne Hackborn
2498ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn    private boolean onInterceptInputEvent() {
250340417356d92d0db71d0692344e66886ca795dfdDianne Hackborn        if (DEBUG) Log.v(TAG, "onInterceptInputEvent status " + mFadingStatus);
251340417356d92d0db71d0692344e66886ca795dfdDianne Hackborn        boolean consumeEvent = (mFadingStatus == IDLE && mBgAlpha == 0);
252f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn        tickle();
253b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn        return consumeEvent;
254f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn    }
255cfc837f7fa43362b5049f648fe1bfdf5a010cc1cDianne Hackborn
2561ebccf531d1049853b3b0630035434619682c016Dianne Hackborn    @Override
2571ebccf531d1049853b3b0630035434619682c016Dianne Hackborn    public void onResume() {
258f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn        super.onResume();
259f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn        if (mFadingEnabled) {
260f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn            setBgAlpha(0);
261f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn            fade(true);
262f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn        }
2633bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn        getVerticalGridView().setOnTouchInterceptListener(mOnTouchInterceptListener);
2643bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn        getVerticalGridView().setOnMotionInterceptListener(mOnMotionInterceptListener);
265b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn        getVerticalGridView().setOnKeyInterceptListener(mOnKeyInterceptListener);
266f0a44183cd49cd937bf6c4f17f20fd615e441dc4Thierry Strudel    }
267b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn
268f0a44183cd49cd937bf6c4f17f20fd615e441dc4Thierry Strudel    private void startFadeTimer() {
269b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn        if (mHandler != null) {
270fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn            mHandler.removeMessages(START_FADE_OUT);
271dd71fc8baeee0d09008d0fa67d6bf3d23cf21baaDianne Hackborn            mHandler.sendEmptyMessageDelayed(START_FADE_OUT, mShowTimeMs);
272cbd9a52f256087426feb19ac6e51eff772e81375Dianne Hackborn        }
273cbd9a52f256087426feb19ac6e51eff772e81375Dianne Hackborn    }
274cbd9a52f256087426feb19ac6e51eff772e81375Dianne Hackborn
275cbd9a52f256087426feb19ac6e51eff772e81375Dianne Hackborn    private static ValueAnimator loadAnimator(Context context, int resId) {
27635f72be50b8a2d11bce591dcdac5dc3fa336dac0Dianne Hackborn        ValueAnimator animator = (ValueAnimator) AnimatorInflater.loadAnimator(context, resId);
27735f72be50b8a2d11bce591dcdac5dc3fa336dac0Dianne Hackborn        animator.setDuration(animator.getDuration() * ANIMATION_MULTIPLIER);
2783bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn        return animator;
27935f72be50b8a2d11bce591dcdac5dc3fa336dac0Dianne Hackborn    }
280f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn
281f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn    private void loadBgAnimator() {
282f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn        AnimatorUpdateListener listener = new AnimatorUpdateListener() {
283f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn            @Override
284f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn            public void onAnimationUpdate(ValueAnimator arg0) {
28506de2ea752171f52a4e6e6872cb3a0689e591dcbDianne Hackborn                setBgAlpha((Integer) arg0.getAnimatedValue());
286ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn            }
287c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn        };
288ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn
2899484603c0fa738b67980c18b4abfd3505778ae74Dianne Hackborn        mBgFadeInAnimator = loadAnimator(getActivity(), R.animator.lb_playback_bg_fade_in);
2909484603c0fa738b67980c18b4abfd3505778ae74Dianne Hackborn        mBgFadeInAnimator.addUpdateListener(listener);
2919484603c0fa738b67980c18b4abfd3505778ae74Dianne Hackborn        mBgFadeInAnimator.addListener(mFadeListener);
292a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn
293c8230519728b14065effd3b7d4eca273ff86160cDianne Hackborn        mBgFadeOutAnimator = loadAnimator(getActivity(), R.animator.lb_playback_bg_fade_out);
294f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn        mBgFadeOutAnimator.addUpdateListener(listener);
295f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn        mBgFadeOutAnimator.addListener(mFadeListener);
296f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn    }
297f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn
298f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn    private TimeInterpolator mLogDecelerateInterpolator = new LogDecelerateInterpolator(100,0);
299f0f94d129b6eb3c48624e915898d86d4f2de59ffDianne Hackborn    private TimeInterpolator mLogAccelerateInterpolator = new LogAccelerateInterpolator(100,0);
300b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn
301b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn    private void loadControlRowAnimator() {
302f0f94d129b6eb3c48624e915898d86d4f2de59ffDianne Hackborn        AnimatorUpdateListener listener = new AnimatorUpdateListener() {
303f0f94d129b6eb3c48624e915898d86d4f2de59ffDianne Hackborn            @Override
304b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn            public void onAnimationUpdate(ValueAnimator arg0) {
305a1baf73b8e8093af775d828f643f3c3690e337a9Dianne Hackborn                if (getVerticalGridView() == null) {
306a1baf73b8e8093af775d828f643f3c3690e337a9Dianne Hackborn                    return;
307a1baf73b8e8093af775d828f643f3c3690e337a9Dianne Hackborn                }
308a1baf73b8e8093af775d828f643f3c3690e337a9Dianne Hackborn                RecyclerView.ViewHolder vh = getVerticalGridView().findViewHolderForPosition(0);
309f965f4038cfe775bfee973850d62caf3138076c8Dianne Hackborn                if (vh != null) {
310be68d49cdb85458e7b8143ac8ccc64f80d32e5f5Dianne Hackborn                    final float fraction = (Float) arg0.getAnimatedValue();
311f965f4038cfe775bfee973850d62caf3138076c8Dianne Hackborn                    if (DEBUG) Log.v(TAG, "fraction " + fraction);
312b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn                    vh.itemView.setAlpha(fraction);
313ab4bb9d1fec685dab0fce9232c9a3477fab356b3Dianne Hackborn                    if (mTranslateAnimationEnabled) {
314ab4bb9d1fec685dab0fce9232c9a3477fab356b3Dianne Hackborn                        vh.itemView.setTranslationY((float) mFadeTranslateY * (1f - fraction));
315ab4bb9d1fec685dab0fce9232c9a3477fab356b3Dianne Hackborn                    }
316fcc95a6d2c749d6b77eca14bf301d665d858a840Dianne Hackborn                }
317fcc95a6d2c749d6b77eca14bf301d665d858a840Dianne Hackborn            }
318fcc95a6d2c749d6b77eca14bf301d665d858a840Dianne Hackborn        };
319fcc95a6d2c749d6b77eca14bf301d665d858a840Dianne Hackborn
320ab4bb9d1fec685dab0fce9232c9a3477fab356b3Dianne Hackborn        mControlRowFadeInAnimator = loadAnimator(
321ab4bb9d1fec685dab0fce9232c9a3477fab356b3Dianne Hackborn                getActivity(), R.animator.lb_playback_controls_fade_in);
322ab4bb9d1fec685dab0fce9232c9a3477fab356b3Dianne Hackborn        mControlRowFadeInAnimator.addUpdateListener(listener);
323ab4bb9d1fec685dab0fce9232c9a3477fab356b3Dianne Hackborn        mControlRowFadeInAnimator.setInterpolator(mLogDecelerateInterpolator);
324ab4bb9d1fec685dab0fce9232c9a3477fab356b3Dianne Hackborn
325ab4bb9d1fec685dab0fce9232c9a3477fab356b3Dianne Hackborn        mControlRowFadeOutAnimator = loadAnimator(
326b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn                getActivity(), R.animator.lb_playback_controls_fade_out);
327b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn        mControlRowFadeOutAnimator.addUpdateListener(listener);
328b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn        mControlRowFadeOutAnimator.setInterpolator(mLogAccelerateInterpolator);
329b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn    }
330684bf34ee8acc41931fac23762b13e14a22011dbDianne Hackborn
331db92608de9b4acccee1e3232264c9830ad300c4fDianne Hackborn    private void loadOtherRowAnimator() {
332684bf34ee8acc41931fac23762b13e14a22011dbDianne Hackborn        AnimatorUpdateListener listener = new AnimatorUpdateListener() {
333684bf34ee8acc41931fac23762b13e14a22011dbDianne Hackborn            @Override
334b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn            public void onAnimationUpdate(ValueAnimator arg0) {
3351a40564f3c2256f683c9a145487fc21a58093dc3Dianne Hackborn                if (getVerticalGridView() == null) {
3361a40564f3c2256f683c9a145487fc21a58093dc3Dianne Hackborn                    return;
3371a40564f3c2256f683c9a145487fc21a58093dc3Dianne Hackborn                }
3381a40564f3c2256f683c9a145487fc21a58093dc3Dianne Hackborn                final float fraction = (Float) arg0.getAnimatedValue();
3391a40564f3c2256f683c9a145487fc21a58093dc3Dianne Hackborn                final int count = getVerticalGridView().getChildCount();
3402286cdc0cab77e61b75e6fe9a45b91f6e57cd46dDianne Hackborn                for (int i = 0; i < count; i++) {
3412286cdc0cab77e61b75e6fe9a45b91f6e57cd46dDianne Hackborn                    View view = getVerticalGridView().getChildAt(i);
3422286cdc0cab77e61b75e6fe9a45b91f6e57cd46dDianne Hackborn                    if (getVerticalGridView().getChildPosition(view) > 0) {
343fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn                        view.setAlpha(fraction);
344287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                        if (mTranslateAnimationEnabled) {
3452cd3fb5aa71cd32cd67ddfaafaca8f85a7ac13c6Adam Lesinski                            view.setTranslationY((float) mFadeTranslateY * (1f - fraction));
3462cd3fb5aa71cd32cd67ddfaafaca8f85a7ac13c6Adam Lesinski                        }
347287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                    }
348287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn                }
349287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn            }
350b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn        };
351fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn
352287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn        mOtherRowFadeInAnimator = loadAnimator(
353b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn                getActivity(), R.animator.lb_playback_controls_fade_in);
354287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn        mOtherRowFadeInAnimator.addUpdateListener(listener);
355287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn        mOtherRowFadeInAnimator.setInterpolator(mLogDecelerateInterpolator);
3560d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn
3571ebccf531d1049853b3b0630035434619682c016Dianne Hackborn        mOtherRowFadeOutAnimator = loadAnimator(
3581ebccf531d1049853b3b0630035434619682c016Dianne Hackborn                getActivity(), R.animator.lb_playback_controls_fade_out);
3591ebccf531d1049853b3b0630035434619682c016Dianne Hackborn        mOtherRowFadeOutAnimator.addUpdateListener(listener);
3609adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn        mOtherRowFadeOutAnimator.setInterpolator(mLogDecelerateInterpolator);
361d412563922f46feb4d3c3ba1500f34bddd21d73cDianne Hackborn    }
362d412563922f46feb4d3c3ba1500f34bddd21d73cDianne Hackborn
363d412563922f46feb4d3c3ba1500f34bddd21d73cDianne Hackborn    private void fade(boolean fadeIn) {
3640c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn        if (DEBUG) Log.v(TAG, "fade " + fadeIn);
365149427cd903f2100e3cc39bda41b831cd68bc553Dianne Hackborn        if (getView() == null) {
366f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn            return;
367f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn        }
368f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn        if ((fadeIn && mFadingStatus == IN) || (!fadeIn && mFadingStatus == OUT)) {
369f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn            if (DEBUG) Log.v(TAG, "requested fade in progress");
370f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn            return;
371f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn        }
372f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn        if ((fadeIn && mBgAlpha == 255) || (!fadeIn && mBgAlpha == 0)) {
373f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            if (DEBUG) Log.v(TAG, "fade is no-op");
374f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            return;
375f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        }
376f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
377f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        mTranslateAnimationEnabled = getVerticalGridView().getSelectedPosition() == 0;
378f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski
379f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski        if (mFadingStatus == IDLE) {
380f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski            if (fadeIn) {
381f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn                mBgFadeInAnimator.start();
382a1b79bfd7a15006a93da933695359765e0fee495Felipe Leme                mControlRowFadeInAnimator.start();
383a1b79bfd7a15006a93da933695359765e0fee495Felipe Leme                mOtherRowFadeInAnimator.start();
384a1b79bfd7a15006a93da933695359765e0fee495Felipe Leme            } else {
385f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn                mBgFadeOutAnimator.start();
3866ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn                mControlRowFadeOutAnimator.start();
3876ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn                mOtherRowFadeOutAnimator.start();
3886ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn            }
3896ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn        } else {
390f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn            if (fadeIn) {
391f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn                mBgFadeOutAnimator.reverse();
3926ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn                mControlRowFadeOutAnimator.reverse();
393c8230519728b14065effd3b7d4eca273ff86160cDianne Hackborn                mOtherRowFadeOutAnimator.reverse();
394c8230519728b14065effd3b7d4eca273ff86160cDianne Hackborn            } else {
3956ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn                mBgFadeInAnimator.reverse();
396f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn                mControlRowFadeInAnimator.reverse();
397f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn                mOtherRowFadeInAnimator.reverse();
398bf36ee2b0c49241e073da14ee1e1a08b8550f3b9Dianne Hackborn            }
399bf36ee2b0c49241e073da14ee1e1a08b8550f3b9Dianne Hackborn        }
400c8230519728b14065effd3b7d4eca273ff86160cDianne Hackborn
401c8230519728b14065effd3b7d4eca273ff86160cDianne Hackborn        // If fading in while control row is focused, set initial translationY so
4026ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn        // views slide in from below.
403f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn        if (fadeIn && mFadingStatus == IDLE && mTranslateAnimationEnabled) {
404f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn            final int count = getVerticalGridView().getChildCount();
4056ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn            for (int i = 0; i < count; i++) {
406c8230519728b14065effd3b7d4eca273ff86160cDianne Hackborn                getVerticalGridView().getChildAt(i).setTranslationY(mFadeTranslateY);
407c8230519728b14065effd3b7d4eca273ff86160cDianne Hackborn            }
4086ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn        }
409f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn
410f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn        mFadingStatus = fadeIn ? IN : OUT;
4116ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn    }
412390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn
413390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn    /**
414390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn     * Sets the list of rows for the fragment.
4156ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn     */
416f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn    @Override
417f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn    public void setAdapter(ObjectAdapter adapter) {
4186ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn        if (getAdapter() != null) {
4196ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn            getAdapter().unregisterObserver(mObserver);
4206ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn        }
4216ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn        super.setAdapter(adapter);
422f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn        if (adapter != null) {
423d509bc93e6d13d46c45707d76ae95a6f735fc037yangzhenyu            adapter.registerObserver(mObserver);
424d509bc93e6d13d46c45707d76ae95a6f735fc037yangzhenyu        }
425d509bc93e6d13d46c45707d76ae95a6f735fc037yangzhenyu        setVerticalGridViewLayout(getVerticalGridView());
426d509bc93e6d13d46c45707d76ae95a6f735fc037yangzhenyu    }
427d509bc93e6d13d46c45707d76ae95a6f735fc037yangzhenyu
428b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn    @Override
429f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn    void setVerticalGridViewLayout(VerticalGridView listview) {
4306ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn        if (listview == null || getAdapter() == null) {
431c8230519728b14065effd3b7d4eca273ff86160cDianne Hackborn            return;
432c8230519728b14065effd3b7d4eca273ff86160cDianne Hackborn        }
4336ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn        final int alignPosition = getAdapter().size() > 1 ? mAlignPosition : 0;
434f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn        listview.setItemAlignmentOffset(alignPosition);
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        listview.setItemAlignmentOffsetPercent(100);
436fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang        listview.setWindowAlignmentOffset(0);
4372cd3fb5aa71cd32cd67ddfaafaca8f85a7ac13c6Adam Lesinski        listview.setWindowAlignmentOffsetPercent(100);
438be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        listview.setWindowAlignment(VerticalGridView.WINDOW_ALIGN_HIGH_EDGE);
4392cd3fb5aa71cd32cd67ddfaafaca8f85a7ac13c6Adam Lesinski    }
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
441a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn    @Override
442a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn    public void onCreate(Bundle savedInstanceState) {
443f02b60aa4f367516f40cf3d60fffae0c6fe3e1b8Dianne Hackborn        super.onCreate(savedInstanceState);
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
445f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        mAlignPosition =
446c8230519728b14065effd3b7d4eca273ff86160cDianne Hackborn            getResources().getDimensionPixelSize(R.dimen.lb_playback_controls_align_bottom);
447fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang        mBgDarkColor =
4484de5a3ac6655f76b67af38712ae5aeb6d7c15938Dianne Hackborn                getResources().getColor(R.color.lb_playback_controls_background_dark);
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBgLightColor =
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                getResources().getColor(R.color.lb_playback_controls_background_light);
451f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn        mShowTimeMs =
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                getResources().getInteger(R.integer.lb_playback_controls_show_time_ms);
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFadeTranslateY =
454f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn                getResources().getDimensionPixelSize(R.dimen.lb_playback_fade_translate_y);
455f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn
4564de5a3ac6655f76b67af38712ae5aeb6d7c15938Dianne Hackborn        loadBgAnimator();
457dd71fc8baeee0d09008d0fa67d6bf3d23cf21baaDianne Hackborn        loadControlRowAnimator();
458f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn        loadOtherRowAnimator();
459f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn    }
460be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn
461be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn    /**
462be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn     * Sets the background type.
4634eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato     *
464be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn     * @param type One of BG_LIGHT, BG_DARK, or BG_NONE.
465be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn     */
466be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn    public void setBackgroundType(int type) {
467be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        switch (type) {
468be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        case BG_LIGHT:
4694c5c6f43dd81031c2501e35b355fad5ebbf0ab87Ronnie Leng        case BG_DARK:
4708472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn        case BG_NONE:
471be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            if (type != mBackgroundType) {
472be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                mBackgroundType = type;
473f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                updateBackground();
474f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn            }
475f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn            break;
476be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        default:
4774c5c6f43dd81031c2501e35b355fad5ebbf0ab87Ronnie Leng            throw new IllegalArgumentException("Invalid background type");
4788472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn        }
479f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn    }
480f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn
481be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn    /**
482be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn     * Returns the background type.
483be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn     */
484be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn    public int getBackgroundType() {
485be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        return mBackgroundType;
486be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn    }
487be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn
48853459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn    private void updateBackground() {
4894eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato        if (mRootView != null) {
49053459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn            int color = mBgDarkColor;
491be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            switch (mBackgroundType) {
492be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                case BG_DARK: break;
493be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                case BG_LIGHT: color = mBgLightColor; break;
494be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                case BG_NONE: color = Color.TRANSPARENT; break;
495be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            }
496be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            mRootView.setBackground(new ColorDrawable(color));
497be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        }
498f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn    }
499f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn
500f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn    private final ItemBridgeAdapter.AdapterListener mAdapterListener =
501be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            new ItemBridgeAdapter.AdapterListener() {
502f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn        @Override
503be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn        public void onAttachedToWindow(ItemBridgeAdapter.ViewHolder vh) {
504be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            if (DEBUG) Log.v(TAG, "onAttachedToWindow " + vh.getViewHolder().view);
505be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn            if ((mFadingStatus == IDLE && mBgAlpha == 0) || mFadingStatus == OUT) {
506be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn                if (DEBUG) Log.v(TAG, "setting alpha to 0");
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                vh.getViewHolder().view.setAlpha(0);
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void onDetachedFromWindow(ItemBridgeAdapter.ViewHolder vh) {
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DEBUG) Log.v(TAG, "onDetachedFromWindow " + vh.getViewHolder().view);
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Reset animation state
51401e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn            vh.getViewHolder().view.setAlpha(1f);
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            vh.getViewHolder().view.setTranslationY(0);
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
519a22d9fbe8c1cf3cb47db0bfecbd4fd84c59b6ec0Narayan Kamath    @Override
520a22d9fbe8c1cf3cb47db0bfecbd4fd84c59b6ec0Narayan Kamath    public View onCreateView(LayoutInflater inflater, ViewGroup container,
521a22d9fbe8c1cf3cb47db0bfecbd4fd84c59b6ec0Narayan Kamath            Bundle savedInstanceState) {
522a22d9fbe8c1cf3cb47db0bfecbd4fd84c59b6ec0Narayan Kamath        mRootView = super.onCreateView(inflater, container, savedInstanceState);
523a22d9fbe8c1cf3cb47db0bfecbd4fd84c59b6ec0Narayan Kamath        mBgAlpha = 255;
524a22d9fbe8c1cf3cb47db0bfecbd4fd84c59b6ec0Narayan Kamath        updateBackground();
525a22d9fbe8c1cf3cb47db0bfecbd4fd84c59b6ec0Narayan Kamath        getRowsFragment().setExternalAdapterListener(mAdapterListener);
526a22d9fbe8c1cf3cb47db0bfecbd4fd84c59b6ec0Narayan Kamath        return mRootView;
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
529e23149f1555303940d212b742707518b7f9f84abWale Ogunwale    @Override
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void onDestroyView() {
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRootView = null;
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super.onDestroyView();
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
534860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final DataObserver mObserver = new DataObserver() {
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void onChanged() {
537e23149f1555303940d212b742707518b7f9f84abWale Ogunwale            setVerticalGridViewLayout(getVerticalGridView());
5381b64e0d8657463c0f7ce9b068a16a522cdfe7d28Dianne Hackborn        }
5391b64e0d8657463c0f7ce9b068a16a522cdfe7d28Dianne Hackborn    };
5401b64e0d8657463c0f7ce9b068a16a522cdfe7d28Dianne Hackborn}
5411b64e0d8657463c0f7ce9b068a16a522cdfe7d28Dianne Hackborn