package com.cheng.mvpframestudy.diymvp.presenter.impl;
import android.content.Loader;
import android.database.Cursor;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.SystemClock;
import android.provider.ContactsContract;
import android.text.TextUtils;
import com.cheng.mvpframestudy.R;
import com.cheng.mvpframestudy.diymvp.presenter.i.ILoginPresenter;
import com.cheng.mvpframestudy.diymvp.ui.i.ILoginView;
import java.util.ArrayList;
import java.util.List;
/**
*
*/
public class LoginPresenterImpl implements ILoginPresenter {
private static final String[] DUMMY_CREDENTIALS = new String[]{
"foo@example.com:hello", "bar@example.com:world"
};
private UserLoginTask mAuthTask = null;
private ILoginView mLoginView;
public LoginPresenterImpl(ILoginView loginView) {
this.mLoginView = loginView;
}
@Override
public void login() {
attemptLogin();
}
private void attemptLogin() {
if (mAuthTask != null) {
return;
}
// Reset errors.
mLoginView.setEmailError(null);
mLoginView.setPasswordError(null);
// Store values at the time of the login attempt.
String email = mLoginView.getEmail();
String password = mLoginView.getPassword();
boolean cancel = false;
int focusView = 0;
// Check for a valid password, if the user entered one.
if (!TextUtils.isEmpty(password) && !isPasswordValid(password)) {
mLoginView.setPasswordError(mLoginView.getStringFromResource(R.string.error_invalid_password));
focusView = 1;
cancel = true;
}
// Check for a valid email address.
if (TextUtils.isEmpty(email)) {
mLoginView.setEmailError(mLoginView.getStringFromResource(R.string.error_field_required));
focusView = 0;
cancel = true;
} else if (!isEmailValid(email)) {
mLoginView.setEmailError(mLoginView.getStringFromResource(R.string.error_invalid_email));
focusView = 0;
cancel = true;
}
if (cancel) {
// There was an error; don't attempt login and focus the first
// form field with an error.
if (focusView == 0) {
mLoginView.emailRequestFocus();
} else {
mLoginView.passwordRequestFocus();
}
} else {
// Show a progress spinner, and kick off a background task to
// perform the user login attempt.
mLoginView.showProgress(true);
mAuthTask = new UserLoginTask(email, password);
mAuthTask.execute((Void) null);
}
}
private boolean isEmailValid(String email) {
return email.contains("@");
}
private boolean isPasswordValid(String password) {
return password.length() > 4;
}
@Override
public Loader<Cursor> onCreateLoader(int i, Bundle bundle) {
return mLoginView.getCursorLoader();
}
private void addEmailsToAutoComplete(List<String> emailAddressCollection) {
mLoginView.addEmailsToAutoComplete(emailAddressCollection);
}
@Override
public void onLoadFinished(Loader<Cursor> cursorLoader, Cursor cursor) {
List<String> emails = new ArrayList<>();
cursor.moveToFirst();
while (!cursor.isAfterLast()) {
emails.add(cursor.getString(ProfileQuery.ADDRESS));
cursor.moveToNext();
}
addEmailsToAutoComplete(emails);
}
@Override
public void onLoaderReset(Loader<Cursor> cursorLoader) {
}
public interface ProfileQuery {
String[] PROJECTION = {
ContactsContract.CommonDataKinds.Email.ADDRESS,
ContactsContract.CommonDataKinds.Email.IS_PRIMARY,
};
int ADDRESS = 0;
int IS_PRIMARY = 1;
}
public class UserLoginTask extends AsyncTask<Void, Void, Boolean> {
private final String mEmail;
private final String mPassword;
UserLoginTask(String email, String password) {
mEmail = email;
mPassword = password;
}
@Override
protected Boolean doInBackground(Void... params) {
SystemClock.sleep(3000);
for (String credential : DUMMY_CREDENTIALS) {
String[] pieces = credential.split(":");
if (pieces[0].equals(mEmail)) {
// Account exists, return true if the password matches.
return pieces[1].equals(mPassword);
}
}
return true;
}
@Override
protected void onPostExecute(final Boolean success) {
mAuthTask = null;
mLoginView.showProgress(false);
if (success) {
mLoginView.loginSuccess();
} else {
mLoginView.setPasswordError(mLoginView.getStringFromResource(R.string.error_incorrect_password));
mLoginView.passwordRequestFocus();
}
}
@Override
protected void onCancelled() {
mAuthTask = null;
mLoginView.showProgress(false);
}
}
}