diff --git a/packages/SystemUI/res/anim/tv_pip_controls_buttons_in_recents_focus_lose_animation.xml b/packages/SystemUI/res/anim/tv_pip_controls_buttons_in_recents_focus_lose_animation.xml deleted file mode 100644 index 95499bd38977c..0000000000000 --- a/packages/SystemUI/res/anim/tv_pip_controls_buttons_in_recents_focus_lose_animation.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - diff --git a/packages/SystemUI/res/anim/tv_pip_controls_in_recents_focus_gain_animation.xml b/packages/SystemUI/res/anim/tv_pip_controls_in_recents_focus_gain_animation.xml index 7555bdda8b64c..52e3a041d717b 100644 --- a/packages/SystemUI/res/anim/tv_pip_controls_in_recents_focus_gain_animation.xml +++ b/packages/SystemUI/res/anim/tv_pip_controls_in_recents_focus_gain_animation.xml @@ -14,8 +14,21 @@ limitations under the License. --> - + + + + + + diff --git a/packages/SystemUI/res/anim/tv_pip_controls_in_recents_focus_lose_animation.xml b/packages/SystemUI/res/anim/tv_pip_controls_in_recents_focus_lose_animation.xml index b40ccd467bec4..b571aa569f0da 100644 --- a/packages/SystemUI/res/anim/tv_pip_controls_in_recents_focus_lose_animation.xml +++ b/packages/SystemUI/res/anim/tv_pip_controls_in_recents_focus_lose_animation.xml @@ -14,8 +14,21 @@ limitations under the License. --> - + + + + + + diff --git a/packages/SystemUI/res/anim/tv_pip_controls_buttons_in_recents_focus_gain_animation.xml b/packages/SystemUI/res/anim/tv_pip_controls_in_recents_scrim_fade_in_animation.xml similarity index 55% rename from packages/SystemUI/res/anim/tv_pip_controls_buttons_in_recents_focus_gain_animation.xml rename to packages/SystemUI/res/anim/tv_pip_controls_in_recents_scrim_fade_in_animation.xml index ebc6a4a74a850..257bf35c8e766 100644 --- a/packages/SystemUI/res/anim/tv_pip_controls_buttons_in_recents_focus_gain_animation.xml +++ b/packages/SystemUI/res/anim/tv_pip_controls_in_recents_scrim_fade_in_animation.xml @@ -14,16 +14,8 @@ limitations under the License. --> - - - - - + diff --git a/packages/SystemUI/res/drawable/tv_pip_recents_overlay_scrim.xml b/packages/SystemUI/res/drawable/tv_pip_recents_overlay_scrim.xml new file mode 100644 index 0000000000000..57bee75165ee7 --- /dev/null +++ b/packages/SystemUI/res/drawable/tv_pip_recents_overlay_scrim.xml @@ -0,0 +1,23 @@ + + + + + diff --git a/packages/SystemUI/res/layout/tv_pip_recents_overlay.xml b/packages/SystemUI/res/layout/tv_pip_recents_overlay.xml index 4a67000f54179..557bbe66b29ba 100644 --- a/packages/SystemUI/res/layout/tv_pip_recents_overlay.xml +++ b/packages/SystemUI/res/layout/tv_pip_recents_overlay.xml @@ -16,14 +16,31 @@ + android:layout_height="wrap_content" + android:gravity="top|center_horizontal" + android:orientation="vertical"> + android:layout_height="wrap_content" + android:layout_gravity="center_horizontal" + android:clipToPadding="false"> + + + + 1dip 12sp - - 10dp - 3dp diff --git a/packages/SystemUI/src/com/android/systemui/tv/pip/PipControlsView.java b/packages/SystemUI/src/com/android/systemui/tv/pip/PipControlsView.java index d15799cbc8ac4..5614bf9c566be 100644 --- a/packages/SystemUI/src/com/android/systemui/tv/pip/PipControlsView.java +++ b/packages/SystemUI/src/com/android/systemui/tv/pip/PipControlsView.java @@ -57,9 +57,9 @@ public class PipControlsView extends LinearLayout { final PipManager mPipManager = PipManager.getInstance(); Listener mListener; - PipControlButtonView mFullButtonView; - PipControlButtonView mCloseButtonView; - PipControlButtonView mPlayPauseButtonView; + private PipControlButtonView mFullButtonView; + private PipControlButtonView mCloseButtonView; + private PipControlButtonView mPlayPauseButtonView; private boolean mHasFocus; private OnFocusChangeListener mOnChildFocusChangeListener; diff --git a/packages/SystemUI/src/com/android/systemui/tv/pip/PipRecentsControlsView.java b/packages/SystemUI/src/com/android/systemui/tv/pip/PipRecentsControlsView.java index 9c806f7ce59e7..df44dc1c23621 100644 --- a/packages/SystemUI/src/com/android/systemui/tv/pip/PipRecentsControlsView.java +++ b/packages/SystemUI/src/com/android/systemui/tv/pip/PipRecentsControlsView.java @@ -18,14 +18,15 @@ package com.android.systemui.tv.pip; import android.animation.Animator; import android.animation.AnimatorInflater; +import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; import android.content.Context; import android.graphics.Rect; import android.util.AttributeSet; -import android.util.Log; import android.view.KeyEvent; import android.view.View; import android.view.View.OnFocusChangeListener; +import android.widget.FrameLayout; import com.android.systemui.R; @@ -34,9 +35,9 @@ import static com.android.systemui.tv.pip.PipManager.PLAYBACK_STATE_PAUSED; import static com.android.systemui.tv.pip.PipManager.PLAYBACK_STATE_UNAVAILABLE; /** - * An extended version of {@link PipControlsView} that supports animation in Recents. + * An FrameLayout that contains {@link PipControlsView} with its scrim. */ -public class PipRecentsControlsView extends PipControlsView { +public class PipRecentsControlsView extends FrameLayout { /** * An interface to listen user action. */ @@ -47,7 +48,11 @@ public class PipRecentsControlsView extends PipControlsView { abstract void onBackPressed(); } - private AnimatorSet mFocusGainAnimatorSet; + final PipManager mPipManager = PipManager.getInstance(); + private Listener mListener; + private PipControlsView mPipControlsView; + private View mScrim; + private Animator mFocusGainAnimator; private AnimatorSet mFocusLoseAnimatorSet; public PipRecentsControlsView(Context context) { @@ -71,26 +76,20 @@ public class PipRecentsControlsView extends PipControlsView { public void onFinishInflate() { super.onFinishInflate(); - int buttonsFocusGainAnim = R.anim.tv_pip_controls_buttons_in_recents_focus_gain_animation; - mFocusGainAnimatorSet = new AnimatorSet(); - mFocusGainAnimatorSet.playTogether( - loadAnimator(this, R.anim.tv_pip_controls_in_recents_focus_gain_animation), - loadAnimator(mFullButtonView,buttonsFocusGainAnim), - loadAnimator(mPlayPauseButtonView, buttonsFocusGainAnim), - loadAnimator(mCloseButtonView, buttonsFocusGainAnim)); + mPipControlsView = (PipControlsView) findViewById(R.id.pip_control_contents); + mScrim = findViewById(R.id.scrim); + + mFocusGainAnimator = loadAnimator(mPipControlsView, + R.anim.tv_pip_controls_in_recents_focus_gain_animation); - int buttonsFocusLoseAnim = R.anim.tv_pip_controls_buttons_in_recents_focus_lose_animation; mFocusLoseAnimatorSet = new AnimatorSet(); - mFocusLoseAnimatorSet.playTogether( - loadAnimator(this, R.anim.tv_pip_controls_in_recents_focus_lose_animation), - loadAnimator(mFullButtonView, buttonsFocusLoseAnim), - loadAnimator(mPlayPauseButtonView, buttonsFocusLoseAnim), - loadAnimator(mCloseButtonView, buttonsFocusLoseAnim)); + mFocusLoseAnimatorSet.playSequentially( + loadAnimator(mPipControlsView, + R.anim.tv_pip_controls_in_recents_focus_lose_animation), + loadAnimator(mScrim, R.anim.tv_pip_controls_in_recents_scrim_fade_in_animation)); Rect pipBounds = mPipManager.getRecentsFocusedPipBounds(); - int pipControlsMarginTop = getContext().getResources().getDimensionPixelSize( - R.dimen.recents_tv_pip_controls_margin_top); - setPadding(0, pipBounds.bottom + pipControlsMarginTop, 0, 0); + setPadding(0, pipBounds.bottom, 0, 0); } private Animator loadAnimator(View view, int animatorResId) { @@ -103,44 +102,53 @@ public class PipRecentsControlsView extends PipControlsView { * Starts focus gaining animation. */ public void startFocusGainAnimation() { - if (mFocusLoseAnimatorSet.isStarted()) { - mFocusLoseAnimatorSet.cancel(); - } - mFocusGainAnimatorSet.start(); + // Hides the scrim view as soon as possible, before the PIP resize animation starts. + // If we don't, PIP will be moved down a bit and a gap between the scrim and PIP will be + // shown at the bottom of the PIP. + mScrim.setAlpha(0); + startAnimator(mFocusGainAnimator, mFocusLoseAnimatorSet); } /** * Starts focus losing animation. */ public void startFocusLoseAnimation() { - if (mFocusGainAnimatorSet.isStarted()) { - mFocusGainAnimatorSet.cancel(); - } - mFocusLoseAnimatorSet.start(); + startAnimator(mFocusLoseAnimatorSet, mFocusGainAnimator); } /** * Resets the view to the initial state. (i.e. end of the focus gain) */ public void reset() { - if (mFocusGainAnimatorSet.isStarted()) { - mFocusGainAnimatorSet.cancel(); - } - if (mFocusLoseAnimatorSet.isStarted()) { - mFocusLoseAnimatorSet.cancel(); - } + cancelAnimator(mFocusGainAnimator); + cancelAnimator(mFocusLoseAnimatorSet); // Reset to initial state (i.e. end of focused) requestFocus(); - setTranslationY(0); - setScaleXY(mFullButtonView, 1); - setScaleXY(mPlayPauseButtonView, 1); - setScaleXY(mCloseButtonView, 1); + mPipControlsView.setTranslationY(0); + mPipControlsView.setScaleX(1); + mPipControlsView.setScaleY(1); + mScrim.setAlpha(0); } - private void setScaleXY(View view, float scale) { - view.setScaleX(scale); - view.setScaleY(scale); + private static void startAnimator(Animator animator, Animator previousAnimator) { + cancelAnimator(previousAnimator); + if (!animator.isStarted()) { + animator.start(); + } + } + + private static void cancelAnimator(Animator animator) { + if (animator.isStarted()) { + animator.cancel(); + } + } + + /** + * Sets listeners. + */ + public void setListener(Listener listener) { + mPipControlsView.setListener(listener); } @Override @@ -148,8 +156,8 @@ public class PipRecentsControlsView extends PipControlsView { if (!event.isCanceled() && event.getKeyCode() == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP) { - if (mListener != null) { - ((PipRecentsControlsView.Listener) mListener).onBackPressed(); + if (mPipControlsView.mListener != null) { + ((PipRecentsControlsView.Listener) mPipControlsView.mListener).onBackPressed(); } return true; }