6.3 KiB
6.3 KiB
App Discovery System
Local app discovery without requiring a backend server.
Status
| Feature | Status |
|---|---|
| Directory scanning | ✅ Implemented |
| Manifest parsing | ✅ Implemented |
| Home screen rendering | ✅ Implemented |
| App launching | 🔄 In Progress |
| Package installation | ⏳ Planned |
Overview
┌─────────────────────────────────────────────────────────────────┐
│ Home Screen │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ Dialer │ │ Messages│ │ TestApp │ │ MyApp │ ← scanned │
│ └─────────┘ └─────────┘ └─────────┘ └─────────┘ from │
│ apps/ │
└─────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ /data/data/com.omixlab.mosis/files/ │
│ ├── apps/ ← Installed third-party apps │
│ │ ├── com.mosis.testapp/ │
│ │ │ ├── manifest.json ← App metadata │
│ │ │ ├── main.rml ← Entry point │
│ │ │ ├── app.lua │
│ │ │ └── icon.tga │
│ │ └── com.example.myapp/ │
│ │ └── ... │
│ ├── downloads/ ← Pending .mosis packages │
│ └── config/ │
│ └── apps.json ← App registry (optional cache) │
└─────────────────────────────────────────────────────────────────┘
Discovery Flow
Phase 1: Direct Folder Discovery (MVP) ✅
- On boot: Home screen calls
mosis.apps.getInstalled() - AppManager scans
/files/apps/for folders containingmanifest.json - For each app: Read manifest, extract name/icon/entry point
- Home screen: Render app grid with icons
- On tap: Launch app via
mosis.apps.launch(package_id)
Phase 2: Package Installation (Future)
- User copies
.mosisfile to/files/downloads/ - Store app or file manager shows pending packages
- User taps "Install" →
mosis.apps.install(path) - Package extracted to
/files/apps/{package_id}/ - Home screen refreshes to show new app
Implementation
AppManager (C++)
The AppManager::ScanAppsDirectory() method scans for installed apps:
// app_manager.cpp
void AppManager::ScanAppsDirectory() {
std::string apps_dir = m_data_root + "/apps";
for (const auto& entry : fs::directory_iterator(apps_dir)) {
if (!entry.is_directory()) continue;
// Look for manifest.json
std::string manifest_path = entry.path().string() + "/manifest.json";
// Parse and register app...
}
}
Lua API
-- Get all installed apps (system + third-party)
local apps = mosis.apps.getInstalled()
-- Returns: [{package_id, name, icon_path, entry, version, is_system_app}, ...]
-- Launch an app
mosis.apps.launch("com.mosis.testapp")
-- Check if app is running
local running = mosis.apps.isRunning("com.mosis.testapp")
Home Screen (home.lua)
The home screen dynamically renders third-party apps:
function initHome(doc)
-- Get installed apps, filter to third-party only
local apps = mosis.apps.getInstalled()
for _, app in ipairs(apps) do
if not app.is_system_app then
-- Render app icon
end
end
end
function launchThirdPartyApp(package_id)
mosis.apps.launch(package_id)
end
Test App Deployment
To deploy a test app manually:
# 1. Push to temp location (avoid permission issues)
adb push test-apps/com.mosis.sandbox-test/ //data/local/tmp/com.mosis.sandbox-test/
# 2. Copy to app's private storage
adb shell "run-as com.omixlab.mosis cp -r /data/local/tmp/com.mosis.sandbox-test /data/data/com.omixlab.mosis/files/apps/"
# 3. Verify
adb shell "run-as com.omixlab.mosis ls /data/data/com.omixlab.mosis/files/apps/com.mosis.sandbox-test/"
For Desktop Designer:
# Copy to designer's sandbox_data folder
cp -r test-apps/com.mosis.sandbox-test/ designer/build/Debug/sandbox_data/apps/
App Manifest Format
{
"id": "com.mosis.testapp",
"name": "Test App",
"version": "1.0.0",
"version_code": 1,
"entry": "main.rml",
"icon": "icon.tga",
"description": "A test application",
"permissions": ["storage", "network"]
}
Directory Structure
System Apps (bundled in APK assets)
assets/apps/
├── home/ # Home screen (always loaded)
├── dialer/
├── messages/
├── contacts/
├── settings/
├── browser/
└── store/
Third-Party Apps (in private storage)
/data/data/com.omixlab.mosis/files/apps/
├── com.mosis.testapp/
│ ├── manifest.json
│ ├── main.rml
│ ├── app.lua
│ ├── styles.rcss
│ └── icon.tga
└── com.example.game/
└── ...
Future Enhancements
- Package signature verification before installation
- Version tracking in apps.json registry
- Update detection by comparing version_code
- Uninstall with data cleanup option
- Store integration for HTTP-based discovery