JoinConferenceDialog.java

  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}