Merge "Fixes quick switch animations for low end devices" into oc-mr1-dev

This commit is contained in:
TreeHugger Robot
2017-08-16 02:28:52 +00:00
committed by Android (Google) Code Review
3 changed files with 30 additions and 9 deletions

View File

@@ -24,6 +24,7 @@ import static android.view.View.MeasureSpec;
import android.app.ActivityManager; import android.app.ActivityManager;
import android.app.ActivityManager.TaskSnapshot; import android.app.ActivityManager.TaskSnapshot;
import android.app.ActivityOptions; import android.app.ActivityOptions;
import android.app.ActivityOptions.OnAnimationFinishedListener;
import android.app.ActivityOptions.OnAnimationStartedListener; import android.app.ActivityOptions.OnAnimationStartedListener;
import android.content.ActivityNotFoundException; import android.content.ActivityNotFoundException;
import android.content.Context; import android.content.Context;
@@ -663,7 +664,7 @@ public class RecentsImpl implements ActivityOptions.OnAnimationFinishedListener
mWaitingForTransitionStart = waitingForTransitionStart; mWaitingForTransitionStart = waitingForTransitionStart;
if (!waitingForTransitionStart && mToggleFollowingTransitionStart) { if (!waitingForTransitionStart && mToggleFollowingTransitionStart) {
toggleRecents(DividerView.INVALID_RECENTS_GROW_TARGET); mHandler.post(() -> toggleRecents(DividerView.INVALID_RECENTS_GROW_TARGET));
} }
mToggleFollowingTransitionStart = false; mToggleFollowingTransitionStart = false;
} }
@@ -866,6 +867,7 @@ public class RecentsImpl implements ActivityOptions.OnAnimationFinishedListener
private Pair<ActivityOptions, AppTransitionAnimationSpecsFuture> private Pair<ActivityOptions, AppTransitionAnimationSpecsFuture>
getThumbnailTransitionActivityOptions(ActivityManager.RunningTaskInfo runningTask, getThumbnailTransitionActivityOptions(ActivityManager.RunningTaskInfo runningTask,
Rect windowOverrideRect) { Rect windowOverrideRect) {
final boolean isLowRamDevice = Recents.getConfiguration().isLowRamDevice;
if (runningTask != null && runningTask.stackId == FREEFORM_WORKSPACE_STACK_ID) { if (runningTask != null && runningTask.stackId == FREEFORM_WORKSPACE_STACK_ID) {
ArrayList<AppTransitionAnimationSpec> specs = new ArrayList<>(); ArrayList<AppTransitionAnimationSpec> specs = new ArrayList<>();
ArrayList<Task> tasks; ArrayList<Task> tasks;
@@ -896,8 +898,11 @@ public class RecentsImpl implements ActivityOptions.OnAnimationFinishedListener
AppTransitionAnimationSpec[] specsArray = new AppTransitionAnimationSpec[specs.size()]; AppTransitionAnimationSpec[] specsArray = new AppTransitionAnimationSpec[specs.size()];
specs.toArray(specsArray); specs.toArray(specsArray);
// For low end ram devices, wait for transition flag is reset when Recents entrance
// animation is complete instead of when the transition animation starts
return new Pair<>(ActivityOptions.makeThumbnailAspectScaleDownAnimation(mDummyStackView, return new Pair<>(ActivityOptions.makeThumbnailAspectScaleDownAnimation(mDummyStackView,
specsArray, mHandler, mResetToggleFlagListener, this), null); specsArray, mHandler, isLowRamDevice ? null : mResetToggleFlagListener, this),
null);
} else { } else {
// Update the destination rect // Update the destination rect
Task toTask = new Task(); Task toTask = new Task();
@@ -916,9 +921,11 @@ public class RecentsImpl implements ActivityOptions.OnAnimationFinishedListener
toTask.key.id, thumbnail, rect)); toTask.key.id, thumbnail, rect));
}); });
// For low end ram devices, wait for transition flag is reset when Recents entrance
// animation is complete instead of when the transition animation starts
return new Pair<>(ActivityOptions.makeMultiThumbFutureAspectScaleAnimation(mContext, return new Pair<>(ActivityOptions.makeMultiThumbFutureAspectScaleAnimation(mContext,
mHandler, future.getFuture(), mResetToggleFlagListener, false /* scaleUp */), mHandler, future.getFuture(), isLowRamDevice ? null : mResetToggleFlagListener,
future); false /* scaleUp */), future);
} }
} }

View File

