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