1package eu.siacs.conversations.ui;
  2
  3import android.app.Activity;
  4import android.app.Dialog;
  5import android.content.Context;
  6import android.content.DialogInterface;
  7import android.os.Bundle;
  8import android.widget.AutoCompleteTextView;
  9import androidx.annotation.NonNull;
 10import androidx.appcompat.app.AlertDialog;
 11import androidx.databinding.DataBindingUtil;
 12import androidx.fragment.app.DialogFragment;
 13import com.google.android.material.dialog.MaterialAlertDialogBuilder;
 14import com.google.android.material.textfield.TextInputLayout;
 15import eu.siacs.conversations.R;
 16import eu.siacs.conversations.databinding.DialogJoinConferenceBinding;
 17import eu.siacs.conversations.ui.adapter.KnownHostsAdapter;
 18import eu.siacs.conversations.ui.interfaces.OnBackendConnected;
 19import eu.siacs.conversations.ui.util.DelayedHintHelper;
 20import java.util.ArrayList;
 21import java.util.Collection;
 22import java.util.List;
 23
 24public class JoinConferenceDialog extends DialogFragment implements OnBackendConnected {
 25
 26    private static final String PREFILLED_JID_KEY = "prefilled_jid";
 27    private static final String PREFILLED_PASSWORD_KEY = "prefilled_password";
 28    private static final String ACCOUNTS_LIST_KEY = "activated_accounts_list";
 29    private JoinConferenceDialogListener mListener;
 30    private KnownHostsAdapter knownHostsAdapter;
 31
 32    public static JoinConferenceDialog newInstance(String prefilledJid, String password, List<String> accounts) {
 33        JoinConferenceDialog dialog = new JoinConferenceDialog();
 34        Bundle bundle = new Bundle();
 35        bundle.putString(PREFILLED_JID_KEY, prefilledJid);
 36        bundle.putString(PREFILLED_PASSWORD_KEY, password);
 37        bundle.putStringArrayList(ACCOUNTS_LIST_KEY, (ArrayList<String>) accounts);
 38        dialog.setArguments(bundle);
 39        return dialog;
 40    }
 41
 42    @Override
 43    public void onActivityCreated(Bundle savedInstanceState) {
 44        super.onActivityCreated(savedInstanceState);
 45        setRetainInstance(true);
 46    }
 47
 48    @NonNull
 49    @Override
 50    public Dialog onCreateDialog(Bundle savedInstanceState) {
 51        final MaterialAlertDialogBuilder builder =
 52                new MaterialAlertDialogBuilder(requireActivity());
 53        builder.setTitle(R.string.join_public_channel);
 54        final DialogJoinConferenceBinding binding =
 55                DataBindingUtil.inflate(
 56                        getActivity().getLayoutInflater(),
 57                        R.layout.dialog_join_conference,
 58                        null,
 59                        false);
 60        DelayedHintHelper.setHint(R.string.channel_full_jid_example, binding.jid);
 61        this.knownHostsAdapter = new KnownHostsAdapter(getActivity(), R.layout.item_autocomplete);
 62        binding.jid.setAdapter(knownHostsAdapter);
 63        String prefilledJid = getArguments().getString(PREFILLED_JID_KEY);
 64        if (prefilledJid != null) {
 65            binding.jid.append(prefilledJid);
 66        }
 67        StartConversationActivity.populateAccountSpinner(
 68                getActivity(),
 69                getArguments().getStringArrayList(ACCOUNTS_LIST_KEY),
 70                binding.account);
 71        builder.setView(binding.getRoot());
 72        builder.setPositiveButton(R.string.join, null);
 73        builder.setNegativeButton(R.string.cancel, null);
 74        AlertDialog dialog = builder.create();
 75        dialog.show();
 76
 77        dialog.getButton(DialogInterface.BUTTON_POSITIVE).setOnClickListener(view -> mListener.onJoinDialogPositiveClick(dialog, binding.account, binding.accountJidLayout, binding.jid, binding.jid.getText().toString().equals(getArguments().getString(PREFILLED_JID_KEY)) ? getArguments().getString(PREFILLED_PASSWORD_KEY) : null));
 78        dialog.getButton(DialogInterface.BUTTON_POSITIVE)
 79                .setOnClickListener(
 80                        view ->
 81                                mListener.onJoinDialogPositiveClick(
 82                                        dialog,
 83                                        binding.account,
 84                                        binding.accountJidLayout,
 85                                        binding.jid,
 86                                        binding.jid.getText().toString().equals(getArguments().getString(PREFILLED_JID_KEY)) ? getArguments().getString(PREFILLED_PASSWORD_KEY) : null
 87                                ));
 88        binding.jid.setOnEditorActionListener(
 89                (v, actionId, event) -> {
 90                    mListener.onJoinDialogPositiveClick(
 91                            dialog, binding.account, binding.accountJidLayout, binding.jid,
 92                            binding.jid.getText().toString().equals(getArguments().getString(PREFILLED_JID_KEY)) ? getArguments().getString(PREFILLED_PASSWORD_KEY) : null
 93                    );
 94                    return true;
 95                });
 96        return dialog;
 97    }
 98
 99    @Override
100    public void onBackendConnected() {
101        refreshKnownHosts();
102    }
103
104    private void refreshKnownHosts() {
105        Activity activity = getActivity();
106        if (activity instanceof XmppActivity) {
107            Collection<String> hosts =
108                    ((XmppActivity) activity).xmppConnectionService.getKnownConferenceHosts();
109            this.knownHostsAdapter.refresh(hosts);
110        }
111    }
112
113    @Override
114    public void onAttach(@NonNull final Context context) {
115        super.onAttach(context);
116        try {
117            mListener = (JoinConferenceDialogListener) context;
118        } catch (ClassCastException e) {
119            throw new ClassCastException(context + " must implement JoinConferenceDialogListener");
120        }
121    }
122
123    @Override
124    public void onDestroyView() {
125        Dialog dialog = getDialog();
126        if (dialog != null && getRetainInstance()) {
127            dialog.setDismissMessage(null);
128        }
129        super.onDestroyView();
130    }
131
132    @Override
133    public void onStart() {
134        super.onStart();
135        final Activity activity = getActivity();
136        if (activity instanceof XmppActivity
137                && ((XmppActivity) activity).xmppConnectionService != null) {
138            refreshKnownHosts();
139        }
140    }
141
142    public interface JoinConferenceDialogListener {
143        void onJoinDialogPositiveClick(Dialog dialog, AutoCompleteTextView spinner, TextInputLayout jidLayout, AutoCompleteTextView jid, String password);
144    }
145}