diff --git a/app/src/main/java/eu/faircode/email/Core.java b/app/src/main/java/eu/faircode/email/Core.java index f82b2fafb6..2649500d21 100644 --- a/app/src/main/java/eu/faircode/email/Core.java +++ b/app/src/main/java/eu/faircode/email/Core.java @@ -1940,6 +1940,8 @@ class Core { private static void onRaw(Context context, JSONArray jargs, EntityAccount account, EntityFolder folder, EntityMessage message, IMAPFolder ifolder) throws MessagingException, IOException, JSONException { // Download raw message DB db = DB.getInstance(context); + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); + boolean save_user_flags = prefs.getBoolean("save_user_flags", false); if (message.raw == null || !message.raw) { IMAPMessage imessage = (IMAPMessage) ifolder.getMessageByUID(message.uid); @@ -1955,12 +1957,21 @@ class Core { Properties props = MessageHelper.getSessionProperties(account.unicode); Session isession = Session.getInstance(props, null); - MessageHelper helper; + MimeMessage saved; try (InputStream is = new FileInputStream(file)) { - helper = new MessageHelper(new MimeMessage(isession, is), context); + saved = new MimeMessage(isession, is); + } + + if (save_user_flags) { + String userFlags = TextUtils.join(",", imessage.getFlags().getUserFlags()); + saved.addHeader("X-User-Flags", userFlags); + try (OutputStream os = new BufferedOutputStream(new FileOutputStream(file))) { + saved.writeTo(os); + } } // Yahoo is returning incorrect messages + MessageHelper helper = new MessageHelper(saved, context); if (!Objects.equals(message.msgid, helper.getMessageID())) throw new MessagingException("Incorrect msgid=" + message.msgid + "/" + helper.getMessageID()); diff --git a/app/src/main/java/eu/faircode/email/FragmentOptionsMisc.java b/app/src/main/java/eu/faircode/email/FragmentOptionsMisc.java index 0da9d7c3f1..1881d4f985 100644 --- a/app/src/main/java/eu/faircode/email/FragmentOptionsMisc.java +++ b/app/src/main/java/eu/faircode/email/FragmentOptionsMisc.java @@ -221,6 +221,7 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc private SwitchCompat swJsonLd; private SwitchCompat swDupMsgId; private SwitchCompat swThreadByRef; + private SwitchCompat swSaveUserFlags; private SwitchCompat swMdn; private SwitchCompat swAppChooser; private SwitchCompat swAppChooserShare; @@ -287,7 +288,7 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc "exact_alarms", "native_dkim", "native_arc", "native_arc_whitelist", "webp", "animate_images", - "easy_correct", "infra", "tld_flags", "json_ld", "dup_msgids", "thread_byref", "mdn", + "easy_correct", "infra", "tld_flags", "json_ld", "dup_msgids", "thread_byref", "save_user_flags", "mdn", "app_chooser", "app_chooser_share", "adjacent_links", "adjacent_documents", "adjacent_portrait", "adjacent_landscape", "delete_confirmation", "global_keywords", "test_iab" )); @@ -460,6 +461,7 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc swJsonLd = view.findViewById(R.id.swJsonLd); swDupMsgId = view.findViewById(R.id.swDupMsgId); swThreadByRef = view.findViewById(R.id.swThreadByRef); + swSaveUserFlags = view.findViewById(R.id.swSaveUserFlags); swMdn = view.findViewById(R.id.swMdn); swAppChooser = view.findViewById(R.id.swAppChooser); swAppChooserShare = view.findViewById(R.id.swAppChooserShare); @@ -1570,6 +1572,13 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc } }); + swSaveUserFlags.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton compoundButton, boolean checked) { + prefs.edit().putBoolean("save_user_flags", checked).apply(); + } + }); + swMdn.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton compoundButton, boolean checked) { @@ -2365,6 +2374,7 @@ public class FragmentOptionsMisc extends FragmentBase implements SharedPreferenc swJsonLd.setChecked(prefs.getBoolean("json_ld", false)); swDupMsgId.setChecked(prefs.getBoolean("dup_msgids", false)); swThreadByRef.setChecked(prefs.getBoolean("thread_byref", true)); + swSaveUserFlags.setChecked(prefs.getBoolean("save_user_flags", false)); swMdn.setChecked(prefs.getBoolean("mdn", swExperiments.isChecked())); swAppChooser.setChecked(prefs.getBoolean("app_chooser", false)); swAppChooserShare.setChecked(prefs.getBoolean("app_chooser_share", false)); diff --git a/app/src/main/res/layout/fragment_options_misc.xml b/app/src/main/res/layout/fragment_options_misc.xml index 73fce1f9cd..35d2184726 100644 --- a/app/src/main/res/layout/fragment_options_misc.xml +++ b/app/src/main/res/layout/fragment_options_misc.xml @@ -1867,6 +1867,17 @@ app:layout_constraintTop_toBottomOf="@id/swDupMsgId" app:switchPadding="12dp" /> + + Show Linked Data (JSON-LD) Duplicates by message ID Thread by common reference + Save user flags Process MDNs Use Android app chooser for links Use Android app chooser for files