From 4986044fd3bce877247e425374b47967775081a8 Mon Sep 17 00:00:00 2001 From: Amith Yamasani Date: Wed, 17 Mar 2010 20:54:10 -0700 Subject: [PATCH] Fix window leak and receiver leak. Bug: 2520143 and Bug: 2517390 In Activity.onDestroy close any open SearchDialog to avoid a window leak. Register/unregister broadcast receiver in onStart/onStop of the dialog. --- core/java/android/app/Activity.java | 5 ++++ core/java/android/app/SearchDialog.java | 33 ++++++++++++++++--------- 2 files changed, 27 insertions(+), 11 deletions(-) diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java index 3c5a1c7cfb456..a9623917f757d 100644 --- a/core/java/android/app/Activity.java +++ b/core/java/android/app/Activity.java @@ -1320,6 +1320,11 @@ public class Activity extends ContextThemeWrapper } mManagedCursors.clear(); } + + // Close any open search dialog + if (mSearchManager != null) { + mSearchManager.stopSearch(); + } } /** diff --git a/core/java/android/app/SearchDialog.java b/core/java/android/app/SearchDialog.java index add99d78eda2e..0ebe3ac09cadb 100644 --- a/core/java/android/app/SearchDialog.java +++ b/core/java/android/app/SearchDialog.java @@ -132,6 +132,15 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS // Last known IME options value for the search edit text. private int mSearchAutoCompleteImeOptions; + private BroadcastReceiver mConfChangeListener = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + if (intent.getAction().equals(Intent.ACTION_CONFIGURATION_CHANGED)) { + onConfigurationChanged(); + } + } + }; + /** * Constructor - fires it up and makes it look like the search UI. * @@ -149,16 +158,6 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS mVoiceAppSearchIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); mVoiceAppSearchIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); mSearchManager = searchManager; - IntentFilter filter = new IntentFilter(); - filter.addAction(Intent.ACTION_CONFIGURATION_CHANGED); - context.registerReceiver(new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - if (intent.getAction().equals(Intent.ACTION_CONFIGURATION_CHANGED)) { - onConfigurationChanged(); - } - } - }, filter); } /** @@ -297,10 +296,20 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS show(); } updateUI(); - + return true; } + @Override + public void onStart() { + super.onStart(); + + // Register a listener for configuration change events. + IntentFilter filter = new IntentFilter(); + filter.addAction(Intent.ACTION_CONFIGURATION_CHANGED); + getContext().registerReceiver(mConfChangeListener, filter); + } + /** * The search dialog is being dismissed, so handle all of the local shutdown operations. * @@ -311,6 +320,8 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS public void onStop() { super.onStop(); + getContext().unregisterReceiver(mConfChangeListener); + closeSuggestionsAdapter(); // dump extra memory we're hanging on to