Add clear all animation to Recents Go.

Add clear all animation where task views fade out to the right and the
view fades to home.

Bug: 114136250
Test: Hit clear all
Change-Id: I5a3336da5b724ce19d9ef854efde0dd1f654941a
This commit is contained in:
Kevin 2019-03-22 11:52:03 -07:00
parent c885f9a1f3
commit 5bf71b2268
2 changed files with 79 additions and 2 deletions

View File

@ -71,7 +71,6 @@ public final class TaskActionController {
* Clears all tasks and updates the model and view.
*/
public void clearAllTasks() {
// TODO: Play an animation so transition is more natural.
int count = mAdapter.getItemCount();
ActivityManagerWrapper.getInstance().removeAllRecentTasks();
mLoader.clearAllTasks();

View File

@ -19,6 +19,10 @@ import static androidx.recyclerview.widget.LinearLayoutManager.VERTICAL;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.animation.PropertyValuesHolder;
import android.animation.ValueAnimator;
import android.content.Context;
import android.util.AttributeSet;
import android.util.FloatProperty;
@ -65,6 +69,10 @@ public final class IconRecentsView extends FrameLayout {
}
};
private static final long CROSSFADE_DURATION = 300;
private static final long ITEM_ANIMATE_OUT_DURATION = 150;
private static final long ITEM_ANIMATE_OUT_DELAY_BETWEEN = 40;
private static final float ITEM_ANIMATE_OUT_TRANSLATION_X_RATIO = .25f;
private static final long CLEAR_ALL_FADE_DELAY = 120;
/**
* A ratio representing the view's relative placement within its padded space. For example, 0
@ -119,7 +127,7 @@ public final class IconRecentsView extends FrameLayout {
});
View clearAllView = findViewById(R.id.clear_all_button);
clearAllView.setOnClickListener(v -> mTaskActionController.clearAllTasks());
clearAllView.setOnClickListener(v -> animateClearAllTasks());
}
}
@ -194,6 +202,76 @@ public final class IconRecentsView extends FrameLayout {
return view.getThumbnailView();
}
/**
* Clear all tasks and animate out.
*/
private void animateClearAllTasks() {
TaskItemView[] itemViews = getTaskViews();
AnimatorSet clearAnim = new AnimatorSet();
long currentDelay = 0;
// Animate each item view to the right and fade out.
for (TaskItemView itemView : itemViews) {
PropertyValuesHolder transXproperty = PropertyValuesHolder.ofFloat(TRANSLATION_X,
0, itemView.getWidth() * ITEM_ANIMATE_OUT_TRANSLATION_X_RATIO);
PropertyValuesHolder alphaProperty = PropertyValuesHolder.ofFloat(ALPHA, 1.0f, 0f);
ObjectAnimator itemAnim = ObjectAnimator.ofPropertyValuesHolder(itemView,
transXproperty, alphaProperty);
itemAnim.setDuration(ITEM_ANIMATE_OUT_DURATION);
itemAnim.setStartDelay(currentDelay);
clearAnim.play(itemAnim);
currentDelay += ITEM_ANIMATE_OUT_DELAY_BETWEEN;
}
// Animate view fading and leave recents when faded enough.
ValueAnimator contentAlpha = ValueAnimator.ofFloat(1.0f, 0f)
.setDuration(CROSSFADE_DURATION);
contentAlpha.setStartDelay(CLEAR_ALL_FADE_DELAY);
contentAlpha.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
private boolean mLeftRecents = false;
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
mContentView.setAlpha((float) valueAnimator.getAnimatedValue());
// Leave recents while fading out.
if ((float) valueAnimator.getAnimatedValue() < .5f && !mLeftRecents) {
mActivityHelper.leaveRecents();
mLeftRecents = true;
}
}
});
clearAnim.play(contentAlpha);
clearAnim.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
for (TaskItemView itemView : itemViews) {
itemView.setTranslationX(0);
itemView.setAlpha(1.0f);
}
mContentView.setVisibility(GONE);
mTaskActionController.clearAllTasks();
}
});
clearAnim.start();
}
/**
* Get attached task item views ordered by most recent.
*
* @return array of attached task item views
*/
private TaskItemView[] getTaskViews() {
int taskCount = mTaskRecyclerView.getChildCount();
TaskItemView[] itemViews = new TaskItemView[taskCount];
for (int i = 0; i < taskCount; i ++) {
itemViews[i] = (TaskItemView) mTaskRecyclerView.getChildAt(i);
}
return itemViews;
}
/**
* Update the content view so that the appropriate view is shown based off the current list
* of tasks.