Mercury-IM/app/src/main/java/org/mercury_im/messenger/ui/account/LoginViewModel.java

156 lines
5.0 KiB
Java
Raw Normal View History

2019-12-21 03:46:17 +01:00
package org.mercury_im.messenger.ui.account;
2019-05-04 00:27:02 +02:00
import android.app.Application;
import android.widget.Toast;
2019-08-04 04:22:08 +02:00
import androidx.annotation.NonNull;
import androidx.lifecycle.AndroidViewModel;
2019-07-29 22:14:35 +02:00
import androidx.lifecycle.LiveData;
2019-05-18 10:06:16 +02:00
import androidx.lifecycle.MutableLiveData;
import org.jivesoftware.smack.sasl.SASLErrorException;
2019-07-29 22:14:35 +02:00
import org.jxmpp.jid.EntityBareJid;
import org.jxmpp.jid.impl.JidCreate;
import org.jxmpp.stringprep.XmppStringprepException;
2019-07-29 22:14:35 +02:00
import org.mercury_im.messenger.MercuryImApplication;
import org.mercury_im.messenger.Messenger;
import org.mercury_im.messenger.R;
2020-01-04 22:56:34 +01:00
import org.mercury_im.messenger.entity.Account;
import org.mercury_im.messenger.entity.IAccount;
2019-05-04 00:27:02 +02:00
2020-01-06 03:41:37 +01:00
import java.util.logging.Level;
import java.util.logging.Logger;
2019-05-04 00:27:02 +02:00
import javax.inject.Inject;
import io.reactivex.android.schedulers.AndroidSchedulers;
2019-12-21 04:08:59 +01:00
import io.reactivex.disposables.CompositeDisposable;
import io.reactivex.schedulers.Schedulers;
2019-05-04 00:27:02 +02:00
public class LoginViewModel extends AndroidViewModel {
2019-05-04 00:27:02 +02:00
private MutableLiveData<Error> usernameError = new MutableLiveData<>(new Error());
private MutableLiveData<Error> passwordError = new MutableLiveData<>(new Error());
2019-12-21 04:08:59 +01:00
private MutableLiveData<Boolean> loginButtonEnabled = new MutableLiveData<>(false);
private MutableLiveData<Boolean> loginCompleted = new MutableLiveData<>(false);
private final CompositeDisposable disposable = new CompositeDisposable();
2019-07-29 22:14:35 +02:00
private EntityBareJid username;
2019-07-29 22:14:35 +02:00
private String password;
@Inject
Messenger messenger;
2019-08-24 23:06:06 +02:00
public LoginViewModel(@NonNull Application application) {
super(application);
((MercuryImApplication) application).getAppComponent().inject(this);
2019-05-04 00:27:02 +02:00
}
public void setUsername(String username) {
if (username == null || username.isEmpty()) {
this.username = null;
2019-12-22 02:06:51 +01:00
usernameError.setValue(new Error(getApplication().getResources().getString(R.string.error_field_required)));
} else {
try {
this.username = JidCreate.entityBareFrom(username);
} catch (XmppStringprepException e) {
this.username = null;
usernameError.setValue(new Error(getApplication().getResources().getString(R.string.error_invalid_username)));
}
}
2019-12-22 02:06:51 +01:00
updateLoginButtonState();
2019-08-24 23:06:06 +02:00
}
public void setPassword(String password) {
if (password == null || password.isEmpty()) {
2019-12-22 02:06:51 +01:00
this.password = null;
passwordError.setValue(new Error(getApplication().getResources().getString(R.string.error_field_required)));
2019-12-22 02:06:51 +01:00
} else {
this.password = password;
}
2019-12-22 02:06:51 +01:00
updateLoginButtonState();
2019-07-29 22:14:35 +02:00
}
2019-12-22 02:06:51 +01:00
private void updateLoginButtonState() {
2019-12-21 04:08:59 +01:00
loginButtonEnabled.setValue(username != null && !(password == null || password.isEmpty()));
2019-07-29 22:14:35 +02:00
}
2019-12-21 01:45:30 +01:00
public synchronized void login() {
2020-01-06 03:41:37 +01:00
Boolean loginEnabled = loginButtonEnabled.getValue();
if (loginEnabled != null && !loginEnabled) {
2019-12-21 01:45:30 +01:00
// Prevent race condition where account would be logged in twice
return;
}
2019-12-21 04:08:59 +01:00
loginButtonEnabled.setValue(false);
2020-01-04 22:56:34 +01:00
Account account = new IAccount();
account.setAddress(username.asUnescapedString());
account.setPassword(password);
2019-12-21 04:08:59 +01:00
disposable.add(messenger.addAccount()
2020-01-04 22:56:34 +01:00
.execute(account)
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
2019-12-22 02:06:51 +01:00
.doOnComplete(this::signalLoginSuccessful)
.doOnError(this::signalLoginError)
2019-12-21 04:08:59 +01:00
.subscribe());
2019-07-29 22:14:35 +02:00
}
2019-12-22 02:06:51 +01:00
private void signalLoginSuccessful() {
2020-01-06 03:41:37 +01:00
Logger.getAnonymousLogger().log(Level.INFO, "Signal Login Successful");
2019-12-22 02:06:51 +01:00
loginCompleted.setValue(true);
}
private void signalLoginError(Throwable error) {
if (error instanceof SASLErrorException) {
passwordError.setValue(new Error(getApplication().getResources().getString(R.string.error_incorrect_password)));
2019-12-21 04:08:59 +01:00
loginButtonEnabled.setValue(true);
} else {
Toast.makeText(getApplication(), "A connection error occurred", Toast.LENGTH_LONG).show();
2019-12-21 04:08:59 +01:00
loginButtonEnabled.setValue(true);
}
}
public LiveData<Error> getPasswordError() {
2019-07-29 22:14:35 +02:00
return passwordError;
}
public LiveData<Error> getUsernameError() {
return usernameError;
2019-07-29 22:14:35 +02:00
}
public LiveData<Boolean> isLoginSuccessful() {
2019-12-21 04:08:59 +01:00
return loginCompleted;
2019-07-29 22:14:35 +02:00
}
public LiveData<Boolean> isLoginEnabled() {
2019-12-21 04:08:59 +01:00
return loginButtonEnabled;
2019-05-04 00:27:02 +02:00
}
2019-12-22 02:06:51 +01:00
@Override
protected void onCleared() {
super.onCleared();
disposable.clear();
}
public static class Error {
2019-05-04 00:27:02 +02:00
private String message;
2019-07-29 22:14:35 +02:00
public Error() {
2019-07-29 22:14:35 +02:00
}
public Error(String errorMessage) {
this.message = errorMessage;
2019-07-29 22:14:35 +02:00
}
public boolean isError() {
return message != null;
}
2019-07-29 22:14:35 +02:00
public String getErrorMessage() {
return message;
2019-08-04 04:22:08 +02:00
}
2019-07-29 22:14:35 +02:00
}
2019-05-04 00:27:02 +02:00
}