Screens(XML)
1. activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="<http://schemas.android.com/apk/res/android>"
xmlns:tools="<http://schemas.android.com/tools>"
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white"
android:gravity="center"
tools:context=".MainActivity">
<!-- ImageView for the logo -->
<ImageView
android:id="@+id/logoImage"
android:layout_width="100dp"
android:layout_height="100dp"
android:contentDescription="App Logo"
android:src="@drawable/logo" />
</LinearLayout>
2. activity_register.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.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:background="@color/white"
tools:context=".RegisterActivity">
<!-- Top App Bar -->
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/topAppBar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:navigationContentDescription="Back"
app:navigationIcon="@drawable/arrow_left"
app:title="Register" />
<!-- Content Layout -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="?attr/actionBarSize"
android:gravity="center_vertical"
android:orientation="vertical"
android:padding="16dp">
<ImageView
android:id="@+id/logoImageView"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_gravity="center"
android:layout_marginBottom="22dp"
android:contentDescription="Logo"
android:src="@drawable/logo" />
<!-- Email Field -->
<com.google.android.material.textfield.TextInputLayout
style="@style/Widget.Material3.TextInputLayout.OutlinedBox"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Email">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/emailInput"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textEmailAddress" />
</com.google.android.material.textfield.TextInputLayout>
<!-- Username Field -->
<com.google.android.material.textfield.TextInputLayout
style="@style/Widget.Material3.TextInputLayout.OutlinedBox"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:hint="Username">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/usernameInput"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="text" />
</com.google.android.material.textfield.TextInputLayout>
<!-- Password Field -->
<com.google.android.material.textfield.TextInputLayout
style="@style/Widget.Material3.TextInputLayout.OutlinedBox"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:hint="Password">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/passwordInput"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textPassword" />
</com.google.android.material.textfield.TextInputLayout>
<!-- Confirm Password Field -->
<com.google.android.material.textfield.TextInputLayout
style="@style/Widget.Material3.TextInputLayout.OutlinedBox"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:hint="Confirm Password">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/confirmPasswordInput"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textPassword" />
</com.google.android.material.textfield.TextInputLayout>
<!-- Register Button -->
<com.google.android.material.button.MaterialButton
android:id="@+id/registerButton"
style="@style/Widget.Material3.Button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="24dp"
android:text="Register" />
<!-- Login Link -->
<TextView
android:id="@+id/loginLink"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginTop="16dp"
android:text="Already have an account? Log in"
android:textStyle="bold" />
</LinearLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
2. activity_login.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.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:background="@color/white"
tools:context=".LoginActivity">
<!-- Top App Bar -->
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/topAppBar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:navigationContentDescription="Back"
app:navigationIcon="@drawable/arrow_left"
app:title="Login" />
<!-- Content Layout -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="?attr/actionBarSize"
android:gravity="center_vertical"
android:orientation="vertical"
android:padding="16dp">
<ImageView
android:id="@+id/logoImageView"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_gravity="center"
android:layout_marginBottom="22dp"
android:contentDescription="Logo"
android:src="@drawable/logo" />
<!-- Email Field -->
<com.google.android.material.textfield.TextInputLayout
style="@style/Widget.Material3.TextInputLayout.OutlinedBox"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Email">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/emailInput"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textEmailAddress" />
</com.google.android.material.textfield.TextInputLayout>
<!-- Password Field -->
<com.google.android.material.textfield.TextInputLayout
style="@style/Widget.Material3.TextInputLayout.OutlinedBox"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:hint="Password">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/passwordInput"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textPassword" />
</com.google.android.material.textfield.TextInputLayout>
<!-- ProgressBar to indicate loading state -->
<ProgressBar
android:id="@+id/progressBar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="24dp"
android:indeterminate="true"
android:visibility="gone" />
<!-- Login Button -->
<com.google.android.material.button.MaterialButton
android:id="@+id/loginButton"
style="@style/Widget.Material3.Button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="24dp"
android:text="Login" />
<!-- Register Link -->
<TextView
android:id="@+id/registerLink"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginTop="12dp"
android:text="Don't have an account? Register"
android:textStyle="bold" />
</LinearLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
Java Codes - Main Logic
1. Main Activity
package com.example.techsupporthub;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.widget.Toast;
import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;
public class MainActivity extends AppCompatActivity {
private final Handler handler = new Handler();
private FirebaseAuth mAuth;
private DatabaseReference databaseReference;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
setContentView(R.layout.activity_main);
mAuth = FirebaseAuth.getInstance();
databaseReference = FirebaseDatabase.getInstance().getReference(Constants.USERS_DB);
}
@Override
protected void onResume() {
super.onResume();
// Call the method to check user authentication and navigate after a delay
handler.postDelayed(new Runnable() {
@Override
public void run() {
checkAuthentication();
}
}, 3000); // Delay of 3 seconds
}
private void checkAuthentication() {
FirebaseUser currentUser = mAuth.getCurrentUser();
if (currentUser != null) {
// User is authenticated, proceed to fetch user role
fetchUserRole(currentUser.getUid());
} else {
// User is not authenticated, redirect to LoginActivity
startActivity(new Intent(MainActivity.this, LoginActivity.class));
finish();
}
}
private void fetchUserRole(String userId) {
databaseReference.child(userId).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
if (snapshot.exists()) {
String role = snapshot.child("role").getValue(String.class);
navigateToRoleSpecificActivity(role);
} else {
Toast.makeText(MainActivity.this, "User data not found", Toast.LENGTH_SHORT).show();
mAuth.signOut();
startActivity(new Intent(MainActivity.this, LoginActivity.class));
finish();
}
}
@Override
public void onCancelled(DatabaseError error) {
Toast.makeText(MainActivity.this, "Error: " + error.getMessage(), Toast.LENGTH_SHORT).show();
}
});
}
private void navigateToRoleSpecificActivity(String role) {
Intent intent;
if ("admin".equalsIgnoreCase(role)) {
intent = new Intent(MainActivity.this, AdminActivity.class);
} else if ("staff".equalsIgnoreCase(role)) {
intent = new Intent(MainActivity.this, StaffActivity.class);
} else if ("user".equalsIgnoreCase(role)) {
intent = new Intent(MainActivity.this, UserActivity.class);
} else {
Toast.makeText(this, "Unknown role: " + role, Toast.LENGTH_SHORT).show();
return;
}
startActivity(intent);
finish();
}
}
2. Constants.java
package com.example.techsupporthub;
public class Constants {
public static final String USERS_DB = "users";
}
User Model
package com.example.techsupporthub;
public class UserModel {
private String id;
private String username;
private String email;
private String role;
private long createdAt;
public UserModel() {
}
public UserModel(String id, String username, String email, String role, long createdAt) {
this.id = id;
this.username = username;
this.email = email;
this.role = role;
this.createdAt = createdAt;
}
public String getId() {
return id;
}
public String getUsername() {
return username;
}
public String getEmail() {
return email;
}
public String getRole() {
return role;
}
public long getCreatedAt() {
return createdAt;
}
}
3. RegisterActivity.java
package com.example.techsupporthub;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import com.google.android.material.textfield.TextInputEditText;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import java.util.Objects;
public class RegisterActivity extends AppCompatActivity {
private TextInputEditText emailInput, usernameInput, passwordInput, confirmPasswordInput;
private FirebaseAuth firebaseAuth;
private DatabaseReference databaseReference;
private ProgressDialog progressDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_register);
// Initialize Firebase
firebaseAuth = FirebaseAuth.getInstance();
databaseReference = FirebaseDatabase.getInstance().getReference(Constants.USERS_DB);
// Initialize views
emailInput = findViewById(R.id.emailInput);
usernameInput = findViewById(R.id.usernameInput);
passwordInput = findViewById(R.id.passwordInput);
confirmPasswordInput = findViewById(R.id.confirmPasswordInput);
// Initialize ProgressDialog
progressDialog = new ProgressDialog(this);
progressDialog.setMessage("Registering user...");
progressDialog.setCancelable(false);
findViewById(R.id.registerButton).setOnClickListener(v -> registerUser());
}
private void registerUser() {
String email = Objects.requireNonNull(emailInput.getText()).toString().trim();
String username = Objects.requireNonNull(usernameInput.getText()).toString().trim();
String password = Objects.requireNonNull(passwordInput.getText()).toString().trim();
String confirmPassword = Objects.requireNonNull(confirmPasswordInput.getText()).toString().trim();
// Validate inputs
if (TextUtils.isEmpty(email)) {
emailInput.setError("Email is required");
emailInput.requestFocus();
return;
}
if (TextUtils.isEmpty(username)) {
usernameInput.setError("Username is required");
usernameInput.requestFocus();
return;
}
if (TextUtils.isEmpty(password)) {
passwordInput.setError("Password is required");
passwordInput.requestFocus();
return;
}
if (password.length() < 6) {
passwordInput.setError("Password must be at least 6 characters");
passwordInput.requestFocus();
return;
}
if (!password.equals(confirmPassword)) {
confirmPasswordInput.setError("Passwords do not match");
confirmPasswordInput.requestFocus();
return;
}
// Show progress dialog
progressDialog.show();
// Create user in Firebase Auth
firebaseAuth.createUserWithEmailAndPassword(email, password)
.addOnCompleteListener(task -> {
progressDialog.dismiss(); // Dismiss the progress dialog after task completion
if (task.isSuccessful()) {
String userId = Objects.requireNonNull(firebaseAuth.getCurrentUser()).getUid();
long createdAt = System.currentTimeMillis();
// Create UserModel and save to Firebase Database
UserModel userModel = new UserModel(userId, username, email, "user", createdAt);
databaseReference.child(userId).setValue(userModel)
.addOnCompleteListener(dbTask -> {
if (dbTask.isSuccessful()) {
Toast.makeText(RegisterActivity.this, "Registration successful!", Toast.LENGTH_SHORT).show();
// Navigate to UserActivity after successful registration
Intent intent = new Intent(RegisterActivity.this, UserActivity.class);
startActivity(intent);
finish(); // Close RegisterActivity
} else {
Toast.makeText(RegisterActivity.this, "Failed to save user data: " + dbTask.getException().getMessage(), Toast.LENGTH_SHORT).show();
}
});
} else {
Toast.makeText(RegisterActivity.this, "Registration failed: " + task.getException().getMessage(), Toast.LENGTH_SHORT).show();
}
});
}
}
4. LoginActivity.java
package com.example.techsupporthub;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import com.google.android.material.button.MaterialButton;
import com.google.android.material.textfield.TextInputEditText;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;
public class LoginActivity extends AppCompatActivity {
private TextInputEditText emailInput, passwordInput;
private MaterialButton loginButton;
private FirebaseAuth mAuth;
private DatabaseReference databaseReference;
private ProgressDialog progressDialog; // Add ProgressDialog instance
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
emailInput = findViewById(R.id.emailInput);
passwordInput = findViewById(R.id.passwordInput);
loginButton = findViewById(R.id.loginButton);
mAuth = FirebaseAuth.getInstance();
databaseReference = FirebaseDatabase.getInstance().getReference(Constants.USERS_DB);
// Initialize ProgressDialog
progressDialog = new ProgressDialog(LoginActivity.this);
progressDialog.setMessage("Logging in...");
progressDialog.setCancelable(false); // Set to false to prevent dismissing by tapping outside
loginButton.setOnClickListener(view -> loginUser());
// Navigation links
findViewById(R.id.registerLink).setOnClickListener(v -> startActivity(new Intent(LoginActivity.this, RegisterActivity.class)));
}
private void loginUser() {
String email = emailInput.getText().toString().trim();
String password = passwordInput.getText().toString().trim();
if (TextUtils.isEmpty(email)) {
emailInput.setError("Email is required");
return;
}
if (TextUtils.isEmpty(password)) {
passwordInput.setError("Password is required");
return;
}
// Show progress dialog while login is in progress
progressDialog.show();
mAuth.signInWithEmailAndPassword(email, password).addOnCompleteListener(task -> {
progressDialog.dismiss(); // Hide progress dialog after completion
if (task.isSuccessful()) {
String userId = mAuth.getCurrentUser().getUid();
fetchUserRole(userId);
} else {
Toast.makeText(LoginActivity.this, "Login failed: " + task.getException().getMessage(), Toast.LENGTH_SHORT).show();
}
});
}
private void fetchUserRole(String userId) {
// Show progress dialog while fetching user role
progressDialog.show();
databaseReference.child(userId).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
progressDialog.dismiss(); // Hide progress dialog after data is fetched
if (snapshot.exists()) {
String role = snapshot.child("role").getValue(String.class);
navigateToRoleSpecificActivity(role);
} else {
Toast.makeText(LoginActivity.this, "User data not found", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
progressDialog.dismiss(); // Hide progress dialog on error
Toast.makeText(LoginActivity.this, "Error: " + error.getMessage(), Toast.LENGTH_SHORT).show();
}
});
}
private void navigateToRoleSpecificActivity(String role) {
Intent intent;
if ("admin".equalsIgnoreCase(role)) {
intent = new Intent(LoginActivity.this, AdminActivity.class);
} else if ("staff".equalsIgnoreCase(role)) {
intent = new Intent(LoginActivity.this, StaffActivity.class);
} else if ("user".equalsIgnoreCase(role)) {
intent = new Intent(LoginActivity.this, UserActivity.class);
} else {
Toast.makeText(this, "Unknown role: " + role, Toast.LENGTH_SHORT).show();
return;
}
startActivity(intent);
finish();
}
}
Aunthenticated Users Activity (admin,user,staff)