From 1914162b548bc126d5cf36ff163ede64b3aadb60 Mon Sep 17 00:00:00 2001 From: Arjan Schrijver Date: Mon, 15 Sep 2025 11:37:28 +0200 Subject: [PATCH] Improve automatic webview internethelper binding --- .../devices/pebble/webview/GBWebClient.java | 7 +- .../gadgetbridge/util/WebViewSingleton.java | 72 ++++++++----------- 2 files changed, 30 insertions(+), 49 deletions(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/webview/GBWebClient.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/webview/GBWebClient.java index cdc8372f17..2ee48beaa9 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/webview/GBWebClient.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/webview/GBWebClient.java @@ -77,7 +77,6 @@ public class GBWebClient extends WebViewClient { return super.shouldInterceptRequest(view, url); } - private WebResourceResponse mimicReply(Uri requestedUri) { if (requestedUri.getHost() != null && (StringUtils.indexOfAny(requestedUri.getHost(), AllowedDomains) != -1)) { if (WebViewSingleton.getInstance().internetHelperBound) { @@ -87,7 +86,6 @@ public class GBWebClient extends WebViewClient { } catch (RemoteException | InterruptedException e) { LOG.warn("Error downloading data from " + requestedUri, e); } - } else { if (StringUtils.endsWith(requestedUri.getHost(), "openweathermap.org")){ LOG.debug("WEBVIEW request to openweathermap.org detected of type: " + requestedUri.getPath() + " params: " + requestedUri.getQuery()); @@ -96,11 +94,11 @@ public class GBWebClient extends WebViewClient { LOG.debug("WEBVIEW request to rawgit.com detected of type: " + requestedUri.getPath() + " params: " + requestedUri.getQuery()); return mimicRawGitResponse(requestedUri.getPath()); } else { - LOG.debug("WEBVIEW request to allowed domain detected but not intercepted: " + requestedUri.toString()); + LOG.debug("WEBVIEW request to allowed domain detected but not intercepted: " + requestedUri); } } } else { - LOG.debug("WEBVIEW request:" + requestedUri.toString() + " not intercepted"); + LOG.debug("WEBVIEW request not intercepted:" + requestedUri); } return null; } @@ -277,5 +275,4 @@ public class GBWebClient extends WebViewClient { coord.put("lon", currentPosition.getLongitude()); return coord; } - } 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 880be7d97d..ca1ce6c165 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/WebViewSingleton.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/WebViewSingleton.java @@ -63,8 +63,6 @@ public class WebViewSingleton { private UUID currentRunningUUID; private IHttpService internetHelper = null; public boolean internetHelperBound; - private boolean internetHelperInstalled; - private WebResourceResponse internetResponse; private WebViewSingleton() { } @@ -184,32 +182,27 @@ public class WebViewSingleton { final JSInterface jsInterface = new JSInterface(device, uuid); LOG.debug("WEBVIEW uuid changed, restarting"); currentRunningUUID = uuid; - invokeWebview(new WebViewRunnable() { - @Override - public void invoke(WebView webView) { - webView.onResume(); - webView.removeJavascriptInterface("GBjs"); - webView.addJavascriptInterface(jsInterface, "GBjs"); - webView.loadUrl("file:///android_asset/app_config/configure.html?rand=" + Math.random() * 500); - } + invokeWebview(webView -> { + webView.onResume(); + webView.removeJavascriptInterface("GBjs"); + webView.addJavascriptInterface(jsInterface, "GBjs"); + webView.loadUrl("file:///android_asset/app_config/configure.html?rand=" + Math.random() * 500); }); - if (contextWrapper != null && !internetHelperBound && !internetHelperInstalled) { + if (contextWrapper != null && !internetHelperBound) { String internetHelperPkg = "nodomain.freeyourgadget.internethelper"; String internetHelperCls = internetHelperPkg + ".HttpService"; try { contextWrapper.getPackageManager().getApplicationInfo(internetHelperPkg, 0); Intent intent = new Intent(); intent.setComponent(new ComponentName(internetHelperPkg, internetHelperCls)); - internetHelperInstalled = true; final Intent intent1 = new Intent("nodomain.freeyourgadget.internethelper.HttpService"); intent1.setPackage("nodomain.freeyourgadget.internethelper"); contextWrapper.getApplicationContext().bindService(intent1, internetHelperConnection, Context.BIND_AUTO_CREATE); + LOG.info("WEBVIEW: Internet helper bound successfully."); } catch (PackageManager.NameNotFoundException e) { - internetHelperInstalled = false; LOG.info("WEBVIEW: Internet helper not installed, only mimicked HTTP requests will work."); } catch (SecurityException e) { - internetHelperInstalled = false; LOG.info("WEBVIEW: Permission for internet helper not granted, only mimicked HTTP requests will work."); } } @@ -217,12 +210,9 @@ public class WebViewSingleton { } public void stopJavascriptInterface() { - invokeWebview(new WebViewRunnable() { - @Override - public void invoke(WebView webView) { - webView.removeJavascriptInterface("GBjs"); - webView.loadUrl("about:blank"); - } + invokeWebview(webView -> { + webView.removeJavascriptInterface("GBjs"); + webView.loadUrl("about:blank"); }); } @@ -233,22 +223,19 @@ public class WebViewSingleton { internetHelperBound = false; } currentRunningUUID = null; - invokeWebview(new WebViewRunnable() { - @Override - public void invoke(WebView webView) { - webView.removeJavascriptInterface("GBjs"); -// webView.setWebChromeClient(null); -// webView.setWebViewClient(null); - webView.clearHistory(); - webView.clearCache(true); - webView.loadUrl("about:blank"); -// webView.freeMemory(); - webView.pauseTimers(); -// webView.destroy(); -// webView = null; -// contextWrapper = null; -// jsInterface = null; - } + invokeWebview(webView -> { + webView.removeJavascriptInterface("GBjs"); +// webView.setWebChromeClient(null); +// webView.setWebViewClient(null); + webView.clearHistory(); + webView.clearCache(true); + webView.loadUrl("about:blank"); +// webView.freeMemory(); + webView.pauseTimers(); +// webView.destroy(); +// webView = null; +// contextWrapper = null; +// jsInterface = null; }); } @@ -257,15 +244,12 @@ public class WebViewSingleton { LOG.warn("Webview already disposed, ignoring runnable"); return; } - new Handler(mainLooper).post(new Runnable() { - @Override - public void run() { - if (webView == null) { - LOG.warn("Webview already disposed, cannot invoke runnable"); - return; - } - runnable.invoke(webView); + new Handler(mainLooper).post(() -> { + if (webView == null) { + LOG.warn("Webview already disposed, cannot invoke runnable"); + return; } + runnable.invoke(webView); }); }