package com.quickblox.sample.groupchatwebrtc.activities;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
import com.quickblox.core.QBEntityCallback;
import com.quickblox.core.exception.QBResponseException;
import com.quickblox.core.helper.StringifyArrayList;
import com.quickblox.core.helper.Utils;
import com.quickblox.sample.core.utils.KeyboardUtils;
import com.quickblox.sample.core.utils.SharedPrefsHelper;
import com.quickblox.sample.core.utils.Toaster;
import com.quickblox.sample.core.utils.configs.CoreConfigUtils;
import com.quickblox.sample.groupchatwebrtc.R;
import com.quickblox.sample.groupchatwebrtc.services.CallService;
import com.quickblox.sample.groupchatwebrtc.utils.Consts;
import com.quickblox.sample.groupchatwebrtc.utils.QBEntityCallbackImpl;
import com.quickblox.sample.groupchatwebrtc.utils.UsersUtils;
import com.quickblox.sample.groupchatwebrtc.utils.ValidationUtils;
import com.quickblox.users.model.QBUser;
public class LoginActivity extends BaseActivity {
private String TAG = LoginActivity.class.getSimpleName();
private EditText userNameEditText;
private EditText chatRoomNameEditText;
private QBUser userForSave;
public static void start(Context context) {
Intent intent = new Intent(context, LoginActivity.class);
context.startActivity(intent);
}
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
initUI();
}
@Override
protected View getSnackbarAnchorView() {
return findViewById(R.id.root_view_login_activity);
}
private void initUI() {
setActionBarTitle(R.string.title_login_activity);
userNameEditText = (EditText) findViewById(R.id.user_name);
userNameEditText.addTextChangedListener(new LoginEditTextWatcher(userNameEditText));
chatRoomNameEditText = (EditText) findViewById(R.id.chat_room_name);
chatRoomNameEditText.addTextChangedListener(new LoginEditTextWatcher(chatRoomNameEditText));
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_login, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_login_user_done:
if (isEnteredUserNameValid() && isEnteredRoomNameValid()) {
hideKeyboard();
startSignUpNewUser(createUserWithEnteredData());
}
return true;
default:
return super.onOptionsItemSelected(item);
}
}
private boolean isEnteredRoomNameValid() {
return ValidationUtils.isRoomNameValid(this, chatRoomNameEditText);
}
private boolean isEnteredUserNameValid() {
return ValidationUtils.isUserNameValid(this, userNameEditText);
}
private void hideKeyboard() {
KeyboardUtils.hideKeyboard(userNameEditText);
KeyboardUtils.hideKeyboard(chatRoomNameEditText);
}
private void startSignUpNewUser(final QBUser newUser) {
showProgressDialog(R.string.dlg_creating_new_user);
requestExecutor.signUpNewUser(newUser, new QBEntityCallback<QBUser>() {
@Override
public void onSuccess(QBUser result, Bundle params) {
loginToChat(result);
}
@Override
public void onError(QBResponseException e) {
if (e.getHttpStatusCode() == Consts.ERR_LOGIN_ALREADY_TAKEN_HTTP_STATUS) {
signInCreatedUser(newUser, true);
} else {
hideProgressDialog();
Toaster.longToast(R.string.sign_up_error);
}
}
}
);
}
private void loginToChat(final QBUser qbUser) {
qbUser.setPassword(Consts.DEFAULT_USER_PASSWORD);
userForSave = qbUser;
startLoginService(qbUser);
}
private void startOpponentsActivity() {
OpponentsActivity.start(LoginActivity.this, false);
finish();
}
private void saveUserData(QBUser qbUser) {
SharedPrefsHelper sharedPrefsHelper = SharedPrefsHelper.getInstance();
sharedPrefsHelper.save(Consts.PREF_CURREN_ROOM_NAME, qbUser.getTags().get(0));
sharedPrefsHelper.saveQbUser(qbUser);
}
private QBUser createUserWithEnteredData() {
return createQBUserWithCurrentData(String.valueOf(userNameEditText.getText()),
String.valueOf(chatRoomNameEditText.getText()));
}
private QBUser createQBUserWithCurrentData(String userName, String chatRoomName) {
QBUser qbUser = null;
if (!TextUtils.isEmpty(userName) && !TextUtils.isEmpty(chatRoomName)) {
StringifyArrayList<String> userTags = new StringifyArrayList<>();
userTags.add(chatRoomName);
qbUser = new QBUser();
qbUser.setFullName(userName);
qbUser.setLogin(getCurrentDeviceId());
qbUser.setPassword(Consts.DEFAULT_USER_PASSWORD);
qbUser.setTags(userTags);
}
return qbUser;
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == Consts.EXTRA_LOGIN_RESULT_CODE) {
hideProgressDialog();
boolean isLoginSuccess = data.getBooleanExtra(Consts.EXTRA_LOGIN_RESULT, false);
String errorMessage = data.getStringExtra(Consts.EXTRA_LOGIN_ERROR_MESSAGE);
if (isLoginSuccess) {
saveUserData(userForSave);
signInCreatedUser(userForSave, false);
} else {
Toaster.longToast(getString(R.string.login_chat_login_error) + errorMessage);
userNameEditText.setText(userForSave.getFullName());
chatRoomNameEditText.setText(userForSave.getTags().get(0));
}
}
}
private void signInCreatedUser(final QBUser user, final boolean deleteCurrentUser) {
requestExecutor.signInUser(user, new QBEntityCallbackImpl<QBUser>() {
@Override
public void onSuccess(QBUser result, Bundle params) {
if (deleteCurrentUser) {
removeAllUserData(result);
} else {
startOpponentsActivity();
}
}
@Override
public void onError(QBResponseException responseException) {
hideProgressDialog();
Toaster.longToast(R.string.sign_up_error);
}
});
}
private void removeAllUserData(final QBUser user) {
requestExecutor.deleteCurrentUser(user.getId(), new QBEntityCallback<Void>() {
@Override
public void onSuccess(Void aVoid, Bundle bundle) {
UsersUtils.removeUserData(getApplicationContext());
startSignUpNewUser(createUserWithEnteredData());
}
@Override
public void onError(QBResponseException e) {
hideProgressDialog();
Toaster.longToast(R.string.sign_up_error);
}
});
}
private void startLoginService(QBUser qbUser) {
Intent tempIntent = new Intent(this, CallService.class);
PendingIntent pendingIntent = createPendingResult(Consts.EXTRA_LOGIN_RESULT_CODE, tempIntent, 0);
CallService.start(this, qbUser, pendingIntent);
}
private String getCurrentDeviceId() {
return Utils.generateDeviceId(this);
}
private class LoginEditTextWatcher implements TextWatcher {
private EditText editText;
private LoginEditTextWatcher(EditText editText) {
this.editText = editText;
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
editText.setError(null);
}
@Override
public void afterTextChanged(Editable s) {
}
}
}