mirror of
https://github.com/LawnchairLauncher/lawnchair.git
synced 2026-03-01 16:26:47 +00:00
Merge "[Unfold animation] Do not preemptively start the animation if it has run already" into udc-dev
This commit is contained in:
@@ -472,6 +472,10 @@ public class QuickstepLauncher extends Launcher {
|
||||
public void onDestroy() {
|
||||
mAppTransitionManager.onActivityDestroyed();
|
||||
if (mUnfoldTransitionProgressProvider != null) {
|
||||
if (FeatureFlags.RECEIVE_UNFOLD_EVENTS_FROM_SYSUI.get()) {
|
||||
SystemUiProxy.INSTANCE.get(this).setUnfoldAnimationListener(null);
|
||||
}
|
||||
|
||||
mUnfoldTransitionProgressProvider.destroy();
|
||||
}
|
||||
|
||||
|
||||
@@ -60,6 +60,8 @@ public class LauncherUnfoldAnimationController implements OnDeviceProfileChangeL
|
||||
private final NaturalRotationUnfoldProgressProvider mNaturalOrientationProgressProvider;
|
||||
private final UnfoldMoveFromCenterHotseatAnimator mUnfoldMoveFromCenterHotseatAnimator;
|
||||
private final UnfoldMoveFromCenterWorkspaceAnimator mUnfoldMoveFromCenterWorkspaceAnimator;
|
||||
private final TransitionStatusProvider mExternalTransitionStatusProvider =
|
||||
new TransitionStatusProvider();
|
||||
private PreemptiveUnfoldTransitionProgressProvider mPreemptiveProgressProvider = null;
|
||||
private Boolean mIsTablet = null;
|
||||
|
||||
@@ -88,6 +90,8 @@ public class LauncherUnfoldAnimationController implements OnDeviceProfileChangeL
|
||||
unfoldTransitionProgressProvider);
|
||||
}
|
||||
|
||||
unfoldTransitionProgressProvider.addCallback(mExternalTransitionStatusProvider);
|
||||
|
||||
mUnfoldMoveFromCenterHotseatAnimator = new UnfoldMoveFromCenterHotseatAnimator(launcher,
|
||||
windowManager, rotationChangeProvider);
|
||||
mUnfoldMoveFromCenterWorkspaceAnimator = new UnfoldMoveFromCenterWorkspaceAnimator(launcher,
|
||||
@@ -166,11 +170,26 @@ public class LauncherUnfoldAnimationController implements OnDeviceProfileChangeL
|
||||
}
|
||||
|
||||
if (mIsTablet != null && dp.isTablet != mIsTablet) {
|
||||
if (dp.isTablet && SystemUiProxy.INSTANCE.get(mLauncher).isActive()) {
|
||||
// We should preemptively start the animation only if:
|
||||
// - We changed to the unfolded screen
|
||||
// - SystemUI IPC connection is alive, so we won't end up in a situation that we won't
|
||||
// receive transition progress events from SystemUI later because there was no
|
||||
// IPC connection established (e.g. because of SystemUI crash)
|
||||
// - SystemUI has not already sent unfold animation progress events. This might happen
|
||||
// if Launcher was not open during unfold, in this case we receive the configuration
|
||||
// change only after we went back to home screen and we don't want to start the
|
||||
// animation in this case.
|
||||
if (dp.isTablet
|
||||
&& SystemUiProxy.INSTANCE.get(mLauncher).isActive()
|
||||
&& !mExternalTransitionStatusProvider.hasRun()) {
|
||||
// Preemptively start the unfold animation to make sure that we have drawn
|
||||
// the first frame of the animation before the screen gets unblocked
|
||||
preemptivelyStartAnimationOnNextFrame();
|
||||
}
|
||||
|
||||
if (!dp.isTablet) {
|
||||
mExternalTransitionStatusProvider.onFolded();
|
||||
}
|
||||
}
|
||||
|
||||
mIsTablet = dp.isTablet;
|
||||
@@ -222,4 +241,48 @@ public class LauncherUnfoldAnimationController implements OnDeviceProfileChangeL
|
||||
HOTSEAT_SCALE_PROPERTY.setValue(mLauncher.getHotseat(), value);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Class to track the current status of the external transition provider (the events are coming
|
||||
* from the SystemUI side through IPC), it allows to check if the transition has already
|
||||
* finished or currently running on the SystemUI side since last unfold.
|
||||
*/
|
||||
private static class TransitionStatusProvider implements TransitionProgressListener {
|
||||
|
||||
private boolean mHasRun = false;
|
||||
|
||||
@Override
|
||||
public void onTransitionStarted() {
|
||||
markAsRun();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTransitionProgress(float progress) {
|
||||
markAsRun();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTransitionFinished() {
|
||||
markAsRun();
|
||||
}
|
||||
|
||||
/**
|
||||
* Called when the device is folded, so we can reset the status of the animation
|
||||
*/
|
||||
public void onFolded() {
|
||||
mHasRun = false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if there was an animation already (or it is currently running) after
|
||||
* unfolding the device
|
||||
*/
|
||||
public boolean hasRun() {
|
||||
return mHasRun;
|
||||
}
|
||||
|
||||
private void markAsRun() {
|
||||
mHasRun = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -302,7 +302,7 @@ public final class FeatureFlags {
|
||||
"Enable widget transition animation when resizing the widgets");
|
||||
|
||||
public static final BooleanFlag PREEMPTIVE_UNFOLD_ANIMATION_START = getDebugFlag(270397209,
|
||||
"PREEMPTIVE_UNFOLD_ANIMATION_START", DISABLED,
|
||||
"PREEMPTIVE_UNFOLD_ANIMATION_START", ENABLED,
|
||||
"Enables starting the unfold animation preemptively when unfolding, without"
|
||||
+ "waiting for SystemUI and then merging the SystemUI progress whenever we "
|
||||
+ "start receiving the events");
|
||||
|
||||
Reference in New Issue
Block a user