From 3a7e64a1b55a8cdd0b2053fd6b16c294c3137d05 Mon Sep 17 00:00:00 2001 From: Raj Yengisetty Date: Mon, 30 Mar 2015 10:07:09 -0700 Subject: [PATCH] CMFileManager: account for displayed dialogs during activity tear down Repro: - Start copying a large file (>100 MB) - Leave CMFM and trigger a config change (e.g. set text size to small in Settings -> Display) - Return to CMFM - Observe: window leak in logcat Change-Id: Ic875d4f86edf0446b889e6442126bd76a692a7c6 --- .../filemanager/activities/NavigationActivity.java | 10 ++++++++++ src/com/cyanogenmod/filemanager/util/DialogHelper.java | 17 +++++++++++++++-- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java b/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java index 0eb5ebd..2de0fa9 100644 --- a/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java +++ b/src/com/cyanogenmod/filemanager/activities/NavigationActivity.java @@ -18,6 +18,7 @@ package com.cyanogenmod.filemanager.activities; import android.app.Activity; import android.app.AlertDialog; +import android.app.Dialog; import android.app.SearchManager; import android.content.BroadcastReceiver; import android.content.Context; @@ -466,6 +467,8 @@ public class NavigationActivity extends Activity private boolean mExitFlag = false; private long mExitBackTimeout = -1; + private Dialog mActiveDialog = null; + private int mOrientation; /** @@ -684,6 +687,10 @@ public class NavigationActivity extends Activity Log.d(TAG, "NavigationActivity.onDestroy"); //$NON-NLS-1$ } + if (mActiveDialog != null && mActiveDialog.isShowing()) { + mActiveDialog.dismiss(); + } + // Unregister the receiver try { unregisterReceiver(this.mNotificationReceiver); @@ -2712,4 +2719,7 @@ public class NavigationActivity extends Activity theme.setImageDrawable(this, (ButtonItem) v, "ab_delete_drawable"); //$NON-NLS-1$ } + public void updateActiveDialog(Dialog dialog) { + mActiveDialog = dialog; + } } diff --git a/src/com/cyanogenmod/filemanager/util/DialogHelper.java b/src/com/cyanogenmod/filemanager/util/DialogHelper.java index 4046445..a78c81f 100644 --- a/src/com/cyanogenmod/filemanager/util/DialogHelper.java +++ b/src/com/cyanogenmod/filemanager/util/DialogHelper.java @@ -16,6 +16,7 @@ package com.cyanogenmod.filemanager.util; +import android.app.Activity; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; @@ -35,6 +36,7 @@ import android.widget.TextView; import android.widget.Toast; import com.cyanogenmod.filemanager.R; +import com.cyanogenmod.filemanager.activities.NavigationActivity; import com.cyanogenmod.filemanager.adapters.CheckableListAdapter; import com.cyanogenmod.filemanager.ui.ThemeManager; import com.cyanogenmod.filemanager.ui.ThemeManager.Theme; @@ -580,8 +582,19 @@ public final class DialogHelper { * @param dialog The dialog to show */ public static void delegateDialogShow(Context context, AlertDialog dialog) { - // Show the dialog - dialog.show(); + boolean isActivityFinishing = false; + if (context instanceof Activity) { + Activity activity = (Activity) context; + if (activity instanceof NavigationActivity) { + ((NavigationActivity) activity).updateActiveDialog(dialog); + } + isActivityFinishing = activity.isFinishing(); + } + + if (!isActivityFinishing) { + // Show the dialog + dialog.show(); + } // Apply theme Theme theme = ThemeManager.getCurrentTheme(context); -- 2.11.0