The Problem
HiLight Studio addresses the need for an ambient LED indicator on Pixel 11 Pro devices, letting the eight‑LED array reflect foreground activity, notifications, or custom patterns. The project is experimental and limited to Pixel 11 Pro, Pixel 11 Pro XL, and Pixel 11 Pro Fold running Android 17 (API 37).
What This Does
The app provides a UI for solid colours, animated patterns, and per‑app rules (e.g., foreground‑only LEDs, notification‑driven blinks). Core state lives in app/src/main/java/com/hilight/studio/Model.kt and is persisted via app/src/main/java/com/hilight/studio/Store.kt. The quick‑settings tile is implemented in app/src/main/java/com/hilight/studio/HiLightTile.kt. When a user changes a setting, the UI updates Model.kt, which then triggers the control path through app/src/main/java/com/hilight/studio/Bridge.kt to the low‑level core.
On the core side, core/src/com/hilight/core/Engine.java orchestrates the renderer, which delegates to core/src/com/hilight/core/Renderer.java. Renderer.java calls core/src/com/hilight/core/LightsBackend.java to issue commands to the Android lights service. Access to that service is mediated by core/src/com/hilight/core/AdbHelper.java (ADB‑started helper) or, alternatively, Shizuku. Safety checks are performed in core/src/com/hilight/core/SafetyGuard.java; core/src/com/hilight/core/OutputGate.java filters unsafe patterns before they reach the hardware. A minimal logging utility resides in core/src/com/hilight/core/Log.java.
How It Is Wired
- Entry point:
app/src/main/java/com/hilight/studio/MainActivity.ktlaunches the UI and the optional QS tile. - UI → Model:
AmbientScreen.kt,AppRulesScreen.kt, andSetupScreen.ktread/writeModel.kt. - Model → Bridge:
Bridge.ktforwards intent‑like commands to the ADB helper or Shizuku session. - Bridge → AdbHelper:
core/src/com/hilight/core/AdbHelper.javaexecutesapp_process / com.hilight.core.AdbHelper(see README adb commands) to start a persistent helper process. - Helper → Engine: The helper starts
core/src/com/hilight/core/Engine.java, which creates aRendererinstance. - Renderer → LightsBackend:
Renderer.javacallsLightsBackend.javamethods such assetLed(int led, int colour)that invoke the Androidlightsservice via Binder. - Safety gate:
SafetyGuard.javavalidates that the caller has shell access;OutputGate.javacan reject patterns that exceed defined limits.
The call graph therefore has four hops from user interaction to LED update: MainActivity → UI screen → Model.kt → Bridge.kt → AdbHelper → Engine → Renderer → LightsBackend → service. No hidden cycles were observed; the hub is Engine.java, which is the single point through which all LED commands pass.
How To Use It
Install
# from the directory containing the APK
adb install -r HiLight-Studio-v1.0.4-experimental-signed.apk
If upgrading from an older debug build:
adb uninstall com.hilight.studio
adb install HiLight-Studio-v1.0.4-experimental-signed.apk
Setup access (choose one):
- Shizuku – install Shizuku, start via wireless debugging, then in HiLight Studio → Setup → Request access and approve.
- ADB – enable developer options and USB debugging on the phone, install the app once, then run:
adb shell "pkill -f 'com.hilight.(core.AdbHelper|studio:hilight)'"
adb shell 'CLASSPATH=$(pm path com.hilight.studio | head -1 | cut -d: -f2) nohup app_process / com.hilight.core.AdbHelper > /data/local/tmp/hilight.log 2>&1 &'
Access must be re‑granted after each reboot.
Running it – after access is granted, open the app, select a colour/pattern or configure per‑app rules. The Quick‑Settings tile (HiLightTile.kt) can toggle the array on/off without launching the full UI.
Real‑World Use
A developer wants LEDs to pulse green when their note‑taking app is in the foreground. They open Apps, add the package name, select “foreground only”, and choose a pulse pattern. The rule is stored in Model.kt and, on the next foreground transition, Bridge.kt triggers AdbHelper, which starts Engine. Renderer calls LightsBackend.setLed() for each of the eight LEDs, producing the pulse without any root privileges.
Export/import of presets is handled by Store.kt; the exported JSON can be shared and imported on another device via the same setup steps.
Code Health & Issues
- Tests: 3 test files found –
app/src/test/java/com/hilight/core/OutputGateTest.java,app/src/test/java/com/hilight/core/SafetyGuardTest.java,app/src/test/java/com/hilight/studio/GuardStateTest.kt. - CI: GitHub Actions workflow
.github/workflows/android.ymlruns on pushes and pulls. - License:
LICENSEis MIT. - Lockfile / build config:
gradle/andbuild.gradle.ktspresent; no missing dependencies detected. - Documentation: 11 doc files (
docs/RELEASING.md,docs/TECHNICAL.md, etc.) and a comprehensive README.
No high‑severity structural problems were identified. The test coverage is modest (three unit‑test‑style checks) but sufficient for the safety‑critical guards; additional integration tests would increase confidence.
The Bottom Line
HiLight Studio is a focused, experimental LED controller that works on Pixel 11 Pro devices without root, using ADB or Shizuku for shell access. The codebase is clean, with a clear single‑hub call graph (Engine.java) and solid safety guards. Setup requires ADB/Shizuku familiarity, and the limited device support means it isn’t a general‑purpose tool. It’s a good fit for developers or power users who want fine‑grained ambient LED control on supported Pixel hardware.