From a5385d4596885fd0796413e1fd9017e3dd9a5b0c Mon Sep 17 00:00:00 2001 From: M66B Date: Wed, 22 Apr 2020 12:10:30 +0200 Subject: [PATCH] Added setting to parse classes --- .../email/FragmentOptionsDisplay.java | 12 +++- .../java/eu/faircode/email/HtmlHelper.java | 66 ++++++++++--------- .../res/layout/fragment_options_display.xml | 25 ++++++- app/src/main/res/values/strings.xml | 4 +- 4 files changed, 72 insertions(+), 35 deletions(-) diff --git a/app/src/main/java/eu/faircode/email/FragmentOptionsDisplay.java b/app/src/main/java/eu/faircode/email/FragmentOptionsDisplay.java index e4367aa51e..40493e0d29 100644 --- a/app/src/main/java/eu/faircode/email/FragmentOptionsDisplay.java +++ b/app/src/main/java/eu/faircode/email/FragmentOptionsDisplay.java @@ -111,6 +111,7 @@ public class FragmentOptionsDisplay extends FragmentBase implements SharedPrefer private SwitchCompat swImagesInline; private SwitchCompat swAttachmentsAlt; + private SwitchCompat swParseClasses; private SwitchCompat swAuthentication; private final static String[] RESET_OPTIONS = new String[]{ @@ -125,7 +126,7 @@ public class FragmentOptionsDisplay extends FragmentBase implements SharedPrefer "addresses", "button_archive_trash", "button_move", "contrast", "monospaced", "text_color", "text_size", "inline_images", "collapse_quotes", "attachments_alt", - "authentication" + "parse_classes", "authentication" }; @Override @@ -191,6 +192,7 @@ public class FragmentOptionsDisplay extends FragmentBase implements SharedPrefer swCollapseQuotes = view.findViewById(R.id.swCollapseQuotes); swImagesInline = view.findViewById(R.id.swImagesInline); swAttachmentsAlt = view.findViewById(R.id.swAttachmentsAlt); + swParseClasses = view.findViewById(R.id.swParseClasses); swAuthentication = view.findViewById(R.id.swAuthentication); setOptions(); @@ -621,6 +623,13 @@ public class FragmentOptionsDisplay extends FragmentBase implements SharedPrefer } }); + swParseClasses.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton compoundButton, boolean checked) { + prefs.edit().putBoolean("parse_classes", checked).apply(); + } + }); + swAuthentication.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton compoundButton, boolean checked) { @@ -771,6 +780,7 @@ public class FragmentOptionsDisplay extends FragmentBase implements SharedPrefer swImagesInline.setChecked(prefs.getBoolean("inline_images", false)); swAttachmentsAlt.setChecked(prefs.getBoolean("attachments_alt", false)); + swParseClasses.setChecked(prefs.getBoolean("parse_classes", false)); swAuthentication.setChecked(prefs.getBoolean("authentication", true)); updateColor(); diff --git a/app/src/main/java/eu/faircode/email/HtmlHelper.java b/app/src/main/java/eu/faircode/email/HtmlHelper.java index c6b8dd6cfe..2b5fe06e63 100644 --- a/app/src/main/java/eu/faircode/email/HtmlHelper.java +++ b/app/src/main/java/eu/faircode/email/HtmlHelper.java @@ -296,6 +296,7 @@ public class HtmlHelper { boolean text_size = prefs.getBoolean("text_size", true); boolean display_hidden = prefs.getBoolean("display_hidden", false); boolean disable_tracking = prefs.getBoolean("disable_tracking", true); + boolean parse_classes = prefs.getBoolean("parse_classes", false); // https://chromium.googlesource.com/chromium/blink/+/master/Source/core/css/html.css @@ -378,41 +379,42 @@ public class HtmlHelper { // https://developer.mozilla.org/en-US/docs/Web/HTML/Element/style List sheets = new ArrayList<>(); - for (Element style : parsed.head().select("style")) { - if (BuildConfig.DEBUG) - Log.i("Style=" + style.data()); - try { - InputSource source = new InputSource(new StringReader(style.data())); - String media = style.attr("media"); - if (!TextUtils.isEmpty(media)) - source.setMedia(media); - - CSSOMParser parser = new CSSOMParser(new SACParserCSS3()); - parser.setErrorHandler(new ErrorHandler() { - @Override - public void warning(CSSParseException ex) throws CSSException { - Log.i("CSS warning=" + ex.getMessage()); - } + if (parse_classes) + for (Element style : parsed.head().select("style")) { + if (BuildConfig.DEBUG) + Log.i("Style=" + style.data()); + try { + InputSource source = new InputSource(new StringReader(style.data())); + String media = style.attr("media"); + if (!TextUtils.isEmpty(media)) + source.setMedia(media); + + CSSOMParser parser = new CSSOMParser(new SACParserCSS3()); + parser.setErrorHandler(new ErrorHandler() { + @Override + public void warning(CSSParseException ex) throws CSSException { + Log.i("CSS warning=" + ex.getMessage()); + } - @Override - public void error(CSSParseException ex) throws CSSException { - Log.i("CSS error=" + ex.getMessage()); - } + @Override + public void error(CSSParseException ex) throws CSSException { + Log.i("CSS error=" + ex.getMessage()); + } - @Override - public void fatalError(CSSParseException ex) throws CSSException { - Log.w(ex); - } - }); - - long start = new Date().getTime(); - sheets.add(parser.parseStyleSheet(source, null, null)); - long elapsed = new Date().getTime() - start; - Log.i("Style parse=" + elapsed + " ms"); - } catch (Throwable ex) { - Log.w(ex); + @Override + public void fatalError(CSSParseException ex) throws CSSException { + Log.w(ex); + } + }); + + long start = new Date().getTime(); + sheets.add(parser.parseStyleSheet(source, null, null)); + long elapsed = new Date().getTime() - start; + Log.i("Style parse=" + elapsed + " ms"); + } catch (Throwable ex) { + Log.w(ex); + } } - } Whitelist whitelist = Whitelist.relaxed() .addTags("hr", "abbr", "big", "font", "dfn", "del", "s", "tt") diff --git a/app/src/main/res/layout/fragment_options_display.xml b/app/src/main/res/layout/fragment_options_display.xml index 240d2b31eb..d695364135 100644 --- a/app/src/main/res/layout/fragment_options_display.xml +++ b/app/src/main/res/layout/fragment_options_display.xml @@ -883,6 +883,29 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/swAttachmentsAlt" /> + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 0d488036b8..5059bc0bb5 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -328,7 +328,6 @@ Show names and email addresses Prefer a contact name over a sent name Underline the sender when the sender is known as local \'to\' contact - Show a warning when the receiving server could not authenticate the message Font size sender Font size subject Show subject above sender @@ -354,6 +353,8 @@ Show conversation action bar Use account color as background color for conversation action bar Colorize the Android navigation bar + Parse style sheets + Show a warning when the receiving server could not authenticate the message Double \'back\' to exit Pull down to refresh @@ -494,6 +495,7 @@ Only available when message text has been downloaded Scrolling can be slow due to a bug in some Android versions when the number of lines is more than one Inline images are images included in the message + This will more accurately display messages, but possibly with a delay Automatically open message when there is just one message or just one unread message in a conversation Automatically marking messages read on expanding can be disabled in the individual account settings