# Code Documentation Dokumen ini menjelaskan struktur code Android `Emoney Info` agar developer lain bisa lebih cepat memahami project, mencari area yang relevan, dan melakukan perubahan dengan aman. ## 1. Ringkasan Project Project ini adalah versi Android dari aplikasi iOS `Emoney Info`. Fungsi utama aplikasi: - membaca kartu uang elektronik via NFC - menampilkan saldo dan riwayat transaksi - menampilkan halaman bantuan dan informasi aplikasi - mengekspor history transaksi ke PDF - menampilkan iklan AdMob banner dan interstitial Stack utama: - Kotlin - Jetpack Compose - Android NFC (`IsoDep`, `NfcF`, `MifareClassic`) - Google Mobile Ads SDK Package utama: - `com.korancrew.emoneyinfo` ## 2. Struktur Folder Struktur code utama ada di: ```text app/src/main/java/com/korancrew/emoneyinfo ├── ads ├── data ├── nfc ├── pdf ├── ui ├── util └── MainActivity.kt ``` Penjelasan singkat: - `ads` Menyimpan konfigurasi AdMob. - `data` Menyimpan model UI utama dan data FAQ. - `nfc` Berisi seluruh logic pembacaan kartu, helper APDU/FeliCa, kriptografi Brizzi, dan router NFC. - `pdf` Logic export history transaksi menjadi PDF. - `ui` Semua screen Compose, komponen UI, tema, dan root app navigation. - `util` Helper umum. Saat ini dipakai untuk logging debug-only. ## 3. Entry Point Aplikasi File utama: - [MainActivity.kt](/Users/wirabasalamah/work/gitlab/EmoneyInfo-andro/app/src/main/java/com/korancrew/emoneyinfo/MainActivity.kt) Tanggung jawab `MainActivity`: - mengaktifkan theme utama - inisialisasi AdMob - membuat `UnifiedNfcReader` - me-render root Compose lewat `EmoneyInfoApp` - meneruskan event NFC dari `onNewIntent` - mengaktifkan dan menonaktifkan foreground dispatch NFC pada `onResume` / `onPause` Secara sederhana, `MainActivity` adalah jembatan antara lifecycle Android dengan UI dan NFC reader. ## 4. Root UI dan Navigasi File utama: - [EmoneyInfoApp.kt](/Users/wirabasalamah/work/gitlab/EmoneyInfo-andro/app/src/main/java/com/korancrew/emoneyinfo/ui/EmoneyInfoApp.kt) `EmoneyInfoApp` adalah root Compose application. File ini menangani: - bottom navigation - `NavHost` dan route screen - membaca `uiState` dari `UnifiedNfcReader` - membaca dan menyimpan preference `show card number` Route utama: - `home` - `settings` - `history` - `faq` - `about` - `terms` - `privacy` Bottom navigation hanya menampilkan: - `E-Money` - `Settings` ## 5. Screen Utama Screen Compose ada di folder: - `/ui/screens` Yang paling penting: - [HomeScreen.kt](/Users/wirabasalamah/work/gitlab/EmoneyInfo-andro/app/src/main/java/com/korancrew/emoneyinfo/ui/screens/HomeScreen.kt) Menampilkan hasil scan terakhir, saldo, nomor kartu, dan transaksi terakhir. - [HistoryScreen.kt](/Users/wirabasalamah/work/gitlab/EmoneyInfo-andro/app/src/main/java/com/korancrew/emoneyinfo/ui/screens/HistoryScreen.kt) Menampilkan list riwayat transaksi, banner ads, dan tombol export PDF fixed di bawah. - [SettingsScreen.kt](/Users/wirabasalamah/work/gitlab/EmoneyInfo-andro/app/src/main/java/com/korancrew/emoneyinfo/ui/screens/SettingsScreen.kt) Menampilkan 4 menu utama: bahasa, tampilkan nomor kartu, pusat bantuan, dan tentang aplikasi. - [FaqScreen.kt](/Users/wirabasalamah/work/gitlab/EmoneyInfo-andro/app/src/main/java/com/korancrew/emoneyinfo/ui/screens/FaqScreen.kt) Menampilkan FAQ dan pencarian pertanyaan. - [AboutScreen.kt](/Users/wirabasalamah/work/gitlab/EmoneyInfo-andro/app/src/main/java/com/korancrew/emoneyinfo/ui/screens/AboutScreen.kt) Menampilkan info aplikasi dan navigasi ke terms/privacy. ## 6. Model Data UI File utama: - [Models.kt](/Users/wirabasalamah/work/gitlab/EmoneyInfo-andro/app/src/main/java/com/korancrew/emoneyinfo/data/Models.kt) Model inti: ### `CardType` Enum untuk jenis kartu: - `MANDIRI` - `FLAZZ` - `BRIZZI` - `TAPCASH` - `JACKCARD` - `MEGACASH` - `KMT` ### `TransactionItem` Mewakili 1 item riwayat transaksi. Field penting: - `title` - `date` - `amount` - `isCredit` - `locationName` Method penting: - `formattedAmount()` - `formattedDate()` - `subtitle()` Catatan: - currency selalu diformat sebagai `IDR` / `Rp` - warna amount di UI ditentukan dari `isCredit` ### `EmoneyUiState` State utama yang dipakai UI. Field penting: - `cardType` - `balance` - `cardNumber` - `transactions` - `scanMessage` - `isNfcSupported` Semua screen utama membaca state ini, terutama `HomeScreen` dan `HistoryScreen`. ## 7. Arsitektur NFC Folder utama: - `/nfc` File yang paling penting: - [UnifiedNfcReader.kt](/Users/wirabasalamah/work/gitlab/EmoneyInfo-andro/app/src/main/java/com/korancrew/emoneyinfo/nfc/UnifiedNfcReader.kt) - [CardReaders.kt](/Users/wirabasalamah/work/gitlab/EmoneyInfo-andro/app/src/main/java/com/korancrew/emoneyinfo/nfc/CardReaders.kt) - [NfcUtils.kt](/Users/wirabasalamah/work/gitlab/EmoneyInfo-andro/app/src/main/java/com/korancrew/emoneyinfo/nfc/NfcUtils.kt) - [BrizziCrypto.kt](/Users/wirabasalamah/work/gitlab/EmoneyInfo-andro/app/src/main/java/com/korancrew/emoneyinfo/nfc/BrizziCrypto.kt) - [AndroidStrings.kt](/Users/wirabasalamah/work/gitlab/EmoneyInfo-andro/app/src/main/java/com/korancrew/emoneyinfo/nfc/AndroidStrings.kt) ### 7.1 `UnifiedNfcReader` `UnifiedNfcReader` adalah orchestrator NFC aplikasi. Tanggung jawab: - mengecek apakah device support NFC - menyimpan `uiState` dalam `StateFlow` - menerima `Tag` dari `onNewIntent` - memilih reader yang sesuai berdasarkan teknologi kartu - mengubah hasil pembacaan menjadi `EmoneyUiState` - mengatur pesan UI seperti `tap card hint` dan `tap again hint` Reader yang didaftarkan saat ini: - `IsoDepCardRouter()` - `MifareClassicCardReader()` - `FelicaCardReader()` ### 7.2 `CardReaders.kt` File ini berisi implementasi pembacaan kartu per keluarga teknologi dan per jenis kartu. Struktur utamanya: - `CardReader` - `IsoDepCardRouter` - `FelicaCardReader` - `MifareClassicCardReader` - object reader spesifik, seperti `BrizziReader`, `MandiriReader`, `FlazzReader`, `TapCashReader`, dan lainnya Alur umum: 1. router menentukan teknologi kartu 2. router memanggil reader spesifik 3. reader mengirim command APDU atau FeliCa 4. response di-parse menjadi saldo, nomor kartu, dan history 5. hasil akhir dikembalikan sebagai `EmoneyUiState` ### 7.3 `NfcUtils.kt` File ini berisi helper low-level: - `ApduResponse` - `transceiveApdu` - `transceiveSelect` - helper FeliCa read - helper hex, endian, format card number, parsing tanggal Ini adalah file utility inti untuk operasi byte-level dan APDU. ### 7.4 `BrizziCrypto.kt` Khusus untuk flow Brizzi yang membutuhkan proses auth/crypto. File ini sebaiknya disentuh dengan hati-hati karena error kecil pada: - mode cipher - IV - padding - urutan challenge bisa membuat kartu gagal dibaca. ## 8. Dukungan Kartu Kartu yang saat ini sudah menjadi target utama: - Brizzi - Flazz BCA - Mandiri e-Money - BNI TapCash - KMT - JackCard - MegaCash Catatan penting: - tidak semua kartu memakai flow yang sama - beberapa kartu memakai `IsoDep` - KMT memakai `NfcF` - ada fallback `MifareClassic` untuk kasus tertentu Untuk perubahan parser, validasi terbaik tetap lewat test pada kartu fisik nyata. ## 9. Alur Scan NFC Secara sederhana: 1. `MainActivity.onResume()` mengaktifkan foreground dispatch 2. user menempelkan kartu 3. Android mengirim `Intent` NFC ke activity yang sedang aktif 4. `MainActivity.onNewIntent()` meneruskan intent ke `UnifiedNfcReader` 5. `UnifiedNfcReader` memilih reader yang cocok 6. reader membaca data kartu 7. hasil scan dimasukkan ke `uiState` 8. UI Compose otomatis recompose dan menampilkan saldo/history terbaru Setelah scan berhasil, `scanMessage` akan berubah lalu kembali ke hint scan ulang setelah 5 detik. ## 10. Localization String resource: - [values/strings.xml](/Users/wirabasalamah/work/gitlab/EmoneyInfo-andro/app/src/main/res/values/strings.xml) - [values-id/strings.xml](/Users/wirabasalamah/work/gitlab/EmoneyInfo-andro/app/src/main/res/values-id/strings.xml) App mendukung: - Inggris - Indonesia Catatan: - bahasa UI mengikuti locale device - currency tetap `IDR` - beberapa pesan scan dari layer NFC juga dilokalisasi melalui `AndroidStrings` ## 11. AdMob File utama: - [AdMobConfig.kt](/Users/wirabasalamah/work/gitlab/EmoneyInfo-andro/app/src/main/java/com/korancrew/emoneyinfo/ads/AdMobConfig.kt) - [AdMobBanner.kt](/Users/wirabasalamah/work/gitlab/EmoneyInfo-andro/app/src/main/java/com/korancrew/emoneyinfo/ui/components/AdMobBanner.kt) Penempatan saat ini: - banner di `Home` - banner di `History` - banner di `Settings` - interstitial sebelum export PDF Catatan implementasi: - `test device IDs` hanya diaktifkan pada `BuildConfig.DEBUG` - logging ads dibatasi ke debug build melalui `AppLog` ## 12. Export PDF File utama: - [HistoryPdfExporter.kt](/Users/wirabasalamah/work/gitlab/EmoneyInfo-andro/app/src/main/java/com/korancrew/emoneyinfo/pdf/HistoryPdfExporter.kt) Fungsi utama: - menghasilkan PDF dari `EmoneyUiState` - menyertakan tipe kartu, saldo, nomor kartu, dan tabel transaksi - membuka chooser agar file bisa dibuka atau dibagikan Flow dari UI: 1. user menekan `Export PDF` 2. jika interstitial tersedia, iklan ditampilkan dulu 3. setelah iklan selesai atau gagal tampil, PDF dibuat 4. file dibuka lewat chooser ## 13. Preference Lokal Saat ini preference utama yang dipakai: - `masked` Disimpan di: - `SharedPreferences("emoney_info_prefs")` Dipakai untuk: - menentukan apakah nomor kartu ditampilkan penuh atau dimasking Catatan: - key `masked` saat ini bernilai `true` ketika nomor kartu ditampilkan penuh - nama key ini tidak ideal secara semantik - kalau nanti ingin dirapikan, sebaiknya diganti menjadi key yang lebih jelas, misalnya `show_card_number` ## 14. Logging dan Build Production File utama: - [AppLog.kt](/Users/wirabasalamah/work/gitlab/EmoneyInfo-andro/app/src/main/java/com/korancrew/emoneyinfo/util/AppLog.kt) - [app/build.gradle.kts](/Users/wirabasalamah/work/gitlab/EmoneyInfo-andro/app/build.gradle.kts) Prinsip saat ini: - log sensitif hanya aktif di debug build - release build memakai: - `minifyEnabled = true` - `shrinkResources = true` Ini penting karena flow NFC dan ads punya banyak data internal yang tidak perlu muncul di production log. ## 15. File Yang Paling Sering Diedit Kalau ingin ubah tampilan: - `/ui/screens` - `/ui/theme` - `/res/values` Kalau ingin ubah parser kartu: - `/nfc/CardReaders.kt` - `/nfc/NfcUtils.kt` - `/nfc/BrizziCrypto.kt` Kalau ingin ubah model dan formatting: - `/data/Models.kt` Kalau ingin ubah ads: - `/ads/AdMobConfig.kt` - `/ui/components/AdMobBanner.kt` Kalau ingin ubah PDF: - `/pdf/HistoryPdfExporter.kt` ## 16. Risiko dan Catatan Maintenance Beberapa area sensitif: - parser NFC Perubahan kecil bisa memutus pembacaan kartu tertentu. - flow Brizzi Paling sensitif karena ada auth dan kriptografi. - formatting UI berdasarkan `locationName` KMT memakai lokasi valid, tapi kartu lain tidak selalu punya mapping lokasi yang berguna. - preference `masked` Namanya membingungkan dan bisa memicu bug kalau dibaca tanpa konteks. - ads production Pastikan testing device ID tidak dipakai untuk release path, dan lakukan uji di device nyata. ## 17. Saran Pengembangan Selanjutnya Beberapa perbaikan yang layak dipertimbangkan: - pecah `CardReaders.kt` menjadi beberapa file per kartu agar lebih mudah dirawat - ganti `SharedPreferences` sederhana ke wrapper preference yang lebih eksplisit - buat test parser terpisah untuk data response yang sudah diketahui - tambahkan dokumentasi mapping kartu dan APDU per provider - rapikan naming key `masked` ## 18. Ringkasan Cepat Kalau hanya ingin memahami project dengan cepat, mulai dari file ini: 1. [MainActivity.kt](/Users/wirabasalamah/work/gitlab/EmoneyInfo-andro/app/src/main/java/com/korancrew/emoneyinfo/MainActivity.kt) 2. [EmoneyInfoApp.kt](/Users/wirabasalamah/work/gitlab/EmoneyInfo-andro/app/src/main/java/com/korancrew/emoneyinfo/ui/EmoneyInfoApp.kt) 3. [Models.kt](/Users/wirabasalamah/work/gitlab/EmoneyInfo-andro/app/src/main/java/com/korancrew/emoneyinfo/data/Models.kt) 4. [UnifiedNfcReader.kt](/Users/wirabasalamah/work/gitlab/EmoneyInfo-andro/app/src/main/java/com/korancrew/emoneyinfo/nfc/UnifiedNfcReader.kt) 5. [CardReaders.kt](/Users/wirabasalamah/work/gitlab/EmoneyInfo-andro/app/src/main/java/com/korancrew/emoneyinfo/nfc/CardReaders.kt) 6. [HistoryScreen.kt](/Users/wirabasalamah/work/gitlab/EmoneyInfo-andro/app/src/main/java/com/korancrew/emoneyinfo/ui/screens/HistoryScreen.kt) 7. [HistoryPdfExporter.kt](/Users/wirabasalamah/work/gitlab/EmoneyInfo-andro/app/src/main/java/com/korancrew/emoneyinfo/pdf/HistoryPdfExporter.kt) Dengan urutan itu, sebagian besar arsitektur project sudah akan terlihat.