|
| 1 | +# HarmonyOS densified trajectory pan drags a real slider, 2026-11-08 |
| 2 | + |
| 3 | +Evidence for #4239 (inject gesture pan as a densified touch-panel |
| 4 | +trajectory): one densified pan through the panel evdev chain dragged a real |
| 5 | +slider-captcha knob 439 px across its track, and the app's own |
| 6 | +machine-readable oracle scored the alignment at 3 px off target — inside its |
| 7 | +20 px tolerance, `RESULT=PASS`. |
| 8 | + |
| 9 | +## Device |
| 10 | + |
| 11 | +- HUAWEI 畅享 90 Plus, model `JDY-AL50`, HarmonyOS 7.0.0.111 (SP10C00E111R4P3), API 26 |
| 12 | +- Serial `77TYD26826028730`, USB, `hdc shell` as uid 2000 (shell) |
| 13 | +- Surface: `com.stringzhao.captchaab`, its slider-puzzle page — a test harness |
| 14 | + app whose status bar carries a machine-readable verdict row |
| 15 | + (`ROUND=... RESULT=... DETAIL=... TYPE=slider`), so the oracle needs no |
| 16 | + screenshots. |
| 17 | + |
| 18 | +## Run |
| 19 | + |
| 20 | +Knob at the track's left edge (x≈165, y≈1084); the puzzle gap sat 439 px to |
| 21 | +the right. One densified pan, default transport (the panel node): |
| 22 | + |
| 23 | +```sh |
| 24 | +$ node bin/agent-device.mjs gesture pan 165 1084 439 0 900 \ |
| 25 | + --platform harmonyos --serial 77TYD26826028730 |
| 26 | +Panned (165, 1084) by (439, 0) |
| 27 | +``` |
| 28 | + |
| 29 | +The verdict row before and after: |
| 30 | + |
| 31 | +``` |
| 32 | +ROUND=1 RESULT=NONE DETAIL=- PASS=0 FAIL=0 TYPE=slider |
| 33 | +ROUND=1 RESULT=PASS DETAIL=offset=3px tol=20 PASS=1 FAIL=0 TYPE=slider |
| 34 | +``` |
| 35 | + |
| 36 | +The after screenshot shows the knob at ≈x 606 on the track and the puzzle |
| 37 | +piece seated in the gap. The requested displacement (165 + 439 = 604) and the |
| 38 | +scored landing (offset 3 px inside a 20 px tolerance) agree. |
| 39 | + |
| 40 | +## Why this evidences the transport |
| 41 | + |
| 42 | +The slider only moves while a touch sequence holds, carries, and releases it — |
| 43 | +a straight-line UIInput swipe also moves it, but this branch's pan lowers the |
| 44 | +stroke as a densified sample chain through the panel's input node with a |
| 45 | +success sentinel (a denied or failed panel write can never report a completed |
| 46 | +gesture; a reboot-renumbered node re-probes). The pass at 3 px shows the |
| 47 | +sample chain held the drag across its whole length on hardware. |
| 48 | + |
| 49 | +## Reproduce |
| 50 | + |
| 51 | +Open the app to its slider page, read the machine row, run the pan, read the |
| 52 | +row again: |
| 53 | + |
| 54 | +```sh |
| 55 | +hdc -t 77TYD26826028730 shell "aa start -b com.stringzhao.captchaab -a EntryAbility" |
| 56 | +node bin/agent-device.mjs press @e11 --platform harmonyos --serial 77TYD26826028730 |
| 57 | +node bin/agent-device.mjs gesture pan 165 1084 439 0 900 --platform harmonyos --serial 77TYD26826028730 |
| 58 | +node bin/agent-device.mjs snapshot --platform harmonyos --serial 77TYD26826028730 | grep 'ROUND=' |
| 59 | +``` |
| 60 | + |
| 61 | +The knob start position and the gap move per round; read both from a |
| 62 | +screenshot before the drag. |
0 commit comments