diff --git a/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java b/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java index c7483851b1..67feb6a6b8 100644 --- a/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java +++ b/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java @@ -226,7 +226,6 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener private static final int TASKBAR_TO_HOME_DURATION_FAST = 300; private static final int TASKBAR_TO_HOME_DURATION_SLOW = 1000; protected static final int CONTENT_SCALE_DURATION = 350; - protected static final int CONTENT_SCRIM_DURATION = 350; private static final int MAX_NUM_TASKS = 5; @@ -244,7 +243,13 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener private final StartingWindowListener mStartingWindowListener = new StartingWindowListener(this); - private ContentObserver mAnimationRemovalObserver = new ContentObserver( + + // TODO(b/397690719): Investigate the memory leak from TaskStackChangeListeners#mImpl + // This is a temporary fix of memory leak b/397690719. We track registered + // {@link TaskRestartedDuringLaunchListener}, and remove them on activity destroy. + private final List mRegisteredTaskStackChangeListener = + new ArrayList<>(); + private final ContentObserver mAnimationRemovalObserver = new ContentObserver( ORDERED_BG_EXECUTOR.getHandler()) { @Override public void onChange(boolean selfChange) { @@ -338,7 +343,14 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener TaskRestartedDuringLaunchListener restartedListener = new TaskRestartedDuringLaunchListener(); restartedListener.register(onEndCallback::executeAllAndDestroy); - onEndCallback.add(restartedListener::unregister); + mRegisteredTaskStackChangeListener.add(restartedListener); + onEndCallback.add(new Runnable() { + @Override + public void run() { + restartedListener.unregister(); + mRegisteredTaskStackChangeListener.remove(restartedListener); + } + }); RemoteAnimationRunnerCompat runner = createAppLaunchRunner(v, onEndCallback); @@ -1210,6 +1222,12 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener SystemUiProxy.INSTANCE.get(mLauncher).setStartingWindowListener(null); ORDERED_BG_EXECUTOR.execute(() -> mLauncher.getContentResolver() .unregisterContentObserver(mAnimationRemovalObserver)); + if (BuildConfig.IS_STUDIO_BUILD && !mRegisteredTaskStackChangeListener.isEmpty()) { + throw new IllegalStateException("Failed to run onEndCallback created from" + + " getActivityLaunchOptions()"); + } + mRegisteredTaskStackChangeListener.forEach(TaskRestartedDuringLaunchListener::unregister); + mRegisteredTaskStackChangeListener.clear(); } /** diff --git a/quickstep/src/com/android/quickstep/util/TaskRestartedDuringLaunchListener.java b/quickstep/src/com/android/quickstep/util/TaskRestartedDuringLaunchListener.java index 91e8376990..6e2d469d18 100644 --- a/quickstep/src/com/android/quickstep/util/TaskRestartedDuringLaunchListener.java +++ b/quickstep/src/com/android/quickstep/util/TaskRestartedDuringLaunchListener.java @@ -16,16 +16,11 @@ package com.android.quickstep.util; -import static android.app.ActivityTaskManager.INVALID_TASK_ID; - -import android.app.Activity; import android.app.ActivityManager; import android.util.Log; import androidx.annotation.NonNull; -import com.android.launcher3.util.ActivityLifecycleCallbacksAdapter; -import com.android.quickstep.RecentsModel; import com.android.systemui.shared.system.TaskStackChangeListener; import com.android.systemui.shared.system.TaskStackChangeListeners;