Force finish any pending animations if the insets or orientation change

Some animation might be running from a previous orientation, which can cuase property changes
to get skipped.

Bug: 77848165
Bug: 77774619
Change-Id: I3e198196192746abdd72a1970ff2ef407bf4aff9
This commit is contained in:
Sunny Goyal
2018-04-19 12:34:43 -07:00
parent 69632a46ab
commit ed2d2bcbb8
6 changed files with 29 additions and 25 deletions
@@ -50,7 +50,6 @@ import android.graphics.drawable.Drawable;
import android.os.Build; import android.os.Build;
import android.os.Handler; import android.os.Handler;
import android.os.Looper; import android.os.Looper;
import android.util.ArraySet;
import android.util.Log; import android.util.Log;
import android.util.Pair; import android.util.Pair;
import android.view.Surface; import android.view.Surface;
@@ -249,7 +248,7 @@ public class LauncherAppTransitionManagerImpl extends LauncherAppTransitionManag
mLauncher.getStateManager() mLauncher.getStateManager()
.createAnimationToNewWorkspace(NORMAL, RECENTS_LAUNCH_DURATION); .createAnimationToNewWorkspace(NORMAL, RECENTS_LAUNCH_DURATION);
controller.dispatchOnStart(); controller.dispatchOnStart();
childStateAnimation = controller.getOriginalTarget(); childStateAnimation = controller.getTarget();
launcherAnim = controller.getAnimationPlayer().setDuration(RECENTS_LAUNCH_DURATION); launcherAnim = controller.getAnimationPlayer().setDuration(RECENTS_LAUNCH_DURATION);
windowAnimEndListener = new AnimatorListenerAdapter() { windowAnimEndListener = new AnimatorListenerAdapter() {
@Override @Override
+1 -1
View File
@@ -360,7 +360,7 @@ public class Launcher extends BaseDraggingActivity
dispatchDeviceProfileChanged(); dispatchDeviceProfileChanged();
getRootView().dispatchInsets(); getRootView().dispatchInsets();
getStateManager().reapplyState(); getStateManager().reapplyState(true /* cancelCurrentAnimation */);
// Recreate touch controllers // Recreate touch controllers
mDragLayer.setup(mDragController); mDragLayer.setup(mDragController);
@@ -1,5 +1,8 @@
package com.android.launcher3; package com.android.launcher3;
import static com.android.launcher3.util.SystemUiController.FLAG_DARK_NAV;
import static com.android.launcher3.util.SystemUiController.UI_STATE_ROOT_VIEW;
import android.annotation.TargetApi; import android.annotation.TargetApi;
import android.app.ActivityManager; import android.app.ActivityManager;
import android.content.Context; import android.content.Context;
@@ -13,9 +16,6 @@ import android.view.ViewDebug;
import com.android.launcher3.util.Themes; import com.android.launcher3.util.Themes;
import static com.android.launcher3.util.SystemUiController.FLAG_DARK_NAV;
import static com.android.launcher3.util.SystemUiController.UI_STATE_ROOT_VIEW;
public class LauncherRootView extends InsettableFrameLayout { public class LauncherRootView extends InsettableFrameLayout {
private final Launcher mLauncher; private final Launcher mLauncher;
@@ -82,7 +82,7 @@ public class LauncherRootView extends InsettableFrameLayout {
} }
} }
if (resetState) { if (resetState) {
mLauncher.getStateManager().reapplyState(); mLauncher.getStateManager().reapplyState(true /* cancelCurrentAnimation */);
} }
return true; // I'll take it from here return true; // I'll take it from here
@@ -157,6 +157,13 @@ public class LauncherStateManager {
} }
public void reapplyState() { public void reapplyState() {
reapplyState(false);
}
public void reapplyState(boolean cancelCurrentAnimation) {
if (cancelCurrentAnimation) {
cancelAnimation();
}
if (mConfig.mCurrentAnimation == null) { if (mConfig.mCurrentAnimation == null) {
for (StateHandler handler : getStateHandlers()) { for (StateHandler handler : getStateHandlers()) {
handler.setState(mState); handler.setState(mState);
@@ -17,6 +17,7 @@ package com.android.launcher3.anim;
import android.animation.Animator; import android.animation.Animator;
import android.animation.Animator.AnimatorListener; import android.animation.Animator.AnimatorListener;
import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet; import android.animation.AnimatorSet;
import android.animation.TimeInterpolator; import android.animation.TimeInterpolator;
import android.animation.ValueAnimator; import android.animation.ValueAnimator;
@@ -52,45 +53,37 @@ public abstract class AnimatorPlaybackController implements ValueAnimator.Animat
private final long mDuration; private final long mDuration;
protected final AnimatorSet mAnim; protected final AnimatorSet mAnim;
private AnimatorSet mOriginalTarget;
protected float mCurrentFraction; protected float mCurrentFraction;
private Runnable mEndAction; private Runnable mEndAction;
protected boolean mTargetCancelled = false;
protected AnimatorPlaybackController(AnimatorSet anim, long duration) { protected AnimatorPlaybackController(AnimatorSet anim, long duration) {
mAnim = anim; mAnim = anim;
mOriginalTarget = mAnim;
mDuration = duration; mDuration = duration;
mAnimationPlayer = ValueAnimator.ofFloat(0, 1); mAnimationPlayer = ValueAnimator.ofFloat(0, 1);
mAnimationPlayer.setInterpolator(Interpolators.LINEAR); mAnimationPlayer.setInterpolator(Interpolators.LINEAR);
mAnimationPlayer.addListener(new OnAnimationEndDispatcher()); mAnimationPlayer.addListener(new OnAnimationEndDispatcher());
mAnimationPlayer.addUpdateListener(this); mAnimationPlayer.addUpdateListener(this);
mAnim.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationCancel(Animator animation) {
mTargetCancelled = true;
}
});
} }
public AnimatorSet getTarget() { public AnimatorSet getTarget() {
return mAnim; return mAnim;
} }
public void setOriginalTarget(AnimatorSet anim) {
mOriginalTarget = anim;
}
public AnimatorSet getOriginalTarget() {
return mOriginalTarget;
}
public long getDuration() { public long getDuration() {
return mDuration; return mDuration;
} }
public AnimatorPlaybackController cloneFor(AnimatorSet anim) {
AnimatorPlaybackController controller = AnimatorPlaybackController.wrap(anim, mDuration);
controller.setOriginalTarget(mOriginalTarget);
controller.setPlayFraction(mCurrentFraction);
return controller;
}
/** /**
* Starts playing the animation forward from current position. * Starts playing the animation forward from current position.
*/ */
@@ -206,6 +199,11 @@ public abstract class AnimatorPlaybackController implements ValueAnimator.Animat
@Override @Override
public void setPlayFraction(float fraction) { public void setPlayFraction(float fraction) {
mCurrentFraction = fraction; mCurrentFraction = fraction;
// Let the animator report the progress but don't apply the progress to child
// animations if it has been cancelled.
if (mTargetCancelled) {
return;
}
long playPos = clampDuration(fraction); long playPos = clampDuration(fraction);
for (ValueAnimator anim : mChildAnimations) { for (ValueAnimator anim : mChildAnimations) {
anim.setCurrentPlayTime(Math.min(playPos, anim.getDuration())); anim.setCurrentPlayTime(Math.min(playPos, anim.getDuration()));
@@ -279,7 +279,7 @@ public abstract class AbstractStateChangeTouchController extends AnimatorListene
@Override @Override
public void onAnimationCancel(Animator animation) { public void onAnimationCancel(Animator animation) {
if (mCurrentAnimation != null && animation == mCurrentAnimation.getOriginalTarget()) { if (mCurrentAnimation != null && animation == mCurrentAnimation.getTarget()) {
Log.e(TAG, "Who dare cancel the animation when I am in control", new Exception()); Log.e(TAG, "Who dare cancel the animation when I am in control", new Exception());
clearState(); clearState();
} }