diff --git a/app/src/main/java/eu/faircode/email/AdapterAnswer.java b/app/src/main/java/eu/faircode/email/AdapterAnswer.java index 5fa2ecb1b9..12023803bd 100644 --- a/app/src/main/java/eu/faircode/email/AdapterAnswer.java +++ b/app/src/main/java/eu/faircode/email/AdapterAnswer.java @@ -23,11 +23,14 @@ import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import androidx.annotation.NonNull; +import androidx.appcompat.widget.PopupMenu; import androidx.lifecycle.LifecycleOwner; import androidx.localbroadcastmanager.content.LocalBroadcastManager; import androidx.recyclerview.widget.DiffUtil; @@ -44,12 +47,14 @@ public class AdapterAnswer extends RecyclerView.Adapter items = new ArrayList<>(); - private boolean primary = false; + private boolean composable = false; public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener { private View view; private TextView tvName; + private TwoStateOwner powner = new TwoStateOwner(owner, "RulePopup"); + ViewHolder(View itemView) { super(itemView); @@ -88,20 +93,68 @@ public class AdapterAnswer extends RecyclerView.Adapter() { + @Override + protected Boolean onExecute(Context context, Bundle args) { + long id = args.getLong("id"); + boolean hide = args.getBoolean("hide"); + + DB db = DB.getInstance(context); + db.answer().setAnswerHidden(id, hide); + + return hide; + } + + @Override + protected void onException(Bundle args, Throwable ex) { + Helper.unexpectedError(context, owner, ex); + } + }.execute(context, owner, args, "rule:enable"); + } + }); + + popupMenu.show(); + + return true; } } @@ -111,22 +164,23 @@ public class AdapterAnswer extends RecyclerView.Adapter() { + new SimpleTask() { @Override - protected EntityFolder onExecute(Context context, Bundle args) { - return DB.getInstance(context).folder().getPrimaryDrafts(); + protected Boolean onExecute(Context context, Bundle args) { + DB db = DB.getInstance(context); + return (db.identity().getComposableIdentities(null).size() > 0); } @Override - protected void onExecuted(Bundle args, EntityFolder drafts) { - primary = (drafts != null); + protected void onExecuted(Bundle args, Boolean composable) { + AdapterAnswer.this.composable = composable; } @Override protected void onException(Bundle args, Throwable ex) { Helper.unexpectedError(AdapterAnswer.this.context, AdapterAnswer.this.owner, ex); } - }.execute(context, owner, new Bundle(), "answer:account:primary"); + }.execute(context, owner, new Bundle(), "answer:composable"); } public void set(@NonNull List answers) { @@ -217,4 +271,9 @@ public class AdapterAnswer extends RecyclerView.Adapter { private List items = new ArrayList<>(); - public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { + public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener { private View view; private TextView tvName; private TextView tvOrder; @@ -55,6 +59,8 @@ public class AdapterRule extends RecyclerView.Adapter { private TextView tvCondition; private TextView tvAction; + private TwoStateOwner powner = new TwoStateOwner(owner, "RulePopup"); + ViewHolder(View itemView) { super(itemView); @@ -68,10 +74,12 @@ public class AdapterRule extends RecyclerView.Adapter { private void wire() { view.setOnClickListener(this); + view.setOnLongClickListener(this); } private void unwire() { view.setOnClickListener(null); + view.setOnLongClickListener(null); } private void bindTo(TupleRuleEx rule) { @@ -138,6 +146,61 @@ public class AdapterRule extends RecyclerView.Adapter { .putExtra("account", rule.account) .putExtra("folder", rule.folder)); } + + @Override + public boolean onLongClick(View v) { + int pos = getAdapterPosition(); + if (pos == RecyclerView.NO_POSITION) + return false; + + final TupleRuleEx rule = items.get(pos); + + PopupMenuLifecycle popupMenu = new PopupMenuLifecycle(context, powner, view); + + popupMenu.getMenu().add(Menu.NONE, 1, 1, R.string.title_rule_enabled) + .setCheckable(true).setChecked(rule.enabled); + + popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { + @Override + public boolean onMenuItemClick(MenuItem item) { + switch (item.getItemId()) { + case 1: + onActionEnabled(!item.isChecked()); + return true; + default: + return false; + } + } + + private void onActionEnabled(boolean enabled) { + Bundle args = new Bundle(); + args.putLong("id", rule.id); + args.putBoolean("enabled", enabled); + + new SimpleTask() { + @Override + protected Boolean onExecute(Context context, Bundle args) { + long id = args.getLong("id"); + boolean enabled = args.getBoolean("enabled"); + + DB db = DB.getInstance(context); + db.rule().setRuleEnabled(id, enabled); + + return enabled; + } + + @Override + protected void onException(Bundle args, Throwable ex) { + Helper.unexpectedError(context, owner, ex); + } + }.execute(context, owner, args, "rule:enable"); + } + }); + + popupMenu.show(); + + return true; + } } AdapterRule(Context context, LifecycleOwner owner) { @@ -235,4 +298,9 @@ public class AdapterRule extends RecyclerView.Adapter { holder.bindTo(rule); holder.wire(); } + + @Override + public void onViewRecycled(@NonNull ViewHolder holder) { + holder.powner.recreate(); + } } diff --git a/app/src/main/java/eu/faircode/email/DaoAnswer.java b/app/src/main/java/eu/faircode/email/DaoAnswer.java index 34cb1cd3be..427fadd3f1 100644 --- a/app/src/main/java/eu/faircode/email/DaoAnswer.java +++ b/app/src/main/java/eu/faircode/email/DaoAnswer.java @@ -47,6 +47,9 @@ public interface DaoAnswer { @Update int updateAnswer(EntityAnswer answer); + @Query("UPDATE answer SET hide = :hide WHERE id = :id") + int setAnswerHidden(long id, boolean hide); + @Query("DELETE FROM answer WHERE id = :id") void deleteAnswer(long id); } diff --git a/app/src/main/java/eu/faircode/email/DaoRule.java b/app/src/main/java/eu/faircode/email/DaoRule.java index 9d3feaa413..6562824ff7 100644 --- a/app/src/main/java/eu/faircode/email/DaoRule.java +++ b/app/src/main/java/eu/faircode/email/DaoRule.java @@ -59,6 +59,9 @@ public interface DaoRule { @Update int updateRule(EntityRule rule); + @Query("UPDATE rule SET enabled = :enabled WHERE id = :id") + int setRuleEnabled(long id, boolean enabled); + @Query("DELETE FROM rule WHERE id = :id") void deleteRule(long id); }