From 573fca80f66c66fecd80ce06b9213b58109c26e9 Mon Sep 17 00:00:00 2001 From: Vinit Nayak Date: Tue, 30 Nov 2021 15:07:35 -0800 Subject: [PATCH] Destroy activity/view references to avoid memory leak Bug: 204891006 Change-Id: If60ac1716c30ebe68fb6e7457d71f542d3075422 --- .../android/quickstep/AbsSwipeUpHandler.java | 17 +++++++++++ .../ActivityLifecycleCallbacksAdapter.java | 29 +++++++++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 src/com/android/launcher3/util/ActivityLifecycleCallbacksAdapter.java diff --git a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java index c9cbba1330..1a901f1271 100644 --- a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java +++ b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java @@ -55,6 +55,7 @@ import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; import android.animation.ValueAnimator; import android.annotation.TargetApi; +import android.app.Activity; import android.app.ActivityManager; import android.content.Context; import android.content.Intent; @@ -96,6 +97,7 @@ import com.android.quickstep.GestureState.GestureEndTarget; import com.android.quickstep.RemoteTargetGluer.RemoteTargetHandle; import com.android.quickstep.util.ActiveGestureLog; import com.android.quickstep.util.ActivityInitListener; +import com.android.launcher3.util.ActivityLifecycleCallbacksAdapter; import com.android.quickstep.util.AnimatorControllerWithResistance; import com.android.quickstep.util.InputConsumerProxy; import com.android.quickstep.util.InputProxyHandlerFactory; @@ -153,6 +155,17 @@ public abstract class AbsSwipeUpHandler, protected MultiStateCallback mStateCallback; protected boolean mCanceled; private boolean mRecentsViewScrollLinked = false; + private final ActivityLifecycleCallbacksAdapter mLifecycleCallbacks = + new ActivityLifecycleCallbacksAdapter() { + @Override + public void onActivityDestroyed(Activity activity) { + if (mActivity != activity) { + return; + } + mRecentsView = null; + mActivity = null; + } + }; private static int getFlagForIndex(int index, String name) { if (DEBUG_STATES) { @@ -416,6 +429,7 @@ public abstract class AbsSwipeUpHandler, setupRecentsViewUi(); linkRecentsViewScroll(); + mActivity.registerActivityLifecycleCallbacks(mLifecycleCallbacks); return true; } @@ -1542,6 +1556,9 @@ public abstract class AbsSwipeUpHandler, private void reset() { mStateCallback.setStateOnUiThread(STATE_HANDLER_INVALIDATED); + if (mActivity != null) { + mActivity.unregisterActivityLifecycleCallbacks(mLifecycleCallbacks); + } } /** diff --git a/src/com/android/launcher3/util/ActivityLifecycleCallbacksAdapter.java b/src/com/android/launcher3/util/ActivityLifecycleCallbacksAdapter.java new file mode 100644 index 0000000000..baa8418242 --- /dev/null +++ b/src/com/android/launcher3/util/ActivityLifecycleCallbacksAdapter.java @@ -0,0 +1,29 @@ +package com.android.launcher3.util; + +import android.app.Activity; +import android.app.Application.ActivityLifecycleCallbacks; +import android.os.Bundle; + +public interface ActivityLifecycleCallbacksAdapter extends ActivityLifecycleCallbacks { + + default void onActivityCreated(Activity activity, Bundle bundle) { + } + + default void onActivityDestroyed(Activity activity) { + } + + default void onActivityPaused(Activity activity) { + } + + default void onActivityResumed(Activity activity) { + } + + default void onActivitySaveInstanceState(Activity activity, Bundle bundle) { + } + + default void onActivityStarted(Activity activity) { + } + + default void onActivityStopped(Activity activity) { + } +}