From 3ac49cb2a5b520d58c379f6bd4524655d32b7376 Mon Sep 17 00:00:00 2001 From: M66B Date: Sun, 10 Mar 2019 18:03:05 +0000 Subject: [PATCH] Attempt to remove tracking from original messages --- .../eu/faircode/email/AdapterMessage.java | 8 +++---- .../eu/faircode/email/FragmentOptions.java | 16 ++++++++++++-- .../java/eu/faircode/email/HtmlHelper.java | 21 +++++++++++++++++++ app/src/main/res/layout/fragment_options.xml | 14 ++++++++++++- app/src/main/res/values/strings.xml | 1 + 5 files changed, 53 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/eu/faircode/email/AdapterMessage.java b/app/src/main/java/eu/faircode/email/AdapterMessage.java index b22bd2aa94..5528a036c5 100644 --- a/app/src/main/java/eu/faircode/email/AdapterMessage.java +++ b/app/src/main/java/eu/faircode/email/AdapterMessage.java @@ -1505,9 +1505,9 @@ public class AdapterMessage extends RecyclerView.Adapter() { @Override - protected String onExecute(Context context, Bundle args) throws Throwable { + protected String onExecute(Context context, Bundle args) throws IOException { long id = args.getLong("id"); - return getHtmlEmbedded(id); + return HtmlHelper.removeTracking(context, getHtmlEmbedded(id)); } @Override @@ -2207,9 +2207,9 @@ public class AdapterMessage extends RecyclerView.Adapter() { @Override - protected String onExecute(Context context, Bundle args) throws Throwable { + protected String onExecute(Context context, Bundle args) throws IOException { long id = args.getLong("id"); - return getHtmlEmbedded(id); + return HtmlHelper.removeTracking(context, getHtmlEmbedded(id)); } @Override diff --git a/app/src/main/java/eu/faircode/email/FragmentOptions.java b/app/src/main/java/eu/faircode/email/FragmentOptions.java index e98ca6c047..e08882db71 100644 --- a/app/src/main/java/eu/faircode/email/FragmentOptions.java +++ b/app/src/main/java/eu/faircode/email/FragmentOptions.java @@ -83,6 +83,7 @@ public class FragmentOptions extends FragmentBase implements SharedPreferences.O private SwitchCompat swPreview; private SwitchCompat swAddresses; private SwitchCompat swHtml; + private SwitchCompat swTracking; private SwitchCompat swImages; private SwitchCompat swActionbar; @@ -109,7 +110,8 @@ public class FragmentOptions extends FragmentBase implements SharedPreferences.O private Group grpNotification; static String[] OPTIONS_RESTART = new String[]{ - "unified", "date", "threading", "avatars", "identicons", "name_email", "subject_italic", "flags", "preview", "addresses", "autoimages", "actionbar", + "unified", "date", "threading", "avatars", "identicons", "name_email", "subject_italic", "flags", "preview", + "addresses", "autohtml", "autoimages", "actionbar", "pull", "swipenav", "autoexpand", "autoclose", "autonext", "debug" }; @@ -117,7 +119,8 @@ public class FragmentOptions extends FragmentBase implements SharedPreferences.O private final static String[] ADVANCED_OPTIONS = new String[]{ "enabled", "schedule_start", "schedule_end", "metered", "download", - "unified", "date", "threading", "avatars", "identicons", "name_email", "subject_italic", "flags", "preview", "addresses", "autoimages", "actionbar", + "unified", "date", "threading", "avatars", "identicons", "name_email", "subject_italic", "flags", "preview", + "addresses", "autohtml", "remove_tracking", "autoimages", "actionbar", "pull", "swipenav", "autoexpand", "autoclose", "autonext", "collapse", "autoread", "automove", "autoresize", "sender", "autosend", "notify_preview", "search_local", "light", "sound", @@ -155,6 +158,7 @@ public class FragmentOptions extends FragmentBase implements SharedPreferences.O swPreview = view.findViewById(R.id.swPreview); swAddresses = view.findViewById(R.id.swAddresses); swHtml = view.findViewById(R.id.swHtml); + swTracking = view.findViewById(R.id.swTracking); swImages = view.findViewById(R.id.swImages); swActionbar = view.findViewById(R.id.swActionbar); @@ -352,6 +356,13 @@ public class FragmentOptions extends FragmentBase implements SharedPreferences.O } }); + swTracking.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton compoundButton, boolean checked) { + prefs.edit().putBoolean("remove_tracking", checked).apply(); + } + }); + swImages.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton compoundButton, boolean checked) { @@ -576,6 +587,7 @@ public class FragmentOptions extends FragmentBase implements SharedPreferences.O swPreview.setChecked(prefs.getBoolean("preview", false)); swAddresses.setChecked(prefs.getBoolean("addresses", true)); swHtml.setChecked(prefs.getBoolean("autohtml", false)); + swTracking.setChecked(prefs.getBoolean("remove_tracking", true)); swImages.setChecked(prefs.getBoolean("autoimages", false)); swImages.setEnabled(!swHtml.isChecked()); swActionbar.setChecked(prefs.getBoolean("actionbar", true)); diff --git a/app/src/main/java/eu/faircode/email/HtmlHelper.java b/app/src/main/java/eu/faircode/email/HtmlHelper.java index 7f300f4780..2965c5b082 100644 --- a/app/src/main/java/eu/faircode/email/HtmlHelper.java +++ b/app/src/main/java/eu/faircode/email/HtmlHelper.java @@ -20,11 +20,13 @@ package eu.faircode.email; */ import android.content.Context; +import android.content.SharedPreferences; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.net.Uri; +import android.preference.PreferenceManager; import android.text.Html; import android.text.Spanned; import android.text.TextUtils; @@ -65,6 +67,25 @@ public class HtmlHelper { private static final List heads = Arrays.asList("h1", "h2", "h3", "h4", "h5", "h6", "p", "table", "ol", "ul", "br", "hr"); private static final List tails = Arrays.asList("h1", "h2", "h3", "h4", "h5", "h6", "p", "ol", "ul", "li"); + static String removeTracking(Context context, String html) { + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); + boolean remove_tracking = prefs.getBoolean("remove_tracking", true); + if (!remove_tracking) + return html; + + Document document = Jsoup.parse(html); + + for (Element img : document.select("img")) { + String src = img.attr("src"); + String height = img.attr("height").trim(); + String width = img.attr("width").trim(); + if ("1".equals(height) && "1".equals(width) && !TextUtils.isEmpty(src)) + img.removeAttr("src"); + } + + return document.outerHtml(); + } + static String sanitize(Context context, String html, boolean showQuotes) { final Document document = Jsoup.parse(Jsoup.clean(html, Whitelist .relaxed() diff --git a/app/src/main/res/layout/fragment_options.xml b/app/src/main/res/layout/fragment_options.xml index f70eecfd93..b9588d3af7 100644 --- a/app/src/main/res/layout/fragment_options.xml +++ b/app/src/main/res/layout/fragment_options.xml @@ -428,6 +428,18 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/swHtml" /> + + Show message preview Show address details by default Automatically show original message for known contacts + Attempt to remove tracking from original messages Automatically show images for known contacts Conversation action bar