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