With the latest news from Google I/O comes the new and upgraded Firebase. To demonstrate how simplified and easy to use firebase is, we will build a simple login / register (Firebase Authentication) demo using the FirebaseEmail & Password authentication.

Firebase provides a full set of authentication options out-of-the-box. Firebase automatically stores your users’ credentials securely (using bcrypt) and redundantly (with replication and daily off-site backups). This separates sensitive user credentials from your application data, and lets you focus on the user interface and experience for your app.

Features of Firebase

Firebase comes with bunch features essential for every android app starting from authentication to hosting the app.

Below are the advantages using Firebase in general:
> Super easy and quick to implement.
> No server side configuration needed. No PHP Scripts and No Database Designs.
> Realtime update without using GCM.
> Autoscaling built-in
> Can start for free (only need to start paying once we hit 50 connections)
> Robust APIs for Javascript (including several frameworks like Angular), iOS, and Android
> Built-in support for authentication services like Facebook, Google, and Twitter
> Declarative Security Rules model allows us to enforce read/write privileges and data validation throughout the tree

Some of the disadvantages of Firebase can be sum up in the following:
> Need to build indexes manually
> May need to build “event log” manually as well (in separate sub-tree?)
> Implementation of REST API could be difficult on embedded platforms
> Data validation rules do not support complex objects directly (you’d need to validate individual child nodes separately)

1. Enabling Firebase Auth

  1. 1. First thing you need to do is go tohttps://firebase.google.com/and make an account to gain access to their console. After you gain access to the console you can start by creating your first project.
  2. 2. Give the package name of your project (mine isandroidhive.firebase) in which you are going to integrate the Firebase. Here thegoogle-services.json file will be downloaded when you press add app button.
  3. 3. Next go to your project dashboard. Find the Auth and click get started. Go to set up sign in method and chooseEmail & Passwordandenable

android-adding-firebase-to-your-project

Now we are ready to start with our Android project. We are going to create a simple app which contains firebase authentication and profile management. Overall we are going to see how to add LoginRegistrationForgot PasswordChange EmailChange Password & finally Sign Out option.

  1. Creating Android Project
  2. 1. Create a new project in Android Studio from File New Project. When it prompts you to select the default activity, select Blank Activityand proceed.

While filling the project details, use the same package name which you gave in firebase console. In my case I am using same info.androidhive.firebase.

  1. 2. Open xmland add the INTERNETpermission as we need to make network calls.
<uses-permission android:name=”android.permission.INTERNET” />
  1. 3. Paste the google-services.jsonfile to your project’s app This step is very important as your project won’t build without this file.
  2. 4. Now open the gradlelocated in project’s home directory and add firebase dependency.
build.gradle
dependencies {

classpath ‘com.android.tools.build:gradle:2.1.2’

classpath ‘com.google.gms:google-services:3.0.0’

 

// NOTE: Do not place your application dependencies here; they belong

// in the individual module build.gradle files

}

  1. 5. Open app/build.gradleand add firebase auth dependency. At the very bottom of the file, add apply plugin: ‘com.google.gms.google-services’
app/build.gradle
dependencies {

compile “com.google.firebase:firebase-auth:9.0.2”

}

 

apply plugin: ‘com.google.gms.google-services’

  1. 6. Add the below resources to xmlcolors.xmland strings.xml. These resources doesn’t require for firebase, but for this article.
dimens.xml
<resources>

<!– Default screen margins, per the Android Design guidelines. –>

<dimen name=”activity_horizontal_margin”>16dp</dimen>

<dimen name=”activity_vertical_margin”>16dp</dimen>

<dimen name=”fab_margin”>16dp</dimen>

<dimen name=”logo_w_h”>100dp</dimen>

</resources>

colors.xml
<?xml version=”1.0″ encoding=”utf-8″?>

<resources>

<color name=”colorPrimary”>#00bcd4</color>

<color name=”colorPrimaryDark”>#0097a7</color>

<color name=”colorAccent”>#f2fe71</color>

 

<color name=”bg_login”>#26ae90</color>

<color name=”bg_register”>#2e3237</color>

<color name=”bg_main”>#428bca</color>

<color name=”white”>#ffffff</color>

<color name=”input_login”>#222222</color>

<color name=”input_login_hint”>#999999</color>

<color name=”input_register”>#888888</color>

<color name=”input_register_bg”>#3b4148</color>

<color name=”input_register_hint”>#5e6266</color>

<color name=”btn_login”>#26ae90</color>

<color name=”btn_login_bg”>#eceef1</color>

<color name=”lbl_name”>#333333</color>

<color name=”btn_logut_bg”>#ff6861</color>

</resources>

 

strings.xml
<resources>

<string name=”app_name”>Firebase Auth</string>

<string name=”action_sign_in_short”>Register</string>

<string name=”email”>Email</string>

<string name=”minimum_password”>Password too short, enter minimum 6 characters!</string>

<string name=”auth_failed”>Authentication failed, check your email and password or sign up</string>

<string name=”change_email”>Change Email</string>

<string name=”change_password”>Change Password</string>

<string name=”send_password_reset_email”>Send Password reset email</string>

<string name=”remove_user”>Remove user</string>

<string name=”new_pass”>New Password</string>

<string name=”title_activity_profile”>Firebase</string>

<string name=”title_activity_login”>Sign in</string>