@@ -140,8 +140,10 @@ public class RecentsTransitionHelper {
mHandler.postDelayed(mStartScreenPinningRunnable, 350); mHandler.postDelayed(mStartScreenPinningRunnable, 350);
} }
// Reset the state where we are waiting for the transition to start if (!Recents.getConfiguration().isLowRamDevice) {
EventBus.getDefault().send(new SetWaitingForTransitionStartEvent(false)); // Reset the state where we are waiting for the transition to start
EventBus.getDefault().send(new SetWaitingForTransitionStartEvent(false));
}
} }
}; };
} else { } else {
@@ -163,8 +165,10 @@ public class RecentsTransitionHelper {
EventBus.getDefault().send(new ExitRecentsWindowFirstAnimationFrameEvent()); EventBus.getDefault().send(new ExitRecentsWindowFirstAnimationFrameEvent());
stackView.cancelAllTaskViewAnimations(); stackView.cancelAllTaskViewAnimations();
// Reset the state where we are waiting for the transition to start if (!Recents.getConfiguration().isLowRamDevice) {
EventBus.getDefault().send(new SetWaitingForTransitionStartEvent(false)); // Reset the state where we are waiting for the transition to start
EventBus.getDefault().send(new SetWaitingForTransitionStartEvent(false));
}
} }
}; };
} }

View File

@@ -34,6 +34,8 @@ import com.android.systemui.recents.Recents;
import com.android.systemui.recents.RecentsActivityLaunchState; import com.android.systemui.recents.RecentsActivityLaunchState;
import com.android.systemui.recents.RecentsConfiguration; import com.android.systemui.recents.RecentsConfiguration;
import com.android.systemui.recents.RecentsDebugFlags; import com.android.systemui.recents.RecentsDebugFlags;
import com.android.systemui.recents.events.EventBus;
import com.android.systemui.recents.events.component.SetWaitingForTransitionStartEvent;
import com.android.systemui.recents.misc.ReferenceCountedTrigger; import com.android.systemui.recents.misc.ReferenceCountedTrigger;
import com.android.systemui.recents.model.Task; import com.android.systemui.recents.model.Task;
import com.android.systemui.recents.model.TaskStack; import com.android.systemui.recents.model.TaskStack;
@@ -241,6 +243,7 @@ public class TaskStackAnimationHelper {
return; return;
} }
final boolean isLowRamDevice = Recents.getConfiguration().isLowRamDevice;
int taskViewEnterFromAppDuration = res.getInteger( int taskViewEnterFromAppDuration = res.getInteger(
R.integer.recents_task_enter_from_app_duration); R.integer.recents_task_enter_from_app_duration);
int taskViewEnterFromAffiliatedAppDuration = res.getInteger( int taskViewEnterFromAffiliatedAppDuration = res.getInteger(
@@ -248,6 +251,13 @@ public class TaskStackAnimationHelper {
int dockGestureAnimDuration = appRes.getInteger( int dockGestureAnimDuration = appRes.getInteger(
R.integer.long_press_dock_anim_duration); R.integer.long_press_dock_anim_duration);
// Since low ram devices have an animation when entering app -> recents, do not allow
// toggle until the animation is complete
if (launchState.launchedFromApp && !launchState.launchedViaDockGesture && isLowRamDevice) {
postAnimationTrigger.addLastDecrementRunnable(() -> EventBus.getDefault()
.send(new SetWaitingForTransitionStartEvent(false)));
}
// Create enter animations for each of the views from front to back // Create enter animations for each of the views from front to back
List<TaskView> taskViews = mStackView.getTaskViews(); List<TaskView> taskViews = mStackView.getTaskViews();
int taskViewCount = taskViews.size(); int taskViewCount = taskViews.size();
@@ -296,7 +306,7 @@ public class TaskStackAnimationHelper {
AnimationProps taskAnimation = new AnimationProps() AnimationProps taskAnimation = new AnimationProps()
.setInterpolator(AnimationProps.ALPHA, ENTER_FROM_HOME_ALPHA_INTERPOLATOR) .setInterpolator(AnimationProps.ALPHA, ENTER_FROM_HOME_ALPHA_INTERPOLATOR)
.setListener(postAnimationTrigger.decrementOnAnimationEnd()); .setListener(postAnimationTrigger.decrementOnAnimationEnd());
if (Recents.getConfiguration().isLowRamDevice) { if (isLowRamDevice) {
taskAnimation.setInterpolator(AnimationProps.BOUNDS, taskAnimation.setInterpolator(AnimationProps.BOUNDS,
Interpolators.FAST_OUT_SLOW_IN) Interpolators.FAST_OUT_SLOW_IN)
.setDuration(AnimationProps.BOUNDS, 150) .setDuration(AnimationProps.BOUNDS, 150)