PlaybackOverlayFragment.java revision 1e5725d52c7ec12b184dcfce6bfafa80aed35230
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2014 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in compliance with the License. You may obtain a copy of the License at 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software distributed under the License 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or implied. See the License for the specific language governing permissions and limitations under 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the License. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.support.v17.leanback.app; 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Color; 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.drawable.ColorDrawable; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.animation.Animator; 196793fc328ab4532202d86f64fe4fdbc3fb047bc4riddle_hsuimport android.animation.AnimatorInflater; 20e23149f1555303940d212b742707518b7f9f84abWale Ogunwaleimport android.animation.TimeInterpolator; 21e23149f1555303940d212b742707518b7f9f84abWale Ogunwaleimport android.animation.ValueAnimator; 22e23149f1555303940d212b742707518b7f9f84abWale Ogunwaleimport android.animation.ValueAnimator.AnimatorUpdateListener; 23c8230519728b14065effd3b7d4eca273ff86160cDianne Hackbornimport android.content.Context; 24b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackbornimport android.os.Bundle; 2589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackbornimport android.os.Handler; 2689ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackbornimport android.os.Message; 274eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport android.support.v7.widget.RecyclerView; 284eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onoratoimport android.support.v17.leanback.R; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.support.v17.leanback.animation.LogAccelerateInterpolator; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.support.v17.leanback.animation.LogDecelerateInterpolator; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.support.v17.leanback.widget.ItemBridgeAdapter; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.support.v17.leanback.widget.ObjectAdapter; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.support.v17.leanback.widget.ObjectAdapter.DataObserver; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.support.v17.leanback.widget.VerticalGridView; 35c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackbornimport android.util.Log; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.KeyEvent; 37e2515eebf42c763c0a2d9f873a153711778cfc17Dianne Hackbornimport android.view.LayoutInflater; 385719028766f51512beffa623db7ee682851570a0Joe Onoratoimport android.view.MotionEvent; 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View; 40a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackbornimport android.view.ViewGroup; 415719028766f51512beffa623db7ee682851570a0Joe Onoratoimport android.view.animation.Interpolator; 421ebccf531d1049853b3b0630035434619682c016Dianne Hackbornimport android.view.animation.LinearInterpolator; 43cf4b2542fae9d6c5d3788c6a935824094fb1c1eaYusuke Sato 44f02b60aa4f367516f40cf3d60fffae0c6fe3e1b8Dianne Hackborn 45390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn/** 461ebccf531d1049853b3b0630035434619682c016Dianne Hackborn * A fragment for displaying playback controls and related content. 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The {@link android.support.v17.leanback.widget.PlaybackControlsRow} is expected to be 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * at position 0 in the adapter. 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class PlaybackOverlayFragment extends DetailsFragment { 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * No background. 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 55be4e6aaa0252dd7da28b7aa85beba982538efa46Dianne Hackborn public static final int BG_NONE = 0; 56e23149f1555303940d212b742707518b7f9f84abWale Ogunwale 57e23149f1555303940d212b742707518b7f9f84abWale Ogunwale /** 582cd3fb5aa71cd32cd67ddfaafaca8f85a7ac13c6Adam Lesinski * A dark translucent background. 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 60a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn public static final int BG_DARK = 1; 61a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn 62a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn /** 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A light translucent background. 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 65d23e0d6901935588f9472bd7073fea0009581e9bDianne Hackborn public static final int BG_LIGHT = 2; 66d23e0d6901935588f9472bd7073fea0009581e9bDianne Hackborn 67fee756ff91ab4d8f0e09ddb050d22d88ebb66ae7Dianne Hackborn public static class OnFadeCompleteListener { 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onFadeInComplete() { 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onFadeOutComplete() { 714eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato } 72099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn } 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 744de5a3ac6655f76b67af38712ae5aeb6d7c15938Dianne Hackborn private static final String TAG = "PlaybackOverlayFragment"; 75b3d4cb369e37b1b7e85832cc035226dc7cc8f380Dianne Hackborn private static final boolean DEBUG = false; 76b3d4cb369e37b1b7e85832cc035226dc7cc8f380Dianne Hackborn private static final int ANIMATION_MULTIPLIER = 1; 77b3d4cb369e37b1b7e85832cc035226dc7cc8f380Dianne Hackborn 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static int START_FADE_OUT = 1; 79dd71fc8baeee0d09008d0fa67d6bf3d23cf21baaDianne Hackborn 80f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn // Fading status 81f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn private static final int IDLE = 0; 82f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn private static final int IN = 1; 8335f72be50b8a2d11bce591dcdac5dc3fa336dac0Dianne Hackborn private static final int OUT = 2; 8435f72be50b8a2d11bce591dcdac5dc3fa336dac0Dianne Hackborn 85f0a44183cd49cd937bf6c4f17f20fd615e441dc4Thierry Strudel private int mAlignPosition; 863bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn private View mRootView; 87f0a44183cd49cd937bf6c4f17f20fd615e441dc4Thierry Strudel private int mBackgroundType = BG_DARK; 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mBgDarkColor; 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mBgLightColor; 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mShowTimeMs; 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mFadeTranslateY; 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private OnFadeCompleteListener mFadeCompleteListener; 934de5a3ac6655f76b67af38712ae5aeb6d7c15938Dianne Hackborn private boolean mFadingEnabled = true; 9406de2ea752171f52a4e6e6872cb3a0689e591dcbDianne Hackborn private int mFadingStatus = IDLE; 9506de2ea752171f52a4e6e6872cb3a0689e591dcbDianne Hackborn private int mBgAlpha; 96e535a5827b7b7c7c70f4701d74051c9bb5eb0b98Srinath Sridharan private ValueAnimator mBgFadeInAnimator, mBgFadeOutAnimator; 97ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn private ValueAnimator mControlRowFadeInAnimator, mControlRowFadeOutAnimator; 986793fc328ab4532202d86f64fe4fdbc3fb047bc4riddle_hsu private ValueAnimator mOtherRowFadeInAnimator, mOtherRowFadeOutAnimator; 996793fc328ab4532202d86f64fe4fdbc3fb047bc4riddle_hsu private boolean mTranslateAnimationEnabled; 1006793fc328ab4532202d86f64fe4fdbc3fb047bc4riddle_hsu private RecyclerView.ItemAnimator mItemAnimator; 1016793fc328ab4532202d86f64fe4fdbc3fb047bc4riddle_hsu 10233eb07f5759b85a5617f8057d8a335019c7d24ddTim Murray private final Animator.AnimatorListener mFadeListener = 10333eb07f5759b85a5617f8057d8a335019c7d24ddTim Murray new Animator.AnimatorListener() { 104e02c88af7935c72fb90a478375e61e4a94465587Dianne Hackborn @Override 105cbd9a52f256087426feb19ac6e51eff772e81375Dianne Hackborn public void onAnimationStart(Animator animation) { 10635f72be50b8a2d11bce591dcdac5dc3fa336dac0Dianne Hackborn enableVerticalGridAnimations(false); 107b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn } 1082286cdc0cab77e61b75e6fe9a45b91f6e57cd46dDianne Hackborn @Override 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onAnimationRepeat(Animator animation) { 110d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey } 111684bf34ee8acc41931fac23762b13e14a22011dbDianne Hackborn @Override 112c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn public void onAnimationCancel(Animator animation) { 113f0754f5ba7a45b517cffcb3c2c96f2a32aeac06dDianne Hackborn } 114d993a573d7fcf1a69d35528cae4dd96581c9aacdWale Ogunwale @Override 115d993a573d7fcf1a69d35528cae4dd96581c9aacdWale Ogunwale public void onAnimationEnd(Animator animation) { 116d993a573d7fcf1a69d35528cae4dd96581c9aacdWale Ogunwale if (DEBUG) Log.v(TAG, "onAnimationEnd " + mBgAlpha); 117d993a573d7fcf1a69d35528cae4dd96581c9aacdWale Ogunwale if (mBgAlpha > 0) { 118d993a573d7fcf1a69d35528cae4dd96581c9aacdWale Ogunwale enableVerticalGridAnimations(true); 119d993a573d7fcf1a69d35528cae4dd96581c9aacdWale Ogunwale startFadeTimer(); 120d993a573d7fcf1a69d35528cae4dd96581c9aacdWale Ogunwale if (mFadeCompleteListener != null) { 121d993a573d7fcf1a69d35528cae4dd96581c9aacdWale Ogunwale mFadeCompleteListener.onFadeInComplete(); 122d993a573d7fcf1a69d35528cae4dd96581c9aacdWale Ogunwale } 123d993a573d7fcf1a69d35528cae4dd96581c9aacdWale Ogunwale } else { 124d993a573d7fcf1a69d35528cae4dd96581c9aacdWale Ogunwale if (getVerticalGridView() != null) { 125d993a573d7fcf1a69d35528cae4dd96581c9aacdWale Ogunwale // Reset focus to the controls row 126c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn getVerticalGridView().setSelectedPosition(0); 127c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn } 128f0f94d129b6eb3c48624e915898d86d4f2de59ffDianne Hackborn if (mFadeCompleteListener != null) { 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFadeCompleteListener.onFadeOutComplete(); 13035f72be50b8a2d11bce591dcdac5dc3fa336dac0Dianne Hackborn } 131d412563922f46feb4d3c3ba1500f34bddd21d73cDianne Hackborn } 132c8230519728b14065effd3b7d4eca273ff86160cDianne Hackborn mFadingStatus = IDLE; 133ab4bb9d1fec685dab0fce9232c9a3477fab356b3Dianne Hackborn } 134bd91e2f3f6aca512a02be645b2515b5e3331e177Jeff Sharkey }; 135fcc95a6d2c749d6b77eca14bf301d665d858a840Dianne Hackborn 136ab4bb9d1fec685dab0fce9232c9a3477fab356b3Dianne Hackborn private final Handler mHandler = new Handler() { 1379357b11a798b804b69907f93437229cac1d82468Dianne Hackborn @Override 138f965f4038cfe775bfee973850d62caf3138076c8Dianne Hackborn public void handleMessage(Message message) { 139906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn if (message.what == START_FADE_OUT && mFadingEnabled) { 140906497c574d45d8dfd295b16dece0d0bc32c0895Dianne Hackborn fade(false); 1418ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn } 1421b64e0d8657463c0f7ce9b068a16a522cdfe7d28Dianne Hackborn } 143340417356d92d0db71d0692344e66886ca795dfdDianne Hackborn }; 1443f9dd287b99340efaaa257759e71a8f81b2ed113Jeff Brown 145d509bc93e6d13d46c45707d76ae95a6f735fc037yangzhenyu private final VerticalGridView.OnTouchInterceptListener mOnTouchInterceptListener = 1469adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn new VerticalGridView.OnTouchInterceptListener() { 147287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn public boolean onInterceptTouchEvent(MotionEvent event) { 148287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn return onInterceptInputEvent(); 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 150fd12af4e768fec852c4c5dfee3b9bd7403b4b347Dianne Hackborn }; 1511a40564f3c2256f683c9a145487fc21a58093dc3Dianne Hackborn 152fd12af4e768fec852c4c5dfee3b9bd7403b4b347Dianne Hackborn private final VerticalGridView.OnMotionInterceptListener mOnMotionInterceptListener = 153dd71fc8baeee0d09008d0fa67d6bf3d23cf21baaDianne Hackborn new VerticalGridView.OnMotionInterceptListener() { 154be4e6aaa0252dd7da28b7aa85beba982538efa46Dianne Hackborn public boolean onInterceptMotionEvent(MotionEvent event) { 155de42bb61ad0e4947a38bdedfba6a20b5292025c3Dianne Hackborn return onInterceptInputEvent(); 156dd9b82c283815747b75fe4434c65e4b6c9c9b54fDianne Hackborn } 157de42bb61ad0e4947a38bdedfba6a20b5292025c3Dianne Hackborn }; 158fee756ff91ab4d8f0e09ddb050d22d88ebb66ae7Dianne Hackborn 159de42bb61ad0e4947a38bdedfba6a20b5292025c3Dianne Hackborn private final VerticalGridView.OnKeyInterceptListener mOnKeyInterceptListener = 160810c052d9b117217152c2a609ccec056a2a61d1ePrimiano Tucci new VerticalGridView.OnKeyInterceptListener() { 161810c052d9b117217152c2a609ccec056a2a61d1ePrimiano Tucci public boolean onInterceptKeyEvent(KeyEvent event) { 162d23e0d6901935588f9472bd7073fea0009581e9bDianne Hackborn return onInterceptInputEvent(); 163d23e0d6901935588f9472bd7073fea0009581e9bDianne Hackborn } 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 165d23e0d6901935588f9472bd7073fea0009581e9bDianne Hackborn 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void setBgAlpha(int alpha) { 167d23e0d6901935588f9472bd7073fea0009581e9bDianne Hackborn mBgAlpha = alpha; 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mRootView != null) { 169d23e0d6901935588f9472bd7073fea0009581e9bDianne Hackborn mRootView.getBackground().setAlpha(alpha); 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 171d23e0d6901935588f9472bd7073fea0009581e9bDianne Hackborn } 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 173d23e0d6901935588f9472bd7073fea0009581e9bDianne Hackborn private void enableVerticalGridAnimations(boolean enable) { 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (getVerticalGridView() == null) { 175d23e0d6901935588f9472bd7073fea0009581e9bDianne Hackborn return; 176bf36ee2b0c49241e073da14ee1e1a08b8550f3b9Dianne Hackborn } 177bf36ee2b0c49241e073da14ee1e1a08b8550f3b9Dianne Hackborn if (enable && mItemAnimator != null) { 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getVerticalGridView().setItemAnimator(mItemAnimator); 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (!enable) { 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mItemAnimator = getVerticalGridView().getItemAnimator(); 18158d380d2af8079075e4773a3e5ca6c2820760e3dChristopher Tate getVerticalGridView().setItemAnimator(null); 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Enables or disables view fading. If enabled, 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the view will be faded in when the fragment starts, 188fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang * and will fade out after a time period. The timeout 189dd71fc8baeee0d09008d0fa67d6bf3d23cf21baaDianne Hackborn * period is reset each time {@link #tickle} is called. 190f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn * 191fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang */ 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setFadingEnabled(boolean enabled) { 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG) Log.v(TAG, "setFadingEnabled " + enabled); 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (enabled != mFadingEnabled) { 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFadingEnabled = enabled; 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (isResumed()) { 197f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski if (mFadingEnabled) { 198f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski if (mFadingStatus == IDLE && !mHandler.hasMessages(START_FADE_OUT)) { 199f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski startFadeTimer(); 200f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski } 201b5f3b5c2e5108b875fdb21726eeca41f58d59d49Amith Yamasani } else { 202b5f3b5c2e5108b875fdb21726eeca41f58d59d49Amith Yamasani // Ensure fully opaque 203a1b79bfd7a15006a93da933695359765e0fee495Felipe Leme mHandler.removeMessages(START_FADE_OUT); 204a1b79bfd7a15006a93da933695359765e0fee495Felipe Leme fade(true); 205b5f3b5c2e5108b875fdb21726eeca41f58d59d49Amith Yamasani } 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2071ebccf531d1049853b3b0630035434619682c016Dianne Hackborn } 2081ebccf531d1049853b3b0630035434619682c016Dianne Hackborn } 209a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn 210a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn /** 211a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn * Returns true if view fading is enabled. 212a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn */ 213a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn public boolean isFadingEnabled() { 214b3d4cb369e37b1b7e85832cc035226dc7cc8f380Dianne Hackborn return mFadingEnabled; 215b3d4cb369e37b1b7e85832cc035226dc7cc8f380Dianne Hackborn } 216b3d4cb369e37b1b7e85832cc035226dc7cc8f380Dianne Hackborn 217b3d4cb369e37b1b7e85832cc035226dc7cc8f380Dianne Hackborn /** 218b3d4cb369e37b1b7e85832cc035226dc7cc8f380Dianne Hackborn * Sets the listener to be called when fade in or out has completed. 219b3d4cb369e37b1b7e85832cc035226dc7cc8f380Dianne Hackborn */ 220b3d4cb369e37b1b7e85832cc035226dc7cc8f380Dianne Hackborn public void setFadeCompleteListener(OnFadeCompleteListener listener) { 221b3d4cb369e37b1b7e85832cc035226dc7cc8f380Dianne Hackborn mFadeCompleteListener = listener; 222b3d4cb369e37b1b7e85832cc035226dc7cc8f380Dianne Hackborn } 223b3d4cb369e37b1b7e85832cc035226dc7cc8f380Dianne Hackborn 224b3d4cb369e37b1b7e85832cc035226dc7cc8f380Dianne Hackborn /** 225f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn * Returns the listener to be called when fade in or out has completed. 226f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn */ 227f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn public OnFadeCompleteListener getFadeCompleteListener() { 228f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn return mFadeCompleteListener; 229f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn } 230f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn 231f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn /** 232f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn * Tickles the playback controls. Fades in the view if it was faded out, 233f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn * otherwise resets the fade out timer. Tickling on input events is handled 234f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn * by the fragment. 235cfc837f7fa43362b5049f648fe1bfdf5a010cc1cDianne Hackborn */ 236cfc837f7fa43362b5049f648fe1bfdf5a010cc1cDianne Hackborn public void tickle() { 237cfc837f7fa43362b5049f648fe1bfdf5a010cc1cDianne Hackborn if (DEBUG) Log.v(TAG, "tickle enabled " + mFadingEnabled + " isResumed " + isResumed()); 238cfc837f7fa43362b5049f648fe1bfdf5a010cc1cDianne Hackborn if (!mFadingEnabled || !isResumed()) { 239cfc837f7fa43362b5049f648fe1bfdf5a010cc1cDianne Hackborn return; 240cfc837f7fa43362b5049f648fe1bfdf5a010cc1cDianne Hackborn } 241fee756ff91ab4d8f0e09ddb050d22d88ebb66ae7Dianne Hackborn if (mHandler.hasMessages(START_FADE_OUT)) { 242fee756ff91ab4d8f0e09ddb050d22d88ebb66ae7Dianne Hackborn // Restart the timer 243fee756ff91ab4d8f0e09ddb050d22d88ebb66ae7Dianne Hackborn startFadeTimer(); 244fee756ff91ab4d8f0e09ddb050d22d88ebb66ae7Dianne Hackborn } else { 245fee756ff91ab4d8f0e09ddb050d22d88ebb66ae7Dianne Hackborn fade(true); 246fee756ff91ab4d8f0e09ddb050d22d88ebb66ae7Dianne Hackborn } 247fee756ff91ab4d8f0e09ddb050d22d88ebb66ae7Dianne Hackborn } 248fee756ff91ab4d8f0e09ddb050d22d88ebb66ae7Dianne Hackborn 2498ea5e1d79eb1f05ee7628b0d45ea8fc8eea5330dDianne Hackborn private boolean onInterceptInputEvent() { 250340417356d92d0db71d0692344e66886ca795dfdDianne Hackborn if (DEBUG) Log.v(TAG, "onInterceptInputEvent status " + mFadingStatus); 251340417356d92d0db71d0692344e66886ca795dfdDianne Hackborn boolean consumeEvent = (mFadingStatus == IDLE && mBgAlpha == 0); 252f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn tickle(); 253b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn return consumeEvent; 254f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn } 255cfc837f7fa43362b5049f648fe1bfdf5a010cc1cDianne Hackborn 2561ebccf531d1049853b3b0630035434619682c016Dianne Hackborn @Override 2571ebccf531d1049853b3b0630035434619682c016Dianne Hackborn public void onResume() { 258f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn super.onResume(); 259f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn if (mFadingEnabled) { 260f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn setBgAlpha(0); 261f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn fade(true); 262f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn } 2633bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn getVerticalGridView().setOnTouchInterceptListener(mOnTouchInterceptListener); 2643bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn getVerticalGridView().setOnMotionInterceptListener(mOnMotionInterceptListener); 265b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn getVerticalGridView().setOnKeyInterceptListener(mOnKeyInterceptListener); 266f0a44183cd49cd937bf6c4f17f20fd615e441dc4Thierry Strudel } 267b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn 268f0a44183cd49cd937bf6c4f17f20fd615e441dc4Thierry Strudel private void startFadeTimer() { 269b9a5e4ad30c9add140fd13491419ae66e947809dDianne Hackborn if (mHandler != null) { 270fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn mHandler.removeMessages(START_FADE_OUT); 271dd71fc8baeee0d09008d0fa67d6bf3d23cf21baaDianne Hackborn mHandler.sendEmptyMessageDelayed(START_FADE_OUT, mShowTimeMs); 272cbd9a52f256087426feb19ac6e51eff772e81375Dianne Hackborn } 273cbd9a52f256087426feb19ac6e51eff772e81375Dianne Hackborn } 274cbd9a52f256087426feb19ac6e51eff772e81375Dianne Hackborn 275cbd9a52f256087426feb19ac6e51eff772e81375Dianne Hackborn private static ValueAnimator loadAnimator(Context context, int resId) { 27635f72be50b8a2d11bce591dcdac5dc3fa336dac0Dianne Hackborn ValueAnimator animator = (ValueAnimator) AnimatorInflater.loadAnimator(context, resId); 27735f72be50b8a2d11bce591dcdac5dc3fa336dac0Dianne Hackborn animator.setDuration(animator.getDuration() * ANIMATION_MULTIPLIER); 2783bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn return animator; 27935f72be50b8a2d11bce591dcdac5dc3fa336dac0Dianne Hackborn } 280f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn 281f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn private void loadBgAnimator() { 282f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn AnimatorUpdateListener listener = new AnimatorUpdateListener() { 283f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn @Override 284f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn public void onAnimationUpdate(ValueAnimator arg0) { 28506de2ea752171f52a4e6e6872cb3a0689e591dcbDianne Hackborn setBgAlpha((Integer) arg0.getAnimatedValue()); 286ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn } 287c68c913d357e2955d4bd7ca52829071e531c7825Dianne Hackborn }; 288ce86ba86df61de8b34b226a4eb6c23ec33e866e0Dianne Hackborn 2899484603c0fa738b67980c18b4abfd3505778ae74Dianne Hackborn mBgFadeInAnimator = loadAnimator(getActivity(), R.animator.lb_playback_bg_fade_in); 2909484603c0fa738b67980c18b4abfd3505778ae74Dianne Hackborn mBgFadeInAnimator.addUpdateListener(listener); 2919484603c0fa738b67980c18b4abfd3505778ae74Dianne Hackborn mBgFadeInAnimator.addListener(mFadeListener); 292a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn 293c8230519728b14065effd3b7d4eca273ff86160cDianne Hackborn mBgFadeOutAnimator = loadAnimator(getActivity(), R.animator.lb_playback_bg_fade_out); 294f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn mBgFadeOutAnimator.addUpdateListener(listener); 295f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn mBgFadeOutAnimator.addListener(mFadeListener); 296f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn } 297f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn 298f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn private TimeInterpolator mLogDecelerateInterpolator = new LogDecelerateInterpolator(100,0); 299f0f94d129b6eb3c48624e915898d86d4f2de59ffDianne Hackborn private TimeInterpolator mLogAccelerateInterpolator = new LogAccelerateInterpolator(100,0); 300b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn 301b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn private void loadControlRowAnimator() { 302f0f94d129b6eb3c48624e915898d86d4f2de59ffDianne Hackborn AnimatorUpdateListener listener = new AnimatorUpdateListener() { 303f0f94d129b6eb3c48624e915898d86d4f2de59ffDianne Hackborn @Override 304b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn public void onAnimationUpdate(ValueAnimator arg0) { 305a1baf73b8e8093af775d828f643f3c3690e337a9Dianne Hackborn if (getVerticalGridView() == null) { 306a1baf73b8e8093af775d828f643f3c3690e337a9Dianne Hackborn return; 307a1baf73b8e8093af775d828f643f3c3690e337a9Dianne Hackborn } 308a1baf73b8e8093af775d828f643f3c3690e337a9Dianne Hackborn RecyclerView.ViewHolder vh = getVerticalGridView().findViewHolderForPosition(0); 309f965f4038cfe775bfee973850d62caf3138076c8Dianne Hackborn if (vh != null) { 310be68d49cdb85458e7b8143ac8ccc64f80d32e5f5Dianne Hackborn final float fraction = (Float) arg0.getAnimatedValue(); 311f965f4038cfe775bfee973850d62caf3138076c8Dianne Hackborn if (DEBUG) Log.v(TAG, "fraction " + fraction); 312b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn vh.itemView.setAlpha(fraction); 313ab4bb9d1fec685dab0fce9232c9a3477fab356b3Dianne Hackborn if (mTranslateAnimationEnabled) { 314ab4bb9d1fec685dab0fce9232c9a3477fab356b3Dianne Hackborn vh.itemView.setTranslationY((float) mFadeTranslateY * (1f - fraction)); 315ab4bb9d1fec685dab0fce9232c9a3477fab356b3Dianne Hackborn } 316fcc95a6d2c749d6b77eca14bf301d665d858a840Dianne Hackborn } 317fcc95a6d2c749d6b77eca14bf301d665d858a840Dianne Hackborn } 318fcc95a6d2c749d6b77eca14bf301d665d858a840Dianne Hackborn }; 319fcc95a6d2c749d6b77eca14bf301d665d858a840Dianne Hackborn 320ab4bb9d1fec685dab0fce9232c9a3477fab356b3Dianne Hackborn mControlRowFadeInAnimator = loadAnimator( 321ab4bb9d1fec685dab0fce9232c9a3477fab356b3Dianne Hackborn getActivity(), R.animator.lb_playback_controls_fade_in); 322ab4bb9d1fec685dab0fce9232c9a3477fab356b3Dianne Hackborn mControlRowFadeInAnimator.addUpdateListener(listener); 323ab4bb9d1fec685dab0fce9232c9a3477fab356b3Dianne Hackborn mControlRowFadeInAnimator.setInterpolator(mLogDecelerateInterpolator); 324ab4bb9d1fec685dab0fce9232c9a3477fab356b3Dianne Hackborn 325ab4bb9d1fec685dab0fce9232c9a3477fab356b3Dianne Hackborn mControlRowFadeOutAnimator = loadAnimator( 326b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn getActivity(), R.animator.lb_playback_controls_fade_out); 327b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn mControlRowFadeOutAnimator.addUpdateListener(listener); 328b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn mControlRowFadeOutAnimator.setInterpolator(mLogAccelerateInterpolator); 329b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn } 330684bf34ee8acc41931fac23762b13e14a22011dbDianne Hackborn 331db92608de9b4acccee1e3232264c9830ad300c4fDianne Hackborn private void loadOtherRowAnimator() { 332684bf34ee8acc41931fac23762b13e14a22011dbDianne Hackborn AnimatorUpdateListener listener = new AnimatorUpdateListener() { 333684bf34ee8acc41931fac23762b13e14a22011dbDianne Hackborn @Override 334b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn public void onAnimationUpdate(ValueAnimator arg0) { 3351a40564f3c2256f683c9a145487fc21a58093dc3Dianne Hackborn if (getVerticalGridView() == null) { 3361a40564f3c2256f683c9a145487fc21a58093dc3Dianne Hackborn return; 3371a40564f3c2256f683c9a145487fc21a58093dc3Dianne Hackborn } 3381a40564f3c2256f683c9a145487fc21a58093dc3Dianne Hackborn final float fraction = (Float) arg0.getAnimatedValue(); 3391a40564f3c2256f683c9a145487fc21a58093dc3Dianne Hackborn final int count = getVerticalGridView().getChildCount(); 3402286cdc0cab77e61b75e6fe9a45b91f6e57cd46dDianne Hackborn for (int i = 0; i < count; i++) { 3412286cdc0cab77e61b75e6fe9a45b91f6e57cd46dDianne Hackborn View view = getVerticalGridView().getChildAt(i); 3422286cdc0cab77e61b75e6fe9a45b91f6e57cd46dDianne Hackborn if (getVerticalGridView().getChildPosition(view) > 0) { 343fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn view.setAlpha(fraction); 344287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn if (mTranslateAnimationEnabled) { 3452cd3fb5aa71cd32cd67ddfaafaca8f85a7ac13c6Adam Lesinski view.setTranslationY((float) mFadeTranslateY * (1f - fraction)); 3462cd3fb5aa71cd32cd67ddfaafaca8f85a7ac13c6Adam Lesinski } 347287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 348287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 349287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn } 350b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn }; 351fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn 352287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn mOtherRowFadeInAnimator = loadAnimator( 353b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn getActivity(), R.animator.lb_playback_controls_fade_in); 354287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn mOtherRowFadeInAnimator.addUpdateListener(listener); 355287952c35e148811c106bc0f5036eabf20f71562Dianne Hackborn mOtherRowFadeInAnimator.setInterpolator(mLogDecelerateInterpolator); 3560d903a84d04d241a648ec429e3a0e82c712677fdDianne Hackborn 3571ebccf531d1049853b3b0630035434619682c016Dianne Hackborn mOtherRowFadeOutAnimator = loadAnimator( 3581ebccf531d1049853b3b0630035434619682c016Dianne Hackborn getActivity(), R.animator.lb_playback_controls_fade_out); 3591ebccf531d1049853b3b0630035434619682c016Dianne Hackborn mOtherRowFadeOutAnimator.addUpdateListener(listener); 3609adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mOtherRowFadeOutAnimator.setInterpolator(mLogDecelerateInterpolator); 361d412563922f46feb4d3c3ba1500f34bddd21d73cDianne Hackborn } 362d412563922f46feb4d3c3ba1500f34bddd21d73cDianne Hackborn 363d412563922f46feb4d3c3ba1500f34bddd21d73cDianne Hackborn private void fade(boolean fadeIn) { 3640c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn if (DEBUG) Log.v(TAG, "fade " + fadeIn); 365149427cd903f2100e3cc39bda41b831cd68bc553Dianne Hackborn if (getView() == null) { 366f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn return; 367f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn } 368f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn if ((fadeIn && mFadingStatus == IN) || (!fadeIn && mFadingStatus == OUT)) { 369f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn if (DEBUG) Log.v(TAG, "requested fade in progress"); 370f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn return; 371f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn } 372f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn if ((fadeIn && mBgAlpha == 255) || (!fadeIn && mBgAlpha == 0)) { 373f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski if (DEBUG) Log.v(TAG, "fade is no-op"); 374f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski return; 375f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski } 376f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 377f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski mTranslateAnimationEnabled = getVerticalGridView().getSelectedPosition() == 0; 378f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski 379f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski if (mFadingStatus == IDLE) { 380f5b9c72022f574417862e064cc0fdd8ea2d846dcJacek Surazski if (fadeIn) { 381f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn mBgFadeInAnimator.start(); 382a1b79bfd7a15006a93da933695359765e0fee495Felipe Leme mControlRowFadeInAnimator.start(); 383a1b79bfd7a15006a93da933695359765e0fee495Felipe Leme mOtherRowFadeInAnimator.start(); 384a1b79bfd7a15006a93da933695359765e0fee495Felipe Leme } else { 385f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn mBgFadeOutAnimator.start(); 3866ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn mControlRowFadeOutAnimator.start(); 3876ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn mOtherRowFadeOutAnimator.start(); 3886ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn } 3896ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn } else { 390f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn if (fadeIn) { 391f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn mBgFadeOutAnimator.reverse(); 3926ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn mControlRowFadeOutAnimator.reverse(); 393c8230519728b14065effd3b7d4eca273ff86160cDianne Hackborn mOtherRowFadeOutAnimator.reverse(); 394c8230519728b14065effd3b7d4eca273ff86160cDianne Hackborn } else { 3956ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn mBgFadeInAnimator.reverse(); 396f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn mControlRowFadeInAnimator.reverse(); 397f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn mOtherRowFadeInAnimator.reverse(); 398bf36ee2b0c49241e073da14ee1e1a08b8550f3b9Dianne Hackborn } 399bf36ee2b0c49241e073da14ee1e1a08b8550f3b9Dianne Hackborn } 400c8230519728b14065effd3b7d4eca273ff86160cDianne Hackborn 401c8230519728b14065effd3b7d4eca273ff86160cDianne Hackborn // If fading in while control row is focused, set initial translationY so 4026ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn // views slide in from below. 403f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn if (fadeIn && mFadingStatus == IDLE && mTranslateAnimationEnabled) { 404f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn final int count = getVerticalGridView().getChildCount(); 4056ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn for (int i = 0; i < count; i++) { 406c8230519728b14065effd3b7d4eca273ff86160cDianne Hackborn getVerticalGridView().getChildAt(i).setTranslationY(mFadeTranslateY); 407c8230519728b14065effd3b7d4eca273ff86160cDianne Hackborn } 4086ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn } 409f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn 410f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn mFadingStatus = fadeIn ? IN : OUT; 4116ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn } 412390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn 413390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn /** 414390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn * Sets the list of rows for the fragment. 4156ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn */ 416f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn @Override 417f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn public void setAdapter(ObjectAdapter adapter) { 4186ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn if (getAdapter() != null) { 4196ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn getAdapter().unregisterObserver(mObserver); 4206ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn } 4216ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn super.setAdapter(adapter); 422f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn if (adapter != null) { 423d509bc93e6d13d46c45707d76ae95a6f735fc037yangzhenyu adapter.registerObserver(mObserver); 424d509bc93e6d13d46c45707d76ae95a6f735fc037yangzhenyu } 425d509bc93e6d13d46c45707d76ae95a6f735fc037yangzhenyu setVerticalGridViewLayout(getVerticalGridView()); 426d509bc93e6d13d46c45707d76ae95a6f735fc037yangzhenyu } 427d509bc93e6d13d46c45707d76ae95a6f735fc037yangzhenyu 428b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn @Override 429f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn void setVerticalGridViewLayout(VerticalGridView listview) { 4306ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn if (listview == null || getAdapter() == null) { 431c8230519728b14065effd3b7d4eca273ff86160cDianne Hackborn return; 432c8230519728b14065effd3b7d4eca273ff86160cDianne Hackborn } 4336ae8d1821822296df0606c9cd1c46708cc21cb58Dianne Hackborn final int alignPosition = getAdapter().size() > 1 ? mAlignPosition : 0; 434f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn listview.setItemAlignmentOffset(alignPosition); 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project listview.setItemAlignmentOffsetPercent(100); 436fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang listview.setWindowAlignmentOffset(0); 4372cd3fb5aa71cd32cd67ddfaafaca8f85a7ac13c6Adam Lesinski listview.setWindowAlignmentOffsetPercent(100); 438be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn listview.setWindowAlignment(VerticalGridView.WINDOW_ALIGN_HIGH_EDGE); 4392cd3fb5aa71cd32cd67ddfaafaca8f85a7ac13c6Adam Lesinski } 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 441a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn @Override 442a0c283eac33dd2da72235751bbfa4f2d9898d5eaDianne Hackborn public void onCreate(Bundle savedInstanceState) { 443f02b60aa4f367516f40cf3d60fffae0c6fe3e1b8Dianne Hackborn super.onCreate(savedInstanceState); 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 445f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn mAlignPosition = 446c8230519728b14065effd3b7d4eca273ff86160cDianne Hackborn getResources().getDimensionPixelSize(R.dimen.lb_playback_controls_align_bottom); 447fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang mBgDarkColor = 4484de5a3ac6655f76b67af38712ae5aeb6d7c15938Dianne Hackborn getResources().getColor(R.color.lb_playback_controls_background_dark); 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBgLightColor = 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getResources().getColor(R.color.lb_playback_controls_background_light); 451f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn mShowTimeMs = 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getResources().getInteger(R.integer.lb_playback_controls_show_time_ms); 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFadeTranslateY = 454f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn getResources().getDimensionPixelSize(R.dimen.lb_playback_fade_translate_y); 455f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn 4564de5a3ac6655f76b67af38712ae5aeb6d7c15938Dianne Hackborn loadBgAnimator(); 457dd71fc8baeee0d09008d0fa67d6bf3d23cf21baaDianne Hackborn loadControlRowAnimator(); 458f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn loadOtherRowAnimator(); 459f210d6b75e2c0fe60b90c074ff9f615c1137f23eDianne Hackborn } 460be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn 461be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn /** 462be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn * Sets the background type. 4634eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato * 464be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn * @param type One of BG_LIGHT, BG_DARK, or BG_NONE. 465be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn */ 466be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn public void setBackgroundType(int type) { 467be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn switch (type) { 468be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn case BG_LIGHT: 4694c5c6f43dd81031c2501e35b355fad5ebbf0ab87Ronnie Leng case BG_DARK: 4708472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn case BG_NONE: 471be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn if (type != mBackgroundType) { 472be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn mBackgroundType = type; 473f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn updateBackground(); 474f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn } 475f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn break; 476be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn default: 4774c5c6f43dd81031c2501e35b355fad5ebbf0ab87Ronnie Leng throw new IllegalArgumentException("Invalid background type"); 4788472e6189cd4e0520c047bdb28457abc728b373fDianne Hackborn } 479f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn } 480f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn 481be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn /** 482be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn * Returns the background type. 483be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn */ 484be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn public int getBackgroundType() { 485be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn return mBackgroundType; 486be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn } 487be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn 48853459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn private void updateBackground() { 4894eb64fdbcf899a81d0a6a04dc3658d03d9df8247Joe Onorato if (mRootView != null) { 49053459a7020dbcd036e2d3418e35ebb96fadc29e3Dianne Hackborn int color = mBgDarkColor; 491be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn switch (mBackgroundType) { 492be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn case BG_DARK: break; 493be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn case BG_LIGHT: color = mBgLightColor; break; 494be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn case BG_NONE: color = Color.TRANSPARENT; break; 495be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn } 496be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn mRootView.setBackground(new ColorDrawable(color)); 497be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn } 498f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn } 499f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn 500f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn private final ItemBridgeAdapter.AdapterListener mAdapterListener = 501be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn new ItemBridgeAdapter.AdapterListener() { 502f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn @Override 503be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn public void onAttachedToWindow(ItemBridgeAdapter.ViewHolder vh) { 504be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn if (DEBUG) Log.v(TAG, "onAttachedToWindow " + vh.getViewHolder().view); 505be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn if ((mFadingStatus == IDLE && mBgAlpha == 0) || mFadingStatus == OUT) { 506be4c1d74a758f40de25e796a991ccfd1fe356857Dianne Hackborn if (DEBUG) Log.v(TAG, "setting alpha to 0"); 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project vh.getViewHolder().view.setAlpha(0); 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onDetachedFromWindow(ItemBridgeAdapter.ViewHolder vh) { 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG) Log.v(TAG, "onDetachedFromWindow " + vh.getViewHolder().view); 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Reset animation state 51401e4cfc47d0a2c7e7ab383d2fb23224ec52c0301Dianne Hackborn vh.getViewHolder().view.setAlpha(1f); 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project vh.getViewHolder().view.setTranslationY(0); 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 519a22d9fbe8c1cf3cb47db0bfecbd4fd84c59b6ec0Narayan Kamath @Override 520a22d9fbe8c1cf3cb47db0bfecbd4fd84c59b6ec0Narayan Kamath public View onCreateView(LayoutInflater inflater, ViewGroup container, 521a22d9fbe8c1cf3cb47db0bfecbd4fd84c59b6ec0Narayan Kamath Bundle savedInstanceState) { 522a22d9fbe8c1cf3cb47db0bfecbd4fd84c59b6ec0Narayan Kamath mRootView = super.onCreateView(inflater, container, savedInstanceState); 523a22d9fbe8c1cf3cb47db0bfecbd4fd84c59b6ec0Narayan Kamath mBgAlpha = 255; 524a22d9fbe8c1cf3cb47db0bfecbd4fd84c59b6ec0Narayan Kamath updateBackground(); 525a22d9fbe8c1cf3cb47db0bfecbd4fd84c59b6ec0Narayan Kamath getRowsFragment().setExternalAdapterListener(mAdapterListener); 526a22d9fbe8c1cf3cb47db0bfecbd4fd84c59b6ec0Narayan Kamath return mRootView; 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 529e23149f1555303940d212b742707518b7f9f84abWale Ogunwale @Override 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onDestroyView() { 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRootView = null; 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.onDestroyView(); 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 534860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final DataObserver mObserver = new DataObserver() { 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onChanged() { 537e23149f1555303940d212b742707518b7f9f84abWale Ogunwale setVerticalGridViewLayout(getVerticalGridView()); 5381b64e0d8657463c0f7ce9b068a16a522cdfe7d28Dianne Hackborn } 5391b64e0d8657463c0f7ce9b068a16a522cdfe7d28Dianne Hackborn }; 5401b64e0d8657463c0f7ce9b068a16a522cdfe7d28Dianne Hackborn} 5411b64e0d8657463c0f7ce9b068a16a522cdfe7d28Dianne Hackborn