<string name=”hint_email”>Email</string>

<string name=”hint_password”>Password</string>

<string name=”hint_name”>Fullname</string>

<string name=”btn_login”>LOGIN</string>

<string name=”btn_link_to_register”>Not a member? Get registered in Firebase now!</string>

<string name=”btn_link_to_login”>Already registered. Login Me!</string>

<string name=”title_activity_reset_password”>ResetPasswordActivity</string>

<string name=”btn_forgot_password”>Forgot your password?</string>

<string name=”btn_reset_password”>Reset Password</string>

<string name=”btn_back”><![CDATA[<< Back]]></string>

<string name=”hint_new_email”>New Email</string>

<string name=”btn_change”>Change</string>

<string name=”btn_send”>Send</string>

<string name=”btn_remove”>Remove</string>

<string name=”btn_sign_out”>Sign Out</string>

<string name=”lbl_forgot_password”>Forgot password?</string>

<string name=”forgot_password_msg”>We just need your registered Email Id to sent you password reset instructions.</string>

</resources>

Now we have the project ready with all the dependencies added. Let’s start by adding the sign up screen.

2.1 Sign Up with Email & Password

Sign up screen contains two EditText fields for email and password. And few buttons to navigate to login and forgot password screens.

  1. 7. Create an activity named javaand add the following code to the layout file activity_signup.xml
activity_signup.xml
<?xml version=”1.0″ encoding=”utf-8″?>

<android.support.design.widget.CoordinatorLayout xmlns:android=”http://schemas.android.com/apk/res/android

xmlns:app=”http://schemas.android.com/apk/res-auto

xmlns:tools=”http://schemas.android.com/tools

android:layout_width=”match_parent”

android:layout_height=”match_parent”

android:fitsSystemWindows=”true”

tools:context=”info.androidhive.firebase.LoginActivity”>

 

<LinearLayout

android:layout_width=”fill_parent”

android:layout_height=”fill_parent”

android:background=”@color/colorPrimaryDark”

android:gravity=”center”

android:orientation=”vertical”

android:padding=”@dimen/activity_horizontal_margin”>

 

 

<ImageView

android:layout_width=”@dimen/logo_w_h”

android:layout_height=”@dimen/logo_w_h”

android:layout_gravity=”center_horizontal”

android:layout_marginBottom=”30dp”

android:src=”@mipmap/ic_launcher” />

 

<android.support.design.widget.TextInputLayout

android:layout_width=”match_parent”

android:layout_height=”wrap_content”>

 

<EditText

android:id=”@+id/email”

android:layout_width=”match_parent”

android:layout_height=”wrap_content”

android:hint=”@string/email”

android:inputType=”textEmailAddress”

android:maxLines=”1″

android:singleLine=”true”

android:textColor=”@android:color/white” />

 

</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:focusableInTouchMode=”true”

android:hint=”@string/hint_password”

android:imeActionId=”@+id/login”

android:imeOptions=”actionUnspecified”

android:inputType=”textPassword”

android:maxLines=”1″

android:singleLine=”true”

android:textColor=”@android:color/white” />

 

</android.support.design.widget.TextInputLayout>

 

<Button

android:id=”@+id/sign_up_button”

style=”?android:textAppearanceSmall”

android:layout_width=”match_parent”

android:layout_height=”wrap_content”

android:layout_marginTop=”16dp”

android:background=”@color/colorAccent”

android:text=”@string/action_sign_in_short”

android:textColor=”@android:color/black”

android:textStyle=”bold” />

 

<Button

android:id=”@+id/btn_reset_password”

android:layout_width=”fill_parent”

android:layout_height=”wrap_content”

android:layout_marginTop=”20dip”

android:background=”@null”

android:text=”@string/btn_forgot_password”

android:textAllCaps=”false”

android:textColor=”@color/colorAccent” />

 

<!– Link to Login Screen –>

 

<Button

android:id=”@+id/sign_in_button”

android:layout_width=”fill_parent”

android:layout_height=”wrap_content”

android:layout_marginTop=”20dip”

android:background=”@null”

android:text=”@string/btn_link_to_login”

android:textAllCaps=”false”

android:textColor=”@color/white”

android:textSize=”15dp” />

</LinearLayout>

 

<ProgressBar

android:id=”@+id/progressBar”

android:layout_width=”30dp”

android:layout_height=”30dp”

android:layout_gravity=”center|bottom”

android:layout_marginBottom=”20dp”

android:visibility=”gone” />

</android.support.design.widget.CoordinatorLayout>

  1. 8. Open javaand add the following. Firebase provides createUserWithEmailAndPassword()method to create a new user with email and password data.
SignupActivity.java
package info.androidhive.firebase;

 

import android.content.Intent;

import android.os.Bundle;

import android.support.annotation.NonNull;

import android.support.v7.app.AppCompatActivity;

import android.text.TextUtils;

import android.view.View;

import android.widget.Button;

import android.widget.EditText;

import android.widget.ProgressBar;

import android.widget.Toast;

 

import com.google.android.gms.tasks.OnCompleteListener;

import com.google.android.gms.tasks.Task;

import com.google.firebase.auth.AuthResult;

import com.google.firebase.auth.FirebaseAuth;

 

