8574424fb7
Lint & Test / test (push) Successful in 2m10s
Adds a native Android TV application that runs the full LedGrab Python server in-process via Chaquopy. Captures the TV box screen using the MediaProjection API and exposes the existing web UI on the device's local network — users configure via phone/tablet browser. Android (new /android/ module): - Kotlin shell: MainActivity, CaptureService (foreground service), ScreenCapture (MediaProjection + ImageReader), PythonBridge (Chaquopy). - Polished Leanback-themed UI with QR code for easy web UI access. - AGP 8.9 + Chaquopy 17 + Gradle 8.11 (avoids the AGP 8.7 thread-lock bug). - Pre-built pydantic-core wheels for arm64-v8a, x86_64, x86 cross-compiled with maturin + Android NDK, linked against Chaquopy's libpython3.11.so. Python server platform guards: - New utils/platform.py with is_android()/is_windows()/is_linux() helpers. - Guard every top-level import of desktop-only packages (mss, psutil, sounddevice, pyserial, PyAudioWPatch, etc.) with try/except ImportError. - Android-incompatible calls gated with None-checks so the server runs on reduced capabilities on Android (no CPU/RAM metrics, no mss displays). - utils/image_codec.py gains a Pillow fallback for resize + JPEG encode when cv2 is unavailable; all internal cv2.resize callers migrated. - New android_entry.py start_server/stop_server invoked from Kotlin. - get_displays API falls back to best available engine when mss fails. New capture engines: - MediaProjectionEngine: receives RGBA frames pushed from Kotlin through a thread-safe queue; caches last frame for static-screen previews. - ScrcpyClientEngine: optional H.264 streaming via scrcpy-client library (priority 10, overrides the ADB-screencap engine when installed). Frontend: - Tab loaders previously required an apiKey; now correctly treat "auth disabled" as authenticated (Android has no auth by default). - Re-trigger the active tab's loader after loadServerInfo resolves authRequired, since initTabs runs earlier. - Add i18n keys for the demo / mediaprojection / scrcpy_client engines. Docs: - TODO.md: follow-ups for multi-ABI wheel rebuilds, CI pipeline, USB serial LED controllers, root-only capture, perf metrics abstraction. - CLAUDE.md: Android dependency sync policy (pip --exclude doesn't exist). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
53 lines
1.9 KiB
XML
53 lines
1.9 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
|
android:width="108dp"
|
|
android:height="108dp"
|
|
android:viewportWidth="108"
|
|
android:viewportHeight="108">
|
|
<!-- Background circle -->
|
|
<path
|
|
android:fillColor="#0d1117"
|
|
android:pathData="M54,54m-50,0a50,50 0,1 1,100 0a50,50 0,1 1,-100 0" />
|
|
<!-- Border ring -->
|
|
<path
|
|
android:strokeColor="#2264ffda"
|
|
android:strokeWidth="1.5"
|
|
android:fillColor="#00000000"
|
|
android:pathData="M54,54m-48,0a48,48 0,1 1,96 0a48,48 0,1 1,-96 0" />
|
|
<!-- TV body -->
|
|
<path
|
|
android:fillColor="#1c2333"
|
|
android:pathData="M26,32 L82,32 Q86,32 86,36 L86,68 Q86,72 82,72 L26,72 Q22,72 22,68 L22,36 Q22,32 26,32 Z" />
|
|
<!-- TV screen -->
|
|
<path
|
|
android:fillColor="#161b22"
|
|
android:pathData="M28,35 L80,35 Q82,35 82,37 L82,66 Q82,68 80,68 L28,68 Q26,68 26,66 L26,37 Q26,35 28,35 Z" />
|
|
<!-- LED glow - top (teal) -->
|
|
<path
|
|
android:fillColor="#64ffda"
|
|
android:fillAlpha="0.7"
|
|
android:pathData="M30,28 L78,28 L78,30 L30,30 Z" />
|
|
<!-- LED glow - left (purple) -->
|
|
<path
|
|
android:fillColor="#bb86fc"
|
|
android:fillAlpha="0.6"
|
|
android:pathData="M18,34 L20,34 L20,70 L18,70 Z" />
|
|
<!-- LED glow - right (red) -->
|
|
<path
|
|
android:fillColor="#ff6b6b"
|
|
android:fillAlpha="0.6"
|
|
android:pathData="M88,34 L90,34 L90,70 L88,70 Z" />
|
|
<!-- LED glow - bottom (yellow) -->
|
|
<path
|
|
android:fillColor="#ffd93d"
|
|
android:fillAlpha="0.6"
|
|
android:pathData="M30,74 L78,74 L78,76 L30,76 Z" />
|
|
<!-- TV stand -->
|
|
<path
|
|
android:fillColor="#1c2333"
|
|
android:pathData="M44,72 L44,78 L64,78 L64,72" />
|
|
<path
|
|
android:fillColor="#1c2333"
|
|
android:pathData="M38,78 L70,78 L70,80 L38,80 Z" />
|
|
</vector>
|