package ua.kpi.ecampus.ui.activity;
import android.app.LoaderManager;
import android.app.ProgressDialog;
import android.content.Loader;
import android.os.Bundle;
import android.support.design.widget.TextInputLayout;
import android.widget.Button;
import android.widget.EditText;
import java.util.LinkedList;
import java.util.List;
import javax.inject.Inject;
import butterknife.Bind;
import butterknife.OnClick;
import ua.kpi.ecampus.Config;
import ua.kpi.ecampus.R;
import ua.kpi.ecampus.api.response.BaseResponse;
import ua.kpi.ecampus.di.UIModule;
import ua.kpi.ecampus.loader.TokenLoader;
import ua.kpi.ecampus.ui.presenter.LoginPresenter;
import ua.kpi.ecampus.util.ToastUtil;
/**
* Login activity.
*/
public class LoginActivity extends BaseActivity implements LoginPresenter
.IView, LoaderManager.LoaderCallbacks<BaseResponse> {
@Bind(R.id.edit_text_login)
EditText mLogin;
@Bind(R.id.edit_text_password)
EditText mPassword;
@Bind(R.id.button_login)
Button mBtnLogin;
@Inject
LoginPresenter mPresenter;
private ProgressDialog mProgressDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
bindViews();
mPresenter.setView(this);
mPresenter.initializeViewComponent();
}
@Override
protected List<Object> getModules() {
LinkedList<Object> modules = new LinkedList<>();
modules.add(new UIModule());
return modules;
}
@Override
public void showLoginProgressDialog() {
mProgressDialog = new ProgressDialog(LoginActivity.this, R.style
.AppTheme_Dark_Dialog);
mProgressDialog.setIndeterminate(true);
mProgressDialog.setMessage(getString(R.string.progress_authenticate));
mProgressDialog.show();
}
@Override
public void dismissProgressDialog() {
mProgressDialog.dismiss();
}
@Override
public void activateLoginButton(boolean shouldShow) {
mBtnLogin.setActivated(shouldShow);
}
@Override
public void onLoginFailed(BaseResponse response) {
switch (response.getRequestResult()) {
case OK:
int code = response.getStatusCode();
if (code == 200)
ToastUtil.showShortMessage(getString(R.string.invalid_credentials),
getApplicationContext());
else if (code == 500)
ToastUtil.showShortMessage(getString(R.string.server_error),
getApplicationContext());
break;
case ERROR:
ToastUtil.showShortMessage(getString(R.string.no_internet), getApplicationContext());
break;
}
}
@Override
public void initLoader(Bundle args) {
getLoaderManager().initLoader(R.id.api_loader, args, this);
}
@OnClick(R.id.button_login)
public void login() {
String userLogin = mLogin.getText().toString();
String userPassword = mPassword.getText().toString();
boolean isValid = validateInput(userLogin, userPassword);
if (isValid) {
mPresenter.onStartLogin();
mPresenter.initRequest(userLogin, userPassword);
}
}
@Override
public Loader<BaseResponse> onCreateLoader(int i, Bundle bundle) {
switch (i) {
case R.id.api_loader:
String login = bundle.getString(Config.KEY_LOGIN);
String pass = bundle.getString(Config.KEY_PASSWORD);
return new TokenLoader(getApplicationContext(), login, pass);
default:
return null;
}
}
@Override
public void onLoadFinished(Loader<BaseResponse> loader, BaseResponse
baseResponse) {
int id = loader.getId();
if (id == R.id.api_loader) {
mPresenter.onFinishLogin();
mPresenter.setLoaderResult(baseResponse);
}
getLoaderManager().destroyLoader(id);
}
@Override
public void onLoaderReset(Loader<BaseResponse> loader) {
}
@Override
public void onBackPressed() {
// Disable going back to the MainActivity
moveTaskToBack(true);
}
/**
* Validate user input credentials.
*
* @param inputLogin
* @param inputPassword
* @return true if credentials are not empty, false otherwise.
*/
private boolean validateInput(String inputLogin, String inputPassword) {
boolean isValid = true;
TextInputLayout inputLayout = (TextInputLayout) findViewById(R.id.input_login);
if (inputLogin.isEmpty()) {
setErrorInput(inputLayout, getString(R.string.login_is_required));
isValid = false;
} else {
setErrorInput(inputLayout, null);
}
inputLayout = (TextInputLayout) findViewById(R.id.input_password);
if (inputLogin.isEmpty()) {
setErrorInput(inputLayout, getString(R.string.password_is_required));
isValid = false;
} else {
setErrorInput(inputLayout, null);
}
return isValid;
}
/**
* Handle user input error.
*
* @param inputLayout TextInputLayout view
* @param errorMsg error message to show
*/
private void setErrorInput(TextInputLayout inputLayout, String errorMsg) {
inputLayout.setError(errorMsg);
}
}