public class SignupActivity extends AppCompatActivity {

 

private EditText inputEmail, inputPassword;

private Button btnSignIn, btnSignUp, btnResetPassword;

private ProgressBar progressBar;

private FirebaseAuth auth;

 

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_signup);

 

//Get Firebase auth instance

auth = FirebaseAuth.getInstance();

 

btnSignIn = (Button) findViewById(R.id.sign_in_button);

btnSignUp = (Button) findViewById(R.id.sign_up_button);

inputEmail = (EditText) findViewById(R.id.email);

inputPassword = (EditText) findViewById(R.id.password);

progressBar = (ProgressBar) findViewById(R.id.progressBar);

btnResetPassword = (Button) findViewById(R.id.btn_reset_password);

 

btnResetPassword.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

startActivity(new Intent(SignupActivity.this, ResetPasswordActivity.class));

}

});

 

btnSignIn.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

finish();

}

});

 

btnSignUp.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

 

String email = inputEmail.getText().toString().trim();

String password = inputPassword.getText().toString().trim();

 

if (TextUtils.isEmpty(email)) {

Toast.makeText(getApplicationContext(), “Enter email address!”, Toast.LENGTH_SHORT).show();

return;

}

 

if (TextUtils.isEmpty(password)) {

Toast.makeText(getApplicationContext(), “Enter password!”, Toast.LENGTH_SHORT).show();

return;

}

 

if (password.length() < 6) {

Toast.makeText(getApplicationContext(), “Password too short, enter minimum 6 characters!”, Toast.LENGTH_SHORT).show();

return;

}

 

progressBar.setVisibility(View.VISIBLE);

//create user

auth.createUserWithEmailAndPassword(email, password)

.addOnCompleteListener(SignupActivity.this, new OnCompleteListener<AuthResult>() {

@Override

public void onComplete(@NonNull Task<AuthResult> task) {

Toast.makeText(SignupActivity.this, “createUserWithEmail:onComplete:” + task.isSuccessful(), Toast.LENGTH_SHORT).show();

progressBar.setVisibility(View.GONE);

// If sign in fails, display a message to the user. If sign in succeeds

// the auth state listener will be notified and logic to handle the

// signed in user can be handled in the listener.

if (!task.isSuccessful()) {

Toast.makeText(SignupActivity.this, “Authentication failed.” + task.getException(),

Toast.LENGTH_SHORT).show();

} else {

startActivity(new Intent(SignupActivity.this, MainActivity.class));

finish();

}

}

});

 

}

});

}

 

@Override

protected void onResume() {

super.onResume();

progressBar.setVisibility(View.GONE);

}

}

Open AndroidManifest.xml and make SignupActivity as launcher activity (temporarily) and test the sign up.

android-firebase-sign-up-screen

If you login to Firebase console, you can see the user created with the email id you have given the android app.

android-firebase-console-new-user

2.2 Log In with Email & Password

Now we’ll add the login screen and check the credentials we have created on sign up screen.

  1. 9. Create another activity named javaand add the below code to its layout file activity_login.xml.
activity_login.xml
<?xml version=”1.0″ encoding=”utf-8″?>

<android.support.design.widget.CoordinatorLayout xmlns:android=”http://schemas.android.com/apk/res/android

xmlns:app=”http://schemas.android.com/apk/res-auto

xmlns:tools=”http://schemas.android.com/tools

android:layout_width=”match_parent”

android:layout_height=”match_parent”

android:fitsSystemWindows=”true”

tools:context=”info.androidhive.firebase.LoginActivity”>

 

<LinearLayout

android:layout_width=”fill_parent”

android:layout_height=”fill_parent”

android:background=”@color/colorPrimary”

android:gravity=”center”

android:orientation=”vertical”

android:padding=”@dimen/activity_horizontal_margin”>

 

 

<ImageView

android:layout_width=”@dimen/logo_w_h”

android:layout_height=”@dimen/logo_w_h”

android:layout_gravity=”center_horizontal”

android:layout_marginBottom=”30dp”

android:src=”@mipmap/ic_launcher” />

 

<android.support.design.widget.TextInputLayout

android:layout_width=”match_parent”

android:layout_height=”wrap_content”>

 

<EditText

android:id=”@+id/email”

android:layout_width=”match_parent”

android:layout_height=”wrap_content”

android:layout_marginBottom=”10dp”

android:hint=”@string/hint_email”

android:inputType=”textEmailAddress”

android:textColor=”@android:color/white”

android:textColorHint=”@android:color/white” />

</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=”fill_parent”

android:layout_height=”wrap_content”

android:layout_marginBottom=”10dp”

android:hint=”@string/hint_password”

android:inputType=”textPassword”

android:textColor=”@android:color/white”

android:textColorHint=”@android:color/white” />

</android.support.design.widget.TextInputLayout>

 

<!– Login Button –>

 

<Button

android:id=”@+id/btn_login”

android:layout_width=”fill_parent”

android:layout_height=”wrap_content”

android:layout_marginTop=”20dip”

android:background=”@color/colorAccent”

android:text=”@string/btn_login”

android:textColor=”@android:color/black” />

 

<Button

android:id=”@+id/btn_reset_password”

android:layout_width=”fill_parent”

android:layout_height=”wrap_content”

android:layout_marginTop=”20dip”

android:background=”@null”

android:text=”@string/btn_forgot_password”

android:textAllCaps=”false”

