2020-06-06 18:45:20 +02:00
|
|
|
package org.mercury_im.messenger.android.ui.roster.contacts;
|
2020-06-04 00:04:20 +02:00
|
|
|
|
|
|
|
import android.app.AlertDialog;
|
|
|
|
import android.app.Dialog;
|
2020-06-04 23:49:03 +02:00
|
|
|
import android.content.Context;
|
2020-06-04 00:04:20 +02:00
|
|
|
import android.content.DialogInterface;
|
|
|
|
import android.os.Bundle;
|
|
|
|
import android.view.LayoutInflater;
|
|
|
|
import android.view.View;
|
2020-06-04 23:49:03 +02:00
|
|
|
import android.view.ViewGroup;
|
2020-06-04 00:04:20 +02:00
|
|
|
import android.widget.ArrayAdapter;
|
2020-06-04 23:49:03 +02:00
|
|
|
import android.widget.Button;
|
|
|
|
import android.widget.LinearLayout;
|
2020-06-04 00:04:20 +02:00
|
|
|
import android.widget.Spinner;
|
2020-06-04 23:49:03 +02:00
|
|
|
import android.widget.TextView;
|
2020-06-04 00:04:20 +02:00
|
|
|
|
|
|
|
import androidx.annotation.NonNull;
|
|
|
|
import androidx.annotation.Nullable;
|
|
|
|
import androidx.appcompat.app.AppCompatDialogFragment;
|
|
|
|
|
2020-06-04 23:49:03 +02:00
|
|
|
import com.google.android.material.textfield.TextInputEditText;
|
|
|
|
import com.google.android.material.textfield.TextInputLayout;
|
|
|
|
|
|
|
|
import org.jivesoftware.smack.SmackException;
|
|
|
|
import org.jxmpp.stringprep.XmppStringprepException;
|
2020-06-06 18:45:20 +02:00
|
|
|
import org.mercury_im.messenger.core.Messenger;
|
2020-06-04 00:04:20 +02:00
|
|
|
import org.mercury_im.messenger.R;
|
|
|
|
import org.mercury_im.messenger.entity.Account;
|
2020-06-06 18:45:20 +02:00
|
|
|
import org.mercury_im.messenger.core.exception.ContactAlreadyAddedException;
|
2020-06-04 00:04:20 +02:00
|
|
|
|
|
|
|
import java.util.List;
|
|
|
|
|
2020-06-04 23:49:03 +02:00
|
|
|
import butterknife.BindView;
|
|
|
|
import butterknife.ButterKnife;
|
|
|
|
import io.reactivex.android.schedulers.AndroidSchedulers;
|
|
|
|
import io.reactivex.disposables.CompositeDisposable;
|
|
|
|
import io.reactivex.schedulers.Schedulers;
|
|
|
|
|
2020-06-04 00:04:20 +02:00
|
|
|
public class AddContactDialogFragment extends AppCompatDialogFragment {
|
|
|
|
|
2020-06-04 23:49:03 +02:00
|
|
|
private final List<Account> accounts;
|
|
|
|
private final Messenger messenger;
|
|
|
|
|
|
|
|
@BindView(R.id.account_select_container)
|
|
|
|
LinearLayout accountSelectorContainer;
|
|
|
|
|
|
|
|
@BindView(R.id.spinner)
|
|
|
|
Spinner accountSelector;
|
|
|
|
|
|
|
|
@BindView(R.id.address_layout)
|
|
|
|
TextInputLayout contactAddressLayout;
|
|
|
|
|
|
|
|
@BindView(R.id.address)
|
|
|
|
TextInputEditText contactAddress;
|
|
|
|
|
|
|
|
private final CompositeDisposable disposable = new CompositeDisposable();
|
2020-06-04 00:04:20 +02:00
|
|
|
|
2020-06-04 23:49:03 +02:00
|
|
|
public AddContactDialogFragment(List<Account> accountList, Messenger messenger) {
|
2020-06-04 00:04:20 +02:00
|
|
|
this.accounts = accountList;
|
2020-06-04 23:49:03 +02:00
|
|
|
this.messenger = messenger;
|
2020-06-04 00:04:20 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
@NonNull
|
|
|
|
@Override
|
|
|
|
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
|
|
|
|
LayoutInflater inflater = requireActivity().getLayoutInflater();
|
|
|
|
View dialogView = inflater.inflate(R.layout.dialog_add_contact, null);
|
2020-06-04 23:49:03 +02:00
|
|
|
ButterKnife.bind(this, dialogView);
|
|
|
|
|
|
|
|
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
|
|
|
|
|
|
|
|
// Hide Spinner when only one account.
|
|
|
|
if (accounts == null || accounts.size() <= 1) {
|
|
|
|
accountSelectorContainer.setVisibility(View.GONE);
|
|
|
|
}
|
|
|
|
|
|
|
|
accountSelector.setAdapter(new AccountAdapter(requireActivity(), accounts));
|
|
|
|
accountSelector.setSelection(0);
|
2020-06-04 00:04:20 +02:00
|
|
|
|
2020-06-05 16:35:16 +02:00
|
|
|
builder.setTitle(R.string.dialog_title_add_contact)
|
2020-06-04 00:04:20 +02:00
|
|
|
.setView(dialogView)
|
|
|
|
.setCancelable(false)
|
2020-06-05 16:35:16 +02:00
|
|
|
.setPositiveButton(R.string.button_add, new DialogInterface.OnClickListener() {
|
2020-06-04 00:04:20 +02:00
|
|
|
@Override
|
|
|
|
public void onClick(DialogInterface dialog, int which) {
|
2020-06-04 23:49:03 +02:00
|
|
|
// Later overwrite in onResume.
|
2020-06-04 00:04:20 +02:00
|
|
|
}
|
|
|
|
})
|
2020-06-05 16:35:16 +02:00
|
|
|
.setNegativeButton(R.string.button_cancel, new DialogInterface.OnClickListener() {
|
2020-06-04 00:04:20 +02:00
|
|
|
@Override
|
|
|
|
public void onClick(DialogInterface dialog, int which) {
|
|
|
|
AddContactDialogFragment.this.onCancel(dialog);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
return builder.create();
|
|
|
|
}
|
2020-06-04 23:49:03 +02:00
|
|
|
|
|
|
|
@Override
|
|
|
|
public void onResume()
|
|
|
|
{
|
|
|
|
super.onResume();
|
|
|
|
final AlertDialog d = (AlertDialog)getDialog();
|
2020-06-05 16:35:16 +02:00
|
|
|
if(d == null) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
Button positiveButton = d.getButton(Dialog.BUTTON_POSITIVE);
|
|
|
|
positiveButton.setOnClickListener(v -> {
|
|
|
|
Account account = accounts.get(accountSelector.getSelectedItemPosition());
|
|
|
|
String address = contactAddress.getText() != null ? contactAddress.getText().toString() : "";
|
|
|
|
disposable.add(messenger.addContact(account.getId(), address)
|
|
|
|
.subscribeOn(Schedulers.io())
|
|
|
|
.observeOn(AndroidSchedulers.mainThread())
|
|
|
|
.subscribe(
|
2020-06-04 23:49:03 +02:00
|
|
|
AddContactDialogFragment.this::dismiss,
|
|
|
|
e -> {
|
|
|
|
if (e instanceof SmackException.NotLoggedInException || e instanceof SmackException.NotConnectedException) {
|
2020-06-05 16:35:16 +02:00
|
|
|
contactAddressLayout.setError(getString(R.string.error_account_not_connected));
|
2020-06-04 23:49:03 +02:00
|
|
|
} else if (e instanceof ContactAlreadyAddedException) {
|
2020-06-05 16:35:16 +02:00
|
|
|
contactAddressLayout.setError(getString(R.string.error_contact_already_added));
|
2020-06-04 23:49:03 +02:00
|
|
|
} else if (e instanceof XmppStringprepException) {
|
2020-06-05 16:35:16 +02:00
|
|
|
contactAddressLayout.setError(getString(R.string.error_invalid_address));
|
2020-06-04 23:49:03 +02:00
|
|
|
} else {
|
|
|
|
contactAddressLayout.setError(e.getClass().getName());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
));
|
2020-06-05 16:35:16 +02:00
|
|
|
});
|
2020-06-04 23:49:03 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void onDestroy() {
|
|
|
|
super.onDestroy();
|
|
|
|
disposable.dispose();
|
|
|
|
}
|
|
|
|
|
|
|
|
private static class AccountAdapter extends ArrayAdapter<Account> {
|
|
|
|
|
|
|
|
public AccountAdapter(@NonNull Context context, @NonNull List<Account> objects) {
|
|
|
|
super(context, R.layout.spinner_item_account, objects);
|
|
|
|
}
|
|
|
|
|
|
|
|
@NonNull
|
|
|
|
@Override
|
|
|
|
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
|
|
|
|
if (convertView == null) {
|
|
|
|
convertView = LayoutInflater.from(getContext()).inflate(R.layout.spinner_item_account, parent, false);
|
|
|
|
}
|
|
|
|
TextView textView = convertView.findViewById(R.id.account_address);
|
|
|
|
textView.setText(getItem(position).getAddress());
|
|
|
|
return convertView;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public View getDropDownView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
|
|
|
|
return getView(position, convertView, parent);
|
|
|
|
}
|
|
|
|
}
|
2020-06-04 00:04:20 +02:00
|
|
|
}
|