From 9325eb98baa9076381a84eb2b96bd66aa7df1965 Mon Sep 17 00:00:00 2001 From: M66B Date: Mon, 1 Jul 2019 15:25:31 +0200 Subject: [PATCH] Use dialog fragments to check/delete rules --- .../eu/faircode/email/AdapterRuleMatch.java | 10 +- .../java/eu/faircode/email/FragmentRule.java | 278 ++++++++++-------- 2 files changed, 155 insertions(+), 133 deletions(-) diff --git a/app/src/main/java/eu/faircode/email/AdapterRuleMatch.java b/app/src/main/java/eu/faircode/email/AdapterRuleMatch.java index 3f193557d8..28f470b0f4 100644 --- a/app/src/main/java/eu/faircode/email/AdapterRuleMatch.java +++ b/app/src/main/java/eu/faircode/email/AdapterRuleMatch.java @@ -26,7 +26,6 @@ import android.view.ViewGroup; import android.widget.TextView; import androidx.annotation.NonNull; -import androidx.fragment.app.Fragment; import androidx.lifecycle.Lifecycle; import androidx.lifecycle.LifecycleObserver; import androidx.lifecycle.LifecycleOwner; @@ -41,7 +40,6 @@ import java.util.ArrayList; import java.util.List; public class AdapterRuleMatch extends RecyclerView.Adapter { - private Fragment parentFragment; private Context context; private LifecycleOwner owner; private LayoutInflater inflater; @@ -75,10 +73,9 @@ public class AdapterRuleMatch extends RecyclerView.Adapter() { + @Override + protected void onPreExecute(Bundle args) { + Helper.setViewsEnabled(view, false); + } + + @Override + protected void onPostExecute(Bundle args) { + Helper.setViewsEnabled(view, true); + } + + @Override + protected Void onExecute(Context context, Bundle args) { + long id = args.getLong("id"); + DB.getInstance(context).rule().deleteRule(id); + return null; + } + + @Override + protected void onExecuted(Bundle args, Void data) { + finish(); + } + + @Override + protected void onException(Bundle args, Throwable ex) { + Helper.unexpectedError(getFragmentManager(), ex); + } + }.execute(FragmentRule.this, args, "rule:delete"); + } + private void loadRule() { Bundle rargs = new Bundle(); rargs.putLong("id", id); @@ -514,7 +564,7 @@ public class FragmentRule extends FragmentBase { break; case EntityRule.TYPE_FLAG: - setColor(jaction.isNull("color") ? Color.TRANSPARENT : jaction.getInt("color")); + onSelectColor(jaction.isNull("color") ? Color.TRANSPARENT : jaction.getInt("color")); break; case EntityRule.TYPE_MOVE: @@ -576,47 +626,23 @@ public class FragmentRule extends FragmentBase { }.execute(FragmentRule.this, rargs, "rule:get"); } - private void onActionTrash() { - new DialogBuilderLifecycle(getContext(), getViewLifecycleOwner()) - .setMessage(R.string.title_ask_delete_rule) - .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - Bundle args = new Bundle(); - args.putLong("id", id); + private void showActionParameters(int type) { + grpSnooze.setVisibility(type == EntityRule.TYPE_SNOOZE ? View.VISIBLE : View.GONE); + grpFlag.setVisibility(type == EntityRule.TYPE_FLAG ? View.VISIBLE : View.GONE); + grpMove.setVisibility(type == EntityRule.TYPE_MOVE || type == EntityRule.TYPE_COPY ? View.VISIBLE : View.GONE); + grpMoveProp.setVisibility(type == EntityRule.TYPE_MOVE ? View.VISIBLE : View.GONE); + grpAnswer.setVisibility(type == EntityRule.TYPE_ANSWER ? View.VISIBLE : View.GONE); + grpAutomation.setVisibility(type == EntityRule.TYPE_AUTOMATION ? View.VISIBLE : View.GONE); + } - new SimpleTask() { - @Override - protected void onPreExecute(Bundle args) { - Helper.setViewsEnabled(view, false); - } + private void onActionDelete() { + Bundle args = new Bundle(); + args.putString("question", getString(R.string.title_ask_delete_rule)); - @Override - protected void onPostExecute(Bundle args) { - Helper.setViewsEnabled(view, true); - } - - @Override - protected Void onExecute(Context context, Bundle args) { - long id = args.getLong("id"); - DB.getInstance(context).rule().deleteRule(id); - return null; - } - - @Override - protected void onExecuted(Bundle args, Void data) { - finish(); - } - - @Override - protected void onException(Bundle args, Throwable ex) { - Helper.unexpectedError(getFragmentManager(), ex); - } - }.execute(FragmentRule.this, args, "rule:delete"); - } - }) - .setNegativeButton(android.R.string.cancel, null) - .show(); + FragmentDialogAsk fragment = new FragmentDialogAsk(); + fragment.setArguments(args); + fragment.setTargetFragment(FragmentRule.this, REQUEST_DELETE); + fragment.show(getFragmentManager(), "answer:delete"); } private void onActionCheck() { @@ -629,71 +655,14 @@ public class FragmentRule extends FragmentBase { return; } - final View dview = LayoutInflater.from(getContext()).inflate(R.layout.dialog_rule_match, null); - final TextView tvNoMessages = dview.findViewById(R.id.tvNoMessages); - final RecyclerView rvMessage = dview.findViewById(R.id.rvMessage); - final ContentLoadingProgressBar pbWait = dview.findViewById(R.id.pbWait); - - rvMessage.setHasFixedSize(false); - LinearLayoutManager llm = new LinearLayoutManager(getContext()); - rvMessage.setLayoutManager(llm); - - final AdapterRuleMatch adapter = new AdapterRuleMatch(this); - rvMessage.setAdapter(adapter); - - tvNoMessages.setVisibility(View.GONE); - rvMessage.setVisibility(View.GONE); - pbWait.setVisibility(View.VISIBLE); - - new DialogBuilderLifecycle(getContext(), getViewLifecycleOwner()) - .setTitle(R.string.title_rule_matched) - .setView(dview) - .show(); - Bundle args = new Bundle(); args.putLong("folder", folder); args.putString("condition", jcondition.toString()); - new SimpleTask>() { - @Override - protected List onExecute(Context context, Bundle args) throws Throwable { - long fid = args.getLong("folder"); - EntityRule rule = new EntityRule(); - rule.condition = args.getString("condition"); + FragmentDialogCheck fragment = new FragmentDialogCheck(); + fragment.setArguments(args); + fragment.show(getFragmentManager(), "rule:check"); - List matching = new ArrayList<>(); - - DB db = DB.getInstance(context); - List ids = db.message().getMessageIdsByFolder(fid); - for (long id : ids) { - EntityMessage message = db.message().getMessage(id); - - if (rule.matches(context, message, null)) - matching.add(message); - - if (matching.size() >= MAX_CHECK) - break; - } - - return matching; - } - - @Override - protected void onExecuted(Bundle args, List messages) { - adapter.set(messages); - - pbWait.setVisibility(View.GONE); - if (messages.size() > 0) - rvMessage.setVisibility(View.VISIBLE); - else - tvNoMessages.setVisibility(View.VISIBLE); - } - - @Override - protected void onException(Bundle args, Throwable ex) { - Helper.unexpectedError(getFragmentManager(), ex); - } - }.execute(this, args, "rule:check"); } catch (JSONException ex) { Log.e(ex); } @@ -800,24 +769,6 @@ public class FragmentRule extends FragmentBase { } } - private void showActionParameters(int type) { - grpSnooze.setVisibility(type == EntityRule.TYPE_SNOOZE ? View.VISIBLE : View.GONE); - grpFlag.setVisibility(type == EntityRule.TYPE_FLAG ? View.VISIBLE : View.GONE); - grpMove.setVisibility(type == EntityRule.TYPE_MOVE || type == EntityRule.TYPE_COPY ? View.VISIBLE : View.GONE); - grpMoveProp.setVisibility(type == EntityRule.TYPE_MOVE ? View.VISIBLE : View.GONE); - grpAnswer.setVisibility(type == EntityRule.TYPE_ANSWER ? View.VISIBLE : View.GONE); - grpAutomation.setVisibility(type == EntityRule.TYPE_AUTOMATION ? View.VISIBLE : View.GONE); - } - - private void setColor(int color) { - this.color = color; - - GradientDrawable border = new GradientDrawable(); - border.setColor(color); - border.setStroke(1, Helper.resolveColor(getContext(), R.attr.colorSeparator)); - vwColor.setBackground(border); - } - private JSONObject getCondition() throws JSONException { JSONObject jcondition = new JSONObject(); @@ -916,4 +867,79 @@ public class FragmentRule extends FragmentBase { return name; } } + + public static class FragmentDialogCheck extends DialogFragment { + @NonNull + @Override + public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) { + long folder = getArguments().getLong("folder"); + String condition = getArguments().getString("condition"); + + final View dview = LayoutInflater.from(getContext()).inflate(R.layout.dialog_rule_match, null); + final TextView tvNoMessages = dview.findViewById(R.id.tvNoMessages); + final RecyclerView rvMessage = dview.findViewById(R.id.rvMessage); + final ContentLoadingProgressBar pbWait = dview.findViewById(R.id.pbWait); + + rvMessage.setHasFixedSize(false); + LinearLayoutManager llm = new LinearLayoutManager(getContext()); + rvMessage.setLayoutManager(llm); + + final AdapterRuleMatch adapter = new AdapterRuleMatch(getContext(), getActivity()); + rvMessage.setAdapter(adapter); + + tvNoMessages.setVisibility(View.GONE); + rvMessage.setVisibility(View.GONE); + pbWait.setVisibility(View.VISIBLE); + + Bundle args = new Bundle(); + args.putLong("folder", folder); + args.putString("condition", condition); + + new SimpleTask>() { + @Override + protected List onExecute(Context context, Bundle args) throws Throwable { + long fid = args.getLong("folder"); + EntityRule rule = new EntityRule(); + rule.condition = args.getString("condition"); + + List matching = new ArrayList<>(); + + DB db = DB.getInstance(context); + List ids = db.message().getMessageIdsByFolder(fid); + for (long id : ids) { + EntityMessage message = db.message().getMessage(id); + + if (rule.matches(context, message, null)) + matching.add(message); + + if (matching.size() >= MAX_CHECK) + break; + } + + return matching; + } + + @Override + protected void onExecuted(Bundle args, List messages) { + adapter.set(messages); + + pbWait.setVisibility(View.GONE); + if (messages.size() > 0) + rvMessage.setVisibility(View.VISIBLE); + else + tvNoMessages.setVisibility(View.VISIBLE); + } + + @Override + protected void onException(Bundle args, Throwable ex) { + Helper.unexpectedError(getFragmentManager(), ex); + } + }.execute(getContext(), getActivity(), args, "rule:check"); + + return new AlertDialog.Builder(getContext()) + .setTitle(R.string.title_rule_matched) + .setView(dview) + .create(); + } + } }