android:textColor=”@color/colorAccent” />

 

<!– Link to Login Screen –>

 

<Button

android:id=”@+id/btn_signup”

android:layout_width=”fill_parent”

android:layout_height=”wrap_content”

android:layout_marginTop=”20dip”

android:background=”@null”

android:text=”@string/btn_link_to_register”

android:textAllCaps=”false”

android:textColor=”@color/white”

android:textSize=”15dp” />

</LinearLayout>

 

<ProgressBar

android:id=”@+id/progressBar”

android:layout_width=”30dp”

android:layout_height=”30dp”

android:layout_gravity=”center|bottom”

android:layout_marginBottom=”20dp”

android:visibility=”gone” />

</android.support.design.widget.CoordinatorLayout>

  1. 10. Open javaand do the below changes. Firebase provides signInWithEmailAndPassword()method to sign in the user.
LoginActivity.java
package info.androidhive.firebase;

 

import android.content.Intent;

import android.os.Bundle;

import android.support.annotation.NonNull;

import android.support.v7.app.AppCompatActivity;

import android.support.v7.widget.Toolbar;

import android.text.TextUtils;

import android.view.View;

import android.widget.Button;

import android.widget.EditText;

import android.widget.ProgressBar;

import android.widget.Toast;

 

import com.google.android.gms.tasks.OnCompleteListener;

import com.google.android.gms.tasks.Task;

import com.google.firebase.auth.AuthResult;

import com.google.firebase.auth.FirebaseAuth;

 

public class LoginActivity extends AppCompatActivity {

 

private EditText inputEmail, inputPassword;

private FirebaseAuth auth;

private ProgressBar progressBar;

private Button btnSignup, btnLogin, btnReset;

 

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

 

//Get Firebase auth instance

auth = FirebaseAuth.getInstance();

 

if (auth.getCurrentUser() != null) {

startActivity(new Intent(LoginActivity.this, MainActivity.class));

finish();

}

 

// set the view now

setContentView(R.layout.activity_login);

 

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);

setSupportActionBar(toolbar);

 

inputEmail = (EditText) findViewById(R.id.email);

inputPassword = (EditText) findViewById(R.id.password);

progressBar = (ProgressBar) findViewById(R.id.progressBar);

btnSignup = (Button) findViewById(R.id.btn_signup);

btnLogin = (Button) findViewById(R.id.btn_login);

btnReset = (Button) findViewById(R.id.btn_reset_password);

 

//Get Firebase auth instance

auth = FirebaseAuth.getInstance();

 

btnSignup.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

startActivity(new Intent(LoginActivity.this, SignupActivity.class));

}

});

 

btnReset.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

startActivity(new Intent(LoginActivity.this, ResetPasswordActivity.class));

}

});

 

btnLogin.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

String email = inputEmail.getText().toString();

final String password = inputPassword.getText().toString();

 

if (TextUtils.isEmpty(email)) {

Toast.makeText(getApplicationContext(), “Enter email address!”, Toast.LENGTH_SHORT).show();

return;

}

 

if (TextUtils.isEmpty(password)) {

Toast.makeText(getApplicationContext(), “Enter password!”, Toast.LENGTH_SHORT).show();

return;

}

 

progressBar.setVisibility(View.VISIBLE);

 

//authenticate user

auth.signInWithEmailAndPassword(email, password)

.addOnCompleteListener(LoginActivity.this, new OnCompleteListener<AuthResult>() {

@Override

public void onComplete(@NonNull Task<AuthResult> task) {

// If sign in fails, display a message to the user. If sign in succeeds

// the auth state listener will be notified and logic to handle the

// signed in user can be handled in the listener.

progressBar.setVisibility(View.GONE);

if (!task.isSuccessful()) {

// there was an error

if (password.length() < 6) {

inputPassword.setError(getString(R.string.minimum_password));

} else {

Toast.makeText(LoginActivity.this, getString(R.string.auth_failed), Toast.LENGTH_LONG).show();

}

} else {

Intent intent = new Intent(LoginActivity.this, MainActivity.class);

startActivity(intent);

finish();

}

}

});

}

});

}

}

  1. 11. Open xmland make the LoginActivity.javaas launcher activity to make the login screen as first screen.

Run the project and login with the credentials which you used while signing up.

android-firebase-login-screen

2.3 Forgot Password – Send Reset Password Email

Another cool feature firebase provides is, sending reset password email when required. This is a very difficult task if you want to have your own email server.

  1. 12. Create another activity named javaand add the below code its layout fileactivity_reset_password.xml
activity_reset_password.xml
<?xml version=”1.0″ encoding=”utf-8″?>

<android.support.design.widget.CoordinatorLayout xmlns:android=”http://schemas.android.com/apk/res/android

xmlns:app=”http://schemas.android.com/apk/res-auto

xmlns:tools=”http://schemas.android.com/tools

android:layout_width=”match_parent”

android:layout_height=”match_parent”

android:layout_gravity=”center”

android:background=”@color/colorPrimary”

android:fitsSystemWindows=”true”

tools:context=”info.androidhive.firebase.LoginActivity”>

 

<LinearLayout

android:layout_width=”fill_parent”

android:layout_height=”wrap_content”

android:layout_marginTop=”30dp”

android:gravity=”center”

android:orientation=”vertical”

