From 419c89533a148d0037e98b801068bb81f8a2cd2a Mon Sep 17 00:00:00 2001 From: Jaewan Kim Date: Mon, 11 Apr 2016 15:43:36 +0900 Subject: [PATCH] PIP: Fix regressions This includes following fixes - Press back key to go to Home from Recents - Do not show Recents when an activity is PIPed immediately after moved to fullscreen. These regressions are caused by c81082b Improve Animation Calculations to remove Jank Bug: 28107787 Change-Id: I3078a5d8a9505c8d03cceee329e5d740efae7feb --- .../res/layout-television/recents_on_tv.xml | 6 ++--- packages/SystemUI/res/values/dimens.xml | 7 ++++-- .../recents/tv/RecentsTvActivity.java | 22 +++++++++++------- .../animations/DismissAnimationsHolder.java | 18 ++++++++------- .../HomeRecentsEnterExitAnimationHolder.java | 6 +++-- .../RecentsRowFocusAnimationHolder.java | 5 ++-- .../recents/tv/views/RecentsTvView.java | 23 ++++++++++++------- .../tv/pip/PipRecentsOverlayManager.java | 6 ++++- 8 files changed, 58 insertions(+), 35 deletions(-) diff --git a/packages/SystemUI/res/layout-television/recents_on_tv.xml b/packages/SystemUI/res/layout-television/recents_on_tv.xml index 280fd204bda64..1dbd1b39626ca 100644 --- a/packages/SystemUI/res/layout-television/recents_on_tv.xml +++ b/packages/SystemUI/res/layout-television/recents_on_tv.xml @@ -35,9 +35,9 @@ + android:visibility="visible" /> diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index cf2e3384de084..03b9837e6175d 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -606,8 +606,8 @@ 3dp 24dp - 16dp @@ -651,4 +651,7 @@ 100dp + + + 0.5 diff --git a/packages/SystemUI/src/com/android/systemui/recents/tv/RecentsTvActivity.java b/packages/SystemUI/src/com/android/systemui/recents/tv/RecentsTvActivity.java index 60a85df5605fc..7378102e713b0 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/tv/RecentsTvActivity.java +++ b/packages/SystemUI/src/com/android/systemui/recents/tv/RecentsTvActivity.java @@ -107,7 +107,9 @@ public class RecentsTvActivity extends Activity implements OnPreDrawListener { public void onMoveToFullscreen() { // Recents should be dismissed when PIP moves to fullscreen. If not, Recents will // be unnecessarily shown in the scenario: PIP->Fullscreen->PIP. - dismissRecentsToLaunchTargetTaskOrHome(); + // Do not show Recents close animation because PIP->Fullscreen animation will be shown + // instead. + dismissRecentsToLaunchTargetTaskOrHome(false); } @Override @@ -118,7 +120,7 @@ public class RecentsTvActivity extends Activity implements OnPreDrawListener { new PipRecentsOverlayManager.Callback() { @Override public void onClosed() { - dismissRecentsToLaunchTargetTaskOrHome(); + dismissRecentsToLaunchTargetTaskOrHome(true); } @Override @@ -211,13 +213,15 @@ public class RecentsTvActivity extends Activity implements OnPreDrawListener { } } - boolean dismissRecentsToLaunchTargetTaskOrHome() { + boolean dismissRecentsToLaunchTargetTaskOrHome(boolean animate) { SystemServicesProxy ssp = Recents.getSystemServices(); if (ssp.isRecentsTopMost(ssp.getTopMostTask(), null)) { // If we have a focused Task, launch that Task now - if (mRecentsView.launchPreviousTask()) return true; + if (mRecentsView.launchPreviousTask(animate)) { + return true; + } // If none of the other cases apply, then just go Home - dismissRecentsToHome(true /* animateTaskViews */); + dismissRecentsToHome(animate /* animateTaskViews */); } return false; } @@ -247,7 +251,7 @@ public class RecentsTvActivity extends Activity implements OnPreDrawListener { dismissEvent.addPostAnimationCallback(mFinishLaunchHomeRunnable); dismissEvent.addPostAnimationCallback(closeSystemWindows); - if(mTaskStackHorizontalGridView.getChildCount() > 0 && animateTaskViews) { + if (mTaskStackHorizontalGridView.getChildCount() > 0 && animateTaskViews) { mHomeRecentsEnterExitAnimationHolder.startExitAnimation(dismissEvent); } else { closeSystemWindows.run(); @@ -374,7 +378,7 @@ public class RecentsTvActivity extends Activity implements OnPreDrawListener { public void onEnterAnimationComplete() { super.onEnterAnimationComplete(); if(mLaunchedFromHome) { - mHomeRecentsEnterExitAnimationHolder.startEnterAnimation(); + mHomeRecentsEnterExitAnimationHolder.startEnterAnimation(mPipManager.isPipShown()); } EventBus.getDefault().send(new EnterRecentsWindowAnimationCompletedEvent()); } @@ -463,7 +467,7 @@ public class RecentsTvActivity extends Activity implements OnPreDrawListener { if (launchState.launchedFromHome) { dismissRecentsToHome(true /* animateTaskViews */); } else { - dismissRecentsToLaunchTargetTaskOrHome(); + dismissRecentsToLaunchTargetTaskOrHome(true); } } @@ -561,6 +565,8 @@ public class RecentsTvActivity extends Activity implements OnPreDrawListener { // as if it's the part of the Recents UI. mPipRecentsOverlayManager.requestFocus( mTaskStackViewAdapter.getItemCount() > 0); + } else { + mPipRecentsOverlayManager.clearFocus(); } } } diff --git a/packages/SystemUI/src/com/android/systemui/recents/tv/animations/DismissAnimationsHolder.java b/packages/SystemUI/src/com/android/systemui/recents/tv/animations/DismissAnimationsHolder.java index ae8d800cea3b6..66d857630005f 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/tv/animations/DismissAnimationsHolder.java +++ b/packages/SystemUI/src/com/android/systemui/recents/tv/animations/DismissAnimationsHolder.java @@ -29,7 +29,8 @@ public class DismissAnimationsHolder { private LinearLayout mDismissArea; private LinearLayout mInfoField; private View mThumbnailView; - private int mCardYDelta; + private int mDismissEnterYDelta; + private int mDismissStartYDelta; private long mShortDuration; private long mLongDuration; @@ -38,7 +39,8 @@ public class DismissAnimationsHolder { mDismissArea = (LinearLayout) taskCardView.findViewById(R.id.card_dismiss); mThumbnailView = taskCardView.findViewById(R.id.card_view_thumbnail); Resources res = taskCardView.getResources(); - mCardYDelta = res.getDimensionPixelOffset(R.dimen.recents_tv_dismiss_shift_down); + mDismissEnterYDelta = res.getDimensionPixelOffset(R.dimen.recents_tv_dismiss_shift_down); + mDismissStartYDelta = mDismissEnterYDelta * 2; mShortDuration = res.getInteger(R.integer.dismiss_short_duration); mLongDuration = res.getInteger(R.integer.dismiss_long_duration); } @@ -52,13 +54,13 @@ public class DismissAnimationsHolder { mInfoField.animate() .setDuration(mShortDuration) .setInterpolator(Interpolators.FAST_OUT_SLOW_IN) - .translationYBy(mCardYDelta) + .translationY(mDismissEnterYDelta) .alpha(0.5f); mThumbnailView.animate() .setDuration(mShortDuration) .setInterpolator(Interpolators.FAST_OUT_SLOW_IN) - .translationYBy(mCardYDelta) + .translationY(mDismissEnterYDelta) .alpha(0.5f); } @@ -71,13 +73,13 @@ public class DismissAnimationsHolder { mInfoField.animate() .setDuration(mShortDuration) .setInterpolator(Interpolators.FAST_OUT_SLOW_IN) - .translationYBy(-mCardYDelta) + .translationY(0) .alpha(1.0f); mThumbnailView.animate() .setDuration(mShortDuration) .setInterpolator(Interpolators.FAST_OUT_SLOW_IN) - .translationYBy(-mCardYDelta) + .translationY(0) .alpha(1.0f); } @@ -90,14 +92,14 @@ public class DismissAnimationsHolder { mInfoField.animate() .setDuration(mLongDuration) .setInterpolator(Interpolators.FAST_OUT_SLOW_IN) - .translationYBy(mCardYDelta) + .translationY(mDismissStartYDelta) .alpha(0.0f) .setListener(listener); mThumbnailView.animate() .setDuration(mLongDuration) .setInterpolator(Interpolators.FAST_OUT_SLOW_IN) - .translationYBy(mCardYDelta) + .translationY(mDismissStartYDelta) .alpha(0.0f); } diff --git a/packages/SystemUI/src/com/android/systemui/recents/tv/animations/HomeRecentsEnterExitAnimationHolder.java b/packages/SystemUI/src/com/android/systemui/recents/tv/animations/HomeRecentsEnterExitAnimationHolder.java index 497a0a3d3ab8a..92718a3b5ac16 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/tv/animations/HomeRecentsEnterExitAnimationHolder.java +++ b/packages/SystemUI/src/com/android/systemui/recents/tv/animations/HomeRecentsEnterExitAnimationHolder.java @@ -28,6 +28,7 @@ public class HomeRecentsEnterExitAnimationHolder { private Context mContext; private TaskStackHorizontalGridView mGridView; + private float mDimAlpha; private long mDelay; private int mDuration; private int mTranslationX; @@ -36,18 +37,19 @@ public class HomeRecentsEnterExitAnimationHolder { TaskStackHorizontalGridView gridView) { mContext = context; mGridView = gridView; + mDimAlpha = mContext.getResources().getFloat(R.dimen.recents_recents_row_dim_alpha); mTranslationX = mContext.getResources() .getDimensionPixelSize(R.dimen.recents_tv_home_recents_shift); mDelay = mContext.getResources().getInteger(R.integer.recents_home_delay); mDuration = mContext.getResources().getInteger(R.integer.recents_home_duration); } - public void startEnterAnimation() { + public void startEnterAnimation(boolean isPipShown) { for(int i = 0; i < mGridView.getChildCount(); i++) { TaskCardView view = (TaskCardView) mGridView.getChildAt(i); view.setTranslationX(-mTranslationX); view.animate() - .alpha(1.0f) + .alpha(isPipShown ? mDimAlpha : 1.0f) .translationX(0) .setDuration(mDuration) .setStartDelay(mDelay * i) diff --git a/packages/SystemUI/src/com/android/systemui/recents/tv/animations/RecentsRowFocusAnimationHolder.java b/packages/SystemUI/src/com/android/systemui/recents/tv/animations/RecentsRowFocusAnimationHolder.java index 28abc344f7d1e..160835f81bcb8 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/tv/animations/RecentsRowFocusAnimationHolder.java +++ b/packages/SystemUI/src/com/android/systemui/recents/tv/animations/RecentsRowFocusAnimationHolder.java @@ -29,8 +29,6 @@ import com.android.systemui.recents.tv.views.TaskCardView; * Recents row's focus animation with PIP controls. */ public class RecentsRowFocusAnimationHolder { - private static final float DIM_ALPHA = 0.5f; - private View mView; private View mTitleView; @@ -43,6 +41,7 @@ public class RecentsRowFocusAnimationHolder { Resources res = view.getResources(); int duration = res.getInteger(R.integer.recents_tv_pip_focus_anim_duration); + float dimAlpha = res.getFloat(R.dimen.recents_recents_row_dim_alpha); mFocusGainAnimatorSet = new AnimatorSet(); mFocusGainAnimatorSet.playTogether( @@ -53,7 +52,7 @@ public class RecentsRowFocusAnimationHolder { mFocusLoseAnimatorSet = new AnimatorSet(); mFocusLoseAnimatorSet.playTogether( - ObjectAnimator.ofFloat(mView, "alpha", DIM_ALPHA), + ObjectAnimator.ofFloat(mView, "alpha", dimAlpha), ObjectAnimator.ofFloat(mTitleView, "alpha", 0f)); mFocusLoseAnimatorSet.setDuration(duration); mFocusLoseAnimatorSet.setInterpolator(Interpolators.FAST_OUT_SLOW_IN); diff --git a/packages/SystemUI/src/com/android/systemui/recents/tv/views/RecentsTvView.java b/packages/SystemUI/src/com/android/systemui/recents/tv/views/RecentsTvView.java index 594f6bc14dd8f..4058c6282ad7f 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/tv/views/RecentsTvView.java +++ b/packages/SystemUI/src/com/android/systemui/recents/tv/views/RecentsTvView.java @@ -112,7 +112,7 @@ public class RecentsTvView extends FrameLayout { if (mTaskStackHorizontalView != null) { Task task = mTaskStackHorizontalView.getFocusedTask(); if (task != null) { - launchTaskFomRecents(task); + launchTaskFomRecents(task, true); return true; } } @@ -120,12 +120,12 @@ public class RecentsTvView extends FrameLayout { } /** Launches the task that recents was launched from if possible */ - public boolean launchPreviousTask() { + public boolean launchPreviousTask(boolean animate) { if (mTaskStackHorizontalView != null) { TaskStack stack = mTaskStackHorizontalView.getStack(); Task task = stack.getLaunchTarget(); if (task != null) { - launchTaskFomRecents(task); + launchTaskFomRecents(task, animate); return true; } } @@ -137,18 +137,25 @@ public class RecentsTvView extends FrameLayout { * attempt to scroll to focus the task before launching. * @param task */ - private void launchTaskFomRecents(final Task task) { - if(task != mTaskStackHorizontalView.getFocusedTask()) { - if(mScrollListener != null) { + private void launchTaskFomRecents(final Task task, boolean animate) { + if (!animate) { + SystemServicesProxy ssp = Recents.getSystemServices(); + ssp.startActivityFromRecents(getContext(), task.key, task.title, null); + return; + } + mTaskStackHorizontalView.requestFocus(); + Task focusedTask = mTaskStackHorizontalView.getFocusedTask(); + if (focusedTask != null && task != focusedTask) { + if (mScrollListener != null) { mTaskStackHorizontalView.removeOnScrollListener(mScrollListener); } mScrollListener = new OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); - if(newState == RecyclerView.SCROLL_STATE_IDLE) { + if (newState == RecyclerView.SCROLL_STATE_IDLE) { TaskCardView cardView = mTaskStackHorizontalView.getChildViewForTask(task); - if(cardView != null) { + if (cardView != null) { mTransitionHelper.launchTaskFromRecents(mStack, task, mTaskStackHorizontalView, cardView, null, INVALID_STACK_ID); } else { diff --git a/packages/SystemUI/src/com/android/systemui/tv/pip/PipRecentsOverlayManager.java b/packages/SystemUI/src/com/android/systemui/tv/pip/PipRecentsOverlayManager.java index c0e221fa84426..f019bc6113cc8 100644 --- a/packages/SystemUI/src/com/android/systemui/tv/pip/PipRecentsOverlayManager.java +++ b/packages/SystemUI/src/com/android/systemui/tv/pip/PipRecentsOverlayManager.java @@ -150,10 +150,14 @@ public class PipRecentsOverlayManager { * is focused. * This should be called only by {@link com.android.systemui.recents.tv.RecentsTvActivity}. */ - private void clearFocus() { + public void clearFocus() { if (!mIsRecentsShown || !mIsPipFocusedInRecent) { return; } + if (!mRecentsView.hasFocus()) { + // Let mRecentsView's focus listener handle clearFocus(). + mRecentsView.requestFocus(); + } mIsPipFocusedInRecent = false; mPipManager.resizePinnedStack(STATE_PIP_RECENTS); mWindowManager.updateViewLayout(mOverlayView, mPipRecentsControlsViewLayoutParams);