package io.evercam.connect.signin; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.annotation.TargetApi; import android.app.ActionBar; import android.app.Activity; import android.content.Intent; import android.content.SharedPreferences; import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; import android.preference.PreferenceManager; import android.text.SpannableString; import android.text.TextUtils; import android.text.style.UnderlineSpan; import android.view.Gravity; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; import io.evercam.API; import io.evercam.ApiKeyPair; import io.evercam.EvercamException; import io.evercam.User; import io.evercam.connect.EvercamDiscover; import io.evercam.connect.R; import io.evercam.connect.helper.Constants; import io.evercam.connect.helper.SharedPrefsManager; public class LoginActivity extends Activity { private final String TAG = "LoginActivity"; private View loginFormView; private View loginStatusView; private EditText usernameEdit; private EditText passwordEdit; private String username; private String password; LinearLayout loginLayout; LinearLayout confirmLayout; private UserLoginTask loginTask = null; private SharedPreferences sharedPrefs; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); sharedPrefs = PreferenceManager.getDefaultSharedPreferences(LoginActivity.this); SharedPrefsManager.clearAllUserInfo(sharedPrefs); EvercamDiscover.sendScreenAnalytics(this, getString(R.string.screen_login)); ActionBar actionBar = getActionBar(); actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD); actionBar.setDisplayHomeAsUpEnabled(true); loginLayout = (LinearLayout) findViewById(R.id.login_layout); confirmLayout = (LinearLayout) findViewById(R.id.confirm_layout); loginFormView = findViewById(R.id.login_form_relativelayout); loginStatusView = findViewById(R.id.login_status); usernameEdit = (EditText) findViewById(R.id.loginUsername); passwordEdit = (EditText) findViewById(R.id.loginPassword); Button btnEvercamSignIn = (Button) findViewById(R.id.signInEvercamBtn); TextView signUpLink = (TextView) findViewById(R.id.signupLink); SpannableString spanString = new SpannableString(this.getResources().getString(R.string.create_account)); spanString.setSpan(new UnderlineSpan(), 0, spanString.length(), 0); signUpLink.setText(spanString); signUpLink.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent signUpIntent = new Intent(LoginActivity.this, SignUpActivity.class); startActivityForResult(signUpIntent, Constants.REQUEST_CODE_SIGN_UP); } }); btnEvercamSignIn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { attemptLogin(); } }); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if(requestCode == Constants.REQUEST_CODE_SIGN_UP) { if(resultCode == Constants.RESULT_TRUE) { setResult(Constants.RESULT_TRUE); finish(); } } } public void attemptLogin() { if(loginTask != null) { return; } usernameEdit.setError(null); passwordEdit.setError(null); username = usernameEdit.getText().toString(); password = passwordEdit.getText().toString(); boolean cancel = false; View focusView = null; if(TextUtils.isEmpty(password)) { passwordEdit.setError(getString(R.string.error_field_required)); focusView = passwordEdit; cancel = true; } else if(password.contains(" ")) { passwordEdit.setError(getString(R.string.error_invalid_password)); focusView = passwordEdit; cancel = true; } if(TextUtils.isEmpty(username)) { usernameEdit.setError(getString(R.string.error_field_required)); focusView = usernameEdit; cancel = true; } else if(username.contains(" ")) { usernameEdit.setError(getString(R.string.error_invalid_username)); focusView = usernameEdit; cancel = true; } if(cancel) { focusView.requestFocus(); } else { showProgress(true); loginTask = new UserLoginTask(); loginTask.execute((Void) null); } } @TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2) private void showProgress(final boolean show) { if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) { int shortAnimTime = getResources().getInteger(android.R.integer.config_shortAnimTime); loginStatusView.setVisibility(View.VISIBLE); loginStatusView.animate().setDuration(shortAnimTime).alpha(show ? 1 : 0).setListener (new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { loginStatusView.setVisibility(show ? View.VISIBLE : View.GONE); } }); loginFormView.setVisibility(View.VISIBLE); loginFormView.animate().setDuration(shortAnimTime).alpha(show ? 0 : 1).setListener (new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { loginFormView.setVisibility(show ? View.GONE : View.VISIBLE); } }); } else { loginStatusView.setVisibility(show ? View.VISIBLE : View.GONE); loginFormView.setVisibility(show ? View.GONE : View.VISIBLE); } } @Override public Intent getParentActivityIntent() { this.finish(); return super.getParentActivityIntent(); } public class UserLoginTask extends AsyncTask<Void, Void, Boolean> { String errorMessage = "Error"; @Override protected Boolean doInBackground(Void... params) { try { ApiKeyPair userKeyPair = API.requestUserKeyPairFromEvercam(username, password); String userApiKey = userKeyPair.getApiKey(); String userApiId = userKeyPair.getApiId(); SharedPrefsManager.saveEvercamUserKeyPair(sharedPrefs, userApiKey, userApiId); API.setUserKeyPair(userApiKey, userApiId); User evercamUser = new User(username); SharedPrefsManager.saveEvercamCredential(sharedPrefs, evercamUser, password); return true; } catch(EvercamException e) { errorMessage = e.getMessage(); } return false; } @Override protected void onPostExecute(final Boolean success) { loginTask = null; if(success) { setResult(Constants.RESULT_TRUE); finish(); } else { showProgress(false); Toast toast = Toast.makeText(getApplicationContext(), errorMessage, Toast.LENGTH_SHORT); toast.setGravity(Gravity.CENTER, 0, 0); toast.show(); passwordEdit.setText(null); } } @Override protected void onCancelled() { loginTask = null; showProgress(false); } } public static boolean isUserLogged(SharedPreferences sharedPrefs) { String savedUsername = sharedPrefs.getString(Constants.EVERCAM_USERNAME, null); if(savedUsername != null) { return true; } return false; } }