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.kt launches the UI and the optional QS tile.
  • UI → Model: AmbientScreen.kt, AppRulesScreen.kt, and SetupScreen.kt read/write Model.kt.
  • Model → Bridge: Bridge.kt forwards intent‑like commands to the ADB helper or Shizuku session.
  • Bridge → AdbHelper: core/src/com/hilight/core/AdbHelper.java executes app_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 a Renderer instance.
  • Renderer → LightsBackend: Renderer.java calls LightsBackend.java methods such as setLed(int led, int colour) that invoke the Android lights service via Binder.
  • Safety gate: SafetyGuard.java validates that the caller has shell access; OutputGate.java can reject patterns that exceed defined limits.

The call graph therefore has four hops from user interaction to LED update: MainActivity → UI screen → Model.ktBridge.ktAdbHelperEngineRendererLightsBackend → 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 → SetupRequest 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.yml runs on pushes and pulls.
  • License: LICENSE is MIT.
  • Lockfile / build config: gradle/ and build.gradle.kts present; 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.