android:padding=”@dimen/activity_horizontal_margin”>

 

 

<ImageView

android:layout_width=”@dimen/logo_w_h”

android:layout_height=”@dimen/logo_w_h”

android:layout_gravity=”center_horizontal”

android:layout_marginBottom=”10dp”

android:src=”@mipmap/ic_launcher” />

 

<TextView

android:layout_width=”wrap_content”

android:layout_height=”wrap_content”

android:layout_gravity=”center_horizontal”

android:padding=”10dp”

android:text=”@string/lbl_forgot_password”

android:textColor=”@android:color/white”

android:textSize=”20dp” />

 

<TextView

android:layout_width=”wrap_content”

android:layout_height=”wrap_content”

android:layout_marginBottom=”10dp”

android:gravity=”center_horizontal”

android:padding=”@dimen/activity_horizontal_margin”

android:text=”@string/forgot_password_msg”

android:textColor=”@android:color/white”

android:textSize=”14dp” />

 

<android.support.design.widget.TextInputLayout

android:layout_width=”match_parent”

android:layout_height=”wrap_content”>

 

<EditText

android:id=”@+id/email”

android:layout_width=”match_parent”

android:layout_height=”wrap_content”

android:layout_marginBottom=”10dp”

android:layout_marginTop=”20dp”

android:hint=”@string/hint_email”

android:inputType=”textEmailAddress”

android:textColor=”@android:color/white”

android:textColorHint=”@android:color/white” />

</android.support.design.widget.TextInputLayout>

 

<!– Login Button –>

 

<Button

android:id=”@+id/btn_reset_password”

android:layout_width=”fill_parent”

android:layout_height=”wrap_content”

android:layout_marginTop=”20dip”

android:background=”@color/colorAccent”

android:text=”@string/btn_reset_password”

android:textColor=”@android:color/black” />

 

<Button

android:id=”@+id/btn_back”

android:layout_width=”wrap_content”

android:layout_height=”wrap_content”

android:layout_marginTop=”10dp”

android:background=”@null”

android:text=”@string/btn_back”

android:textColor=”@color/colorAccent” />

 

</LinearLayout>

 

<ProgressBar

android:id=”@+id/progressBar”

android:layout_width=”30dp”

android:layout_height=”30dp”

android:layout_gravity=”center|bottom”

android:layout_marginBottom=”20dp”

android:visibility=”gone” />

</android.support.design.widget.CoordinatorLayout>

  1. 13. Open javaadd the below code. You can use sendPasswordResetEmail()method to send the password reset email.
ResetPasswordActivity.java
package info.androidhive.firebase;

 

import android.os.Bundle;

import android.support.annotation.NonNull;

import android.support.v7.app.AppCompatActivity;

import android.text.TextUtils;

import android.view.View;

import android.widget.Button;

import android.widget.EditText;

import android.widget.ProgressBar;

import android.widget.Toast;

 

import com.google.android.gms.tasks.OnCompleteListener;

import com.google.android.gms.tasks.Task;

import com.google.firebase.auth.FirebaseAuth;

 

public class ResetPasswordActivity extends AppCompatActivity {

 

private EditText inputEmail;

private Button btnReset, btnBack;

private FirebaseAuth auth;

private ProgressBar progressBar;

 

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_reset_password);

 

inputEmail = (EditText) findViewById(R.id.email);

btnReset = (Button) findViewById(R.id.btn_reset_password);

btnBack = (Button) findViewById(R.id.btn_back);

progressBar = (ProgressBar) findViewById(R.id.progressBar);

 

auth = FirebaseAuth.getInstance();

 

btnBack.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

finish();

}

});

 

btnReset.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

 

String email = inputEmail.getText().toString().trim();

 

if (TextUtils.isEmpty(email)) {

Toast.makeText(getApplication(), “Enter your registered email id”, Toast.LENGTH_SHORT).show();

return;

}

 

progressBar.setVisibility(View.VISIBLE);

auth.sendPasswordResetEmail(email)

.addOnCompleteListener(new OnCompleteListener<Void>() {

@Override

public void onComplete(@NonNull Task<Void> task) {

if (task.isSuccessful()) {

Toast.makeText(ResetPasswordActivity.this, “We have sent you instructions to reset your password!”, Toast.LENGTH_SHORT).show();

} else {

Toast.makeText(ResetPasswordActivity.this, “Failed to send reset email!”, Toast.LENGTH_SHORT).show();

}

 

progressBar.setVisibility(View.GONE);

}

});

}

});

}

 

}

 

android-firebase-forgot-password

Here is the password reset email user will receive.

android-firebase-reset-password-email

Below are the quick code snippets to other user functionalities.

Checking User Session

auth = FirebaseAuth.getInstance();

if (auth.getCurrentUser() != null) {

// User is logged in

}

Change Password

FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();

 

user.updatePassword(newPassword.getText().toString().trim())

.addOnCompleteListener(new OnCompleteListener<Void>() {

@Override

public void onComplete(@NonNull Task<Void> task) {

if (task.isSuccessful()) {

Toast.makeText(MainActivity.this, “Password is updated!”, Toast.LENGTH_SHORT).show();

} else {

Toast.makeText(MainActivity.this, “Failed to update password!”, Toast.LENGTH_SHORT).show();

progressBar.setVisibility(View.GONE);

}

}

});

