From a0f9c40dc66980eb2a65464983f517f0881f18bb Mon Sep 17 00:00:00 2001 From: M66B Date: Tue, 8 Oct 2019 13:59:09 +0200 Subject: [PATCH] Allow editing replied/forwarded reformatted text --- .../eu/faircode/email/FragmentCompose.java | 168 +++++++++--------- app/src/main/res/values/strings.xml | 2 + 2 files changed, 90 insertions(+), 80 deletions(-) diff --git a/app/src/main/java/eu/faircode/email/FragmentCompose.java b/app/src/main/java/eu/faircode/email/FragmentCompose.java index 53c2f277f1..2c0dd42554 100644 --- a/app/src/main/java/eu/faircode/email/FragmentCompose.java +++ b/app/src/main/java/eu/faircode/email/FragmentCompose.java @@ -90,6 +90,7 @@ import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.widget.PopupMenu; import androidx.constraintlayout.widget.Group; import androidx.core.content.FileProvider; import androidx.cursoradapter.widget.SimpleCursorAdapter; @@ -223,12 +224,11 @@ public class FragmentCompose extends FragmentBase { private static final int REQUEST_ENCRYPT = 8; private static final int REQUEST_COLOR = 9; private static final int REQUEST_REF_DELETE = 10; - private static final int REQUEST_REF_EDIT = 11; - private static final int REQUEST_CONTACT_GROUP = 12; - private static final int REQUEST_ANSWER = 13; - private static final int REQUEST_LINK = 14; - private static final int REQUEST_DISCARD = 15; - private static final int REQUEST_SEND = 16; + private static final int REQUEST_CONTACT_GROUP = 11; + private static final int REQUEST_ANSWER = 12; + private static final int REQUEST_LINK = 13; + private static final int REQUEST_DISCARD = 14; + private static final int REQUEST_SEND = 15; @Override public void onCreate(Bundle savedInstanceState) { @@ -680,86 +680,98 @@ public class FragmentCompose extends FragmentBase { } private void onReferenceEdit() { - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext()); - if (prefs.getBoolean("edit_ref_confirmed", false)) { - onReferenceEditConfirmed(); - return; - } + PopupMenuLifecycle popupMenu = new PopupMenuLifecycle(getContext(), getViewLifecycleOwner(), ibReferenceEdit); - Bundle args = new Bundle(); - args.putString("question", getString(R.string.title_ask_edit_ref)); - args.putString("notagain", "edit_ref_confirmed"); + popupMenu.getMenu().add(Menu.NONE, R.string.title_edit_plain_text, 1, R.string.title_edit_plain_text); + popupMenu.getMenu().add(Menu.NONE, R.string.title_edit_formatted_text, 2, R.string.title_edit_formatted_text); - FragmentDialogAsk fragment = new FragmentDialogAsk(); - fragment.setArguments(args); - fragment.setTargetFragment(this, REQUEST_REF_EDIT); - fragment.show(getFragmentManager(), "compose:refedit"); - } - - private void onReferenceEditConfirmed() { - Bundle args = new Bundle(); - args.putLong("id", working); - args.putString("body", HtmlHelper.toHtml(etBody.getText())); - - new SimpleTask() { + popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { @Override - protected void onPreExecute(Bundle args) { - ibReferenceDelete.setEnabled(false); - ibReferenceEdit.setEnabled(false); - } + public boolean onMenuItemClick(MenuItem item) { + switch (item.getItemId()) { + case R.string.title_edit_plain_text: + convertRef(true); + return true; - @Override - protected void onPostExecute(Bundle args) { - ibReferenceDelete.setEnabled(true); - ibReferenceEdit.setEnabled(true); - } + case R.string.title_edit_formatted_text: + convertRef(false); + return true; - @Override - protected EntityMessage onExecute(Context context, Bundle args) throws Throwable { - long id = args.getLong("id"); - String body = args.getString("body"); - - DB db = DB.getInstance(context); - EntityMessage draft = db.message().getMessage(id); - if (draft == null || !draft.content) - throw new IllegalArgumentException(context.getString(R.string.title_no_body)); - - File file = draft.getFile(context); - File refFile = draft.getRefFile(context); - - String ref = Helper.readText(refFile); - String plain = HtmlHelper.getText(ref); - String html = "

" + plain.replaceAll("\\r?\\n", "
") + "

"; - - try (BufferedWriter out = new BufferedWriter(new FileWriter(file))) { - out.write(body); - out.write(html); + default: + return false; } - - refFile.delete(); - - draft.plain_only = true; - draft.revision = null; - draft.revisions = null; - - db.message().setMessagePlainOnly(draft.id, true); - db.message().setMessageRevision(draft.id, null); - db.message().setMessageRevisions(draft.id, null); - - return draft; } - @Override - protected void onExecuted(Bundle args, EntityMessage draft) { - getActivity().invalidateOptionsMenu(); - showDraft(draft); - } + private void convertRef(boolean plain) { + Bundle args = new Bundle(); + args.putLong("id", working); + args.putString("body", HtmlHelper.toHtml(etBody.getText())); - @Override - protected void onException(Bundle args, Throwable ex) { - Helper.unexpectedError(getFragmentManager(), ex); + new SimpleTask() { + @Override + protected void onPreExecute(Bundle args) { + ibReferenceDelete.setEnabled(false); + ibReferenceEdit.setEnabled(false); + } + + @Override + protected void onPostExecute(Bundle args) { + ibReferenceDelete.setEnabled(true); + ibReferenceEdit.setEnabled(true); + } + + @Override + protected EntityMessage onExecute(Context context, Bundle args) throws Throwable { + long id = args.getLong("id"); + String body = args.getString("body"); + + DB db = DB.getInstance(context); + EntityMessage draft = db.message().getMessage(id); + if (draft == null || !draft.content) + throw new IllegalArgumentException(context.getString(R.string.title_no_body)); + + + File file = draft.getFile(context); + File refFile = draft.getRefFile(context); + + String html; + String ref = Helper.readText(refFile); + if (plain) { + String plain = HtmlHelper.getText(ref); + html = "

" + plain.replaceAll("\\r?\\n", "
") + "

"; + } else + html = HtmlHelper.sanitize(context, ref, true); + + try (BufferedWriter out = new BufferedWriter(new FileWriter(file))) { + out.write(body); + out.write(html); + } + + refFile.delete(); + + draft.revision = null; + draft.revisions = null; + + db.message().setMessageRevision(draft.id, null); + db.message().setMessageRevisions(draft.id, null); + + return draft; + } + + @Override + protected void onExecuted(Bundle args, EntityMessage draft) { + showDraft(draft); + } + + @Override + protected void onException(Bundle args, Throwable ex) { + Helper.unexpectedError(getFragmentManager(), ex); + } + }.execute(FragmentCompose.this, args, "compose:convert"); } - }.execute(this, args, "compose:refedit"); + }); + + popupMenu.show(); } private void onReferenceImages() { @@ -1255,10 +1267,6 @@ public class FragmentCompose extends FragmentBase { if (resultCode == RESULT_OK) onReferenceDeleteConfirmed(); break; - case REQUEST_REF_EDIT: - if (resultCode == RESULT_OK) - onReferenceEditConfirmed(); - break; case REQUEST_CONTACT_GROUP: if (resultCode == RESULT_OK && data != null) onContactGroupSelected(data.getBundleExtra("args")); diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b48ba6e1cc..d153820df1 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -616,6 +616,8 @@ Media toolbar Insert contact group Insert template + Edit as plain text + Edit as reformatted text Plain text only Request delivery/read receipt Most providers and email clients ignore receipt requests