1
0
mirror of https://codeberg.org/Freeyourgadget/Gadgetbridge synced 2024-08-25 00:30:37 +02:00

Trying to simplify ExternalPebbleJSActivity#onCreate() a bit

(by splitting into separate methods)
This commit is contained in:
cpfeiffer 2018-01-14 00:20:13 +01:00
parent 9ee1aa87e8
commit da5d1e3685
4 changed files with 95 additions and 68 deletions

View File

@ -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

View File

@ -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) {

View File

@ -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));

View File

@ -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);
}