diff --git a/app/src/main/java/eu/faircode/email/FragmentCompose.java b/app/src/main/java/eu/faircode/email/FragmentCompose.java index 8f25986b..a1ab8ffc 100644 --- a/app/src/main/java/eu/faircode/email/FragmentCompose.java +++ b/app/src/main/java/eu/faircode/email/FragmentCompose.java @@ -825,13 +825,13 @@ public class FragmentCompose extends FragmentEx { text.replaceAll("\\r?\\n", "
"), Html.escapeHtml(new Date().toString()), Html.escapeHtml(MessageHelper.getFormattedAddresses(draft.to, true)), - HtmlHelper.sanitize(context, ref.read(context), true)); + HtmlHelper.sanitize(ref.read(context))); } else if ("forward".equals(action)) { draft.subject = context.getString(R.string.title_subject_forward, ref.subject); body = String.format("

%s %s:

%s", Html.escapeHtml(new Date().toString()), Html.escapeHtml(MessageHelper.getFormattedAddresses(ref.from, true)), - HtmlHelper.sanitize(context, ref.read(context), true)); + HtmlHelper.sanitize(ref.read(context))); } if (pro && !TextUtils.isEmpty(account.signature)) diff --git a/app/src/main/java/eu/faircode/email/FragmentMessage.java b/app/src/main/java/eu/faircode/email/FragmentMessage.java index ac1a01d6..a32c8baf 100644 --- a/app/src/main/java/eu/faircode/email/FragmentMessage.java +++ b/app/src/main/java/eu/faircode/email/FragmentMessage.java @@ -246,16 +246,6 @@ public class FragmentMessage extends FragmentEx { new Intent(ActivityView.ACTION_ACTIVATE_PRO) .putExtra("uri", uri)); - } else if (prefs.getBoolean("webview", false)) { - Bundle args = new Bundle(); - args.putString("url", url); - - FragmentWebView fragment = new FragmentWebView(); - fragment.setArguments(args); - - FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction(); - fragmentTransaction.replace(R.id.content_frame, fragment).addToBackStack("webview"); - fragmentTransaction.commit(); } else { // https://developer.chrome.com/multidevice/android/customtabs CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder(); @@ -1071,7 +1061,7 @@ public class FragmentMessage extends FragmentEx { }; private static Spanned decodeHtml(final Context context, final long id, String body, final boolean show_images) { - return Html.fromHtml(HtmlHelper.sanitize(context, body, false), new Html.ImageGetter() { + return Html.fromHtml(HtmlHelper.sanitize(body), new Html.ImageGetter() { @Override public Drawable getDrawable(String source) { float scale = context.getResources().getDisplayMetrics().density; diff --git a/app/src/main/java/eu/faircode/email/FragmentOptions.java b/app/src/main/java/eu/faircode/email/FragmentOptions.java index 77e77f53..61a64dfd 100644 --- a/app/src/main/java/eu/faircode/email/FragmentOptions.java +++ b/app/src/main/java/eu/faircode/email/FragmentOptions.java @@ -22,22 +22,17 @@ package eu.faircode.email; import android.content.SharedPreferences; import android.os.Bundle; import android.preference.PreferenceManager; -import android.text.method.LinkMovementMethod; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.CheckBox; import android.widget.CompoundButton; -import android.widget.TextView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; public class FragmentOptions extends FragmentEx { - private CheckBox cbWebView; - private TextView tvCustomTabs; - private CheckBox cbSanitize; private CheckBox cbCompressImap; private CheckBox cbAvatars; private CheckBox cbDebug; @@ -50,9 +45,6 @@ public class FragmentOptions extends FragmentEx { View view = inflater.inflate(R.layout.fragment_options, container, false); // Get controls - cbWebView = view.findViewById(R.id.cbWebView); - tvCustomTabs = view.findViewById(R.id.tvCustomTabs); - cbSanitize = view.findViewById(R.id.cbSanitize); cbCompressImap = view.findViewById(R.id.cbCompressImap); cbAvatars = view.findViewById(R.id.cbAvatars); cbDebug = view.findViewById(R.id.cbDebug); @@ -61,22 +53,6 @@ public class FragmentOptions extends FragmentEx { final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext()); - cbWebView.setChecked(prefs.getBoolean("webview", false)); - cbWebView.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { - @Override - public void onCheckedChanged(CompoundButton compoundButton, boolean checked) { - prefs.edit().putBoolean("webview", checked).apply(); - } - }); - - cbSanitize.setChecked(prefs.getBoolean("sanitize", false)); - cbSanitize.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { - @Override - public void onCheckedChanged(CompoundButton compoundButton, boolean checked) { - prefs.edit().putBoolean("sanitize", checked).apply(); - } - }); - cbCompressImap.setChecked(prefs.getBoolean("compress", true)); cbCompressImap.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override @@ -109,8 +85,6 @@ public class FragmentOptions extends FragmentEx { } }); - tvCustomTabs.setMovementMethod(LinkMovementMethod.getInstance()); - return view; } } diff --git a/app/src/main/java/eu/faircode/email/HtmlHelper.java b/app/src/main/java/eu/faircode/email/HtmlHelper.java index 8902cc0e..8400ac5c 100644 --- a/app/src/main/java/eu/faircode/email/HtmlHelper.java +++ b/app/src/main/java/eu/faircode/email/HtmlHelper.java @@ -19,14 +19,7 @@ package eu.faircode.email; Copyright 2018 by Marcel Bokhorst (M66B) */ -import android.content.Context; -import android.content.SharedPreferences; -import android.preference.PreferenceManager; -import android.text.Html; -import android.text.TextUtils; - import org.jsoup.Jsoup; -import org.jsoup.helper.StringUtil; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.nodes.Node; @@ -35,116 +28,35 @@ import org.jsoup.safety.Whitelist; import org.jsoup.select.NodeTraversor; import org.jsoup.select.NodeVisitor; -import java.util.ArrayList; -import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; -public class HtmlHelper implements NodeVisitor { - private Context context; - private String newline; - private List refs = new ArrayList<>(); - private StringBuilder sb = new StringBuilder(); - +public class HtmlHelper { private static Pattern pattern = Pattern.compile("([http|https]+://[\\w\\S(\\.|:|/)]+)"); - private HtmlHelper(Context context, boolean reply) { - this.context = context; - this.newline = (reply ? "
> " : "
"); - } - - public void head(Node node, int depth) { - String name = node.nodeName(); - if (node instanceof TextNode) { - String text = ((TextNode) node).text(); - Matcher matcher = pattern.matcher(text); - while (matcher.find()) { - String ref = matcher.group(); - if (!refs.contains(ref)) - refs.add(ref); - String alt = context.getString(R.string.title_link); - text = text.replace(ref, String.format("%s [%d]", ref, alt, refs.size())); - } - sb.append(text); - } else if (name.equals("li")) - sb.append(newline).append(" * "); - else if (name.equals("dt")) - sb.append(" "); - else if (StringUtil.in(name, "p", "h1", "h2", "h3", "h4", "h5", "tr", "div")) - sb.append(newline); - } - - public void tail(Node node, int depth) { - String name = node.nodeName(); - if (StringUtil.in(name, "br", "dd", "dt", "p", "h1", "h2", "h3", "h4", "h5", "div")) - sb.append(newline); - else if (name.equals("a")) { - String ref = node.absUrl("href"); - if (!TextUtils.isEmpty(ref)) { - if (!refs.contains(ref)) - refs.add(ref); - String alt = node.attr("alt"); - if (TextUtils.isEmpty(alt)) - alt = context.getString(R.string.title_link); - alt = Html.escapeHtml(alt); - sb.append(" ").append(String.format("%s [%d]", ref, alt, refs.size())); - } - } else if (name.equals("img")) { - String ref = node.absUrl("src"); - if (!TextUtils.isEmpty(ref)) { - if (!refs.contains(ref)) - refs.add(ref); - String alt = node.attr("alt"); - if (TextUtils.isEmpty(alt)) - alt = context.getString(R.string.title_image); - alt = Html.escapeHtml(alt); - sb.append(" ").append(String.format("%s [%d]", ref, alt, refs.size())); - sb.append("\"""); - } - } - } - - @Override - public String toString() { - if (refs.size() > 0) - sb.append(newline).append(newline); - for (int i = 0; i < refs.size(); i++) - sb.append(String.format("[%d] %s ", i + 1, refs.get(i))).append(newline); - return sb.toString(); - } - - public static String sanitize(Context context, String html, boolean reply) { - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); - - if (prefs.getBoolean("sanitize", false)) { - Document document = Jsoup.parse(html); - HtmlHelper visitor = new HtmlHelper(context, reply); - NodeTraversor.traverse(visitor, document.body()); - return visitor.toString(); - } else { - Document document = Jsoup.parse(Jsoup.clean(html, Whitelist.relaxed())); - for (Element tr : document.select("tr")) - tr.after("
"); - NodeTraversor.traverse(new NodeVisitor() { - @Override - public void head(Node node, int depth) { - if (node instanceof TextNode) { - String text = ((TextNode) node).text(); - Matcher matcher = pattern.matcher(text); - while (matcher.find()) { - String ref = matcher.group(); - text = text.replace(ref, String.format("%s", ref, ref)); - } - node.before(text); - ((TextNode) node).text(""); + public static String sanitize(String html) { + Document document = Jsoup.parse(Jsoup.clean(html, Whitelist.relaxed())); + for (Element tr : document.select("tr")) + tr.after("
"); + NodeTraversor.traverse(new NodeVisitor() { + @Override + public void head(Node node, int depth) { + if (node instanceof TextNode) { + String text = ((TextNode) node).text(); + Matcher matcher = pattern.matcher(text); + while (matcher.find()) { + String ref = matcher.group(); + text = text.replace(ref, String.format("%s", ref, ref)); } + node.before(text); + ((TextNode) node).text(""); } + } - @Override - public void tail(Node node, int depth) { - } - }, document.body()); - return document.body().html(); - } + @Override + public void tail(Node node, int depth) { + } + }, document.body()); + return document.body().html(); } } diff --git a/app/src/main/res/layout/fragment_options.xml b/app/src/main/res/layout/fragment_options.xml index 845208cf..ad884c77 100644 --- a/app/src/main/res/layout/fragment_options.xml +++ b/app/src/main/res/layout/fragment_options.xml @@ -11,36 +11,6 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - - - - - - + app:layout_constraintTop_toTopOf="parent" /> Dark theme
Advanced options - Use WebView to show external links - Instead of Chrome Custom Tabs - Remove HTML formatting from messages Compress IMAP data Show contact photos Debug