Change Email

FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();

 

user.updateEmail(newEmail.getText().toString().trim())

.addOnCompleteListener(new OnCompleteListener<Void>() {

@Override

public void onComplete(@NonNull Task<Void> task) {

if (task.isSuccessful()) {

Toast.makeText(MainActivity.this, “Email address is updated.”, Toast.LENGTH_LONG).show();

} else {

Toast.makeText(MainActivity.this, “Failed to update email!”, Toast.LENGTH_LONG).show();

}

}

});

Deleting Account / User

FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();

if (user != null) {

user.delete()

.addOnCompleteListener(new OnCompleteListener<Void>() {

@Override

public void onComplete(@NonNull Task<Void> task) {

if (task.isSuccessful()) {

Toast.makeText(MainActivity.this, “Your profile is deleted:( Create a account now!”, Toast.LENGTH_SHORT).show();

} else {

Toast.makeText(MainActivity.this, “Failed to delete your account!”, Toast.LENGTH_SHORT).show();

}

}

});

}

Sign Out

auth.signOut();

 

// this listener will be called when there is change in firebase user session

FirebaseAuth.AuthStateListener authListener = new FirebaseAuth.AuthStateListener() {

@Override

public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {

FirebaseUser user = firebaseAuth.getCurrentUser();

if (user == null) {

// user auth state is changed – user is null

// launch login activity

startActivity(new Intent(MainActivity.this, LoginActivity.class));

finish();

}

}

};

2.4 Profile Screen – Putting All Together

Now we’ll keep all the above functionalities in main activity and make fully functional app. Open the layout file of main activity activity_main.xml and add the below layout code.

14.Open the activity_main.xml and add the following code.

activity_main.xml
<?xml version=”1.0″ encoding=”utf-8″?>

<android.support.design.widget.CoordinatorLayout xmlns:android=”http://schemas.android.com/apk/res/android

xmlns:app=”http://schemas.android.com/apk/res-auto

xmlns:tools=”http://schemas.android.com/tools

android:layout_width=”match_parent”

android:layout_height=”match_parent”

android:fitsSystemWindows=”true”

tools:context=”.MainActivity”>

 

<android.support.design.widget.AppBarLayout

android:layout_width=”match_parent”

android:layout_height=”wrap_content”

android:theme=”@style/AppTheme.AppBarOverlay”

app:elevation=”0dp”>

 

<android.support.v7.widget.Toolbar

android:id=”@+id/toolbar”

android:layout_width=”match_parent”

android:layout_height=”?attr/actionBarSize”

android:background=”?attr/colorPrimaryDark”

app:layout_scrollFlags=”scroll|enterAlways”

app:popupTheme=”@style/AppTheme.PopupOverlay” />

 

</android.support.design.widget.AppBarLayout>

 

<LinearLayout

android:layout_width=”match_parent”

android:layout_height=”wrap_content”

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”

app:layout_behavior=”@string/appbar_scrolling_view_behavior”>

 

<EditText

android:id=”@+id/old_email”

android:layout_width=”match_parent”

android:layout_height=”wrap_content”

android:hint=”@string/hint_email”

android:inputType=”textEmailAddress”

android:maxLines=”1″

android:singleLine=”true” />

 

<EditText

android:id=”@+id/new_email”

android:layout_width=”match_parent”

android:layout_height=”wrap_content”

android:hint=”@string/hint_new_email”

android:inputType=”textEmailAddress”

android:maxLines=”1″

android:singleLine=”true” />

 

<EditText

android:id=”@+id/password”

android:layout_width=”match_parent”

android:layout_height=”wrap_content”

android:focusableInTouchMode=”true”

android:hint=”@string/prompt_password”

android:imeActionId=”@+id/login”

android:imeOptions=”actionUnspecified”

android:inputType=”textPassword”

android:maxLines=”1″

android:singleLine=”true” />

 

<EditText

android:id=”@+id/newPassword”

android:layout_width=”match_parent”

android:layout_height=”wrap_content”

android:focusableInTouchMode=”true”

android:hint=”@string/new_pass”

android:imeActionId=”@+id/login”

android:imeOptions=”actionUnspecified”

android:inputType=”textPassword”

android:maxLines=”1″

android:singleLine=”true” />

 

<Button

android:id=”@+id/changeEmail”

style=”?android:textAppearanceSmall”

android:layout_width=”wrap_content”

android:layout_height=”wrap_content”

android:layout_marginTop=”16dp”

android:background=”@color/colorPrimaryDark”

android:text=”@string/btn_change”

android:textColor=”@android:color/white”

android:textStyle=”bold” />

 

<Button

android:id=”@+id/changePass”

style=”?android:textAppearanceSmall”

android:layout_width=”wrap_content”

android:layout_height=”wrap_content”

android:layout_marginTop=”16dp”

android:background=”@color/colorPrimaryDark”

android:text=”@string/btn_change”

android:textColor=”@android:color/white”

android:textStyle=”bold” />

 

<Button

android:id=”@+id/send”

style=”?android:textAppearanceSmall”

android:layout_width=”wrap_content”

android:layout_height=”wrap_content”

android:layout_marginTop=”16dp”

android:background=”@color/colorPrimaryDark”

android:text=”@string/btn_send”

android:textColor=”@android:color/white”

android:textStyle=”bold” />

 

<ProgressBar

android:id=”@+id/progressBar”

android:layout_width=”30dp”

android:layout_height=”30dp”

android:visibility=”gone” />

 

<Button

android:id=”@+id/remove”

style=”?android:textAppearanceSmall”

android:layout_width=”wrap_content”

android:layout_height=”wrap_content”

android:layout_marginTop=”16dp”

android:background=”@color/colorPrimaryDark”

android:text=”@string/btn_remove”

android:textColor=”@android:color/white”

android:textStyle=”bold” />

 

<Button

android:id=”@+id/change_email_button”

style=”?android:textAppearanceSmall”

android:layout_width=”match_parent”

android:layout_height=”wrap_content”

android:layout_marginTop=”16dp”

android:text=”@string/change_email”

android:textStyle=”bold” />

 

<Button

android:id=”@+id/change_password_button”

style=”?android:textAppearanceSmall”

android:layout_width=”match_parent”

android:layout_height=”wrap_content”

android:layout_marginTop=”16dp”

android:text=”@string/change_password”

android:textStyle=”bold” />

 

<Button

android:id=”@+id/sending_pass_reset_button”

style=”?android:textAppearanceSmall”

android:layout_width=”match_parent”

android:layout_height=”wrap_content”

android:layout_marginTop=”16dp”

android:text=”@string/send_password_reset_email”

android:textStyle=”bold” />

 

<Button

android:id=”@+id/remove_user_button”

style=”?android:textAppearanceSmall”

android:layout_width=”match_parent”

android:layout_height=”wrap_content”

android:layout_marginTop=”16dp”

android:text=”@string/remove_user”

android:textStyle=”bold” />

 

<Button

android:id=”@+id/sign_out”

style=”?android:textAppearanceSmall”

android:layout_width=”match_parent”

android:layout_height=”wrap_content”

android:layout_marginTop=”16dp”

android:background=”@color/colorPrimary”

android:text=”@string/btn_sign_out”

android:textColor=”@android:color/white”

android:textStyle=”bold” />

 

</LinearLayout>

 

</android.support.design.widget.CoordinatorLayout>

  1. 15. Open the javaand the following code. Basically here we combine all the functionalities into a single activity.
MainActivity.java
package info.androidhive.firebase;

 

import android.content.Intent;

import android.os.Bundle;

import android.support.annotation.NonNull;

import android.support.v7.app.AppCompatActivity;

import android.support.v7.widget.Toolbar;

import android.view.View;

import android.widget.Button;

import android.widget.EditText;

import android.widget.ProgressBar;

import android.widget.Toast;

 

import com.google.android.gms.tasks.OnCompleteListener;

import com.google.android.gms.tasks.Task;

import com.google.firebase.auth.FirebaseAuth;

import com.google.firebase.auth.FirebaseUser;

 

public class MainActivity extends AppCompatActivity {

 

private Button btnChangeEmail, btnChangePassword, btnSendResetEmail, btnRemoveUser,

changeEmail, changePassword, sendEmail, remove, signOut;

 

private EditText oldEmail, newEmail, password, newPassword;

private ProgressBar progressBar;

private FirebaseAuth.AuthStateListener authListener;

private FirebaseAuth auth;

 

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

 

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);

toolbar.setTitle(getString(R.string.app_name));

setSupportActionBar(toolbar);

 

//get firebase auth instance

auth = FirebaseAuth.getInstance();

 

//get current user

final FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();

 

authListener = new FirebaseAuth.AuthStateListener() {

@Override

public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {

FirebaseUser user = firebaseAuth.getCurrentUser();

if (user == null) {

// user auth state is changed – user is null

// launch login activity

startActivity(new Intent(MainActivity.this, LoginActivity.class));

finish();

}

}

};

 

btnChangeEmail = (Button) findViewById(R.id.change_email_button);

btnChangePassword = (Button) findViewById(R.id.change_password_button);

btnSendResetEmail = (Button) findViewById(R.id.sending_pass_reset_button);

btnRemoveUser = (Button) findViewById(R.id.remove_user_button);

changeEmail = (Button) findViewById(R.id.changeEmail);

changePassword = (Button) findViewById(R.id.changePass);

sendEmail = (Button) findViewById(R.id.send);

remove = (Button) findViewById(R.id.remove);

signOut = (Button) findViewById(R.id.sign_out);

 

oldEmail = (EditText) findViewById(R.id.old_email);

newEmail = (EditText) findViewById(R.id.new_email);

password = (EditText) findViewById(R.id.password);

newPassword = (EditText) findViewById(R.id.newPassword);

 

oldEmail.setVisibility(View.GONE);

newEmail.setVisibility(View.GONE);

password.setVisibility(View.GONE);

newPassword.setVisibility(View.GONE);

changeEmail.setVisibility(View.GONE);

changePassword.setVisibility(View.GONE);

sendEmail.setVisibility(View.GONE);

remove.setVisibility(View.GONE);

 

progressBar = (ProgressBar) findViewById(R.id.progressBar);

 

if (progressBar != null) {

progressBar.setVisibility(View.GONE);

}

 

btnChangeEmail.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

oldEmail.setVisibility(View.GONE);

newEmail.setVisibility(View.VISIBLE);

password.setVisibility(View.GONE);

newPassword.setVisibility(View.GONE);

changeEmail.setVisibility(View.VISIBLE);

changePassword.setVisibility(View.GONE);

sendEmail.setVisibility(View.GONE);

remove.setVisibility(View.GONE);

}

});

 

