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