diff --git a/app/src/main/java/eu/faircode/email/AdapterFolder.java b/app/src/main/java/eu/faircode/email/AdapterFolder.java index 01b9f9b665..a252ab372b 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) + ids = new ArrayList<>(); + + File tmp = new File(context.getCacheDir(), "export_" + fid + ".mbox"); + tmp.createNewFile(); + + System.setProperty("mail.mbox.locktype", "none"); + + Properties iprops = new Properties(); + Session isession = Session.getDefaultInstance(iprops); + isession.addProvider(new MboxProvider()); + + Store istore = isession.getStore("mbox"); + istore.connect(); + + try { + Folder ifolder = istore.getDefaultFolder().getFolder(tmp.getAbsolutePath()); + ifolder.open(Folder.READ_WRITE); + + for (long id : ids) { + EntityMessage message = db.message().getMessage(id); + if (message == null) + continue; + + Message imessage = MessageHelper.from(context, message, null, isession, false); + ifolder.appendMessages(new Message[]{imessage}); + } + + } finally { + istore.close(); + } + + ContentResolver resolver = context.getContentResolver(); + try (OutputStream out = resolver.openOutputStream(uri)) { + Helper.copy(new FileInputStream(tmp), out); + } + + if (!BuildConfig.DEBUG) + tmp.delete(); + + 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