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