From 88ae86be6b3de696bc5cdbec582be19625a1a10a Mon Sep 17 00:00:00 2001 From: Tiger Huang Date: Mon, 19 Apr 2021 19:13:12 +0800 Subject: [PATCH] Clear controls in the temp list after using them The list would be cleared while next time we use them, so it could constantly occupy the memory. This CL clears the temp list right after we use the controls. So it won't occupy the memory while they are not being used. This CL also sends a new list to the app when dispatching the insets animation progress. In this way, we don't need to clear mTmpRunningAnims after dispatching it. Also, the app might use the animation list AFTER the 'onProgress' callback. This change can make the list stay the same. Fix: 183684434 Test: Use Android Memory Profiler to check if there is InsetsAnimationControlImpl or WindowInsetsAnimation instances after GCing after playing insets animation in Launcher. Change-Id: I781233abb2c9c8400c6f76b537bef161745e67f7 --- core/java/android/view/InsetsController.java | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/core/java/android/view/InsetsController.java b/core/java/android/view/InsetsController.java index c201e3beb9b2f..f6cb18ea1d3c5 100644 --- a/core/java/android/view/InsetsController.java +++ b/core/java/android/view/InsetsController.java @@ -541,9 +541,6 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation private final SparseArray mTmpControlArray = new SparseArray<>(); private final ArrayList mRunningAnimations = new ArrayList<>(); - private final ArrayList mTmpRunningAnims = new ArrayList<>(); - private final List mUnmodifiableTmpRunningAnims = - Collections.unmodifiableList(mTmpRunningAnims); private final ArrayList mTmpFinishedControls = new ArrayList<>(); private final ArraySet mRequestedVisibilityChanged = new ArraySet<>(); private WindowInsets mLastInsets; @@ -601,9 +598,8 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation return; } - mTmpFinishedControls.clear(); - mTmpRunningAnims.clear(); - InsetsState state = new InsetsState(mState, true /* copySources */); + final List runningAnimations = new ArrayList<>(); + final InsetsState state = new InsetsState(mState, true /* copySources */); for (int i = mRunningAnimations.size() - 1; i >= 0; i--) { RunningAnimation runningAnimation = mRunningAnimations.get(i); if (DEBUG) Log.d(TAG, "Running animation type: " + runningAnimation.type); @@ -615,7 +611,7 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation // if it gets finished within applyChangeInsets we still dispatch it to // onProgress. if (runningAnimation.startDispatched) { - mTmpRunningAnims.add(control.getAnimation()); + runningAnimations.add(control.getAnimation()); } if (control.applyChangeInsets(state)) { @@ -628,9 +624,10 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation mLastInsets.isRound(), mLastInsets.shouldAlwaysConsumeSystemBars(), mLastLegacySoftInputMode, mLastLegacyWindowFlags, mLastLegacySystemUiFlags, mWindowType, mLastWindowingMode, null /* typeSideMap */); - mHost.dispatchWindowInsetsAnimationProgress(insets, mUnmodifiableTmpRunningAnims); + mHost.dispatchWindowInsetsAnimationProgress(insets, + Collections.unmodifiableList(runningAnimations)); if (DEBUG) { - for (WindowInsetsAnimation anim : mUnmodifiableTmpRunningAnims) { + for (WindowInsetsAnimation anim : runningAnimations) { Log.d(TAG, String.format("Running animation type: %d, progress: %f", anim.getTypeMask(), anim.getInterpolatedFraction())); } @@ -639,6 +636,7 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation for (int i = mTmpFinishedControls.size() - 1; i >= 0; i--) { dispatchAnimationEnd(mTmpFinishedControls.get(i).getAnimation()); } + mTmpFinishedControls.clear(); }; }