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 7c0dd0854..ade8f8589 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/ExternalPebbleJSActivity.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/ExternalPebbleJSActivity.java @@ -20,6 +20,7 @@ package nodomain.freeyourgadget.gadgetbridge.activities; import android.content.Intent; import android.net.Uri; import android.os.Bundle; +import android.support.annotation.NonNull; import android.support.v4.app.NavUtils; import android.view.MenuItem; import android.view.View; @@ -51,6 +52,10 @@ public class ExternalPebbleJSActivity extends AbstractGBActivity { private static final Logger LOG = LoggerFactory.getLogger(ExternalPebbleJSActivity.class); private Uri confUri; + /** + * When bgjs is enabled, this field refers to the WebViewSingleton, + * otherwise it refers to the legacy webview from the activity_legacy_external_pebble_js layout + */ private WebView myWebView; public static final String START_BG_WEBVIEW = "start_webview"; public static final String SHOW_CONFIG = "configure"; @@ -58,74 +63,90 @@ public class ExternalPebbleJSActivity extends AbstractGBActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - GBDevice currentDevice = null; - UUID currentUUID = null; Bundle extras = getIntent().getExtras(); - if (extras != null) { - currentDevice = extras.getParcelable(GBDevice.EXTRA_DEVICE); - currentUUID = (UUID) extras.getSerializable(DeviceService.EXTRA_APP_UUID); - - Objects.requireNonNull(currentDevice, "Must provide a device when invoking this activity"); - Objects.requireNonNull(currentUUID, "Must provide a uuid when invoking this activity"); - - if (GBApplication.getPrefs().getBoolean("pebble_enable_background_javascript", false)) { - if (extras.getBoolean(SHOW_CONFIG, false)) { - WebViewSingleton.runJavascriptInterface(currentDevice, currentUUID); - } else if (extras.getBoolean(START_BG_WEBVIEW, false)) { - WebViewSingleton.ensureCreated(this); - finish(); - return; - } - } - } else { + if (extras == null) { throw new IllegalArgumentException("Must provide device and uuid in extras when invoking this activity"); } - if (GBApplication.getPrefs().getBoolean("pebble_enable_background_javascript", false)) { - setContentView(R.layout.activity_external_pebble_js); - myWebView = WebViewSingleton.getWebView(this); - if (myWebView.getParent() != null) { - ((ViewGroup) myWebView.getParent()).removeView(myWebView); - } - myWebView.setWillNotDraw(false); - myWebView.removeJavascriptInterface("GBActivity"); - myWebView.addJavascriptInterface(new ActivityJSInterface(), "GBActivity"); - FrameLayout fl = (FrameLayout) findViewById(R.id.webview_placeholder); - fl.addView(myWebView); - - myWebView.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() { - @Override - public void onViewAttachedToWindow(View v) { - v.setLayerType(View.LAYER_TYPE_HARDWARE, null); - } - - @Override - public void onViewDetachedFromWindow(View v) { - v.removeOnAttachStateChangeListener(this); - FrameLayout fl = (FrameLayout) findViewById(R.id.webview_placeholder); - fl.removeAllViews(); - } - }); - } else { - setContentView(R.layout.activity_legacy_external_pebble_js); - myWebView = (WebView) findViewById(R.id.configureWebview); - myWebView.clearCache(true); - myWebView.setWebViewClient(new GBWebClient()); - myWebView.setWebChromeClient(new GBChromeClient()); - WebSettings webSettings = myWebView.getSettings(); - webSettings.setJavaScriptEnabled(true); - //needed to access the DOM - webSettings.setDomStorageEnabled(true); - //needed for localstorage - webSettings.setDatabaseEnabled(true); - - JSInterface gbJSInterface = new JSInterface(currentDevice, currentUUID); - myWebView.addJavascriptInterface(gbJSInterface, "GBjs"); - myWebView.addJavascriptInterface(new ActivityJSInterface(), "GBActivity"); - - myWebView.loadUrl("file:///android_asset/app_config/configure.html"); - + if (extras.getBoolean(START_BG_WEBVIEW, false)) { + startBackgroundWebViewAndFinish(); + return; } + + GBDevice currentDevice = extras.getParcelable(GBDevice.EXTRA_DEVICE); + UUID currentUUID = (UUID) extras.getSerializable(DeviceService.EXTRA_APP_UUID); + + if (GBApplication.getGBPrefs().isBackgroundJsEnabled()) { + if (extras.getBoolean(SHOW_CONFIG, false)) { + Objects.requireNonNull(currentDevice, "Must provide a device when invoking this activity"); + Objects.requireNonNull(currentUUID, "Must provide a uuid when invoking this activity"); + + WebViewSingleton.runJavascriptInterface(currentDevice, currentUUID); + } + + // FIXME: is this really supposed to be outside the check for SHOW_CONFIG? + setupBGWebView(); + } else { + Objects.requireNonNull(currentDevice, "Must provide a device when invoking this activity without bgjs"); + Objects.requireNonNull(currentUUID, "Must provide a uuid when invoking this activity without bgjs"); + setupLegacyWebView(currentDevice, currentUUID); + } + } + + private void startBackgroundWebViewAndFinish() { + if (GBApplication.getGBPrefs().isBackgroundJsEnabled()) { + WebViewSingleton.ensureCreated(this); + } else { + LOG.warn("BGJs disabled, not starting webview"); + } + finish(); + } + + private void setupBGWebView() { + setContentView(R.layout.activity_external_pebble_js); + myWebView = WebViewSingleton.getWebView(this); + if (myWebView.getParent() != null) { + ((ViewGroup) myWebView.getParent()).removeView(myWebView); + } + myWebView.setWillNotDraw(false); + myWebView.removeJavascriptInterface("GBActivity"); + myWebView.addJavascriptInterface(new ActivityJSInterface(), "GBActivity"); + FrameLayout fl = (FrameLayout) findViewById(R.id.webview_placeholder); + fl.addView(myWebView); + + myWebView.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() { + @Override + public void onViewAttachedToWindow(View v) { + v.setLayerType(View.LAYER_TYPE_HARDWARE, null); + } + + @Override + public void onViewDetachedFromWindow(View v) { + v.removeOnAttachStateChangeListener(this); + FrameLayout fl = (FrameLayout) findViewById(R.id.webview_placeholder); + fl.removeAllViews(); + } + }); + } + + private void setupLegacyWebView(@NonNull GBDevice device, @NonNull UUID uuid) { + setContentView(R.layout.activity_legacy_external_pebble_js); + myWebView = (WebView) findViewById(R.id.configureWebview); + myWebView.clearCache(true); + myWebView.setWebViewClient(new GBWebClient()); + myWebView.setWebChromeClient(new GBChromeClient()); + WebSettings webSettings = myWebView.getSettings(); + webSettings.setJavaScriptEnabled(true); + //needed to access the DOM + webSettings.setDomStorageEnabled(true); + //needed for localstorage + webSettings.setDatabaseEnabled(true); + + JSInterface gbJSInterface = new JSInterface(device, uuid); + myWebView.addJavascriptInterface(gbJSInterface, "GBjs"); + myWebView.addJavascriptInterface(new ActivityJSInterface(), "GBActivity"); + + myWebView.loadUrl("file:///android_asset/app_config/configure.html"); } @Override 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 c6f087320..5178fb814 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 @@ -198,7 +198,7 @@ class PebbleIoThread extends GBDeviceIoThread { mOutStream = mBtSocket.getOutputStream(); } } - if (prefs.getBoolean("pebble_enable_background_javascript", false)) { + if (GBApplication.getGBPrefs().isBackgroundJsEnabled()) { Intent startIntent = new Intent(getContext(), ExternalPebbleJSActivity.class); startIntent.putExtra(ExternalPebbleJSActivity.START_BG_WEBVIEW, true); getContext().startActivity(startIntent); @@ -422,7 +422,7 @@ class PebbleIoThread extends GBDeviceIoThread { gbDevice.setState(GBDevice.State.WAITING_FOR_RECONNECT); } - if (prefs.getBoolean("pebble_enable_background_javascript", false)) { + if (GBApplication.getGBPrefs().isBackgroundJsEnabled()) { WebViewSingleton.disposeWebView(); } @@ -550,7 +550,7 @@ class PebbleIoThread extends GBDeviceIoThread { break; case START: LOG.info("got GBDeviceEventAppManagement START event for uuid: " + appMgmt.uuid); - if (prefs.getBoolean("pebble_enable_background_javascript", false)) { + if (GBApplication.getGBPrefs().isBackgroundJsEnabled()) { if (mPebbleProtocol.hasAppMessageHandler(appMgmt.uuid)) { WebViewSingleton.stopJavascriptInterface(); } else { @@ -568,7 +568,7 @@ class PebbleIoThread extends GBDeviceIoThread { setInstallSlot(appInfoEvent.freeSlot); return false; } else if (deviceEvent instanceof GBDeviceEventAppMessage) { - if (GBApplication.getPrefs().getBoolean("pebble_enable_background_javascript", false)) { + if (GBApplication.getGBPrefs().isBackgroundJsEnabled()) { sendAppMessageJS((GBDeviceEventAppMessage) deviceEvent); } if (mEnablePebblekit) { diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/PebbleProtocol.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/PebbleProtocol.java index c5c7750e2..41eb585e3 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/PebbleProtocol.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/PebbleProtocol.java @@ -407,7 +407,7 @@ public class PebbleProtocol extends GBDeviceProtocol { super(device); mAppMessageHandlers.put(UUID_MORPHEUZ, new AppMessageHandlerMorpheuz(UUID_MORPHEUZ, PebbleProtocol.this)); mAppMessageHandlers.put(UUID_MISFIT, new AppMessageHandlerMisfit(UUID_MISFIT, PebbleProtocol.this)); - if (!(GBApplication.getPrefs().getBoolean("pebble_enable_background_javascript", false))) { + if (!GBApplication.getGBPrefs().isBackgroundJsEnabled()) { mAppMessageHandlers.put(UUID_PEBBLE_TIMESTYLE, new AppMessageHandlerTimeStylePebble(UUID_PEBBLE_TIMESTYLE, PebbleProtocol.this)); mAppMessageHandlers.put(UUID_PEBSTYLE, new AppMessageHandlerPebStyle(UUID_PEBSTYLE, PebbleProtocol.this)); mAppMessageHandlers.put(UUID_MARIOTIME, new AppMessageHandlerMarioTime(UUID_MARIOTIME, PebbleProtocol.this)); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/GBPrefs.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/GBPrefs.java index 1e623096e..7561467bf 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/GBPrefs.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/GBPrefs.java @@ -28,6 +28,8 @@ public class GBPrefs { public static final String AUTO_EXPORT_LOCATION = "auto_export_location"; public static final String AUTO_EXPORT_INTERVAL = "auto_export_interval"; private static final boolean AUTO_START_DEFAULT = true; + private static final String BG_JS_ENABLED = "pebble_enable_background_javascript"; + private static final boolean BG_JS_ENABLED_DEFAULT = false; public static boolean AUTO_RECONNECT_DEFAULT = true; public static final String USER_NAME = "mi_user_alias"; @@ -48,6 +50,10 @@ public class GBPrefs { return mPrefs.getBoolean(AUTO_START, AUTO_START_DEFAULT); } + public boolean isBackgroundJsEnabled() { + return mPrefs.getBoolean(BG_JS_ENABLED, BG_JS_ENABLED_DEFAULT); + } + public String getUserName() { return mPrefs.getString(USER_NAME, USER_NAME_DEFAULT); }