target sdk
FactAPI 36 (Android 9+)
Case Study
Updated: 2026-09-25A privacy-focused, context-driven Android Launcher built with Jetpack Compose, Kotlin Coroutines, and Room Database. Enables users to organize applications into isolated workspaces ('Spaces') with per-space visual layouts, AppWidgetHost widgets, and biometric/PIN protection via PBKDF2WithHmacSHA256 (120,000 iterations) without requiring root or OS-level profile isolation.
Repository Links:
target sdk
FactAPI 36 (Android 9+)
database instances
Fact2 (LauncherDB + HistoryDB)
encryption kdf
FactPBKDF2 (120k iterations)
architecture
FactClean / MVVM / Room
reactive streams
FactKotlin StateFlow
Achieves instant workspace switching and low memory overhead without requiring device reboot, secondary Android work profiles, or root access.
Trade-off: Does not isolate app private data storage; focuses strictly on launcher visibility, layout segregation, and access gatekeeping.
Separating launcher configuration (spaces, layout, widgets) from high-frequency launch telemetry history avoids lock contention and optimizes query performance.
Trade-off: Requires managing two distinct Room migrations (versions 11->12 and 1->2) with exported schema validation.
Loading app icons asynchronously via LauncherApps in background Coroutines prevents main-thread drop frames during rapid fling scrolling in the app drawer.
Trade-off: Requires temporary placeholder icon rendering until cached bitmap streams emit.
Standard Android launchers treat all installed applications uniformly, cluttering home screens and exposing work/personal apps without context-specific organization or hardware-efficient privacy boundaries.
Designed a Clean Architecture / MVVM launcher using Jetpack Compose and Kotlin Coroutines. Engineered isolated Spaces with per-space grid layouts, custom wallpapers, and AppWidgetHost bindings. Integrated PBKDF2WithHmacSHA256 key derivation with 120,000 iterations and per-space cryptographically secure salts alongside Android BiometricPrompt. Architected dual Room databases to separate launcher structural state from append-only launch telemetry.
Built a responsive, zero-root Android launcher supporting Android 9+ up to Android 16 (API 36), providing 60 FPS drawer fling performance through non-blocking bitmap streaming.
| Dimension | Selected Option | Impact | Compromise |
|---|---|---|---|
| Storage Architecture | Dual Room Databases (Config vs History) | Zero write lock contention during app launch telemetry logging | Two database lifecycles and migrations to maintain |
| Security Model | PBKDF2WithHmacSHA256 (120k iterations) + Biometrics | Strong cryptographic protection against brute-force passkey extraction | Slight CPU computation cost on initial space unlock |
| UI Framework | 100% Jetpack Compose Material 3 | Declarative UI with automatic recomposition minimization | Requires AndroidView wrapper interop for legacy AppWidgetHostView |
Failure Path & Recovery Invariants
If an application is uninstalled externally, the LauncherApps callback automatically purges orphaned package references across all Spaces in the database, preventing broken shortcut clicks.
Implement custom AppWidgetHostView render caching to reduce GPU overdraw when multiple third-party widgets are active simultaneously.
Introduce gesture-based predictive back navigation transitions across Space changes.