Published using Google Docs
109-Android Studio 1.5 Login Activity Template
Updated automatically every 5 minutes

109-Android Studio 1.5 Login Activity Template

1) Create New Project

1.1) Configure New Project

1.2) Select Target Device

1.3) Add Activity

1.4) Customize The Activity

2) Observe the project codes

2.1) MainActivity.java

2.2) res/layout/activity_login.xml

DOWNLOAD

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 implements LoaderCallbacks<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(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<>(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

109-MyLogin1.zip

VARIATION:

http://javapapers.com/android/beautiful-android-login-screen-design-tutorial/ 

VARIATION: http://sourcey.com/beautiful-android-login-and-signup-screens-with-material-design/ 

VARIATION:

https://developers.google.com/identity/sign-in/android/start 

https://github.com/googlesamples/google-services 

VARIATION:

https://www.simplifiedcoding.net/google-login-android-tutorial-integrate-gplus-login/ 

VARIATION:

http://www.sitepoint.com/authentication-and-sharing-in-android-with-the-google-api/ 

VARIATION:

http://blog.nkdroidsolutions.com/android-facebook-login-example-v4/ 

VARIATION:

http://www.sitepoint.com/integrating-the-facebook-api-with-android/ 

VARIATION:

http://stackoverflow.com/questions/22209046/fix-android-studio-login-activity-template-generated-activity 

VARIATION:

https://www.simplifiedcoding.net/android-studio-volley-tutorial-to-create-a-login-application/ 

VARIATION: http://www.hackpundit.com/simple-login-android-app/ 

VARIATION:

http://www.androidhive.info/2012/01/android-login-and-registration-with-php-mysql-and-sqlite/