Mapping autofocus and keystone to your remote on the Nexigo Nova Mini
The Nexigo Nova Mini (Android TV 14, MediaTek) buries autofocus and keystone deep inside Settings. Here is how I found the real entry points and bound them to remote buttons, with no root and no custom firmware.
My unit reports itself as a Formovie/Fengmi PJ08 (device codename tianshan). The Nova Mini appears to be a rebrand.adb screencap. The camera uses this pattern to measure sharpness and the picture's shape. The projector also has time of flight sensors to assist in keystone correction.Setup
- Enable Developer options, then Wireless debugging.
- Pair and connect:
adb pair <ip>:<pairing-port> # one-time code from the pairing dialog adb connect <ip>:<connect-port> # the port changes every session; see `adb mdns services` - Install a key remapper. I used the free version of TV Quick Actions, which can fire arbitrary intents from a remote button.
Dead end: the Fengmi intents
Strings in the firmware suggest these actions:
com.fengmi.projector.imaging.action.START_FOCUScom.fengmi.projector.imaging.action.START_AUTO_KEYSTONEcom.fengmi.projector.imaging.action.START_KEYSTONE
They crash with "Item already exists" inside MotorManager.getMotorType. They seem to be remnants of a different projector model. Don't use them.
Where the real code lives
I ran adb logcat while triggering each function from Settings → Projector. The work is done by the com.appo.* packages:
| Package | Role |
|---|---|
com.appo.settings | The settings UI. All activities are exported=false. |
com.appo.gtv.autofeature | AutoFocusService, which does the camera and TOF work. |
Autofocus and auto keystone: start a service
Decompiling AutoCalibration.trigger() (androguard works well) shows the trigger. Start the service with an action and an int extra:
adb shell am startservice \
-n com.appo.gtv.autofeature/com.appo.autofocusdk.AutoFocusService \
-a com.appo.autoforcesdk.startAuto \
--ei auto_focus_type <N>A harmless SecurityException: Caller with uid 1047 is not android shows up in logcat. Ignore it.
The values of N are separate cases, not bit flags. I tried combining them, and 59 does nothing.
| N | Behaviour (observed on my unit) |
|---|---|
| 24 (or no extra) | Focus only, about 7 s |
| 629 | Focus only (what the Settings Focus button sends) |
| 35 | Camera keystone only, about 4 s |
| 273 | TOF keystone only, about 2 s |
| 278 | Focus, then TOF keystone, about 10 s. |
| 279 | Combined camera pass (focus and keystone), about 8–9 s. The picture ended up square. |
| 33 | Resets keystone to the full 1920×1080 rectangle |
Handy log tag: KeystoneFragment prints curKeystoneData, the four corner points. The reset value is [0, 0, 1920, 0, 0, 1080, 1920, 1080].
Manual keystone: an unexported activity that launches anyway
The Settings activities are not exported, but the manual keystone screen belongs to the autofeature app. I logged START u0 lines while opening it from Settings:
com.appo.gtv.autofeature/.manualkeystone.TCheckActivityIt launches straight from adb:
adb shell am start -n com.appo.gtv.autofeature/.manualkeystone.TCheckActivityOn this firmware the activity opens fine from outside, so a remapper can open it too.
Binding to the remote (TV Quick Actions)
I assigned the Guide button to open the QuickActions panel, with these keys inside it:
- UP: Service intent, action
com.appo.autoforcesdk.startAuto, packagecom.appo.gtv.autofeature, classcom.appo.autofocusdk.AutoFocusService, int extraauto_focus_type=279. - LEFT: Activity intent, package
com.appo.gtv.autofeature, classcom.appo.gtv.autofeature.manualkeystone.TCheckActivity. - RIGHT: The same service intent with
auto_focus_type=629(focus only).
Free-version quirks:
- Full-screen ads and surveys appear after some interactions. Look for Skip or the small X. Google surveys seem to be glitched and required ADB to click skip
- Integer extras may show "Invalid!" but still save.
- Pick an icon, or Save is not available.














