# Login Vault (Android) Aplikasi Flutter untuk menyimpan **login & data pribadi** di database lokal Android. Semua data tersimpan di perangkat (offline-first, tanpa server). - Minimum Android: **10 (API 29)** - Compile / Target SDK: 36 - Package: `com.omahcitra.loginvault` --- ## Fitur - **Autentikasi lokal** — registrasi/login via **email + password aplikasi**. Email disimpan di secure storage sebagai identitas. - **Login dengan sidik jari (biometric)** — setelah registrasi, kamu dapat mengaktifkan fingerprint di Pengaturan. Saat membuka aplikasi, dialog sidik jari muncul otomatis dan **mem-bypass** form email/password bila verifikasi sukses. Bila dibatalkan, tetap bisa login manual. - **Session timeout** — login otomatis logout setelah periode tanpa aktivitas (default 3 menit, bisa diubah: 5/10/15/30/60 menit atau Selamanya). - **Penyimpanan lokal terenkripsi** — tiap entri punya: - `id` : `String`, **unik** (primary key) - `content` : `String`, disimpan terenkripsi (XOR + base64) menggunakan **constant key** (`AppConstants.encryptionKey`) - **Dashboard**: 1. Text search yang mencari `id` di local DB **setiap kali pengetikan** (live filter, tampil sebagai list id) 2. Klik item list → konten ditampilkan di bawahnya (expandable) 3. Swipe ke kiri untuk hapus → muncul **dialog konfirmasi** 4. Tombol **edit** di tiap list untuk ubah konten - **Menu Pengaturan**: - Ubah password aplikasi - Aktifkan/nonaktifkan login sidik jari (dengan dialog konfirmasi) - Atur session timeout - **Backup & Restore**: export vault terenkripsi ke file lokal (`Download/loginvault/*.enc`), restore dari file tersebut - Ganti tema: **Gelap (Dark)** atau **Sistem (System)** - **Menu Exit** — keluar dari aplikasi --- ## Arsitektur & Keamanan ``` lib/ ├── constants.dart # AppConstants: encryptionKey (constant), session keys ├── encryptor.dart # XOR + base64 obfuscation (constant key) ├── database_helper.dart # sqflite: tabel 'vault' (id PK, content) ├── auth_service.dart # register/login, secure storage, biometric, session ├── theme_provider.dart # theme mode (system/dark), persist via SharedPreferences ├── auth_screen.dart # login/registrasi adaptif (email+password, bypass fingerprint) ├── dashboard_screen.dart # search live, list, expand, swipe-delete, edit ├── settings_screen.dart # ubah password, tema, fingerprint, timeout, backup, exit ├── backup_service.dart # export/import encrypted vault file (local) ├── vault_entry_dialogs.dart# dialog add/edit/confirm └── main.dart # entrypoint + routing + ThemeProvider ``` > **Catatan keamanan penting:** Enkripsi konten menggunakan **constant key** > (`AppConstants.encryptionKey`) — ini obfuscation ringan, **bukan kriptografi > yang aman**. Sesuai permintaan ("encrypt base64 dengan key sebagai constant"), > konten di-database tidak dapat dibaca langsung tanpa key tersebut. Untuk > proteksi produksi, ganti `Encryptor` dengan AES menggunakan key yang > diturunkan dari password aplikasi + `flutter_secure_storage` (Android > Keystore). Email & password aplikasi disimpan via `flutter_secure_storage` (ter-enkripsi di Android Keystore). Sidik jari menggunakan plugin `local_auth` (dialog biometric bawaan Android, memerlukan `FlutterFragmentActivity`). --- ## Cara build APK Prasyarat: Flutter SDK (stable), JDK 17, Android SDK (build-tools 34+, platforms 29 & 36). ```bash flutter pub get flutter build apk --release # hasil: build/app/outputs/flutter-apk/app-release.apk ``` ### Konfigurasi Android - `android/app/build.gradle.kts`: `minSdk = 29`, `compileSdk = 36`, `targetSdk = 36`, `applicationId = com.omahcitra.loginvault` - `android/local.properties`: `sdk.dir=/path/to/android-sdk` - `android/app/src/main/kotlin/.../MainActivity.kt`: extends `FlutterFragmentActivity` (wajib untuk `local_auth`) - `AndroidManifest.xml`: permission `INTERNET` (tidak wajib untuk fitur inti, aman dihapus bila tidak ada panggilan jaringan) > APK release di-build dengan **debug keystore** (signingConfig debug) agar > bisa dihasilkan tanpa upload key. Untuk distribusi Play Store, ganti dengan > keystore rilis milik Anda. --- ## Instal & jalankan ```bash # mode debug di device/emulator flutter run # atau install APK hasil build adb install build/app/outputs/flutter-apk/app-release.apk ``` --- ## Alur penggunaan 1. **Pertama install** → layar registrasi: isi email + password aplikasi. 2. Setelah login → **Dashboard**: - Ketik di kolom pencarian untuk filter `id` secara live. - Tap sebuah `id` → kontennya muncul di bawah. - Swipe kiri pada item → konfirmasi hapus. - Tap ikon edit → ubah konten. - Tombol `+` (FAB) → tambah entri baru (id unik + konten). 3. **Pengaturan** (ikon gear): - Ubah password aplikasi - Aktifkan "Login dengan sidik jari" (muncul dialog konfirmasi; batal = tetap off) - Atur session timeout - **Backup & Restore**: - *Backup ke file (lokal)*: semua entri diekspor terenkripsi (pakai password aplikasi) ke `Download/loginvault/loginvault_backup_.enc` - *Restore dari file*: pilih file `.enc` dari folder tersebut → dikembalikan ke DB (merge by id) - Ganti tema, atau Exit. > **Catatan backup:** File `.enc` **terenkripsi dengan password aplikasi**, > bukan constant key — aman jika dibagikan/copy ke Google Drive. Untuk survive > dari crash HP, copy file tersebut ke Google Drive (manual) atau simpan di > komputer. Restore butuh **password aplikasi yang sama** dengan saat backup. --- ## Dependencies utama | Paket | Fungsi | |-------|--------| | `sqflite` | local database SQLite | | `flutter_secure_storage` | simpan email & password aplikasi (Keystore) | | `local_auth` | login dengan sidik jari (biometric Android) | | `path_provider` | akses folder Download (backup) | | `permission_handler` | izin storage (backup ke Download) | | `provider` | state management (theme) | | `shared_preferences` | persist tema & session timeout | | `crypto` | utilitas (tidak wajib, tersedia) | --- © OmahCitra — aplikasi vault login lokal.