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:
@@ -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
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user