1package eu.siacs.conversations.ui;
2
3import android.view.View;
4import android.widget.Toast;
5import androidx.annotation.StringRes;
6import androidx.databinding.DataBindingUtil;
7import com.google.android.material.dialog.MaterialAlertDialogBuilder;
8import eu.siacs.conversations.R;
9import eu.siacs.conversations.databinding.DialogBlockContactBinding;
10import eu.siacs.conversations.entities.Blockable;
11import eu.siacs.conversations.entities.Conversation;
12import eu.siacs.conversations.ui.util.JidDialog;
13
14public final class BlockContactDialog {
15
16 public static void show(final XmppActivity xmppActivity, final Blockable blockable) {
17 show(xmppActivity, blockable, null);
18 }
19
20 public static void show(
21 final XmppActivity xmppActivity, final Blockable blockable, final String serverMsgId) {
22 final MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(xmppActivity);
23 final boolean isBlocked = blockable.isBlocked();
24 builder.setNegativeButton(R.string.cancel, null);
25 DialogBlockContactBinding binding =
26 DataBindingUtil.inflate(
27 xmppActivity.getLayoutInflater(),
28 R.layout.dialog_block_contact,
29 null,
30 false);
31 final boolean reporting =
32 blockable.getAccount().getXmppConnection().getFeatures().spamReporting();
33 if (reporting && !isBlocked) {
34 binding.reportSpam.setVisibility(View.VISIBLE);
35 if (serverMsgId != null) {
36 binding.reportSpam.setChecked(true);
37 binding.reportSpam.setEnabled(false);
38 } else {
39 binding.reportSpam.setEnabled(true);
40 }
41 } else {
42 binding.reportSpam.setVisibility(View.GONE);
43 }
44 builder.setView(binding.getRoot());
45
46 final String value;
47 @StringRes int res;
48 if (blockable.getJid().isFullJid()) {
49 builder.setTitle(
50 isBlocked
51 ? R.string.action_unblock_participant
52 : R.string.action_block_participant);
53 value = blockable.getJid().toString();
54 res = isBlocked ? R.string.unblock_contact_text : R.string.block_contact_text;
55 } else if (blockable.getJid().getLocal() == null
56 || blockable.getAccount().isBlocked(blockable.getJid().getDomain())) {
57 builder.setTitle(
58 isBlocked ? R.string.action_unblock_domain : R.string.action_block_domain);
59 value = blockable.getJid().getDomain().toString();
60 res = isBlocked ? R.string.unblock_domain_text : R.string.block_domain_text;
61 } else {
62 if (isBlocked) {
63 builder.setTitle(R.string.action_unblock_contact);
64 } else if (serverMsgId != null) {
65 builder.setTitle(R.string.report_spam_and_block);
66 } else {
67 final int resBlockAction =
68 blockable instanceof Conversation
69 && ((Conversation) blockable).isWithStranger()
70 ? R.string.block_stranger
71 : R.string.action_block_contact;
72 builder.setTitle(resBlockAction);
73 }
74 value = blockable.getJid().asBareJid().toString();
75 res = isBlocked ? R.string.unblock_contact_text : R.string.block_contact_text;
76 }
77 binding.text.setText(JidDialog.style(xmppActivity, res, value));
78 builder.setPositiveButton(
79 isBlocked ? R.string.unblock : R.string.block,
80 (dialog, which) -> {
81 if (isBlocked) {
82 xmppActivity.xmppConnectionService.sendUnblockRequest(blockable);
83 } else {
84 boolean toastShown = false;
85 if (xmppActivity.xmppConnectionService.sendBlockRequest(
86 blockable, binding.reportSpam.isChecked(), serverMsgId)) {
87 Toast.makeText(
88 xmppActivity,
89 R.string.corresponding_chats_closed,
90 Toast.LENGTH_SHORT)
91 .show();
92 toastShown = true;
93 }
94 if (xmppActivity instanceof ContactDetailsActivity) {
95 if (!toastShown) {
96 Toast.makeText(
97 xmppActivity,
98 R.string.contact_blocked_past_tense,
99 Toast.LENGTH_SHORT)
100 .show();
101 }
102 xmppActivity.finish();
103 }
104 }
105 });
106 builder.create().show();
107 }
108}