From da13999b2efb0db9019d80ab02e0b85c04c611e8 Mon Sep 17 00:00:00 2001 From: M66B Date: Sun, 30 Jun 2019 22:14:52 +0200 Subject: [PATCH] Use dialog fragments to manage keywords --- .../eu/faircode/email/AdapterMessage.java | 305 +++++++++++------- 1 file changed, 192 insertions(+), 113 deletions(-) diff --git a/app/src/main/java/eu/faircode/email/AdapterMessage.java b/app/src/main/java/eu/faircode/email/AdapterMessage.java index 50d3893a53..f9eaead6ef 100644 --- a/app/src/main/java/eu/faircode/email/AdapterMessage.java +++ b/app/src/main/java/eu/faircode/email/AdapterMessage.java @@ -2449,129 +2449,32 @@ public class AdapterMessage extends RecyclerView.Adapter() { @Override protected EntityFolder onExecute(Context context, Bundle args) { - EntityMessage message = (EntityMessage) args.getSerializable("message"); - return DB.getInstance(context).folder().getFolder(message.folder); + long id = args.getLong("id"); + + DB db = DB.getInstance(context); + EntityMessage message = db.message().getMessage(id); + if (message == null) + return null; + + return db.folder().getFolder(message.folder); } @Override protected void onExecuted(final Bundle args, EntityFolder folder) { - EntityMessage message = (EntityMessage) args.getSerializable("message"); + if (folder == null) + return; - List keywords = Arrays.asList(message.keywords); + args.putStringArray("fkeywords", folder.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) { - if (!Helper.isPro(context)) { - LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(context); - lbm.sendBroadcast(new Intent(ActivityView.ACTION_SHOW_PRO)); - return; - } - - args.putStringArray("keywords", items.toArray(new String[0])); - args.putBooleanArray("selected", selected); - args.putBooleanArray("dirty", dirty); - - new SimpleTask() { - @Override - protected Void onExecute(Context context, Bundle args) { - 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(context, message, EntityOperation.KEYWORD, keywords[i], selected[i]); - - db.setTransactionSuccessful(); - } finally { - db.endTransaction(); - } - - return null; - } - - @Override - protected void onException(Bundle args, Throwable ex) { - Helper.unexpectedError(context, owner, ex); - } - }.execute(context, owner, args, "message:keywords:managa"); - } - }) - .setNeutralButton(R.string.title_add, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - View view = LayoutInflater.from(context).inflate(R.layout.dialog_keyword, null); - final EditText etKeyword = view.findViewById(R.id.etKeyword); - etKeyword.setText(null); - new DialogBuilderLifecycle(context, owner) - .setView(view) - .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - if (!Helper.isPro(context)) { - LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(context); - lbm.sendBroadcast(new Intent(ActivityView.ACTION_SHOW_PRO)); - return; - } - - String keyword = Helper.sanitizeKeyword(etKeyword.getText().toString()); - if (!TextUtils.isEmpty(keyword)) { - args.putString("keyword", keyword); - - new SimpleTask() { - @Override - protected Void onExecute(Context context, Bundle args) { - EntityMessage message = (EntityMessage) args.getSerializable("message"); - String keyword = args.getString("keyword"); - - EntityOperation.queue(context, message, EntityOperation.KEYWORD, keyword, true); - return null; - } - - @Override - protected void onException(Bundle args, Throwable ex) { - Helper.unexpectedError(context, owner, ex); - } - }.execute(context, owner, args, "message:keyword:add"); - } - } - }).show(); - } - }) - .show(); + FragmentKeywordManage fragment = new FragmentKeywordManage(); + fragment.setArguments(args); + fragment.show(parentFragment.getFragmentManager(), "keyword:manage"); } @Override @@ -3751,4 +3654,180 @@ public class AdapterMessage extends RecyclerView.Adapter keywords = Arrays.asList(getArguments().getStringArray("keywords")); + List fkeywords = Arrays.asList(getArguments().getStringArray("fkeywords")); + + final List items = new ArrayList<>(keywords); + for (String keyword : fkeywords) + 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; + } + + return new AlertDialog.Builder(getContext()) + .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) { + if (!Helper.isPro(getContext())) { + LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(getContext()); + lbm.sendBroadcast(new Intent(ActivityView.ACTION_SHOW_PRO)); + return; + } + + Bundle args = new Bundle(); + args.putLong("id", id); + args.putStringArray("keywords", items.toArray(new String[0])); + args.putBooleanArray("selected", selected); + args.putBooleanArray("dirty", dirty); + + new SimpleTask() { + @Override + protected Void onExecute(Context context, Bundle args) { + long id = args.getLong("id"); + String[] keywords = args.getStringArray("keywords"); + boolean[] selected = args.getBooleanArray("selected"); + boolean[] dirty = args.getBooleanArray("dirty"); + + DB db = DB.getInstance(context); + try { + db.beginTransaction(); + + EntityMessage message = db.message().getMessage(id); + if (message == null) + return null; + + for (int i = 0; i < selected.length; i++) + if (dirty[i]) + EntityOperation.queue(context, message, EntityOperation.KEYWORD, keywords[i], selected[i]); + + db.setTransactionSuccessful(); + } finally { + db.endTransaction(); + } + + return null; + } + + @Override + protected void onException(Bundle args, Throwable ex) { + Helper.unexpectedError(getContext(), owner, ex); + } + }.execute(getContext(), owner, args, "message:keywords:managa"); + } + }) + .setNeutralButton(R.string.title_add, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + Bundle args = new Bundle(); + args.putLong("id", id); + + FragmentKeywordAdd fragment = new FragmentKeywordAdd(); + fragment.setArguments(args); + fragment.show(getFragmentManager(), "keyword:add"); + } + }) + .create(); + } + + @Override + public void onStart() { + super.onStart(); + owner.resume(); + } + + @Override + public void onDestroyView() { + owner.destroy(); + super.onDestroyView(); + } + } + + public static class FragmentKeywordAdd extends DialogFragment { + private TwoStateOwner owner = new TwoStateOwner("keyword:add"); + + @NonNull + @Override + public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) { + final long id = getArguments().getLong("id"); + + View view = LayoutInflater.from(getContext()).inflate(R.layout.dialog_keyword, null); + final EditText etKeyword = view.findViewById(R.id.etKeyword); + etKeyword.setText(null); + + return new AlertDialog.Builder(getContext()) + .setView(view) + .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + if (!Helper.isPro(getContext())) { + LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(getContext()); + lbm.sendBroadcast(new Intent(ActivityView.ACTION_SHOW_PRO)); + return; + } + + String keyword = Helper.sanitizeKeyword(etKeyword.getText().toString()); + if (!TextUtils.isEmpty(keyword)) { + Bundle args = new Bundle(); + args.putLong("id", id); + args.putString("keyword", keyword); + + new SimpleTask() { + @Override + protected Void onExecute(Context context, Bundle args) { + long id = args.getLong("id"); + String keyword = args.getString("keyword"); + + DB db = DB.getInstance(context); + EntityMessage message = db.message().getMessage(id); + if (message == null) + return null; + + EntityOperation.queue(context, message, EntityOperation.KEYWORD, keyword, true); + return null; + } + + @Override + protected void onException(Bundle args, Throwable ex) { + Helper.unexpectedError(getContext(), owner, ex); + } + }.execute(getContext(), owner, args, "message:keyword:add"); + } + } + }).create(); + } + + @Override + public void onStart() { + super.onStart(); + owner.resume(); + } + + @Override + public void onDestroyView() { + owner.destroy(); + super.onDestroyView(); + } + } }