Turn the touchpad on the original NVIDIA SHIELD Controller (2015, USB
0955:7210) into a system-wide mouse on SHIELD TV while keeping the buttons,
sticks, triggers, and shoulder buttons available as a normal gamepad.
- Moves a visible pointer with the controller's physical touchpad.
- Clicks when the touchpad is physically pressed.
- Preserves the rest of the controller through a virtual UHID gamepad.
- Provides a TV-friendly speed slider from 0.50x to 3.00x.
- Restores the helper automatically after a SHIELD restart or controller reconnect, with no PC needed after one-time setup.
- Uses the pointer artwork already included in the SHIELD Android framework.
- Requires no root, unlocked bootloader, or firmware modification.
This project is independent and is not affiliated with or endorsed by NVIDIA.
| Item | Status |
|---|---|
Original SHIELD Controller 2015 (0955:7210) |
Supported and tested |
| SHIELD TV 2015 Pro, SHIELD Experience 9.2.1 / Android TV 11 | Tested |
| SHIELD TV 2017 and 2019 hosts | Expected to work, not fully tested |
| SHIELD Controller 2017 | Not supported by this release |
| Root access | Not required |
| PC after initial setup | Not required |
Download ShieldTouchpadMouse-v2.1-public-r4.apk from the
latest GitHub release.
Verify the APK before installing:
SHA-256 3E5CC06AE70BDB4AD2B3E66FEB795FFEA40F9A47733A79C8F7544E974473D029
Size 50,002 bytes
Package com.drmoss.shieldtouchpadmouse
Version 2.1-public-r4 (versionCode 16)
The current APK is development/debug signed. Google Play Protect may therefore identify it as an unknown sideloaded app. Confirm the checksum and only install the APK if you trust this source. A future Play-distributed build should use a private production signing key.
- Install and open the APK on the SHIELD.
- Connect or wake the original 2015 controller.
- Select Grant and approve controller access.
- Select Open settings, then enable Shield Touchpad Mouse under Accessibility.
- Enable Developer options > Network debugging on the SHIELD.
- Return to the app and select Authorize.
- On the debugging prompt, check Always allow from this computer, then select Allow. The “computer” is the app's local key on the same SHIELD.
- When all four checks are green, select Finish setup.
Network debugging must remain enabled for automatic recovery after restarts and
reconnects. The app connects only to 127.0.0.1:5555; it does not contact an
internet server.
For every screen and menu path, see the complete installation tutorial.
| Action | Control |
|---|---|
| Move pointer | Slide one finger on the touchpad |
| Click | Physically press the touchpad |
| Change speed | Focus the slider and use D-pad left/right |
| Temporarily stop | Select Stop mouse in the app |
| Resume | Select Start mouse + gamepad |
| Gamepad input | All non-touchpad reports are passed through unchanged |
There is no L1/R1 filter in Public R4. All normal buttons are preserved.
NVIDIA's firmware-native controller mouse is the simpler option, but on the tested Android TV firmware it is hard-coded to the right stick. This app's compatibility mode is for people who specifically want the physical touchpad and still need the controller to work as a gamepad.
| Capability | Standard NVIDIA mode | This app |
|---|---|---|
| Pointer control | Right stick on tested firmware | 2015 controller touchpad |
| Touchpad press as click | Not in the tested native TV path | Yes |
| Gamepad remains usable | Yes, directly | Yes, through virtual gamepad |
| Accessibility required | No | Yes |
| Developer / Network debugging | No | Yes |
| Root or modified firmware | No | No |
| Speed control | Firmware/app dependent | Built-in 0.50x-3.00x slider |
| Firmware dependency | Private NVIDIA behavior | Raw 2015-controller HID format |
Read the full comparison and recommendation.
2015 controller USB HID
|
v
Android app claims the HID interface
| |
| report ID 2 | every other HID report
v v
touchpad parser loopback bridge (127.0.0.1:47210)
| |
v v
Accessibility cursor/tap shell-owned /dev/uhid virtual gamepad
The on-device helper is needed because Android's normal app security domain
cannot write /dev/uhid. The app uses the SHIELD's already enabled local ADB
service to install and start that narrowly scoped helper as shell. Helper
files are checked with SHA-256 before reuse. See How it works
for the detailed sequence and threat model.
- No accounts, analytics, ads, telemetry, or remote servers.
- Accessibility event contents are ignored; Accessibility is used only to draw the pointer and dispatch a tap.
- The
INTERNETpermission is used for localhost ADB and the localhost gamepad bridge. - The gamepad bridge listens only on
127.0.0.1and requires an app/bridge token. - Network debugging itself exposes ADB on the local network on this SHIELD firmware. Use it only on a trusted network and understand the tradeoff.
Read Privacy and Security before enabling the app.
Requirements:
- JDK 17
- Android SDK Platform 36 and Build Tools
- Internet access for the first Gradle dependency download
The committed helper binaries are staged into the APK automatically:
.\gradlew.bat clean lintRelease assembleReleaseOutput: app/build/outputs/apk/release/app-release.apk
The current release build type intentionally uses the Android debug signing
configuration so contributors can reproduce this development release. Do not
publish updates under your own key as if they were signed by this release.
Production distribution needs a protected release key and a new trust chain.
See bridge/README.md to rebuild the native and Java helper artifacts. Third-party licensing is in THIRD_PARTY_NOTICES.txt.
- Complete installation tutorial
- Standard mode vs. touchpad compatibility mode
- Architecture and technical details
- Troubleshooting and removal
- Technical research and alternatives
- Changelog
No project license has been selected yet. The repository is source-available,
but no permission to redistribute modified builds is granted unless a license
is added. The bundled adblib dependency remains under its own BSD license.
