From c4f36d1202f0b7e892f74fabe32c76533277ec7a Mon Sep 17 00:00:00 2001 From: Daniele Gobbetti Date: Fri, 13 Oct 2017 21:57:22 +0200 Subject: [PATCH] Pebble: background webview, address (most of) review comments --- .../activities/ExternalPebbleJSActivity.java | 1 + .../devices/pebble/webview/GBWebClient.java | 4 ++-- .../devices/pebble/webview/JSInterface.java | 12 +++++----- .../gadgetbridge/util/WebViewSingleton.java | 24 +++++++++++++++---- 4 files changed, 28 insertions(+), 13 deletions(-) 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 0177314cf..699c786a5 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/ExternalPebbleJSActivity.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/ExternalPebbleJSActivity.java @@ -71,6 +71,7 @@ public class ExternalPebbleJSActivity extends AbstractGBActivity { } else if (extras.getBoolean(START_BG_WEBVIEW, false)) { WebViewSingleton.ensureCreated(this); finish(); + return; } } } else { diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/webview/GBWebClient.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/webview/GBWebClient.java index 5962ef236..5ae09438b 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/webview/GBWebClient.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/webview/GBWebClient.java @@ -76,7 +76,7 @@ public class GBWebClient extends WebViewClient { return internetResponse; } catch (RemoteException | InterruptedException e) { - e.printStackTrace(); + LOG.warn("Error downloading data from " + requestedUri, e); } } else { @@ -163,7 +163,7 @@ public class GBWebClient extends WebViewClient { return new WebResourceResponse("application/json", "utf-8", new ByteArrayInputStream(resp.toString().getBytes())); } } catch (JSONException e) { - LOG.warn(e.getMessage()); + LOG.warn("Error building the JSON weather message.", e); } return null; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/webview/JSInterface.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/webview/JSInterface.java index 5500c0a68..f3dd5adb0 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/webview/JSInterface.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/webview/JSInterface.java @@ -98,7 +98,7 @@ public class JSInterface { } } catch (JSONException e) { - LOG.warn(e.getMessage()); + LOG.warn("Error building the appmessage JSON object", e); } return null; } @@ -113,7 +113,7 @@ public class JSInterface { //TODO: use real info wi.put("language", "en"); } catch (JSONException e) { - LOG.warn(e.getMessage()); + LOG.warn("Error building the ActiveWathcInfo JSON object", e); } //Json not supported apparently, we need to cast back and forth return wi.toString(); @@ -129,7 +129,7 @@ public class JSInterface { return "file:///" + configurationFile.getAbsolutePath(); } } catch (IOException e) { - LOG.warn(e.getMessage()); + LOG.warn("Error loading config file", e); } return null; } @@ -144,7 +144,7 @@ public class JSInterface { } } catch (IOException e) { GB.toast("Error reading presets", Toast.LENGTH_LONG, GB.ERROR); - LOG.warn(e.getMessage()); + LOG.warn("Error reading presets", e); } return null; } @@ -162,7 +162,7 @@ public class JSInterface { GB.toast("Presets stored", Toast.LENGTH_SHORT, GB.INFO); } catch (IOException e) { GB.toast("Error storing presets", Toast.LENGTH_LONG, GB.ERROR); - LOG.warn(e.getMessage()); + LOG.warn("Error storing presets", e); } } @@ -185,7 +185,7 @@ public class JSInterface { } return sb.toString().toLowerCase(); } catch (NoSuchAlgorithmException | UnsupportedEncodingException e) { - LOG.warn(e.getMessage()); + LOG.warn("Error definining local storage prefix", e); return prefix; } } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/WebViewSingleton.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/WebViewSingleton.java index 4c7defd44..2a1ad57de 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/WebViewSingleton.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/WebViewSingleton.java @@ -29,6 +29,7 @@ import org.slf4j.LoggerFactory; import java.io.ByteArrayInputStream; import java.io.File; import java.io.IOException; +import java.nio.charset.Charset; import java.util.HashMap; import java.util.Iterator; import java.util.Map; @@ -95,6 +96,16 @@ public class WebViewSingleton { //Internet helper inbound (responses) handler private static class IncomingHandler extends Handler { + + private String getCharsetFromHeaders(String contentType) { + if (contentType != null && contentType.toLowerCase().trim().contains("charset=")) { + String[] parts = contentType.toLowerCase().trim().split("="); + if (parts.length > 0) + return parts[1]; + } + return null; + } + @Override public void handleMessage(Message msg) { Bundle data = msg.getData(); @@ -105,10 +116,10 @@ public class WebViewSingleton { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { internetResponse = new WebResourceResponse(data.getString("content-type"), data.getString("content-encoding"), 200, "OK", headers, - new ByteArrayInputStream(data.getString("response").getBytes()) + new ByteArrayInputStream(data.getString("response").getBytes(Charset.forName(getCharsetFromHeaders(data.getString("content-type"))))) ); } else { - internetResponse = new WebResourceResponse(data.getString("content-type"), data.getString("content-encoding"), new ByteArrayInputStream(data.getString("response").getBytes())); + internetResponse = new WebResourceResponse(data.getString("content-type"), data.getString("content-encoding"), new ByteArrayInputStream(data.getString("response").getBytes(Charset.forName(getCharsetFromHeaders(data.getString("content-type")))))); } latch.countDown(); @@ -122,6 +133,9 @@ public class WebViewSingleton { } public static void runJavascriptInterface(GBDevice device, UUID uuid) { + if (uuid == null && device == null) { + throw new RuntimeException("Javascript interface started without device and uuid"); + } if (uuid.equals(currentRunningUUID)) { LOG.debug("WEBVIEW uuid not changed keeping the old context"); } else { @@ -221,7 +235,7 @@ public class WebViewSingleton { return json.getJSONObject("appKeys"); } } catch (IOException | JSONException e) { - LOG.warn(e.getMessage()); + LOG.warn("Unable to parse configuration JSON file", e); } return null; } @@ -232,7 +246,7 @@ public class WebViewSingleton { JSONObject knownKeys = getAppConfigurationKeys(uuid); SparseArray appKeysMap = new SparseArray<>(); - if (knownKeys == null) { + if (knownKeys == null || msg == null) { return "{}"; } @@ -267,7 +281,7 @@ public class WebViewSingleton { jsAppMessage.put("payload", outgoing); } catch (Exception e) { - LOG.warn(e.getMessage()); + LOG.warn("Unable to parse incoming app message", e); } return jsAppMessage.toString(); }