1
0
mirror of https://codeberg.org/Freeyourgadget/Gadgetbridge synced 2024-06-26 15:00:13 +02:00

Update pebble webview to use HttpService

This commit is contained in:
José Rebelo 2023-08-23 09:18:08 +01:00
parent f7f4f4ba54
commit 1af800666e
2 changed files with 44 additions and 43 deletions

View File

@ -81,12 +81,8 @@ public class GBWebClient extends WebViewClient {
if (requestedUri.getHost() != null && (StringUtils.indexOfAny(requestedUri.getHost(), AllowedDomains) != -1)) { if (requestedUri.getHost() != null && (StringUtils.indexOfAny(requestedUri.getHost(), AllowedDomains) != -1)) {
if (GBApplication.getGBPrefs().isBackgroundJsEnabled() && WebViewSingleton.getInstance().internetHelperBound) { if (GBApplication.getGBPrefs().isBackgroundJsEnabled() && WebViewSingleton.getInstance().internetHelperBound) {
LOG.debug("WEBVIEW forwarding request to the internet helper"); LOG.debug("WEBVIEW forwarding request to the internet helper");
Bundle bundle = new Bundle();
bundle.putString("URL", requestedUri.toString());
Message webRequest = Message.obtain();
webRequest.setData(bundle);
try { try {
return WebViewSingleton.getInstance().send(webRequest); return WebViewSingleton.getInstance().send(requestedUri);
} catch (RemoteException | InterruptedException e) { } catch (RemoteException | InterruptedException e) {
LOG.warn("Error downloading data from " + requestedUri, e); LOG.warn("Error downloading data from " + requestedUri, e);
} }

View File

@ -24,13 +24,14 @@ import android.content.Intent;
import android.content.MutableContextWrapper; import android.content.MutableContextWrapper;
import android.content.ServiceConnection; import android.content.ServiceConnection;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.os.Build; 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.IBinder;
import android.os.Looper; import android.os.Looper;
import android.os.Message; import android.os.Message;
import android.os.Messenger; import android.os.Messenger;
import android.os.ParcelFileDescriptor;
import android.os.RemoteException; import android.os.RemoteException;
import android.webkit.WebResourceResponse; import android.webkit.WebResourceResponse;
import android.webkit.WebSettings; import android.webkit.WebSettings;
@ -52,6 +53,11 @@ import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice;
import nodomain.freeyourgadget.gadgetbridge.service.devices.pebble.webview.GBChromeClient; import nodomain.freeyourgadget.gadgetbridge.service.devices.pebble.webview.GBChromeClient;
import nodomain.freeyourgadget.gadgetbridge.service.devices.pebble.webview.GBWebClient; import nodomain.freeyourgadget.gadgetbridge.service.devices.pebble.webview.GBWebClient;
import nodomain.freeyourgadget.gadgetbridge.service.devices.pebble.webview.JSInterface; import nodomain.freeyourgadget.gadgetbridge.service.devices.pebble.webview.JSInterface;
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 WebViewSingleton { public class WebViewSingleton {
@ -62,12 +68,10 @@ public class WebViewSingleton {
private MutableContextWrapper contextWrapper; private MutableContextWrapper contextWrapper;
private Looper mainLooper; private Looper mainLooper;
private UUID currentRunningUUID; private UUID currentRunningUUID;
private Messenger internetHelper = null; private IHttpService internetHelper = null;
public boolean internetHelperBound; public boolean internetHelperBound;
private boolean internetHelperInstalled; private boolean internetHelperInstalled;
private CountDownLatch latch;
private WebResourceResponse internetResponse; private WebResourceResponse internetResponse;
private Messenger internetHelperListener;
private WebViewSingleton() { private WebViewSingleton() {
} }
@ -77,7 +81,7 @@ public class WebViewSingleton {
public void onServiceConnected(ComponentName className, IBinder service) { public void onServiceConnected(ComponentName className, IBinder service) {
LOG.info("internet helper service bound"); LOG.info("internet helper service bound");
internetHelperBound = true; internetHelperBound = true;
internetHelper = new Messenger(service); internetHelper = IHttpService.Stub.asInterface(service);
} }
public void onServiceDisconnected(ComponentName className) { public void onServiceDisconnected(ComponentName className) {
@ -111,40 +115,42 @@ public class WebViewSingleton {
return instance; return instance;
} }
public WebResourceResponse send(Message webRequest) throws RemoteException, InterruptedException { public WebResourceResponse send(Uri webRequest) throws RemoteException, InterruptedException {
webRequest.replyTo = internetHelperListener; final HttpHeaders httpHeaders = new HttpHeaders();
latch = new CountDownLatch(1); //the messenger should run on a single thread, hence we don't need to be worried about concurrency. This approach however is certainly not ideal. final HttpGetRequest httpGetRequest = new HttpGetRequest(webRequest.toString(), httpHeaders);
internetHelper.send(webRequest); final CountDownLatch latch = new CountDownLatch(1);
latch.await(); final Capsule<WebResourceResponse> internetResponseCapsule = new Capsule<>();
return internetResponse; try {
} internetHelper.get(httpGetRequest, new IHttpCallback.Stub() {
@Override
public void onResponse(HttpResponse response) throws RemoteException {
response.getHeaders().addHeader("Access-Control-Allow-Origin", "*");
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();
}
//Internet helper inbound (responses) handler @Override
private class IncomingHandler extends Handler { public void onException(String message) throws RemoteException {
throw new RuntimeException(message);
private String getCharsetFromHeaders(String contentType) { }
if (contentType != null && contentType.toLowerCase().trim().contains("charset=")) { });
String[] parts = contentType.toLowerCase().trim().split("="); } catch (RemoteException e) {
if (parts.length > 0) throw new RuntimeException(e);
return parts[1]; }
} try {
return null; latch.await();
} catch (InterruptedException e) {
throw new RuntimeException(e);
} }
@Override return internetResponseCapsule.get();
public void handleMessage(Message msg) {
Bundle data = msg.getData();
LOG.debug("WEBVIEW: internet helper returned: " + data.getString("response"));
Map<String, String> headers = new HashMap<>();
headers.put("Access-Control-Allow-Origin", "*");
internetResponse = new WebResourceResponse(data.getString("content-type"), data.getString("content-encoding"), 200, "OK",
headers,
new ByteArrayInputStream(data.getString("response").getBytes(Charset.forName(getCharsetFromHeaders(data.getString("content-type")))))
);
latch.countDown();
}
} }
@NonNull @NonNull
@ -190,13 +196,12 @@ public class WebViewSingleton {
}); });
if (contextWrapper != null && !internetHelperBound && !internetHelperInstalled) { if (contextWrapper != null && !internetHelperBound && !internetHelperInstalled) {
String internetHelperPkg = "nodomain.freeyourgadget.internethelper"; String internetHelperPkg = "nodomain.freeyourgadget.internethelper";
String internetHelperCls = internetHelperPkg + ".MyService"; String internetHelperCls = internetHelperPkg + ".HttpService";
try { try {
contextWrapper.getPackageManager().getApplicationInfo(internetHelperPkg, 0); contextWrapper.getPackageManager().getApplicationInfo(internetHelperPkg, 0);
Intent intent = new Intent(); Intent intent = new Intent();
intent.setComponent(new ComponentName(internetHelperPkg, internetHelperCls)); intent.setComponent(new ComponentName(internetHelperPkg, internetHelperCls));
contextWrapper.getApplicationContext().bindService(intent, internetHelperConnection, Context.BIND_AUTO_CREATE); contextWrapper.getApplicationContext().bindService(intent, internetHelperConnection, Context.BIND_AUTO_CREATE);
internetHelperListener = new Messenger(new IncomingHandler());
internetHelperInstalled = true; internetHelperInstalled = true;
} }
catch (PackageManager.NameNotFoundException e) { catch (PackageManager.NameNotFoundException e) {