From 8b4b63403a06e07dfc595aca45c778023bfec79b Mon Sep 17 00:00:00 2001 From: Mattias Petersson Date: Tue, 31 May 2011 16:14:59 +0200 Subject: [PATCH] Avoid memory leak in the Shutdown confirmation dialog. How to reproduce: 1) Lock the screen. 2) Open the Phone options menu by long pressing the power button. 3) Tap "Power off" to display the confirmation dialog. 4) Repeat step 2 and 3 a few times (without closing the confirmation dialog. Each time the confirmation dialog is displayed, a new instance is created. A stack of confirmation dialogs are created on the screen. This is fixed by making sure the previous dialog is dismissed before launching a new dialog. Change-Id: I6b6c61ccc56364b66eed3528019f761e75bbe268 --- .../com/android/internal/app/ShutdownThread.java | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/core/java/com/android/internal/app/ShutdownThread.java b/core/java/com/android/internal/app/ShutdownThread.java index 77d0c97bbf62a..96a642850dea1 100644 --- a/core/java/com/android/internal/app/ShutdownThread.java +++ b/core/java/com/android/internal/app/ShutdownThread.java @@ -76,6 +76,8 @@ public final class ShutdownThread extends Thread { private PowerManager.WakeLock mCpuWakeLock; private PowerManager.WakeLock mScreenWakeLock; private Handler mHandler; + + private static AlertDialog sConfirmDialog; private ShutdownThread() { } @@ -108,7 +110,10 @@ public final class ShutdownThread extends Thread { if (confirm) { final CloseDialogReceiver closer = new CloseDialogReceiver(context); - final AlertDialog dialog = new AlertDialog.Builder(context) + if (sConfirmDialog != null) { + sConfirmDialog.dismiss(); + } + sConfirmDialog = new AlertDialog.Builder(context) .setTitle(com.android.internal.R.string.power_off) .setMessage(resourceId) .setPositiveButton(com.android.internal.R.string.yes, new DialogInterface.OnClickListener() { @@ -118,10 +123,10 @@ public final class ShutdownThread extends Thread { }) .setNegativeButton(com.android.internal.R.string.no, null) .create(); - closer.dialog = dialog; - dialog.setOnDismissListener(closer); - dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG); - dialog.show(); + closer.dialog = sConfirmDialog; + sConfirmDialog.setOnDismissListener(closer); + sConfirmDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG); + sConfirmDialog.show(); } else { beginShutdownSequence(context); }