OSDN Git Service

CMFileManager: account for displayed dialogs during activity tear down
authorRaj Yengisetty <rajesh@cyngn.com>
Mon, 30 Mar 2015 17:07:09 +0000 (10:07 -0700)
committerRajesh Yengisetty <rajesh@cyngn.com>
Mon, 30 Mar 2015 17:08:59 +0000 (17:08 +0000)
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

src/com/cyanogenmod/filemanager/activities/NavigationActivity.java
src/com/cyanogenmod/filemanager/util/DialogHelper.java

index 0eb5ebd..2de0fa9 100644 (file)
@@ -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;
+    }
 }
index 4046445..a78c81f 100644 (file)
@@ -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);