PlaybackOverlayFragment.java revision 372d07bb41510d91a6a662a1906aceb0ee759481
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;
197ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stoutimport android.os.Bundle;
20372d07bb41510d91a6a662a1906aceb0ee759481Craig Stoutimport android.os.Handler;
21372d07bb41510d91a6a662a1906aceb0ee759481Craig Stoutimport android.os.Message;
227ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stoutimport android.support.v17.leanback.R;
237ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stoutimport android.support.v17.leanback.widget.ObjectAdapter;
246dca725412977bb56b933bdec120e31909233cdbCraig Stoutimport android.support.v17.leanback.widget.ObjectAdapter.DataObserver;
257ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stoutimport android.support.v17.leanback.widget.VerticalGridView;
26372d07bb41510d91a6a662a1906aceb0ee759481Craig Stoutimport android.util.Log;
27372d07bb41510d91a6a662a1906aceb0ee759481Craig Stoutimport android.view.KeyEvent;
287709709c2c78490a21311e9950d5dca7e89a6aedCraig Stoutimport android.view.LayoutInflater;
29372d07bb41510d91a6a662a1906aceb0ee759481Craig Stoutimport android.view.MotionEvent;
307709709c2c78490a21311e9950d5dca7e89a6aedCraig Stoutimport android.view.View;
317709709c2c78490a21311e9950d5dca7e89a6aedCraig Stoutimport android.view.ViewGroup;
32372d07bb41510d91a6a662a1906aceb0ee759481Craig Stoutimport android.view.animation.Interpolator;
33372d07bb41510d91a6a662a1906aceb0ee759481Craig Stoutimport android.view.animation.LinearInterpolator;
347ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout
357ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout
367ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout/**
377ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout * A fragment for displaying playback controls and related content.
386dca725412977bb56b933bdec120e31909233cdbCraig Stout * The {@link android.support.v17.leanback.widget.PlaybackControlsRow} is expected to be
396dca725412977bb56b933bdec120e31909233cdbCraig Stout * at position 0 in the adapter.
407ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout */
417ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stoutpublic class PlaybackOverlayFragment extends DetailsFragment {
427ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout
437709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout    /**
447709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout     * No background.
457709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout     */
467709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout    public static final int BG_NONE = 0;
477709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout
487709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout    /**
497709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout     * A dark translucent background.
507709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout     */
517709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout    public static final int BG_DARK = 1;
527709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout
537709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout    /**
547709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout     * A light translucent background.
557709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout     */
567709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout    public static final int BG_LIGHT = 2;
577709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout
58372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    public static class OnFadeCompleteListener {
59372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        public void onFadeInComplete() {
60372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        }
61372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        public void onFadeOutComplete() {
62372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        }
63372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    }
64372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout
65372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    private static final String TAG = "PlaybackOverlayFragment";
66372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    private static final boolean DEBUG = false;
67372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout
68372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    private static int START_FADE_OUT = 1;
69372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout
70372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    // Fading status
71372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    private static final int IDLE = 0;
72372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    private static final int IN = 1;
73372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    private static final int OUT = 2;
74372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout
757ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout    private int mAlignPosition;
767709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout    private View mRootView;
777709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout    private int mBackgroundType = BG_DARK;
787709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout    private int mBgDarkColor;
797709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout    private int mBgLightColor;
80372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    private int mFadeInDurationMs;
81372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    private int mFadeOutDurationMs;
82372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    private int mShowTimeMs;
83372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    private OnFadeCompleteListener mFadeCompleteListener;
84372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    private boolean mFadingEnabled = true;
85372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    private int mFadingStatus = IDLE;
86372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout
87372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    private final Animator.AnimatorListener mFadeListener =
88372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout            new Animator.AnimatorListener() {
89372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        @Override
90372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        public void onAnimationStart(Animator animation) {
91372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        }
92372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        @Override
93372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        public void onAnimationRepeat(Animator animation) {
94372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        }
95372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        @Override
96372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        public void onAnimationCancel(Animator animation) {
97372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        }
98372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        @Override
99372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        public void onAnimationEnd(Animator animation) {
100372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout            float alpha = getView().getAlpha();
101372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout            if (DEBUG) Log.v(TAG, "onAnimationEnd " + alpha);
102372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout            if (alpha == 1) {
103372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout                startFadeTimer();
104372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout                if (mFadeCompleteListener != null) {
105372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout                    mFadeCompleteListener.onFadeInComplete();
106372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout                }
107372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout            } else if (alpha == 0 && mFadeCompleteListener != null) {
108372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout                mFadeCompleteListener.onFadeOutComplete();
109372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout            }
110372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout            mFadingStatus = IDLE;
111372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        }
112372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    };
113372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout
114372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    private final Handler mHandler = new Handler() {
115372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        @Override
116372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        public void handleMessage(Message message) {
117372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout            if (message.what == START_FADE_OUT && mFadingEnabled) {
118372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout                fade(false);
119372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout            }
120372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        }
121372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    };
122372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout
123372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    private final Interpolator mFadeInterpolator = new LinearInterpolator();
124372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout
125372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    private final VerticalGridView.OnTouchInterceptListener mOnTouchInterceptListener =
126372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout            new VerticalGridView.OnTouchInterceptListener() {
127372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        public boolean onInterceptTouchEvent(MotionEvent event) {
128372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout            return onInterceptInputEvent();
129372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        }
130372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    };
131372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout
132372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    private final VerticalGridView.OnMotionInterceptListener mOnMotionInterceptListener =
133372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout            new VerticalGridView.OnMotionInterceptListener() {
134372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        public boolean onInterceptMotionEvent(MotionEvent event) {
135372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout            return onInterceptInputEvent();
136372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        }
137372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    };
138372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout
139372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    private final VerticalGridView.OnKeyInterceptListener mOnKeyInterceptListener =
140372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout            new VerticalGridView.OnKeyInterceptListener() {
141372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        public boolean onInterceptKeyEvent(KeyEvent event) {
142372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout            return onInterceptInputEvent();
143372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        }
144372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    };
145372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout
146372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    /**
147372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout     * Enables or disables view fading.  If enabled,
148372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout     * the view will be faded in when the fragment starts,
149372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout     * and will fade out after a time period.  The timeout
150372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout     * period is reset each time {@link #tickle} is called.
151372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout     *
152372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout     */
153372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    public void setFadingEnabled(boolean enabled) {
154372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        if (DEBUG) Log.v(TAG, "setFadingEnabled " + enabled);
155372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        if (enabled != mFadingEnabled) {
156372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout            mFadingEnabled = enabled;
157372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout            if (isResumed()) {
158372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout                if (mFadingEnabled) {
159372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout                    if (mFadingStatus == IDLE && !mHandler.hasMessages(START_FADE_OUT)) {
160372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout                        startFadeTimer();
161372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout                    }
162372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout                } else {
163372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout                    // Ensure fully opaque
164372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout                    mHandler.removeMessages(START_FADE_OUT);
165372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout                    fade(true);
166372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout                }
167372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout            }
168372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        }
169372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    }
170372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout
171372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    /**
172372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout     * Returns true if view fading is enabled.
173372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout     */
174372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    public boolean isFadingEnabled() {
175372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        return mFadingEnabled;
176372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    }
177372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout
178372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    /**
179372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout     * Sets the listener to be called when fade in or out has completed.
180372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout     */
181372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    public void setFadeCompleteListener(OnFadeCompleteListener listener) {
182372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        mFadeCompleteListener = listener;
183372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    }
184372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout
185372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    /**
186372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout     * Returns the listener to be called when fade in or out has completed.
187372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout     */
188372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    public OnFadeCompleteListener getFadeCompleteListener() {
189372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        return mFadeCompleteListener;
190372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    }
191372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout
192372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    /**
193372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout     * Tickles the playback controls.  Fades in the view if it was faded out,
194372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout     * otherwise resets the fade out timer.  Tickling on input events is handled
195372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout     * by the fragment.
196372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout     */
197372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    public void tickle() {
198372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        if (DEBUG) Log.v(TAG, "tickle enabled " + mFadingEnabled + " isResumed " + isResumed());
199372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        if (!mFadingEnabled || !isResumed()) {
200372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout            return;
201372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        }
202372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        if (mHandler.hasMessages(START_FADE_OUT)) {
203372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout            // Restart the timer
204372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout            startFadeTimer();
205372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        } else {
206372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout            fade(true);
207372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        }
208372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    }
209372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout
210372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    private boolean onInterceptInputEvent() {
211372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        if (DEBUG) Log.v(TAG, "onInterceptInputEvent status " + mFadingStatus +
212372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout                " alpha " + getView().getAlpha());
213372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        boolean consumeEvent = (mFadingStatus == IDLE && getView().getAlpha() == 0);
214372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        tickle();
215372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        return consumeEvent;
216372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    }
217372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout
218372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    @Override
219372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    public void onResume() {
220372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        super.onResume();
221372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        if (mFadingEnabled) {
222372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout            getView().setAlpha(0);
223372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout            fade(true);
224372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        }
225372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        getVerticalGridView().setOnTouchInterceptListener(mOnTouchInterceptListener);
226372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        getVerticalGridView().setOnMotionInterceptListener(mOnMotionInterceptListener);
227372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        getVerticalGridView().setOnKeyInterceptListener(mOnKeyInterceptListener);
228372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    }
229372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout
230372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    private void startFadeTimer() {
231372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        if (DEBUG) Log.v(TAG, "startFadeTime");
232372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        mHandler.removeMessages(START_FADE_OUT);
233372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        mHandler.sendEmptyMessageDelayed(START_FADE_OUT, mShowTimeMs);
234372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    }
235372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout
236372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    private void fade(boolean fadeIn) {
237372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        if (DEBUG) Log.v(TAG, "fade " + fadeIn);
238372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        if (getView() == null) {
239372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout            return;
240372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        }
241372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        if ((fadeIn && mFadingStatus == IN) || (!fadeIn && mFadingStatus == OUT)) {
242372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout            if (DEBUG) Log.v(TAG, "fade " + fadeIn + " in progress");
243372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout            return;
244372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        }
245372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout
246372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        getView().animate().alpha(fadeIn ? 1 : 0)
247372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout                .setDuration(fadeIn ? mFadeInDurationMs : mFadeOutDurationMs)
248372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout                .setListener(mFadeListener)
249372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout                .setInterpolator(mFadeInterpolator)
250372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout                .start();
251372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        mFadingStatus = fadeIn ? IN : OUT;
252372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout    }
2537ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout
2547ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout    /**
2557ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout     * Sets the list of rows for the fragment.
2567ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout     */
2577ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout    @Override
2587ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout    public void setAdapter(ObjectAdapter adapter) {
2596dca725412977bb56b933bdec120e31909233cdbCraig Stout        if (getAdapter() != null) {
2606dca725412977bb56b933bdec120e31909233cdbCraig Stout            getAdapter().unregisterObserver(mObserver);
2616dca725412977bb56b933bdec120e31909233cdbCraig Stout        }
2627ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout        super.setAdapter(adapter);
2636dca725412977bb56b933bdec120e31909233cdbCraig Stout        if (adapter != null) {
2646dca725412977bb56b933bdec120e31909233cdbCraig Stout            adapter.registerObserver(mObserver);
2656dca725412977bb56b933bdec120e31909233cdbCraig Stout        }
2667ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout        setVerticalGridViewLayout(getVerticalGridView());
2677ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout    }
2687ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout
2697ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout    @Override
2707ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout    void setVerticalGridViewLayout(VerticalGridView listview) {
2717ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout        if (listview == null || getAdapter() == null) {
2727ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout            return;
2737ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout        }
2747ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout        final int alignPosition = getAdapter().size() > 1 ? mAlignPosition : 0;
2757ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout        listview.setItemAlignmentOffset(alignPosition);
2767ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout        listview.setItemAlignmentOffsetPercent(100);
2777ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout        listview.setWindowAlignmentOffset(0);
2787ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout        listview.setWindowAlignmentOffsetPercent(100);
2797ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout        listview.setWindowAlignment(VerticalGridView.WINDOW_ALIGN_HIGH_EDGE);
2807ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout    }
2817ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout
2827ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout    @Override
2837ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout    public void onCreate(Bundle savedInstanceState) {
2847ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout        super.onCreate(savedInstanceState);
2857ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout
2867ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout        mAlignPosition =
2877ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout            getResources().getDimensionPixelSize(R.dimen.lb_playback_controls_align_bottom);
2887709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout        mBgDarkColor =
2897709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout                getResources().getColor(R.color.lb_playback_controls_background_dark);
2907709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout        mBgLightColor =
2917709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout                getResources().getColor(R.color.lb_playback_controls_background_light);
292372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        mFadeInDurationMs =
293372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout                getResources().getInteger(R.integer.lb_playback_controls_fade_in_duration_ms);
294372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        mFadeOutDurationMs =
295372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout                getResources().getInteger(R.integer.lb_playback_controls_fade_out_duration_ms);
296372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        mShowTimeMs =
297372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout                getResources().getInteger(R.integer.lb_playback_controls_show_time_ms);
2987709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout    }
2997709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout
3007709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout    /**
3017709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout     * Sets the background type.
3027709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout     *
3037709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout     * @param type One of BG_LIGHT, BG_DARK, or BG_NONE.
3047709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout     */
3057709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout    public void setBackgroundType(int type) {
306372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        switch (type) {
307372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        case BG_LIGHT:
308372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        case BG_DARK:
309372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        case BG_NONE:
310372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout            if (type != mBackgroundType) {
311372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout                mBackgroundType = type;
312372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout                updateBackground();
313372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout            }
314372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout            break;
315372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout        default:
3167709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout            throw new IllegalArgumentException("Invalid background type");
3177709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout        }
3187709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout    }
3197709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout
3207709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout    /**
3217709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout     * Returns the background type.
3227709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout     */
3237709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout    public int getBackgroundType() {
3247709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout        return mBackgroundType;
3257709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout    }
3267709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout
3277709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout    private void updateBackground() {
3287709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout        if (mRootView != null) {
3297709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout            int color = mBgDarkColor;
3307709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout            switch (mBackgroundType) {
3317709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout                case BG_DARK: break;
3327709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout                case BG_LIGHT: color = mBgLightColor; break;
3337709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout                case BG_NONE: color = Color.TRANSPARENT; break;
3347709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout            }
3357709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout            mRootView.setBackground(new ColorDrawable(color));
3367709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout        }
3377709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout    }
3387709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout
3397709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout    @Override
3407709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout    public View onCreateView(LayoutInflater inflater, ViewGroup container,
3417709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout            Bundle savedInstanceState) {
3427709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout        mRootView = super.onCreateView(inflater, container, savedInstanceState);
3437709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout        updateBackground();
3447709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout        return mRootView;
3457ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout    }
3466dca725412977bb56b933bdec120e31909233cdbCraig Stout
3476dca725412977bb56b933bdec120e31909233cdbCraig Stout    private final DataObserver mObserver = new DataObserver() {
3486dca725412977bb56b933bdec120e31909233cdbCraig Stout        public void onChanged() {
3496dca725412977bb56b933bdec120e31909233cdbCraig Stout            setVerticalGridViewLayout(getVerticalGridView());
3506dca725412977bb56b933bdec120e31909233cdbCraig Stout        }
3516dca725412977bb56b933bdec120e31909233cdbCraig Stout    };
3527ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout}
353