changeEmail.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

progressBar.setVisibility(View.VISIBLE);

if (user != null && !newEmail.getText().toString().trim().equals(“”)) {

user.updateEmail(newEmail.getText().toString().trim())

.addOnCompleteListener(new OnCompleteListener<Void>() {

@Override

public void onComplete(@NonNull Task<Void> task) {

if (task.isSuccessful()) {

Toast.makeText(MainActivity.this, “Email address is updated. Please sign in with new email id!”, Toast.LENGTH_LONG).show();

signOut();

progressBar.setVisibility(View.GONE);

} else {

Toast.makeText(MainActivity.this, “Failed to update email!”, Toast.LENGTH_LONG).show();

progressBar.setVisibility(View.GONE);

}

}

});

} else if (newEmail.getText().toString().trim().equals(“”)) {

newEmail.setError(“Enter email”);

progressBar.setVisibility(View.GONE);

}

}

});

 

btnChangePassword.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

oldEmail.setVisibility(View.GONE);

newEmail.setVisibility(View.GONE);

password.setVisibility(View.GONE);

newPassword.setVisibility(View.VISIBLE);

changeEmail.setVisibility(View.GONE);

changePassword.setVisibility(View.VISIBLE);

sendEmail.setVisibility(View.GONE);

remove.setVisibility(View.GONE);

}

});

 

