From 19a5feb87504e4fc8d6e17f82249acab06a1b74b Mon Sep 17 00:00:00 2001 From: Rick Habets Date: Sat, 27 Mar 2021 16:19:46 +0100 Subject: [PATCH] fix: add not null checks to prevent running on destroyed activity (#1148) * (android) #1002: Add Null Pointer Checks to prevent Cordova from running on a destroyed activity * (android) Add logging statements if Cordova Activity does not exist anymore (i.e. is destroyed) Co-authored-by: Habets Rick --- .../apache/cordova/CordovaWebViewImpl.java | 46 ++++++++++++------- 1 file changed, 30 insertions(+), 16 deletions(-) diff --git a/framework/src/org/apache/cordova/CordovaWebViewImpl.java b/framework/src/org/apache/cordova/CordovaWebViewImpl.java index a77502d6..8fa313aa 100644 --- a/framework/src/org/apache/cordova/CordovaWebViewImpl.java +++ b/framework/src/org/apache/cordova/CordovaWebViewImpl.java @@ -176,22 +176,28 @@ public class CordovaWebViewImpl implements CordovaWebView { e.printStackTrace(); } - // If timeout, then stop loading and handle error - if (loadUrlTimeout == currentLoadUrlTimeout) { + // If timeout, then stop loading and handle error (if activity still exists) + if (loadUrlTimeout == currentLoadUrlTimeout && cordova.getActivity() != null) { cordova.getActivity().runOnUiThread(loadError); + } else if (cordova.getActivity() == null) { + LOG.d(TAG, "Cordova activity does not exist."); } } }; - final boolean _recreatePlugins = recreatePlugins; - cordova.getActivity().runOnUiThread(new Runnable() { - public void run() { - if (loadUrlTimeoutValue > 0) { - cordova.getThreadPool().execute(timeoutCheck); + if (cordova.getActivity() != null) { + final boolean _recreatePlugins = recreatePlugins; + cordova.getActivity().runOnUiThread(new Runnable() { + public void run() { + if (loadUrlTimeoutValue > 0) { + cordova.getThreadPool().execute(timeoutCheck); + } + engine.loadUrl(url, _recreatePlugins); } - engine.loadUrl(url, _recreatePlugins); - } - }); + }); + } else { + LOG.d(TAG, "Cordova activity does not exist."); + } } @@ -238,7 +244,11 @@ public class CordovaWebViewImpl implements CordovaWebView { } else { intent.setData(uri); } - cordova.getActivity().startActivity(intent); + if (cordova.getActivity() != null) { + cordova.getActivity().startActivity(intent); + } else { + LOG.d(TAG, "Cordova activity does not exist."); + } } catch (android.content.ActivityNotFoundException e) { LOG.e(TAG, "Error loading url " + url, e); } @@ -553,11 +563,15 @@ public class CordovaWebViewImpl implements CordovaWebView { public void run() { try { Thread.sleep(2000); - cordova.getActivity().runOnUiThread(new Runnable() { - public void run() { - pluginManager.postMessage("spinner", "stop"); - } - }); + if (cordova.getActivity() != null) { + cordova.getActivity().runOnUiThread(new Runnable() { + public void run() { + pluginManager.postMessage("spinner", "stop"); + } + }); + } else { + LOG.d(TAG, "Cordova activity does not exist."); + } } catch (InterruptedException e) { } }