From 1dcadbcbb28053b5f9ec81feb2d40660d2978974 Mon Sep 17 00:00:00 2001 From: Martin Gonzalez Date: Fri, 22 Aug 2014 17:43:04 -0500 Subject: [PATCH 1/2] [CB-6837 - Android] Fix leaked window when hitting back button while alert being rendered --- .../org/apache/cordova/CordovaActivity.java | 2 ++ .../apache/cordova/CordovaChromeClient.java | 23 ++++++++++++++++--- .../org/apache/cordova/CordovaWebView.java | 4 ++++ 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/framework/src/org/apache/cordova/CordovaActivity.java b/framework/src/org/apache/cordova/CordovaActivity.java index 2fdb9a7b9..ad9140dad 100755 --- a/framework/src/org/apache/cordova/CordovaActivity.java +++ b/framework/src/org/apache/cordova/CordovaActivity.java @@ -628,6 +628,8 @@ protected void onResume() { public void onDestroy() { LOG.d(TAG, "CordovaActivity.onDestroy()"); super.onDestroy(); + //Destroy all used AlertDialogs + this.appView.destroyDialogs(); // hide the splash screen to avoid leaking a window this.removeSplashScreen(); diff --git a/framework/src/org/apache/cordova/CordovaChromeClient.java b/framework/src/org/apache/cordova/CordovaChromeClient.java index 737d0b849..d21fa8865 100755 --- a/framework/src/org/apache/cordova/CordovaChromeClient.java +++ b/framework/src/org/apache/cordova/CordovaChromeClient.java @@ -21,6 +21,8 @@ Licensed to the Apache Software Foundation (ASF) under one import org.apache.cordova.CordovaInterface; import org.apache.cordova.LOG; +import java.util.ArrayList; + import android.annotation.TargetApi; import android.app.AlertDialog; import android.content.DialogInterface; @@ -65,6 +67,9 @@ public class CordovaChromeClient extends WebChromeClient { // the video progress view private View mVideoProgressView; + //Dialogs record + private ArrayList dialogsManager = new ArrayList(); + // File Chooser public ValueCallback mUploadMessage; @@ -123,7 +128,8 @@ public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { return true; } }); - dlg.show(); + AlertDialog alert = dlg.show(); + dialogsManager.add(alert); return true; } @@ -172,7 +178,8 @@ public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { return true; } }); - dlg.show(); + AlertDialog alert = dlg.show(); + dialogsManager.add(alert); return true; } @@ -216,7 +223,8 @@ public void onClick(DialogInterface dialog, int which) { res.cancel(); } }); - dlg.show(); + AlertDialog alert = dlg.show(); + dialogsManager.add(alert); } return true; } @@ -328,4 +336,13 @@ public void openFileChooser(ValueCallback uploadMsg, String acceptType, Str public ValueCallback getValueCallback() { return this.mUploadMessage; } + + public void destroyAllDialogs(){ + if(dialogsManager != null){ + for (int i = 0; i < dialogsManager.size(); i++){ + dialogsManager.get(i).cancel(); + } + } + } + } diff --git a/framework/src/org/apache/cordova/CordovaWebView.java b/framework/src/org/apache/cordova/CordovaWebView.java index 72aa17162..4652e7ebd 100755 --- a/framework/src/org/apache/cordova/CordovaWebView.java +++ b/framework/src/org/apache/cordova/CordovaWebView.java @@ -923,4 +923,8 @@ public CordovaResourceApi getResourceApi() { public CordovaPreferences getPreferences() { return preferences; } + + public void destroyDialogs(){ + this.chromeClient.destroyAllDialogs(); + } } From f2982442aec60fe1c0e3d25d2214fa31627fb9d1 Mon Sep 17 00:00:00 2001 From: Martin Gonzalez Date: Fri, 19 Sep 2014 10:39:40 -0500 Subject: [PATCH 2/2] Removed: destroyDialogs & CordovaActivity involvement Use CordovaWebView.handleDestroy() to destroy all dialogs, and remove any involvement of CordovaActivity. --- framework/src/org/apache/cordova/CordovaActivity.java | 4 +--- framework/src/org/apache/cordova/CordovaWebView.java | 7 +++---- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/framework/src/org/apache/cordova/CordovaActivity.java b/framework/src/org/apache/cordova/CordovaActivity.java index ad9140dad..c5b016503 100755 --- a/framework/src/org/apache/cordova/CordovaActivity.java +++ b/framework/src/org/apache/cordova/CordovaActivity.java @@ -628,9 +628,7 @@ protected void onResume() { public void onDestroy() { LOG.d(TAG, "CordovaActivity.onDestroy()"); super.onDestroy(); - //Destroy all used AlertDialogs - this.appView.destroyDialogs(); - + // hide the splash screen to avoid leaking a window this.removeSplashScreen(); diff --git a/framework/src/org/apache/cordova/CordovaWebView.java b/framework/src/org/apache/cordova/CordovaWebView.java index 4652e7ebd..d777db242 100755 --- a/framework/src/org/apache/cordova/CordovaWebView.java +++ b/framework/src/org/apache/cordova/CordovaWebView.java @@ -781,6 +781,9 @@ public void handleDestroy() // Load blank page so that JavaScript onunload is called this.loadUrl("about:blank"); + //Remove all dialogs + this.chromeClient.destroyAllDialogs(); + // Forward to plugins if (this.pluginManager != null) { this.pluginManager.onDestroy(); @@ -923,8 +926,4 @@ public CordovaResourceApi getResourceApi() { public CordovaPreferences getPreferences() { return preferences; } - - public void destroyDialogs(){ - this.chromeClient.destroyAllDialogs(); - } }