A custom home launcher for the Carlinkit "TBox Ambient" Android head unit. It throws out the OEM launcher and its sidebar, takes over the whole 800x480 panel, and gives the car a clean glass home screen with a swipe-up dock, an app drawer, gesture navigation, and real split-screen.
Built for one very specific box (rooted Android 13 on a Qualcomm SM6225), but most of the tricks here apply to any AOSP-platform-key-signed automotive ROM.
- Immersive home. Live "blob" wallpaper drifting behind a glass clock. No status bar, no OEM sidebar, edge to edge.
- Swipe-up dock. Bottom-edge swipe pops a frosted bar with your 4 most-recent apps plus an Apps button. Auto-hides after a few seconds.
- App drawer. Full grid of everything launchable, with a live search filter.
- Gesture nav (since the OEM nav bar is gone): swipe in from a side edge = Back, swipe up = dock, swipe down from the top = notification shade. A plain tap inside any of those edge strips is passed through to the app underneath, so buttons that live on a screen edge still work.
- Real split-screen. Long-press an app, pick a side, and it opens beside the current app as two resizable freeform windows with a divider you can drag.
- Quick toggles + Now Playing. WiFi/BT toggles (hold to open that radio's settings) and a media card wired to whatever's actually playing (Spotify, BT music, etc.).
- Themes. Six accent palettes, applied live to the wallpaper and the dock.
A few more in screenshots/: the live wallpaper on its own, the recents overview,
theme variants, and the settings screen.
The interesting part is that a third-party launcher normally can't touch privileged windowing, task management, or input injection. AmbientDock can, because of one fact about this ROM:
The TBox firmware is signed with the public AOSP platform test-key. You can verify it yourself -
the stock car_launcher certificate SHA-256 matches the well-known AOSP platform key. So the build
script re-signs AmbientDock with that same key (scripts/build_system.sh), and Android then grants it
signature-level permissions: MANAGE_ACTIVITY_TASKS, REAL_GET_TASKS, INJECT_EVENTS,
MEDIA_CONTENT_CONTROL, NETWORK_SETTINGS, and friends. Same privileges the OEM launcher had.
From there:
- Split-screen uses freeform windowing, not the stock split (which isn't reachable from an app,
and the OEM's own split is a custom SurfaceControl/VirtualDisplay engine). Both apps launch with
ActivityOptions.setLaunchWindowingMode(FREEFORM)and explicit left/right bounds, then a divider overlay resizes both tasks live via the hiddenIActivityTaskManager.resizeTask. Needsenable_freeform_support=1, which the deploy script sets - so reboot once after the first install. - Owning the screen. The home activity and every overlay set immersive system-UI flags.
- Killing the OEM left sidebar. This was two separate things stacked on top of each other. One is
a SystemUI navigation bar pinned to the left edge (this ROM ignores
config_showNavigationBar, so it gets collapsed with Fabricated RROs that zero the nav-bar dimensions). The other iscom.sd.ball("FloatingBall"), a persistent system-uid overlay app that laughs atpm disable,force-stop, andkill. The only thing that reliably stops it is a systemless Magisk module that masks its APK so PackageManager never registers it. Both are handled by the bundled module - seemagisk/floatball-killer/. - Killing the top status bar. Same RRO trick on
status_bar_heightand friends, so apps lay out full-height. WiFi/BT status moves into the home quick toggles; the shade still drops on a top swipe.
Everything OEM-side is reversible. No stock APKs are modified.
# build + re-sign with the platform key
bash scripts/build_system.sh # -> app/build/outputs/apk/debug/app-system.apk
# push, install, grant perms, enable freeform, set as HOME
bash scripts/deploy_box.sh
# first install only, so freeform takes effect:
adb rebootThe toolchain is pinned and builds fully offline (AGP 8.4.2, Kotlin 1.9.24, Gradle 8.13, plain Android
Views - no Compose). The platform key lives in keystore/platform.{pk8,x509.pem} and is committed on
purpose: it's the public AOSP test-key, not a secret, and the build needs it to produce a
system-signed APK for this test-key-signed ROM.
To go back to the OEM launcher:
bash scripts/teardown_device.sh <device-ip>:5555 com.example.car_launcher/.MainActivity --uninstallapp/ the launcher (Kotlin + Android Views)
HomeActivity HOME app: immersive wallpaper, clock, Now Playing, toggles
DockOverlayService persistent service hosting the global overlays
DockController all overlay windows: edge strips, dock, drawer, split chooser, divider
SplitController/SystemSplit privileged freeform split via hidden framework APIs
AppRepository launchable apps, icons, recents (UsageStatsManager)
BlobWallpaperService the drifting-glow live wallpaper
magisk/floatball-killer/ systemless module that removes the OEM sidebar + status bar
scripts/ build, deploy, teardown, sidebar toggle helpers
keystore/ public AOSP platform test-key
screenshots/ captures from the box + emulator, including the build journey
This targets the Carlinkit TBox Ambient specifically: SM6225 (bengal), Android 13, 800x480 at 120dpi, rooted with Magisk, and crucially signed with the AOSP platform test-key. On a box that isn't platform-test-key signed, the privileged features (split, input injection, task management) won't be granted and you'll be left with home/dock/drawer at normal app privileges. The screen layout is also hard-tuned for 800x480.
Home, dock, drawer, fullscreen launch, gesture nav, live themes, sidebar/status-bar removal, and real split-screen with a draggable divider are all working and verified on the actual box. Daily-driven in the car.








