mirror of
https://codeberg.org/Freeyourgadget/Gadgetbridge
synced 2024-07-01 09:16:24 +02:00
remove the pre-KITKAT checks as the minsupportedversion is KITKAT fix the currentPosition override move the returned configuration parsing to onResume method (where it was previously) as it seems more reliable pass the whole GBDeviceEventAppMessage object, this way the jsInterface in the webview doesn't need to be static anymore change the way the webview is initialized, this way the context doesn't need to be static anymore use runOnUiThread instead of the Handler .. MainLooper to post the commands to the webview instance comment a couple of custom message handler for weather as the watchapp seem to work well with JS alone add a couple of log messages for debugging known issue: legacy app configuration pasting does not work.
131 lines
4.4 KiB
Java
131 lines
4.4 KiB
Java
package nodomain.freeyourgadget.gadgetbridge.activities;
|
|
|
|
import android.content.Context;
|
|
import android.content.Intent;
|
|
import android.net.Uri;
|
|
import android.os.Bundle;
|
|
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;
|
|
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.LoggerFactory;
|
|
|
|
import java.util.UUID;
|
|
|
|
import nodomain.freeyourgadget.gadgetbridge.R;
|
|
import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice;
|
|
import nodomain.freeyourgadget.gadgetbridge.model.DeviceService;
|
|
import nodomain.freeyourgadget.gadgetbridge.util.GB;
|
|
import nodomain.freeyourgadget.gadgetbridge.util.WebViewSingleton;
|
|
|
|
public class ExternalPebbleJSActivity extends GBActivity {
|
|
|
|
private static final Logger LOG = LoggerFactory.getLogger(ExternalPebbleJSActivity.class);
|
|
|
|
private UUID appUuid;
|
|
private Uri confUri;
|
|
private GBDevice mGBDevice = null;
|
|
private WebView myWebView;
|
|
|
|
@Override
|
|
protected void onCreate(Bundle savedInstanceState) {
|
|
super.onCreate(savedInstanceState);
|
|
|
|
Bundle extras = getIntent().getExtras();
|
|
if (extras != null) {
|
|
mGBDevice = extras.getParcelable(GBDevice.EXTRA_DEVICE);
|
|
appUuid = (UUID) extras.getSerializable(DeviceService.EXTRA_APP_UUID);
|
|
} else {
|
|
throw new IllegalArgumentException("Must provide a device when invoking this activity");
|
|
}
|
|
|
|
setContentView(R.layout.activity_external_pebble_js);
|
|
|
|
WebViewSingleton.updateActivityContext(this);
|
|
myWebView = WebViewSingleton.getWebView();
|
|
myWebView.setWillNotDraw(false);
|
|
myWebView.removeJavascriptInterface("GBActivity");
|
|
myWebView.addJavascriptInterface(new ActivityJSInterface(ExternalPebbleJSActivity.this), "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);
|
|
//show configuration
|
|
myWebView.evaluateJavascript("Pebble.evaluate('showConfiguration');", new ValueCallback<String>() {
|
|
@Override
|
|
public void onReceiveValue(String s) {
|
|
LOG.debug("Callback from showConfiguration: " + s);
|
|
}
|
|
});
|
|
}
|
|
|
|
@Override
|
|
public void onViewDetachedFromWindow(View v) {
|
|
myWebView.removeJavascriptInterface("GBActivity");
|
|
myWebView.setWillNotDraw(true);
|
|
FrameLayout fl = (FrameLayout) findViewById(R.id.webview_placeholder);
|
|
fl.removeAllViews();
|
|
}
|
|
});
|
|
}
|
|
|
|
@Override
|
|
protected void onResume() {
|
|
super.onResume();
|
|
String queryString = "";
|
|
if (confUri != null) {
|
|
//getting back with configuration data
|
|
LOG.debug("WEBVIEW returned config: " + confUri.toString());
|
|
try {
|
|
appUuid = UUID.fromString(confUri.getHost());
|
|
queryString = confUri.getEncodedQuery();
|
|
} catch (IllegalArgumentException e) {
|
|
GB.toast("returned uri: " + confUri.toString(), Toast.LENGTH_LONG, GB.ERROR);
|
|
}
|
|
myWebView.loadUrl("file:///android_asset/app_config/configure.html?" + queryString);
|
|
}
|
|
}
|
|
@Override
|
|
protected void onNewIntent(Intent incoming) {
|
|
incoming.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
|
|
super.onNewIntent(incoming);
|
|
confUri = incoming.getData();
|
|
}
|
|
|
|
@Override
|
|
public boolean onOptionsItemSelected(MenuItem item) {
|
|
switch (item.getItemId()) {
|
|
case android.R.id.home:
|
|
NavUtils.navigateUpFromSameTask(this);
|
|
return true;
|
|
}
|
|
return super.onOptionsItemSelected(item);
|
|
}
|
|
|
|
private class ActivityJSInterface {
|
|
|
|
Context mContext;
|
|
|
|
public ActivityJSInterface(Context c) {
|
|
mContext = c;
|
|
}
|
|
|
|
@JavascriptInterface
|
|
public void closeActivity() {
|
|
NavUtils.navigateUpFromSameTask((ExternalPebbleJSActivity) mContext);
|
|
}
|
|
}
|
|
|
|
}
|