PlaybackOverlayFragment.java revision d1adbdcb44a48e142d28a93189c57edfe62d93ce
17ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout/*
27ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout * Copyright (C) 2014 The Android Open Source Project
37ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout *
47ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
57ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout * in compliance with the License. You may obtain a copy of the License at
67ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout *
77ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout * http://www.apache.org/licenses/LICENSE-2.0
87ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout *
97ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout * Unless required by applicable law or agreed to in writing, software distributed under the License
107ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
117ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout * or implied. See the License for the specific language governing permissions and limitations under
127ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout * the License.
137ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout */
147ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stoutpackage android.support.v17.leanback.app;
157ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout
167709709c2c78490a21311e9950d5dca7e89a6aedCraig Stoutimport android.graphics.Color;
177709709c2c78490a21311e9950d5dca7e89a6aedCraig Stoutimport android.graphics.drawable.ColorDrawable;
18372d07bb41510d91a6a662a1906aceb0ee759481Craig Stoutimport android.animation.Animator;
19d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stoutimport android.animation.AnimatorInflater;
20d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stoutimport android.animation.TimeInterpolator;
21d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stoutimport android.animation.ValueAnimator;
22d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stoutimport android.animation.ValueAnimator.AnimatorUpdateListener;
23d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stoutimport android.content.Context;
247ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stoutimport android.os.Bundle;
25372d07bb41510d91a6a662a1906aceb0ee759481Craig Stoutimport android.os.Handler;
26372d07bb41510d91a6a662a1906aceb0ee759481Craig Stoutimport android.os.Message;
27d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stoutimport android.support.v7.widget.RecyclerView;
287ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stoutimport android.support.v17.leanback.R;
29d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stoutimport android.support.v17.leanback.animation.LogAccelerateInterpolator;
30d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stoutimport android.support.v17.leanback.animation.LogDecelerateInterpolator;
31d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stoutimport android.support.v17.leanback.widget.ItemBridgeAdapter;
327ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stoutimport android.support.v17.leanback.widget.ObjectAdapter;
336dca725412977bb56b933bdec120e31909233cdbCraig Stoutimport android.support.v17.leanback.widget.ObjectAdapter.DataObserver;
347ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stoutimport android.support.v17.leanback.widget.VerticalGridView;
35372d07bb41510d91a6a662a1906aceb0ee759481Craig Stoutimport android.util.Log;
36372d07bb41510d91a6a662a1906aceb0ee759481Craig Stoutimport android.view.KeyEvent;
377709709c2c78490a21311e9950d5dca7e89a6aedCraig Stoutimport android.view.LayoutInflater;
38372d07bb41510d91a6a662a1906aceb0ee759481Craig Stoutimport android.view.MotionEvent;
397709709c2c78490a21311e9950d5dca7e89a6aedCraig Stoutimport android.view.View;
407709709c2c78490a21311e9950d5dca7e89a6aedCraig Stoutimport android.view.ViewGroup;
41372d07bb41510d91a6a662a1906aceb0ee759481Craig Stoutimport android.view.animation.Interpolator;
42372d07bb41510d91a6a662a1906aceb0ee759481Craig Stoutimport android.view.animation.LinearInterpolator;
437ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout
447ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout
457ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout/**
467ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout * A fragment for displaying playback controls and related content.
476dca725412977bb56b933bdec120e31909233cdbCraig Stout * The {@link android.support.v17.leanback.widget.PlaybackControlsRow} is expected to be
486dca725412977bb56b933bdec120e31909233cdbCraig Stout * at position 0 in the adapter.
497ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout */
507ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stoutpublic class PlaybackOverlayFragment extends DetailsFragment {
517ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout
527709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout    /**
537709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout     * No background.
547709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout     */
557709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout    public static final int BG_NONE = 0;
567709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout
577709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout    /**
587709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout     * A dark translucent background.
597709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout     */
607709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout    public static final int BG_DARK = 1;
617709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout
627709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout    /**
637709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout     * A light translucent background.
647709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout     */
657709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout    public static final int BG_LIGHT = 2;
667709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout
67372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    public static class OnFadeCompleteListener {
68372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        public void onFadeInComplete() {
69372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        }
70372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        public void onFadeOutComplete() {
71372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        }
72372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    }
73372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout
74372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    private static final String TAG = "PlaybackOverlayFragment";
75372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    private static final boolean DEBUG = false;
76d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout    private static final int ANIMATION_MULTIPLIER = 1;
77372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout
78372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    private static int START_FADE_OUT = 1;
79372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout
80372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    // Fading status
81372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    private static final int IDLE = 0;
82372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    private static final int IN = 1;
83372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    private static final int OUT = 2;
84372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout
857ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout    private int mAlignPosition;
867709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout    private View mRootView;
877709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout    private int mBackgroundType = BG_DARK;
887709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout    private int mBgDarkColor;
897709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout    private int mBgLightColor;
90372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    private int mShowTimeMs;
91d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout    private int mFadeTranslateY;
92372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    private OnFadeCompleteListener mFadeCompleteListener;
93372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    private boolean mFadingEnabled = true;
94372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    private int mFadingStatus = IDLE;
95d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout    private int mBgAlpha;
96d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout    private ValueAnimator mBgFadeInAnimator, mBgFadeOutAnimator;
97d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout    private ValueAnimator mControlRowFadeInAnimator, mControlRowFadeOutAnimator;
98d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout    private ValueAnimator mOtherRowFadeInAnimator, mOtherRowFadeOutAnimator;
99d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout    private boolean mTranslateAnimationEnabled;
100d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout    private RecyclerView.ItemAnimator mItemAnimator;
101372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout
102372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    private final Animator.AnimatorListener mFadeListener =
103372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout            new Animator.AnimatorListener() {
104372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        @Override
105372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        public void onAnimationStart(Animator animation) {
106d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout            enableVerticalGridAnimations(false);
107372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        }
108372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        @Override
109372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        public void onAnimationRepeat(Animator animation) {
110372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        }
111372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        @Override
112372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        public void onAnimationCancel(Animator animation) {
113372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        }
114372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        @Override
115372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        public void onAnimationEnd(Animator animation) {
116d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout            if (DEBUG) Log.v(TAG, "onAnimationEnd " + mBgAlpha);
117d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout            if (mBgAlpha > 0) {
118d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout                enableVerticalGridAnimations(true);
119372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout                startFadeTimer();
120372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout                if (mFadeCompleteListener != null) {
121372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout                    mFadeCompleteListener.onFadeInComplete();
122372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout                }
123d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout            } else {
124d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout                // Reset focus to the controls row
125d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout                getVerticalGridView().setSelectedPosition(0);
126d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout                if (mFadeCompleteListener != null) {
127d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout                    mFadeCompleteListener.onFadeOutComplete();
128d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout                }
129372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout            }
130372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout            mFadingStatus = IDLE;
131372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        }
132372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    };
133372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout
134372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    private final Handler mHandler = new Handler() {
135372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        @Override
136372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        public void handleMessage(Message message) {
137372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout            if (message.what == START_FADE_OUT && mFadingEnabled) {
138372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout                fade(false);
139372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout            }
140372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        }
141372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    };
142372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout
143372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    private final VerticalGridView.OnTouchInterceptListener mOnTouchInterceptListener =
144372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout            new VerticalGridView.OnTouchInterceptListener() {
145372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        public boolean onInterceptTouchEvent(MotionEvent event) {
146372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout            return onInterceptInputEvent();
147372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        }
148372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    };
149372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout
150372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    private final VerticalGridView.OnMotionInterceptListener mOnMotionInterceptListener =
151372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout            new VerticalGridView.OnMotionInterceptListener() {
152372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        public boolean onInterceptMotionEvent(MotionEvent event) {
153372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout            return onInterceptInputEvent();
154372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        }
155372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    };
156372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout
157372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    private final VerticalGridView.OnKeyInterceptListener mOnKeyInterceptListener =
158372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout            new VerticalGridView.OnKeyInterceptListener() {
159372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        public boolean onInterceptKeyEvent(KeyEvent event) {
160372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout            return onInterceptInputEvent();
161372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        }
162372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    };
163372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout
164d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout    private void setBgAlpha(int alpha) {
165d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout        mBgAlpha = alpha;
166d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout        mRootView.getBackground().setAlpha(alpha);
167d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout    }
168d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout
169d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout    private void enableVerticalGridAnimations(boolean enable) {
170d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout        if (enable && mItemAnimator != null) {
171d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout            getVerticalGridView().setItemAnimator(mItemAnimator);
172d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout        } else if (!enable) {
173d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout            mItemAnimator = getVerticalGridView().getItemAnimator();
174d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout            getVerticalGridView().setItemAnimator(null);
175d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout        }
176d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout    }
177d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout
178372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    /**
179372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout     * Enables or disables view fading.  If enabled,
180372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout     * the view will be faded in when the fragment starts,
181372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout     * and will fade out after a time period.  The timeout
182372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout     * period is reset each time {@link #tickle} is called.
183372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout     *
184372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout     */
185372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    public void setFadingEnabled(boolean enabled) {
186372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        if (DEBUG) Log.v(TAG, "setFadingEnabled " + enabled);
187372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        if (enabled != mFadingEnabled) {
188372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout            mFadingEnabled = enabled;
189372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout            if (isResumed()) {
190372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout                if (mFadingEnabled) {
191372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout                    if (mFadingStatus == IDLE && !mHandler.hasMessages(START_FADE_OUT)) {
192372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout                        startFadeTimer();
193372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout                    }
194372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout                } else {
195372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout                    // Ensure fully opaque
196372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout                    mHandler.removeMessages(START_FADE_OUT);
197372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout                    fade(true);
198372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout                }
199372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout            }
200372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        }
201372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    }
202372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout
203372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    /**
204372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout     * Returns true if view fading is enabled.
205372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout     */
206372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    public boolean isFadingEnabled() {
207372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        return mFadingEnabled;
208372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    }
209372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout
210372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    /**
211372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout     * Sets the listener to be called when fade in or out has completed.
212372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout     */
213372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    public void setFadeCompleteListener(OnFadeCompleteListener listener) {
214372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        mFadeCompleteListener = listener;
215372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    }
216372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout
217372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    /**
218372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout     * Returns the listener to be called when fade in or out has completed.
219372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout     */
220372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    public OnFadeCompleteListener getFadeCompleteListener() {
221372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        return mFadeCompleteListener;
222372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    }
223372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout
224372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    /**
225372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout     * Tickles the playback controls.  Fades in the view if it was faded out,
226372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout     * otherwise resets the fade out timer.  Tickling on input events is handled
227372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout     * by the fragment.
228372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout     */
229372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    public void tickle() {
230372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        if (DEBUG) Log.v(TAG, "tickle enabled " + mFadingEnabled + " isResumed " + isResumed());
231372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        if (!mFadingEnabled || !isResumed()) {
232372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout            return;
233372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        }
234372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        if (mHandler.hasMessages(START_FADE_OUT)) {
235372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout            // Restart the timer
236372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout            startFadeTimer();
237372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        } else {
238372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout            fade(true);
239372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        }
240372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    }
241372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout
242372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    private boolean onInterceptInputEvent() {
243d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout        if (DEBUG) Log.v(TAG, "onInterceptInputEvent status " + mFadingStatus);
244d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout        boolean consumeEvent = (mFadingStatus == IDLE && mBgAlpha == 0);
245372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        tickle();
246372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        return consumeEvent;
247372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    }
248372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout
249372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    @Override
250372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    public void onResume() {
251372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        super.onResume();
252372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        if (mFadingEnabled) {
253d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout            setBgAlpha(0);
254372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout            fade(true);
255372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        }
256372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        getVerticalGridView().setOnTouchInterceptListener(mOnTouchInterceptListener);
257372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        getVerticalGridView().setOnMotionInterceptListener(mOnMotionInterceptListener);
258372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        getVerticalGridView().setOnKeyInterceptListener(mOnKeyInterceptListener);
259372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    }
260372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout
261372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    private void startFadeTimer() {
262372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        mHandler.removeMessages(START_FADE_OUT);
263372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        mHandler.sendEmptyMessageDelayed(START_FADE_OUT, mShowTimeMs);
264372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    }
265372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout
266d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout    private static ValueAnimator loadAnimator(Context context, int resId) {
267d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout        ValueAnimator animator = (ValueAnimator) AnimatorInflater.loadAnimator(context, resId);
268d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout        animator.setDuration(animator.getDuration() * ANIMATION_MULTIPLIER);
269d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout        return animator;
270d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout    }
271d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout
272d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout    private void loadBgAnimator() {
273d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout        AnimatorUpdateListener listener = new AnimatorUpdateListener() {
274d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout            @Override
275d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout            public void onAnimationUpdate(ValueAnimator arg0) {
276d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout                setBgAlpha((Integer) arg0.getAnimatedValue());
277d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout            }
278d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout        };
279d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout
280d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout        mBgFadeInAnimator = loadAnimator(getActivity(), R.animator.lb_playback_bg_fade_in);
281d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout        mBgFadeInAnimator.addUpdateListener(listener);
282d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout        mBgFadeInAnimator.addListener(mFadeListener);
283d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout
284d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout        mBgFadeOutAnimator = loadAnimator(getActivity(), R.animator.lb_playback_bg_fade_out);
285d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout        mBgFadeOutAnimator.addUpdateListener(listener);
286d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout        mBgFadeOutAnimator.addListener(mFadeListener);
287d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout    }
288d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout
289d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout    private TimeInterpolator mLogDecelerateInterpolator = new LogDecelerateInterpolator(100,0);
290d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout    private TimeInterpolator mLogAccelerateInterpolator = new LogAccelerateInterpolator(100,0);
291d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout
292d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout    private void loadControlRowAnimator() {
293d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout        AnimatorUpdateListener listener = new AnimatorUpdateListener() {
294d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout            @Override
295d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout            public void onAnimationUpdate(ValueAnimator arg0) {
296d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout                RecyclerView.ViewHolder vh = getVerticalGridView().findViewHolderForPosition(0);
297d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout                if (vh != null) {
298d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout                    final float fraction = (Float) arg0.getAnimatedValue();
299d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout                    if (DEBUG) Log.v(TAG, "fraction " + fraction);
300d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout                    vh.itemView.setAlpha(fraction);
301d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout                    if (mTranslateAnimationEnabled) {
302d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout                        vh.itemView.setTranslationY((float) mFadeTranslateY * (1f - fraction));
303d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout                    }
304d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout                }
305d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout            }
306d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout        };
307d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout
308d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout        mControlRowFadeInAnimator = loadAnimator(
309d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout                getActivity(), R.animator.lb_playback_controls_fade_in);
310d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout        mControlRowFadeInAnimator.addUpdateListener(listener);
311d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout        mControlRowFadeInAnimator.setInterpolator(mLogDecelerateInterpolator);
312d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout
313d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout        mControlRowFadeOutAnimator = loadAnimator(
314d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout                getActivity(), R.animator.lb_playback_controls_fade_out);
315d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout        mControlRowFadeOutAnimator.addUpdateListener(listener);
316d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout        mControlRowFadeOutAnimator.setInterpolator(mLogAccelerateInterpolator);
317d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout    }
318d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout
319d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout    private void loadOtherRowAnimator() {
320d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout        AnimatorUpdateListener listener = new AnimatorUpdateListener() {
321d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout            @Override
322d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout            public void onAnimationUpdate(ValueAnimator arg0) {
323d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout                final float fraction = (Float) arg0.getAnimatedValue();
324d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout                final int count = getVerticalGridView().getChildCount();
325d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout                for (int i = 0; i < count; i++) {
326d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout                    View view = getVerticalGridView().getChildAt(i);
327d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout                    if (getVerticalGridView().getChildPosition(view) > 0) {
328d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout                        view.setAlpha(fraction);
329d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout                        if (mTranslateAnimationEnabled) {
330d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout                            view.setTranslationY((float) mFadeTranslateY * (1f - fraction));
331d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout                        }
332d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout                    }
333d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout                }
334d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout            }
335d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout        };
336d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout
337d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout        mOtherRowFadeInAnimator = loadAnimator(
338d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout                getActivity(), R.animator.lb_playback_controls_fade_in);
339d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout        mOtherRowFadeInAnimator.addUpdateListener(listener);
340d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout        mOtherRowFadeInAnimator.setInterpolator(mLogDecelerateInterpolator);
341d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout
342d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout        mOtherRowFadeOutAnimator = loadAnimator(
343d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout                getActivity(), R.animator.lb_playback_controls_fade_out);
344d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout        mOtherRowFadeOutAnimator.addUpdateListener(listener);
345d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout        mOtherRowFadeOutAnimator.setInterpolator(mLogDecelerateInterpolator);
346d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout    }
347d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout
348372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    private void fade(boolean fadeIn) {
349372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        if (DEBUG) Log.v(TAG, "fade " + fadeIn);
350372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        if (getView() == null) {
351372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout            return;
352372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        }
353372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        if ((fadeIn && mFadingStatus == IN) || (!fadeIn && mFadingStatus == OUT)) {
354d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout            if (DEBUG) Log.v(TAG, "requested fade in progress");
355d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout            return;
356d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout        }
357d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout        if ((fadeIn && mBgAlpha == 255) || (!fadeIn && mBgAlpha == 0)) {
358d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout            if (DEBUG) Log.v(TAG, "fade is no-op");
359372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout            return;
360372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        }
361372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout
362d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout        mTranslateAnimationEnabled = getVerticalGridView().getSelectedPosition() == 0;
363d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout
364d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout        if (mFadingStatus == IDLE) {
365d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout            if (fadeIn) {
366d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout                mBgFadeInAnimator.start();
367d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout                mControlRowFadeInAnimator.start();
368d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout                mOtherRowFadeInAnimator.start();
369d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout            } else {
370d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout                mBgFadeOutAnimator.start();
371d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout                mControlRowFadeOutAnimator.start();
372d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout                mOtherRowFadeOutAnimator.start();
373d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout            }
374d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout        } else {
375d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout            if (fadeIn) {
376d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout                mBgFadeOutAnimator.reverse();
377d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout                mControlRowFadeOutAnimator.reverse();
378d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout                mOtherRowFadeOutAnimator.reverse();
379d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout            } else {
380d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout                mBgFadeInAnimator.reverse();
381d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout                mControlRowFadeInAnimator.reverse();
382d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout                mOtherRowFadeInAnimator.reverse();
383d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout            }
384d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout        }
385d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout
386d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout        // If fading in while control row is focused, set initial translationY so
387d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout        // views slide in from below.
388d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout        if (fadeIn && mFadingStatus == IDLE && mTranslateAnimationEnabled) {
389d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout            final int count = getVerticalGridView().getChildCount();
390d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout            for (int i = 0; i < count; i++) {
391d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout                getVerticalGridView().getChildAt(i).setTranslationY(mFadeTranslateY);
392d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout            }
393d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout        }
394d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout
395372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        mFadingStatus = fadeIn ? IN : OUT;
396372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    }
3977ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout
3987ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout    /**
3997ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout     * Sets the list of rows for the fragment.
4007ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout     */
4017ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout    @Override
4027ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout    public void setAdapter(ObjectAdapter adapter) {
4036dca725412977bb56b933bdec120e31909233cdbCraig Stout        if (getAdapter() != null) {
4046dca725412977bb56b933bdec120e31909233cdbCraig Stout            getAdapter().unregisterObserver(mObserver);
4056dca725412977bb56b933bdec120e31909233cdbCraig Stout        }
4067ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout        super.setAdapter(adapter);
4076dca725412977bb56b933bdec120e31909233cdbCraig Stout        if (adapter != null) {
4086dca725412977bb56b933bdec120e31909233cdbCraig Stout            adapter.registerObserver(mObserver);
4096dca725412977bb56b933bdec120e31909233cdbCraig Stout        }
4107ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout        setVerticalGridViewLayout(getVerticalGridView());
4117ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout    }
4127ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout
4137ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout    @Override
4147ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout    void setVerticalGridViewLayout(VerticalGridView listview) {
4157ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout        if (listview == null || getAdapter() == null) {
4167ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout            return;
4177ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout        }
4187ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout        final int alignPosition = getAdapter().size() > 1 ? mAlignPosition : 0;
4197ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout        listview.setItemAlignmentOffset(alignPosition);
4207ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout        listview.setItemAlignmentOffsetPercent(100);
4217ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout        listview.setWindowAlignmentOffset(0);
4227ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout        listview.setWindowAlignmentOffsetPercent(100);
4237ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout        listview.setWindowAlignment(VerticalGridView.WINDOW_ALIGN_HIGH_EDGE);
4247ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout    }
4257ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout
4267ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout    @Override
4277ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout    public void onCreate(Bundle savedInstanceState) {
4287ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout        super.onCreate(savedInstanceState);
4297ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout
4307ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout        mAlignPosition =
4317ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout            getResources().getDimensionPixelSize(R.dimen.lb_playback_controls_align_bottom);
4327709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout        mBgDarkColor =
4337709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout                getResources().getColor(R.color.lb_playback_controls_background_dark);
4347709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout        mBgLightColor =
4357709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout                getResources().getColor(R.color.lb_playback_controls_background_light);
436372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        mShowTimeMs =
437372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout                getResources().getInteger(R.integer.lb_playback_controls_show_time_ms);
438d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout        mFadeTranslateY =
439d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout                getResources().getDimensionPixelSize(R.dimen.lb_playback_fade_translate_y);
440d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout
441d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout        loadBgAnimator();
442d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout        loadControlRowAnimator();
443d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout        loadOtherRowAnimator();
4447709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout    }
4457709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout
4467709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout    /**
4477709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout     * Sets the background type.
4487709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout     *
4497709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout     * @param type One of BG_LIGHT, BG_DARK, or BG_NONE.
4507709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout     */
4517709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout    public void setBackgroundType(int type) {
452372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        switch (type) {
453372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        case BG_LIGHT:
454372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        case BG_DARK:
455372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        case BG_NONE:
456372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout            if (type != mBackgroundType) {
457372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout                mBackgroundType = type;
458372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout                updateBackground();
459372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout            }
460372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout            break;
461372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        default:
4627709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout            throw new IllegalArgumentException("Invalid background type");
4637709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout        }
4647709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout    }
4657709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout
4667709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout    /**
4677709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout     * Returns the background type.
4687709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout     */
4697709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout    public int getBackgroundType() {
4707709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout        return mBackgroundType;
4717709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout    }
4727709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout
4737709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout    private void updateBackground() {
4747709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout        if (mRootView != null) {
4757709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout            int color = mBgDarkColor;
4767709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout            switch (mBackgroundType) {
4777709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout                case BG_DARK: break;
4787709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout                case BG_LIGHT: color = mBgLightColor; break;
4797709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout                case BG_NONE: color = Color.TRANSPARENT; break;
4807709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout            }
4817709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout            mRootView.setBackground(new ColorDrawable(color));
4827709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout        }
4837709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout    }
4847709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout
485d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout    private final ItemBridgeAdapter.AdapterListener mAdapterListener =
486d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout            new ItemBridgeAdapter.AdapterListener() {
487d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout        @Override
488d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout        public void onAttachedToWindow(ItemBridgeAdapter.ViewHolder vh) {
489d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout            if (DEBUG) Log.v(TAG, "onAttachedToWindow " + vh.getViewHolder().view);
490d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout            if ((mFadingStatus == IDLE && mBgAlpha == 0) || mFadingStatus == OUT) {
491d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout                if (DEBUG) Log.v(TAG, "setting alpha to 0");
492d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout                vh.getViewHolder().view.setAlpha(0);
493d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout            }
494d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout        }
495d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout        @Override
496d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout        public void onDetachedFromWindow(ItemBridgeAdapter.ViewHolder vh) {
497d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout            if (DEBUG) Log.v(TAG, "onDetachedFromWindow " + vh.getViewHolder().view);
498d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout            // Reset animation state
499d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout            vh.getViewHolder().view.setAlpha(1f);
500d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout            vh.getViewHolder().view.setTranslationY(0);
501d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout        }
502d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout    };
503d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout
5047709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout    @Override
5057709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout    public View onCreateView(LayoutInflater inflater, ViewGroup container,
5067709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout            Bundle savedInstanceState) {
5077709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout        mRootView = super.onCreateView(inflater, container, savedInstanceState);
508d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout        mBgAlpha = 255;
5097709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout        updateBackground();
510d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout        getRowsFragment().setExternalAdapterListener(mAdapterListener);
5117709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout        return mRootView;
5127ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout    }
5136dca725412977bb56b933bdec120e31909233cdbCraig Stout
5146dca725412977bb56b933bdec120e31909233cdbCraig Stout    private final DataObserver mObserver = new DataObserver() {
5156dca725412977bb56b933bdec120e31909233cdbCraig Stout        public void onChanged() {
5166dca725412977bb56b933bdec120e31909233cdbCraig Stout            setVerticalGridViewLayout(getVerticalGridView());
5176dca725412977bb56b933bdec120e31909233cdbCraig Stout        }
5186dca725412977bb56b933bdec120e31909233cdbCraig Stout    };
5197ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout}
520