
| -package com.avigator.avigator.activity; | |
| - | |
| -import android.animation.Animator; | |
| -import android.animation.AnimatorListenerAdapter; | |
| -import android.annotation.TargetApi; | |
| -import android.content.Intent; | |
| -import android.content.pm.PackageManager; | |
| -import android.os.AsyncTask; | |
| -import android.os.Build; | |
| -import android.os.Bundle; | |
| -import android.provider.ContactsContract; | |
| -import android.support.annotation.NonNull; | |
| -import android.support.design.widget.Snackbar; | |
| -import android.support.v7.app.AppCompatActivity; | |
| -import android.support.v7.widget.Toolbar; | |
| -import android.text.TextUtils; | |
| -import android.view.KeyEvent; | |
| -import android.view.View; | |
| -import android.view.View.OnClickListener; | |
| -import android.view.inputmethod.EditorInfo; | |
| -import android.widget.Button; | |
| -import android.widget.EditText; | |
| -import android.widget.TextView; | |
| - | |
| -import com.avigator.avigator.R; | |
| - | |
| -import static android.Manifest.permission.READ_CONTACTS; | |
| - | |
| -/** | |
| - * A login screen that offers login via email/password. | |
| - */ | |
| -public class CoordinatesActivity extends AppCompatActivity { | |
| - | |
| - /** | |
| - * Id to identity READ_CONTACTS permission request. | |
| - */ | |
| - private static final int REQUEST_READ_CONTACTS = 0; | |
| - | |
| - /** | |
| - * 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[]{ | |
| - "foo@example.com:hello", "bar@example.com:world" | |
| - }; | |
| - /** | |
| - * Keep track of the login task to ensure we can cancel it if requested. | |
| - */ | |
| - private UserLoginTask mAuthTask = null; | |
| - | |
| - // UI references. | |
| -// private AutoCompleteTextView mEmailView; | |
| - private EditText mPasswordView, mEmailView; | |
| - private View mProgressView; | |
| - private View mLoginFormView; | |
| - | |
| - @Override | |
| - protected void onCreate(Bundle savedInstanceState) { | |
| - super.onCreate(savedInstanceState); | |
| - setContentView(R.layout.activity_coordinates); | |
| - Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); | |
| - setSupportActionBar(toolbar); | |
| - // Set up the login form. | |
| - mEmailView = (EditText) findViewById(R.id.departure); | |
| - populateAutoComplete(); | |
| - | |
| - mPasswordView = (EditText) findViewById(R.id.arrival); | |
| - 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; | |
| - } | |
| - }); | |
| - | |
| - Button mEmailSignInButton = (Button) findViewById(R.id.avigate); | |
| - mEmailSignInButton.setOnClickListener(new OnClickListener() { | |
| - @Override | |
| - public void onClick(View view) { | |
| -// attemptLogin(); | |
| - Intent intent = new Intent(getApplicationContext(), MapsActivity.class); | |
| - startActivity(intent); | |
| - } | |
| - }); | |
| - | |
| -// mLoginFormView = findViewById(R.id.login_form); | |
| -// mProgressView = findViewById(R.id.login_progress); | |
| - } | |
| - | |
| - private void populateAutoComplete() { | |
| - if (!mayRequestContacts()) { | |
| - return; | |
| - } | |
| - | |
| -// getLoaderManager().initLoader(0, null, this); | |
| - } | |
| - | |
| - private boolean mayRequestContacts() { | |
| - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { | |
| - return true; | |
| - } | |
| - if (checkSelfPermission(READ_CONTACTS) == PackageManager.PERMISSION_GRANTED) { | |
| - return true; | |
| - } | |
| - if (shouldShowRequestPermissionRationale(READ_CONTACTS)) { | |
| - Snackbar.make(mEmailView, R.string.permission_rationale, Snackbar.LENGTH_INDEFINITE) | |
| - .setAction(android.R.string.ok, new View.OnClickListener() { | |
| - @Override | |
| - @TargetApi(Build.VERSION_CODES.M) | |
| - public void onClick(View v) { | |
| - requestPermissions(new String[]{READ_CONTACTS}, REQUEST_READ_CONTACTS); | |
| - } | |
| - }); | |
| - } else { | |
| - requestPermissions(new String[]{READ_CONTACTS}, REQUEST_READ_CONTACTS); | |
| - } | |
| - return false; | |
| - } | |
| - | |
| - /** | |
| - * Callback received when a permissions request has been completed. | |
| - */ | |
| - @Override | |
| - public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, | |
| - @NonNull int[] grantResults) { | |
| - if (requestCode == REQUEST_READ_CONTACTS) { | |
| - if (grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { | |
| - populateAutoComplete(); | |
| - } | |
| - } | |
| - } | |
| - | |
| - | |
| - /** | |
| - * 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. | |
| - */ | |
| - private void attemptLogin() { | |
| - if (mAuthTask != null) { | |
| - return; | |
| - } | |
| - | |
| - // 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 { | |
| - // Show a progress spinner, and kick off a background task to | |
| - // perform the user login attempt. | |
| - showProgress(true); | |
| - mAuthTask = new UserLoginTask(email, password); | |
| - mAuthTask.execute((Void) null); | |
| - } | |
| - } | |
| - | |
| - private boolean isEmailValid(String email) { | |
| - //TODO: Replace this with your own logic | |
| - return email.contains("@"); | |
| - } | |
| - | |
| - private boolean isPasswordValid(String password) { | |
| - //TODO: Replace this with your own logic | |
| - return password.length() > 4; | |
| - } | |
| - | |
| - /** | |
| - * 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); | |
| - | |
| - mLoginFormView.setVisibility(show ? View.GONE : 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); | |
| - } | |
| - }); | |
| - | |
| - mProgressView.setVisibility(show ? View.VISIBLE : View.GONE); | |
| - mProgressView.animate().setDuration(shortAnimTime).alpha( | |
| - show ? 1 : 0).setListener(new AnimatorListenerAdapter() { | |
| - @Override | |
| - public void onAnimationEnd(Animator animation) { | |
| - mProgressView.setVisibility(show ? View.VISIBLE : View.GONE); | |
| - } | |
| - }); | |
| - } else { | |
| - // The ViewPropertyAnimator APIs are not available, so simply show | |
| - // and hide the relevant UI components. | |
| - mProgressView.setVisibility(show ? View.VISIBLE : View.GONE); | |
| - mLoginFormView.setVisibility(show ? View.GONE : View.VISIBLE); | |
| - } | |
| - } | |
| - | |
| -// @Override | |
| -// public Loader<Cursor> onCreateLoader(int i, Bundle bundle) { | |
| -// return new CursorLoader(this, | |
| -// // Retrieve data rows for the device user's 'profile' contact. | |
| -// Uri.withAppendedPath(ContactsContract.Profile.CONTENT_URI, | |
| -// ContactsContract.Contacts.Data.CONTENT_DIRECTORY), ProfileQuery.PROJECTION, | |
| -// | |
| -// // Select only email addresses. | |
| -// ContactsContract.Contacts.Data.MIMETYPE + | |
| -// " = ?", new String[]{ContactsContract.CommonDataKinds.Email | |
| -// .CONTENT_ITEM_TYPE}, | |
| -// | |
| -// // Show primary email addresses first. Note that there won't be | |
| -// // a primary email address if the user hasn't specified one. | |
| -// ContactsContract.Contacts.Data.IS_PRIMARY + " DESC"); | |
| -// } | |
| - | |
| -// @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) { | |
| -// | |
| -// } | |
| - | |
| -// private void addEmailsToAutoComplete(List<String> emailAddressCollection) { | |
| -// //Create adapter to tell the AutoCompleteTextView what to show in its dropdown list. | |
| -// ArrayAdapter<String> adapter = | |
| -// new ArrayAdapter<>(CoordinatesActivity.this, | |
| -// android.R.layout.simple_dropdown_item_1line, emailAddressCollection); | |
| -// | |
| -// mEmailView.setAdapter(adapter); | |
| -// } | |
| - | |
| - | |
| - private interface ProfileQuery { | |
| - String[] PROJECTION = { | |
| - ContactsContract.CommonDataKinds.Email.ADDRESS, | |
| - ContactsContract.CommonDataKinds.Email.IS_PRIMARY, | |
| - }; | |
| - | |
| - int ADDRESS = 0; | |
| - int IS_PRIMARY = 1; | |
| - } | |
| - | |
| - /** | |
| - * Represents an asynchronous login/registration task used to authenticate | |
| - * the user. | |
| - */ | |
| - 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) { | |
| - // 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); | |
| - } | |
| - } | |
| -} | |
| - |
SpaceApps is a NASA incubator innovation program.