From 2369f6dbea534981935a3cdcaea08f39c72a1a71 Mon Sep 17 00:00:00 2001 From: M66B Date: Sat, 18 Sep 2021 20:37:59 +0200 Subject: [PATCH] Added button to delete block sender rules --- .../java/eu/faircode/email/DaoContact.java | 5 + .../eu/faircode/email/FragmentContacts.java | 2 +- .../eu/faircode/email/FragmentDialogJunk.java | 110 ++++++++++-------- .../java/eu/faircode/email/FragmentRules.java | 43 +------ app/src/main/res/layout/dialog_junk.xml | 43 ++++--- app/src/main/res/menu/menu_rules.xml | 5 - app/src/main/res/values/strings.xml | 4 +- 7 files changed, 101 insertions(+), 111 deletions(-) diff --git a/app/src/main/java/eu/faircode/email/DaoContact.java b/app/src/main/java/eu/faircode/email/DaoContact.java index 55d92eb5ee..198b0555a3 100644 --- a/app/src/main/java/eu/faircode/email/DaoContact.java +++ b/app/src/main/java/eu/faircode/email/DaoContact.java @@ -75,6 +75,11 @@ public interface DaoContact { @Query("DELETE FROM contact WHERE id = :id") int deleteContact(long id); + @Query("DELETE FROM contact" + + " WHERE account = :account" + + " AND type = :type") + int deleteContact(long account, int type); + @Query("DELETE FROM contact" + " WHERE account = :account" + " AND type = :type" + diff --git a/app/src/main/java/eu/faircode/email/FragmentContacts.java b/app/src/main/java/eu/faircode/email/FragmentContacts.java index 4e1e8caa3a..2f3d63d17e 100644 --- a/app/src/main/java/eu/faircode/email/FragmentContacts.java +++ b/app/src/main/java/eu/faircode/email/FragmentContacts.java @@ -52,7 +52,7 @@ public class FragmentContacts extends FragmentBase { private ContentLoadingProgressBar pbWait; private Group grpReady; - private boolean junk = BuildConfig.DEBUG; + private boolean junk = false; private String searching = null; private AdapterContact adapter; diff --git a/app/src/main/java/eu/faircode/email/FragmentDialogJunk.java b/app/src/main/java/eu/faircode/email/FragmentDialogJunk.java index b3106cd37b..e446a1ea4c 100644 --- a/app/src/main/java/eu/faircode/email/FragmentDialogJunk.java +++ b/app/src/main/java/eu/faircode/email/FragmentDialogJunk.java @@ -34,14 +34,21 @@ import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.ImageButton; import android.widget.TextView; +import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.AlertDialog; import androidx.constraintlayout.widget.Group; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentTransaction; import androidx.localbroadcastmanager.content.LocalBroadcastManager; import androidx.preference.PreferenceManager; +import org.json.JSONObject; + +import java.util.List; + public class FragmentDialogJunk extends FragmentDialogBase { @NonNull @Override @@ -63,12 +70,12 @@ public class FragmentDialogJunk extends FragmentDialogBase { final CheckBox cbBlockDomain = view.findViewById(R.id.cbBlockDomain); final ImageButton ibMore = view.findViewById(R.id.ibMore); final TextView tvMore = view.findViewById(R.id.tvMore); - final Button btnEditRules = view.findViewById(R.id.btnEditRules); final CheckBox cbJunkFilter = view.findViewById(R.id.cbJunkFilter); final ImageButton ibInfoFilter = view.findViewById(R.id.ibInfoFilter); final CheckBox cbBlocklist = view.findViewById(R.id.cbBlocklist); final TextView tvBlocklist = view.findViewById(R.id.tvBlocklist); final ImageButton ibInfoBlocklist = view.findViewById(R.id.ibInfoBlocklist); + final Button btnClear = view.findViewById(R.id.btnClear); final Group grpInJunk = view.findViewById(R.id.grpInJunk); final Group grpMore = view.findViewById(R.id.grpMore); @@ -108,54 +115,6 @@ public class FragmentDialogJunk extends FragmentDialogBase { ibMore.setOnClickListener(onMore); tvMore.setOnClickListener(onMore); - btnEditRules.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - if (inJunk) { - new SimpleTask() { - @Override - protected EntityFolder onExecute(Context context, Bundle args) throws Throwable { - long account = args.getLong("account"); - - DB db = DB.getInstance(context); - EntityFolder inbox = db.folder().getFolderByType(account, EntityFolder.INBOX); - - if (inbox == null) - throw new IllegalArgumentException(context.getString(R.string.title_no_inbox)); - - return inbox; - } - - @Override - protected void onExecuted(Bundle args, EntityFolder inbox) { - LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(context); - lbm.sendBroadcast( - new Intent(ActivityView.ACTION_EDIT_RULES) - .putExtra("account", account) - .putExtra("protocol", protocol) - .putExtra("folder", inbox.id) - .putExtra("type", inbox.type)); - dismiss(); - } - - @Override - protected void onException(Bundle args, Throwable ex) { - Log.unexpectedError(getParentFragmentManager(), ex); - } - }.execute(FragmentDialogJunk.this, args, "junk:rules"); - } else { - LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(context); - lbm.sendBroadcast( - new Intent(ActivityView.ACTION_EDIT_RULES) - .putExtra("account", account) - .putExtra("protocol", protocol) - .putExtra("folder", folder) - .putExtra("type", type)); - dismiss(); - } - } - }); - cbJunkFilter.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { @@ -237,6 +196,59 @@ public class FragmentDialogJunk extends FragmentDialogBase { } }); + btnClear.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Bundle args = new Bundle(); + args.putLong("folder", folder); + + new SimpleTask() { + @Override + protected Void onExecute(Context context, Bundle args) throws Throwable { + long fid = args.getLong("folder"); + + DB db = DB.getInstance(context); + EntityFolder folder = db.folder().getFolder(fid); + if (folder == null) + return null; + + EntityFolder junk = db.folder().getFolderByType(folder.account, EntityFolder.JUNK); + if (junk == null) + return null; + + List rules = db.rule().getRules(fid); + if (rules == null) + return null; + + for (EntityRule rule : rules) { + JSONObject jaction = new JSONObject(rule.action); + int type = jaction.optInt("type", -1); + long target = jaction.optLong("target", -1); + if (type == EntityRule.TYPE_MOVE && target == junk.id) { + EntityLog.log(context, "Deleting junk rule=" + rule.id); + db.rule().deleteRule(rule.id); + } + } + + int count = db.contact().deleteContact(account, EntityContact.TYPE_JUNK); + EntityLog.log(context, "Deleted junk contacts=" + count); + + return null; + } + + @Override + protected void onExecuted(Bundle args, Void data) { + ToastEx.makeText(getContext(), R.string.title_completed, Toast.LENGTH_LONG).show(); + } + + @Override + protected void onException(Bundle args, Throwable ex) { + Log.unexpectedError(getParentFragmentManager(), ex); + } + }.execute(FragmentDialogJunk.this, args, "junk:clear"); + } + }); + // Initialize tvMessage.setText(inJunk ? getString(R.string.title_folder_junk) diff --git a/app/src/main/java/eu/faircode/email/FragmentRules.java b/app/src/main/java/eu/faircode/email/FragmentRules.java index 237bc31bd7..2143095c76 100644 --- a/app/src/main/java/eu/faircode/email/FragmentRules.java +++ b/app/src/main/java/eu/faircode/email/FragmentRules.java @@ -249,12 +249,6 @@ public class FragmentRules extends FragmentBase { super.onCreateOptionsMenu(menu, inflater); } - @Override - public void onPrepareOptionsMenu(@NonNull Menu menu) { - super.onPrepareOptionsMenu(menu); - menu.findItem(R.id.menu_delete_junk).setVisible(!EntityFolder.JUNK.equals(type)); - } - @Override public boolean onOptionsItemSelected(MenuItem item) { int itemId = item.getItemId(); @@ -265,10 +259,7 @@ public class FragmentRules extends FragmentBase { onMenuImport(); return true; } else if (itemId == R.id.menu_delete_all) { - onMenuDelete(true); - return true; - } else if (itemId == R.id.menu_delete_junk) { - onMenuDelete(false); + onMenuDelete(); return true; } return super.onOptionsItemSelected(item); @@ -296,13 +287,10 @@ public class FragmentRules extends FragmentBase { startActivityForResult(intent, REQUEST_IMPORT); } - private void onMenuDelete(boolean all) { + private void onMenuDelete() { Bundle aargs = new Bundle(); - aargs.putString("question", getString(all - ? R.string.title_rules_delete_all_confirm - : R.string.title_rules_delete_junk_confirm)); + aargs.putString("question", getString(R.string.title_rules_delete_all_confirm)); aargs.putLong("folder", folder); - aargs.putBoolean("all", all); FragmentDialogAsk ask = new FragmentDialogAsk(); ask.setArguments(aargs); @@ -497,35 +485,12 @@ public class FragmentRules extends FragmentBase { @Override protected Void onExecute(Context context, Bundle args) throws Throwable { long fid = args.getLong("folder"); - boolean all = args.getBoolean("all"); DB db = DB.getInstance(context); try { db.beginTransaction(); - if (all) - db.rule().deleteRules(fid); - else { - EntityFolder folder = db.folder().getFolder(fid); - if (folder == null) - return null; - - EntityFolder junk = db.folder().getFolderByType(folder.account, EntityFolder.JUNK); - if (junk == null) - return null; - - List rules = db.rule().getRules(fid); - if (rules == null) - return null; - - for (EntityRule rule : rules) { - JSONObject jaction = new JSONObject(rule.action); - int type = jaction.optInt("type", -1); - long target = jaction.optLong("target", -1); - if (type == EntityRule.TYPE_MOVE && target == junk.id) - db.rule().deleteRule(rule.id); - } - } + db.rule().deleteRules(fid); db.setTransactionSuccessful(); } finally { diff --git a/app/src/main/res/layout/dialog_junk.xml b/app/src/main/res/layout/dialog_junk.xml index cf8b2748f6..44bb2ab8a5 100644 --- a/app/src/main/res/layout/dialog_junk.xml +++ b/app/src/main/res/layout/dialog_junk.xml @@ -105,18 +105,6 @@ app:layout_constraintStart_toEndOf="@+id/ibMore" app:layout_constraintTop_toTopOf="@+id/ibMore" /> -