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.OnKeyInterceptListener mOnKeyInterceptListener = 17461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu new VerticalGridView.OnKeyInterceptListener() { 17561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public boolean onInterceptKeyEvent(KeyEvent event) { 176cbfc318baee2fc054af4c723bfac0fd3c28a1667Craig Stout return onInterceptInputEvent(event); 17761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 17861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu }; 17961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 18061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private void setBgAlpha(int alpha) { 18161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mBgAlpha = alpha; 18261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (mRootView != null) { 18361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mRootView.getBackground().setAlpha(alpha); 18461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 18561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 18661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 18761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private void enableVerticalGridAnimations(boolean enable) { 18861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (getVerticalGridView() != null) { 18961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu getVerticalGridView().setAnimateChildLayout(enable); 19061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 19161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 19261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 19361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private void resetControlsToPrimaryActions(ItemBridgeAdapter.ViewHolder vh) { 19461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (vh == null && getVerticalGridView() != null) { 19561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu vh = (ItemBridgeAdapter.ViewHolder) getVerticalGridView().findViewHolderForPosition(0); 19661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 19761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (vh == null) { 19861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mResetControlsToPrimaryActionsPending = true; 19961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } else if (vh.getPresenter() instanceof PlaybackControlsRowPresenter) { 20061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mResetControlsToPrimaryActionsPending = false; 20161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu ((PlaybackControlsRowPresenter) vh.getPresenter()).showPrimaryActions( 20261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu (PlaybackControlsRowPresenter.ViewHolder) vh.getViewHolder()); 20361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 20461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 20561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 20661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu /** 20761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu * Enables or disables view fading. If enabled, 20861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu * the view will be faded in when the fragment starts, 20961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu * and will fade out after a time period. The timeout 21061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu * period is reset each time {@link #tickle} is called. 21161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu * 21261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu */ 21361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public void setFadingEnabled(boolean enabled) { 21461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (DEBUG) Log.v(TAG, "setFadingEnabled " + enabled); 21561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (enabled != mFadingEnabled) { 21661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mFadingEnabled = enabled; 217f47fb1e34efd538c322f7539893272ba847cdbdcCraig Stout if (mFadingEnabled) { 218f47fb1e34efd538c322f7539893272ba847cdbdcCraig Stout if (isResumed() && mFadingStatus == IDLE 219f47fb1e34efd538c322f7539893272ba847cdbdcCraig Stout && !mHandler.hasMessages(START_FADE_OUT)) { 220f47fb1e34efd538c322f7539893272ba847cdbdcCraig Stout startFadeTimer(); 22161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 222f47fb1e34efd538c322f7539893272ba847cdbdcCraig Stout } else { 223f47fb1e34efd538c322f7539893272ba847cdbdcCraig Stout // Ensure fully opaque 224f47fb1e34efd538c322f7539893272ba847cdbdcCraig Stout mHandler.removeMessages(START_FADE_OUT); 225f47fb1e34efd538c322f7539893272ba847cdbdcCraig Stout fade(true); 22661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 22761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 22861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 22961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 23061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu /** 23161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu * Returns true if view fading is enabled. 23261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu */ 23361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public boolean isFadingEnabled() { 23461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu return mFadingEnabled; 23561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 23661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 23761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu /** 23861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu * Sets the listener to be called when fade in or out has completed. 23961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu */ 24061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public void setFadeCompleteListener(OnFadeCompleteListener listener) { 24161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mFadeCompleteListener = listener; 24261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 24361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 24461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu /** 24561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu * Returns the listener to be called when fade in or out has completed. 24661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu */ 24761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public OnFadeCompleteListener getFadeCompleteListener() { 24861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu return mFadeCompleteListener; 24961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 25061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 25161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu /** 252eb66dab544c4c1eabe4d469b7cea348d4b01e664Craig Stout * Sets the input event handler. 253eb66dab544c4c1eabe4d469b7cea348d4b01e664Craig Stout */ 254eb66dab544c4c1eabe4d469b7cea348d4b01e664Craig Stout public final void setInputEventHandler(InputEventHandler handler) { 255eb66dab544c4c1eabe4d469b7cea348d4b01e664Craig Stout mInputEventHandler = handler; 256eb66dab544c4c1eabe4d469b7cea348d4b01e664Craig Stout } 257eb66dab544c4c1eabe4d469b7cea348d4b01e664Craig Stout 258eb66dab544c4c1eabe4d469b7cea348d4b01e664Craig Stout /** 259eb66dab544c4c1eabe4d469b7cea348d4b01e664Craig Stout * Returns the input event handler. 260eb66dab544c4c1eabe4d469b7cea348d4b01e664Craig Stout */ 2612dfed05c8ab53ca7c28424c9c03b1a87b9b7ca0dCraig Stout public final InputEventHandler getInputEventHandler() { 262eb66dab544c4c1eabe4d469b7cea348d4b01e664Craig Stout return mInputEventHandler; 263eb66dab544c4c1eabe4d469b7cea348d4b01e664Craig Stout } 264eb66dab544c4c1eabe4d469b7cea348d4b01e664Craig Stout 265eb66dab544c4c1eabe4d469b7cea348d4b01e664Craig Stout /** 26661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu * Tickles the playback controls. Fades in the view if it was faded out, 26761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu * otherwise resets the fade out timer. Tickling on input events is handled 26861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu * by the fragment. 26961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu */ 27061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public void tickle() { 27161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (DEBUG) Log.v(TAG, "tickle enabled " + mFadingEnabled + " isResumed " + isResumed()); 27261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (!mFadingEnabled || !isResumed()) { 27361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu return; 27461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 27561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (mHandler.hasMessages(START_FADE_OUT)) { 27661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu // Restart the timer 27761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu startFadeTimer(); 27861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } else { 27961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu fade(true); 28061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 28161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 28261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 283cbfc318baee2fc054af4c723bfac0fd3c28a1667Craig Stout private static boolean isConsumableKey(KeyEvent keyEvent) { 284cbfc318baee2fc054af4c723bfac0fd3c28a1667Craig Stout if (keyEvent.isSystem()) { 285cbfc318baee2fc054af4c723bfac0fd3c28a1667Craig Stout return false; 286cbfc318baee2fc054af4c723bfac0fd3c28a1667Craig Stout } 287cbfc318baee2fc054af4c723bfac0fd3c28a1667Craig Stout return true; 288cbfc318baee2fc054af4c723bfac0fd3c28a1667Craig Stout } 289cbfc318baee2fc054af4c723bfac0fd3c28a1667Craig Stout 290cbfc318baee2fc054af4c723bfac0fd3c28a1667Craig Stout private boolean onInterceptInputEvent(InputEvent event) { 291c92c356de1a687598a031f3452053dc6c9af9b77Craig Stout if (DEBUG) Log.v(TAG, "onInterceptInputEvent status " + mFadingStatus + 292c92c356de1a687598a031f3452053dc6c9af9b77Craig Stout " mBgAlpha " + mBgAlpha + " event " + event); 293c92c356de1a687598a031f3452053dc6c9af9b77Craig Stout final boolean controlsHidden = (mFadingStatus == IDLE && mBgAlpha == 0); 294c92c356de1a687598a031f3452053dc6c9af9b77Craig Stout boolean consumeEvent = controlsHidden; 295c92c356de1a687598a031f3452053dc6c9af9b77Craig Stout int keyCode = KeyEvent.KEYCODE_UNKNOWN; 296c92c356de1a687598a031f3452053dc6c9af9b77Craig Stout 297cbfc318baee2fc054af4c723bfac0fd3c28a1667Craig Stout if (event instanceof KeyEvent) { 298cbfc318baee2fc054af4c723bfac0fd3c28a1667Craig Stout if (consumeEvent) { 299cbfc318baee2fc054af4c723bfac0fd3c28a1667Craig Stout consumeEvent = isConsumableKey((KeyEvent) event); 300cbfc318baee2fc054af4c723bfac0fd3c28a1667Craig Stout } 301c92c356de1a687598a031f3452053dc6c9af9b77Craig Stout keyCode = ((KeyEvent) event).getKeyCode(); 302c92c356de1a687598a031f3452053dc6c9af9b77Craig Stout } 303c92c356de1a687598a031f3452053dc6c9af9b77Craig Stout if (!consumeEvent && mInputEventHandler != null) { 304c92c356de1a687598a031f3452053dc6c9af9b77Craig Stout consumeEvent = mInputEventHandler.handleInputEvent(event); 305c92c356de1a687598a031f3452053dc6c9af9b77Craig Stout } 306c92c356de1a687598a031f3452053dc6c9af9b77Craig Stout if (keyCode == KeyEvent.KEYCODE_BACK) { 307c92c356de1a687598a031f3452053dc6c9af9b77Craig Stout // If fading enabled and controls are not hidden, back will be consumed to fade 308c92c356de1a687598a031f3452053dc6c9af9b77Craig Stout // them out (even if the key was consumed by the handler). 309c92c356de1a687598a031f3452053dc6c9af9b77Craig Stout if (mFadingEnabled && !controlsHidden) { 310c92c356de1a687598a031f3452053dc6c9af9b77Craig Stout consumeEvent = true; 311c92c356de1a687598a031f3452053dc6c9af9b77Craig Stout mHandler.removeMessages(START_FADE_OUT); 312c92c356de1a687598a031f3452053dc6c9af9b77Craig Stout fade(false); 313c92c356de1a687598a031f3452053dc6c9af9b77Craig Stout } else if (consumeEvent) { 314cbfc318baee2fc054af4c723bfac0fd3c28a1667Craig Stout tickle(); 315cbfc318baee2fc054af4c723bfac0fd3c28a1667Craig Stout } 316cbfc318baee2fc054af4c723bfac0fd3c28a1667Craig Stout } else { 317c92c356de1a687598a031f3452053dc6c9af9b77Craig Stout // Any other key will show the controls 318cbfc318baee2fc054af4c723bfac0fd3c28a1667Craig Stout tickle(); 319cbfc318baee2fc054af4c723bfac0fd3c28a1667Craig Stout } 32061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu return consumeEvent; 32161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 32261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 32361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu @Override 32461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public void onResume() { 32561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu super.onResume(); 32661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (mFadingEnabled) { 32761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu setBgAlpha(0); 32861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu fade(true); 32961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 33061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu getVerticalGridView().setOnTouchInterceptListener(mOnTouchInterceptListener); 33161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu getVerticalGridView().setOnKeyInterceptListener(mOnKeyInterceptListener); 33261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 33361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 33461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private void startFadeTimer() { 33561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (mHandler != null) { 33661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mHandler.removeMessages(START_FADE_OUT); 33761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mHandler.sendEmptyMessageDelayed(START_FADE_OUT, mShowTimeMs); 33861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 33961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 34061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 34161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private static ValueAnimator loadAnimator(Context context, int resId) { 34261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu ValueAnimator animator = (ValueAnimator) AnimatorInflater.loadAnimator(context, resId); 34361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu animator.setDuration(animator.getDuration() * ANIMATION_MULTIPLIER); 34461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu return animator; 34561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 34661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 34761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private void loadBgAnimator() { 34861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu AnimatorUpdateListener listener = new AnimatorUpdateListener() { 34961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu @Override 35061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public void onAnimationUpdate(ValueAnimator arg0) { 35161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu setBgAlpha((Integer) arg0.getAnimatedValue()); 35261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 35361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu }; 35461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 35561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mBgFadeInAnimator = loadAnimator(getActivity(), R.animator.lb_playback_bg_fade_in); 35661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mBgFadeInAnimator.addUpdateListener(listener); 35761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mBgFadeInAnimator.addListener(mFadeListener); 35861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 35961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mBgFadeOutAnimator = loadAnimator(getActivity(), R.animator.lb_playback_bg_fade_out); 36061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mBgFadeOutAnimator.addUpdateListener(listener); 36161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mBgFadeOutAnimator.addListener(mFadeListener); 36261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 36361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 36461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private TimeInterpolator mLogDecelerateInterpolator = new LogDecelerateInterpolator(100,0); 36561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private TimeInterpolator mLogAccelerateInterpolator = new LogAccelerateInterpolator(100,0); 36661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 36761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private View getControlRowView() { 36861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (getVerticalGridView() == null) { 36961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu return null; 37061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 37161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu RecyclerView.ViewHolder vh = getVerticalGridView().findViewHolderForPosition(0); 37261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (vh == null) { 37361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu return null; 37461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 37561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu return vh.itemView; 37661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 37761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 37861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private void loadControlRowAnimator() { 37961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu final AnimatorListener listener = new AnimatorListener() { 38061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu @Override 38161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu void getViews(ArrayList<View> views) { 38261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu View view = getControlRowView(); 38361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (view != null) { 38461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu views.add(view); 38561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 38661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 38761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu }; 38861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu final AnimatorUpdateListener updateListener = new AnimatorUpdateListener() { 38961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu @Override 39061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public void onAnimationUpdate(ValueAnimator arg0) { 39161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu View view = getControlRowView(); 39261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (view != null) { 39361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu final float fraction = (Float) arg0.getAnimatedValue(); 39461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (DEBUG) Log.v(TAG, "fraction " + fraction); 39561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu view.setAlpha(fraction); 39661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu view.setTranslationY((float) mAnimationTranslateY * (1f - fraction)); 39761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 39861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 39961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu }; 40061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 40161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mControlRowFadeInAnimator = loadAnimator( 40261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu getActivity(), R.animator.lb_playback_controls_fade_in); 40361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mControlRowFadeInAnimator.addUpdateListener(updateListener); 40461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mControlRowFadeInAnimator.addListener(listener); 40561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mControlRowFadeInAnimator.setInterpolator(mLogDecelerateInterpolator); 40661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 40761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mControlRowFadeOutAnimator = loadAnimator( 40861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu getActivity(), R.animator.lb_playback_controls_fade_out); 40961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mControlRowFadeOutAnimator.addUpdateListener(updateListener); 41061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mControlRowFadeOutAnimator.addListener(listener); 41161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mControlRowFadeOutAnimator.setInterpolator(mLogAccelerateInterpolator); 41261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 41361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 41461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private void loadOtherRowAnimator() { 41561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu final AnimatorListener listener = new AnimatorListener() { 41661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu @Override 41761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu void getViews(ArrayList<View> views) { 41861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (getVerticalGridView() == null) { 41961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu return; 42061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 42161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu final int count = getVerticalGridView().getChildCount(); 42261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu for (int i = 0; i < count; i++) { 42361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu View view = getVerticalGridView().getChildAt(i); 42461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (view != null) { 42561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu views.add(view); 42661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 42761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 42861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 42961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu }; 43061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu final AnimatorUpdateListener updateListener = new AnimatorUpdateListener() { 43161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu @Override 43261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public void onAnimationUpdate(ValueAnimator arg0) { 433db14dd5106afde6a39ae26448df2b81b536ebc2bCraig Stout if (getVerticalGridView() == null) { 434db14dd5106afde6a39ae26448df2b81b536ebc2bCraig Stout return; 435db14dd5106afde6a39ae26448df2b81b536ebc2bCraig Stout } 43661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu final float fraction = (Float) arg0.getAnimatedValue(); 43761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu for (View view : listener.mViews) { 43861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (getVerticalGridView().getChildPosition(view) > 0) { 43961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu view.setAlpha(fraction); 44061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu view.setTranslationY((float) mAnimationTranslateY * (1f - fraction)); 44161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 44261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 44361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 44461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu }; 44561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 44661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mOtherRowFadeInAnimator = loadAnimator( 44761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu getActivity(), R.animator.lb_playback_controls_fade_in); 44861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mOtherRowFadeInAnimator.addListener(listener); 44961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mOtherRowFadeInAnimator.addUpdateListener(updateListener); 45061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mOtherRowFadeInAnimator.setInterpolator(mLogDecelerateInterpolator); 45161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 45261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mOtherRowFadeOutAnimator = loadAnimator( 45361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu getActivity(), R.animator.lb_playback_controls_fade_out); 45461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mOtherRowFadeOutAnimator.addListener(listener); 45561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mOtherRowFadeOutAnimator.addUpdateListener(updateListener); 45661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mOtherRowFadeOutAnimator.setInterpolator(new AccelerateInterpolator()); 45761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 45861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 45961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private void loadDescriptionAnimator() { 46061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu AnimatorUpdateListener listener = new AnimatorUpdateListener() { 46161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu @Override 46261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public void onAnimationUpdate(ValueAnimator arg0) { 46361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (getVerticalGridView() == null) { 46461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu return; 46561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 46661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu ItemBridgeAdapter.ViewHolder adapterVh = (ItemBridgeAdapter.ViewHolder) 46761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu getVerticalGridView().findViewHolderForPosition(0); 46861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (adapterVh != null && adapterVh.getViewHolder() 46961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu instanceof PlaybackControlsRowPresenter.ViewHolder) { 47061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu final Presenter.ViewHolder vh = ((PlaybackControlsRowPresenter.ViewHolder) 47161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu adapterVh.getViewHolder()).mDescriptionViewHolder; 47261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (vh != null) { 47361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu vh.view.setAlpha((Float) arg0.getAnimatedValue()); 47461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 47561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 47661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 47761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu }; 47861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 47961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mDescriptionFadeInAnimator = loadAnimator( 48061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu getActivity(), R.animator.lb_playback_description_fade_in); 48161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mDescriptionFadeInAnimator.addUpdateListener(listener); 48261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mDescriptionFadeInAnimator.setInterpolator(mLogDecelerateInterpolator); 48361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 48461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mDescriptionFadeOutAnimator = loadAnimator( 48561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu getActivity(), R.animator.lb_playback_description_fade_out); 48661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mDescriptionFadeOutAnimator.addUpdateListener(listener); 48761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 48861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 48961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private void fade(boolean fadeIn) { 49061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (DEBUG) Log.v(TAG, "fade " + fadeIn); 49161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (getView() == null) { 49261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu return; 49361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 49461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if ((fadeIn && mFadingStatus == IN) || (!fadeIn && mFadingStatus == OUT)) { 49561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (DEBUG) Log.v(TAG, "requested fade in progress"); 49661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu return; 49761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 49861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if ((fadeIn && mBgAlpha == 255) || (!fadeIn && mBgAlpha == 0)) { 49961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (DEBUG) Log.v(TAG, "fade is no-op"); 50061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu return; 50161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 50261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 50361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mAnimationTranslateY = getVerticalGridView().getSelectedPosition() == 0 ? 50461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mMajorFadeTranslateY : mMinorFadeTranslateY; 50561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 50661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (mFadingStatus == IDLE) { 50761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (fadeIn) { 50861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mBgFadeInAnimator.start(); 50961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mControlRowFadeInAnimator.start(); 51061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mOtherRowFadeInAnimator.start(); 51161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mDescriptionFadeInAnimator.start(); 51261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } else { 51361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mBgFadeOutAnimator.start(); 51461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mControlRowFadeOutAnimator.start(); 51561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mOtherRowFadeOutAnimator.start(); 51661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mDescriptionFadeOutAnimator.start(); 51761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 51861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } else { 51961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (fadeIn) { 52061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mBgFadeOutAnimator.reverse(); 52161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mControlRowFadeOutAnimator.reverse(); 52261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mOtherRowFadeOutAnimator.reverse(); 52361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mDescriptionFadeOutAnimator.reverse(); 52461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } else { 52561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mBgFadeInAnimator.reverse(); 52661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mControlRowFadeInAnimator.reverse(); 52761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mOtherRowFadeInAnimator.reverse(); 52861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mDescriptionFadeInAnimator.reverse(); 52961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 53061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 53161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 53261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu // If fading in while control row is focused, set initial translationY so 53361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu // views slide in from below. 53461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (fadeIn && mFadingStatus == IDLE) { 53561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu final int count = getVerticalGridView().getChildCount(); 53661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu for (int i = 0; i < count; i++) { 53761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu getVerticalGridView().getChildAt(i).setTranslationY(mAnimationTranslateY); 53861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 53961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 54061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 54161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mFadingStatus = fadeIn ? IN : OUT; 54261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 54361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 54461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu /** 54561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu * Sets the list of rows for the fragment. 54661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu */ 54761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu @Override 54861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public void setAdapter(ObjectAdapter adapter) { 54961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (getAdapter() != null) { 55061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu getAdapter().unregisterObserver(mObserver); 55161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 55261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu super.setAdapter(adapter); 55361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (adapter != null) { 55461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu adapter.registerObserver(mObserver); 55561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 55661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 55761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 55861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu @Override 55961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu void setVerticalGridViewLayout(VerticalGridView listview) { 56061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (listview == null) { 56161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu return; 56261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 56361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu // Padding affects alignment when last row is focused 56461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu // (last is first when there's only one row). 56561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu setBottomPadding(listview, mPaddingBottom); 56661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 56761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu // Item alignment affects focused row that isn't the last. 56861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu listview.setItemAlignmentOffset(mAlignPosition); 56961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu listview.setItemAlignmentOffsetPercent(100); 57061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 57161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu // Push rows to the bottom. 57261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu listview.setWindowAlignmentOffset(0); 57361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu listview.setWindowAlignmentOffsetPercent(100); 57461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu listview.setWindowAlignment(VerticalGridView.WINDOW_ALIGN_HIGH_EDGE); 57561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 57661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 57761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private static void setBottomPadding(View view, int padding) { 57861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu view.setPadding(view.getPaddingLeft(), view.getPaddingTop(), 57961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu view.getPaddingRight(), padding); 58061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 58161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 58261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu @Override 58361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public void onCreate(Bundle savedInstanceState) { 58461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu super.onCreate(savedInstanceState); 58561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 58661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mAlignPosition = 58761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu getResources().getDimensionPixelSize(R.dimen.lb_playback_controls_align_bottom); 58861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mPaddingBottom = 58961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu getResources().getDimensionPixelSize(R.dimen.lb_playback_controls_padding_bottom); 59061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mBgDarkColor = 59161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu getResources().getColor(R.color.lb_playback_controls_background_dark); 59261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mBgLightColor = 59361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu getResources().getColor(R.color.lb_playback_controls_background_light); 59461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mShowTimeMs = 59561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu getResources().getInteger(R.integer.lb_playback_controls_show_time_ms); 59661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mMajorFadeTranslateY = 59761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu getResources().getDimensionPixelSize(R.dimen.lb_playback_major_fade_translate_y); 59861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mMinorFadeTranslateY = 59961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu getResources().getDimensionPixelSize(R.dimen.lb_playback_minor_fade_translate_y); 60061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 60161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu loadBgAnimator(); 60261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu loadControlRowAnimator(); 60361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu loadOtherRowAnimator(); 60461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu loadDescriptionAnimator(); 60561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 60661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 60761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu /** 60861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu * Sets the background type. 60961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu * 61061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu * @param type One of BG_LIGHT, BG_DARK, or BG_NONE. 61161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu */ 61261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public void setBackgroundType(int type) { 61361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu switch (type) { 61461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu case BG_LIGHT: 61561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu case BG_DARK: 61661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu case BG_NONE: 61761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (type != mBackgroundType) { 61861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mBackgroundType = type; 61961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu updateBackground(); 62061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 62161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu break; 62261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu default: 62361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu throw new IllegalArgumentException("Invalid background type"); 62461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 62561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 62661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 62761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu /** 62861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu * Returns the background type. 62961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu */ 63061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public int getBackgroundType() { 63161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu return mBackgroundType; 63261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 63361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 63461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private void updateBackground() { 63561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (mRootView != null) { 63661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu int color = mBgDarkColor; 63761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu switch (mBackgroundType) { 63861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu case BG_DARK: break; 63961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu case BG_LIGHT: color = mBgLightColor; break; 64061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu case BG_NONE: color = Color.TRANSPARENT; break; 64161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 64261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mRootView.setBackground(new ColorDrawable(color)); 64361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 64461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 64561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 64661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private void updateControlsBottomSpace(ItemBridgeAdapter.ViewHolder vh) { 64761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu // Add extra space between rows 0 and 1 64861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (vh == null && getVerticalGridView() != null) { 64961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu vh = (ItemBridgeAdapter.ViewHolder) 65061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu getVerticalGridView().findViewHolderForPosition(0); 65161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 65261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (vh != null && vh.getPresenter() instanceof PlaybackControlsRowPresenter) { 65361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu final int adapterSize = getAdapter() == null ? 0 : getAdapter().size(); 65461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu ((PlaybackControlsRowPresenter) vh.getPresenter()).showBottomSpace( 65561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu (PlaybackControlsRowPresenter.ViewHolder) vh.getViewHolder(), 65661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu adapterSize > 1); 65761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 65861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 65961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 66061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private final ItemBridgeAdapter.AdapterListener mAdapterListener = 66161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu new ItemBridgeAdapter.AdapterListener() { 66261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu @Override 66361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public void onAttachedToWindow(ItemBridgeAdapter.ViewHolder vh) { 66461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (DEBUG) Log.v(TAG, "onAttachedToWindow " + vh.getViewHolder().view); 66561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if ((mFadingStatus == IDLE && mBgAlpha == 0) || mFadingStatus == OUT) { 66661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (DEBUG) Log.v(TAG, "setting alpha to 0"); 66761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu vh.getViewHolder().view.setAlpha(0); 66861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 66961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (vh.getPosition() == 0 && mResetControlsToPrimaryActionsPending) { 67061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu resetControlsToPrimaryActions(vh); 67161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 67261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 67361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu @Override 67461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public void onDetachedFromWindow(ItemBridgeAdapter.ViewHolder vh) { 67561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (DEBUG) Log.v(TAG, "onDetachedFromWindow " + vh.getViewHolder().view); 67661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu // Reset animation state 67761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu vh.getViewHolder().view.setAlpha(1f); 67861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu vh.getViewHolder().view.setTranslationY(0); 67961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (vh.getViewHolder() instanceof PlaybackControlsRowPresenter.ViewHolder) { 68061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu Presenter.ViewHolder descriptionVh = ((PlaybackControlsRowPresenter.ViewHolder) 68161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu vh.getViewHolder()).mDescriptionViewHolder; 68261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (descriptionVh != null) { 68361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu descriptionVh.view.setAlpha(1f); 68461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 68561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 68661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 68761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu @Override 68861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public void onBind(ItemBridgeAdapter.ViewHolder vh) { 68961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (vh.getPosition() == 0) { 69061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu updateControlsBottomSpace(vh); 69161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 69261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 69361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu }; 69461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 69561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu @Override 69661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public View onCreateView(LayoutInflater inflater, ViewGroup container, 69761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu Bundle savedInstanceState) { 69861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mRootView = super.onCreateView(inflater, container, savedInstanceState); 69961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mBgAlpha = 255; 70061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu updateBackground(); 70161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu getRowsSupportFragment().setExternalAdapterListener(mAdapterListener); 70261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu return mRootView; 70361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 70461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 70561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu @Override 70661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public void onDestroyView() { 70761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mRootView = null; 70861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu super.onDestroyView(); 70961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 71061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 71161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private final DataObserver mObserver = new DataObserver() { 71261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public void onChanged() { 71361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu updateControlsBottomSpace(null); 71461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 71561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu }; 71661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 71761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu static abstract class AnimatorListener implements Animator.AnimatorListener { 71861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu ArrayList<View> mViews = new ArrayList<View>(); 71961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu ArrayList<Integer> mLayerType = new ArrayList<Integer>(); 72061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 72161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public void onAnimationCancel(Animator animation) { 72261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 72361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public void onAnimationRepeat(Animator animation) { 72461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 72561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public void onAnimationStart(Animator animation) { 72661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu getViews(mViews); 72761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu for (View view : mViews) { 72861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mLayerType.add(view.getLayerType()); 72961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu view.setLayerType(View.LAYER_TYPE_HARDWARE, null); 73061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 73161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 73261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public void onAnimationEnd(Animator animation) { 73361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu for (int i = 0; i < mViews.size(); i++) { 73461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mViews.get(i).setLayerType(mLayerType.get(i), null); 73561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 73661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mLayerType.clear(); 73761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mViews.clear(); 73861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 73961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu abstract void getViews(ArrayList<View> views); 74061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu }; 74161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu} 742