
Firebase is a service to applications, it provides hosting, NoSQL storage, real-time databases, social authentication, notification, and other services.
In this project, we have created a login and signup page in android studio using firebase so we have used the Authentication service for free! When the user signs up using email and password that gets stored in the authentication database of firebase.
For login purposes, the same credentials are checked in the firebase authentication table and if it matches with user credentials then it will lead you to the home screen otherwise it will throw an error as login failed.
Please find the brand color as #8692f7 (Purple)
Add the color in the colors.xml file as given:
<color name="lavender">#8692f7</color>
<color name="grey">#ff424242</color>
Download the login background image for free:


Add email, password, and lock vector assets.
Step 1: Open Android Studio, Create New Project and Choose Empty Activity. Click Finish.
Step 2: Pre-requisites
themes.xml
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. -->
<style name="Theme.LoginSignupAuth" parent="Theme.MaterialComponents.DayNight.NoActionBar">
<!-- Primary brand color. -->
<item name="colorPrimary">@color/lavender</item>
<item name="colorPrimaryVariant">@color/lavender</item>
<item name="colorOnPrimary">@color/white</item>
<!-- Secondary brand color. -->
<item name="colorSecondary">@color/teal_200</item>
<item name="colorSecondaryVariant">@color/teal_700</item>
<item name="colorOnSecondary">@color/black</item>
<!-- Status bar color. -->
<item name="android:statusBarColor">?attr/colorPrimaryVariant</item>
<!-- Customize your theme here. -->
</style>
</resources>
gradle(app)
kotlinOptions {
jvmTarget = '1.8'
}
buildFeatures{
viewBinding true
}
lavender_border.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners
android:radius="20dp"/>
<stroke
android:color="@color/lavender"
android:width="2dp"/>
<solid
android:color="@color/white"/>
</shape>
lavender_fill
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid
android:color="@color/lavender"/>
<corners
android:topRightRadius="20dp"
android:topLeftRadius="20dp"/>
</shape>
dialog_forgot.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/dialogForgot"
android:layout_margin="20dp"
android:padding="20dp">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/dialogBox"
app:layout_constraintTop_toTopOf="parent"
android:background="@drawable/lavender_border">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/forgotTitle"
android:background="@drawable/lavender_fill"
android:padding="10dp"
android:text="Forgot Password"
android:textColor="@color/white"
android:textSize="17sp"
android:drawableLeft="@drawable/ic_baseline_lock_reset_24"
android:drawablePadding="8dp"
app:layout_constraintTop_toTopOf="parent"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/desc"
android:text="Enter your email address"
android:textSize="16sp"
android:layout_marginStart="20dp"
android:layout_marginEnd="20dp"
android:textColor="@color/lavender"
android:layout_marginTop="8dp"
app:layout_constraintTop_toBottomOf="@id/forgotTitle"
app:layout_constraintBottom_toTopOf="@id/editBox"/>
<EditText
android:layout_width="300dp"
android:layout_height="wrap_content"
android:id="@+id/editBox"
android:textColor="@color/lavender"
android:textSize="16sp"
android:layout_marginStart="20sp"
android:backgroundTint="@color/lavender"
android:layout_marginBottom="30dp"
android:maxLines="1"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@id/forgotTitle"/>
<Button
android:layout_width="0dp"
android:layout_height="50dp"
android:id="@+id/btnCancel"
android:layout_marginStart="40dp"
android:layout_marginEnd="10dp"
android:textColor="@color/white"
android:textSize="14sp"
android:text="Cancel"
android:layout_marginBottom="8dp"
app:cornerRadius = "20dp"
android:layout_marginTop="10dp"
app:layout_constraintTop_toBottomOf="@id/editBox"
app:layout_constraintBottom_toBottomOf="@id/dialogBox"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toStartOf="@id/btnReset"/>
<Button
android:layout_width="0dp"
android:layout_height="50dp"
android:id="@+id/btnReset"
android:layout_marginStart="10dp"
android:layout_marginEnd="40dp"
android:textColor="@color/white"
android:textSize="14sp"
android:layout_marginBottom="8dp"
android:layout_marginTop="10dp"
android:text="Reset"
app:cornerRadius = "20dp"
app:layout_constraintBottom_toBottomOf="@id/dialogBox"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/btnCancel"/>
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
Step 3: activity_signup.xml
<?xml version="1.0" encoding="utf-8"?>
<ScrollView
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:background="@drawable/signupbkg"
tools:context=".SignupActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_marginTop="320dp"
android:padding="20dp">
<EditText
android:layout_width="350dp"
android:layout_height="60dp"
android:id="@+id/signup_email"
android:layout_marginTop="30dp"
android:background="@drawable/lavender_border"
android:padding="8dp"
android:hint="Email"
android:drawableLeft="@drawable/ic_baseline_email_24"
android:drawablePadding="8dp"
android:textColor="@color/grey"/>
<EditText
android:layout_width="350dp"
android:layout_height="60dp"
android:id="@+id/signup_password"
android:layout_marginTop="20dp"
android:background="@drawable/lavender_border"
android:padding="8dp"
android:hint="Password"
android:inputType="textPassword"
android:drawableLeft="@drawable/ic_baseline_lock_24"
android:drawablePadding="8dp"
android:textColor="@color/grey"/>
<EditText
android:layout_width="350dp"
android:layout_height="60dp"
android:id="@+id/signup_confirm"
android:layout_marginTop="20dp"
android:background="@drawable/lavender_border"
android:padding="8dp"
android:hint="Confirm Password"
android:inputType="textPassword"
android:drawableLeft="@drawable/ic_baseline_password_24"
android:drawablePadding="8dp"
android:textColor="@color/grey"/>
<Button
android:layout_width="350dp"
android:layout_height="70dp"
android:layout_marginTop="30dp"
android:text="Sign Up"
android:id="@+id/signup_button"
android:textSize="18sp"
app:cornerRadius = "30dp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/loginRedirectText"
android:text="Already an user? Login"
android:layout_gravity="center"
android:padding="8dp"
android:layout_marginTop="8dp"
android:textSize="18sp"
android:textColor="@color/lavender"/>
</LinearLayout>
</LinearLayout>
</ScrollView>
Step 4: activity_login.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
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:background="@drawable/loginbkg"
tools:context=".LoginActivity">
<ScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_marginTop="430dp"
android:padding="20dp">
<EditText
android:layout_width="350dp"
android:layout_height="60dp"
android:id="@+id/login_email"
android:layout_marginTop="30dp"
android:background="@drawable/lavender_border"
android:padding="8dp"
android:hint="Email"
android:drawableLeft="@drawable/ic_baseline_email_24"
android:drawablePadding="8dp"
android:textColor="@color/grey"/>
<EditText
android:layout_width="350dp"
android:layout_height="60dp"
android:id="@+id/login_password"
android:layout_marginTop="20dp"
android:background="@drawable/lavender_border"
android:padding="8dp"
android:hint="Password"
android:drawableLeft="@drawable/ic_baseline_lock_24"
android:drawablePadding="8dp"
android:textColor="@color/grey"/>
<Button
android:layout_width="350dp"
android:layout_height="70dp"
android:layout_marginTop="30dp"
android:text="Login"
android:id="@+id/login_button"
android:textSize="18sp"
app:cornerRadius = "30dp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/forgot_password"
android:layout_gravity="center"
android:layout_marginTop="6dp"
android:padding="8dp"
android:text="Forgot Password?"
android:textColor="@color/lavender"
android:textSize="16sp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/signupRedirectText"
android:text="Not yet registered? Signup"
android:layout_gravity="center"
android:padding="8dp"
android:layout_marginTop="14dp"
android:textSize="18sp"
android:textColor="@color/lavender"/>
</LinearLayout>
</LinearLayout>
</ScrollView>
</LinearLayout>
Step 5: activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Welcome to our app"
android:textColor="@color/lavender"
android:textSize="36sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
Step 6: SignupActivity.kt
package com.example.loginsignupauth
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Toast
import com.example.loginsignupauth.databinding.ActivitySignupBinding
import com.google.firebase.auth.FirebaseAuth
class SignupActivity : AppCompatActivity() {
private lateinit var binding: ActivitySignupBinding
private lateinit var firebaseAuth: FirebaseAuth
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivitySignupBinding.inflate(layoutInflater)
setContentView(binding.root)
firebaseAuth = FirebaseAuth.getInstance()
binding.signupButton.setOnClickListener{
val email = binding.signupEmail.text.toString()
val password = binding.signupPassword.text.toString()
val confirmPassword = binding.signupConfirm.text.toString()
if (email.isNotEmpty() && password.isNotEmpty() && confirmPassword.isNotEmpty()){
if (password == confirmPassword){
firebaseAuth.createUserWithEmailAndPassword(email, password).addOnCompleteListener{
if (it.isSuccessful){
val intent = Intent(this, LoginActivity::class.java)
startActivity(intent)
} else {
Toast.makeText(this, it.exception.toString(), Toast.LENGTH_SHORT).show()
}
}
} else {
Toast.makeText(this, "Password does not matched", Toast.LENGTH_SHORT).show()
}
} else {
Toast.makeText(this, "Fields cannot be empty", Toast.LENGTH_SHORT).show()
}
}
binding.loginRedirectText.setOnClickListener {
val loginIntent = Intent(this, LoginActivity::class.java)
startActivity(loginIntent)
}
}
}
Step 7: LoginActivity.kt
package com.example.loginsignupauth
import android.content.Intent
import android.graphics.drawable.ColorDrawable
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Patterns
import android.widget.Button
import android.widget.EditText
import android.widget.Toast
import androidx.appcompat.app.AlertDialog
import com.example.loginsignupauth.databinding.ActivityLoginBinding
import com.google.firebase.auth.FirebaseAuth
class LoginActivity : AppCompatActivity() {
private lateinit var binding: ActivityLoginBinding
private lateinit var firebaseAuth: FirebaseAuth
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityLoginBinding.inflate(layoutInflater)
setContentView(binding.root)
firebaseAuth = FirebaseAuth.getInstance()
binding.loginButton.setOnClickListener {
val email = binding.loginEmail.text.toString()
val password = binding.loginPassword.text.toString()
if (email.isNotEmpty() && password.isNotEmpty()){
firebaseAuth.signInWithEmailAndPassword(email, password).addOnCompleteListener{
if (it.isSuccessful){
val intent = Intent(this, MainActivity::class.java)
startActivity(intent)
} else {
Toast.makeText(this, it.exception.toString(), Toast.LENGTH_SHORT).show()
}
}
} else {
Toast.makeText(this, "Fields cannot be empty", Toast.LENGTH_SHORT).show()
}
}
binding.forgotPassword.setOnClickListener {
val builder = AlertDialog.Builder(this)
val view = layoutInflater.inflate(R.layout.dialog_forgot, null)
val userEmail = view.findViewById<EditText>(R.id.editBox)
builder.setView(view)
val dialog = builder.create()
view.findViewById<Button>(R.id.btnReset).setOnClickListener {
compareEmail(userEmail)
dialog.dismiss()
}
view.findViewById<Button>(R.id.btnCancel).setOnClickListener {
dialog.dismiss()
}
if (dialog.window != null){
dialog.window!!.setBackgroundDrawable(ColorDrawable(0))
}
dialog.show()
}
binding.signupRedirectText.setOnClickListener {
val signupIntent = Intent(this, SignupActivity::class.java)
startActivity(signupIntent)
}
}
//Outside onCreate
private fun compareEmail(email: EditText){
if (email.text.toString().isEmpty()){
return
}
if (!Patterns.EMAIL_ADDRESS.matcher(email.text.toString()).matches()){
return
}
firebaseAuth.sendPasswordResetEmail(email.text.toString())
.addOnCompleteListener { task ->
if (task.isSuccessful) {
Toast.makeText(this, "Check your email", Toast.LENGTH_SHORT).show()
}
}
}
}
If you have any queries or errors, please feel free to comment below 🙂
For detailed steps, watch our youtube video: Login and Signup using Firebase Authentication in Android Studio Kotlin
Check our popular post here: How to Create Splash Screen in Android Studio