PlaybackOverlaySupportFragment.java revision cbfc318baee2fc054af4c723bfac0fd3c28a1667
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 7961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private static final String TAG = "PlaybackOverlaySupportFragment"; 8061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private static final boolean DEBUG = false; 8161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private static final int ANIMATION_MULTIPLIER = 1; 8261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 8361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private static int START_FADE_OUT = 1; 8461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 8561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu // Fading status 8661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private static final int IDLE = 0; 8761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private static final int IN = 1; 8861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private static final int OUT = 2; 8961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 9061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private int mAlignPosition; 9161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private int mPaddingBottom; 9261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private View mRootView; 9361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private int mBackgroundType = BG_DARK; 9461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private int mBgDarkColor; 9561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private int mBgLightColor; 9661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private int mShowTimeMs; 9761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private int mMajorFadeTranslateY, mMinorFadeTranslateY; 9861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private int mAnimationTranslateY; 9961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private OnFadeCompleteListener mFadeCompleteListener; 10061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private boolean mFadingEnabled = true; 10161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private int mFadingStatus = IDLE; 10261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private int mBgAlpha; 10361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private ValueAnimator mBgFadeInAnimator, mBgFadeOutAnimator; 10461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private ValueAnimator mControlRowFadeInAnimator, mControlRowFadeOutAnimator; 10561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private ValueAnimator mDescriptionFadeInAnimator, mDescriptionFadeOutAnimator; 10661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private ValueAnimator mOtherRowFadeInAnimator, mOtherRowFadeOutAnimator; 10761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private boolean mTranslateAnimationEnabled; 10861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private boolean mResetControlsToPrimaryActionsPending; 10961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private RecyclerView.ItemAnimator mItemAnimator; 11061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 11161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private final Animator.AnimatorListener mFadeListener = 11261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu new Animator.AnimatorListener() { 11361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu @Override 11461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public void onAnimationStart(Animator animation) { 11561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu enableVerticalGridAnimations(false); 11661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 11761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu @Override 11861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public void onAnimationRepeat(Animator animation) { 11961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 12061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu @Override 12161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public void onAnimationCancel(Animator animation) { 12261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 12361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu @Override 12461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public void onAnimationEnd(Animator animation) { 12561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (DEBUG) Log.v(TAG, "onAnimationEnd " + mBgAlpha); 12661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (mBgAlpha > 0) { 12761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu enableVerticalGridAnimations(true); 12861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu startFadeTimer(); 12961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (mFadeCompleteListener != null) { 13061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mFadeCompleteListener.onFadeInComplete(); 13161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 13261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } else { 13361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (getVerticalGridView() != null) { 13461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu // Reset focus to the controls row 13561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu getVerticalGridView().setSelectedPosition(0); 13661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu resetControlsToPrimaryActions(null); 13761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 13861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (mFadeCompleteListener != null) { 13961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mFadeCompleteListener.onFadeOutComplete(); 14061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 14161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 14261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mFadingStatus = IDLE; 14361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 14461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu }; 14561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 14661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private final Handler mHandler = new Handler() { 14761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu @Override 14861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public void handleMessage(Message message) { 14961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (message.what == START_FADE_OUT && mFadingEnabled) { 15061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu fade(false); 15161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 15261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 15361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu }; 15461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 15561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private final VerticalGridView.OnTouchInterceptListener mOnTouchInterceptListener = 15661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu new VerticalGridView.OnTouchInterceptListener() { 15761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public boolean onInterceptTouchEvent(MotionEvent event) { 158cbfc318baee2fc054af4c723bfac0fd3c28a1667Craig Stout return onInterceptInputEvent(event); 15961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 16061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu }; 16161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 16261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private final VerticalGridView.OnMotionInterceptListener mOnMotionInterceptListener = 16361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu new VerticalGridView.OnMotionInterceptListener() { 16461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public boolean onInterceptMotionEvent(MotionEvent event) { 165cbfc318baee2fc054af4c723bfac0fd3c28a1667Craig Stout return onInterceptInputEvent(event); 16661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 16761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu }; 16861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 16961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private final VerticalGridView.OnKeyInterceptListener mOnKeyInterceptListener = 17061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu new VerticalGridView.OnKeyInterceptListener() { 17161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public boolean onInterceptKeyEvent(KeyEvent event) { 172cbfc318baee2fc054af4c723bfac0fd3c28a1667Craig Stout return onInterceptInputEvent(event); 17361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 17461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu }; 17561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 17661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private void setBgAlpha(int alpha) { 17761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mBgAlpha = alpha; 17861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (mRootView != null) { 17961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mRootView.getBackground().setAlpha(alpha); 18061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 18161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 18261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 18361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private void enableVerticalGridAnimations(boolean enable) { 18461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (getVerticalGridView() != null) { 18561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu getVerticalGridView().setAnimateChildLayout(enable); 18661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 18761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 18861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 18961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private void resetControlsToPrimaryActions(ItemBridgeAdapter.ViewHolder vh) { 19061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (vh == null && getVerticalGridView() != null) { 19161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu vh = (ItemBridgeAdapter.ViewHolder) getVerticalGridView().findViewHolderForPosition(0); 19261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 19361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (vh == null) { 19461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mResetControlsToPrimaryActionsPending = true; 19561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } else if (vh.getPresenter() instanceof PlaybackControlsRowPresenter) { 19661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mResetControlsToPrimaryActionsPending = false; 19761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu ((PlaybackControlsRowPresenter) vh.getPresenter()).showPrimaryActions( 19861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu (PlaybackControlsRowPresenter.ViewHolder) vh.getViewHolder()); 19961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 20061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 20161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 20261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu /** 20361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu * Enables or disables view fading. If enabled, 20461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu * the view will be faded in when the fragment starts, 20561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu * and will fade out after a time period. The timeout 20661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu * period is reset each time {@link #tickle} is called. 20761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu * 20861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu */ 20961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public void setFadingEnabled(boolean enabled) { 21061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (DEBUG) Log.v(TAG, "setFadingEnabled " + enabled); 21161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (enabled != mFadingEnabled) { 21261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mFadingEnabled = enabled; 21361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (isResumed()) { 21461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (mFadingEnabled) { 21561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (mFadingStatus == IDLE && !mHandler.hasMessages(START_FADE_OUT)) { 21661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu startFadeTimer(); 21761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 21861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } else { 21961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu // Ensure fully opaque 22061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mHandler.removeMessages(START_FADE_OUT); 22161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu fade(true); 22261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 22361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 22461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 22561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 22661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 22761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu /** 22861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu * Returns true if view fading is enabled. 22961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu */ 23061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public boolean isFadingEnabled() { 23161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu return mFadingEnabled; 23261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 23361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 23461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu /** 23561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu * Sets the listener to be called when fade in or out has completed. 23661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu */ 23761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public void setFadeCompleteListener(OnFadeCompleteListener listener) { 23861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mFadeCompleteListener = listener; 23961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 24061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 24161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu /** 24261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu * Returns the listener to be called when fade in or out has completed. 24361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu */ 24461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public OnFadeCompleteListener getFadeCompleteListener() { 24561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu return mFadeCompleteListener; 24661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 24761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 24861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu /** 24961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu * Tickles the playback controls. Fades in the view if it was faded out, 25061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu * otherwise resets the fade out timer. Tickling on input events is handled 25161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu * by the fragment. 25261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu */ 25361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public void tickle() { 25461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (DEBUG) Log.v(TAG, "tickle enabled " + mFadingEnabled + " isResumed " + isResumed()); 25561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (!mFadingEnabled || !isResumed()) { 25661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu return; 25761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 25861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (mHandler.hasMessages(START_FADE_OUT)) { 25961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu // Restart the timer 26061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu startFadeTimer(); 26161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } else { 26261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu fade(true); 26361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 26461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 26561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 266cbfc318baee2fc054af4c723bfac0fd3c28a1667Craig Stout private static boolean isConsumableKey(KeyEvent keyEvent) { 267cbfc318baee2fc054af4c723bfac0fd3c28a1667Craig Stout if (keyEvent.isSystem()) { 268cbfc318baee2fc054af4c723bfac0fd3c28a1667Craig Stout return false; 269cbfc318baee2fc054af4c723bfac0fd3c28a1667Craig Stout } 270cbfc318baee2fc054af4c723bfac0fd3c28a1667Craig Stout return true; 271cbfc318baee2fc054af4c723bfac0fd3c28a1667Craig Stout } 272cbfc318baee2fc054af4c723bfac0fd3c28a1667Craig Stout 273cbfc318baee2fc054af4c723bfac0fd3c28a1667Craig Stout private boolean onInterceptInputEvent(InputEvent event) { 274cbfc318baee2fc054af4c723bfac0fd3c28a1667Craig Stout if (DEBUG) Log.v(TAG, "onInterceptInputEvent status " + mFadingStatus + " event " + event); 27561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu boolean consumeEvent = (mFadingStatus == IDLE && mBgAlpha == 0); 276cbfc318baee2fc054af4c723bfac0fd3c28a1667Craig Stout if (event instanceof KeyEvent) { 277cbfc318baee2fc054af4c723bfac0fd3c28a1667Craig Stout if (consumeEvent) { 278cbfc318baee2fc054af4c723bfac0fd3c28a1667Craig Stout consumeEvent = isConsumableKey((KeyEvent) event); 279cbfc318baee2fc054af4c723bfac0fd3c28a1667Craig Stout } 280cbfc318baee2fc054af4c723bfac0fd3c28a1667Craig Stout int keyCode = ((KeyEvent) event).getKeyCode(); 281cbfc318baee2fc054af4c723bfac0fd3c28a1667Craig Stout // Back key typically means we're leaving the fragment 282cbfc318baee2fc054af4c723bfac0fd3c28a1667Craig Stout if (keyCode != KeyEvent.KEYCODE_BACK) { 283cbfc318baee2fc054af4c723bfac0fd3c28a1667Craig Stout tickle(); 284cbfc318baee2fc054af4c723bfac0fd3c28a1667Craig Stout } 285cbfc318baee2fc054af4c723bfac0fd3c28a1667Craig Stout } else { 286cbfc318baee2fc054af4c723bfac0fd3c28a1667Craig Stout tickle(); 287cbfc318baee2fc054af4c723bfac0fd3c28a1667Craig Stout } 28861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu return consumeEvent; 28961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 29061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 29161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu @Override 29261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public void onResume() { 29361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu super.onResume(); 29461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (mFadingEnabled) { 29561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu setBgAlpha(0); 29661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu fade(true); 29761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 29861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu getVerticalGridView().setOnTouchInterceptListener(mOnTouchInterceptListener); 29961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu getVerticalGridView().setOnMotionInterceptListener(mOnMotionInterceptListener); 30061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu getVerticalGridView().setOnKeyInterceptListener(mOnKeyInterceptListener); 30161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 30261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 30361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private void startFadeTimer() { 30461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (mHandler != null) { 30561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mHandler.removeMessages(START_FADE_OUT); 30661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mHandler.sendEmptyMessageDelayed(START_FADE_OUT, mShowTimeMs); 30761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 30861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 30961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 31061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private static ValueAnimator loadAnimator(Context context, int resId) { 31161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu ValueAnimator animator = (ValueAnimator) AnimatorInflater.loadAnimator(context, resId); 31261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu animator.setDuration(animator.getDuration() * ANIMATION_MULTIPLIER); 31361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu return animator; 31461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 31561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 31661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private void loadBgAnimator() { 31761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu AnimatorUpdateListener listener = new AnimatorUpdateListener() { 31861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu @Override 31961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public void onAnimationUpdate(ValueAnimator arg0) { 32061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu setBgAlpha((Integer) arg0.getAnimatedValue()); 32161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 32261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu }; 32361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 32461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mBgFadeInAnimator = loadAnimator(getActivity(), R.animator.lb_playback_bg_fade_in); 32561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mBgFadeInAnimator.addUpdateListener(listener); 32661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mBgFadeInAnimator.addListener(mFadeListener); 32761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 32861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mBgFadeOutAnimator = loadAnimator(getActivity(), R.animator.lb_playback_bg_fade_out); 32961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mBgFadeOutAnimator.addUpdateListener(listener); 33061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mBgFadeOutAnimator.addListener(mFadeListener); 33161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 33261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 33361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private TimeInterpolator mLogDecelerateInterpolator = new LogDecelerateInterpolator(100,0); 33461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private TimeInterpolator mLogAccelerateInterpolator = new LogAccelerateInterpolator(100,0); 33561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 33661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private View getControlRowView() { 33761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (getVerticalGridView() == null) { 33861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu return null; 33961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 34061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu RecyclerView.ViewHolder vh = getVerticalGridView().findViewHolderForPosition(0); 34161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (vh == null) { 34261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu return null; 34361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 34461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu return vh.itemView; 34561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 34661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 34761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private void loadControlRowAnimator() { 34861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu final AnimatorListener listener = new AnimatorListener() { 34961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu @Override 35061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu void getViews(ArrayList<View> views) { 35161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu View view = getControlRowView(); 35261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (view != null) { 35361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu views.add(view); 35461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 35561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 35661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu }; 35761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu final AnimatorUpdateListener updateListener = new AnimatorUpdateListener() { 35861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu @Override 35961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public void onAnimationUpdate(ValueAnimator arg0) { 36061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu View view = getControlRowView(); 36161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (view != null) { 36261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu final float fraction = (Float) arg0.getAnimatedValue(); 36361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (DEBUG) Log.v(TAG, "fraction " + fraction); 36461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu view.setAlpha(fraction); 36561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu view.setTranslationY((float) mAnimationTranslateY * (1f - fraction)); 36661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 36761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 36861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu }; 36961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 37061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mControlRowFadeInAnimator = loadAnimator( 37161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu getActivity(), R.animator.lb_playback_controls_fade_in); 37261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mControlRowFadeInAnimator.addUpdateListener(updateListener); 37361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mControlRowFadeInAnimator.addListener(listener); 37461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mControlRowFadeInAnimator.setInterpolator(mLogDecelerateInterpolator); 37561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 37661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mControlRowFadeOutAnimator = loadAnimator( 37761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu getActivity(), R.animator.lb_playback_controls_fade_out); 37861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mControlRowFadeOutAnimator.addUpdateListener(updateListener); 37961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mControlRowFadeOutAnimator.addListener(listener); 38061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mControlRowFadeOutAnimator.setInterpolator(mLogAccelerateInterpolator); 38161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 38261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 38361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private void loadOtherRowAnimator() { 38461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu final AnimatorListener listener = new AnimatorListener() { 38561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu @Override 38661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu void getViews(ArrayList<View> views) { 38761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (getVerticalGridView() == null) { 38861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu return; 38961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 39061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu final int count = getVerticalGridView().getChildCount(); 39161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu for (int i = 0; i < count; i++) { 39261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu View view = getVerticalGridView().getChildAt(i); 39361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (view != null) { 39461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu views.add(view); 39561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 39661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 39761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 39861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu }; 39961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu final AnimatorUpdateListener updateListener = new AnimatorUpdateListener() { 40061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu @Override 40161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public void onAnimationUpdate(ValueAnimator arg0) { 40261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu final float fraction = (Float) arg0.getAnimatedValue(); 40361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu for (View view : listener.mViews) { 40461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (getVerticalGridView().getChildPosition(view) > 0) { 40561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu view.setAlpha(fraction); 40661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu view.setTranslationY((float) mAnimationTranslateY * (1f - fraction)); 40761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 40861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 40961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 41061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu }; 41161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 41261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mOtherRowFadeInAnimator = loadAnimator( 41361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu getActivity(), R.animator.lb_playback_controls_fade_in); 41461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mOtherRowFadeInAnimator.addListener(listener); 41561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mOtherRowFadeInAnimator.addUpdateListener(updateListener); 41661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mOtherRowFadeInAnimator.setInterpolator(mLogDecelerateInterpolator); 41761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 41861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mOtherRowFadeOutAnimator = loadAnimator( 41961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu getActivity(), R.animator.lb_playback_controls_fade_out); 42061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mOtherRowFadeOutAnimator.addListener(listener); 42161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mOtherRowFadeOutAnimator.addUpdateListener(updateListener); 42261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mOtherRowFadeOutAnimator.setInterpolator(new AccelerateInterpolator()); 42361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 42461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 42561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private void loadDescriptionAnimator() { 42661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu AnimatorUpdateListener listener = new AnimatorUpdateListener() { 42761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu @Override 42861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public void onAnimationUpdate(ValueAnimator arg0) { 42961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (getVerticalGridView() == null) { 43061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu return; 43161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 43261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu ItemBridgeAdapter.ViewHolder adapterVh = (ItemBridgeAdapter.ViewHolder) 43361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu getVerticalGridView().findViewHolderForPosition(0); 43461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (adapterVh != null && adapterVh.getViewHolder() 43561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu instanceof PlaybackControlsRowPresenter.ViewHolder) { 43661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu final Presenter.ViewHolder vh = ((PlaybackControlsRowPresenter.ViewHolder) 43761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu adapterVh.getViewHolder()).mDescriptionViewHolder; 43861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (vh != null) { 43961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu vh.view.setAlpha((Float) arg0.getAnimatedValue()); 44061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 44161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 44261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 44361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu }; 44461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 44561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mDescriptionFadeInAnimator = loadAnimator( 44661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu getActivity(), R.animator.lb_playback_description_fade_in); 44761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mDescriptionFadeInAnimator.addUpdateListener(listener); 44861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mDescriptionFadeInAnimator.setInterpolator(mLogDecelerateInterpolator); 44961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 45061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mDescriptionFadeOutAnimator = loadAnimator( 45161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu getActivity(), R.animator.lb_playback_description_fade_out); 45261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mDescriptionFadeOutAnimator.addUpdateListener(listener); 45361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 45461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 45561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private void fade(boolean fadeIn) { 45661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (DEBUG) Log.v(TAG, "fade " + fadeIn); 45761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (getView() == null) { 45861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu return; 45961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 46061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if ((fadeIn && mFadingStatus == IN) || (!fadeIn && mFadingStatus == OUT)) { 46161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (DEBUG) Log.v(TAG, "requested fade in progress"); 46261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu return; 46361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 46461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if ((fadeIn && mBgAlpha == 255) || (!fadeIn && mBgAlpha == 0)) { 46561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (DEBUG) Log.v(TAG, "fade is no-op"); 46661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu return; 46761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 46861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 46961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mAnimationTranslateY = getVerticalGridView().getSelectedPosition() == 0 ? 47061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mMajorFadeTranslateY : mMinorFadeTranslateY; 47161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 47261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (mFadingStatus == IDLE) { 47361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (fadeIn) { 47461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mBgFadeInAnimator.start(); 47561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mControlRowFadeInAnimator.start(); 47661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mOtherRowFadeInAnimator.start(); 47761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mDescriptionFadeInAnimator.start(); 47861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } else { 47961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mBgFadeOutAnimator.start(); 48061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mControlRowFadeOutAnimator.start(); 48161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mOtherRowFadeOutAnimator.start(); 48261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mDescriptionFadeOutAnimator.start(); 48361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 48461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } else { 48561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (fadeIn) { 48661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mBgFadeOutAnimator.reverse(); 48761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mControlRowFadeOutAnimator.reverse(); 48861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mOtherRowFadeOutAnimator.reverse(); 48961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mDescriptionFadeOutAnimator.reverse(); 49061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } else { 49161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mBgFadeInAnimator.reverse(); 49261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mControlRowFadeInAnimator.reverse(); 49361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mOtherRowFadeInAnimator.reverse(); 49461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mDescriptionFadeInAnimator.reverse(); 49561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 49661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 49761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 49861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu // If fading in while control row is focused, set initial translationY so 49961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu // views slide in from below. 50061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (fadeIn && mFadingStatus == IDLE) { 50161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu final int count = getVerticalGridView().getChildCount(); 50261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu for (int i = 0; i < count; i++) { 50361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu getVerticalGridView().getChildAt(i).setTranslationY(mAnimationTranslateY); 50461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 50561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 50661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 50761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mFadingStatus = fadeIn ? IN : OUT; 50861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 50961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 51061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu /** 51161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu * Sets the list of rows for the fragment. 51261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu */ 51361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu @Override 51461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public void setAdapter(ObjectAdapter adapter) { 51561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (getAdapter() != null) { 51661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu getAdapter().unregisterObserver(mObserver); 51761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 51861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu super.setAdapter(adapter); 51961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (adapter != null) { 52061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu adapter.registerObserver(mObserver); 52161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 52261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 52361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 52461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu @Override 52561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu void setVerticalGridViewLayout(VerticalGridView listview) { 52661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (listview == null) { 52761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu return; 52861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 52961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu // Padding affects alignment when last row is focused 53061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu // (last is first when there's only one row). 53161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu setBottomPadding(listview, mPaddingBottom); 53261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 53361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu // Item alignment affects focused row that isn't the last. 53461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu listview.setItemAlignmentOffset(mAlignPosition); 53561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu listview.setItemAlignmentOffsetPercent(100); 53661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 53761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu // Push rows to the bottom. 53861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu listview.setWindowAlignmentOffset(0); 53961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu listview.setWindowAlignmentOffsetPercent(100); 54061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu listview.setWindowAlignment(VerticalGridView.WINDOW_ALIGN_HIGH_EDGE); 54161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 54261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 54361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private static void setBottomPadding(View view, int padding) { 54461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu view.setPadding(view.getPaddingLeft(), view.getPaddingTop(), 54561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu view.getPaddingRight(), padding); 54661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 54761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 54861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu @Override 54961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public void onCreate(Bundle savedInstanceState) { 55061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu super.onCreate(savedInstanceState); 55161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 55261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mAlignPosition = 55361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu getResources().getDimensionPixelSize(R.dimen.lb_playback_controls_align_bottom); 55461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mPaddingBottom = 55561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu getResources().getDimensionPixelSize(R.dimen.lb_playback_controls_padding_bottom); 55661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mBgDarkColor = 55761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu getResources().getColor(R.color.lb_playback_controls_background_dark); 55861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mBgLightColor = 55961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu getResources().getColor(R.color.lb_playback_controls_background_light); 56061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mShowTimeMs = 56161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu getResources().getInteger(R.integer.lb_playback_controls_show_time_ms); 56261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mMajorFadeTranslateY = 56361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu getResources().getDimensionPixelSize(R.dimen.lb_playback_major_fade_translate_y); 56461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mMinorFadeTranslateY = 56561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu getResources().getDimensionPixelSize(R.dimen.lb_playback_minor_fade_translate_y); 56661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 56761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu loadBgAnimator(); 56861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu loadControlRowAnimator(); 56961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu loadOtherRowAnimator(); 57061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu loadDescriptionAnimator(); 57161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 57261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 57361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu /** 57461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu * Sets the background type. 57561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu * 57661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu * @param type One of BG_LIGHT, BG_DARK, or BG_NONE. 57761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu */ 57861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public void setBackgroundType(int type) { 57961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu switch (type) { 58061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu case BG_LIGHT: 58161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu case BG_DARK: 58261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu case BG_NONE: 58361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (type != mBackgroundType) { 58461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mBackgroundType = type; 58561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu updateBackground(); 58661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 58761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu break; 58861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu default: 58961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu throw new IllegalArgumentException("Invalid background type"); 59061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 59161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 59261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 59361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu /** 59461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu * Returns the background type. 59561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu */ 59661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public int getBackgroundType() { 59761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu return mBackgroundType; 59861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 59961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 60061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private void updateBackground() { 60161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (mRootView != null) { 60261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu int color = mBgDarkColor; 60361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu switch (mBackgroundType) { 60461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu case BG_DARK: break; 60561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu case BG_LIGHT: color = mBgLightColor; break; 60661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu case BG_NONE: color = Color.TRANSPARENT; break; 60761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 60861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mRootView.setBackground(new ColorDrawable(color)); 60961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 61061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 61161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 61261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private void updateControlsBottomSpace(ItemBridgeAdapter.ViewHolder vh) { 61361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu // Add extra space between rows 0 and 1 61461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (vh == null && getVerticalGridView() != null) { 61561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu vh = (ItemBridgeAdapter.ViewHolder) 61661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu getVerticalGridView().findViewHolderForPosition(0); 61761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 61861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (vh != null && vh.getPresenter() instanceof PlaybackControlsRowPresenter) { 61961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu final int adapterSize = getAdapter() == null ? 0 : getAdapter().size(); 62061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu ((PlaybackControlsRowPresenter) vh.getPresenter()).showBottomSpace( 62161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu (PlaybackControlsRowPresenter.ViewHolder) vh.getViewHolder(), 62261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu adapterSize > 1); 62361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 62461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 62561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 62661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private final ItemBridgeAdapter.AdapterListener mAdapterListener = 62761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu new ItemBridgeAdapter.AdapterListener() { 62861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu @Override 62961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public void onAttachedToWindow(ItemBridgeAdapter.ViewHolder vh) { 63061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (DEBUG) Log.v(TAG, "onAttachedToWindow " + vh.getViewHolder().view); 63161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if ((mFadingStatus == IDLE && mBgAlpha == 0) || mFadingStatus == OUT) { 63261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (DEBUG) Log.v(TAG, "setting alpha to 0"); 63361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu vh.getViewHolder().view.setAlpha(0); 63461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 63561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (vh.getPosition() == 0 && mResetControlsToPrimaryActionsPending) { 63661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu resetControlsToPrimaryActions(vh); 63761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 63861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 63961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu @Override 64061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public void onDetachedFromWindow(ItemBridgeAdapter.ViewHolder vh) { 64161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (DEBUG) Log.v(TAG, "onDetachedFromWindow " + vh.getViewHolder().view); 64261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu // Reset animation state 64361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu vh.getViewHolder().view.setAlpha(1f); 64461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu vh.getViewHolder().view.setTranslationY(0); 64561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (vh.getViewHolder() instanceof PlaybackControlsRowPresenter.ViewHolder) { 64661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu Presenter.ViewHolder descriptionVh = ((PlaybackControlsRowPresenter.ViewHolder) 64761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu vh.getViewHolder()).mDescriptionViewHolder; 64861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (descriptionVh != null) { 64961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu descriptionVh.view.setAlpha(1f); 65061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 65161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 65261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 65361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu @Override 65461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public void onBind(ItemBridgeAdapter.ViewHolder vh) { 65561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu if (vh.getPosition() == 0) { 65661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu updateControlsBottomSpace(vh); 65761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 65861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 65961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu }; 66061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 66161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu @Override 66261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public View onCreateView(LayoutInflater inflater, ViewGroup container, 66361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu Bundle savedInstanceState) { 66461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mRootView = super.onCreateView(inflater, container, savedInstanceState); 66561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mBgAlpha = 255; 66661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu updateBackground(); 66761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu getRowsSupportFragment().setExternalAdapterListener(mAdapterListener); 66861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu return mRootView; 66961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 67061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 67161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu @Override 67261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public void onDestroyView() { 67361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mRootView = null; 67461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu super.onDestroyView(); 67561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 67661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 67761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu private final DataObserver mObserver = new DataObserver() { 67861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public void onChanged() { 67961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu updateControlsBottomSpace(null); 68061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 68161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu }; 68261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 68361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu static abstract class AnimatorListener implements Animator.AnimatorListener { 68461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu ArrayList<View> mViews = new ArrayList<View>(); 68561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu ArrayList<Integer> mLayerType = new ArrayList<Integer>(); 68661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu 68761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public void onAnimationCancel(Animator animation) { 68861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 68961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public void onAnimationRepeat(Animator animation) { 69061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 69161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public void onAnimationStart(Animator animation) { 69261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu getViews(mViews); 69361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu for (View view : mViews) { 69461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mLayerType.add(view.getLayerType()); 69561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu view.setLayerType(View.LAYER_TYPE_HARDWARE, null); 69661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 69761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 69861905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu public void onAnimationEnd(Animator animation) { 69961905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu for (int i = 0; i < mViews.size(); i++) { 70061905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mViews.get(i).setLayerType(mLayerType.get(i), null); 70161905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 70261905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mLayerType.clear(); 70361905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu mViews.clear(); 70461905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu } 70561905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu abstract void getViews(ArrayList<View> views); 70661905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu }; 70761905b0b52c50018dcaebcd79699c39b8f28d622Dake Gu} 708