package com.gojira.ui;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.design.widget.Snackbar;
import android.support.design.widget.TextInputLayout;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import com.gojira.R;
import com.gojira.app.GojiraApp;
import com.gojira.data.api.JiraService;
import com.gojira.data.io.LoginResponse;
import com.gojira.data.model.Credentials;
import com.gojira.util.Preferences;
import com.gojira.util.ViewUtils;
import com.orhanobut.hawk.Hawk;
import javax.inject.Inject;
import butterknife.ButterKnife;
import butterknife.InjectView;
import butterknife.OnClick;
import butterknife.OnFocusChange;
import butterknife.OnTextChanged;
import retrofit.Callback;
import retrofit.RetrofitError;
import retrofit.client.Response;
import timber.log.Timber;
/**
* @author Stratos Theodorou
* @version 1.0
* @since 14/05/2015
*/
public class LoginActivity extends BaseActivity implements Callback<LoginResponse> {
@Inject
JiraService mService;
@InjectView(R.id.root)
View mRoot;
@InjectView(R.id.input_server)
EditText mInputServer;
@InjectView(R.id.input_username)
EditText mInputUsername;
@InjectView(R.id.input_password)
EditText mInputPassword;
@InjectView(R.id.action_login)
Button mButtonLogin;
@InjectView(R.id.input_server_container)
TextInputLayout mServerContainer;
@InjectView(R.id.input_username_container)
TextInputLayout mUsernameContainer;
@InjectView(R.id.input_password_container)
TextInputLayout mPasswordContainer;
@InjectView(R.id.progress)
ProgressBar mProgressBar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
GojiraApp.get(this).getGraph().inject(this);
setContentView(R.layout.activity_login);
ButterKnife.inject(this);
setInputEnabled(true);
}
@OnClick(R.id.action_login)
void onLogin() {
// Read user input
String server = mInputServer.getText().toString();
String username = mInputUsername.getText().toString();
String password = mInputPassword.getText().toString();
// Validate user input
if (!TextUtils.isEmpty(server) && !TextUtils.isEmpty(username) && !TextUtils.isEmpty(password)) {
// Attempt to login
tryLogin(server, username, password);
} else {
// TODO Consider a more sophisticated validation
mServerContainer.setError(TextUtils.isEmpty(server) ? getString(R.string.error_server) : null);
mUsernameContainer.setError(TextUtils.isEmpty(username) ? getString(R.string.error_username) : null);
mPasswordContainer.setError(TextUtils.isEmpty(password) ? getString(R.string.error_password) : null);
}
}
void tryLogin(String server, String username, String password) {
// Show progress bar
mProgressBar.setVisibility(View.VISIBLE);
// Hide keyboard
ViewUtils.hideKeyboard(mInputPassword);
// Disable user input
setInputEnabled(false);
// Save server url for use by endpoints
Hawk.put(Preferences.KEY_SERVER, server);
// Perform login with credentials
Credentials credentials = new Credentials(username, password);
mService.login(credentials, this);
}
@Override
public void success(LoginResponse loginResponse, Response response) {
Timber.i("Success: %s", loginResponse.session.name);
// Hide progress bar
mProgressBar.setVisibility(View.INVISIBLE);
// Save credentials for later use
String server = mInputServer.getText().toString();
String username = mInputUsername.getText().toString();
String password = mInputPassword.getText().toString();
// Save server and credentials
Hawk.chain()
.put(Preferences.KEY_SERVER, server)
.put(Preferences.KEY_USERNAME, username)
.put(Preferences.KEY_PASSWORD, password)
.commit();
// Start main app flow
startActivity(new Intent(this, MainActivity.class));
finish();
}
@Override
public void failure(RetrofitError error) {
Timber.w(error, "Failure [kind=%s]", error.getKind());
// Hide progress bar
mProgressBar.setVisibility(View.INVISIBLE);
// Re-enable input
setInputEnabled(true);
// Remove store credentials and server
Hawk.clear();
// Alert user
int message = error.getKind() == RetrofitError.Kind.NETWORK ?
R.string.error_network : R.string.error_login;
Snackbar.make(mRoot, message, Snackbar.LENGTH_LONG).show();
}
@OnTextChanged(R.id.input_server)
void onServerTextChanged(CharSequence text) {
mServerContainer.setError(null);
}
@OnTextChanged(R.id.input_username)
void onUsernameTextChanged(CharSequence text) {
mUsernameContainer.setError(null);
}
@OnTextChanged(R.id.input_password)
void onPasswordTextChanged(CharSequence text) {
mPasswordContainer.setError(null);
}
@OnFocusChange(R.id.input_server)
void onServerInputFocusChanged(boolean focused) {
// Sanitize server url when focus is lost
if (!focused) {
String server = mInputServer.getText().toString();
// There's not much you can do on an empty string
if (TextUtils.isEmpty(server)) {
return;
}
Uri uri = Uri.parse(server);
// Add http scheme if not present in url
if (TextUtils.isEmpty(uri.getScheme())) {
server = "http://" + server;
}
// Add default port if not present in url
if (uri.getPort() == -1) {
server = server + ":8080";
}
mInputServer.setText(server);
}
}
void setInputEnabled(boolean enabled) {
mInputServer.setEnabled(enabled);
mInputUsername.setEnabled(enabled);
mInputPassword.setEnabled(enabled);
mButtonLogin.setEnabled(enabled);
}
}