mirror of
https://codeberg.org/Freeyourgadget/Gadgetbridge.git
synced 2026-07-31 07:44:24 +02:00
Let BangleJS implementation use the generic webview
This commit is contained in:
committed by
Arjan Schrijver
parent
c2c67a3d78
commit
aa1e2f6b3a
+2
-2
@@ -51,8 +51,8 @@ import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice;
|
|||||||
import nodomain.freeyourgadget.gadgetbridge.model.DeviceService;
|
import nodomain.freeyourgadget.gadgetbridge.model.DeviceService;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.model.DeviceType;
|
import nodomain.freeyourgadget.gadgetbridge.model.DeviceType;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.DeviceCommunicationService;
|
import nodomain.freeyourgadget.gadgetbridge.service.DeviceCommunicationService;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.pebble.webview.GBChromeClient;
|
import nodomain.freeyourgadget.gadgetbridge.webview.GBChromeClient;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.pebble.webview.GBWebClient;
|
import nodomain.freeyourgadget.gadgetbridge.webview.GBWebClient;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.pebble.webview.JSInterface;
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.pebble.webview.JSInterface;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.util.GB;
|
import nodomain.freeyourgadget.gadgetbridge.util.GB;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.util.GBPrefs;
|
import nodomain.freeyourgadget.gadgetbridge.util.GBPrefs;
|
||||||
|
|||||||
+2
-2
@@ -35,8 +35,8 @@ import nodomain.freeyourgadget.gadgetbridge.activities.AbstractGBActivity
|
|||||||
import nodomain.freeyourgadget.gadgetbridge.devices.InstallHandler
|
import nodomain.freeyourgadget.gadgetbridge.devices.InstallHandler
|
||||||
import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice
|
import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice
|
||||||
import nodomain.freeyourgadget.gadgetbridge.model.DeviceService
|
import nodomain.freeyourgadget.gadgetbridge.model.DeviceService
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.pebble.webview.GBChromeClient
|
import nodomain.freeyourgadget.gadgetbridge.webview.GBChromeClient
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.pebble.webview.GBWebClient
|
import nodomain.freeyourgadget.gadgetbridge.webview.GBWebClient
|
||||||
import nodomain.freeyourgadget.gadgetbridge.util.GB
|
import nodomain.freeyourgadget.gadgetbridge.util.GB
|
||||||
import nodomain.freeyourgadget.gadgetbridge.util.InternetHelperSingleton
|
import nodomain.freeyourgadget.gadgetbridge.util.InternetHelperSingleton
|
||||||
import nodomain.freeyourgadget.internethelper.aidl.http.HttpGetRequest
|
import nodomain.freeyourgadget.internethelper.aidl.http.HttpGetRequest
|
||||||
|
|||||||
+2
-87
@@ -20,18 +20,13 @@ import static nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.Dev
|
|||||||
|
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.content.BroadcastReceiver;
|
import android.content.BroadcastReceiver;
|
||||||
import android.content.ComponentName;
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.IntentFilter;
|
import android.content.IntentFilter;
|
||||||
import android.content.ServiceConnection;
|
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.os.IBinder;
|
|
||||||
import android.os.Looper;
|
import android.os.Looper;
|
||||||
import android.os.ParcelFileDescriptor;
|
|
||||||
import android.os.RemoteException;
|
|
||||||
import android.util.Base64;
|
import android.util.Base64;
|
||||||
import android.webkit.DownloadListener;
|
import android.webkit.DownloadListener;
|
||||||
import android.webkit.JavascriptInterface;
|
import android.webkit.JavascriptInterface;
|
||||||
@@ -39,7 +34,6 @@ import android.webkit.PermissionRequest;
|
|||||||
import android.webkit.ValueCallback;
|
import android.webkit.ValueCallback;
|
||||||
import android.webkit.WebChromeClient;
|
import android.webkit.WebChromeClient;
|
||||||
import android.webkit.WebResourceRequest;
|
import android.webkit.WebResourceRequest;
|
||||||
import android.webkit.WebResourceResponse;
|
|
||||||
import android.webkit.WebSettings;
|
import android.webkit.WebSettings;
|
||||||
import android.webkit.WebView;
|
import android.webkit.WebView;
|
||||||
import android.webkit.WebViewClient;
|
import android.webkit.WebViewClient;
|
||||||
@@ -53,8 +47,6 @@ import org.slf4j.LoggerFactory;
|
|||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
import java.util.Map;
|
|
||||||
import java.util.concurrent.CountDownLatch;
|
|
||||||
|
|
||||||
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
|
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.R;
|
import nodomain.freeyourgadget.gadgetbridge.R;
|
||||||
@@ -62,13 +54,8 @@ import nodomain.freeyourgadget.gadgetbridge.activities.AbstractGBActivity;
|
|||||||
import nodomain.freeyourgadget.gadgetbridge.devices.DeviceCoordinator;
|
import nodomain.freeyourgadget.gadgetbridge.devices.DeviceCoordinator;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice;
|
import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.banglejs.BangleJSDeviceSupport;
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.banglejs.BangleJSDeviceSupport;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.util.Capsule;
|
import nodomain.freeyourgadget.gadgetbridge.webview.GBWebClient;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.util.Prefs;
|
import nodomain.freeyourgadget.gadgetbridge.util.Prefs;
|
||||||
import nodomain.freeyourgadget.internethelper.aidl.http.HttpGetRequest;
|
|
||||||
import nodomain.freeyourgadget.internethelper.aidl.http.HttpHeaders;
|
|
||||||
import nodomain.freeyourgadget.internethelper.aidl.http.HttpResponse;
|
|
||||||
import nodomain.freeyourgadget.internethelper.aidl.http.IHttpCallback;
|
|
||||||
import nodomain.freeyourgadget.internethelper.aidl.http.IHttpService;
|
|
||||||
|
|
||||||
public class AppsManagementActivity extends AbstractGBActivity {
|
public class AppsManagementActivity extends AbstractGBActivity {
|
||||||
private static final Logger LOG = LoggerFactory.getLogger(AppsManagementActivity.class);
|
private static final Logger LOG = LoggerFactory.getLogger(AppsManagementActivity.class);
|
||||||
@@ -95,15 +82,6 @@ public class AppsManagementActivity extends AbstractGBActivity {
|
|||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
setContentView(R.layout.activity_banglejs_apps_management);
|
setContentView(R.layout.activity_banglejs_apps_management);
|
||||||
|
|
||||||
final Intent intent1 = new Intent("nodomain.freeyourgadget.internethelper.HttpService");
|
|
||||||
intent1.setPackage("nodomain.freeyourgadget.internethelper");
|
|
||||||
boolean res = getApplicationContext().bindService(intent1, mHttpConnection, Context.BIND_AUTO_CREATE);
|
|
||||||
if (res) {
|
|
||||||
LOG.info("Bound to HttpService");
|
|
||||||
} else {
|
|
||||||
LOG.warn("Could not bind to HttpService");
|
|
||||||
}
|
|
||||||
|
|
||||||
Intent intent = getIntent();
|
Intent intent = getIntent();
|
||||||
Bundle bundle = intent.getExtras();
|
Bundle bundle = intent.getExtras();
|
||||||
if (bundle != null) {
|
if (bundle != null) {
|
||||||
@@ -214,21 +192,6 @@ public class AppsManagementActivity extends AbstractGBActivity {
|
|||||||
// see onActivityResult
|
// see onActivityResult
|
||||||
}
|
}
|
||||||
|
|
||||||
private volatile IHttpService iHttpService;
|
|
||||||
private final CountDownLatch latchInit = new CountDownLatch(1);
|
|
||||||
|
|
||||||
private final ServiceConnection mHttpConnection = new ServiceConnection() {
|
|
||||||
public void onServiceConnected(final ComponentName className, final IBinder service) {
|
|
||||||
LOG.info("onServiceConnected: {}", className);
|
|
||||||
iHttpService = IHttpService.Stub.asInterface(service);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void onServiceDisconnected(final ComponentName className) {
|
|
||||||
LOG.error("Service has unexpectedly disconnected: {}", className);
|
|
||||||
iHttpService = null;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
private void initViews() {
|
private void initViews() {
|
||||||
//https://stackoverflow.com/questions/4325639/android-calling-javascript-functions-in-webview
|
//https://stackoverflow.com/questions/4325639/android-calling-javascript-functions-in-webview
|
||||||
webView = findViewById(R.id.webview);
|
webView = findViewById(R.id.webview);
|
||||||
@@ -247,7 +210,7 @@ public class AppsManagementActivity extends AbstractGBActivity {
|
|||||||
Prefs devicePrefs = new Prefs(GBApplication.getDeviceSpecificSharedPrefs(mGBDevice.getAddress()));
|
Prefs devicePrefs = new Prefs(GBApplication.getDeviceSpecificSharedPrefs(mGBDevice.getAddress()));
|
||||||
final String url = devicePrefs.getString(PREF_BANGLEJS_WEBVIEW_URL, "https://banglejs.com/apps/android.html").trim();
|
final String url = devicePrefs.getString(PREF_BANGLEJS_WEBVIEW_URL, "https://banglejs.com/apps/android.html").trim();
|
||||||
|
|
||||||
webView.setWebViewClient(new WebViewClient(){
|
webView.setWebViewClient(new GBWebClient(){
|
||||||
@Override
|
@Override
|
||||||
public void onPageFinished(WebView view, String weburl){
|
public void onPageFinished(WebView view, String weburl){
|
||||||
//webView.loadUrl("javascript:showToast('WebView in Espruino')");
|
//webView.loadUrl("javascript:showToast('WebView in Espruino')");
|
||||||
@@ -259,54 +222,6 @@ public class AppsManagementActivity extends AbstractGBActivity {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
|
|
||||||
LOG.info("shouldIntercept {} {} {}", request.getMethod(), request.getUrl(), iHttpService != null);
|
|
||||||
if (!request.getMethod().equalsIgnoreCase("get")) {
|
|
||||||
return super.shouldInterceptRequest(view, request);
|
|
||||||
}
|
|
||||||
if (iHttpService == null) {
|
|
||||||
return super.shouldInterceptRequest(view, request);
|
|
||||||
}
|
|
||||||
final HttpHeaders httpHeaders = new HttpHeaders();
|
|
||||||
for (Map.Entry<String, String> header : request.getRequestHeaders().entrySet()) {
|
|
||||||
httpHeaders.addHeader(header.getKey(), header.getValue());
|
|
||||||
}
|
|
||||||
final HttpGetRequest httpGetRequest = new HttpGetRequest(request.getUrl().toString(), httpHeaders);
|
|
||||||
CountDownLatch latch = new CountDownLatch(1);
|
|
||||||
final Capsule<WebResourceResponse> internetResponseCapsule = new Capsule<>();
|
|
||||||
try {
|
|
||||||
iHttpService.get(httpGetRequest, new IHttpCallback.Stub() {
|
|
||||||
@Override
|
|
||||||
public void onResponse(HttpResponse response) throws RemoteException {
|
|
||||||
WebResourceResponse internetResponse = new WebResourceResponse(
|
|
||||||
response.getHeaders().get("content-type"),
|
|
||||||
response.getHeaders().get("content-encoding"),
|
|
||||||
response.getStatus(), "OK",
|
|
||||||
response.getHeaders().toMap(),
|
|
||||||
new ParcelFileDescriptor.AutoCloseInputStream(response.getBody())
|
|
||||||
);
|
|
||||||
internetResponseCapsule.set(internetResponse);
|
|
||||||
latch.countDown();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onException(String message) throws RemoteException {
|
|
||||||
throw new RuntimeException(message);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
} catch (RemoteException e) {
|
|
||||||
throw new RuntimeException(e);
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
latch.await();
|
|
||||||
} catch (InterruptedException e) {
|
|
||||||
throw new RuntimeException(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
return internetResponseCapsule.get();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
|
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
|
||||||
Toast.makeText(AppsManagementActivity.this, "Error:" + description, Toast.LENGTH_SHORT).show();
|
Toast.makeText(AppsManagementActivity.this, "Error:" + description, Toast.LENGTH_SHORT).show();
|
||||||
|
|||||||
+1
-1
@@ -27,7 +27,7 @@ import org.slf4j.Logger;
|
|||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import nodomain.freeyourgadget.gadgetbridge.externalevents.gps.GBLocationProvider;
|
import nodomain.freeyourgadget.gadgetbridge.externalevents.gps.GBLocationProvider;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.pebble.webview.CurrentPosition;
|
import nodomain.freeyourgadget.gadgetbridge.webview.CurrentPosition;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A mock location provider which keeps updating the location at a constant speed, starting from the
|
* A mock location provider which keeps updating the location at a constant speed, starting from the
|
||||||
|
|||||||
+1
-1
@@ -77,7 +77,7 @@ import nodomain.freeyourgadget.gadgetbridge.model.WeatherSpec;
|
|||||||
import nodomain.freeyourgadget.gadgetbridge.service.btle.AbstractBTLESingleDeviceSupport;
|
import nodomain.freeyourgadget.gadgetbridge.service.btle.AbstractBTLESingleDeviceSupport;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.btle.BLETypeConversions;
|
import nodomain.freeyourgadget.gadgetbridge.service.btle.BLETypeConversions;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.btle.TransactionBuilder;
|
import nodomain.freeyourgadget.gadgetbridge.service.btle.TransactionBuilder;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.pebble.webview.CurrentPosition;
|
import nodomain.freeyourgadget.gadgetbridge.webview.CurrentPosition;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.serial.GBDeviceProtocol;
|
import nodomain.freeyourgadget.gadgetbridge.service.serial.GBDeviceProtocol;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.util.GB;
|
import nodomain.freeyourgadget.gadgetbridge.util.GB;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.util.MediaManager;
|
import nodomain.freeyourgadget.gadgetbridge.util.MediaManager;
|
||||||
|
|||||||
+1
-1
@@ -53,7 +53,7 @@ import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.http.HttpHand
|
|||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.messages.GFDIMessage;
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.messages.GFDIMessage;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.messages.ProtobufMessage;
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.messages.ProtobufMessage;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.messages.status.ProtobufStatusMessage;
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.garmin.messages.status.ProtobufStatusMessage;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.pebble.webview.CurrentPosition;
|
import nodomain.freeyourgadget.gadgetbridge.webview.CurrentPosition;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.util.DateTimeUtils;
|
import nodomain.freeyourgadget.gadgetbridge.util.DateTimeUtils;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.util.GB;
|
import nodomain.freeyourgadget.gadgetbridge.util.GB;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.util.calendar.CalendarEvent;
|
import nodomain.freeyourgadget.gadgetbridge.util.calendar.CalendarEvent;
|
||||||
|
|||||||
+1
-1
@@ -27,7 +27,7 @@ import nodomain.freeyourgadget.gadgetbridge.model.weather.Weather;
|
|||||||
import nodomain.freeyourgadget.gadgetbridge.model.weather.WeatherMapper;
|
import nodomain.freeyourgadget.gadgetbridge.model.weather.WeatherMapper;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.model.WeatherSpec;
|
import nodomain.freeyourgadget.gadgetbridge.model.WeatherSpec;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.btle.BLETypeConversions;
|
import nodomain.freeyourgadget.gadgetbridge.service.btle.BLETypeConversions;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.pebble.webview.CurrentPosition;
|
import nodomain.freeyourgadget.gadgetbridge.webview.CurrentPosition;
|
||||||
|
|
||||||
@SuppressWarnings("unused")
|
@SuppressWarnings("unused")
|
||||||
public class WeatherHandler {
|
public class WeatherHandler {
|
||||||
|
|||||||
+1
-1
@@ -57,7 +57,7 @@ import nodomain.freeyourgadget.gadgetbridge.model.weather.Weather;
|
|||||||
import nodomain.freeyourgadget.gadgetbridge.service.btle.AbstractBTLESingleDeviceSupport;
|
import nodomain.freeyourgadget.gadgetbridge.service.btle.AbstractBTLESingleDeviceSupport;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.btle.TransactionBuilder;
|
import nodomain.freeyourgadget.gadgetbridge.service.btle.TransactionBuilder;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.btle.profiles.deviceinfo.DeviceInfo;
|
import nodomain.freeyourgadget.gadgetbridge.service.btle.profiles.deviceinfo.DeviceInfo;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.pebble.webview.CurrentPosition;
|
import nodomain.freeyourgadget.gadgetbridge.webview.CurrentPosition;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.util.AlarmUtils;
|
import nodomain.freeyourgadget.gadgetbridge.util.AlarmUtils;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.util.GB;
|
import nodomain.freeyourgadget.gadgetbridge.util.GB;
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -52,7 +52,7 @@ import nodomain.freeyourgadget.gadgetbridge.devices.huami.HuamiWeatherConditions
|
|||||||
import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice;
|
import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.model.weather.Weather;
|
import nodomain.freeyourgadget.gadgetbridge.model.weather.Weather;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.model.WeatherSpec;
|
import nodomain.freeyourgadget.gadgetbridge.model.WeatherSpec;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.pebble.webview.CurrentPosition;
|
import nodomain.freeyourgadget.gadgetbridge.webview.CurrentPosition;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The weather models that the bands expect as an http response to weather requests. Base URL usually
|
* The weather models that the bands expect as an http response to weather requests. Base URL usually
|
||||||
|
|||||||
+1
-1
@@ -43,7 +43,7 @@ import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.requests.Send
|
|||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.requests.SendWeatherSunMoonSupportRequest;
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.requests.SendWeatherSunMoonSupportRequest;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.requests.SendWeatherSupportRequest;
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.requests.SendWeatherSupportRequest;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.requests.SendWeatherUnitRequest;
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.requests.SendWeatherUnitRequest;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.pebble.webview.CurrentPosition;
|
import nodomain.freeyourgadget.gadgetbridge.webview.CurrentPosition;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.util.DateTimeUtils;
|
import nodomain.freeyourgadget.gadgetbridge.util.DateTimeUtils;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.util.GB;
|
import nodomain.freeyourgadget.gadgetbridge.util.GB;
|
||||||
|
|
||||||
|
|||||||
-9
@@ -17,20 +17,11 @@
|
|||||||
|
|
||||||
package nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.requests;
|
package nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.requests;
|
||||||
|
|
||||||
import android.location.Location;
|
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
|
||||||
import org.slf4j.LoggerFactory;
|
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
|
||||||
import java.util.Calendar;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import nodomain.freeyourgadget.gadgetbridge.devices.huawei.HuaweiPacket;
|
import nodomain.freeyourgadget.gadgetbridge.devices.huawei.HuaweiPacket;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.devices.huawei.packets.GpsAndTime;
|
import nodomain.freeyourgadget.gadgetbridge.devices.huawei.packets.GpsAndTime;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.HuaweiSupportProvider;
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.HuaweiSupportProvider;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.huawei.p2p.HuaweiP2PContactsService;
|
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.pebble.webview.CurrentPosition;
|
|
||||||
|
|
||||||
public class SendGpsAndTimeToDeviceRequest extends Request {
|
public class SendGpsAndTimeToDeviceRequest extends Request {
|
||||||
private final int timestamp;
|
private final int timestamp;
|
||||||
|
|||||||
+19
-19
@@ -17,9 +17,12 @@
|
|||||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||||
package nodomain.freeyourgadget.gadgetbridge.service.devices.pebble.webview;
|
package nodomain.freeyourgadget.gadgetbridge.service.devices.pebble.webview;
|
||||||
|
|
||||||
|
import android.location.Location;
|
||||||
import android.webkit.JavascriptInterface;
|
import android.webkit.JavascriptInterface;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
|
||||||
import org.json.JSONException;
|
import org.json.JSONException;
|
||||||
import org.json.JSONObject;
|
import org.json.JSONObject;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
@@ -37,13 +40,13 @@ import java.util.Iterator;
|
|||||||
import java.util.Scanner;
|
import java.util.Scanner;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
|
||||||
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
|
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice;
|
import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.util.CheckSums;
|
import nodomain.freeyourgadget.gadgetbridge.util.CheckSums;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.util.FileUtils;
|
import nodomain.freeyourgadget.gadgetbridge.util.FileUtils;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.util.GB;
|
import nodomain.freeyourgadget.gadgetbridge.util.GB;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.util.PebbleUtils;
|
import nodomain.freeyourgadget.gadgetbridge.util.PebbleUtils;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.webview.CurrentPosition;
|
||||||
|
|
||||||
public class JSInterface {
|
public class JSInterface {
|
||||||
|
|
||||||
@@ -54,13 +57,12 @@ public class JSInterface {
|
|||||||
private static final Logger LOG = LoggerFactory.getLogger(JSInterface.class);
|
private static final Logger LOG = LoggerFactory.getLogger(JSInterface.class);
|
||||||
|
|
||||||
public JSInterface(@NonNull GBDevice device, @NonNull UUID mUuid) {
|
public JSInterface(@NonNull GBDevice device, @NonNull UUID mUuid) {
|
||||||
LOG.debug("Creating JS interface for UUID: " + mUuid.toString());
|
LOG.debug("Creating JS interface for UUID: {}", mUuid);
|
||||||
this.device = device;
|
this.device = device;
|
||||||
this.mUuid = mUuid;
|
this.mUuid = mUuid;
|
||||||
this.lastTransaction = 0;
|
this.lastTransaction = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private boolean isLocationEnabledForWatchApp() {
|
private boolean isLocationEnabledForWatchApp() {
|
||||||
return true; //FIXME: as long as we don't give watchapp internet access it's not a problem
|
return true; //FIXME: as long as we don't give watchapp internet access it's not a problem
|
||||||
}
|
}
|
||||||
@@ -73,10 +75,10 @@ public class JSInterface {
|
|||||||
@JavascriptInterface
|
@JavascriptInterface
|
||||||
public String sendAppMessage(String msg, String needsTransactionMsg) {
|
public String sendAppMessage(String msg, String needsTransactionMsg) {
|
||||||
boolean needsTransaction = "true".equals(needsTransactionMsg);
|
boolean needsTransaction = "true".equals(needsTransactionMsg);
|
||||||
LOG.debug("from WEBVIEW: " + msg + " needs a transaction: " + needsTransaction);
|
LOG.debug("from WEBVIEW: {} needs a transaction: {}", msg, needsTransaction);
|
||||||
JSONObject knownKeys = PebbleUtils.getAppConfigurationKeys(this.mUuid);
|
JSONObject knownKeys = PebbleUtils.getAppConfigurationKeys(this.mUuid);
|
||||||
if (knownKeys == null) {
|
if (knownKeys == null) {
|
||||||
LOG.warn("No app configuration keys for: " + mUuid);
|
LOG.warn("No app configuration keys for: {}", mUuid);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -110,7 +112,7 @@ public class JSInterface {
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
LOG.info("WEBVIEW message to pebble: " + out.toString());
|
LOG.info("WEBVIEW message to pebble: {}", out);
|
||||||
if (needsTransaction) {
|
if (needsTransaction) {
|
||||||
this.lastTransaction++;
|
this.lastTransaction++;
|
||||||
GBApplication.deviceService().onAppConfiguration(this.mUuid, out.toString(), this.lastTransaction);
|
GBApplication.deviceService().onAppConfiguration(this.mUuid, out.toString(), this.lastTransaction);
|
||||||
@@ -135,7 +137,7 @@ public class JSInterface {
|
|||||||
//TODO: use real info
|
//TODO: use real info
|
||||||
wi.put("language", "en");
|
wi.put("language", "en");
|
||||||
} catch (JSONException e) {
|
} catch (JSONException e) {
|
||||||
LOG.warn("Error building the ActiveWathcInfo JSON object", e);
|
LOG.warn("Error building the ActiveWatchInfo JSON object", e);
|
||||||
}
|
}
|
||||||
//Json not supported apparently, we need to cast back and forth
|
//Json not supported apparently, we need to cast back and forth
|
||||||
return wi.toString();
|
return wi.toString();
|
||||||
@@ -143,7 +145,7 @@ public class JSInterface {
|
|||||||
|
|
||||||
@JavascriptInterface
|
@JavascriptInterface
|
||||||
public String getAppConfigurationFile() {
|
public String getAppConfigurationFile() {
|
||||||
LOG.debug("WEBVIEW loading config file of " + this.mUuid.toString());
|
LOG.debug("WEBVIEW loading config file of {}", this.mUuid.toString());
|
||||||
try {
|
try {
|
||||||
File destDir = PebbleUtils.getPbwCacheDir();
|
File destDir = PebbleUtils.getPbwCacheDir();
|
||||||
File configurationFile = new File(destDir, this.mUuid.toString() + "_config.js");
|
File configurationFile = new File(destDir, this.mUuid.toString() + "_config.js");
|
||||||
@@ -226,7 +228,6 @@ public class JSInterface {
|
|||||||
return "gb" + this.mUuid.toString();
|
return "gb" + this.mUuid.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@JavascriptInterface
|
@JavascriptInterface
|
||||||
public String getCurrentPosition() {
|
public String getCurrentPosition() {
|
||||||
if (!isLocationEnabledForWatchApp()) {
|
if (!isLocationEnabledForWatchApp()) {
|
||||||
@@ -236,28 +237,27 @@ public class JSInterface {
|
|||||||
JSONObject geoPosition = new JSONObject();
|
JSONObject geoPosition = new JSONObject();
|
||||||
JSONObject coords = new JSONObject();
|
JSONObject coords = new JSONObject();
|
||||||
try {
|
try {
|
||||||
|
final Location location = new CurrentPosition().getLastKnownLocation();
|
||||||
|
|
||||||
CurrentPosition currentPosition = new CurrentPosition();
|
geoPosition.put("timestamp", location.getTime());
|
||||||
|
|
||||||
geoPosition.put("timestamp", currentPosition.timestamp);
|
coords.put("latitude", location.getLatitude());
|
||||||
|
coords.put("longitude", location.getLongitude());
|
||||||
coords.put("latitude", currentPosition.getLatitude());
|
coords.put("accuracy", location.getAccuracy());
|
||||||
coords.put("longitude", currentPosition.getLongitude());
|
coords.put("altitude", location.getAltitude());
|
||||||
coords.put("accuracy", currentPosition.accuracy);
|
coords.put("speed", location.getSpeed());
|
||||||
coords.put("altitude", currentPosition.altitude);
|
|
||||||
coords.put("speed", currentPosition.speed);
|
|
||||||
|
|
||||||
geoPosition.put("coords", coords);
|
geoPosition.put("coords", coords);
|
||||||
|
|
||||||
} catch (JSONException e) {
|
} catch (JSONException e) {
|
||||||
LOG.warn(e.getMessage());
|
LOG.warn(e.getMessage());
|
||||||
}
|
}
|
||||||
LOG.info("WEBVIEW - geo position" + geoPosition.toString());
|
LOG.info("WEBVIEW - geo position {}", geoPosition);
|
||||||
return geoPosition.toString();
|
return geoPosition.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
@JavascriptInterface
|
@JavascriptInterface
|
||||||
public void eventFinished(String event) {
|
public void eventFinished(String event) {
|
||||||
LOG.debug("WEBVIEW event finished: " + event);
|
LOG.debug("WEBVIEW event finished: {}", event);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -129,7 +129,7 @@ import nodomain.freeyourgadget.gadgetbridge.model.NavigationInfoSpec;
|
|||||||
import nodomain.freeyourgadget.gadgetbridge.model.NotificationSpec;
|
import nodomain.freeyourgadget.gadgetbridge.model.NotificationSpec;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.model.weather.Weather;
|
import nodomain.freeyourgadget.gadgetbridge.model.weather.Weather;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.model.WeatherSpec;
|
import nodomain.freeyourgadget.gadgetbridge.model.WeatherSpec;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.pebble.webview.CurrentPosition;
|
import nodomain.freeyourgadget.gadgetbridge.webview.CurrentPosition;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.QHybridSupport;
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.QHybridSupport;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.adapter.fossil.FossilWatchAdapter;
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.adapter.fossil.FossilWatchAdapter;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.file.FileHandle;
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.file.FileHandle;
|
||||||
|
|||||||
@@ -33,8 +33,8 @@ import org.slf4j.LoggerFactory;
|
|||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice;
|
import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.pebble.webview.GBChromeClient;
|
import nodomain.freeyourgadget.gadgetbridge.webview.GBChromeClient;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.pebble.webview.GBWebClient;
|
import nodomain.freeyourgadget.gadgetbridge.webview.GBWebClient;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.pebble.webview.JSInterface;
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.pebble.webview.JSInterface;
|
||||||
|
|
||||||
public class WebViewSingleton {
|
public class WebViewSingleton {
|
||||||
|
|||||||
+3
-2
@@ -14,7 +14,7 @@
|
|||||||
|
|
||||||
You should have received a copy of the GNU Affero General Public License
|
You should have received a copy of the GNU Affero General Public License
|
||||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||||
package nodomain.freeyourgadget.gadgetbridge.service.devices.pebble.webview;
|
package nodomain.freeyourgadget.gadgetbridge.webview;
|
||||||
|
|
||||||
import android.Manifest;
|
import android.Manifest;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
@@ -23,10 +23,11 @@ import android.location.Criteria;
|
|||||||
import android.location.Location;
|
import android.location.Location;
|
||||||
import android.location.LocationManager;
|
import android.location.LocationManager;
|
||||||
|
|
||||||
|
import androidx.core.app.ActivityCompat;
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import androidx.core.app.ActivityCompat;
|
|
||||||
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
|
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.util.Prefs;
|
import nodomain.freeyourgadget.gadgetbridge.util.Prefs;
|
||||||
|
|
||||||
+1
-1
@@ -14,7 +14,7 @@
|
|||||||
|
|
||||||
You should have received a copy of the GNU Affero General Public License
|
You should have received a copy of the GNU Affero General Public License
|
||||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||||
package nodomain.freeyourgadget.gadgetbridge.service.devices.pebble.webview;
|
package nodomain.freeyourgadget.gadgetbridge.webview;
|
||||||
|
|
||||||
import android.webkit.ConsoleMessage;
|
import android.webkit.ConsoleMessage;
|
||||||
import android.webkit.WebChromeClient;
|
import android.webkit.WebChromeClient;
|
||||||
+1
-1
@@ -15,7 +15,7 @@
|
|||||||
|
|
||||||
You should have received a copy of the GNU Affero General Public License
|
You should have received a copy of the GNU Affero General Public License
|
||||||
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||||
package nodomain.freeyourgadget.gadgetbridge.service.devices.pebble.webview;
|
package nodomain.freeyourgadget.gadgetbridge.webview;
|
||||||
|
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
Reference in New Issue
Block a user