Merge "Fix Launcher icons not animated during unfold" into tm-dev
diff --git a/quickstep/src/com/android/launcher3/BaseQuickstepLauncher.java b/quickstep/src/com/android/launcher3/BaseQuickstepLauncher.java
index af4f49d..a26f3e8 100644
--- a/quickstep/src/com/android/launcher3/BaseQuickstepLauncher.java
+++ b/quickstep/src/com/android/launcher3/BaseQuickstepLauncher.java
@@ -65,6 +65,7 @@
import com.android.launcher3.util.DisplayController;
import com.android.launcher3.util.IntSet;
import com.android.launcher3.util.ObjectWrapper;
+import com.android.launcher3.util.RunnableList;
import com.android.launcher3.util.SplitConfigurationOptions.SplitPositionOption;
import com.android.launcher3.util.UiThreadHelper;
import com.android.quickstep.OverviewCommandHelper;
@@ -497,6 +498,20 @@
}
@Override
+ public void onInitialBindComplete(IntSet boundPages, RunnableList pendingTasks) {
+ pendingTasks.add(() -> {
+ // This is added in pending task as we need to wait for views to be positioned
+ // correctly before registering them for the animation.
+ if (mLauncherUnfoldAnimationController != null) {
+ // This is needed in case items are rebound while the unfold animation is in
+ // progress.
+ mLauncherUnfoldAnimationController.updateRegisteredViewsIfNeeded();
+ }
+ });
+ super.onInitialBindComplete(boundPages, pendingTasks);
+ }
+
+ @Override
public Stream<SystemShortcut.Factory> getSupportedShortcuts() {
Stream<SystemShortcut.Factory> base = Stream.of(WellbeingModel.SHORTCUT_FACTORY);
if (ENABLE_SPLIT_FROM_WORKSPACE.get() && mDeviceProfile.isTablet) {
diff --git a/quickstep/src/com/android/quickstep/util/BaseUnfoldMoveFromCenterAnimator.java b/quickstep/src/com/android/quickstep/util/BaseUnfoldMoveFromCenterAnimator.java
index 861ff96..143042f 100644
--- a/quickstep/src/com/android/quickstep/util/BaseUnfoldMoveFromCenterAnimator.java
+++ b/quickstep/src/com/android/quickstep/util/BaseUnfoldMoveFromCenterAnimator.java
@@ -36,6 +36,8 @@
private final Map<ViewGroup, Boolean> mOriginalClipToPadding = new HashMap<>();
private final Map<ViewGroup, Boolean> mOriginalClipChildren = new HashMap<>();
+ private boolean mAnimationInProgress = false;
+
public BaseUnfoldMoveFromCenterAnimator(WindowManager windowManager) {
mMoveFromCenterAnimation = new UnfoldMoveFromCenterAnimator(windowManager,
new LauncherViewsMoveFromCenterTranslationApplier());
@@ -44,6 +46,7 @@
@CallSuper
@Override
public void onTransitionStarted() {
+ mAnimationInProgress = true;
mMoveFromCenterAnimation.updateDisplayProperties();
onPrepareViewsForAnimation();
onTransitionProgress(0f);
@@ -58,7 +61,23 @@
@CallSuper
@Override
public void onTransitionFinished() {
+ mAnimationInProgress = false;
mMoveFromCenterAnimation.onTransitionFinished();
+ clearRegisteredViews();
+ }
+
+ /**
+ * Re-prepares views for animation. This is useful in case views are re-bound while the
+ * animation is in progress.
+ */
+ public void updateRegisteredViewsIfNeeded() {
+ if (mAnimationInProgress) {
+ clearRegisteredViews();
+ onPrepareViewsForAnimation();
+ }
+ }
+
+ private void clearRegisteredViews() {
mMoveFromCenterAnimation.clearRegisteredViews();
mOriginalClipChildren.clear();
diff --git a/quickstep/src/com/android/quickstep/util/LauncherUnfoldAnimationController.java b/quickstep/src/com/android/quickstep/util/LauncherUnfoldAnimationController.java
index 3b58046..91ba909 100644
--- a/quickstep/src/com/android/quickstep/util/LauncherUnfoldAnimationController.java
+++ b/quickstep/src/com/android/quickstep/util/LauncherUnfoldAnimationController.java
@@ -51,13 +51,14 @@
HOTSEAT_SCALE_PROPERTY_FACTORY.get(SCALE_INDEX_UNFOLD_ANIMATION);
private final Launcher mLauncher;
+ private final ScopedUnfoldTransitionProgressProvider mProgressProvider;
+ private final NaturalRotationUnfoldProgressProvider mNaturalOrientationProgressProvider;
+ private final UnfoldMoveFromCenterHotseatAnimator mUnfoldMoveFromCenterHotseatAnimator;
+ private final UnfoldMoveFromCenterWorkspaceAnimator mUnfoldMoveFromCenterWorkspaceAnimator;
@Nullable
private HorizontalInsettableView mQsbInsettable;
- private final ScopedUnfoldTransitionProgressProvider mProgressProvider;
- private final NaturalRotationUnfoldProgressProvider mNaturalOrientationProgressProvider;
-
public LauncherUnfoldAnimationController(
Launcher launcher,
WindowManager windowManager,
@@ -65,21 +66,21 @@
mLauncher = launcher;
mProgressProvider = new ScopedUnfoldTransitionProgressProvider(
unfoldTransitionProgressProvider);
+ mUnfoldMoveFromCenterHotseatAnimator = new UnfoldMoveFromCenterHotseatAnimator(launcher,
+ windowManager);
+ mUnfoldMoveFromCenterWorkspaceAnimator = new UnfoldMoveFromCenterWorkspaceAnimator(launcher,
+ windowManager);
mNaturalOrientationProgressProvider = new NaturalRotationUnfoldProgressProvider(launcher,
WindowManagerGlobal.getWindowManagerService(), mProgressProvider);
mNaturalOrientationProgressProvider.init();
// Animated in all orientations
- mProgressProvider.addCallback(new UnfoldMoveFromCenterWorkspaceAnimator(launcher,
- windowManager));
- mProgressProvider
- .addCallback(new LauncherScaleAnimationListener());
+ mProgressProvider.addCallback(mUnfoldMoveFromCenterWorkspaceAnimator);
+ mProgressProvider.addCallback(new LauncherScaleAnimationListener());
// Animated only in natural orientation
- mNaturalOrientationProgressProvider
- .addCallback(new QsbAnimationListener());
- mNaturalOrientationProgressProvider
- .addCallback(new UnfoldMoveFromCenterHotseatAnimator(launcher, windowManager));
+ mNaturalOrientationProgressProvider.addCallback(new QsbAnimationListener());
+ mNaturalOrientationProgressProvider.addCallback(mUnfoldMoveFromCenterHotseatAnimator);
}
/**
@@ -111,6 +112,12 @@
mNaturalOrientationProgressProvider.destroy();
}
+ /** Called when launcher finished binding its items. */
+ public void updateRegisteredViewsIfNeeded() {
+ mUnfoldMoveFromCenterHotseatAnimator.updateRegisteredViewsIfNeeded();
+ mUnfoldMoveFromCenterWorkspaceAnimator.updateRegisteredViewsIfNeeded();
+ }
+
private class QsbAnimationListener implements TransitionProgressListener {
@Override