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 var finalServerId = serverMsgId;
86 if (serverMsgId == null && binding.reportSpam.isChecked() && blockable instanceof Conversation) {
87 final var lastM = ((Conversation) blockable).getLatestMessage();
88 if (lastM != null) finalServerId = lastM.getServerMsgId();
89 }
90 if (xmppActivity.xmppConnectionService.sendBlockRequest(
91 blockable, binding.reportSpam.isChecked(), finalServerId)) {
92 Toast.makeText(
93 xmppActivity,
94 R.string.corresponding_chats_closed,
95 Toast.LENGTH_SHORT)
96 .show();
97 toastShown = true;
98 }
99 if (xmppActivity instanceof ContactDetailsActivity) {
100 if (!toastShown) {
101 Toast.makeText(
102 xmppActivity,
103 R.string.contact_blocked_past_tense,
104 Toast.LENGTH_SHORT)
105 .show();
106 }
107 xmppActivity.finish();
108 }
109 }
110 });
111 builder.create().show();
112 }
113}