Nama : Mochammad Irham Maulana
Kelas : PPB A
NRP : 5025221251
EAS Membuat Aplikasi Starbucks Reward
Link GitHub : https://github.com/kitokato77/ppb-eas-starbucks
Deskripsi Project
Aplikasi Android yang meniru antarmuka dan fungsionalitas aplikasi Starbucks untuk registrasi pengguna dan sistem reward. Aplikasi ini menyediakan alur lengkap dari splash screen hingga pengelolaan reward dengan QR code.
Arsitektur Aplikasi
Aplikasi menggunakan arsitektur Activity-based dengan 10 Activity utama yang saling terhubung dalam alur yang terstruktur.
Fitur Utama
1. Sistem Onboarding dan Registrasi
Splash screen dengan branding Starbucks
Welcome screen dengan tombol Get Started
Halaman Terms & Conditions
Verifikasi nomor telepon
Verifikasi OTP (One-Time Password)
Input informasi personal (email, password, nama, tanggal lahir)
Pengaturan preferensi pengguna (menu favorit, kode referral)
2. Dashboard Utama (Home)
Tampilan sambutan personal dengan nama pengguna
Notifikasi reward aktif (Rp10.000)
Akses ke sistem reward dan terms
3. Sistem Reward
Tampilan syarat dan ketentuan reward
Generasi QR code untuk reward
Fitur berbagi reward
Simpan QR code ke galeri
Penggunaan reward langsung
Detail Implementasi per Activity
1. SessionManager.kt
Fungsi: Mengelola sesi pengguna menggunakan SharedPreferences
Fitur Utama:
Menyimpan data pengguna secara persisten
Session validation (login/logout state)
Retrieval data pengguna yang tersimpan
Auto-login functionality
Implementasi Kelas:
class SessionManager(private val context: Context) {
private val sharedPref: SharedPreferences =
context.getSharedPreferences("starbucks_session", Context.MODE_PRIVATE)
fun createSession(fullName: String, email: String, phone: String,
favoriteMenu: String = "", birthDate: String = "") {
val editor = sharedPref.edit()
editor.putBoolean(KEY_IS_LOGGED_IN, true)
editor.putString(KEY_FULL_NAME, fullName)
// ... menyimpan data lainnya
editor.apply()
}
}
Data yang Disimpan:
Status login (boolean)
Nama lengkap pengguna
Email dan nomor telepon
Menu favorit dan tanggal lahir
Fungsi logout untuk clear semua data
2. SplashActivity.kt
Fungsi: Layar pembuka aplikasi dengan delay 2 detik
Fitur Utama:
Auto-redirect ke MainActivity setelah 2 detik
Menggunakan Handler dengan Looper untuk timing
Handler(Looper.getMainLooper()).postDelayed({
startActivity(Intent(this, MainActivity::class.java))
finish()
}, 2000)
3. MainActivity.kt
Fungsi: Halaman utama dengan auto-login check
Fitur Utama:
Auto-login check menggunakan SessionManager
Redirect otomatis ke HomeActivity jika sudah login
Fullscreen mode (menyembunyikan status bar)
Navigasi ke TermsActivity untuk pengguna baru
Auto-Login Implementation:
sessionManager = SessionManager(this)
if (sessionManager.isLoggedIn()) {
val intent = Intent(this, HomeActivity::class.java)
val userData = sessionManager.getAllUserData()
intent.putExtra("full_name", userData["full_name"])
intent.putExtra("favorite_menu", userData["favorite_menu"])
startActivity(intent)
finish()
return
}
4. TermsActivity.kt
Fungsi: Menampilkan syarat dan ketentuan
Fitur Utama:
Tombol "Agree" untuk melanjutkan ke verifikasi phone
Layout sederhana dengan satu button click listener
5. PhoneVerificationActivity.kt
Fungsi: Input dan validasi nomor telepon
Fitur Utama:
Validasi format nomor telepon (minimal 10 digit)
Simulasi pengiriman OTP
Error handling untuk input kosong dan format tidak valid
if (phoneNumber.length < 10) {
Toast.makeText(this, "Nomor telepon tidak valid", Toast.LENGTH_SHORT).show()
return@setOnClickListener
}
6. OtpVerificationActivity.kt
Fungsi: Verifikasi kode OTP 4 digit
Fitur Utama:
4 input field terpisah untuk setiap digit OTP
Auto-focus ke field berikutnya setelah input
Masking nomor telepon untuk keamanan
Validasi dengan kode default "1234"
Implementasi Auto-Move Cursor:
private inner class OtpTextWatcher(
private val currentEditText: EditText,
private val nextEditText: EditText?
) : TextWatcher {
override fun afterTextChanged(s: Editable?) {
if (s?.length == 1) {
nextEditText?.requestFocus()
}
}
}
Phone Number Masking:
private fun maskPhoneNumber(phoneNumber: String): String {
return if (phoneNumber.length > 4) {
val prefix = phoneNumber.substring(0, 4)
val suffix = phoneNumber.takeLast(4)
"$prefix****$suffix"
} else {
phoneNumber
}
}
7. PersonalInfoActivity.kt
Fungsi: Input informasi personal pengguna
Fitur Utama:
Form dengan validasi lengkap (email, password, nama, tanggal lahir)
Validasi format email menggunakan Android Patterns
Validasi password minimal 8 karakter
Error handling dengan toast messages
Validasi Email:
!android.util.Patterns.EMAIL_ADDRESS.matcher(email).matches() -> {
Toast.makeText(this, "Format email tidak valid", Toast.LENGTH_SHORT).show()
return false
}
8. PreferencesActivity.kt
Fungsi: Input preferensi opsional dan finalisasi registrasi
Fitur Utama:
Input menu favorit dan kode referral (opsional)
Integrasi SessionManager untuk menyimpan data pengguna
Button selalu enabled karena preferensi bersifat opsional
Clear back stack untuk mencegah kembali ke flow registrasi
Dynamic button state dengan TextWatcher
Session Creation:
sessionManager.createSession(
fullName = fullName,
email = email,
phone = phoneNumber,
favoriteMenu = favoriteMenu,
birthDate = birthDate
)
9. HomeActivity.kt
Fungsi: Dashboard utama aplikasi dengan session management
Fitur Utama:
Session validation saat membuka activity
Fallback ke data tersimpan jika intent tidak ada
Welcome message personal dengan nama pengguna
Toast notification dengan informasi menu favorit
Akses ke reward section
Fungsi logout dengan redirect ke MainActivity
Override onBackPressed untuk mencegah kembali ke registrasi
Session Management Implementation:
if (!sessionManager.isLoggedIn()) {
redirectToMain()
return
}
private fun setupUserData() {
val fullName = intent.getStringExtra("full_name")
?: sessionManager.getFullName()
val favoriteMenu = intent.getStringExtra("favorite_menu")
?: sessionManager.getFavoriteMenu()
// Menggunakan data dari session jika intent kosong
}
Logout Functionality:
private fun logout() {
sessionManager.logout()
redirectToMain()
}
10. RewardTermsActivity.kt
Fungsi: Tampilan syarat dan ketentuan reward
Fitur Utama:
Tombol back untuk navigasi
Tombol "Show QR" untuk mengakses QR code reward
Layout sederhana dengan dua button utama
11. QRCodeActivity.kt
Fungsi: Manajemen QR code reward
Fitur Utama:
Tampilan QR code dengan tanggal kadaluarsa
Fitur berbagi reward via Intent
Simpan QR code ke galeri device
Penggunaan reward dengan instruksi kepada barista
Share Functionality:
private fun shareQRCode() {
val shareIntent = Intent().apply {
action = Intent.ACTION_SEND
type = "text/plain"
putExtra(Intent.EXTRA_TEXT, "Saya mendapat reward Rp10.000 dari Starbucks! 🎉\nKode: SB-RWD-10K-2024")
putExtra(Intent.EXTRA_SUBJECT, "Starbucks Reward")
}
startActivity(Intent.createChooser(shareIntent, "Bagikan Reward"))
}
Save to Gallery:
private fun saveImageToGallery(bitmap: Bitmap) {
val values = ContentValues().apply {
put(MediaStore.Images.Media.DISPLAY_NAME, "Starbucks_QR_${System.currentTimeMillis()}.png")
put(MediaStore.Images.Media.MIME_TYPE, "image/png")
put(MediaStore.Images.Media.WIDTH, bitmap.width)
put(MediaStore.Images.Media.HEIGHT, bitmap.height)
}
val uri = contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values)
// ... implementasi save bitmap
}
Alur Aplikasi (User Flow)
SplashActivity → MainActivity (2 detik delay)
MainActivity → TermsActivity (Get Started)
TermsActivity → PhoneVerificationActivity (Agree)
PhoneVerificationActivity → OtpVerificationActivity (Send OTP)
OtpVerificationActivity → PersonalInfoActivity (Verify OTP: 1234)
PersonalInfoActivity → PreferencesActivity (Next)
PreferencesActivity → HomeActivity (Sign Up)
HomeActivity → RewardTermsActivity (Reward Section)
RewardTermsActivity → QRCodeActivity (Show QR)
Fitur Keamanan dan UX
Keamanan:
Phone number masking untuk privasi
Validasi input pada setiap form
Session management dengan SharedPreferences
Auto-logout dan redirect untuk unauthorized access
Clear navigation stack untuk mencegah back navigation ke sensitive screens
User Experience:
Auto-login untuk returning users
Persistent user data tanpa perlu input ulang
Auto-focus pada OTP input fields
Toast messages untuk feedback kepada user
Immersive UI dengan hidden status bar
Personal welcome messages
Fallback data loading dari session storage
Consistent navigation patterns
Session Management Benefits:
Pengalaman seamless untuk returning users
Data persistence across app restarts
Secure logout functionality
Automatic session validation
Teknologi dan Library yang Digunakan
Language: Kotlin
UI Framework: Android Native (Activity-based)
Data Persistence: SharedPreferences untuk session management
Image Handling: Android Bitmap dan Canvas
Storage: MediaStore untuk save ke galeri
Date Formatting: SimpleDateFormat dengan locale Indonesia
Intent: Untuk sharing dan navigation
Session Management: Custom SessionManager class
Kelebihan Aplikasi
Alur yang Lengkap: Dari onboarding hingga reward redemption
Session Management: Auto-login dan persistent user data
Validasi Komprehensif: Setiap input divalidasi dengan proper error handling
UX yang Baik: Auto-focus, masking, dan feedback yang jelas
Data Persistence: User tidak perlu login berulang kali
Fitur Sharing: Integrasi dengan sistem sharing Android
Personalisasi: Welcome message berdasarkan input user
Security Considerations: Phone masking, session validation, dan navigation stack management
Fallback Mechanisms: Data loading dari session jika intent kosong
Kesimpulan
Aplikasi ini merupakan prototype yang baik untuk sistem registrasi dan reward Starbucks dengan implementasi yang solid pada sisi client. Kode terstruktur dengan baik, mengikuti best practices Android development, dan menyediakan user experience yang smooth untuk flow registrasi hingga reward management.
Komentar
Posting Komentar