*Tulisan akan muncul*
*di sini*
Penelusuran : Activity Register, Activity Login, Role Admin, Role Pengguna, Android Studio, Firebase Database.
Perjalanan belajar kode untuk bahasa java mengunakan android studio koneksi data melalui firebase atau Firebase Console karena awal belajar hanya membuat data CRUD (Create Read Update Delete), sekarang saya mencoba berbagi tutorial dan kode untuk membuat sistem register atau mendaftar membuat akun agar pengguna dapat secara mudah akses aplikasi yang kita buat pengguna perlu registrasi terlebih dahulu untuk akses login mengunakan aplikasi kita.
Disini saat membangun aplikasi kita ingin logika nya saat mendaftar atau login memiliki peran email sebagai user pengguna dan user sebagai admin, jadi funggi pengguna di buat role untuk fitur bagi admin juga fitur bagi pengguna mesti di perhatikan adalah peran pengguna setelah login berhasil dan mengarahkan mereka ke dashboard yang sesuai.
Oke kita langsung saja pada judul share kali ini tentang cara membuat aplikasi dimana ada peran pengguna dan admin untuk jelajah aplikasi didalamnya. lau apa saja yang kita persiapkan.
Langkah langkah Penyiapan
1. Koneksikan proyek aplikasi di android studio dengan Firebase Console
2. Atur rules realtime database
3. Atur rules storage firebase
4. Menempatkan implementation yang mendukung proyek aplikasi pada build gradle
5. Menempatkan permissions kode pada manifest proyek aplikasi
6. Membuat Constant class java untuk koneksi fungsi data pemanggilan di perlukan untuk data
7. Membuat Halama Pembuka atau Splascreen
8. Membuat Halaman atau Activiy baru untuk Register
9. Membuat Halaman atau Activity baru untuk Login
10. Membuat Halaman Dasboard Admin
11. Membuat Halaman Dasboard Pengguna
Memulai suatu proyek aplikasi tentu nantinya kita menentukan tempat penyimpanan data untuk progresh daftar akun bagi user atau pengguna. Kita perlu struktur database yang jelas untuk menyimpan informasi pengguna dan peran mereka. Disini Kita akan menggunakan Firebase Realtime Database.
Untuk penyiapan koneksi Firebase Console, teman dapat mempelajari nya disini terlebih dahulu sehubungan dengan tutorial kita share kali ini teruntuk bagi yang ingin membuat kode fungsi peran admin dan pengguna maka kita langgung saja pada fokus share kita disini, semoga bermanfaat
1. Koneksikan proyek aplikasi di android studio dengan Firebase Console
Tahapan ini kita abaikan saja temans yang sudah bisa akses Firebase Console dan membagun database sesuai nama di aplikasi yang akan kitaa bangun melalui android studio
2. Atur rules realtime database
Dalam aturan data firebase agar aplikasi yang akan dirilis atau digunakan secara publik, teman harus segera mengatur aturan ini menjadi lebih aman. Mengingat kita sudah memiliki sistem login, kita bisa menggunakan aturan yang lebih spesifik yang memerlukan pengguna untuk login (terautentikasi), Ambil Kode yang ada dibawah ini dan menuliskannya pada Firebase Console.
Pilih Realtime Database - klik Rules, paste kode untuk rules
Kode rules realtime database
{
"rules": {
"users": {
"$uid": {
// Pengguna hanya bisa membaca/menulis datanya sendiri
// Ini mencakup semua properti data user di bawah $uid, termasuk 'profileImageUrl', 'name', 'phone', 'isOnline', 'role'
".read": "auth != null && auth.uid == $uid",
".write": "auth != null && auth.uid == $uid"
}
},
}
}
3. Atur rules storage firebase
Tahap yang sama untuk rules Realtime Database, pada Firebase Console pilih dan aktifkan Storage
Pilih Storage - klik Rules, paste kode untuk rules storage
Kode rules storage firebase
rules_version = '2';
// Craft rules based on data in your Firestore database
// allow write: if firestore.get(
// /databases/(default)/documents/users/$(request.auth.uid)).data.isAdmin;
service firebase.storage {
match /b/{bucket}/o {
match /{allPaths=**} {
allow read, write: if request.auth != null;
}
}
}
4. Menempatkan implementation yang mendukung proyek aplikasi pada build gradle
Pastikan teman memiliki dependencies firebase yang kompatible dengan aplikasi gunkan yang terkini atau terbaru, yang tempatnya adalah di file build.gradle (Module :app). karena android studio saat ini automatis implentasi kita adalah libs. teman dapat gunkan seperti biasa
implementation 'com.google.android.gms:play-services-auth:23.0.0'
implementation 'com.google.firebase:firebase-storage:21.0.0'
Kode Implementation pada build.gradle
dependencies {
implementation(libs.firebase.auth)
implementation(libs.firebase.database)
implementation(libs.firebase.storage)
implementation(platform("com.google.firebase:firebase-bom:33.1.2"))
// Usahakan versi firebase terbaru
}
5. Menempatkan permissions kode pada manifest proyek aplikasi
Pastikan aplikasi teman memiliki izin atas apa saja yang digunkan pada aplikasi, hal ini dideklarasikan di AndroidManifest.xml:
Kode pada Manifest
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission
android:name="android.permission.READ_EXTERNAL_STORAGE"
tools:ignore="ScopedStorage" />
<application
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.BelajarRegAdmin"
tools:targetApi="34">
<activity
android:name=".UserDashboardActivity"
android:exported="false" />
<activity
android:name=".AdminDashboardActivity"
android:exported="false" />
<activity
android:name=".LoginActivity"
android:exported="false" />
<activity
android:name=".Register"
android:exported="false" />
<activity
android:name=".Splascreen"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
6. Membuat Constant class java untuk koneksi fungsi data pemanggilan di perlukan untuk data
Menambahkan path spesifik untuk data di Constant.java adalah ide membuat kode teman lebih rapi, mudah dikelola, dan mengurangi kemungkinan typo pada path Firebase
Kode Constant
package com.rizaldrc.belajarregadmin;
public class Constant {
// --- Log Tags ---
// Digunakan untuk Logcat agar mudah memfilter pesan log dari aplikasi Anda
public static final String APP_TAG = "BelajarRegAdmin_App_Log"; // Ganti dengan nama aplikasi Anda
// --- Firebase Realtime Database Paths ---
// Nama node atau path utama di Firebase Realtime Database
public static final String DB_PATH_USERS = "users";
// Tambahkan path lain jika Anda memiliki node database lain
// --- Firebase Cloud Storage Paths ---
// Nama folder di Firebase Cloud Storage untuk menyimpan file
public static final String STORAGE_PATH_THUMBNAILS = "thumbnails";
public static final String STORAGE_PATH_PROFILE_IMAGES = "profile_images";
// --- User Roles ---
// Definisi peran pengguna dalam aplikasi
public static final String ROLE_ADMIN = "admin";
public static final String ROLE_USER = "user";
// --- Admin Email ---
// Email yang akan diidentifikasi sebagai admin saat pendaftaran atau login.
// PENTING: Untuk produksi, identifikasi admin sebaiknya dilakukan melalui UID atau mekanisme yang lebih aman.
// Ini hanya untuk kemudahan pengembangan awal.
public static final String ADMIN_EMAIL = "admin@example.com"; // GANTI DENGAN EMAIL ADMIN YANG INGIN ANDA DAFTARKAN
// --- Lain-lain (jika ada) ---
}
7. Membuat Halama Pembuka atau Splascreen
Halaman ini adalah halaman kata sambutan atau pembuka saat pengguna memulai membuka aplikasi kita, atau lounching halaman pertama kita.
Kode XML Activity Splascreen ( activity_splascreen.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:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".Splascreen">
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:background="@drawable/bgroundapppn"
android:layout_height="match_parent">
<TextView
android:id="@+id/textView1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAllCaps="true"
android:padding="10dp"
android:textColor="#2196F3"
android:layout_marginBottom="10dp"
android:text="Selamat Datang"
android:textSize="20sp"
android:textStyle="bold"
android:textAlignment="center"/>
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/img_tentang"
android:layout_width="90dp"
android:layout_marginStart="10dp"
android:src="@drawable/logosaya"
android:layout_height="80dp"/>
<LinearLayout
android:orientation="vertical"
android:padding="2dp"
android:gravity="center"
android:layout_gravity="center"
android:layout_width="match_parent"
android:layout_height="80dp">
<TextView
android:id="@+id/linelist10"
android:textColor="@color/white"
android:textStyle="bold"
android:layout_marginStart="10dp"
android:textSize="16sp"
android:text="Tabelo"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<TextView
android:textColor="@color/black"
android:textStyle="normal"
android:textSize="4sp"
android:layout_marginStart="10dp"
android:background="#FF9800"
android:maxLines="1"
android:text=""
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textStyle="italic"
android:layout_marginStart="10dp"
android:textSize="14sp"
android:textColor="@color/white"
android:text="DI APLIKASI SAYA"
android:background="#04773D"/>
</LinearLayout>
</LinearLayout>
<ImageView
android:layout_width="290dp"
android:src="@drawable/ic_launcher_foreground"
android:scaleType="fitCenter"
android:layout_gravity="center_horizontal"
android:layout_height="170dp"/>
<ProgressBar
android:id="@+id/progressBar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="180dp"
android:indeterminateTint="@color/black"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textStyle="italic"
android:textSize="18sp"
android:textAlignment="center"
android:layout_marginTop="20dp"
android:textColor="@color/black"
android:text="Tahun 2025"
android:background="#F4FAF7"/>
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
Kode pada folder drawable beri nama baground_transbal
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<gradient
android:angle="90"
android:endColor="#0000"
android:startColor="#30000000"
android:type="linear"/>
</shape>
Kode Java Splascreen ( Splascreen.java )
package com.rizaldrc.belajarregadmin;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
public class Splascreen extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
setContentView(R.layout.activity_splascreen);
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
return insets;
});
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
Intent intent = new Intent(Splascreen.this, LoginActivity.class);
startActivity(intent);
finish();
}
}, 2000);
}
}
8. Membuat Halaman atau Activiy baru untuk Register
Nah ini hal utama sesusi judul share kita pada blog ini pada aplikasi kita memiliki halaman dimana pengguna saat masuk atau login mesti mendaftar terlebuih dahulu. Tempatkan kode untuk layout register aplikasi kita.
sorot resh - layout. klik kanan pilih new pilih activity Empty Views Activity beri nama " Register"
Kode XML Layout Untuk Register ( activity_register.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:id="@+id/mainreg"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal"
android:orientation="vertical"
android:padding="24dp"
tools:context=".RegisterActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="32dp"
android:text="Daftar Akun Baru"
android:textColor="@color/black"
android:textSize="32sp"
android:textStyle="bold" />
<EditText
android:id="@+id/etEmailRegister"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:background="@drawable/rounded_edittext_baground"
android:hint="Email"
android:inputType="textEmailAddress"
android:padding="12dp" />
<EditText
android:id="@+id/etPasswordRegister"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:background="@drawable/rounded_edittext_baground"
android:hint="Password"
android:inputType="textPassword"
android:padding="12dp" />
<EditText
android:id="@+id/etNameRegister"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:background="@drawable/rounded_edittext_baground"
android:hint="Nama Lengkap"
android:inputType="textPersonName"
android:padding="12dp" />
<EditText
android:id="@+id/etPhoneRegister"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="24dp"
android:background="@drawable/rounded_edittext_baground"
android:hint="Nomor Telepon"
android:inputType="phone"
android:padding="12dp" />
<Button
android:id="@+id/btnRegister"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:backgroundTint="@color/black"
android:padding="14dp"
android:text="Daftar"
android:textColor="@android:color/white"
android:textSize="18sp" />
<TextView
android:id="@+id/tvGoToLogin"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:clickable="true"
android:focusable="true"
android:padding="8dp"
android:text="Sudah punya akun? Login di sini"
android:textColor="@color/black"
android:textSize="16sp" />
<ProgressBar
android:id="@+id/progressBarRegister"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:visibility="gone" />
</LinearLayout>
Kode pada folder drawable beri nama rounded_edittext_baground
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#F0F0F0" />
<corners android:radius="8dp" />
<stroke
android:width="1dp"
android:color="#D0D0D0" />
</shape>
Kode Java Register ( Register.java )
package com.rizaldrc.belajarregadmin;
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import androidx.activity.EdgeToEdge;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
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;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import java.util.HashMap;
import java.util.Map;
public class Register extends AppCompatActivity {
private EditText etEmail, etPassword, etName, etPhone;
private Button btnRegister;
private TextView tvGoToLogin;
private ProgressBar progressBar;
private FirebaseAuth mAuth;
private DatabaseReference mDatabase;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
setContentView(R.layout.activity_register);
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.mainreg), (v, insets) -> {
Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
return insets;
});
etEmail = findViewById(R.id.etEmailRegister);
etPassword = findViewById(R.id.etPasswordRegister);
etName = findViewById(R.id.etNameRegister);
etPhone = findViewById(R.id.etPhoneRegister);
btnRegister = findViewById(R.id.btnRegister);
tvGoToLogin = findViewById(R.id.tvGoToLogin);
progressBar = findViewById(R.id.progressBarRegister);
// Inisialisasi Firebase Auth dan Database
mAuth = FirebaseAuth.getInstance();
mDatabase = FirebaseDatabase.getInstance().getReference(Constant.DB_PATH_USERS);
// Listener untuk tombol Register
btnRegister.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
registerUser();
}
});
// Listener untuk teks "Login di sini"
tvGoToLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(Register.this, LoginActivity.class));
finish(); // Tutup Register agar tidak bisa kembali dengan tombol kembali ke awal
}
});
}
private void registerUser() {
String email = etEmail.getText().toString().trim();
String password = etPassword.getText().toString().trim();
String name = etName.getText().toString().trim();
String phone = etPhone.getText().toString().trim();
// Validasi input
if (TextUtils.isEmpty(email)) {
etEmail.setError("Email wajib diisi!");
return;
}
if (TextUtils.isEmpty(password)) {
etPassword.setError("Password wajib diisi!");
return;
}
if (password.length() < 6) {
etPassword.setError("Password minimal 6 karakter!");
return;
}
if (TextUtils.isEmpty(name)) {
etName.setError("Nama wajib diisi!");
return;
}
if (TextUtils.isEmpty(phone)) {
etPhone.setError("Nomor telepon wajib diisi!");
return;
}
progressBar.setVisibility(View.VISIBLE); // Tampilkan progress bar
// Buat user di Firebase Authentication
mAuth.createUserWithEmailAndPassword(email, password)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
progressBar.setVisibility(View.GONE); // Sembunyikan progress bar
if (task.isSuccessful()) {
FirebaseUser user = mAuth.getCurrentUser();
if (user != null) {
String userId = user.getUid();
String userRole = Constant.ROLE_USER; // Default peran adalah 'user'
// Cek jika email adalah email admin yang telah ditentukan
if (email.equals(Constant.ADMIN_EMAIL)) {
userRole = Constant.ROLE_ADMIN; // Jika cocok, set peran jadi 'admin'
}
// Simpan data pengguna ke Firebase Realtime Database
Map<String, Object> userMap = new HashMap<>();
userMap.put("email", email);
userMap.put("name", name);
userMap.put("phone", phone);
userMap.put("profileImageUrl", ""); // Default: kosong
userMap.put("role", userRole);
userMap.put("isOnline", false); // Default: offline
mDatabase.child(userId).setValue(userMap)
.addOnSuccessListener(aVoid -> {
Log.d("Register", "User registered and profile saved: " + userId);
Toast.makeText(Register.this, "Pendaftaran berhasil!", Toast.LENGTH_SHORT).show();
// Arahkan ke halaman Login setelah berhasil daftar
startActivity(new Intent(Register.this, LoginActivity.class));
finish();
})
.addOnFailureListener(e -> {
Log.e("Register", "Failed to save user profile: " + e.getMessage());
Toast.makeText(Register.this, "Gagal menyimpan profil pengguna: " + e.getMessage(), Toast.LENGTH_LONG).show();
});
}
} else {
// Gagal mendaftar di Firebase Authentication
Log.e("Register", "Registration failed: " + task.getException().getMessage());
Toast.makeText(Register.this, "Pendaftaran gagal: " + task.getException().getMessage(), Toast.LENGTH_LONG).show();
}
}
});
}
}
9. Membuat Halaman atau Activity baru untuk Login
Setelah tahap halaman register sudah siap lakukan cara yang sama saperti halaman register untuk membuat activity baru beri nama LoginActivity.
Kode XML Layout Untuk Login ( 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:id="@+id/mainlog"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="24dp"
android:gravity="center_horizontal"
tools:context=".LoginActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Login Akun"
android:textSize="32sp"
android:textStyle="bold"
android:layout_marginBottom="32dp"
android:textColor="@color/black"/>
<EditText
android:id="@+id/etEmailLogin"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Email"
android:inputType="textEmailAddress"
android:padding="12dp"
android:background="@drawable/rounded_edittext_baground"
android:layout_marginBottom="16dp"/>
<EditText
android:id="@+id/etPasswordLogin"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Password"
android:inputType="textPassword"
android:padding="12dp"
android:background="@drawable/rounded_edittext_baground"
android:layout_marginBottom="24dp"/>
<Button
android:id="@+id/btnLogin"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Login"
android:padding="14dp"
android:textSize="18sp"
android:backgroundTint="@color/black"
android:textColor="@android:color/white"
android:layout_marginBottom="16dp"/>
<TextView
android:id="@+id/tvGoToRegister"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Belum punya akun? Daftar di sini"
android:textColor="@color/black"
android:textSize="16sp"
android:clickable="true"
android:focusable="true"
android:padding="8dp"/>
<ProgressBar
android:id="@+id/progressBarLogin"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:visibility="gone"/>
</LinearLayout>
Kode Java Login ( LoginActivity.java )
package com.rizaldrc.belajarregadmin;
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import androidx.activity.EdgeToEdge;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
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;
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 LoginActivity extends AppCompatActivity {
private EditText etEmail, etPassword;
private Button btnLogin;
private TextView tvGoToRegister;
private ProgressBar progressBar;
private FirebaseAuth mAuth;
private DatabaseReference mDatabaseUsers;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
setContentView(R.layout.activity_login);
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.mainlog), (v, insets) -> {
Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
return insets;
});
etEmail = findViewById(R.id.etEmailLogin);
etPassword = findViewById(R.id.etPasswordLogin);
btnLogin = findViewById(R.id.btnLogin);
tvGoToRegister = findViewById(R.id.tvGoToRegister);
progressBar = findViewById(R.id.progressBarLogin);
// Inisialisasi Firebase Auth dan Database
mAuth = FirebaseAuth.getInstance();
mDatabaseUsers = FirebaseDatabase.getInstance().getReference(Constant.DB_PATH_USERS);
// Cek apakah user sudah login sebelumnya. Jika ya, langsung cek perannya.
if (mAuth.getCurrentUser() != null) {
checkUserRoleAndRedirect(mAuth.getCurrentUser().getUid());
}
// Listener untuk tombol Login
btnLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
loginUser();
}
});
// Listener untuk teks "Daftar di sini"
tvGoToRegister.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(LoginActivity.this, Register.class));
}
});
}
private void loginUser() {
String email = etEmail.getText().toString().trim();
String password = etPassword.getText().toString().trim();
// Validasi input
if (TextUtils.isEmpty(email)) {
etEmail.setError("Email wajib diisi!");
return;
}
if (TextUtils.isEmpty(password)) {
etPassword.setError("Password wajib diisi!");
return;
}
progressBar.setVisibility(View.VISIBLE); // Tampilkan progress bar
// Lakukan login dengan Firebase Authentication
mAuth.signInWithEmailAndPassword(email, password)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
progressBar.setVisibility(View.GONE); // Sembunyikan progress bar
if (task.isSuccessful()) {
FirebaseUser user = mAuth.getCurrentUser();
if (user != null) {
// Jika login berhasil, cek peran pengguna
checkUserRoleAndRedirect(user.getUid());
}
} else {
// Login gagal
Log.e("LoginActivity", "Login failed: " + task.getException().getMessage());
Toast.makeText(LoginActivity.this, "Login gagal: " + task.getException().getMessage(), Toast.LENGTH_LONG).show();
}
}
});
}
private void checkUserRoleAndRedirect(String userId) {
// Ambil peran pengguna dari Firebase Realtime Database
mDatabaseUsers.child(userId).child("role").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
if (snapshot.exists()) {
String role = snapshot.getValue(String.class);
if (role != null) {
if (role.equals(Constant.ROLE_ADMIN)) {
// Arahkan ke Dashboard Admin
Log.d("LoginActivity", "Redirecting to Admin Dashboard");
startActivity(new Intent(LoginActivity.this, MainActivity3.class));
} else {
// Arahkan ke Dashboard User (misal: MapsFragment atau UserDashboardActivity)
Log.d("LoginActivity", "Redirecting to User Dashboard");
startActivity(new Intent(LoginActivity.this, UserDashboardActivity.class));
}
finish(); // Tutup LoginActivity agar tidak bisa kembali dengan tombol back
} else {
Log.e("LoginActivity", "User role is null for UID: " + userId);
Toast.makeText(LoginActivity.this, "Peran pengguna tidak ditemukan. Harap hubungi admin.", Toast.LENGTH_SHORT).show();
mAuth.signOut(); // Logout pengguna jika peran tidak valid
}
} else {
Log.e("LoginActivity", "User profile not found in DB for UID: " + userId);
Toast.makeText(LoginActivity.this, "Profil pengguna tidak ditemukan. Harap daftar ulang.", Toast.LENGTH_SHORT).show();
mAuth.signOut(); // Logout pengguna jika profil tidak ada di DB
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
Log.e("LoginActivity", "Failed to read user role: " + error.getMessage());
Toast.makeText(LoginActivity.this, "Terjadi kesalahan saat memeriksa peran.", Toast.LENGTH_SHORT).show();
mAuth.signOut();
}
});
}
// Metode ini bisa dipanggil dari dashboard untuk logout
public static void signOutUser(FirebaseAuth auth) {
auth.signOut();
}
}
10. Membuat Halaman Dasboard Admin
Sekarang halaman inti bagi pengguna saat berhasil login, kali ini kita buatkan untuk halaman Dasboard atau halaman utama untuk admin berhasil login, jangan lupa untuk test uji nantinya kita persiapkan menu keluar atau tombol cekout agar kita bisa kembali kepada halman awal untuk register dan login kembali sesuai untuk Admin email admin contoh (admin@example.com). cara membuat halaman juga sama yaitu membuat activity baru beri nama AdminDashboardActivity
Kode XML Layout Untuk Dasboard Admin ( activity_admin_dashboard.xml)
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/grad2_c8"
android:orientation="vertical"
android:paddingLeft="20dp"
android:paddingRight="20dp"
tools:context=".AdminDashboardActivity">
<androidx.drawerlayout.widget.DrawerLayout
android:id="@+id/drawer"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="1.0">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/baground_transbal"
android:orientation="vertical">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="18dp"
android:layout_gravity="center_horizontal"
android:layout_marginTop="8dp"
android:layout_marginEnd="10dp"
android:layout_marginBottom="8dp">
<TextView
android:id="@+id/keluarlog"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Selamat Datang"
android:textAllCaps="true"
android:textColor="@color/white"
android:textSize="16sp" />
</LinearLayout>
<LinearLayout
android:id="@+id/my_cardView"
android:layout_width="match_parent"
android:layout_height="196dp"
android:background="@drawable/bgroundapppn"
android:orientation="vertical"
android:padding="12dp">
</LinearLayout>
<ScrollView
android:id="@+id/scrjo"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:orientation="vertical">
<LinearLayout
android:id="@+id/linearLayoutvf"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="20dp"
android:layout_marginTop="10dp"
android:layout_marginEnd="20dp"
android:background="@drawable/baground_transbal"
android:orientation="vertical"
android:paddingLeft="24dp"
android:paddingRight="24dp"
android:paddingBottom="10dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/linearLayout">
<TextView
android:id="@+id/txtAdm"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:text="MENU ADMIN"
android:textColor="@color/white"
android:textSize="14sp" />
<View
android:layout_width="match_parent"
android:layout_height="2dp"
android:layout_marginTop="6dp"
android:layout_marginBottom="6dp"
android:background="#EDEDED" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="4dp"
android:orientation="horizontal"
android:weightSum="2">
<LinearLayout
android:id="@+id/btn_menu_1"
android:layout_width="8dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:orientation="vertical">
<ImageView
android:id="@+id/image1"
android:layout_width="64dp"
android:layout_height="64dp"
android:src="@drawable/baseline_ballot_24" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:text="Menu Admin 1"
android:textColor="@color/white"
android:textSize="16sp" />
</LinearLayout>
<LinearLayout
android:id="@+id/btn_menu_2"
android:layout_width="8dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:orientation="vertical">
<ImageView
android:id="@+id/img2"
android:layout_width="64dp"
android:layout_height="64dp"
android:src="@drawable/baseline_add_location_24" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:text="Menu Admin 2"
android:textColor="@color/white"
android:textSize="16sp" />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="4dp"
android:orientation="horizontal"
android:weightSum="2">
<LinearLayout
android:id="@+id/btn_menu_3"
android:layout_width="8dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:orientation="vertical">
<ImageView
android:id="@+id/image3"
android:layout_width="64dp"
android:layout_height="64dp"
android:src="@drawable/baseline_card_travel_24" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:text="Menu Admin 3"
android:textColor="@color/white"
android:textSize="16sp" />
</LinearLayout>
<LinearLayout
android:id="@+id/btn_menu_4"
android:layout_width="8dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:orientation="vertical">
<ImageView
android:id="@+id/img4"
android:layout_width="64dp"
android:layout_height="64dp"
android:src="@drawable/baseline_ballot_24" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:text="Keluar"
android:textColor="@color/white"
android:textSize="16sp" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
</ScrollView>
</LinearLayout>
</androidx.drawerlayout.widget.DrawerLayout>
</RelativeLayout>
Kode Java Dasboard Admin ( AdminDashboardActivity.java )
package com.rizaldrc.belajarregadmin;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
import com.google.firebase.auth.FirebaseAuth;
public class AdminDashboardActivity extends AppCompatActivity {
LinearLayout Keluar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
setContentView(R.layout.activity_admin_dashboard);
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
return insets;
});
Keluar = (LinearLayout)findViewById(R.id.btn_menu_4);
Keluar.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
AlertDialog.Builder builder = new AlertDialog.Builder(AdminDashboardActivity.this);
builder.setMessage("Are you sure you want to Logout ?");
builder.setPositiveButton("YES", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
FirebaseAuth.getInstance().signOut();
Intent intent = new Intent(AdminDashboardActivity.this, LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
}
});
builder.setNegativeButton("NO", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
AlertDialog alert = builder.create();
alert.show();
}
});
}
}
11. Membuat Halaman Dasboard Pengguna
halaman yang sama untuk keberhasilan pengguna jika login berhasil akan menampilkan halaman untama untuk pengguna. Cara membuat halaman juga sama yaitu membuat activity baru beri nama UserDashboardActivity
Kode XML Layout Untuk Dasboard Pengguna ( activity_user_dashboard.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:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".UserDashboardActivity">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<include
android:id="@+id/User_ToolBar"
layout="@layout/toolbar_row" />
<TextView
android:id="@+id/txt_cekout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="KELUAR"
android:textSize="20sp"
android:textColor="#000"
android:textStyle="bold"
android:layout_centerHorizontal="true"
android:layout_below="@id/User_ToolBar"/>
</RelativeLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
Kode Java Dasboard Pengguna ( UserDashboardActivity.java )
package com.rizaldrc.belajarregadmin;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
import com.google.firebase.auth.FirebaseAuth;
public class UserDashboardActivity extends AppCompatActivity {
TextView Keluar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
setContentView(R.layout.activity_user_dashboard);
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
return insets;
});
Keluar = (TextView)findViewById(R.id.txt_cekout);
Keluar.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
AlertDialog.Builder builder = new AlertDialog.Builder(UserDashboardActivity.this);
builder.setMessage("Are you sure you want to Logout ?");
builder.setPositiveButton("YES", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
FirebaseAuth.getInstance().signOut();
Intent intent = new Intent(UserDashboardActivity.this, LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
}
});
builder.setNegativeButton("NO", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
AlertDialog alert = builder.create();
alert.show();
}
});
}
}
Kode Layout Toolbal (toolbar_row)
<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.Toolbar
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:background="#7C7F85"
android:layout_height="wrap_content"
android:layout_margin="0dp">
<TextView
android:id="@+id/PageTitle"
android:layout_width="200dp"
android:layout_height="30dp"
android:gravity="left"
android:text="Laman Admin"
android:textColor="#FFEB3B"
android:textSize="20dp"
android:textStyle="bold" />
<RelativeLayout
android:id="@+id/CustombarIconContainer"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginRight="10dp"
android:gravity="end">
<ImageView
android:id="@+id/CustombarIcon"
android:layout_width="34dp"
android:layout_height="34dp"
android:layout_marginTop="5dp"
android:src="@drawable/vektorgambarlogosaya" />
</RelativeLayout>
</androidx.appcompat.widget.Toolbar>
Tahap terakhir kita uji dengan menjalankan aplikasi kita dan Run setelah proses penyipan satu persatu sudah siap dan tiada kendala eror, jika ada tanda eror saat di uji, jangan lupa perhatikan logcat nya, disana akan di beritahu dimana tingkat eror dan fungsi apa saja yang menjadi kendala saat uji.
Hasil Dari Kode oleh kita disini mencoba dengan menambah halaman utamaa untuk pengguna adalah dengan bottom navigation ya, dan halaman utama admin activity biasa dan menu keluar. Contoh Hasil dari aplikasi yang kita Run
Demikinlah tutorial share dari blog Rizal DRC semoga lancar tanpa kendala proses belajarnya, jangan lupa share dan berbagi kepada teman yang kebetulan ingin belajar tentang kode ini, terima kasih