diff --git a/app/src/main/java/eu/faircode/email/AdapterMessage.java b/app/src/main/java/eu/faircode/email/AdapterMessage.java index 6ff849f4e2..77cb6fbd41 100644 --- a/app/src/main/java/eu/faircode/email/AdapterMessage.java +++ b/app/src/main/java/eu/faircode/email/AdapterMessage.java @@ -3909,96 +3909,40 @@ public class AdapterMessage extends RecyclerView.Adapter() { - @Override - protected void onPreExecute(Bundle args) { - webView.setVisibility(View.GONE); - pbWait.setVisibility(View.VISIBLE); - } + if (textSize != 0) { + settings.setDefaultFontSize(Math.round(textSize)); + settings.setDefaultFixedFontSize(Math.round(textSize)); + } + boolean monospaced = prefs.getBoolean("monospaced", false); + if (monospaced) + settings.setStandardFontFamily("monospace"); - @Override - protected void onPostExecute(Bundle args) { - pbWait.setVisibility(View.GONE); - } + settings.setAllowFileAccess(false); + settings.setLoadsImagesAutomatically(show_images || inline); + settings.setBlockNetworkLoads(!show_images && !autocontent); + settings.setBlockNetworkImage(!show_images && !autocontent); + settings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW); - @Override - protected String onExecute(Context context, Bundle args) throws Throwable { - long id = args.getLong("id"); - - DB db = DB.getInstance(context); - EntityMessage message = db.message().getMessage(id); - if (message == null || !message.content) - return null; - - File file = message.getFile(context); - if (!file.exists()) - return null; - - String html = HtmlHelper.getHtmlEmbedded(context, id, Helper.readText(file)); - - // Remove viewport limitations - Document doc = Jsoup.parse(html); - for (Element meta : doc.select("meta").select("[name=viewport]")) { - String content = meta.attr("content"); - String[] params = content.split(";"); - if (params.length > 0) { - List viewport = new ArrayList<>(); - for (String param : params) - if (!param.toLowerCase().contains("maximum-scale") && - !param.toLowerCase().contains("user-scalable")) - viewport.add(param.trim()); - - if (viewport.size() == 0) - meta.attr("content", ""); - else - meta.attr("content", TextUtils.join(" ;", viewport) + ";"); - } - } - - return doc.html(); - } - - @Override - protected void onExecuted(Bundle args, String html) { - webView.loadDataWithBaseURL("", html, "text/html", "UTF-8", null); - webView.setVisibility(View.VISIBLE); - } - - @Override - protected void onException(Bundle args, Throwable ex) { - Helper.unexpectedError(getFragmentManager(), ex); - } - }.execute(this, getArguments(), "message:full"); - - return dialog; - } - - private void setupWebView(WebView webView) { webView.setWebViewClient(new WebViewClient() { public boolean shouldOverrideUrlLoading(WebView view, String url) { Log.i("Open url=" + url); @@ -4056,17 +4000,56 @@ public class AdapterMessage extends RecyclerView.Adapter() { + @Override + protected void onPreExecute(Bundle args) { + webView.setVisibility(View.GONE); + pbWait.setVisibility(View.VISIBLE); + } + + @Override + protected void onPostExecute(Bundle args) { + pbWait.setVisibility(View.GONE); + } + + @Override + protected String onExecute(Context context, Bundle args) throws Throwable { + long id = args.getLong("id"); + + DB db = DB.getInstance(context); + EntityMessage message = db.message().getMessage(id); + if (message == null || !message.content) + return null; + + File file = message.getFile(context); + if (!file.exists()) + return null; + + String html = Helper.readText(file); + + Document doc = Jsoup.parse(html); + HtmlHelper.removeViewportLimitations(doc); + HtmlHelper.embedImages(context, id, doc); + + return doc.html(); + } + + @Override + protected void onExecuted(Bundle args, String html) { + webView.loadDataWithBaseURL("", html, "text/html", "UTF-8", null); + webView.setVisibility(View.VISIBLE); + } + + @Override + protected void onException(Bundle args, Throwable ex) { + Helper.unexpectedError(getFragmentManager(), ex); + } + }.execute(this, getArguments(), "message:full"); + + return dialog; } } diff --git a/app/src/main/java/eu/faircode/email/FragmentMessages.java b/app/src/main/java/eu/faircode/email/FragmentMessages.java index 45fba0c20b..36a661e3f0 100644 --- a/app/src/main/java/eu/faircode/email/FragmentMessages.java +++ b/app/src/main/java/eu/faircode/email/FragmentMessages.java @@ -4475,9 +4475,9 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences. return null; String html = Helper.readText(file); - html = HtmlHelper.getHtmlEmbedded(context, id, html); - Document document = Jsoup.parse(html); + HtmlHelper.embedImages(context, id, document); + Element body = document.body(); if (body != null) { Element p = document.createElement("p"); diff --git a/app/src/main/java/eu/faircode/email/HtmlHelper.java b/app/src/main/java/eu/faircode/email/HtmlHelper.java index 085ed2d481..ff761cc506 100644 --- a/app/src/main/java/eu/faircode/email/HtmlHelper.java +++ b/app/src/main/java/eu/faircode/email/HtmlHelper.java @@ -781,11 +781,9 @@ public class HtmlHelper { return sb.toString(); } - static String getHtmlEmbedded(Context context, long id, String html) throws IOException { + static void embedImages(Context context, long id, Document document) throws IOException { DB db = DB.getInstance(context); - - Document doc = Jsoup.parse(html); - for (Element img : doc.select("img")) { + for (Element img : document.select("img")) { String src = img.attr("src"); if (src.startsWith("cid:")) { String cid = '<' + src.substring(4) + '>'; @@ -808,8 +806,25 @@ public class HtmlHelper { } } } + } - return doc.html(); + static void removeViewportLimitations(Document document) { + for (Element meta : document.select("meta").select("[name=viewport]")) { + String content = meta.attr("content"); + String[] params = content.split(";"); + if (params.length > 0) { + List viewport = new ArrayList<>(); + for (String param : params) + if (!param.toLowerCase().contains("maximum-scale") && + !param.toLowerCase().contains("user-scalable")) + viewport.add(param.trim()); + + if (viewport.size() == 0) + meta.attr("content", ""); + else + meta.attr("content", TextUtils.join(" ;", viewport) + ";"); + } + } } private static boolean isTrackingPixel(Element img) {