From fc23dcaaafdcec857be277ceabb9c5e421feef39 Mon Sep 17 00:00:00 2001 From: Arjan Schrijver Date: Fri, 3 Oct 2025 22:59:38 +0200 Subject: [PATCH] Improve background webview reliability --- .../appmanager/AbstractAppManagerFragment.java | 8 ++++++++ .../service/devices/pebble/PebbleIoThread.java | 2 +- .../gadgetbridge/util/WebViewSingleton.java | 14 +++++--------- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/appmanager/AbstractAppManagerFragment.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/appmanager/AbstractAppManagerFragment.java index 4ae4a62bf9..05d22a84b6 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/appmanager/AbstractAppManagerFragment.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/appmanager/AbstractAppManagerFragment.java @@ -500,6 +500,14 @@ public abstract class AbstractAppManagerFragment extends Fragment { if (requestCode == CHILD_ACTIVITY_WATCHFACE_EDITOR) { refreshList(); } + if ((mGBDevice.getType() == DeviceType.PEBBLE) && (((PebbleCoordinator) mGBDevice.getDeviceCoordinator()).isBackgroundJsEnabled(mGBDevice))) { + Intent startIntent = new Intent(getContext(), ExternalPebbleJSActivity.class); + startIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + startIntent.putExtra(GBDevice.EXTRA_DEVICE, mGBDevice); + startIntent.putExtra(ExternalPebbleJSActivity.START_BG_WEBVIEW, true); + getContext().startActivity(startIntent); + } + } protected void sendOrderToDevice(String concatFilename) { diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/PebbleIoThread.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/PebbleIoThread.java index 12558e77bb..9281652cdb 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/PebbleIoThread.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/PebbleIoThread.java @@ -549,7 +549,7 @@ class PebbleIoThread extends GBDeviceIoThread { if (mPebbleProtocol.hasAppMessageHandler(appMgmt.uuid)) { WebViewSingleton.getInstance().stopJavascriptInterface(); } else { - WebViewSingleton.getInstance().runJavascriptInterface(gbDevice, appMgmt.uuid); + WebViewSingleton.getInstance().runJavascriptInterface(getContext(), gbDevice, appMgmt.uuid); } } 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 d12eb1c82c..be05a0bc47 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/WebViewSingleton.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/WebViewSingleton.java @@ -17,7 +17,6 @@ along with this program. If not, see . */ package nodomain.freeyourgadget.gadgetbridge.util; -import android.app.Activity; import android.content.Context; import android.content.MutableContextWrapper; import android.os.Handler; @@ -33,9 +32,9 @@ import org.slf4j.LoggerFactory; import java.util.UUID; import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice; +import nodomain.freeyourgadget.gadgetbridge.service.devices.pebble.webview.JSInterface; import nodomain.freeyourgadget.gadgetbridge.webview.GBChromeClient; import nodomain.freeyourgadget.gadgetbridge.webview.GBWebClient; -import nodomain.freeyourgadget.gadgetbridge.service.devices.pebble.webview.JSInterface; public class WebViewSingleton { @@ -50,7 +49,7 @@ public class WebViewSingleton { private WebViewSingleton() { } - public static synchronized void ensureCreated(Activity context) { + public static synchronized void ensureCreated(Context context) { if (instance.webView == null) { instance.contextWrapper = new MutableContextWrapper(context); instance.mainLooper = context.getMainLooper(); @@ -58,6 +57,7 @@ public class WebViewSingleton { WebView.setWebContentsDebuggingEnabled(true); instance.webView.setWillNotDraw(true); instance.webView.clearCache(true); + instance.webView.resumeTimers(); instance.webView.setWebViewClient(new GBWebClient()); instance.webView.setWebChromeClient(new GBChromeClient()); WebSettings webSettings = instance.webView.getSettings(); @@ -101,12 +101,9 @@ public class WebViewSingleton { } } - public void runJavascriptInterface(@NonNull Activity context, @NonNull GBDevice device, @NonNull UUID uuid) { + public void runJavascriptInterface(@NonNull Context context, @NonNull GBDevice device, @NonNull UUID uuid) { ensureCreated(context); - runJavascriptInterface(device, uuid); - } - - public void runJavascriptInterface(@NonNull GBDevice device, @NonNull UUID uuid) { + InternetHelperSingleton.INSTANCE.ensureInternetHelperBound(); if (uuid.equals(currentRunningUUID)) { LOG.debug("WEBVIEW uuid not changed keeping the old context"); } else { @@ -119,7 +116,6 @@ public class WebViewSingleton { webView.addJavascriptInterface(jsInterface, "GBjs"); webView.loadUrl("file:///android_asset/app_config/configure.html?rand=" + Math.random() * 500); }); - InternetHelperSingleton.INSTANCE.ensureInternetHelperBound(); } }