Tuesday, March 8, 2016

109-Android Studio 1.5 Login Activity Template


.
109-Android Studio 1.5 Login Activity Template

Continue from Tutorial 108

1) Create New Project

1.1) Configure New Project

Application Name: MyLogin1
Company Domain: notarazi.com
Package Name: com.notarazi.mylogin1 (auto-generated)
Project Location: C:\Project1\MyLogin1\ (auto-generated)

1.2) Select Target Device

1.3) Add Activity

Select Fullscreen Activity.

1.4) Customize The Activity

Accept defaults.

2) Observe the project codes

2.1) MainActivity.java

package com.notarazi.mylogin1;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.annotation.TargetApi;
import android.content.pm.PackageManager;
import android.support.annotation.NonNull;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.app.LoaderManager.LoaderCallbacks;
import android.content.CursorLoader;
import android.content.Loader;
import android.database.Cursor;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.provider.ContactsContract;
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.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
import static android.Manifest.permission.READ_CONTACTS;
/**
* A login screen that offers login via email/password.
*/
public class LoginActivity extends AppCompatActivity implementsLoaderCallbacks<Cursor> {
   /**
    * 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;
   private View mProgressView;
   private View mLoginFormView;
   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_login);
       // Set up the login form.
       mEmailView = (AutoCompleteTextView) findViewById(R.id.email);
       populateAutoComplete();
       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;
           }
       });
       Button mEmailSignInButton = (Button) findViewById(R.id.email_sign_in_button);
       mEmailSignInButton.setOnClickListener(new OnClickListener() {
           @Override
           public void onClick(View view) {
               attemptLogin();
           }
       });
       mLoginFormView = findViewById(R.id.login_form);
       mProgressView = findViewById(R.id.login_progress);
   }
   private void populateAutoComplete() {
       if (!mayRequestContacts()) {
           return;
       }
       getLoaderManager().initLoader(0nullthis);
   }
   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.oknew 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 == && 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 ? 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 ? 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<>(LoginActivity.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) {
               Toast.makeText(getApplicationContext(), "Success", Toast.LENGTH_LONG).show();
               //finish();
           else {
               mPasswordView.setError(getString(R.string.error_incorrect_password));
               mPasswordView.requestFocus();
           }
       }
       @Override
       protected void onCancelled() {
           mAuthTask null;
           showProgress(false);
       }
   }
}

2.2) res/layout/activity_login.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:gravity="center_horizontal"
   android:orientation="vertical"
   android:paddingBottom="@dimen/activity_vertical_margin"
   android:paddingLeft="@dimen/activity_horizontal_margin"
   android:paddingRight="@dimen/activity_horizontal_margin"
   android:paddingTop="@dimen/activity_vertical_margin"
   tools:context="com.notarazi.mylogin1.LoginActivity">
   <!-- Login progress -->
   <ProgressBar
       android:id="@+id/login_progress"
       style="?android:attr/progressBarStyleLarge"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_marginBottom="8dp"
       android:visibility="gone" />
   <ScrollView
       android:id="@+id/login_form"
       android:layout_width="match_parent"
       android:layout_height="match_parent">
       <LinearLayout
           android:id="@+id/email_login_form"
           android:layout_width="match_parent"
           android:layout_height="wrap_content"
           android:orientation="vertical">
           <android.support.design.widget.TextInputLayout
               android:layout_width="match_parent"
               android:layout_height="wrap_content">
               <AutoCompleteTextView
                   android:id="@+id/email"
                   android:layout_width="match_parent"
                   android:layout_height="wrap_content"
                   android:hint="@string/prompt_email"
                   android:inputType="textEmailAddress"
                   android:maxLines="1"
                   android:singleLine="true" />
           </android.support.design.widget.TextInputLayout>
           <android.support.design.widget.TextInputLayout
               android:layout_width="match_parent"
               android:layout_height="wrap_content">
               <EditText
                   android:id="@+id/password"
                   android:layout_width="match_parent"
                   android:layout_height="wrap_content"
                   android:hint="@string/prompt_password"
                   android:imeActionId="@+id/login"
                   android:imeActionLabel="@string/action_sign_in_short"
                   android:imeOptions="actionUnspecified"
                   android:inputType="textPassword"
                   android:maxLines="1"
                   android:singleLine="true" />
           </android.support.design.widget.TextInputLayout>
           <Button
               android:id="@+id/email_sign_in_button"
               style="?android:textAppearanceSmall"
               android:layout_width="match_parent"
               android:layout_height="wrap_content"
               android:layout_marginTop="16dp"
               android:text="@string/action_sign_in"
               android:textStyle="bold" />
       </LinearLayout>
   </ScrollView>
</LinearLayout>

DOWNLOAD

No comments:

Post a Comment