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