Added button to delete block sender rules

pull/206/head
M66B 4 years ago
parent 7904267e9b
commit 2369f6dbea

@ -75,6 +75,11 @@ public interface DaoContact {
@Query("DELETE FROM contact WHERE id = :id") @Query("DELETE FROM contact WHERE id = :id")
int deleteContact(long 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" + @Query("DELETE FROM contact" +
" WHERE account = :account" + " WHERE account = :account" +
" AND type = :type" + " AND type = :type" +

@ -52,7 +52,7 @@ public class FragmentContacts extends FragmentBase {
private ContentLoadingProgressBar pbWait; private ContentLoadingProgressBar pbWait;
private Group grpReady; private Group grpReady;
private boolean junk = BuildConfig.DEBUG; private boolean junk = false;
private String searching = null; private String searching = null;
private AdapterContact adapter; private AdapterContact adapter;

@ -34,14 +34,21 @@ import android.widget.CheckBox;
import android.widget.CompoundButton; import android.widget.CompoundButton;
import android.widget.ImageButton; import android.widget.ImageButton;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AlertDialog;
import androidx.constraintlayout.widget.Group; import androidx.constraintlayout.widget.Group;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentTransaction;
import androidx.localbroadcastmanager.content.LocalBroadcastManager; import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import androidx.preference.PreferenceManager; import androidx.preference.PreferenceManager;
import org.json.JSONObject;
import java.util.List;
public class FragmentDialogJunk extends FragmentDialogBase { public class FragmentDialogJunk extends FragmentDialogBase {
@NonNull @NonNull
@Override @Override
@ -63,12 +70,12 @@ public class FragmentDialogJunk extends FragmentDialogBase {
final CheckBox cbBlockDomain = view.findViewById(R.id.cbBlockDomain); final CheckBox cbBlockDomain = view.findViewById(R.id.cbBlockDomain);
final ImageButton ibMore = view.findViewById(R.id.ibMore); final ImageButton ibMore = view.findViewById(R.id.ibMore);
final TextView tvMore = view.findViewById(R.id.tvMore); 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 CheckBox cbJunkFilter = view.findViewById(R.id.cbJunkFilter);
final ImageButton ibInfoFilter = view.findViewById(R.id.ibInfoFilter); final ImageButton ibInfoFilter = view.findViewById(R.id.ibInfoFilter);
final CheckBox cbBlocklist = view.findViewById(R.id.cbBlocklist); final CheckBox cbBlocklist = view.findViewById(R.id.cbBlocklist);
final TextView tvBlocklist = view.findViewById(R.id.tvBlocklist); final TextView tvBlocklist = view.findViewById(R.id.tvBlocklist);
final ImageButton ibInfoBlocklist = view.findViewById(R.id.ibInfoBlocklist); 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 grpInJunk = view.findViewById(R.id.grpInJunk);
final Group grpMore = view.findViewById(R.id.grpMore); final Group grpMore = view.findViewById(R.id.grpMore);
@ -108,54 +115,6 @@ public class FragmentDialogJunk extends FragmentDialogBase {
ibMore.setOnClickListener(onMore); ibMore.setOnClickListener(onMore);
tvMore.setOnClickListener(onMore); tvMore.setOnClickListener(onMore);
btnEditRules.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (inJunk) {
new SimpleTask<EntityFolder>() {
@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() { cbJunkFilter.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override @Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 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<Void>() {
@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<EntityRule> 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 // Initialize
tvMessage.setText(inJunk tvMessage.setText(inJunk
? getString(R.string.title_folder_junk) ? getString(R.string.title_folder_junk)

@ -249,12 +249,6 @@ public class FragmentRules extends FragmentBase {
super.onCreateOptionsMenu(menu, inflater); 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 @Override
public boolean onOptionsItemSelected(MenuItem item) { public boolean onOptionsItemSelected(MenuItem item) {
int itemId = item.getItemId(); int itemId = item.getItemId();
@ -265,10 +259,7 @@ public class FragmentRules extends FragmentBase {
onMenuImport(); onMenuImport();
return true; return true;
} else if (itemId == R.id.menu_delete_all) { } else if (itemId == R.id.menu_delete_all) {
onMenuDelete(true); onMenuDelete();
return true;
} else if (itemId == R.id.menu_delete_junk) {
onMenuDelete(false);
return true; return true;
} }
return super.onOptionsItemSelected(item); return super.onOptionsItemSelected(item);
@ -296,13 +287,10 @@ public class FragmentRules extends FragmentBase {
startActivityForResult(intent, REQUEST_IMPORT); startActivityForResult(intent, REQUEST_IMPORT);
} }
private void onMenuDelete(boolean all) { private void onMenuDelete() {
Bundle aargs = new Bundle(); Bundle aargs = new Bundle();
aargs.putString("question", getString(all aargs.putString("question", getString(R.string.title_rules_delete_all_confirm));
? R.string.title_rules_delete_all_confirm
: R.string.title_rules_delete_junk_confirm));
aargs.putLong("folder", folder); aargs.putLong("folder", folder);
aargs.putBoolean("all", all);
FragmentDialogAsk ask = new FragmentDialogAsk(); FragmentDialogAsk ask = new FragmentDialogAsk();
ask.setArguments(aargs); ask.setArguments(aargs);
@ -497,35 +485,12 @@ public class FragmentRules extends FragmentBase {
@Override @Override
protected Void onExecute(Context context, Bundle args) throws Throwable { protected Void onExecute(Context context, Bundle args) throws Throwable {
long fid = args.getLong("folder"); long fid = args.getLong("folder");
boolean all = args.getBoolean("all");
DB db = DB.getInstance(context); DB db = DB.getInstance(context);
try { try {
db.beginTransaction(); db.beginTransaction();
if (all) db.rule().deleteRules(fid);
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<EntityRule> 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.setTransactionSuccessful(); db.setTransactionSuccessful();
} finally { } finally {

@ -105,18 +105,6 @@
app:layout_constraintStart_toEndOf="@+id/ibMore" app:layout_constraintStart_toEndOf="@+id/ibMore"
app:layout_constraintTop_toTopOf="@+id/ibMore" /> app:layout_constraintTop_toTopOf="@+id/ibMore" />
<Button
android:id="@+id/btnEditRules"
style="?android:attr/buttonStyleSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:drawableEnd="@drawable/twotone_edit_24"
android:drawablePadding="6dp"
android:text="@string/title_edit_rules"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tvMore" />
<CheckBox <CheckBox
android:id="@+id/cbJunkFilter" android:id="@+id/cbJunkFilter"
android:layout_width="0dp" android:layout_width="0dp"
@ -126,7 +114,7 @@
android:textAppearance="@style/TextAppearance.AppCompat.Small" android:textAppearance="@style/TextAppearance.AppCompat.Small"
app:layout_constraintEnd_toStartOf="@+id/ibInfoFilter" app:layout_constraintEnd_toStartOf="@+id/ibInfoFilter"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/btnEditRules" /> app:layout_constraintTop_toBottomOf="@id/tvMore" />
<eu.faircode.email.FixedTextView <eu.faircode.email.FixedTextView
android:id="@+id/tvJunkFilterHint" android:id="@+id/tvJunkFilterHint"
@ -205,6 +193,31 @@
app:srcCompat="@drawable/twotone_info_24" app:srcCompat="@drawable/twotone_info_24"
app:tint="?attr/colorAccent" /> app:tint="?attr/colorAccent" />
<Button
android:id="@+id/btnClear"
style="?android:attr/buttonStyleSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:drawableEnd="@drawable/twotone_delete_24"
android:drawablePadding="6dp"
android:text="@string/title_junk_clear"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tvBlocklistHint" />
<eu.faircode.email.FixedTextView
android:id="@+id/tvClearHint"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="6dp"
android:text="@string/title_junk_clear_hint"
android:textAppearance="@style/TextAppearance.AppCompat.Small"
android:textColor="?attr/colorWarning"
android:textStyle="italic"
app:layout_constraintEnd_toStartOf="@+id/ibInfoFilter"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/btnClear" />
<androidx.constraintlayout.widget.Group <androidx.constraintlayout.widget.Group
android:id="@+id/grpInJunk" android:id="@+id/grpInJunk"
android:layout_width="0dp" android:layout_width="0dp"
@ -218,8 +231,8 @@
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="0dp" android:layout_height="0dp"
app:constraint_referenced_ids=" app:constraint_referenced_ids="
btnEditRules,
cbJunkFilter,tvJunkFilterHint,ibInfoFilter, cbJunkFilter,tvJunkFilterHint,ibInfoFilter,
cbBlocklist,tvBlocklist,tvBlocklistHint,ibInfoBlocklist" /> cbBlocklist,tvBlocklist,tvBlocklistHint,ibInfoBlocklist,
btnClear,tvClearHint" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
</eu.faircode.email.ScrollViewEx> </eu.faircode.email.ScrollViewEx>

@ -25,10 +25,5 @@
android:id="@+id/menu_delete_all" android:id="@+id/menu_delete_all"
android:title="@string/title_rules_delete_all" android:title="@string/title_rules_delete_all"
app:showAsAction="never" /> app:showAsAction="never" />
<item
android:id="@+id/menu_delete_junk"
android:title="@string/title_rules_delete_junk"
app:showAsAction="never" />
</group> </group>
</menu> </menu>

@ -101,6 +101,8 @@
<string name="title_junk_filter">Use local spam filter</string> <string name="title_junk_filter">Use local spam filter</string>
<string name="title_junk_filter_hint">This can increase battery usage and incorrectly mark messages as spam</string> <string name="title_junk_filter_hint">This can increase battery usage and incorrectly mark messages as spam</string>
<string name="title_junk_blocklist">Use spam block lists</string> <string name="title_junk_blocklist">Use spam block lists</string>
<string name="title_junk_clear">Clear</string>
<string name="title_junk_clear_hint">This will delete all block sender rules</string>
<string name="title_notification_sending">Sending messages</string> <string name="title_notification_sending">Sending messages</string>
<string name="title_notification_waiting">Waiting for suitable connection</string> <string name="title_notification_waiting">Waiting for suitable connection</string>
@ -1692,9 +1694,7 @@
<string name="title_rules_export">Export rules</string> <string name="title_rules_export">Export rules</string>
<string name="title_rules_import">Import rules</string> <string name="title_rules_import">Import rules</string>
<string name="title_rules_delete_all">Delete all rules</string> <string name="title_rules_delete_all">Delete all rules</string>
<string name="title_rules_delete_junk">Delete spam rules</string>
<string name="title_rules_delete_all_confirm">Delete all rules?</string> <string name="title_rules_delete_all_confirm">Delete all rules?</string>
<string name="title_rules_delete_junk_confirm">Delete all rules moving messages to the spam folder?</string>
<string name="title_debug_info">Debug info</string> <string name="title_debug_info">Debug info</string>
<string name="title_debug_info_remark">Please describe the problem and indicate the time of the problem:</string> <string name="title_debug_info_remark">Please describe the problem and indicate the time of the problem:</string>
<string name="title_crash_info_remark">Please describe what you were doing when the app crashed:</string> <string name="title_crash_info_remark">Please describe what you were doing when the app crashed:</string>

Loading…
Cancel
Save