diff --git a/app/src/main/java/eu/faircode/email/AdapterFolder.java b/app/src/main/java/eu/faircode/email/AdapterFolder.java index 01b9f9b665..f4cc2a6aa4 100644 --- a/app/src/main/java/eu/faircode/email/AdapterFolder.java +++ b/app/src/main/java/eu/faircode/email/AdapterFolder.java @@ -68,8 +68,10 @@ import androidx.recyclerview.widget.RecyclerView; import com.google.android.material.snackbar.Snackbar; import java.text.NumberFormat; +import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collections; +import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -555,6 +557,9 @@ public class AdapterFolder extends RecyclerView.Adapter() { + @Override + protected void onPreExecute(Bundle args) { + ToastEx.makeText(getContext(), R.string.title_executing, Toast.LENGTH_LONG).show(); + } + + @Override + protected void onPostExecute(Bundle args) { + ToastEx.makeText(getContext(), R.string.title_completed, Toast.LENGTH_LONG).show(); + } + + @Override + protected Void onExecute(Context context, Bundle args) throws Throwable { + long fid = args.getLong("id"); + Uri uri = args.getParcelable("uri"); + + if (!"content".equals(uri.getScheme())) { + Log.w("Export uri=" + uri); + throw new IllegalArgumentException(context.getString(R.string.title_no_stream)); + } + + DB db = DB.getInstance(context); + List ids = db.message().getMessageIdsByFolder(fid); + if (ids == null) + return null; + + String PATTERN_ASCTIME = "EEE MMM d HH:mm:ss yyyy"; + SimpleDateFormat df = new SimpleDateFormat(PATTERN_ASCTIME, Locale.US); + + Properties props = MessageHelper.getSessionProperties(); + Session isession = Session.getInstance(props, null); + + // https://www.ietf.org/rfc/rfc4155.txt + // http://qmail.org./man/man5/mbox.html + ContentResolver resolver = context.getContentResolver(); + try (OutputStream out = new BufferedOutputStream(resolver.openOutputStream(uri))) { + for (long id : ids) { + EntityMessage message = db.message().getMessage(id); + if (message == null) + continue; + + String email = null; + if (message.from != null && message.from.length > 0) + email = ((InternetAddress) message.from[0]).getAddress(); + if (TextUtils.isEmpty(email)) + email = "MAILER-DAEMON"; + + out.write(("From " + email + " " + df.format(message.received) + "\n").getBytes()); + + Message imessage = MessageHelper.from(context, message, null, isession, false); + imessage.writeTo(new FilterOutputStream(out) { + @Override + public void write(int b) throws IOException { + super.write(b); + } + + @Override + public void flush() throws IOException { + super.flush(); + } + }); + + out.write("\n".getBytes()); + } + } + + return null; + } + + @Override + protected void onException(Bundle args, Throwable ex) { + Log.unexpectedError(getParentFragmentManager(), ex); + } + + + }.execute(this, args, "folder:export"); + } + public static class FragmentDialogApply extends FragmentDialogBase { @NonNull @Override diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2843038317..2958914c96 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -788,6 +788,7 @@ Edit properties Edit rules Execute rules + Export messages Create notification channel Edit notification channel Delete notification channel