PlaybackOverlaySupportFragment.java revision c92c356de1a687598a031f3452053dc6c9af9b77
16193c12a1897723c87b41f4e304a8cd04deef2dcDake Gu/* This file is auto-generated from PlaybackOverlayFragment.java. DO NOT MODIFY. */ 26193c12a1897723c87b41f4e304a8cd04deef2dcDake Gu 361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu/* 461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu * Copyright (C) 2014 The Android Open Source Project 561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu * 661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu * in compliance with the License. You may obtain a copy of the License at 861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu * 961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu * http://www.apache.org/licenses/LICENSE-2.0 1061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu * 1161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu * Unless required by applicable law or agreed to in writing, software distributed under the License 1261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 1361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu * or implied. See the License for the specific language governing permissions and limitations under 1461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu * the License. 1561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu */ 1661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gupackage android.support.v17.leanback.app; 1761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 1861905b0b52c50018dcaebcd79699c39b8f28d622Dake Guimport android.graphics.Color; 1961905b0b52c50018dcaebcd79699c39b8f28d622Dake Guimport android.graphics.drawable.ColorDrawable; 2061905b0b52c50018dcaebcd79699c39b8f28d622Dake Guimport android.animation.Animator; 2161905b0b52c50018dcaebcd79699c39b8f28d622Dake Guimport android.animation.AnimatorInflater; 2261905b0b52c50018dcaebcd79699c39b8f28d622Dake Guimport android.animation.TimeInterpolator; 2361905b0b52c50018dcaebcd79699c39b8f28d622Dake Guimport android.animation.ValueAnimator; 24cbfc318baee2fc054af4c723bfac0fd3c28a1667Craig Stoutimport android.view.InputEvent; 2561905b0b52c50018dcaebcd79699c39b8f28d622Dake Guimport android.view.animation.AccelerateInterpolator; 2661905b0b52c50018dcaebcd79699c39b8f28d622Dake Guimport android.animation.ValueAnimator.AnimatorUpdateListener; 2761905b0b52c50018dcaebcd79699c39b8f28d622Dake Guimport android.content.Context; 2861905b0b52c50018dcaebcd79699c39b8f28d622Dake Guimport android.os.Bundle; 2961905b0b52c50018dcaebcd79699c39b8f28d622Dake Guimport android.os.Handler; 3061905b0b52c50018dcaebcd79699c39b8f28d622Dake Guimport android.os.Message; 3161905b0b52c50018dcaebcd79699c39b8f28d622Dake Guimport android.support.v7.widget.RecyclerView; 3261905b0b52c50018dcaebcd79699c39b8f28d622Dake Guimport android.support.v17.leanback.R; 3361905b0b52c50018dcaebcd79699c39b8f28d622Dake Guimport android.support.v17.leanback.animation.LogAccelerateInterpolator; 3461905b0b52c50018dcaebcd79699c39b8f28d622Dake Guimport android.support.v17.leanback.animation.LogDecelerateInterpolator; 3561905b0b52c50018dcaebcd79699c39b8f28d622Dake Guimport android.support.v17.leanback.widget.Presenter; 3661905b0b52c50018dcaebcd79699c39b8f28d622Dake Guimport android.support.v17.leanback.widget.ItemBridgeAdapter; 3761905b0b52c50018dcaebcd79699c39b8f28d622Dake Guimport android.support.v17.leanback.widget.ObjectAdapter; 3861905b0b52c50018dcaebcd79699c39b8f28d622Dake Guimport android.support.v17.leanback.widget.ObjectAdapter.DataObserver; 3961905b0b52c50018dcaebcd79699c39b8f28d622Dake Guimport android.support.v17.leanback.widget.VerticalGridView; 4061905b0b52c50018dcaebcd79699c39b8f28d622Dake Guimport android.support.v17.leanback.widget.PlaybackControlsRowPresenter; 4161905b0b52c50018dcaebcd79699c39b8f28d622Dake Guimport android.util.Log; 4261905b0b52c50018dcaebcd79699c39b8f28d622Dake Guimport android.view.KeyEvent; 4361905b0b52c50018dcaebcd79699c39b8f28d622Dake Guimport android.view.LayoutInflater; 4461905b0b52c50018dcaebcd79699c39b8f28d622Dake Guimport android.view.MotionEvent; 4561905b0b52c50018dcaebcd79699c39b8f28d622Dake Guimport android.view.View; 4661905b0b52c50018dcaebcd79699c39b8f28d622Dake Guimport android.view.ViewGroup; 4761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 4861905b0b52c50018dcaebcd79699c39b8f28d622Dake Guimport java.util.ArrayList; 4961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 5061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu/** 5161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu * A fragment for displaying playback controls and related content. 5261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu * The {@link android.support.v17.leanback.widget.PlaybackControlsRow} is expected to be 5361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu * at position 0 in the adapter. 5461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu */ 5561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gupublic class PlaybackOverlaySupportFragment extends DetailsSupportFragment { 5661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 5761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu /** 5861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu * No background. 5961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu */ 6061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public static final int BG_NONE = 0; 6161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 6261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu /** 6361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu * A dark translucent background. 6461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu */ 6561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public static final int BG_DARK = 1; 6661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 6761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu /** 6861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu * A light translucent background. 6961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu */ 7061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public static final int BG_LIGHT = 2; 7161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 7261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public static class OnFadeCompleteListener { 7361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public void onFadeInComplete() { 7461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 7561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public void onFadeOutComplete() { 7661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 7761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 7861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 79eb66dab544c4c1eabe4d469b7cea348d4b01e664Craig Stout public interface InputEventHandler { 80eb66dab544c4c1eabe4d469b7cea348d4b01e664Craig Stout /** 81eb66dab544c4c1eabe4d469b7cea348d4b01e664Craig Stout * Called when an {@link InputEvent} is received. 82eb66dab544c4c1eabe4d469b7cea348d4b01e664Craig Stout * 83eb66dab544c4c1eabe4d469b7cea348d4b01e664Craig Stout * @return If the event should be consumed, return true. To allow the event to 84eb66dab544c4c1eabe4d469b7cea348d4b01e664Craig Stout * continue on to the next handler, return false. 85eb66dab544c4c1eabe4d469b7cea348d4b01e664Craig Stout */ 86eb66dab544c4c1eabe4d469b7cea348d4b01e664Craig Stout public boolean handleInputEvent(InputEvent event); 87eb66dab544c4c1eabe4d469b7cea348d4b01e664Craig Stout } 88eb66dab544c4c1eabe4d469b7cea348d4b01e664Craig Stout 8961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private static final String TAG = "PlaybackOverlaySupportFragment"; 9061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private static final boolean DEBUG = false; 9161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private static final int ANIMATION_MULTIPLIER = 1; 9261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 9361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private static int START_FADE_OUT = 1; 9461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 9561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu // Fading status 9661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private static final int IDLE = 0; 9761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private static final int IN = 1; 9861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private static final int OUT = 2; 9961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 10061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private int mAlignPosition; 10161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private int mPaddingBottom; 10261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private View mRootView; 10361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private int mBackgroundType = BG_DARK; 10461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private int mBgDarkColor; 10561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private int mBgLightColor; 10661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private int mShowTimeMs; 10761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private int mMajorFadeTranslateY, mMinorFadeTranslateY; 10861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private int mAnimationTranslateY; 10961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private OnFadeCompleteListener mFadeCompleteListener; 110eb66dab544c4c1eabe4d469b7cea348d4b01e664Craig Stout private InputEventHandler mInputEventHandler; 11161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private boolean mFadingEnabled = true; 11261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private int mFadingStatus = IDLE; 11361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private int mBgAlpha; 11461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private ValueAnimator mBgFadeInAnimator, mBgFadeOutAnimator; 11561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private ValueAnimator mControlRowFadeInAnimator, mControlRowFadeOutAnimator; 11661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private ValueAnimator mDescriptionFadeInAnimator, mDescriptionFadeOutAnimator; 11761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private ValueAnimator mOtherRowFadeInAnimator, mOtherRowFadeOutAnimator; 11861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private boolean mTranslateAnimationEnabled; 11961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private boolean mResetControlsToPrimaryActionsPending; 12061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private RecyclerView.ItemAnimator mItemAnimator; 12161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 12261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private final Animator.AnimatorListener mFadeListener = 12361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu new Animator.AnimatorListener() { 12461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu @Override 12561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public void onAnimationStart(Animator animation) { 12661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu enableVerticalGridAnimations(false); 12761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 12861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu @Override 12961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public void onAnimationRepeat(Animator animation) { 13061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 13161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu @Override 13261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public void onAnimationCancel(Animator animation) { 13361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 13461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu @Override 13561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public void onAnimationEnd(Animator animation) { 13661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (DEBUG) Log.v(TAG, "onAnimationEnd " + mBgAlpha); 13761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (mBgAlpha > 0) { 13861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu enableVerticalGridAnimations(true); 13961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu startFadeTimer(); 14061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (mFadeCompleteListener != null) { 14161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mFadeCompleteListener.onFadeInComplete(); 14261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 14361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } else { 14461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (getVerticalGridView() != null) { 14561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu // Reset focus to the controls row 14661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu getVerticalGridView().setSelectedPosition(0); 14761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu resetControlsToPrimaryActions(null); 14861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 14961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (mFadeCompleteListener != null) { 15061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mFadeCompleteListener.onFadeOutComplete(); 15161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 15261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 15361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mFadingStatus = IDLE; 15461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 15561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu }; 15661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 15761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private final Handler mHandler = new Handler() { 15861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu @Override 15961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public void handleMessage(Message message) { 16061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (message.what == START_FADE_OUT && mFadingEnabled) { 16161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu fade(false); 16261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 16361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 16461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu }; 16561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 16661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private final VerticalGridView.OnTouchInterceptListener mOnTouchInterceptListener = 16761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu new VerticalGridView.OnTouchInterceptListener() { 16861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public boolean onInterceptTouchEvent(MotionEvent event) { 169cbfc318baee2fc054af4c723bfac0fd3c28a1667Craig Stout return onInterceptInputEvent(event); 17061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 17161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu }; 17261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 17361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private final VerticalGridView.OnMotionInterceptListener mOnMotionInterceptListener = 17461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu new VerticalGridView.OnMotionInterceptListener() { 17561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public boolean onInterceptMotionEvent(MotionEvent event) { 176cbfc318baee2fc054af4c723bfac0fd3c28a1667Craig Stout return onInterceptInputEvent(event); 17761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 17861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu }; 17961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 18061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private final VerticalGridView.OnKeyInterceptListener mOnKeyInterceptListener = 18161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu new VerticalGridView.OnKeyInterceptListener() { 18261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public boolean onInterceptKeyEvent(KeyEvent event) { 183cbfc318baee2fc054af4c723bfac0fd3c28a1667Craig Stout return onInterceptInputEvent(event); 18461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 18561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu }; 18661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 18761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private void setBgAlpha(int alpha) { 18861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mBgAlpha = alpha; 18961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (mRootView != null) { 19061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mRootView.getBackground().setAlpha(alpha); 19161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 19261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 19361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 19461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private void enableVerticalGridAnimations(boolean enable) { 19561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (getVerticalGridView() != null) { 19661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu getVerticalGridView().setAnimateChildLayout(enable); 19761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 19861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 19961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 20061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private void resetControlsToPrimaryActions(ItemBridgeAdapter.ViewHolder vh) { 20161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (vh == null && getVerticalGridView() != null) { 20261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu vh = (ItemBridgeAdapter.ViewHolder) getVerticalGridView().findViewHolderForPosition(0); 20361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 20461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (vh == null) { 20561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mResetControlsToPrimaryActionsPending = true; 20661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } else if (vh.getPresenter() instanceof PlaybackControlsRowPresenter) { 20761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mResetControlsToPrimaryActionsPending = false; 20861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu ((PlaybackControlsRowPresenter) vh.getPresenter()).showPrimaryActions( 20961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu (PlaybackControlsRowPresenter.ViewHolder) vh.getViewHolder()); 21061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 21161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 21261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 21361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu /** 21461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu * Enables or disables view fading. If enabled, 21561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu * the view will be faded in when the fragment starts, 21661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu * and will fade out after a time period. The timeout 21761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu * period is reset each time {@link #tickle} is called. 21861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu * 21961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu */ 22061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public void setFadingEnabled(boolean enabled) { 22161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (DEBUG) Log.v(TAG, "setFadingEnabled " + enabled); 22261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (enabled != mFadingEnabled) { 22361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mFadingEnabled = enabled; 224f47fb1e34efd538c322f7539893272ba847cdbdcCraig Stout if (mFadingEnabled) { 225f47fb1e34efd538c322f7539893272ba847cdbdcCraig Stout if (isResumed() && mFadingStatus == IDLE 226f47fb1e34efd538c322f7539893272ba847cdbdcCraig Stout && !mHandler.hasMessages(START_FADE_OUT)) { 227f47fb1e34efd538c322f7539893272ba847cdbdcCraig Stout startFadeTimer(); 22861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 229f47fb1e34efd538c322f7539893272ba847cdbdcCraig Stout } else { 230f47fb1e34efd538c322f7539893272ba847cdbdcCraig Stout // Ensure fully opaque 231f47fb1e34efd538c322f7539893272ba847cdbdcCraig Stout mHandler.removeMessages(START_FADE_OUT); 232f47fb1e34efd538c322f7539893272ba847cdbdcCraig Stout fade(true); 23361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 23461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 23561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 23661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 23761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu /** 23861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu * Returns true if view fading is enabled. 23961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu */ 24061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public boolean isFadingEnabled() { 24161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu return mFadingEnabled; 24261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 24361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 24461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu /** 24561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu * Sets the listener to be called when fade in or out has completed. 24661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu */ 24761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public void setFadeCompleteListener(OnFadeCompleteListener listener) { 24861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mFadeCompleteListener = listener; 24961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 25061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 25161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu /** 25261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu * Returns the listener to be called when fade in or out has completed. 25361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu */ 25461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public OnFadeCompleteListener getFadeCompleteListener() { 25561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu return mFadeCompleteListener; 25661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 25761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 25861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu /** 259eb66dab544c4c1eabe4d469b7cea348d4b01e664Craig Stout * Sets the input event handler. 260eb66dab544c4c1eabe4d469b7cea348d4b01e664Craig Stout */ 261eb66dab544c4c1eabe4d469b7cea348d4b01e664Craig Stout public final void setInputEventHandler(InputEventHandler handler) { 262eb66dab544c4c1eabe4d469b7cea348d4b01e664Craig Stout mInputEventHandler = handler; 263eb66dab544c4c1eabe4d469b7cea348d4b01e664Craig Stout } 264eb66dab544c4c1eabe4d469b7cea348d4b01e664Craig Stout 265eb66dab544c4c1eabe4d469b7cea348d4b01e664Craig Stout /** 266eb66dab544c4c1eabe4d469b7cea348d4b01e664Craig Stout * Returns the input event handler. 267eb66dab544c4c1eabe4d469b7cea348d4b01e664Craig Stout */ 2682dfed05c8ab53ca7c28424c9c03b1a87b9b7ca0dCraig Stout public final InputEventHandler getInputEventHandler() { 269eb66dab544c4c1eabe4d469b7cea348d4b01e664Craig Stout return mInputEventHandler; 270eb66dab544c4c1eabe4d469b7cea348d4b01e664Craig Stout } 271eb66dab544c4c1eabe4d469b7cea348d4b01e664Craig Stout 272eb66dab544c4c1eabe4d469b7cea348d4b01e664Craig Stout /** 27361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu * Tickles the playback controls. Fades in the view if it was faded out, 27461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu * otherwise resets the fade out timer. Tickling on input events is handled 27561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu * by the fragment. 27661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu */ 27761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public void tickle() { 27861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (DEBUG) Log.v(TAG, "tickle enabled " + mFadingEnabled + " isResumed " + isResumed()); 27961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (!mFadingEnabled || !isResumed()) { 28061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu return; 28161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 28261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (mHandler.hasMessages(START_FADE_OUT)) { 28361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu // Restart the timer 28461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu startFadeTimer(); 28561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } else { 28661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu fade(true); 28761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 28861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 28961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 290cbfc318baee2fc054af4c723bfac0fd3c28a1667Craig Stout private static boolean isConsumableKey(KeyEvent keyEvent) { 291cbfc318baee2fc054af4c723bfac0fd3c28a1667Craig Stout if (keyEvent.isSystem()) { 292cbfc318baee2fc054af4c723bfac0fd3c28a1667Craig Stout return false; 293cbfc318baee2fc054af4c723bfac0fd3c28a1667Craig Stout } 294cbfc318baee2fc054af4c723bfac0fd3c28a1667Craig Stout return true; 295cbfc318baee2fc054af4c723bfac0fd3c28a1667Craig Stout } 296cbfc318baee2fc054af4c723bfac0fd3c28a1667Craig Stout 297cbfc318baee2fc054af4c723bfac0fd3c28a1667Craig Stout private boolean onInterceptInputEvent(InputEvent event) { 298c92c356de1a687598a031f3452053dc6c9af9b77Craig Stout if (DEBUG) Log.v(TAG, "onInterceptInputEvent status " + mFadingStatus + 299c92c356de1a687598a031f3452053dc6c9af9b77Craig Stout " mBgAlpha " + mBgAlpha + " event " + event); 300c92c356de1a687598a031f3452053dc6c9af9b77Craig Stout final boolean controlsHidden = (mFadingStatus == IDLE && mBgAlpha == 0); 301c92c356de1a687598a031f3452053dc6c9af9b77Craig Stout boolean consumeEvent = controlsHidden; 302c92c356de1a687598a031f3452053dc6c9af9b77Craig Stout int keyCode = KeyEvent.KEYCODE_UNKNOWN; 303c92c356de1a687598a031f3452053dc6c9af9b77Craig Stout 304cbfc318baee2fc054af4c723bfac0fd3c28a1667Craig Stout if (event instanceof KeyEvent) { 305cbfc318baee2fc054af4c723bfac0fd3c28a1667Craig Stout if (consumeEvent) { 306cbfc318baee2fc054af4c723bfac0fd3c28a1667Craig Stout consumeEvent = isConsumableKey((KeyEvent) event); 307cbfc318baee2fc054af4c723bfac0fd3c28a1667Craig Stout } 308c92c356de1a687598a031f3452053dc6c9af9b77Craig Stout keyCode = ((KeyEvent) event).getKeyCode(); 309c92c356de1a687598a031f3452053dc6c9af9b77Craig Stout } 310c92c356de1a687598a031f3452053dc6c9af9b77Craig Stout if (!consumeEvent && mInputEventHandler != null) { 311c92c356de1a687598a031f3452053dc6c9af9b77Craig Stout consumeEvent = mInputEventHandler.handleInputEvent(event); 312c92c356de1a687598a031f3452053dc6c9af9b77Craig Stout } 313c92c356de1a687598a031f3452053dc6c9af9b77Craig Stout if (keyCode == KeyEvent.KEYCODE_BACK) { 314c92c356de1a687598a031f3452053dc6c9af9b77Craig Stout // If fading enabled and controls are not hidden, back will be consumed to fade 315c92c356de1a687598a031f3452053dc6c9af9b77Craig Stout // them out (even if the key was consumed by the handler). 316c92c356de1a687598a031f3452053dc6c9af9b77Craig Stout if (mFadingEnabled && !controlsHidden) { 317c92c356de1a687598a031f3452053dc6c9af9b77Craig Stout consumeEvent = true; 318c92c356de1a687598a031f3452053dc6c9af9b77Craig Stout mHandler.removeMessages(START_FADE_OUT); 319c92c356de1a687598a031f3452053dc6c9af9b77Craig Stout fade(false); 320c92c356de1a687598a031f3452053dc6c9af9b77Craig Stout } else if (consumeEvent) { 321cbfc318baee2fc054af4c723bfac0fd3c28a1667Craig Stout tickle(); 322cbfc318baee2fc054af4c723bfac0fd3c28a1667Craig Stout } 323cbfc318baee2fc054af4c723bfac0fd3c28a1667Craig Stout } else { 324c92c356de1a687598a031f3452053dc6c9af9b77Craig Stout // Any other key will show the controls 325cbfc318baee2fc054af4c723bfac0fd3c28a1667Craig Stout tickle(); 326cbfc318baee2fc054af4c723bfac0fd3c28a1667Craig Stout } 32761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu return consumeEvent; 32861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 32961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 33061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu @Override 33161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public void onResume() { 33261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu super.onResume(); 33361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (mFadingEnabled) { 33461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu setBgAlpha(0); 33561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu fade(true); 33661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 33761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu getVerticalGridView().setOnTouchInterceptListener(mOnTouchInterceptListener); 33861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu getVerticalGridView().setOnMotionInterceptListener(mOnMotionInterceptListener); 33961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu getVerticalGridView().setOnKeyInterceptListener(mOnKeyInterceptListener); 34061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 34161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 34261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private void startFadeTimer() { 34361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (mHandler != null) { 34461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mHandler.removeMessages(START_FADE_OUT); 34561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mHandler.sendEmptyMessageDelayed(START_FADE_OUT, mShowTimeMs); 34661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 34761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 34861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 34961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private static ValueAnimator loadAnimator(Context context, int resId) { 35061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu ValueAnimator animator = (ValueAnimator) AnimatorInflater.loadAnimator(context, resId); 35161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu animator.setDuration(animator.getDuration() * ANIMATION_MULTIPLIER); 35261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu return animator; 35361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 35461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 35561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private void loadBgAnimator() { 35661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu AnimatorUpdateListener listener = new AnimatorUpdateListener() { 35761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu @Override 35861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public void onAnimationUpdate(ValueAnimator arg0) { 35961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu setBgAlpha((Integer) arg0.getAnimatedValue()); 36061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 36161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu }; 36261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 36361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mBgFadeInAnimator = loadAnimator(getActivity(), R.animator.lb_playback_bg_fade_in); 36461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mBgFadeInAnimator.addUpdateListener(listener); 36561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mBgFadeInAnimator.addListener(mFadeListener); 36661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 36761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mBgFadeOutAnimator = loadAnimator(getActivity(), R.animator.lb_playback_bg_fade_out); 36861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mBgFadeOutAnimator.addUpdateListener(listener); 36961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mBgFadeOutAnimator.addListener(mFadeListener); 37061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 37161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 37261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private TimeInterpolator mLogDecelerateInterpolator = new LogDecelerateInterpolator(100,0); 37361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private TimeInterpolator mLogAccelerateInterpolator = new LogAccelerateInterpolator(100,0); 37461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 37561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private View getControlRowView() { 37661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (getVerticalGridView() == null) { 37761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu return null; 37861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 37961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu RecyclerView.ViewHolder vh = getVerticalGridView().findViewHolderForPosition(0); 38061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (vh == null) { 38161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu return null; 38261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 38361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu return vh.itemView; 38461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 38561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 38661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private void loadControlRowAnimator() { 38761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu final AnimatorListener listener = new AnimatorListener() { 38861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu @Override 38961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu void getViews(ArrayList<View> views) { 39061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu View view = getControlRowView(); 39161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (view != null) { 39261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu views.add(view); 39361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 39461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 39561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu }; 39661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu final AnimatorUpdateListener updateListener = new AnimatorUpdateListener() { 39761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu @Override 39861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public void onAnimationUpdate(ValueAnimator arg0) { 39961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu View view = getControlRowView(); 40061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (view != null) { 40161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu final float fraction = (Float) arg0.getAnimatedValue(); 40261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (DEBUG) Log.v(TAG, "fraction " + fraction); 40361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu view.setAlpha(fraction); 40461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu view.setTranslationY((float) mAnimationTranslateY * (1f - fraction)); 40561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 40661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 40761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu }; 40861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 40961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mControlRowFadeInAnimator = loadAnimator( 41061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu getActivity(), R.animator.lb_playback_controls_fade_in); 41161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mControlRowFadeInAnimator.addUpdateListener(updateListener); 41261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mControlRowFadeInAnimator.addListener(listener); 41361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mControlRowFadeInAnimator.setInterpolator(mLogDecelerateInterpolator); 41461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 41561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mControlRowFadeOutAnimator = loadAnimator( 41661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu getActivity(), R.animator.lb_playback_controls_fade_out); 41761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mControlRowFadeOutAnimator.addUpdateListener(updateListener); 41861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mControlRowFadeOutAnimator.addListener(listener); 41961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mControlRowFadeOutAnimator.setInterpolator(mLogAccelerateInterpolator); 42061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 42161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 42261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private void loadOtherRowAnimator() { 42361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu final AnimatorListener listener = new AnimatorListener() { 42461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu @Override 42561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu void getViews(ArrayList<View> views) { 42661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (getVerticalGridView() == null) { 42761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu return; 42861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 42961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu final int count = getVerticalGridView().getChildCount(); 43061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu for (int i = 0; i < count; i++) { 43161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu View view = getVerticalGridView().getChildAt(i); 43261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (view != null) { 43361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu views.add(view); 43461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 43561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 43661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 43761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu }; 43861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu final AnimatorUpdateListener updateListener = new AnimatorUpdateListener() { 43961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu @Override 44061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public void onAnimationUpdate(ValueAnimator arg0) { 44161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu final float fraction = (Float) arg0.getAnimatedValue(); 44261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu for (View view : listener.mViews) { 44361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (getVerticalGridView().getChildPosition(view) > 0) { 44461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu view.setAlpha(fraction); 44561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu view.setTranslationY((float) mAnimationTranslateY * (1f - fraction)); 44661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 44761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 44861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 44961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu }; 45061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 45161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mOtherRowFadeInAnimator = loadAnimator( 45261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu getActivity(), R.animator.lb_playback_controls_fade_in); 45361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mOtherRowFadeInAnimator.addListener(listener); 45461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mOtherRowFadeInAnimator.addUpdateListener(updateListener); 45561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mOtherRowFadeInAnimator.setInterpolator(mLogDecelerateInterpolator); 45661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 45761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mOtherRowFadeOutAnimator = loadAnimator( 45861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu getActivity(), R.animator.lb_playback_controls_fade_out); 45961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mOtherRowFadeOutAnimator.addListener(listener); 46061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mOtherRowFadeOutAnimator.addUpdateListener(updateListener); 46161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mOtherRowFadeOutAnimator.setInterpolator(new AccelerateInterpolator()); 46261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 46361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 46461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private void loadDescriptionAnimator() { 46561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu AnimatorUpdateListener listener = new AnimatorUpdateListener() { 46661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu @Override 46761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public void onAnimationUpdate(ValueAnimator arg0) { 46861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (getVerticalGridView() == null) { 46961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu return; 47061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 47161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu ItemBridgeAdapter.ViewHolder adapterVh = (ItemBridgeAdapter.ViewHolder) 47261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu getVerticalGridView().findViewHolderForPosition(0); 47361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (adapterVh != null && adapterVh.getViewHolder() 47461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu instanceof PlaybackControlsRowPresenter.ViewHolder) { 47561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu final Presenter.ViewHolder vh = ((PlaybackControlsRowPresenter.ViewHolder) 47661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu adapterVh.getViewHolder()).mDescriptionViewHolder; 47761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (vh != null) { 47861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu vh.view.setAlpha((Float) arg0.getAnimatedValue()); 47961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 48061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 48161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 48261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu }; 48361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 48461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mDescriptionFadeInAnimator = loadAnimator( 48561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu getActivity(), R.animator.lb_playback_description_fade_in); 48661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mDescriptionFadeInAnimator.addUpdateListener(listener); 48761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mDescriptionFadeInAnimator.setInterpolator(mLogDecelerateInterpolator); 48861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 48961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mDescriptionFadeOutAnimator = loadAnimator( 49061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu getActivity(), R.animator.lb_playback_description_fade_out); 49161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mDescriptionFadeOutAnimator.addUpdateListener(listener); 49261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 49361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 49461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private void fade(boolean fadeIn) { 49561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (DEBUG) Log.v(TAG, "fade " + fadeIn); 49661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (getView() == null) { 49761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu return; 49861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 49961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if ((fadeIn && mFadingStatus == IN) || (!fadeIn && mFadingStatus == OUT)) { 50061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (DEBUG) Log.v(TAG, "requested fade in progress"); 50161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu return; 50261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 50361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if ((fadeIn && mBgAlpha == 255) || (!fadeIn && mBgAlpha == 0)) { 50461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (DEBUG) Log.v(TAG, "fade is no-op"); 50561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu return; 50661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 50761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 50861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mAnimationTranslateY = getVerticalGridView().getSelectedPosition() == 0 ? 50961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mMajorFadeTranslateY : mMinorFadeTranslateY; 51061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 51161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (mFadingStatus == IDLE) { 51261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (fadeIn) { 51361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mBgFadeInAnimator.start(); 51461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mControlRowFadeInAnimator.start(); 51561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mOtherRowFadeInAnimator.start(); 51661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mDescriptionFadeInAnimator.start(); 51761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } else { 51861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mBgFadeOutAnimator.start(); 51961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mControlRowFadeOutAnimator.start(); 52061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mOtherRowFadeOutAnimator.start(); 52161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mDescriptionFadeOutAnimator.start(); 52261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 52361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } else { 52461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (fadeIn) { 52561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mBgFadeOutAnimator.reverse(); 52661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mControlRowFadeOutAnimator.reverse(); 52761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mOtherRowFadeOutAnimator.reverse(); 52861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mDescriptionFadeOutAnimator.reverse(); 52961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } else { 53061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mBgFadeInAnimator.reverse(); 53161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mControlRowFadeInAnimator.reverse(); 53261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mOtherRowFadeInAnimator.reverse(); 53361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mDescriptionFadeInAnimator.reverse(); 53461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 53561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 53661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 53761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu // If fading in while control row is focused, set initial translationY so 53861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu // views slide in from below. 53961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (fadeIn && mFadingStatus == IDLE) { 54061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu final int count = getVerticalGridView().getChildCount(); 54161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu for (int i = 0; i < count; i++) { 54261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu getVerticalGridView().getChildAt(i).setTranslationY(mAnimationTranslateY); 54361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 54461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 54561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 54661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mFadingStatus = fadeIn ? IN : OUT; 54761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 54861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 54961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu /** 55061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu * Sets the list of rows for the fragment. 55161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu */ 55261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu @Override 55361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public void setAdapter(ObjectAdapter adapter) { 55461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (getAdapter() != null) { 55561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu getAdapter().unregisterObserver(mObserver); 55661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 55761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu super.setAdapter(adapter); 55861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (adapter != null) { 55961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu adapter.registerObserver(mObserver); 56061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 56161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 56261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 56361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu @Override 56461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu void setVerticalGridViewLayout(VerticalGridView listview) { 56561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (listview == null) { 56661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu return; 56761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 56861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu // Padding affects alignment when last row is focused 56961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu // (last is first when there's only one row). 57061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu setBottomPadding(listview, mPaddingBottom); 57161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 57261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu // Item alignment affects focused row that isn't the last. 57361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu listview.setItemAlignmentOffset(mAlignPosition); 57461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu listview.setItemAlignmentOffsetPercent(100); 57561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 57661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu // Push rows to the bottom. 57761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu listview.setWindowAlignmentOffset(0); 57861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu listview.setWindowAlignmentOffsetPercent(100); 57961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu listview.setWindowAlignment(VerticalGridView.WINDOW_ALIGN_HIGH_EDGE); 58061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 58161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 58261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private static void setBottomPadding(View view, int padding) { 58361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu view.setPadding(view.getPaddingLeft(), view.getPaddingTop(), 58461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu view.getPaddingRight(), padding); 58561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 58661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 58761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu @Override 58861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public void onCreate(Bundle savedInstanceState) { 58961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu super.onCreate(savedInstanceState); 59061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 59161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mAlignPosition = 59261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu getResources().getDimensionPixelSize(R.dimen.lb_playback_controls_align_bottom); 59361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mPaddingBottom = 59461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu getResources().getDimensionPixelSize(R.dimen.lb_playback_controls_padding_bottom); 59561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mBgDarkColor = 59661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu getResources().getColor(R.color.lb_playback_controls_background_dark); 59761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mBgLightColor = 59861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu getResources().getColor(R.color.lb_playback_controls_background_light); 59961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mShowTimeMs = 60061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu getResources().getInteger(R.integer.lb_playback_controls_show_time_ms); 60161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mMajorFadeTranslateY = 60261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu getResources().getDimensionPixelSize(R.dimen.lb_playback_major_fade_translate_y); 60361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mMinorFadeTranslateY = 60461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu getResources().getDimensionPixelSize(R.dimen.lb_playback_minor_fade_translate_y); 60561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 60661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu loadBgAnimator(); 60761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu loadControlRowAnimator(); 60861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu loadOtherRowAnimator(); 60961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu loadDescriptionAnimator(); 61061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 61161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 61261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu /** 61361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu * Sets the background type. 61461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu * 61561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu * @param type One of BG_LIGHT, BG_DARK, or BG_NONE. 61661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu */ 61761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public void setBackgroundType(int type) { 61861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu switch (type) { 61961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu case BG_LIGHT: 62061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu case BG_DARK: 62161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu case BG_NONE: 62261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (type != mBackgroundType) { 62361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mBackgroundType = type; 62461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu updateBackground(); 62561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 62661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu break; 62761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu default: 62861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu throw new IllegalArgumentException("Invalid background type"); 62961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 63061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 63161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 63261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu /** 63361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu * Returns the background type. 63461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu */ 63561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public int getBackgroundType() { 63661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu return mBackgroundType; 63761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 63861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 63961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private void updateBackground() { 64061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (mRootView != null) { 64161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu int color = mBgDarkColor; 64261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu switch (mBackgroundType) { 64361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu case BG_DARK: break; 64461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu case BG_LIGHT: color = mBgLightColor; break; 64561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu case BG_NONE: color = Color.TRANSPARENT; break; 64661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 64761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mRootView.setBackground(new ColorDrawable(color)); 64861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 64961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 65061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 65161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private void updateControlsBottomSpace(ItemBridgeAdapter.ViewHolder vh) { 65261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu // Add extra space between rows 0 and 1 65361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (vh == null && getVerticalGridView() != null) { 65461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu vh = (ItemBridgeAdapter.ViewHolder) 65561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu getVerticalGridView().findViewHolderForPosition(0); 65661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 65761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (vh != null && vh.getPresenter() instanceof PlaybackControlsRowPresenter) { 65861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu final int adapterSize = getAdapter() == null ? 0 : getAdapter().size(); 65961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu ((PlaybackControlsRowPresenter) vh.getPresenter()).showBottomSpace( 66061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu (PlaybackControlsRowPresenter.ViewHolder) vh.getViewHolder(), 66161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu adapterSize > 1); 66261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 66361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 66461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 66561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private final ItemBridgeAdapter.AdapterListener mAdapterListener = 66661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu new ItemBridgeAdapter.AdapterListener() { 66761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu @Override 66861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public void onAttachedToWindow(ItemBridgeAdapter.ViewHolder vh) { 66961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (DEBUG) Log.v(TAG, "onAttachedToWindow " + vh.getViewHolder().view); 67061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if ((mFadingStatus == IDLE && mBgAlpha == 0) || mFadingStatus == OUT) { 67161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (DEBUG) Log.v(TAG, "setting alpha to 0"); 67261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu vh.getViewHolder().view.setAlpha(0); 67361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 67461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (vh.getPosition() == 0 && mResetControlsToPrimaryActionsPending) { 67561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu resetControlsToPrimaryActions(vh); 67661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 67761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 67861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu @Override 67961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public void onDetachedFromWindow(ItemBridgeAdapter.ViewHolder vh) { 68061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (DEBUG) Log.v(TAG, "onDetachedFromWindow " + vh.getViewHolder().view); 68161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu // Reset animation state 68261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu vh.getViewHolder().view.setAlpha(1f); 68361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu vh.getViewHolder().view.setTranslationY(0); 68461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (vh.getViewHolder() instanceof PlaybackControlsRowPresenter.ViewHolder) { 68561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu Presenter.ViewHolder descriptionVh = ((PlaybackControlsRowPresenter.ViewHolder) 68661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu vh.getViewHolder()).mDescriptionViewHolder; 68761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (descriptionVh != null) { 68861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu descriptionVh.view.setAlpha(1f); 68961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 69061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 69161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 69261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu @Override 69361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public void onBind(ItemBridgeAdapter.ViewHolder vh) { 69461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (vh.getPosition() == 0) { 69561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu updateControlsBottomSpace(vh); 69661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 69761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 69861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu }; 69961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 70061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu @Override 70161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public View onCreateView(LayoutInflater inflater, ViewGroup container, 70261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu Bundle savedInstanceState) { 70361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mRootView = super.onCreateView(inflater, container, savedInstanceState); 70461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mBgAlpha = 255; 70561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu updateBackground(); 70661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu getRowsSupportFragment().setExternalAdapterListener(mAdapterListener); 70761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu return mRootView; 70861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 70961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 71061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu @Override 71161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public void onDestroyView() { 71261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mRootView = null; 71361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu super.onDestroyView(); 71461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 71561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 71661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private final DataObserver mObserver = new DataObserver() { 71761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public void onChanged() { 71861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu updateControlsBottomSpace(null); 71961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 72061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu }; 72161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 72261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu static abstract class AnimatorListener implements Animator.AnimatorListener { 72361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu ArrayList<View> mViews = new ArrayList<View>(); 72461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu ArrayList<Integer> mLayerType = new ArrayList<Integer>(); 72561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 72661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public void onAnimationCancel(Animator animation) { 72761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 72861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public void onAnimationRepeat(Animator animation) { 72961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 73061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public void onAnimationStart(Animator animation) { 73161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu getViews(mViews); 73261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu for (View view : mViews) { 73361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mLayerType.add(view.getLayerType()); 73461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu view.setLayerType(View.LAYER_TYPE_HARDWARE, null); 73561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 73661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 73761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public void onAnimationEnd(Animator animation) { 73861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu for (int i = 0; i < mViews.size(); i++) { 73961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mViews.get(i).setLayerType(mLayerType.get(i), null); 74061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 74161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mLayerType.clear(); 74261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mViews.clear(); 74361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 74461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu abstract void getViews(ArrayList<View> views); 74561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu }; 74661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu} 747