-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
1aa25ca
commit 4b2ad8f
Showing
18 changed files
with
680 additions
and
32 deletions.
There are no files selected for viewing
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
256 changes: 256 additions & 0 deletions
256
katana/src/main/java/org/techniche/technothlon/katana/LoginActivity.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,256 @@ | ||
package org.techniche.technothlon.katana; | ||
|
||
import android.accounts.AccountManager; | ||
import android.animation.Animator; | ||
import android.animation.AnimatorListenerAdapter; | ||
import android.annotation.TargetApi; | ||
import android.app.Activity; | ||
import android.os.AsyncTask; | ||
import android.os.Build; | ||
import android.os.Bundle; | ||
import android.text.TextUtils; | ||
import android.view.KeyEvent; | ||
import android.view.Menu; | ||
import android.view.View; | ||
import android.view.inputmethod.EditorInfo; | ||
import android.widget.EditText; | ||
import android.widget.TextView; | ||
|
||
/** | ||
* Activity which displays a login screen to the user, offering registration as | ||
* well. | ||
*/ | ||
public class LoginActivity extends Activity { | ||
public static final String ARG_ACCOUNT_TYPE = "accountType"; | ||
public static final String ARG_AUTH_TYPE = "authType"; | ||
public static final String ARG_ADDING_NEW_ACCOUNT = "newAccount"; | ||
public static final String ARG_ACCOUNT_NAME = "accountName"; | ||
public static final String KEY_ACCOUNT_AUTHENTICATOR_RESPONSE = "authResponse"; | ||
public static final String KEY_ERROR_MESSAGE = "ERR_MSG"; | ||
|
||
public final static String PARAM_USER_PASS = "USER_PASS"; | ||
|
||
private final int REQ_SIGNUP = 1; | ||
|
||
private final String TAG = this.getClass().getSimpleName(); | ||
|
||
private AccountManager mAccountManager; | ||
private String mAuthTokenType; | ||
/** | ||
* A dummy authentication store containing known user names and passwords. | ||
* TODO: remove after connecting to a real authentication system. | ||
*/ | ||
private static final String[] DUMMY_CREDENTIALS = new String[]{ | ||
"[email protected]:hello", | ||
"[email protected]:world" | ||
}; | ||
|
||
/** | ||
* The default email to populate the email field with. | ||
*/ | ||
public static final String EXTRA_EMAIL = "com.example.android.authenticatordemo.extra.EMAIL"; | ||
|
||
/** | ||
* Keep track of the login task to ensure we can cancel it if requested. | ||
*/ | ||
private UserLoginTask mAuthTask = null; | ||
|
||
// Values for email and password at the time of the login attempt. | ||
private String mEmail; | ||
private String mPassword; | ||
|
||
// UI references. | ||
private EditText mEmailView; | ||
private EditText mPasswordView; | ||
private View mLoginFormView; | ||
private View mLoginStatusView; | ||
private TextView mLoginStatusMessageView; | ||
|
||
@Override | ||
protected void onCreate(Bundle savedInstanceState) { | ||
super.onCreate(savedInstanceState); | ||
|
||
setContentView(R.layout.activity_login); | ||
|
||
// Set up the login form. | ||
mEmail = getIntent().getStringExtra(EXTRA_EMAIL); | ||
mEmailView = (EditText) findViewById(R.id.email); | ||
mEmailView.setText(mEmail); | ||
|
||
mPasswordView = (EditText) findViewById(R.id.password); | ||
mPasswordView.setOnEditorActionListener(new TextView.OnEditorActionListener() { | ||
@Override | ||
public boolean onEditorAction(TextView textView, int id, KeyEvent keyEvent) { | ||
if (id == R.id.login || id == EditorInfo.IME_NULL) { | ||
attemptLogin(); | ||
return true; | ||
} | ||
return false; | ||
} | ||
}); | ||
|
||
mLoginFormView = findViewById(R.id.login_form); | ||
mLoginStatusView = findViewById(R.id.login_status); | ||
mLoginStatusMessageView = (TextView) findViewById(R.id.login_status_message); | ||
|
||
findViewById(R.id.sign_in_button).setOnClickListener(new View.OnClickListener() { | ||
@Override | ||
public void onClick(View view) { | ||
attemptLogin(); | ||
} | ||
}); | ||
} | ||
|
||
|
||
@Override | ||
public boolean onCreateOptionsMenu(Menu menu) { | ||
super.onCreateOptionsMenu(menu); | ||
getMenuInflater().inflate(R.menu.login, menu); | ||
return true; | ||
} | ||
|
||
/** | ||
* 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() { | ||
if (mAuthTask != null) { | ||
return; | ||
} | ||
|
||
// Reset errors. | ||
mEmailView.setError(null); | ||
mPasswordView.setError(null); | ||
|
||
// Store values at the time of the login attempt. | ||
mEmail = mEmailView.getText().toString(); | ||
mPassword = mPasswordView.getText().toString(); | ||
|
||
boolean cancel = false; | ||
View focusView = null; | ||
|
||
// Check for a valid password. | ||
if (TextUtils.isEmpty(mPassword)) { | ||
mPasswordView.setError(getString(R.string.error_field_required)); | ||
focusView = mPasswordView; | ||
cancel = true; | ||
} else if (mPassword.length() < 4) { | ||
mPasswordView.setError(getString(R.string.error_invalid_password)); | ||
focusView = mPasswordView; | ||
cancel = true; | ||
} | ||
|
||
// Check for a valid email address. | ||
if (TextUtils.isEmpty(mEmail)) { | ||
mEmailView.setError(getString(R.string.error_field_required)); | ||
focusView = mEmailView; | ||
cancel = true; | ||
} else if (!mEmail.contains("@")) { | ||
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 { | ||
// Show a progress spinner, and kick off a background task to | ||
// perform the user login attempt. | ||
mLoginStatusMessageView.setText(R.string.login_progress_signing_in); | ||
showProgress(true); | ||
mAuthTask = new UserLoginTask(); | ||
mAuthTask.execute((Void) null); | ||
} | ||
} | ||
|
||
/** | ||
* Shows the progress UI and hides the login form. | ||
*/ | ||
@TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2) | ||
private void showProgress(final boolean show) { | ||
// On Honeycomb MR2 we have the ViewPropertyAnimator APIs, which allow | ||
// for very easy animations. If available, use these APIs to fade-in | ||
// the progress spinner. | ||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) { | ||
int shortAnimTime = getResources().getInteger(android.R.integer.config_shortAnimTime); | ||
|
||
mLoginStatusView.setVisibility(View.VISIBLE); | ||
mLoginStatusView.animate() | ||
.setDuration(shortAnimTime) | ||
.alpha(show ? 1 : 0) | ||
.setListener(new AnimatorListenerAdapter() { | ||
@Override | ||
public void onAnimationEnd(Animator animation) { | ||
mLoginStatusView.setVisibility(show ? View.VISIBLE : View.GONE); | ||
} | ||
}); | ||
|
||
mLoginFormView.setVisibility(View.VISIBLE); | ||
mLoginFormView.animate() | ||
.setDuration(shortAnimTime) | ||
.alpha(show ? 0 : 1) | ||
.setListener(new AnimatorListenerAdapter() { | ||
@Override | ||
public void onAnimationEnd(Animator animation) { | ||
mLoginFormView.setVisibility(show ? View.GONE : View.VISIBLE); | ||
} | ||
}); | ||
} else { | ||
// The ViewPropertyAnimator APIs are not available, so simply show | ||
// and hide the relevant UI components. | ||
mLoginStatusView.setVisibility(show ? View.VISIBLE : View.GONE); | ||
mLoginFormView.setVisibility(show ? View.GONE : View.VISIBLE); | ||
} | ||
} | ||
|
||
/** | ||
* Represents an asynchronous login/registration task used to authenticate | ||
* the user. | ||
*/ | ||
public class UserLoginTask extends AsyncTask<Void, Void, Boolean> { | ||
@Override | ||
protected Boolean doInBackground(Void... params) { | ||
// TODO: attempt authentication against a network service. | ||
|
||
try { | ||
// Simulate network access. | ||
Thread.sleep(2000); | ||
} catch (InterruptedException e) { | ||
return false; | ||
} | ||
|
||
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); | ||
} | ||
} | ||
|
||
// TODO: register the new account here. | ||
return true; | ||
} | ||
|
||
@Override | ||
protected void onPostExecute(final Boolean success) { | ||
mAuthTask = null; | ||
showProgress(false); | ||
|
||
if (success) { | ||
finish(); | ||
} else { | ||
mPasswordView.setError(getString(R.string.error_incorrect_password)); | ||
mPasswordView.requestFocus(); | ||
} | ||
} | ||
|
||
@Override | ||
protected void onCancelled() { | ||
mAuthTask = null; | ||
showProgress(false); | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.