changePassword.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

progressBar.setVisibility(View.VISIBLE);

if (user != null && !newPassword.getText().toString().trim().equals(“”)) {

if (newPassword.getText().toString().trim().length() < 6) {

newPassword.setError(“Password too short, enter minimum 6 characters”);

progressBar.setVisibility(View.GONE);

} else {

user.updatePassword(newPassword.getText().toString().trim())

.addOnCompleteListener(new OnCompleteListener<Void>() {

@Override

public void onComplete(@NonNull Task<Void> task) {

if (task.isSuccessful()) {

Toast.makeText(MainActivity.this, “Password is updated, sign in with new password!”, Toast.LENGTH_SHORT).show();

signOut();

progressBar.setVisibility(View.GONE);

} else {

Toast.makeText(MainActivity.this, “Failed to update password!”, Toast.LENGTH_SHORT).show();

progressBar.setVisibility(View.GONE);

}

}

});

}

} else if (newPassword.getText().toString().trim().equals(“”)) {

newPassword.setError(“Enter password”);

progressBar.setVisibility(View.GONE);

}

}

});

 

btnSendResetEmail.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

oldEmail.setVisibility(View.VISIBLE);

newEmail.setVisibility(View.GONE);

password.setVisibility(View.GONE);

newPassword.setVisibility(View.GONE);

changeEmail.setVisibility(View.GONE);

changePassword.setVisibility(View.GONE);

sendEmail.setVisibility(View.VISIBLE);

remove.setVisibility(View.GONE);

}

});

 

sendEmail.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

progressBar.setVisibility(View.VISIBLE);

if (!oldEmail.getText().toString().trim().equals(“”)) {

auth.sendPasswordResetEmail(oldEmail.getText().toString().trim())

.addOnCompleteListener(new OnCompleteListener<Void>() {

@Override

public void onComplete(@NonNull Task<Void> task) {

if (task.isSuccessful()) {

Toast.makeText(MainActivity.this, “Reset password email is sent!”, Toast.LENGTH_SHORT).show();

progressBar.setVisibility(View.GONE);

} else {

Toast.makeText(MainActivity.this, “Failed to send reset email!”, Toast.LENGTH_SHORT).show();

progressBar.setVisibility(View.GONE);

}

}

});

} else {

oldEmail.setError(“Enter email”);

progressBar.setVisibility(View.GONE);

}

}

});

 

btnRemoveUser.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

progressBar.setVisibility(View.VISIBLE);

if (user != null) {

user.delete()

.addOnCompleteListener(new OnCompleteListener<Void>() {

@Override

public void onComplete(@NonNull Task<Void> task) {

if (task.isSuccessful()) {

Toast.makeText(MainActivity.this, “Your profile is deleted:( Create a account now!”, Toast.LENGTH_SHORT).show();

startActivity(new Intent(MainActivity.this, SignupActivity.class));

finish();

progressBar.setVisibility(View.GONE);

} else {

Toast.makeText(MainActivity.this, “Failed to delete your account!”, Toast.LENGTH_SHORT).show();

progressBar.setVisibility(View.GONE);

}

}

});

}

}

});

 

signOut.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

signOut();

}

});

 

}

 

//sign out method

public void signOut() {

auth.signOut();

}

 

@Override

protected void onResume() {

super.onResume();

progressBar.setVisibility(View.GONE);

}

 

@Override

public void onStart() {

super.onStart();

auth.addAuthStateListener(authListener);

}

 

@Override

public void onStop() {

super.onStop();

if (authListener != null) {

auth.removeAuthStateListener(authListener);

}

}

}

 

android-firebase-profile-activity

Now you have the basics for creating a simple login / register app with firebase. You can continue exploring firebase as it offers much more functionalities and it’s fun to use them.

Thank You Ravi & Androidhive