This PR implements the Android client for ZeroClaw with full agent integration, including foreground service, Quick Settings tile, boot receiver, and background heartbeat support.
ZeroClawApp.kt- Application setup with notification channels and WorkManagerSettingsRepository.kt- DataStore + EncryptedSharedPreferences for secure settingsSettingsScreen.kt- Compose UI for configuring the agentBootReceiver.kt- Auto-start on boot when enabledHeartbeatWorker.kt- Background periodic tasks via WorkManagerZeroClawTileService.kt- Quick Settings tile for agent controlShareHandler.kt- Handle content shared from other appsci-android.yml- GitHub Actions workflow for Android buildsproguard-rules.pro- R8 optimization rules
- All HIGH and MEDIUM CodeRabbit issues addressed
- DataStore IOException handling added to prevent crashes on corrupted preferences
- BootReceiver double
pendingResult.finish()call removed -
text/uri-listMIME type routed correctly in ShareHandler - API 34+ PendingIntent overload added to TileService
- Kotlin Intrinsics null checks preserved in ProGuard rules
- HeartbeatWorker enforces 15-minute minimum and uses UPDATE policy
- SettingsScreen refreshes battery optimization state on resume
- ZeroClawApp listens for settings changes to update heartbeat schedule
- Trailing whitespace removed from all Kotlin files
- Manual testing: Build and install on Android 14 device (pending)
- API Keys: Stored in Android Keystore via EncryptedSharedPreferences (AES-256-GCM)
- Permissions: RECEIVE_BOOT_COMPLETED, FOREGROUND_SERVICE, POST_NOTIFICATIONS
- Data in Transit: All API calls use HTTPS
- No New Vulnerabilities: No raw SQL, no WebView JavaScript, no exported components without protection
- Local Storage Only: All settings stored on-device, nothing transmitted except to configured AI provider
- No Analytics: No third-party analytics or tracking SDKs
- User Control: API key can be cleared via settings, auto-start is opt-in
- Minimal Permissions: Only requests permissions necessary for core functionality
- Feature Flag: Not yet implemented; can be added if needed
- Version Pinning: Users can stay on previous APK version
- Clean Uninstall: All data stored in app's private directory, removed on uninstall
- Server-Side: No backend changes required; rollback is client-only