package org.onebrick.android.activities;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.text.method.LinkMovementMethod;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import org.onebrick.android.R;
import org.onebrick.android.core.OneBrickApplication;
import org.onebrick.android.core.OneBrickCrypt;
import org.onebrick.android.core.OneBrickRESTClient;
import org.onebrick.android.events.LoginStatusEvent;
import org.onebrick.android.events.Status;
import org.onebrick.android.helpers.LoginManager;
import butterknife.Bind;
import butterknife.ButterKnife;
import retrofit.Callback;
import retrofit.RetrofitError;
import retrofit.client.Response;
public class LoginActivity extends AppCompatActivity {
private static final String TAG = LoginActivity.class.getSimpleName();
// UI references.
@Bind(R.id.email)
EditText mEmailView;
@Bind(R.id.password)
EditText mPasswordView;
@Bind(R.id.email_sign_in_button)
Button mEmailSignInButton;
@Bind(R.id.signup)
TextView mSignUp;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
ButterKnife.bind(this);
// add a join click link. adding attributes in xml didn't work so..
mSignUp.setMovementMethod(LinkMovementMethod.getInstance());
mEmailSignInButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String email = mEmailView.getText().toString();
String password = mPasswordView.getText().toString();
if (email.length() == 0
|| email.equalsIgnoreCase("")
|| !email.contains("@")
|| password.length() == 0
|| password.equalsIgnoreCase("")) {
Toast.makeText(getApplicationContext(),
R.string.error_login_general,
Toast.LENGTH_SHORT).show();
} else {
attemptLogin();
}
}
});
}
/**
* Attempts to sign in or register the account specified by the login form.
* If there are form errors (invalid email, missing fields, etc.), the
* errors are presented and no actual login attempt is made.
*/
public void attemptLogin() {
// Reset errors.
mEmailView.setError(null);
mPasswordView.setError(null);
// Store values at the time of the login attempt.
String email = mEmailView.getText().toString();
String password = mPasswordView.getText().toString();
boolean cancel = false;
View focusView = null;
// Check for a valid password, if the user entered one.
if (!TextUtils.isEmpty(password) && !isPasswordValid(password)) {
mPasswordView.setError(getString(R.string.error_invalid_password));
focusView = mPasswordView;
cancel = true;
}
// Check for a valid email address.
if (TextUtils.isEmpty(email)) {
mEmailView.setError(getString(R.string.error_field_required));
focusView = mEmailView;
cancel = true;
} else if (!isEmailValid(email)) {
mEmailView.setError(getString(R.string.error_invalid_email));
focusView = mEmailView;
cancel = true;
}
if (cancel) {
// There was an error; don't attempt login and focus the first
// form field with an error.
focusView.requestFocus();
} else {
getAuthentication(email.trim(), password);
}
}
private void getAuthentication(@NonNull String username, @NonNull String password) {
byte[] encrypt = null;
try {
Log.d(TAG, "getAuthenticated: user provided username and password: " + username + " -- " + password);
encrypt = OneBrickCrypt.encrypt(username, password);
} catch (Exception e) {
Log.e(TAG, "can't get an encrypted key", e);
}
final String finalEncrypted = OneBrickCrypt.bytesToHex(encrypt);
OneBrickRESTClient.getInstance().verifyLogin(finalEncrypted, new Callback<String[]>() {
@Override
public void success(String[] strings, Response response) {
if (strings != null && strings.length > 0) {
try{
// as long as return value is number, it's valid.
long userId = Long.parseLong(strings[0]);
// successful
LoginManager manager = LoginManager.getInstance(LoginActivity.this);
manager.setCurrentUserKey(finalEncrypted);
OneBrickApplication.getInstance().getBus().post(
new LoginStatusEvent(Status.SUCCESS));
updateMyEvents();
finish();
} catch (NumberFormatException e) {
Log.e(TAG, "login failed due to invalid key.");
OneBrickApplication.getInstance().getBus().post(
new LoginStatusEvent(Status.FAILED));
Toast.makeText(getApplicationContext(),
R.string.error_invalid_credentials,
Toast.LENGTH_SHORT).show();
}
} else {
OneBrickApplication.getInstance().getBus().post(
new LoginStatusEvent(Status.FAILED));
Log.d(TAG, "invalid json response");
}
}
@Override
public void failure(RetrofitError error) {
OneBrickApplication.getInstance().getBus().post(
new LoginStatusEvent(Status.FAILED));
Log.e(TAG, "login failure: " + error.toString());
}
});
}
/*
After the user has logged in, this method is called to update the event table
on the users rsvp events
*/
private void updateMyEvents() {
Log.d(TAG, "update my events.");
}
private boolean isPasswordValid(String password) {
return password.length() > 4;
}
private boolean isEmailValid(String email) {
return email.contains("@");
}
}