# Android App Report: Aesthetic Computer for Play Store
## Executive Summary
**Great news!** You already have a working Android app with an APK built and ready. The current implementation is designed as a **kiosk mode app** (for dedicated devices), but converting it to a simple consumer app for the Play Store is straightforward.
---
## Current State Analysis
### ✅ What You Already Have
| Component | Status | Location |
|-----------|--------|----------|
| Android project structure | ✅ Complete | [android/](android/) |
| Kotlin + Jetpack Compose | ✅ Configured | Modern Android stack |
| WebView-based app | ✅ Working | Loads web content |
| App icons | ✅ Present | All mipmap densities |
| Build scripts | ✅ Gradle 8.7.3 | Kotlin DSL |
| **Release APK** | ✅ Built | [android/app/release/app-release.apk](android/app/release/app-release.apk) (6.7MB) |
| App ID | ✅ Set | `computer.aesthetic` |
### 🏗️ Architecture Match
Your existing platforms all use the same pattern:
| Platform | Approach | URL |
|----------|----------|-----|
| **iOS App** | WKWebView → aesthetic.computer | Native Swift |
| **Electron (macOS)** | BrowserWindow → aesthetic.computer | Node.js |
| **Android (existing)** | WebView → localhost:8443 | Kotlin |
The Android app is nearly identical to iOS/Electron - just needs URL change!
---
## Current Android App Issues for Play Store
The existing app is configured for **kiosk mode** (dedicated display installations). For a consumer app:
### 1. **Remove Kiosk/Device Admin Features**
Current [MainActivity.kt](android/app/src/main/java/computer/aesthetic/MainActivity.kt) has:
- Device Owner/Admin mode (locks device to app)
- Lock task mode (prevents exiting)
- System UI hiding
- Back button blocking
**Fix:** Remove these for a normal user app.
### 2. **Point to Live URL**
Current: `https://localhost:8443` (local HTTPS server with self-signed cert)
**Fix:** `https://aesthetic.computer`
### 3. **Remove Local HTTPS Server**
The [localHttpServer.kt](android/app/src/main/java/computer/aesthetic/localHttpServer.kt) runs NanoHTTPD with SSL for local content. Not needed for a web wrapper.
### 4. **Remove Unnecessary Permissions**
Current permissions in [AndroidManifest.xml](android/app/src/main/AndroidManifest.xml):
```xml
```
**For consumer app, only need:**
```xml
```
### 5. **Fix Launcher Intent**
Current manifest sets app as device launcher (HOME category). Remove for normal app.
---
## Implementation Plan
### Phase 1: Simple WebView App (1-2 hours)
Create a clean consumer version:
1. **Simplify MainActivity.kt** - Just load `https://aesthetic.computer` in WebView
2. **Clean AndroidManifest.xml** - Remove kiosk intents, keep INTERNET permission
3. **Remove unused files:**
- `localHttpServer.kt`
- `BootReceiver.kt`
- `MyDeviceAdminReceiver.kt`
- SSL keystore from `res/raw/`
### Phase 2: Play Store Prep (2-4 hours)
1. **App signing** - Generate upload keystore for Play Store
2. **Version bumping** - Increment `versionCode` and `versionName`
3. **Privacy policy** - Required for Play Store (you have one at [privacy-policy.html](system/public/privacy-policy.html))
4. **Screenshots** - Capture from Uniherz Jelly for store listing
5. **Play Console setup** - Create developer account ($25 one-time) if not already
### Phase 3: Enhancements (Optional)
- **Camera/Mic permissions** - For pieces that use them
- **JavaScript bridge** - Like iOS app has for notifications
- **Splash screen** - Match the purple aesthetic
- **Deep links** - Handle `aesthetic.computer/*` URLs
---
## Code Changes Summary
### Minimal MainActivity.kt
```kotlin
package computer.aesthetic
import android.os.Bundle
import android.webkit.WebView
import android.webkit.WebViewClient
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.viewinterop.AndroidView
import computer.aesthetic.ui.theme.AestheticComputerTheme
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
AestheticComputerTheme {
WebViewPage(url = "https://aesthetic.computer")
}
}
}
}
@Composable
fun WebViewPage(url: String) {
AndroidView(
factory = { context ->
WebView(context).apply {
settings.javaScriptEnabled = true
settings.domStorageEnabled = true
settings.mediaPlaybackRequiresUserGesture = false
webViewClient = WebViewClient()
loadUrl(url)
}
},
modifier = Modifier.fillMaxSize()
)
}
```
### Minimal AndroidManifest.xml
```xml
```
---
## Building & Testing
### Build Debug APK (for testing on Uniherz Jelly)
```bash
cd android
./gradlew assembleDebug
# Output: app/build/outputs/apk/debug/app-debug.apk
```
### Install to Device via ADB
```bash
adb install app/build/outputs/apk/debug/app-debug.apk
```
### Build Release APK (for Play Store)
```bash
cd android
./gradlew assembleRelease
# Sign with your keystore
```
---
## Reusable Assets from Monorepo
| Asset | Source | Use |
|-------|--------|-----|
| App icons | Already in `android/app/src/main/res/mipmap-*/` | ✅ Ready |
| Privacy policy | [system/public/privacy-policy.html](system/public/privacy-policy.html) | Link in Play Store |
| Web app | `https://aesthetic.computer` | Main content |
| Branding | Purple theme already configured | ✅ Ready |
---
## Play Store Requirements Checklist
- [ ] Google Play Developer Account ($25 one-time fee)
- [ ] App signing keystore (generate new or use existing)
- [ ] Privacy policy URL
- [ ] App screenshots (phone + tablet if supporting)
- [ ] Feature graphic (1024x500)
- [ ] App icon (512x512) - you have `ic_launcher-playstore.png`
- [ ] Short description (80 chars)
- [ ] Full description (4000 chars)
- [ ] Content rating questionnaire
- [ ] Target audience declaration
- [ ] Data safety form
---
## Estimated Timeline
| Task | Time |
|------|------|
| Code cleanup (remove kiosk mode) | 1 hour |
| Test on Uniherz Jelly | 30 min |
| Play Console setup | 30 min |
| Store listing creation | 1-2 hours |
| Review & publish | 1-7 days (Google review) |
**Total: ~4 hours of work + Google review time**
---
## Next Steps
1. **Shall I create a clean consumer version** of the Android app now?
2. **Do you have a Google Play Developer account?** If not, you'll need to create one at https://play.google.com/console
3. **Connect Uniherz Jelly via USB** for testing - I can guide you through ADB setup
---
## Alternative: PWA Approach
The aesthetic.computer website already works as a PWA (Progressive Web App). Android users can "Add to Home Screen" from Chrome without needing a Play Store app. However, a native app:
- Shows up in Play Store searches
- Feels more "official"
- Gets automatic updates
- Can access native features (notifications, etc.)
Both approaches are valid - the Play Store app is better for discoverability.