From 75d4abc9dc1eee915fd768c92f535a92b14153c5 Mon Sep 17 00:00:00 2001 From: Daniele Gobbetti Date: Sat, 4 Mar 2017 20:43:32 +0100 Subject: [PATCH] Pebble background webview: bring back the mutableContextWrapper, otherwise inputs aren't working. Reliably go back to first step of the configuration page when closing (this causes a Toast when closing the activity while in the clay settings page) --- .../app_config/js/gadgetbridge_boilerplate.js | 2 ++ .../activities/ExternalPebbleJSActivity.java | 7 +++++++ .../gadgetbridge/util/WebViewSingleton.java | 20 +++++++++++-------- 3 files changed, 21 insertions(+), 8 deletions(-) diff --git a/app/src/main/assets/app_config/js/gadgetbridge_boilerplate.js b/app/src/main/assets/app_config/js/gadgetbridge_boilerplate.js index 081118ca8..d3197f108 100644 --- a/app/src/main/assets/app_config/js/gadgetbridge_boilerplate.js +++ b/app/src/main/assets/app_config/js/gadgetbridge_boilerplate.js @@ -109,6 +109,7 @@ function gbPebble() { this.actuallySendData = function() { GBjs.sendAppMessage(self.configurationValues); + showStep("step1"); GBActivity.closeActivity(); } @@ -209,6 +210,7 @@ if (jsConfigFile != null) { Pebble.evaluate('showConfiguration'); } else { window.onfocus = function () { + showStep("step1"); GBjs.gbLog("window focused!!!"); Pebble.evaluate('showConfiguration'); }; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/ExternalPebbleJSActivity.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/ExternalPebbleJSActivity.java index b3db976c9..999d2620f 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/ExternalPebbleJSActivity.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/ExternalPebbleJSActivity.java @@ -8,6 +8,7 @@ import android.support.v4.app.NavUtils; import android.view.MenuItem; import android.view.View; import android.webkit.JavascriptInterface; +import android.webkit.ValueCallback; import android.webkit.WebView; import android.widget.FrameLayout; import android.widget.Toast; @@ -70,6 +71,12 @@ public class ExternalPebbleJSActivity extends GBActivity { public void onViewDetachedFromWindow(View v) { myWebView.removeJavascriptInterface("GBActivity"); myWebView.setWillNotDraw(true); + myWebView.evaluateJavascript("showStep('step1')", new ValueCallback() { + @Override + public void onReceiveValue(String s) { + LOG.debug("Callback from window detach: " + s); + } + }); FrameLayout fl = (FrameLayout) findViewById(R.id.webview_placeholder); fl.removeAllViews(); } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/WebViewSingleton.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/WebViewSingleton.java index fd53c95c6..961e4cedc 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/WebViewSingleton.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/WebViewSingleton.java @@ -4,12 +4,15 @@ import android.Manifest; import android.app.Activity; import android.content.Context; import android.content.Intent; +import android.content.MutableContextWrapper; import android.content.pm.PackageManager; import android.location.Criteria; import android.location.Location; import android.location.LocationManager; import android.net.Uri; import android.os.Build; +import android.os.Handler; +import android.os.Looper; import android.support.annotation.NonNull; import android.support.v4.app.ActivityCompat; import android.webkit.ConsoleMessage; @@ -58,7 +61,8 @@ public class WebViewSingleton { private static final Logger LOG = LoggerFactory.getLogger(WebViewSingleton.class); private static WebView instance = null; - private Activity contextWrapper; + private MutableContextWrapper contextWrapper; + private Looper mainLooper; private static WebViewSingleton webViewSingleton = new WebViewSingleton(); private static UUID currentRunningUUID; @@ -67,8 +71,9 @@ public class WebViewSingleton { public static synchronized WebView createWebView(Activity context) { if (instance == null) { - webViewSingleton.contextWrapper = context; - instance = new WebView(context); + webViewSingleton.contextWrapper = new MutableContextWrapper(context); + webViewSingleton.mainLooper = context.getMainLooper(); + instance = new WebView(webViewSingleton.contextWrapper); instance.setWillNotDraw(true); instance.clearCache(true); instance.setWebViewClient(new GBWebClient()); @@ -86,7 +91,7 @@ public class WebViewSingleton { public static void updateActivityContext(Activity context) { if (context instanceof Activity) { - webViewSingleton.contextWrapper = context; + webViewSingleton.contextWrapper.setBaseContext(context); } } @@ -104,7 +109,7 @@ public class WebViewSingleton { } else { LOG.debug("WEBVIEW uuid changed, restarting"); currentRunningUUID = uuid; - webViewSingleton.contextWrapper.runOnUiThread(new Runnable() { + new Handler(webViewSingleton.mainLooper).post(new Runnable() { @Override public void run() { instance.removeJavascriptInterface("GBjs"); @@ -125,8 +130,7 @@ public class WebViewSingleton { final String appMessage = parseIncomingAppMessage(message.message, message.appUUID); LOG.debug("to WEBVIEW: " + appMessage); - - webViewSingleton.contextWrapper.runOnUiThread(new Runnable() { + new Handler(webViewSingleton.mainLooper).post(new Runnable() { @Override public void run() { instance.evaluateJavascript("Pebble.evaluate('appmessage',[" + appMessage + "]);", new ValueCallback() { @@ -141,7 +145,7 @@ public class WebViewSingleton { } public static void disposeWebView() { - webViewSingleton.contextWrapper.runOnUiThread(new Runnable() { + new Handler(webViewSingleton.mainLooper).post(new Runnable() { @Override public void run() { if (instance != null) {