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 ACCOUNTS_LIST_KEY = "activated_accounts_list";
28 private JoinConferenceDialogListener mListener;
29 private KnownHostsAdapter knownHostsAdapter;
30
31 public static JoinConferenceDialog newInstance(String prefilledJid, List<String> accounts) {
32 JoinConferenceDialog dialog = new JoinConferenceDialog();
33 Bundle bundle = new Bundle();
34 bundle.putString(PREFILLED_JID_KEY, prefilledJid);
35 bundle.putStringArrayList(ACCOUNTS_LIST_KEY, (ArrayList<String>) accounts);
36 dialog.setArguments(bundle);
37 return dialog;
38 }
39
40 @Override
41 public void onActivityCreated(Bundle savedInstanceState) {
42 super.onActivityCreated(savedInstanceState);
43 setRetainInstance(true);
44 }
45
46 @NonNull
47 @Override
48 public Dialog onCreateDialog(Bundle savedInstanceState) {
49 final MaterialAlertDialogBuilder builder =
50 new MaterialAlertDialogBuilder(requireActivity());
51 builder.setTitle(R.string.join_public_channel);
52 final DialogJoinConferenceBinding binding =
53 DataBindingUtil.inflate(
54 getActivity().getLayoutInflater(),
55 R.layout.dialog_join_conference,
56 null,
57 false);
58 DelayedHintHelper.setHint(R.string.channel_full_jid_example, binding.jid);
59 this.knownHostsAdapter = new KnownHostsAdapter(getActivity(), R.layout.item_autocomplete);
60 binding.jid.setAdapter(knownHostsAdapter);
61 String prefilledJid = getArguments().getString(PREFILLED_JID_KEY);
62 if (prefilledJid != null) {
63 binding.jid.append(prefilledJid);
64 }
65 StartConversationActivity.populateAccountSpinner(
66 getActivity(),
67 getArguments().getStringArrayList(ACCOUNTS_LIST_KEY),
68 binding.account);
69 builder.setView(binding.getRoot());
70 builder.setPositiveButton(R.string.join, null);
71 builder.setNegativeButton(R.string.cancel, null);
72 AlertDialog dialog = builder.create();
73 dialog.show();
74 dialog.getButton(DialogInterface.BUTTON_POSITIVE)
75 .setOnClickListener(
76 view ->
77 mListener.onJoinDialogPositiveClick(
78 dialog,
79 binding.account,
80 binding.accountJidLayout,
81 binding.jid));
82 binding.jid.setOnEditorActionListener(
83 (v, actionId, event) -> {
84 mListener.onJoinDialogPositiveClick(
85 dialog, binding.account, binding.accountJidLayout, binding.jid);
86 return true;
87 });
88 return dialog;
89 }
90
91 @Override
92 public void onBackendConnected() {
93 refreshKnownHosts();
94 }
95
96 private void refreshKnownHosts() {
97 Activity activity = getActivity();
98 if (activity instanceof XmppActivity) {
99 Collection<String> hosts =
100 ((XmppActivity) activity).xmppConnectionService.getKnownConferenceHosts();
101 this.knownHostsAdapter.refresh(hosts);
102 }
103 }
104
105 @Override
106 public void onAttach(@NonNull final Context context) {
107 super.onAttach(context);
108 try {
109 mListener = (JoinConferenceDialogListener) context;
110 } catch (ClassCastException e) {
111 throw new ClassCastException(context + " must implement JoinConferenceDialogListener");
112 }
113 }
114
115 @Override
116 public void onDestroyView() {
117 Dialog dialog = getDialog();
118 if (dialog != null && getRetainInstance()) {
119 dialog.setDismissMessage(null);
120 }
121 super.onDestroyView();
122 }
123
124 @Override
125 public void onStart() {
126 super.onStart();
127 final Activity activity = getActivity();
128 if (activity instanceof XmppActivity
129 && ((XmppActivity) activity).xmppConnectionService != null) {
130 refreshKnownHosts();
131 }
132 }
133
134 public interface JoinConferenceDialogListener {
135 void onJoinDialogPositiveClick(
136 Dialog dialog,
137 AutoCompleteTextView spinner,
138 TextInputLayout jidLayout,
139 AutoCompleteTextView jid);
140 }
141}