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}