Android Studio Login Activity Template Tutorial

Pre-defined Login activity in Android Studio


In this article, we are going to learn
how to create and use a pre-defined login activity in Android Studio?

Submitted by Manu Jemini, on January 23, 2022

Login Activity
is one of the most common things which most of the application have is Login Activity. To have a Login Activity in your android studio project is very simple.

To Implement
login Activity
you need to create or open an android studio project, give it a name and press Next to configuration panel. After configuration, you just need to choose Login Activity and again press next. In the last choose the name for the name of your activity and press FINISH.

1) Create a new project and give it a name of your choice and press Next.

Android Login Acticity 0

2) Now you will be asked about some other configuration for your project, which is common for any type of activity. Choose your targeted SDK version and hit Next.

Android Login Acticity 1

3) You will have a window asking you for the type of activity you want to have, choose Login Activity and press Next button.

Android Login Acticity 2

4) Create a new project and give Activity name of your choice, layout name and title. After that hit Finish.

Android Login Acticity 3

This is the default output for the application. You can change it like another activity. Just edit the code of the layout file.

Here the device is asking for the permission:

Android Login Acticity 4

Java File:

        package
        
          com
        .
        example
        .
        hp
        .
        myapplication
        ;
        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
        .
        Plasenta
        ;
        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
        
          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 cak benar authentication system.
             */
        private
        static
        final
        String
        [
        ]
        DUMMY_CREDENTIALS
        =
        new
        String
        [
        ]
        {
        "foo@example.com:hello"
        ,
        "kafetaria@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 andal 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'horizon 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'kaki langit 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)
        {
        finish(
        )
        ;
        }
        else
        {
        mPasswordView.setError(getString(R.string.error_incorrect_password)
        )
        ;
        mPasswordView.requestFocus(
        )
        ;
        }
        }
        @Override
        protected
        void
        onCancelled(
        )
        {
        mAuthTask
        =
        null
        ;
        showProgress(
        false
        )
        ;
        }
        }
        }
      

XML file:

        <
        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.example.hp.myapplication.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
        >
      

Android Manifest:

        <?
        xml
        
        
        version
        =
        "
        1.0
        "
        
        
        encoding
        =
        "
        utf-8
        "
        ?>
        <
        manifest
        xmlns
        :
        android
        =
        "
        http
        :
        //
        schemas.android.com
        /apk/res/android
        "
        package
        =
        "
        com.example.hp.myapplication
        "
        >
        <!--
        
          To auto-complete the email text field in the login form with the user's emails
        
        -->
        <
        uses-permission
        android
        :
        name
        =
        "
        android.permission.GET_ACCOUNTS
        "
        />
        <
        uses-permission
        android
        :
        name
        =
        "
        android.permission.READ_PROFILE
        "
        />
        <
        uses-permission
        android
        :
        name
        =
        "
        android.permission.READ_CONTACTS
        "
        />
        <
        application
        android
        :
        allowBackup
        =
        "
        true
        "
        android
        :
        icon
        =
        "
        @mipmap/ic_launcher
        "
        android
        :
        label
        =
        "
        @string/app_name
        "
        android
        :
        supportsRtl
        =
        "
        true
        "
        android
        :
        theme
        =
        "
        @style/AppTheme
        "
        >
        <
        activity
        android
        :
        name
        =
        "
        .LoginActivity
        "
        android
        :
        logo
        =
        "
        @string/app_name
        "
        >
        <
        intent-filter
        >
        <
        action
        android
        :
        name
        =
        "
        android.intent.action.MAIN
        "
        />
        <
        category
        android
        :
        name
        =
        "
        android.intent.category.LAUNCHER
        "
        />
        </
        intent-filter
        >
        </
        activity
        >
        </
        application
        >
        </
        manifest
        >
      

Output

Android Login Activity - Output




Source: https://www.includehelp.com/android/pre-defined-login-activity-in-android-studio.aspx