Use wrapped launcher animation runner for app launch
- Prevents a lingering reference to the icon view
Bug: 139137636
Change-Id: I576dd4f55609dbe75ef37a5f264eb808e571863d
diff --git a/quickstep/src/com/android/launcher3/QuickstepAppTransitionManagerImpl.java b/quickstep/src/com/android/launcher3/QuickstepAppTransitionManagerImpl.java
index 1e01709..2df490e 100644
--- a/quickstep/src/com/android/launcher3/QuickstepAppTransitionManagerImpl.java
+++ b/quickstep/src/com/android/launcher3/QuickstepAppTransitionManagerImpl.java
@@ -151,7 +151,9 @@
private DeviceProfile mDeviceProfile;
private RemoteAnimationProvider mRemoteAnimationProvider;
+ // Strong refs to runners which are cleared when the launcher activity is destroyed
private WrappedAnimationRunnerImpl mWallpaperOpenRunner;
+ private WrappedAnimationRunnerImpl mAppLaunchRunner;
private final AnimatorListenerAdapter mForceInvisibleListener = new AnimatorListenerAdapter() {
@Override
@@ -200,32 +202,9 @@
public ActivityOptions getActivityLaunchOptions(Launcher launcher, View v) {
if (hasControlRemoteAppTransitionPermission()) {
boolean fromRecents = isLaunchingFromRecents(v, null /* targets */);
- RemoteAnimationRunnerCompat runner = new LauncherAnimationRunner(mHandler,
- true /* startAtFrontOfQueue */) {
-
- @Override
- public void onCreateAnimation(RemoteAnimationTargetCompat[] appTargets,
- RemoteAnimationTargetCompat[] wallpaperTargets, AnimationResult result) {
- AnimatorSet anim = new AnimatorSet();
-
- boolean launcherClosing =
- launcherIsATargetWithMode(appTargets, MODE_CLOSING);
-
- if (isLaunchingFromRecents(v, appTargets)) {
- composeRecentsLaunchAnimator(anim, v, appTargets, wallpaperTargets,
- launcherClosing);
- } else {
- composeIconLaunchAnimator(anim, v, appTargets, wallpaperTargets,
- launcherClosing);
- }
-
- if (launcherClosing) {
- anim.addListener(mForceInvisibleListener);
- }
-
- result.setAnimation(anim, mLauncher);
- }
- };
+ mAppLaunchRunner = new AppLaunchAnimationRunner(mHandler, v);
+ RemoteAnimationRunnerCompat runner = new WrappedLauncherAnimationRunner<>(
+ mAppLaunchRunner, true /* startAtFrontOfQueue */);
// Note that this duration is a guess as we do not know if the animation will be a
// recents launch or not for sure until we know the opening app targets.
@@ -627,6 +606,7 @@
// Also clear strong references to the runners registered with the remote animation
// definition so we don't have to wait for the system gc
mWallpaperOpenRunner = null;
+ mAppLaunchRunner = null;
}
}
@@ -914,4 +894,47 @@
result.setAnimation(anim, mLauncher);
}
}
+
+ /**
+ * Remote animation runner for animation to launch an app.
+ */
+ private class AppLaunchAnimationRunner implements WrappedAnimationRunnerImpl {
+
+ private final Handler mHandler;
+ private final View mV;
+
+ AppLaunchAnimationRunner(Handler handler, View v) {
+ mHandler = handler;
+ mV = v;
+ }
+
+ @Override
+ public Handler getHandler() {
+ return mHandler;
+ }
+
+ @Override
+ public void onCreateAnimation(RemoteAnimationTargetCompat[] appTargets,
+ RemoteAnimationTargetCompat[] wallpaperTargets,
+ LauncherAnimationRunner.AnimationResult result) {
+ AnimatorSet anim = new AnimatorSet();
+
+ boolean launcherClosing =
+ launcherIsATargetWithMode(appTargets, MODE_CLOSING);
+
+ if (isLaunchingFromRecents(mV, appTargets)) {
+ composeRecentsLaunchAnimator(anim, mV, appTargets, wallpaperTargets,
+ launcherClosing);
+ } else {
+ composeIconLaunchAnimator(anim, mV, appTargets, wallpaperTargets,
+ launcherClosing);
+ }
+
+ if (launcherClosing) {
+ anim.addListener(mForceInvisibleListener);
+ }
+
+ result.setAnimation(anim, mLauncher);
+ }
+ }
}