1c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn/* 2c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn * Copyright (C) 2014 The Android Open Source Project 3c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn * 4c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn * in compliance with the License. You may obtain a copy of the License at 6c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn * 7c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn * http://www.apache.org/licenses/LICENSE-2.0 8c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn * 9c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn * Unless required by applicable law or agreed to in writing, software distributed under the License 10c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn * or implied. See the License for the specific language governing permissions and limitations under 12c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn * the License. 13c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn */ 14c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbournpackage android.support.v17.leanback.app; 15c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn 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; 22cbfc318baee2fc054af4c723bfac0fd3c28a1667Craig Stoutimport android.view.InputEvent; 236b2e5b5117f1b8dfafbd81b995bb423ab0297564Craig Stoutimport android.view.animation.AccelerateInterpolator; 24d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stoutimport android.animation.ValueAnimator.AnimatorUpdateListener; 25d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stoutimport android.content.Context; 267ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stoutimport android.os.Bundle; 27372d07bb41510d91a6a662a1906aceb0ee759481Craig Stoutimport android.os.Handler; 28372d07bb41510d91a6a662a1906aceb0ee759481Craig Stoutimport android.os.Message; 29d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stoutimport android.support.v7.widget.RecyclerView; 307ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stoutimport android.support.v17.leanback.R; 31d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stoutimport android.support.v17.leanback.animation.LogAccelerateInterpolator; 32d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stoutimport android.support.v17.leanback.animation.LogDecelerateInterpolator; 336b2e5b5117f1b8dfafbd81b995bb423ab0297564Craig Stoutimport android.support.v17.leanback.widget.Presenter; 34d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stoutimport android.support.v17.leanback.widget.ItemBridgeAdapter; 357ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stoutimport android.support.v17.leanback.widget.ObjectAdapter; 366dca725412977bb56b933bdec120e31909233cdbCraig Stoutimport android.support.v17.leanback.widget.ObjectAdapter.DataObserver; 377ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stoutimport android.support.v17.leanback.widget.VerticalGridView; 386b2e5b5117f1b8dfafbd81b995bb423ab0297564Craig Stoutimport android.support.v17.leanback.widget.PlaybackControlsRowPresenter; 39372d07bb41510d91a6a662a1906aceb0ee759481Craig Stoutimport android.util.Log; 40372d07bb41510d91a6a662a1906aceb0ee759481Craig Stoutimport android.view.KeyEvent; 417709709c2c78490a21311e9950d5dca7e89a6aedCraig Stoutimport android.view.LayoutInflater; 42372d07bb41510d91a6a662a1906aceb0ee759481Craig Stoutimport android.view.MotionEvent; 437709709c2c78490a21311e9950d5dca7e89a6aedCraig Stoutimport android.view.View; 447709709c2c78490a21311e9950d5dca7e89a6aedCraig Stoutimport android.view.ViewGroup; 457ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout 462d33e3cfedc56adc2d4e5ac6279ec683d041fe21Craig Stoutimport java.util.ArrayList; 477ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout 487ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout/** 497ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout * A fragment for displaying playback controls and related content. 506dca725412977bb56b933bdec120e31909233cdbCraig Stout * The {@link android.support.v17.leanback.widget.PlaybackControlsRow} is expected to be 516dca725412977bb56b933bdec120e31909233cdbCraig Stout * at position 0 in the adapter. 527ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout */ 537ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stoutpublic class PlaybackOverlayFragment extends DetailsFragment { 547ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout 557709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout /** 567709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout * No background. 577709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout */ 587709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout public static final int BG_NONE = 0; 597709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout 607709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout /** 617709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout * A dark translucent background. 627709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout */ 637709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout public static final int BG_DARK = 1; 647709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout 657709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout /** 667709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout * A light translucent background. 677709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout */ 687709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout public static final int BG_LIGHT = 2; 697709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout 70372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout public static class OnFadeCompleteListener { 71372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout public void onFadeInComplete() { 72372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout } 73372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout public void onFadeOutComplete() { 74372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout } 75372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout } 76372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout 77eb66dab544c4c1eabe4d469b7cea348d4b01e664Craig Stout public interface InputEventHandler { 78eb66dab544c4c1eabe4d469b7cea348d4b01e664Craig Stout /** 79eb66dab544c4c1eabe4d469b7cea348d4b01e664Craig Stout * Called when an {@link InputEvent} is received. 80eb66dab544c4c1eabe4d469b7cea348d4b01e664Craig Stout * 81eb66dab544c4c1eabe4d469b7cea348d4b01e664Craig Stout * @return If the event should be consumed, return true. To allow the event to 82eb66dab544c4c1eabe4d469b7cea348d4b01e664Craig Stout * continue on to the next handler, return false. 83eb66dab544c4c1eabe4d469b7cea348d4b01e664Craig Stout */ 84eb66dab544c4c1eabe4d469b7cea348d4b01e664Craig Stout public boolean handleInputEvent(InputEvent event); 85eb66dab544c4c1eabe4d469b7cea348d4b01e664Craig Stout } 86eb66dab544c4c1eabe4d469b7cea348d4b01e664Craig Stout 87372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout private static final String TAG = "PlaybackOverlayFragment"; 88372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout private static final boolean DEBUG = false; 89d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout private static final int ANIMATION_MULTIPLIER = 1; 90372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout 91372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout private static int START_FADE_OUT = 1; 92372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout 93372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout // Fading status 94372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout private static final int IDLE = 0; 95372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout private static final int IN = 1; 96372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout private static final int OUT = 2; 97372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout 987ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout private int mAlignPosition; 99d20507e0f5ac7ad021f42ca87c294787246f0591Craig Stout private int mPaddingBottom; 1007709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout private View mRootView; 1017709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout private int mBackgroundType = BG_DARK; 1027709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout private int mBgDarkColor; 1037709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout private int mBgLightColor; 104372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout private int mShowTimeMs; 1056b2e5b5117f1b8dfafbd81b995bb423ab0297564Craig Stout private int mMajorFadeTranslateY, mMinorFadeTranslateY; 1066b2e5b5117f1b8dfafbd81b995bb423ab0297564Craig Stout private int mAnimationTranslateY; 107372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout private OnFadeCompleteListener mFadeCompleteListener; 108eb66dab544c4c1eabe4d469b7cea348d4b01e664Craig Stout private InputEventHandler mInputEventHandler; 109372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout private boolean mFadingEnabled = true; 110372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout private int mFadingStatus = IDLE; 111d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout private int mBgAlpha; 112d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout private ValueAnimator mBgFadeInAnimator, mBgFadeOutAnimator; 113d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout private ValueAnimator mControlRowFadeInAnimator, mControlRowFadeOutAnimator; 1146b2e5b5117f1b8dfafbd81b995bb423ab0297564Craig Stout private ValueAnimator mDescriptionFadeInAnimator, mDescriptionFadeOutAnimator; 115d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout private ValueAnimator mOtherRowFadeInAnimator, mOtherRowFadeOutAnimator; 116d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout private boolean mTranslateAnimationEnabled; 117aa67105babce5fb14e1f39b57d4c84ce634afa62Craig Stout private boolean mResetControlsToPrimaryActionsPending; 118d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout private RecyclerView.ItemAnimator mItemAnimator; 119372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout 120372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout private final Animator.AnimatorListener mFadeListener = 121372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout new Animator.AnimatorListener() { 122372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout @Override 123372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout public void onAnimationStart(Animator animation) { 124d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout enableVerticalGridAnimations(false); 125372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout } 126372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout @Override 127372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout public void onAnimationRepeat(Animator animation) { 128372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout } 129372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout @Override 130372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout public void onAnimationCancel(Animator animation) { 131372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout } 132372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout @Override 133372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout public void onAnimationEnd(Animator animation) { 134d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout if (DEBUG) Log.v(TAG, "onAnimationEnd " + mBgAlpha); 135d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout if (mBgAlpha > 0) { 136d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout enableVerticalGridAnimations(true); 137372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout startFadeTimer(); 138372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout if (mFadeCompleteListener != null) { 139372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout mFadeCompleteListener.onFadeInComplete(); 140372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout } 141d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout } else { 1421e5725d52c7ec12b184dcfce6bfafa80aed35230Craig Stout if (getVerticalGridView() != null) { 1431e5725d52c7ec12b184dcfce6bfafa80aed35230Craig Stout // Reset focus to the controls row 1441e5725d52c7ec12b184dcfce6bfafa80aed35230Craig Stout getVerticalGridView().setSelectedPosition(0); 145aa67105babce5fb14e1f39b57d4c84ce634afa62Craig Stout resetControlsToPrimaryActions(null); 1461e5725d52c7ec12b184dcfce6bfafa80aed35230Craig Stout } 147d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout if (mFadeCompleteListener != null) { 148d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout mFadeCompleteListener.onFadeOutComplete(); 149d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout } 150372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout } 151372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout mFadingStatus = IDLE; 152372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout } 153372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout }; 154372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout 155372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout private final Handler mHandler = new Handler() { 156372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout @Override 157372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout public void handleMessage(Message message) { 158372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout if (message.what == START_FADE_OUT && mFadingEnabled) { 159372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout fade(false); 160372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout } 161372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout } 162372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout }; 163372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout 164372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout private final VerticalGridView.OnTouchInterceptListener mOnTouchInterceptListener = 165372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout new VerticalGridView.OnTouchInterceptListener() { 166372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout public boolean onInterceptTouchEvent(MotionEvent event) { 167cbfc318baee2fc054af4c723bfac0fd3c28a1667Craig Stout return onInterceptInputEvent(event); 168372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout } 169372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout }; 170372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout 171372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout private final VerticalGridView.OnKeyInterceptListener mOnKeyInterceptListener = 172372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout new VerticalGridView.OnKeyInterceptListener() { 173372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout public boolean onInterceptKeyEvent(KeyEvent event) { 174cbfc318baee2fc054af4c723bfac0fd3c28a1667Craig Stout return onInterceptInputEvent(event); 175372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout } 176372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout }; 177372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout 178d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout private void setBgAlpha(int alpha) { 179d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout mBgAlpha = alpha; 1801e5725d52c7ec12b184dcfce6bfafa80aed35230Craig Stout if (mRootView != null) { 1811e5725d52c7ec12b184dcfce6bfafa80aed35230Craig Stout mRootView.getBackground().setAlpha(alpha); 1821e5725d52c7ec12b184dcfce6bfafa80aed35230Craig Stout } 183d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout } 184d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout 185d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout private void enableVerticalGridAnimations(boolean enable) { 186aa67105babce5fb14e1f39b57d4c84ce634afa62Craig Stout if (getVerticalGridView() != null) { 187aa67105babce5fb14e1f39b57d4c84ce634afa62Craig Stout getVerticalGridView().setAnimateChildLayout(enable); 188aa67105babce5fb14e1f39b57d4c84ce634afa62Craig Stout } 189aa67105babce5fb14e1f39b57d4c84ce634afa62Craig Stout } 190aa67105babce5fb14e1f39b57d4c84ce634afa62Craig Stout 191aa67105babce5fb14e1f39b57d4c84ce634afa62Craig Stout private void resetControlsToPrimaryActions(ItemBridgeAdapter.ViewHolder vh) { 192aa67105babce5fb14e1f39b57d4c84ce634afa62Craig Stout if (vh == null && getVerticalGridView() != null) { 193aa67105babce5fb14e1f39b57d4c84ce634afa62Craig Stout vh = (ItemBridgeAdapter.ViewHolder) getVerticalGridView().findViewHolderForPosition(0); 1941e5725d52c7ec12b184dcfce6bfafa80aed35230Craig Stout } 195aa67105babce5fb14e1f39b57d4c84ce634afa62Craig Stout if (vh == null) { 196aa67105babce5fb14e1f39b57d4c84ce634afa62Craig Stout mResetControlsToPrimaryActionsPending = true; 197aa67105babce5fb14e1f39b57d4c84ce634afa62Craig Stout } else if (vh.getPresenter() instanceof PlaybackControlsRowPresenter) { 198aa67105babce5fb14e1f39b57d4c84ce634afa62Craig Stout mResetControlsToPrimaryActionsPending = false; 199aa67105babce5fb14e1f39b57d4c84ce634afa62Craig Stout ((PlaybackControlsRowPresenter) vh.getPresenter()).showPrimaryActions( 200aa67105babce5fb14e1f39b57d4c84ce634afa62Craig Stout (PlaybackControlsRowPresenter.ViewHolder) vh.getViewHolder()); 201d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout } 202d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout } 203d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout 204372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout /** 205372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout * Enables or disables view fading. If enabled, 206372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout * the view will be faded in when the fragment starts, 207372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout * and will fade out after a time period. The timeout 208372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout * period is reset each time {@link #tickle} is called. 209372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout * 210372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout */ 211372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout public void setFadingEnabled(boolean enabled) { 212372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout if (DEBUG) Log.v(TAG, "setFadingEnabled " + enabled); 213372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout if (enabled != mFadingEnabled) { 214372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout mFadingEnabled = enabled; 215f47fb1e34efd538c322f7539893272ba847cdbdcCraig Stout if (mFadingEnabled) { 216f47fb1e34efd538c322f7539893272ba847cdbdcCraig Stout if (isResumed() && mFadingStatus == IDLE 217f47fb1e34efd538c322f7539893272ba847cdbdcCraig Stout && !mHandler.hasMessages(START_FADE_OUT)) { 218f47fb1e34efd538c322f7539893272ba847cdbdcCraig Stout startFadeTimer(); 219372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout } 220f47fb1e34efd538c322f7539893272ba847cdbdcCraig Stout } else { 221f47fb1e34efd538c322f7539893272ba847cdbdcCraig Stout // Ensure fully opaque 222f47fb1e34efd538c322f7539893272ba847cdbdcCraig Stout mHandler.removeMessages(START_FADE_OUT); 223f47fb1e34efd538c322f7539893272ba847cdbdcCraig Stout fade(true); 224372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout } 225372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout } 226372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout } 227372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout 228372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout /** 229372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout * Returns true if view fading is enabled. 230372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout */ 231372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout public boolean isFadingEnabled() { 232372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout return mFadingEnabled; 233372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout } 234372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout 235372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout /** 236372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout * Sets the listener to be called when fade in or out has completed. 237372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout */ 238372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout public void setFadeCompleteListener(OnFadeCompleteListener listener) { 239372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout mFadeCompleteListener = listener; 240372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout } 241372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout 242372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout /** 243372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout * Returns the listener to be called when fade in or out has completed. 244372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout */ 245372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout public OnFadeCompleteListener getFadeCompleteListener() { 246372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout return mFadeCompleteListener; 247372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout } 248372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout 249372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout /** 250eb66dab544c4c1eabe4d469b7cea348d4b01e664Craig Stout * Sets the input event handler. 251eb66dab544c4c1eabe4d469b7cea348d4b01e664Craig Stout */ 252eb66dab544c4c1eabe4d469b7cea348d4b01e664Craig Stout public final void setInputEventHandler(InputEventHandler handler) { 253eb66dab544c4c1eabe4d469b7cea348d4b01e664Craig Stout mInputEventHandler = handler; 254eb66dab544c4c1eabe4d469b7cea348d4b01e664Craig Stout } 255eb66dab544c4c1eabe4d469b7cea348d4b01e664Craig Stout 256eb66dab544c4c1eabe4d469b7cea348d4b01e664Craig Stout /** 257eb66dab544c4c1eabe4d469b7cea348d4b01e664Craig Stout * Returns the input event handler. 258eb66dab544c4c1eabe4d469b7cea348d4b01e664Craig Stout */ 2592dfed05c8ab53ca7c28424c9c03b1a87b9b7ca0dCraig Stout public final InputEventHandler getInputEventHandler() { 260eb66dab544c4c1eabe4d469b7cea348d4b01e664Craig Stout return mInputEventHandler; 261eb66dab544c4c1eabe4d469b7cea348d4b01e664Craig Stout } 262eb66dab544c4c1eabe4d469b7cea348d4b01e664Craig Stout 263eb66dab544c4c1eabe4d469b7cea348d4b01e664Craig Stout /** 264372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout * Tickles the playback controls. Fades in the view if it was faded out, 265372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout * otherwise resets the fade out timer. Tickling on input events is handled 266372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout * by the fragment. 267372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout */ 268372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout public void tickle() { 269372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout if (DEBUG) Log.v(TAG, "tickle enabled " + mFadingEnabled + " isResumed " + isResumed()); 270372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout if (!mFadingEnabled || !isResumed()) { 271372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout return; 272372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout } 273372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout if (mHandler.hasMessages(START_FADE_OUT)) { 274372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout // Restart the timer 275372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout startFadeTimer(); 276372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout } else { 277372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout fade(true); 278372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout } 279372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout } 280372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout 281cbfc318baee2fc054af4c723bfac0fd3c28a1667Craig Stout private static boolean isConsumableKey(KeyEvent keyEvent) { 282cbfc318baee2fc054af4c723bfac0fd3c28a1667Craig Stout if (keyEvent.isSystem()) { 283cbfc318baee2fc054af4c723bfac0fd3c28a1667Craig Stout return false; 284cbfc318baee2fc054af4c723bfac0fd3c28a1667Craig Stout } 285cbfc318baee2fc054af4c723bfac0fd3c28a1667Craig Stout return true; 286cbfc318baee2fc054af4c723bfac0fd3c28a1667Craig Stout } 287cbfc318baee2fc054af4c723bfac0fd3c28a1667Craig Stout 288cbfc318baee2fc054af4c723bfac0fd3c28a1667Craig Stout private boolean onInterceptInputEvent(InputEvent event) { 289c92c356de1a687598a031f3452053dc6c9af9b77Craig Stout if (DEBUG) Log.v(TAG, "onInterceptInputEvent status " + mFadingStatus + 290c92c356de1a687598a031f3452053dc6c9af9b77Craig Stout " mBgAlpha " + mBgAlpha + " event " + event); 291c92c356de1a687598a031f3452053dc6c9af9b77Craig Stout final boolean controlsHidden = (mFadingStatus == IDLE && mBgAlpha == 0); 292c92c356de1a687598a031f3452053dc6c9af9b77Craig Stout boolean consumeEvent = controlsHidden; 293c92c356de1a687598a031f3452053dc6c9af9b77Craig Stout int keyCode = KeyEvent.KEYCODE_UNKNOWN; 294c92c356de1a687598a031f3452053dc6c9af9b77Craig Stout 295cbfc318baee2fc054af4c723bfac0fd3c28a1667Craig Stout if (event instanceof KeyEvent) { 296cbfc318baee2fc054af4c723bfac0fd3c28a1667Craig Stout if (consumeEvent) { 297cbfc318baee2fc054af4c723bfac0fd3c28a1667Craig Stout consumeEvent = isConsumableKey((KeyEvent) event); 298cbfc318baee2fc054af4c723bfac0fd3c28a1667Craig Stout } 299c92c356de1a687598a031f3452053dc6c9af9b77Craig Stout keyCode = ((KeyEvent) event).getKeyCode(); 300cbfc318baee2fc054af4c723bfac0fd3c28a1667Craig Stout } 301eb66dab544c4c1eabe4d469b7cea348d4b01e664Craig Stout if (!consumeEvent && mInputEventHandler != null) { 302eb66dab544c4c1eabe4d469b7cea348d4b01e664Craig Stout consumeEvent = mInputEventHandler.handleInputEvent(event); 303eb66dab544c4c1eabe4d469b7cea348d4b01e664Craig Stout } 304c92c356de1a687598a031f3452053dc6c9af9b77Craig Stout if (keyCode == KeyEvent.KEYCODE_BACK) { 305c92c356de1a687598a031f3452053dc6c9af9b77Craig Stout // If fading enabled and controls are not hidden, back will be consumed to fade 306c92c356de1a687598a031f3452053dc6c9af9b77Craig Stout // them out (even if the key was consumed by the handler). 307c92c356de1a687598a031f3452053dc6c9af9b77Craig Stout if (mFadingEnabled && !controlsHidden) { 308c92c356de1a687598a031f3452053dc6c9af9b77Craig Stout consumeEvent = true; 309c92c356de1a687598a031f3452053dc6c9af9b77Craig Stout mHandler.removeMessages(START_FADE_OUT); 310c92c356de1a687598a031f3452053dc6c9af9b77Craig Stout fade(false); 311c92c356de1a687598a031f3452053dc6c9af9b77Craig Stout } else if (consumeEvent) { 312cbfc318baee2fc054af4c723bfac0fd3c28a1667Craig Stout tickle(); 313cbfc318baee2fc054af4c723bfac0fd3c28a1667Craig Stout } 314cbfc318baee2fc054af4c723bfac0fd3c28a1667Craig Stout } else { 315c92c356de1a687598a031f3452053dc6c9af9b77Craig Stout // Any other key will show the controls 316cbfc318baee2fc054af4c723bfac0fd3c28a1667Craig Stout tickle(); 317eb66dab544c4c1eabe4d469b7cea348d4b01e664Craig Stout } 318372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout return consumeEvent; 319372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout } 320372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout 321372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout @Override 322372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout public void onResume() { 323372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout super.onResume(); 324372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout if (mFadingEnabled) { 325d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout setBgAlpha(0); 326372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout fade(true); 327372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout } 328372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout getVerticalGridView().setOnTouchInterceptListener(mOnTouchInterceptListener); 329372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout getVerticalGridView().setOnKeyInterceptListener(mOnKeyInterceptListener); 330372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout } 331372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout 332372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout private void startFadeTimer() { 3331e5725d52c7ec12b184dcfce6bfafa80aed35230Craig Stout if (mHandler != null) { 3341e5725d52c7ec12b184dcfce6bfafa80aed35230Craig Stout mHandler.removeMessages(START_FADE_OUT); 3351e5725d52c7ec12b184dcfce6bfafa80aed35230Craig Stout mHandler.sendEmptyMessageDelayed(START_FADE_OUT, mShowTimeMs); 3361e5725d52c7ec12b184dcfce6bfafa80aed35230Craig Stout } 337372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout } 338372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout 339d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout private static ValueAnimator loadAnimator(Context context, int resId) { 340d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout ValueAnimator animator = (ValueAnimator) AnimatorInflater.loadAnimator(context, resId); 341d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout animator.setDuration(animator.getDuration() * ANIMATION_MULTIPLIER); 342d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout return animator; 343d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout } 344d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout 345d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout private void loadBgAnimator() { 346d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout AnimatorUpdateListener listener = new AnimatorUpdateListener() { 347d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout @Override 348d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout public void onAnimationUpdate(ValueAnimator arg0) { 349d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout setBgAlpha((Integer) arg0.getAnimatedValue()); 350d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout } 351d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout }; 352d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout 353d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout mBgFadeInAnimator = loadAnimator(getActivity(), R.animator.lb_playback_bg_fade_in); 354d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout mBgFadeInAnimator.addUpdateListener(listener); 355d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout mBgFadeInAnimator.addListener(mFadeListener); 356d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout 357d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout mBgFadeOutAnimator = loadAnimator(getActivity(), R.animator.lb_playback_bg_fade_out); 358d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout mBgFadeOutAnimator.addUpdateListener(listener); 359d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout mBgFadeOutAnimator.addListener(mFadeListener); 360d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout } 361d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout 362d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout private TimeInterpolator mLogDecelerateInterpolator = new LogDecelerateInterpolator(100,0); 363d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout private TimeInterpolator mLogAccelerateInterpolator = new LogAccelerateInterpolator(100,0); 364d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout 3652d33e3cfedc56adc2d4e5ac6279ec683d041fe21Craig Stout private View getControlRowView() { 3662d33e3cfedc56adc2d4e5ac6279ec683d041fe21Craig Stout if (getVerticalGridView() == null) { 3672d33e3cfedc56adc2d4e5ac6279ec683d041fe21Craig Stout return null; 3682d33e3cfedc56adc2d4e5ac6279ec683d041fe21Craig Stout } 3692d33e3cfedc56adc2d4e5ac6279ec683d041fe21Craig Stout RecyclerView.ViewHolder vh = getVerticalGridView().findViewHolderForPosition(0); 3702d33e3cfedc56adc2d4e5ac6279ec683d041fe21Craig Stout if (vh == null) { 3712d33e3cfedc56adc2d4e5ac6279ec683d041fe21Craig Stout return null; 3722d33e3cfedc56adc2d4e5ac6279ec683d041fe21Craig Stout } 3732d33e3cfedc56adc2d4e5ac6279ec683d041fe21Craig Stout return vh.itemView; 3742d33e3cfedc56adc2d4e5ac6279ec683d041fe21Craig Stout } 3752d33e3cfedc56adc2d4e5ac6279ec683d041fe21Craig Stout 376d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout private void loadControlRowAnimator() { 3772d33e3cfedc56adc2d4e5ac6279ec683d041fe21Craig Stout final AnimatorListener listener = new AnimatorListener() { 378d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout @Override 3792d33e3cfedc56adc2d4e5ac6279ec683d041fe21Craig Stout void getViews(ArrayList<View> views) { 3802d33e3cfedc56adc2d4e5ac6279ec683d041fe21Craig Stout View view = getControlRowView(); 3812d33e3cfedc56adc2d4e5ac6279ec683d041fe21Craig Stout if (view != null) { 3822d33e3cfedc56adc2d4e5ac6279ec683d041fe21Craig Stout views.add(view); 3831e5725d52c7ec12b184dcfce6bfafa80aed35230Craig Stout } 3842d33e3cfedc56adc2d4e5ac6279ec683d041fe21Craig Stout } 3852d33e3cfedc56adc2d4e5ac6279ec683d041fe21Craig Stout }; 3862d33e3cfedc56adc2d4e5ac6279ec683d041fe21Craig Stout final AnimatorUpdateListener updateListener = new AnimatorUpdateListener() { 3872d33e3cfedc56adc2d4e5ac6279ec683d041fe21Craig Stout @Override 3882d33e3cfedc56adc2d4e5ac6279ec683d041fe21Craig Stout public void onAnimationUpdate(ValueAnimator arg0) { 3892d33e3cfedc56adc2d4e5ac6279ec683d041fe21Craig Stout View view = getControlRowView(); 3902d33e3cfedc56adc2d4e5ac6279ec683d041fe21Craig Stout if (view != null) { 391d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout final float fraction = (Float) arg0.getAnimatedValue(); 392d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout if (DEBUG) Log.v(TAG, "fraction " + fraction); 3932d33e3cfedc56adc2d4e5ac6279ec683d041fe21Craig Stout view.setAlpha(fraction); 3942d33e3cfedc56adc2d4e5ac6279ec683d041fe21Craig Stout view.setTranslationY((float) mAnimationTranslateY * (1f - fraction)); 395d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout } 396d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout } 397d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout }; 398d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout 399d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout mControlRowFadeInAnimator = loadAnimator( 400d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout getActivity(), R.animator.lb_playback_controls_fade_in); 4012d33e3cfedc56adc2d4e5ac6279ec683d041fe21Craig Stout mControlRowFadeInAnimator.addUpdateListener(updateListener); 4022d33e3cfedc56adc2d4e5ac6279ec683d041fe21Craig Stout mControlRowFadeInAnimator.addListener(listener); 403d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout mControlRowFadeInAnimator.setInterpolator(mLogDecelerateInterpolator); 404d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout 405d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout mControlRowFadeOutAnimator = loadAnimator( 406d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout getActivity(), R.animator.lb_playback_controls_fade_out); 4072d33e3cfedc56adc2d4e5ac6279ec683d041fe21Craig Stout mControlRowFadeOutAnimator.addUpdateListener(updateListener); 4082d33e3cfedc56adc2d4e5ac6279ec683d041fe21Craig Stout mControlRowFadeOutAnimator.addListener(listener); 409d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout mControlRowFadeOutAnimator.setInterpolator(mLogAccelerateInterpolator); 410d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout } 411d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout 412d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout private void loadOtherRowAnimator() { 4132d33e3cfedc56adc2d4e5ac6279ec683d041fe21Craig Stout final AnimatorListener listener = new AnimatorListener() { 414d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout @Override 4152d33e3cfedc56adc2d4e5ac6279ec683d041fe21Craig Stout void getViews(ArrayList<View> views) { 4161e5725d52c7ec12b184dcfce6bfafa80aed35230Craig Stout if (getVerticalGridView() == null) { 4171e5725d52c7ec12b184dcfce6bfafa80aed35230Craig Stout return; 4181e5725d52c7ec12b184dcfce6bfafa80aed35230Craig Stout } 419d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout final int count = getVerticalGridView().getChildCount(); 420d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout for (int i = 0; i < count; i++) { 421d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout View view = getVerticalGridView().getChildAt(i); 4222d33e3cfedc56adc2d4e5ac6279ec683d041fe21Craig Stout if (view != null) { 4232d33e3cfedc56adc2d4e5ac6279ec683d041fe21Craig Stout views.add(view); 4242d33e3cfedc56adc2d4e5ac6279ec683d041fe21Craig Stout } 4252d33e3cfedc56adc2d4e5ac6279ec683d041fe21Craig Stout } 4262d33e3cfedc56adc2d4e5ac6279ec683d041fe21Craig Stout } 4272d33e3cfedc56adc2d4e5ac6279ec683d041fe21Craig Stout }; 4282d33e3cfedc56adc2d4e5ac6279ec683d041fe21Craig Stout final AnimatorUpdateListener updateListener = new AnimatorUpdateListener() { 4292d33e3cfedc56adc2d4e5ac6279ec683d041fe21Craig Stout @Override 4302d33e3cfedc56adc2d4e5ac6279ec683d041fe21Craig Stout public void onAnimationUpdate(ValueAnimator arg0) { 4311e5725d52c7ec12b184dcfce6bfafa80aed35230Craig Stout if (getVerticalGridView() == null) { 4321e5725d52c7ec12b184dcfce6bfafa80aed35230Craig Stout return; 4331e5725d52c7ec12b184dcfce6bfafa80aed35230Craig Stout } 4342d33e3cfedc56adc2d4e5ac6279ec683d041fe21Craig Stout final float fraction = (Float) arg0.getAnimatedValue(); 4352d33e3cfedc56adc2d4e5ac6279ec683d041fe21Craig Stout for (View view : listener.mViews) { 436d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout if (getVerticalGridView().getChildPosition(view) > 0) { 437d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout view.setAlpha(fraction); 4386b2e5b5117f1b8dfafbd81b995bb423ab0297564Craig Stout view.setTranslationY((float) mAnimationTranslateY * (1f - fraction)); 439d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout } 440d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout } 441d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout } 442d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout }; 443d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout 444d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout mOtherRowFadeInAnimator = loadAnimator( 445d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout getActivity(), R.animator.lb_playback_controls_fade_in); 4462d33e3cfedc56adc2d4e5ac6279ec683d041fe21Craig Stout mOtherRowFadeInAnimator.addListener(listener); 4472d33e3cfedc56adc2d4e5ac6279ec683d041fe21Craig Stout mOtherRowFadeInAnimator.addUpdateListener(updateListener); 448d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout mOtherRowFadeInAnimator.setInterpolator(mLogDecelerateInterpolator); 449d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout 450d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout mOtherRowFadeOutAnimator = loadAnimator( 451d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout getActivity(), R.animator.lb_playback_controls_fade_out); 4522d33e3cfedc56adc2d4e5ac6279ec683d041fe21Craig Stout mOtherRowFadeOutAnimator.addListener(listener); 4532d33e3cfedc56adc2d4e5ac6279ec683d041fe21Craig Stout mOtherRowFadeOutAnimator.addUpdateListener(updateListener); 4546b2e5b5117f1b8dfafbd81b995bb423ab0297564Craig Stout mOtherRowFadeOutAnimator.setInterpolator(new AccelerateInterpolator()); 4556b2e5b5117f1b8dfafbd81b995bb423ab0297564Craig Stout } 4566b2e5b5117f1b8dfafbd81b995bb423ab0297564Craig Stout 4576b2e5b5117f1b8dfafbd81b995bb423ab0297564Craig Stout private void loadDescriptionAnimator() { 458d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout AnimatorUpdateListener listener = new AnimatorUpdateListener() { 459d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout @Override 460d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout public void onAnimationUpdate(ValueAnimator arg0) { 4611e5725d52c7ec12b184dcfce6bfafa80aed35230Craig Stout if (getVerticalGridView() == null) { 4621e5725d52c7ec12b184dcfce6bfafa80aed35230Craig Stout return; 4631e5725d52c7ec12b184dcfce6bfafa80aed35230Craig Stout } 4646b2e5b5117f1b8dfafbd81b995bb423ab0297564Craig Stout ItemBridgeAdapter.ViewHolder adapterVh = (ItemBridgeAdapter.ViewHolder) 4656b2e5b5117f1b8dfafbd81b995bb423ab0297564Craig Stout getVerticalGridView().findViewHolderForPosition(0); 4666b2e5b5117f1b8dfafbd81b995bb423ab0297564Craig Stout if (adapterVh != null && adapterVh.getViewHolder() 4676b2e5b5117f1b8dfafbd81b995bb423ab0297564Craig Stout instanceof PlaybackControlsRowPresenter.ViewHolder) { 4686b2e5b5117f1b8dfafbd81b995bb423ab0297564Craig Stout final Presenter.ViewHolder vh = ((PlaybackControlsRowPresenter.ViewHolder) 4696b2e5b5117f1b8dfafbd81b995bb423ab0297564Craig Stout adapterVh.getViewHolder()).mDescriptionViewHolder; 4708f5c183ba7b9df6b5339586f51219b4d5e6305f3Craig Stout if (vh != null) { 4718f5c183ba7b9df6b5339586f51219b4d5e6305f3Craig Stout vh.view.setAlpha((Float) arg0.getAnimatedValue()); 4728f5c183ba7b9df6b5339586f51219b4d5e6305f3Craig Stout } 4736b2e5b5117f1b8dfafbd81b995bb423ab0297564Craig Stout } 4746b2e5b5117f1b8dfafbd81b995bb423ab0297564Craig Stout } 4756b2e5b5117f1b8dfafbd81b995bb423ab0297564Craig Stout }; 4766b2e5b5117f1b8dfafbd81b995bb423ab0297564Craig Stout 4776b2e5b5117f1b8dfafbd81b995bb423ab0297564Craig Stout mDescriptionFadeInAnimator = loadAnimator( 4786b2e5b5117f1b8dfafbd81b995bb423ab0297564Craig Stout getActivity(), R.animator.lb_playback_description_fade_in); 4796b2e5b5117f1b8dfafbd81b995bb423ab0297564Craig Stout mDescriptionFadeInAnimator.addUpdateListener(listener); 4806b2e5b5117f1b8dfafbd81b995bb423ab0297564Craig Stout mDescriptionFadeInAnimator.setInterpolator(mLogDecelerateInterpolator); 4816b2e5b5117f1b8dfafbd81b995bb423ab0297564Craig Stout 4826b2e5b5117f1b8dfafbd81b995bb423ab0297564Craig Stout mDescriptionFadeOutAnimator = loadAnimator( 4836b2e5b5117f1b8dfafbd81b995bb423ab0297564Craig Stout getActivity(), R.animator.lb_playback_description_fade_out); 4846b2e5b5117f1b8dfafbd81b995bb423ab0297564Craig Stout mDescriptionFadeOutAnimator.addUpdateListener(listener); 485d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout } 486d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout 487372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout private void fade(boolean fadeIn) { 488372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout if (DEBUG) Log.v(TAG, "fade " + fadeIn); 489372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout if (getView() == null) { 490372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout return; 491372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout } 492372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout if ((fadeIn && mFadingStatus == IN) || (!fadeIn && mFadingStatus == OUT)) { 493d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout if (DEBUG) Log.v(TAG, "requested fade in progress"); 494d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout return; 495d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout } 496d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout if ((fadeIn && mBgAlpha == 255) || (!fadeIn && mBgAlpha == 0)) { 497d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout if (DEBUG) Log.v(TAG, "fade is no-op"); 498372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout return; 499372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout } 500372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout 5016b2e5b5117f1b8dfafbd81b995bb423ab0297564Craig Stout mAnimationTranslateY = getVerticalGridView().getSelectedPosition() == 0 ? 5026b2e5b5117f1b8dfafbd81b995bb423ab0297564Craig Stout mMajorFadeTranslateY : mMinorFadeTranslateY; 503d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout 504d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout if (mFadingStatus == IDLE) { 505d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout if (fadeIn) { 506d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout mBgFadeInAnimator.start(); 507d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout mControlRowFadeInAnimator.start(); 508d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout mOtherRowFadeInAnimator.start(); 5096b2e5b5117f1b8dfafbd81b995bb423ab0297564Craig Stout mDescriptionFadeInAnimator.start(); 510d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout } else { 511d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout mBgFadeOutAnimator.start(); 512d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout mControlRowFadeOutAnimator.start(); 513d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout mOtherRowFadeOutAnimator.start(); 5146b2e5b5117f1b8dfafbd81b995bb423ab0297564Craig Stout mDescriptionFadeOutAnimator.start(); 515d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout } 516d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout } else { 517d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout if (fadeIn) { 518d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout mBgFadeOutAnimator.reverse(); 519d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout mControlRowFadeOutAnimator.reverse(); 520d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout mOtherRowFadeOutAnimator.reverse(); 5216b2e5b5117f1b8dfafbd81b995bb423ab0297564Craig Stout mDescriptionFadeOutAnimator.reverse(); 522d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout } else { 523d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout mBgFadeInAnimator.reverse(); 524d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout mControlRowFadeInAnimator.reverse(); 525d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout mOtherRowFadeInAnimator.reverse(); 5266b2e5b5117f1b8dfafbd81b995bb423ab0297564Craig Stout mDescriptionFadeInAnimator.reverse(); 527d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout } 528d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout } 529d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout 530d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout // If fading in while control row is focused, set initial translationY so 531d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout // views slide in from below. 5326b2e5b5117f1b8dfafbd81b995bb423ab0297564Craig Stout if (fadeIn && mFadingStatus == IDLE) { 533d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout final int count = getVerticalGridView().getChildCount(); 534d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout for (int i = 0; i < count; i++) { 5356b2e5b5117f1b8dfafbd81b995bb423ab0297564Craig Stout getVerticalGridView().getChildAt(i).setTranslationY(mAnimationTranslateY); 536d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout } 537d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout } 538d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout 539372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout mFadingStatus = fadeIn ? IN : OUT; 540372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout } 5417ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout 5427ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout /** 5437ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout * Sets the list of rows for the fragment. 5447ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout */ 5457ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout @Override 5467ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout public void setAdapter(ObjectAdapter adapter) { 5476dca725412977bb56b933bdec120e31909233cdbCraig Stout if (getAdapter() != null) { 5486dca725412977bb56b933bdec120e31909233cdbCraig Stout getAdapter().unregisterObserver(mObserver); 5496dca725412977bb56b933bdec120e31909233cdbCraig Stout } 5507ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout super.setAdapter(adapter); 5516dca725412977bb56b933bdec120e31909233cdbCraig Stout if (adapter != null) { 5526dca725412977bb56b933bdec120e31909233cdbCraig Stout adapter.registerObserver(mObserver); 5536dca725412977bb56b933bdec120e31909233cdbCraig Stout } 5547ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout } 5557ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout 5567ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout @Override 5577ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout void setVerticalGridViewLayout(VerticalGridView listview) { 558d20507e0f5ac7ad021f42ca87c294787246f0591Craig Stout if (listview == null) { 5597ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout return; 5607ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout } 561d20507e0f5ac7ad021f42ca87c294787246f0591Craig Stout // Padding affects alignment when last row is focused 562d20507e0f5ac7ad021f42ca87c294787246f0591Craig Stout // (last is first when there's only one row). 563d20507e0f5ac7ad021f42ca87c294787246f0591Craig Stout setBottomPadding(listview, mPaddingBottom); 564d20507e0f5ac7ad021f42ca87c294787246f0591Craig Stout 565d20507e0f5ac7ad021f42ca87c294787246f0591Craig Stout // Item alignment affects focused row that isn't the last. 566d20507e0f5ac7ad021f42ca87c294787246f0591Craig Stout listview.setItemAlignmentOffset(mAlignPosition); 5677ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout listview.setItemAlignmentOffsetPercent(100); 568d20507e0f5ac7ad021f42ca87c294787246f0591Craig Stout 569d20507e0f5ac7ad021f42ca87c294787246f0591Craig Stout // Push rows to the bottom. 5707ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout listview.setWindowAlignmentOffset(0); 5717ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout listview.setWindowAlignmentOffsetPercent(100); 5727ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout listview.setWindowAlignment(VerticalGridView.WINDOW_ALIGN_HIGH_EDGE); 5737ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout } 5747ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout 575d20507e0f5ac7ad021f42ca87c294787246f0591Craig Stout private static void setBottomPadding(View view, int padding) { 576d20507e0f5ac7ad021f42ca87c294787246f0591Craig Stout view.setPadding(view.getPaddingLeft(), view.getPaddingTop(), 577d20507e0f5ac7ad021f42ca87c294787246f0591Craig Stout view.getPaddingRight(), padding); 578d20507e0f5ac7ad021f42ca87c294787246f0591Craig Stout } 579d20507e0f5ac7ad021f42ca87c294787246f0591Craig Stout 580c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn @Override 581c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn public void onCreate(Bundle savedInstanceState) { 582c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn super.onCreate(savedInstanceState); 583c3047aae5913bf0f79ed65e2d4b6b74ca38d53deTim Kilbourn 5847ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout mAlignPosition = 585d20507e0f5ac7ad021f42ca87c294787246f0591Craig Stout getResources().getDimensionPixelSize(R.dimen.lb_playback_controls_align_bottom); 586d20507e0f5ac7ad021f42ca87c294787246f0591Craig Stout mPaddingBottom = 587d20507e0f5ac7ad021f42ca87c294787246f0591Craig Stout getResources().getDimensionPixelSize(R.dimen.lb_playback_controls_padding_bottom); 5887709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout mBgDarkColor = 5897709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout getResources().getColor(R.color.lb_playback_controls_background_dark); 5907709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout mBgLightColor = 5917709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout getResources().getColor(R.color.lb_playback_controls_background_light); 592372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout mShowTimeMs = 593372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout getResources().getInteger(R.integer.lb_playback_controls_show_time_ms); 5946b2e5b5117f1b8dfafbd81b995bb423ab0297564Craig Stout mMajorFadeTranslateY = 5956b2e5b5117f1b8dfafbd81b995bb423ab0297564Craig Stout getResources().getDimensionPixelSize(R.dimen.lb_playback_major_fade_translate_y); 5966b2e5b5117f1b8dfafbd81b995bb423ab0297564Craig Stout mMinorFadeTranslateY = 5976b2e5b5117f1b8dfafbd81b995bb423ab0297564Craig Stout getResources().getDimensionPixelSize(R.dimen.lb_playback_minor_fade_translate_y); 598d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout 599d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout loadBgAnimator(); 600d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout loadControlRowAnimator(); 601d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout loadOtherRowAnimator(); 6026b2e5b5117f1b8dfafbd81b995bb423ab0297564Craig Stout loadDescriptionAnimator(); 6037709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout } 6047709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout 6057709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout /** 6067709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout * Sets the background type. 6077709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout * 6087709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout * @param type One of BG_LIGHT, BG_DARK, or BG_NONE. 6097709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout */ 6107709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout public void setBackgroundType(int type) { 611372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout switch (type) { 612372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout case BG_LIGHT: 613372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout case BG_DARK: 614372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout case BG_NONE: 615372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout if (type != mBackgroundType) { 616372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout mBackgroundType = type; 617372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout updateBackground(); 618372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout } 619372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout break; 620372d07bb41510d91a6a662a1906aceb0ee759481Craig Stout default: 6217709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout throw new IllegalArgumentException("Invalid background type"); 6227709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout } 6237709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout } 6247709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout 6257709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout /** 6267709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout * Returns the background type. 6277709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout */ 6287709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout public int getBackgroundType() { 6297709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout return mBackgroundType; 6307709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout } 6317709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout 6327709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout private void updateBackground() { 6337709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout if (mRootView != null) { 6347709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout int color = mBgDarkColor; 6357709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout switch (mBackgroundType) { 6367709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout case BG_DARK: break; 6377709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout case BG_LIGHT: color = mBgLightColor; break; 6387709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout case BG_NONE: color = Color.TRANSPARENT; break; 6397709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout } 6407709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout mRootView.setBackground(new ColorDrawable(color)); 6417709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout } 6427709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout } 6437709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout 644d20507e0f5ac7ad021f42ca87c294787246f0591Craig Stout private void updateControlsBottomSpace(ItemBridgeAdapter.ViewHolder vh) { 645d20507e0f5ac7ad021f42ca87c294787246f0591Craig Stout // Add extra space between rows 0 and 1 646d20507e0f5ac7ad021f42ca87c294787246f0591Craig Stout if (vh == null && getVerticalGridView() != null) { 647d20507e0f5ac7ad021f42ca87c294787246f0591Craig Stout vh = (ItemBridgeAdapter.ViewHolder) 648d20507e0f5ac7ad021f42ca87c294787246f0591Craig Stout getVerticalGridView().findViewHolderForPosition(0); 649d20507e0f5ac7ad021f42ca87c294787246f0591Craig Stout } 650d20507e0f5ac7ad021f42ca87c294787246f0591Craig Stout if (vh != null && vh.getPresenter() instanceof PlaybackControlsRowPresenter) { 651d20507e0f5ac7ad021f42ca87c294787246f0591Craig Stout final int adapterSize = getAdapter() == null ? 0 : getAdapter().size(); 652d20507e0f5ac7ad021f42ca87c294787246f0591Craig Stout ((PlaybackControlsRowPresenter) vh.getPresenter()).showBottomSpace( 653d20507e0f5ac7ad021f42ca87c294787246f0591Craig Stout (PlaybackControlsRowPresenter.ViewHolder) vh.getViewHolder(), 654d20507e0f5ac7ad021f42ca87c294787246f0591Craig Stout adapterSize > 1); 655d20507e0f5ac7ad021f42ca87c294787246f0591Craig Stout } 656d20507e0f5ac7ad021f42ca87c294787246f0591Craig Stout } 657d20507e0f5ac7ad021f42ca87c294787246f0591Craig Stout 658d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout private final ItemBridgeAdapter.AdapterListener mAdapterListener = 659d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout new ItemBridgeAdapter.AdapterListener() { 660d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout @Override 661d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout public void onAttachedToWindow(ItemBridgeAdapter.ViewHolder vh) { 662d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout if (DEBUG) Log.v(TAG, "onAttachedToWindow " + vh.getViewHolder().view); 663d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout if ((mFadingStatus == IDLE && mBgAlpha == 0) || mFadingStatus == OUT) { 664d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout if (DEBUG) Log.v(TAG, "setting alpha to 0"); 665d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout vh.getViewHolder().view.setAlpha(0); 666d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout } 667aa67105babce5fb14e1f39b57d4c84ce634afa62Craig Stout if (vh.getPosition() == 0 && mResetControlsToPrimaryActionsPending) { 668aa67105babce5fb14e1f39b57d4c84ce634afa62Craig Stout resetControlsToPrimaryActions(vh); 669aa67105babce5fb14e1f39b57d4c84ce634afa62Craig Stout } 670d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout } 671d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout @Override 672d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout public void onDetachedFromWindow(ItemBridgeAdapter.ViewHolder vh) { 673d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout if (DEBUG) Log.v(TAG, "onDetachedFromWindow " + vh.getViewHolder().view); 674d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout // Reset animation state 675d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout vh.getViewHolder().view.setAlpha(1f); 676d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout vh.getViewHolder().view.setTranslationY(0); 6776b2e5b5117f1b8dfafbd81b995bb423ab0297564Craig Stout if (vh.getViewHolder() instanceof PlaybackControlsRowPresenter.ViewHolder) { 6788f5c183ba7b9df6b5339586f51219b4d5e6305f3Craig Stout Presenter.ViewHolder descriptionVh = ((PlaybackControlsRowPresenter.ViewHolder) 6798f5c183ba7b9df6b5339586f51219b4d5e6305f3Craig Stout vh.getViewHolder()).mDescriptionViewHolder; 6808f5c183ba7b9df6b5339586f51219b4d5e6305f3Craig Stout if (descriptionVh != null) { 6818f5c183ba7b9df6b5339586f51219b4d5e6305f3Craig Stout descriptionVh.view.setAlpha(1f); 6828f5c183ba7b9df6b5339586f51219b4d5e6305f3Craig Stout } 6836b2e5b5117f1b8dfafbd81b995bb423ab0297564Craig Stout } 684d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout } 685d20507e0f5ac7ad021f42ca87c294787246f0591Craig Stout @Override 686d20507e0f5ac7ad021f42ca87c294787246f0591Craig Stout public void onBind(ItemBridgeAdapter.ViewHolder vh) { 687d20507e0f5ac7ad021f42ca87c294787246f0591Craig Stout if (vh.getPosition() == 0) { 688d20507e0f5ac7ad021f42ca87c294787246f0591Craig Stout updateControlsBottomSpace(vh); 689d20507e0f5ac7ad021f42ca87c294787246f0591Craig Stout } 690d20507e0f5ac7ad021f42ca87c294787246f0591Craig Stout } 691d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout }; 692d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout 6937709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout @Override 6947709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout public View onCreateView(LayoutInflater inflater, ViewGroup container, 6957709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout Bundle savedInstanceState) { 6967709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout mRootView = super.onCreateView(inflater, container, savedInstanceState); 697d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout mBgAlpha = 255; 6987709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout updateBackground(); 699d1adbdcb44a48e142d28a93189c57edfe62d93ceCraig Stout getRowsFragment().setExternalAdapterListener(mAdapterListener); 7007709709c2c78490a21311e9950d5dca7e89a6aedCraig Stout return mRootView; 7017ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout } 7026dca725412977bb56b933bdec120e31909233cdbCraig Stout 7031e5725d52c7ec12b184dcfce6bfafa80aed35230Craig Stout @Override 7041e5725d52c7ec12b184dcfce6bfafa80aed35230Craig Stout public void onDestroyView() { 7051e5725d52c7ec12b184dcfce6bfafa80aed35230Craig Stout mRootView = null; 7061e5725d52c7ec12b184dcfce6bfafa80aed35230Craig Stout super.onDestroyView(); 7071e5725d52c7ec12b184dcfce6bfafa80aed35230Craig Stout } 7081e5725d52c7ec12b184dcfce6bfafa80aed35230Craig Stout 7096dca725412977bb56b933bdec120e31909233cdbCraig Stout private final DataObserver mObserver = new DataObserver() { 7106dca725412977bb56b933bdec120e31909233cdbCraig Stout public void onChanged() { 711d20507e0f5ac7ad021f42ca87c294787246f0591Craig Stout updateControlsBottomSpace(null); 7126dca725412977bb56b933bdec120e31909233cdbCraig Stout } 7136dca725412977bb56b933bdec120e31909233cdbCraig Stout }; 7142d33e3cfedc56adc2d4e5ac6279ec683d041fe21Craig Stout 7152d33e3cfedc56adc2d4e5ac6279ec683d041fe21Craig Stout static abstract class AnimatorListener implements Animator.AnimatorListener { 7162d33e3cfedc56adc2d4e5ac6279ec683d041fe21Craig Stout ArrayList<View> mViews = new ArrayList<View>(); 7172d33e3cfedc56adc2d4e5ac6279ec683d041fe21Craig Stout ArrayList<Integer> mLayerType = new ArrayList<Integer>(); 7182d33e3cfedc56adc2d4e5ac6279ec683d041fe21Craig Stout 7192d33e3cfedc56adc2d4e5ac6279ec683d041fe21Craig Stout public void onAnimationCancel(Animator animation) { 7202d33e3cfedc56adc2d4e5ac6279ec683d041fe21Craig Stout } 7212d33e3cfedc56adc2d4e5ac6279ec683d041fe21Craig Stout public void onAnimationRepeat(Animator animation) { 7222d33e3cfedc56adc2d4e5ac6279ec683d041fe21Craig Stout } 7232d33e3cfedc56adc2d4e5ac6279ec683d041fe21Craig Stout public void onAnimationStart(Animator animation) { 7242d33e3cfedc56adc2d4e5ac6279ec683d041fe21Craig Stout getViews(mViews); 7252d33e3cfedc56adc2d4e5ac6279ec683d041fe21Craig Stout for (View view : mViews) { 7262d33e3cfedc56adc2d4e5ac6279ec683d041fe21Craig Stout mLayerType.add(view.getLayerType()); 7272d33e3cfedc56adc2d4e5ac6279ec683d041fe21Craig Stout view.setLayerType(View.LAYER_TYPE_HARDWARE, null); 7282d33e3cfedc56adc2d4e5ac6279ec683d041fe21Craig Stout } 7292d33e3cfedc56adc2d4e5ac6279ec683d041fe21Craig Stout } 7302d33e3cfedc56adc2d4e5ac6279ec683d041fe21Craig Stout public void onAnimationEnd(Animator animation) { 7312d33e3cfedc56adc2d4e5ac6279ec683d041fe21Craig Stout for (int i = 0; i < mViews.size(); i++) { 7322d33e3cfedc56adc2d4e5ac6279ec683d041fe21Craig Stout mViews.get(i).setLayerType(mLayerType.get(i), null); 7332d33e3cfedc56adc2d4e5ac6279ec683d041fe21Craig Stout } 7342d33e3cfedc56adc2d4e5ac6279ec683d041fe21Craig Stout mLayerType.clear(); 7352d33e3cfedc56adc2d4e5ac6279ec683d041fe21Craig Stout mViews.clear(); 7362d33e3cfedc56adc2d4e5ac6279ec683d041fe21Craig Stout } 7372d33e3cfedc56adc2d4e5ac6279ec683d041fe21Craig Stout abstract void getViews(ArrayList<View> views); 7382d33e3cfedc56adc2d4e5ac6279ec683d041fe21Craig Stout }; 7397ab1edf2b49f3cdcb9db7a1c60d0dc1e17a9aef7Craig Stout} 740