A minimal Android app that turns a phone's display into a virtual touchpad for controlling the cursor on an external monitor (desktop mode).
- Cursor movement – one finger, relative movement like a laptop touchpad
- Click – short one-finger tap
- Scroll – two-finger vertical drag
- Android 9+ (Pixel 8 with Android 15/16/17 ideal)
- Shizuku installed and running
- External display connected via USB-C
- "Universal cursor" turned OFF — Settings → Connected devices → External displays → (built-in display) → this toggle only appears when "Mirror built-in display" is off. With it on, Android lets the system cursor roam across both the phone screen and the external display, which fights with this app (the phone screen is a touch surface only — there's nothing useful for a cursor to do there). Leave it off so the cursor stays reliably on the external display.
- The app connects to Shizuku and starts a privileged service
- The service uses
InputManager.injectInputEvent()to inject mouse events on the secondary display - TouchpadView on the phone captures touch gestures and translates them into cursor movement
To build directly on your own x86_64 Linux machine (no waiting on CI), see BUILD.md.
Go to github.com/new and create a new repository (e.g. PixelTouchpad).
cd PixelTouchpad
git init
git add .
git commit -m "Initial commit"
git branch -M main
git remote add origin https://github.com/YOUR_USERNAME/PixelTouchpad.git
git push -u origin main- Go to the Actions tab in the repository
- The build starts automatically on push
- Once done (about 3-5 minutes), click the run → Artifacts → download
PixelTouchpad-debug.zip
- Unzip the ZIP – it contains an
.apkfile - Transfer it to the phone and install it (allow installs from unknown sources)
- Start Shizuku and activate the service (Wireless debugging)
- Connect the monitor via a USB-C cable
- Turn on desktop mode in Developer options
- Open Pixel Touchpad
- Tap Connect – the app connects to Shizuku and finds the external display
- The touchpad activates – move your finger across the phone's display
In TouchpadView.kt:
var sensitivity = 2.5f // cursor speed
var scrollSensitivity = 0.03f // scroll speedIn TouchpadView.kt:
private val tapMaxDuration = 200L // max touch duration for a click (ms)
private val tapMaxDistance = 30f // max finger movement for a click (px)- The cursor resets to the middle of the display after an app restart
- Requires restarting Shizuku after a phone restart
MIT – do whatever you want with it.