Implement Splash Screen and Authentication in Social Media Android App

This is the Part 1 of “Build a Social Media App on Android Studio” tutorial, and we are going to cover the following functionalities in this article:
- Creating a Splash Screen
- Authentication Part:
- Registration, and
- Login
Step By Step Implementation
Step 1: Create a New Project
To create a new project in Android Studio please refer to How to Create/Start a New Project in Android Studio. Note that select Java as the programming language.
Step 2: Connect your app to firebase
Go to the Tools > Firebase > Authentication and connect your app to firebase and also add the firebase authentication SDK to your app like the following image.
Then go to the Firebase Console > Authentication > Sign-in method and Enable the Email/Password.
Step 3: Create 4 new empty activities
Go to the package name > right-click > New > Activity > Empty Activity and name the activity as SplashScreen, RegistrationActivity, LoginActivity, and DashboardActivity. You may also refer to this article How to create new empty activity in android studio.
Step 4: Working with the SplashScreen Activity
Navigate to the app > res > layout > activity_splash_screen.xml and add the below code to that file. Below is the code for the activity_splash_screen.xml file.
XML
<?xml version="1.0" encoding="utf-8"?><androidx.constraintlayout.widget.ConstraintLayout android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/background_color" tools:context=".SplashScreen"></androidx.constraintlayout.widget.ConstraintLayout> |
Working with the SplashScreen.java file. Here we are checking that if the user is null then go to LoginActivity. Else move to DashboardActivity.
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
FirebaseUser user=mAuth.getCurrentUser();
if(user==null){
Intent intent = new Intent(SplashScreen.this, LoginActivity.class);
startActivity(intent);
finish();
}
else {
Intent mainIntent= new Intent(SplashScreen.this, DashboardActivity.class);
mainIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(mainIntent);
finish();
}
}
},1000);
Below is the code for the SplashScreen.java file.
Java
package com.example.socialmediaapp;import android.content.Intent;import android.os.Bundle;import android.os.Handler;import androidx.appcompat.app.AppCompatActivity;import com.google.firebase.auth.FirebaseAuth;import com.google.firebase.auth.FirebaseUser;public class SplashScreen extends AppCompatActivity { FirebaseUser currentUser; private FirebaseAuth mAuth; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_splash_screen); mAuth = FirebaseAuth.getInstance(); if (mAuth != null) { currentUser = mAuth.getCurrentUser(); } new Handler().postDelayed(new Runnable() { @Override public void run() { FirebaseUser user = mAuth.getCurrentUser(); if (user == null) { Intent intent = new Intent(SplashScreen.this, LoginActivity.class); startActivity(intent); finish(); } else { Intent mainIntent = new Intent(SplashScreen.this, DashboardActivity.class); mainIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity(mainIntent); finish(); } } }, 1000); }} |
Step 5: Working with the RegistrationActivity Activity
Navigate to the app > res > layout > activity_registration.xml and add the below code to that file. Below is the code for the activity_registration.xml file. Here we have created three EditText for the name, email and password and one Button to Register user.
XML
<?xml version="1.0" encoding="utf-8"?><RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".RegistrationActivity"> <TextView android:id="@+id/teacher" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentStart="true" android:layout_alignParentTop="true" android:layout_marginTop="50dp" android:gravity="center" android:text="Sign Up Here" android:textColor="@color/colorBlack" android:textSize="28sp" android:textStyle="bold|italic" /> <TextView android:id="@+id/names" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@id/teacher" android:layout_marginStart="35dp" android:layout_marginTop="120dp" android:text="Name" android:textColor="@color/colorBlack" /> <EditText android:id="@+id/register_name" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/names" android:layout_alignParentStart="true" android:layout_marginLeft="30dp" android:layout_marginTop="10dp" android:layout_marginRight="30dp" android:background="@drawable/edit" android:drawableStart="@drawable/name" android:hint="Your Name..." android:inputType="text" android:padding="8dp" /> <TextView android:id="@+id/email" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@id/register_name" android:layout_marginStart="35dp" android:layout_marginTop="10dp" android:text="Email" android:textColor="@color/colorBlack" /> <EditText android:id="@+id/register_email" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/email" android:layout_alignParentStart="true" android:layout_marginLeft="30dp" android:layout_marginTop="10dp" android:layout_marginRight="30dp" android:background="@drawable/edit" android:drawableStart="@drawable/ic_email" android:hint="Email..." android:inputType="textEmailAddress" android:padding="8dp" /> <TextView android:id="@+id/pass" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@id/register_email" android:layout_marginStart="35dp" android:layout_marginTop="10dp" android:text="Password" android:textColor="@color/colorBlack" /> <EditText android:id="@+id/register_password" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/pass" android:layout_alignParentStart="true" android:layout_marginLeft="30dp" android:layout_marginTop="10dp" android:layout_marginRight="30dp" android:background="@drawable/edit" android:drawableStart="@drawable/password" android:hint="Password..." android:inputType="textPassword" android:padding="8dp" /> <Button android:id="@+id/register_button" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/register_password" android:layout_marginLeft="30dp" android:layout_marginTop="30dp" android:layout_marginRight="30dp" android:background="@drawable/buttonss" android:padding="4dp" android:text="Create Account" android:textAllCaps="false" android:textColor="@android:color/background_light" android:textSize="24sp" /> <TextView android:id="@+id/homepage" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/register_button" android:layout_centerHorizontal="true" android:layout_marginStart="15dp" android:layout_marginTop="20dp" android:layout_marginEnd="23dp" android:text=" Already Have a Account?Sign In" android:textAlignment="center" android:textColor="@color/colorBlack" android:textSize="17sp" android:textStyle="bold" /></RelativeLayout> |
Working with the RegistrationActivity.java file. Creating a user with the email and password written by the user. If it fails then we will be showing the error.
mAuth.createUserWithEmailAndPassword(emaill, pass).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()){
progressDialog.dismiss();
}
else {
progressDialog.dismiss();
Toast.makeText(RegistrationActivity.this,"Error",Toast.LENGTH_LONG).show();
}
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
progressDialog.dismiss();
Toast.makeText(RegistrationActivity.this,"Error Occurred",Toast.LENGTH_LONG).show();
}
});
Below is the code for the RegistrationActivity.java file.
Java
package com.example.socialmediaapp;import android.app.ProgressDialog;import android.content.Intent;import android.os.Bundle;import android.util.Patterns;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.TextView;import android.widget.Toast;import androidx.annotation.NonNull;import androidx.appcompat.app.ActionBar;import androidx.appcompat.app.AppCompatActivity;import com.google.android.gms.tasks.OnCompleteListener;import com.google.android.gms.tasks.OnFailureListener;import com.google.android.gms.tasks.Task;import com.google.firebase.auth.AuthResult;import com.google.firebase.auth.FirebaseAuth;import com.google.firebase.auth.FirebaseUser;import com.google.firebase.database.DatabaseReference;import com.google.firebase.database.FirebaseDatabase;import java.util.HashMap;public class RegistrationActivity extends AppCompatActivity { private EditText email, password, name; private Button mRegister; private TextView existaccount; private ProgressDialog progressDialog; private FirebaseAuth mAuth; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_registration); ActionBar actionBar = getSupportActionBar(); actionBar.setTitle("Create Account"); actionBar.setDisplayShowHomeEnabled(true); actionBar.setDisplayHomeAsUpEnabled(true); email = findViewById(R.id.register_email); name = findViewById(R.id.register_name); password = findViewById(R.id.register_password); mRegister = findViewById(R.id.register_button); existaccount = findViewById(R.id.homepage); mAuth = FirebaseAuth.getInstance(); progressDialog = new ProgressDialog(this); progressDialog.setMessage("Register"); mRegister.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String emaill = email.getText().toString().trim(); String uname = name.getText().toString().trim(); String pass = password.getText().toString().trim(); if (!Patterns.EMAIL_ADDRESS.matcher(emaill).matches()) { email.setError("Invalid Email"); email.setFocusable(true); } else if (pass.length() < 6) { password.setError("Length Must be greater than 6 character"); password.setFocusable(true); } else { registerUser(emaill, pass, uname); } } }); existaccount.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { startActivity(new Intent(RegistrationActivity.this, LoginActivity.class)); } }); } private void registerUser(String emaill, final String pass, final String uname) { progressDialog.show(); mAuth.createUserWithEmailAndPassword(emaill, pass).addOnCompleteListener(new OnCompleteListener<AuthResult>() { @Override public void onComplete(@NonNull Task<AuthResult> task) { if (task.isSuccessful()) { progressDialog.dismiss(); FirebaseUser user = mAuth.getCurrentUser(); String email = user.getEmail(); String uid = user.getUid(); HashMap<Object, String> hashMap = new HashMap<>(); hashMap.put("email", email); hashMap.put("uid", uid); hashMap.put("name", uname); hashMap.put("onlineStatus", "online"); hashMap.put("typingTo", "noOne"); hashMap.put("image", ""); FirebaseDatabase database = FirebaseDatabase.getInstance(); DatabaseReference reference = database.getReference("Users"); reference.child(uid).setValue(hashMap); Toast.makeText(RegistrationActivity.this, "Registered User " + user.getEmail(), Toast.LENGTH_LONG).show(); Intent mainIntent = new Intent(RegistrationActivity.this, DashboardActivity.class); mainIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity(mainIntent); finish(); } else { progressDialog.dismiss(); Toast.makeText(RegistrationActivity.this, "Error", Toast.LENGTH_LONG).show(); } } }).addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { progressDialog.dismiss(); Toast.makeText(RegistrationActivity.this, "Error Occurred", Toast.LENGTH_LONG).show(); } }); } @Override public boolean onSupportNavigateUp() { onBackPressed(); return super.onSupportNavigateUp(); }} |
Step 6: Working with the LoginActivity Activity
Navigate to the app > res > layout > activity_login.xml and add the below code to that file. Below is the code for the activity_login.xml file. Here We are creating two EditText for email and password and one Button to Login.
XML
<?xml version="1.0" encoding="utf-8"?><LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".LoginActivity"> <ScrollView android:layout_width="match_parent" android:layout_height="match_parent" android:layout_alignParentStart="true" android:layout_alignParentTop="true"> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:id="@+id/welcom" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="120dp" android:layout_marginTop="50dp" android:text="Welcome!" android:textColor="@color/colorBlack" android:textSize="30sp" android:textStyle="italic|bold" /> <TextView android:id="@+id/email" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@id/welcom" android:layout_marginStart="35dp" android:layout_marginTop="120dp" android:text="Email" android:textColor="@color/colorBlack" /> <EditText android:id="@+id/login_email" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/email" android:layout_alignParentStart="true" android:layout_marginLeft="30dp" android:layout_marginTop="5dp" android:layout_marginRight="30dp" android:background="@drawable/edit" android:drawableStart="@drawable/ic_email" android:hint="Email..." android:inputType="textEmailAddress" android:padding="8dp" /> <TextView android:id="@+id/password" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@id/login_email" android:layout_marginStart="32dp" android:layout_marginTop="20dp" android:text="Password" android:textColor="@color/colorBlack" /> <EditText android:id="@+id/login_password" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/password" android:layout_alignParentStart="true" android:layout_marginLeft="30dp" android:layout_marginTop="5dp" android:layout_marginRight="30dp" android:background="@drawable/edit" android:drawableStart="@drawable/password" android:hint="Password..." android:inputType="textPassword" android:padding="8dp" /> <TextView android:id="@+id/forgetp" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/login_password" android:layout_marginStart="210dp" android:layout_marginTop="15dp" android:layout_marginEnd="23dp" android:text="Forget Password?" android:textAlignment="center" android:textColor="@color/colorPrimaryDark" android:textSize="17sp" android:textStyle="bold" /> <Button android:id="@+id/login_button" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/forgetp" android:layout_marginLeft="30dp" android:layout_marginTop="15dp" android:layout_marginRight="30dp" android:background="@drawable/buttonss" android:padding="4dp" android:text="Login" android:textAllCaps="false" android:textColor="@android:color/background_light" android:textSize="24sp" /> <TextView android:id="@+id/needs_new_account" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/login_button" android:layout_centerHorizontal="true" android:layout_marginStart="15dp" android:layout_marginTop="20dp" android:layout_marginEnd="23dp" android:text="Need new Account?Sign Up Here" android:textAlignment="center" android:textColor="@color/colorPrimary" android:textSize="17sp" android:textStyle="bold" /> </RelativeLayout> </ScrollView></LinearLayout> |
Working with the LoginActivity.java file. Signing in user with the email and password written by the user. If it fails then we will be showing the error.
mAuth.signInWithEmailAndPassword(emaill, pass).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
loadingBar.dismiss();
}
else {
loadingBar.dismiss();
Toast.makeText(LoginActivity.this,"Login Failed",Toast.LENGTH_LONG).show();
}
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
loadingBar.dismiss();
Toast.makeText(LoginActivity.this,"Error Occurred",Toast.LENGTH_LONG).show();
}
});
Below is the code for the LoginActivity.java file.
Java
package com.example.socialmediaapp;import android.app.AlertDialog;import android.app.ProgressDialog;import android.content.DialogInterface;import android.content.Intent;import android.os.Bundle;import android.text.InputType;import android.util.Patterns;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.LinearLayout;import android.widget.TextView;import android.widget.Toast;import androidx.annotation.NonNull;import androidx.appcompat.app.ActionBar;import androidx.appcompat.app.AppCompatActivity;import com.google.android.gms.tasks.OnCompleteListener;import com.google.android.gms.tasks.OnFailureListener;import com.google.android.gms.tasks.Task;import com.google.firebase.auth.AuthResult;import com.google.firebase.auth.FirebaseAuth;import com.google.firebase.auth.FirebaseUser;import com.google.firebase.database.DatabaseReference;import com.google.firebase.database.FirebaseDatabase;import java.util.HashMap;public class LoginActivity extends AppCompatActivity { private EditText email, password, name; private Button mlogin; private TextView newdnewaccount, reocverpass; FirebaseUser currentUser; private ProgressDialog loadingBar; private FirebaseAuth mAuth; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); ActionBar actionBar = getSupportActionBar(); actionBar.setTitle("Create Account"); actionBar.setDisplayShowHomeEnabled(true); actionBar.setDisplayHomeAsUpEnabled(true); // initialising the layout items email = findViewById(R.id.login_email); password = findViewById(R.id.login_password); newdnewaccount = findViewById(R.id.needs_new_account); reocverpass = findViewById(R.id.forgetp); mAuth = FirebaseAuth.getInstance(); mlogin = findViewById(R.id.login_button); loadingBar = new ProgressDialog(this); mAuth = FirebaseAuth.getInstance(); // checking if user is null or not if (mAuth != null) { currentUser = mAuth.getCurrentUser(); } mlogin.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String emaill = email.getText().toString().trim(); String pass = password.getText().toString().trim(); // if format of email doesn't matches return null if (!Patterns.EMAIL_ADDRESS.matcher(emaill).matches()) { email.setError("Invalid Email"); email.setFocusable(true); } else { loginUser(emaill, pass); } } }); // If new account then move to Registration Activity newdnewaccount.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { startActivity(new Intent(LoginActivity.this, RegistrationActivity.class)); } }); // Recover Your Password using email reocverpass.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { showRecoverPasswordDialog(); } }); } private void showRecoverPasswordDialog() { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("Recover Password"); LinearLayout linearLayout = new LinearLayout(this); final EditText emailet = new EditText(this);//write your registered email emailet.setText("Email"); emailet.setMinEms(16); emailet.setInputType(InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS); linearLayout.addView(emailet); linearLayout.setPadding(10, 10, 10, 10); builder.setView(linearLayout); builder.setPositiveButton("Recover", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { String emaill = emailet.getText().toString().trim(); beginRecovery(emaill);//send a mail on the mail to recover password } }); builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); builder.create().show(); } private void beginRecovery(String emaill) { loadingBar.setMessage("Sending Email...."); loadingBar.setCanceledOnTouchOutside(false); loadingBar.show(); // send reset password email mAuth.sendPasswordResetEmail(emaill).addOnCompleteListener(new OnCompleteListener<Void>() { @Override public void onComplete(@NonNull Task<Void> task) { loadingBar.dismiss(); if (task.isSuccessful()) { Toast.makeText(LoginActivity.this, "Done sent", Toast.LENGTH_LONG).show(); } else { Toast.makeText(LoginActivity.this, "Error Occurred", Toast.LENGTH_LONG).show(); } } }).addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { loadingBar.dismiss(); Toast.makeText(LoginActivity.this, "Error Failed", Toast.LENGTH_LONG).show(); } }); } private void loginUser(String emaill, String pass) { loadingBar.setMessage("Logging In...."); loadingBar.show(); // sign in with email and password after authenticating mAuth.signInWithEmailAndPassword(emaill, pass).addOnCompleteListener(new OnCompleteListener<AuthResult>() { @Override public void onComplete(@NonNull Task<AuthResult> task) { if (task.isSuccessful()) { loadingBar.dismiss(); FirebaseUser user = mAuth.getCurrentUser(); if (task.getResult().getAdditionalUserInfo().isNewUser()) { String email = user.getEmail(); String uid = user.getUid(); HashMap<Object, String> hashMap = new HashMap<>(); hashMap.put("email", email); hashMap.put("uid", uid); hashMap.put("name", ""); hashMap.put("onlineStatus", "online"); hashMap.put("typingTo", "noOne"); hashMap.put("phone", ""); hashMap.put("image", ""); hashMap.put("cover", ""); FirebaseDatabase database = FirebaseDatabase.getInstance(); // store the value in Database in "Users" Node DatabaseReference reference = database.getReference("Users"); // storing the value in Firebase reference.child(uid).setValue(hashMap); } Toast.makeText(LoginActivity.this, "Registered User " + user.getEmail(), Toast.LENGTH_LONG).show(); Intent mainIntent = new Intent(LoginActivity.this, DashboardActivity.class); mainIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity(mainIntent); finish(); } else { loadingBar.dismiss(); Toast.makeText(LoginActivity.this, "Login Failed", Toast.LENGTH_LONG).show(); } } }).addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { loadingBar.dismiss(); Toast.makeText(LoginActivity.this, "Error Occurred", Toast.LENGTH_LONG).show(); } }); } @Override public boolean onSupportNavigateUp() { onBackPressed(); return super.onSupportNavigateUp(); }} |
Step 7: Working with the AndroidManifest.xml file
Navigate to the AndroidManifest.xml file and add the below permission for getting internet permission in the app.
<uses-permission android:name=”android.permission.INTERNET”/>
Also, make the SplashScreen Activity as the welcome screen. Refer to the following code
<activity android:name=".SplashScreen">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
Below is the complete code for the AndroidManifest.xml file.
XML
<?xml version="1.0" encoding="utf-8"?> package="com.example.socialmediaapp"> <uses-permission android:name="android.permission.INTERNET" /> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.SocialMediaApp"> <activity android:name=".DashboardActivity"></activity> <activity android:name=".LoginActivity" /> <activity android:name=".RegistrationActivity" /> <activity android:name=".SplashScreen"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application></manifest> |
Step 8: Working with the colors.xml file
Go to the app > res > values > colors.xml file and use the following color
XML
<?xml version="1.0" encoding="utf-8"?><resources> <color name="colorPrimary">#CC2E76BE</color> <color name="colorPrimaryDark">#CC073D74</color> <color name="colorAccent">#0A527E</color> <color name="colorBlack">#000000</color> <color name="colorWhite">#fff</color> <color name="colorGray">#F5F1F1</color> <color name="colorgray01">#959595</color> <color name="colorGray02">#f5f0f0</color> <color name="colorGreen">#17581A</color> <color name="colorRed">#F4511E</color> <color name="btnRed">#E61313</color> <color name="btnedit">#2CA7E0</color> <color name="neutral">#0a1b97</color> <color name="colordrawer">#2B2C2E</color></resources> |
Output:
Registration:
Login:
After successfully authenticated the admin can see the users in the firebase console like the following
For all the drawable file used in this article please refer to this link: https://drive.google.com/drive/folders/1M_knOH_ugCuwSP5nkYzeD4dRp-Honzbe?usp=sharing
Below is the file structure after performing these operations:
Note: In this part, there is nothing to do with the DashboardActivity.




