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}