Fixing activity leak via accumulation of draw listeners
Bug: 139137636
Change-Id: I0a2f0849f886acaac31746ac7c9724c765692e88
diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java
index bc0e75f..1413a5c 100644
--- a/src/com/android/launcher3/Launcher.java
+++ b/src/com/android/launcher3/Launcher.java
@@ -329,6 +329,16 @@
private BackgroundBlurController mBackgroundBlurController =
new BackgroundBlurController(this);
+ private final ViewTreeObserver.OnDrawListener mOnDrawListener =
+ new ViewTreeObserver.OnDrawListener() {
+ @Override
+ public void onDraw() {
+ getBackgroundBlurController().setSurfaceToLauncher(mDragLayer);
+ mDragLayer.post(() -> mDragLayer.getViewTreeObserver().removeOnDrawListener(
+ this));
+ }
+ };
+
@Override
protected void onCreate(Bundle savedInstanceState) {
Object traceToken = TraceHelper.INSTANCE.beginSection(ON_CREATE_EVT,
@@ -930,6 +940,8 @@
final int origDragLayerChildCount = mDragLayer.getChildCount();
super.onStop();
+ mDragLayer.getViewTreeObserver().removeOnDrawListener(mOnDrawListener);
+
if (mDeferOverlayCallbacks) {
checkIfOverlayStillDeferred();
} else {
@@ -970,13 +982,7 @@
if (!mDeferOverlayCallbacks) {
mOverlayManager.onActivityStarted(this);
}
- mDragLayer.getViewTreeObserver().addOnDrawListener(new ViewTreeObserver.OnDrawListener() {
- @Override
- public void onDraw() {
- getBackgroundBlurController().setSurfaceToLauncher(mDragLayer);
- mDragLayer.post(() -> mDragLayer.getViewTreeObserver().removeOnDrawListener(this));
- }
- });
+ mDragLayer.getViewTreeObserver().addOnDrawListener(mOnDrawListener);
mAppWidgetHost.setListenIfResumed(true);
TraceHelper.INSTANCE.endSection(traceToken);