From 43bb2bf05a2de18e04ada6744332f5d89346db62 Mon Sep 17 00:00:00 2001 From: M66B Date: Mon, 26 Nov 2018 12:42:06 +0100 Subject: [PATCH] Basic keyword management --- .../eu/faircode/email/AdapterMessage.java | 86 +++++++++++++++++++ .../main/java/eu/faircode/email/Helper.java | 5 ++ .../eu/faircode/email/ServiceSynchronize.java | 2 +- app/src/main/res/menu/menu_message.xml | 4 + app/src/main/res/values/strings.xml | 1 + 5 files changed, 97 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/eu/faircode/email/AdapterMessage.java b/app/src/main/java/eu/faircode/email/AdapterMessage.java index 2cc903b6e3..d4be1dda88 100644 --- a/app/src/main/java/eu/faircode/email/AdapterMessage.java +++ b/app/src/main/java/eu/faircode/email/AdapterMessage.java @@ -78,6 +78,7 @@ import java.text.Collator; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.Date; @@ -1156,6 +1157,86 @@ public class AdapterMessage extends PagedListAdapter() { + @Override + protected EntityFolder onLoad(Context context, Bundle args) throws Throwable { + EntityMessage message = (EntityMessage) args.getSerializable("message"); + return DB.getInstance(context).folder().getFolder(message.folder); + } + + @Override + protected void onLoaded(final Bundle args, EntityFolder folder) { + EntityMessage message = (EntityMessage) args.getSerializable("message"); + + List keywords = Arrays.asList(message.keywords); + + final List items = new ArrayList<>(keywords); + for (String keyword : folder.keywords) + if (!items.contains(keyword)) + items.add(keyword); + + Collections.sort(items); + + final boolean selected[] = new boolean[items.size()]; + final boolean dirty[] = new boolean[items.size()]; + for (int i = 0; i < selected.length; i++) { + selected[i] = keywords.contains(items.get(i)); + dirty[i] = false; + } + + new DialogBuilderLifecycle(context, owner) + .setTitle(R.string.title_manage_keywords) + .setMultiChoiceItems(items.toArray(new String[0]), selected, new DialogInterface.OnMultiChoiceClickListener() { + @Override + public void onClick(DialogInterface dialog, int which, boolean isChecked) { + dirty[which] = true; + } + }) + .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + args.putStringArray("keywords", items.toArray(new String[0])); + args.putBooleanArray("selected", selected); + args.putBooleanArray("dirty", dirty); + + new SimpleTask() { + @Override + protected Void onLoad(Context context, Bundle args) throws Throwable { + EntityMessage message = (EntityMessage) args.getSerializable("message"); + String[] keywords = args.getStringArray("keywords"); + boolean[] selected = args.getBooleanArray("selected"); + boolean[] dirty = args.getBooleanArray("dirty"); + + DB db = DB.getInstance(context); + + try { + db.beginTransaction(); + + for (int i = 0; i < selected.length; i++) + if (dirty[i]) + EntityOperation.queue(db, message, EntityOperation.KEYWORD, keywords[i], selected[i]); + + db.setTransactionSuccessful(); + } finally { + db.endTransaction(); + } + + EntityOperation.process(context); + + return null; + } + }.load(context, owner, args); + } + }) + .show(); + } + }.load(context, owner, args); + } + private void onDecrypt(ActionData data) { LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(context); lbm.sendBroadcast( @@ -1187,6 +1268,8 @@ public class AdapterMessage extends PagedListAdapter 0); popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { @@ -1217,6 +1300,9 @@ public class AdapterMessage extends PagedListAdapter + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c287b48838..dc9eb289b9 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -210,6 +210,7 @@ Forward raw Reply to all Show headers + Manage keywords Show original Trash