execbro 2.5.0 → 2.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/build/__tests__/unit/androidPinch.test.d.ts +2 -0
- package/build/__tests__/unit/androidPinch.test.d.ts.map +1 -0
- package/build/__tests__/unit/androidPinch.test.js +119 -0
- package/build/__tests__/unit/androidPinch.test.js.map +1 -0
- package/build/__tests__/unit/emulatorBridge.test.d.ts +2 -0
- package/build/__tests__/unit/emulatorBridge.test.d.ts.map +1 -0
- package/build/__tests__/unit/emulatorBridge.test.js +76 -0
- package/build/__tests__/unit/emulatorBridge.test.js.map +1 -0
- package/build/__tests__/unit/emulatorGrpc.test.d.ts +2 -0
- package/build/__tests__/unit/emulatorGrpc.test.d.ts.map +1 -0
- package/build/__tests__/unit/emulatorGrpc.test.js +33 -0
- package/build/__tests__/unit/emulatorGrpc.test.js.map +1 -0
- package/build/__tests__/unit/pinchGeometry.test.d.ts +2 -0
- package/build/__tests__/unit/pinchGeometry.test.d.ts.map +1 -0
- package/build/__tests__/unit/pinchGeometry.test.js +139 -0
- package/build/__tests__/unit/pinchGeometry.test.js.map +1 -0
- package/build/__tests__/unit/pinchTool.test.d.ts +2 -0
- package/build/__tests__/unit/pinchTool.test.d.ts.map +1 -0
- package/build/__tests__/unit/pinchTool.test.js +51 -0
- package/build/__tests__/unit/pinchTool.test.js.map +1 -0
- package/build/core/androidPinch.d.ts +21 -0
- package/build/core/androidPinch.d.ts.map +1 -0
- package/build/core/androidPinch.js +72 -0
- package/build/core/androidPinch.js.map +1 -0
- package/build/core/androidSystemBars.d.ts +7 -0
- package/build/core/androidSystemBars.d.ts.map +1 -0
- package/build/core/androidSystemBars.js +21 -0
- package/build/core/androidSystemBars.js.map +1 -0
- package/build/core/emulatorBridge.d.ts +17 -0
- package/build/core/emulatorBridge.d.ts.map +1 -0
- package/build/core/emulatorBridge.js +78 -0
- package/build/core/emulatorBridge.js.map +1 -0
- package/build/core/emulatorGrpc.d.ts +14 -0
- package/build/core/emulatorGrpc.d.ts.map +1 -0
- package/build/core/emulatorGrpc.js +93 -0
- package/build/core/emulatorGrpc.js.map +1 -0
- package/build/core/guides.d.ts.map +1 -1
- package/build/core/guides.js +18 -2
- package/build/core/guides.js.map +1 -1
- package/build/core/index.d.ts +2 -0
- package/build/core/index.d.ts.map +1 -1
- package/build/core/index.js +1 -0
- package/build/core/index.js.map +1 -1
- package/build/core/pinchGeometry.d.ts +28 -0
- package/build/core/pinchGeometry.d.ts.map +1 -0
- package/build/core/pinchGeometry.js +97 -0
- package/build/core/pinchGeometry.js.map +1 -0
- package/build/core/pinchThresholds.d.ts +15 -0
- package/build/core/pinchThresholds.d.ts.map +1 -0
- package/build/core/pinchThresholds.js +10 -0
- package/build/core/pinchThresholds.js.map +1 -0
- package/build/tools/interactionTools.d.ts.map +1 -1
- package/build/tools/interactionTools.js +191 -2
- package/build/tools/interactionTools.js.map +1 -1
- package/package.json +1 -1
- package/tools.json +15 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"androidPinch.js","sourceRoot":"","sources":["../../src/core/androidPinch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare const SYSTEM_GESTURE_MARGIN_PX = 64;
|
|
2
|
+
export interface SystemBarInsets {
|
|
3
|
+
top: number;
|
|
4
|
+
bottom: number;
|
|
5
|
+
}
|
|
6
|
+
export declare function androidSystemBarInsets(deviceId?: string): Promise<SystemBarInsets | null>;
|
|
7
|
+
//# sourceMappingURL=androidSystemBars.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"androidSystemBars.d.ts","sourceRoot":"","sources":["../../src/core/androidSystemBars.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,wBAAwB,KAAK,CAAC;AAE3C,MAAM,WAAW,eAAe;IAE5B,GAAG,EAAE,MAAM,CAAC;IAEZ,MAAM,EAAE,MAAM,CAAC;CAClB;AAkBD,wBAAsB,sBAAsB,CACxC,QAAQ,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAgCjC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { execAsync } from "./exec.js";
|
|
2
|
+
export const SYSTEM_GESTURE_MARGIN_PX = 64;
|
|
3
|
+
export async function androidSystemBarInsets(deviceId) {
|
|
4
|
+
const deviceArg = deviceId ? `-s ${deviceId}` : "";
|
|
5
|
+
try {
|
|
6
|
+
const { stdout } = await execAsync(`adb ${deviceArg} shell "dumpsys window | grep -E 'InsetsSource.*(statusBars|navigationBars)'"`, { timeout: 10000 });
|
|
7
|
+
const status = stdout.match(/statusBars\s+frame=\[\d+,(\d+)\]\[\d+,(\d+)\]/);
|
|
8
|
+
const nav = stdout.match(/navigationBars\s+frame=\[\d+,(\d+)\]\[\d+,(\d+)\]/);
|
|
9
|
+
const top = status ? parseInt(status[2], 10) - parseInt(status[1], 10) : 0;
|
|
10
|
+
const bottom = nav ? parseInt(nav[2], 10) - parseInt(nav[1], 10) : 0;
|
|
11
|
+
if (!Number.isFinite(top) || !Number.isFinite(bottom))
|
|
12
|
+
return null;
|
|
13
|
+
if (top === 0 && bottom === 0)
|
|
14
|
+
return null;
|
|
15
|
+
return { top: top + SYSTEM_GESTURE_MARGIN_PX, bottom: bottom + SYSTEM_GESTURE_MARGIN_PX };
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=androidSystemBars.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"androidSystemBars.js","sourceRoot":"","sources":["../../src/core/androidSystemBars.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAMtC,MAAM,CAAC,MAAM,wBAAwB,GAAG,EAAE,CAAC;AAyB3C,MAAM,CAAC,KAAK,UAAU,sBAAsB,CACxC,QAAiB;IAEjB,MAAM,SAAS,GAAG,QAAQ,CAAC,CAAC,CAAC,MAAM,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACnD,IAAI,CAAC;QACD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAC9B,OAAO,SAAS,+EAA+E,EAC/F,EAAE,OAAO,EAAE,KAAK,EAAE,CACrB,CAAC;QAIF,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC;QAC7E,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC;QAE9E,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3E,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAErE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE,OAAO,IAAI,CAAC;QACnE,IAAI,GAAG,KAAK,CAAC,IAAI,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAW3C,OAAO,EAAE,GAAG,EAAE,GAAG,GAAG,wBAAwB,EAAE,MAAM,EAAE,MAAM,GAAG,wBAAwB,EAAE,CAAC;IAC9F,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,IAAI,CAAC;IAChB,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface EmulatorBridge {
|
|
2
|
+
port: number;
|
|
3
|
+
token: string;
|
|
4
|
+
avdName?: string;
|
|
5
|
+
}
|
|
6
|
+
export type BridgeFailureReason = "not-emulator" | "unsupported-host" | "no-discovery-file" | "no-grpc-keys";
|
|
7
|
+
export type BridgeResolution = {
|
|
8
|
+
ok: true;
|
|
9
|
+
bridge: EmulatorBridge;
|
|
10
|
+
} | {
|
|
11
|
+
ok: false;
|
|
12
|
+
reason: BridgeFailureReason;
|
|
13
|
+
message: string;
|
|
14
|
+
};
|
|
15
|
+
export declare function emulatorRunningDir(platform?: NodeJS.Platform, home?: string): string | null;
|
|
16
|
+
export declare function resolveEmulatorBridge(serial: string, runningDir?: string): Promise<BridgeResolution>;
|
|
17
|
+
//# sourceMappingURL=emulatorBridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emulatorBridge.d.ts","sourceRoot":"","sources":["../../src/core/emulatorBridge.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,cAAc;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,mBAAmB,GACzB,cAAc,GACd,kBAAkB,GAClB,mBAAmB,GACnB,cAAc,CAAC;AAErB,MAAM,MAAM,gBAAgB,GACtB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,cAAc,CAAA;CAAE,GACpC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,mBAAmB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AASlE,wBAAgB,kBAAkB,CAC9B,QAAQ,GAAE,MAAM,CAAC,QAA2B,EAC5C,IAAI,GAAE,MAAkB,GACzB,MAAM,GAAG,IAAI,CAKf;AAoBD,wBAAsB,qBAAqB,CACvC,MAAM,EAAE,MAAM,EACd,UAAU,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,gBAAgB,CAAC,CA8D3B"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { readdir, readFile } from "node:fs/promises";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
export function emulatorRunningDir(platform = process.platform, home = homedir()) {
|
|
5
|
+
if (platform === "darwin") {
|
|
6
|
+
return join(home, "Library", "Caches", "TemporaryItems", "avd", "running");
|
|
7
|
+
}
|
|
8
|
+
return null;
|
|
9
|
+
}
|
|
10
|
+
function parseIni(text) {
|
|
11
|
+
const out = {};
|
|
12
|
+
for (const line of text.split("\n")) {
|
|
13
|
+
const eq = line.indexOf("=");
|
|
14
|
+
if (eq <= 0)
|
|
15
|
+
continue;
|
|
16
|
+
out[line.slice(0, eq).trim()] = line.slice(eq + 1).trim();
|
|
17
|
+
}
|
|
18
|
+
return out;
|
|
19
|
+
}
|
|
20
|
+
export async function resolveEmulatorBridge(serial, runningDir) {
|
|
21
|
+
const match = /^emulator-(\d+)$/.exec(serial.trim());
|
|
22
|
+
if (!match) {
|
|
23
|
+
return {
|
|
24
|
+
ok: false,
|
|
25
|
+
reason: "not-emulator",
|
|
26
|
+
message: `'${serial}' is a physical Android device. Multi-touch needs the emulator's ` +
|
|
27
|
+
`gRPC bridge, which physical devices do not expose. Run the app on an emulator to use pinch.`,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
const consolePort = match[1];
|
|
31
|
+
const dir = runningDir ?? emulatorRunningDir();
|
|
32
|
+
if (!dir) {
|
|
33
|
+
return {
|
|
34
|
+
ok: false,
|
|
35
|
+
reason: "unsupported-host",
|
|
36
|
+
message: `The emulator discovery directory is only verified on macOS, so pinch is not ` +
|
|
37
|
+
`enabled on ${process.platform} yet.`,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
let entries;
|
|
41
|
+
try {
|
|
42
|
+
entries = await readdir(dir);
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
entries = [];
|
|
46
|
+
}
|
|
47
|
+
for (const name of entries) {
|
|
48
|
+
if (!name.startsWith("pid_") || !name.endsWith(".ini"))
|
|
49
|
+
continue;
|
|
50
|
+
let ini;
|
|
51
|
+
try {
|
|
52
|
+
ini = parseIni(await readFile(join(dir, name), "utf8"));
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
if (ini["port.serial"] !== consolePort)
|
|
58
|
+
continue;
|
|
59
|
+
const port = Number(ini["grpc.port"]);
|
|
60
|
+
const token = ini["grpc.token"];
|
|
61
|
+
if (!Number.isInteger(port) || port <= 0 || !token) {
|
|
62
|
+
return {
|
|
63
|
+
ok: false,
|
|
64
|
+
reason: "no-grpc-keys",
|
|
65
|
+
message: `${name} has no gRPC bridge (missing grpc.port/grpc.token). The emulator is ` +
|
|
66
|
+
`too old or was started with gRPC disabled; pinch needs a version that exposes it.`,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
return { ok: true, bridge: { port, token, avdName: ini["avd.name"] } };
|
|
70
|
+
}
|
|
71
|
+
return {
|
|
72
|
+
ok: false,
|
|
73
|
+
reason: "no-discovery-file",
|
|
74
|
+
message: `No emulator discovery file in ${dir} matches console port ${consolePort}. ` +
|
|
75
|
+
`Expected a pid_*.ini with port.serial=${consolePort}.`,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=emulatorBridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emulatorBridge.js","sourceRoot":"","sources":["../../src/core/emulatorBridge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { EmulatorBridge } from "./emulatorBridge.js";
|
|
2
|
+
export interface TouchPoint {
|
|
3
|
+
x: number;
|
|
4
|
+
y: number;
|
|
5
|
+
identifier: number;
|
|
6
|
+
pressure: number;
|
|
7
|
+
}
|
|
8
|
+
export declare function encodeTouchEvent(touches: TouchPoint[]): Buffer;
|
|
9
|
+
export declare function frameGrpcMessage(message: Buffer): Buffer;
|
|
10
|
+
export declare function sendTouchFrames(bridge: EmulatorBridge, frames: TouchPoint[][], frameDelayMs: number): Promise<{
|
|
11
|
+
success: boolean;
|
|
12
|
+
error?: string;
|
|
13
|
+
}>;
|
|
14
|
+
//# sourceMappingURL=emulatorGrpc.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emulatorGrpc.d.ts","sourceRoot":"","sources":["../../src/core/emulatorGrpc.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAG1D,MAAM,WAAW,UAAU;IACvB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CACpB;AAqCD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,MAAM,CAc9D;AAGD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAKxD;AAyDD,wBAAsB,eAAe,CACjC,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,UAAU,EAAE,EAAE,EACtB,YAAY,EAAE,MAAM,GACrB,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAqB/C"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import http2 from "node:http2";
|
|
2
|
+
const SEND_TOUCH_PATH = "/android.emulation.control.EmulatorController/sendTouch";
|
|
3
|
+
const FRAME_TIMEOUT_MS = 5000;
|
|
4
|
+
function varint(value) {
|
|
5
|
+
const out = [];
|
|
6
|
+
let v = value;
|
|
7
|
+
while (v > 0x7f) {
|
|
8
|
+
out.push((v & 0x7f) | 0x80);
|
|
9
|
+
v >>>= 7;
|
|
10
|
+
}
|
|
11
|
+
out.push(v);
|
|
12
|
+
return Buffer.from(out);
|
|
13
|
+
}
|
|
14
|
+
function varintField(fieldNumber, value) {
|
|
15
|
+
return Buffer.concat([varint(fieldNumber << 3), varint(value)]);
|
|
16
|
+
}
|
|
17
|
+
function lengthField(fieldNumber, payload) {
|
|
18
|
+
return Buffer.concat([varint((fieldNumber << 3) | 2), varint(payload.length), payload]);
|
|
19
|
+
}
|
|
20
|
+
export function encodeTouchEvent(touches) {
|
|
21
|
+
return Buffer.concat(touches.map((t) => lengthField(1, Buffer.concat([
|
|
22
|
+
varintField(1, Math.max(0, Math.round(t.x))),
|
|
23
|
+
varintField(2, Math.max(0, Math.round(t.y))),
|
|
24
|
+
varintField(3, t.identifier),
|
|
25
|
+
varintField(4, t.pressure),
|
|
26
|
+
]))));
|
|
27
|
+
}
|
|
28
|
+
export function frameGrpcMessage(message) {
|
|
29
|
+
const header = Buffer.alloc(5);
|
|
30
|
+
header.writeUInt8(0, 0);
|
|
31
|
+
header.writeUInt32BE(message.length, 1);
|
|
32
|
+
return Buffer.concat([header, message]);
|
|
33
|
+
}
|
|
34
|
+
function sendOneFrame(session, bridge, touches) {
|
|
35
|
+
return new Promise((resolve, reject) => {
|
|
36
|
+
const req = session.request({
|
|
37
|
+
":method": "POST",
|
|
38
|
+
":path": SEND_TOUCH_PATH,
|
|
39
|
+
"content-type": "application/grpc",
|
|
40
|
+
authorization: `Bearer ${bridge.token}`,
|
|
41
|
+
te: "trailers",
|
|
42
|
+
});
|
|
43
|
+
let status = null;
|
|
44
|
+
const timer = setTimeout(() => {
|
|
45
|
+
req.close();
|
|
46
|
+
reject(new Error("timed out waiting for sendTouch"));
|
|
47
|
+
}, FRAME_TIMEOUT_MS);
|
|
48
|
+
const readStatus = (headers) => {
|
|
49
|
+
const s = headers["grpc-status"];
|
|
50
|
+
if (s != null)
|
|
51
|
+
status = String(s);
|
|
52
|
+
};
|
|
53
|
+
req.on("response", readStatus);
|
|
54
|
+
req.on("trailers", readStatus);
|
|
55
|
+
req.on("error", (err) => {
|
|
56
|
+
clearTimeout(timer);
|
|
57
|
+
reject(err);
|
|
58
|
+
});
|
|
59
|
+
req.on("end", () => {
|
|
60
|
+
clearTimeout(timer);
|
|
61
|
+
if (status === null || status === "0")
|
|
62
|
+
resolve();
|
|
63
|
+
else
|
|
64
|
+
reject(new Error(`grpc-status ${status}`));
|
|
65
|
+
});
|
|
66
|
+
req.end(frameGrpcMessage(encodeTouchEvent(touches)));
|
|
67
|
+
req.resume();
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
|
|
71
|
+
export async function sendTouchFrames(bridge, frames, frameDelayMs) {
|
|
72
|
+
let session;
|
|
73
|
+
try {
|
|
74
|
+
session = http2.connect(`http://127.0.0.1:${bridge.port}`);
|
|
75
|
+
session.on("error", () => { });
|
|
76
|
+
for (let i = 0; i < frames.length; i++) {
|
|
77
|
+
await sendOneFrame(session, bridge, frames[i]);
|
|
78
|
+
if (i < frames.length - 1 && frameDelayMs > 0)
|
|
79
|
+
await sleep(frameDelayMs);
|
|
80
|
+
}
|
|
81
|
+
return { success: true };
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
return {
|
|
85
|
+
success: false,
|
|
86
|
+
error: error instanceof Error ? error.message : String(error),
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
finally {
|
|
90
|
+
session?.close();
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=emulatorGrpc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emulatorGrpc.js","sourceRoot":"","sources":["../../src/core/emulatorGrpc.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"guides.d.ts","sourceRoot":"","sources":["../../src/core/guides.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,KAAK;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACnB;
|
|
1
|
+
{"version":3,"file":"guides.d.ts","sourceRoot":"","sources":["../../src/core/guides.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,KAAK;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACnB;AAmZD,eAAO,MAAM,aAAa,EAAE,MAchB,CAAC;AAEb,wBAAgB,gBAAgB,IAAI,MAAM,CAWzC;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAI5D;AAED,wBAAgB,kBAAkB,IAAI,MAAM,EAAE,CAE7C"}
|
package/build/core/guides.js
CHANGED
|
@@ -122,7 +122,7 @@ tap(x, y) unchanged. Do not divide by the device pixel ratio.
|
|
|
122
122
|
{
|
|
123
123
|
id: "interact",
|
|
124
124
|
title: "Device Interaction",
|
|
125
|
-
summary: "Tap buttons, swipe, type text, and navigate the app UI",
|
|
125
|
+
summary: "Tap buttons, swipe, pinch to zoom, type text, and navigate the app UI",
|
|
126
126
|
content: `# Device Interaction
|
|
127
127
|
|
|
128
128
|
## Prerequisites
|
|
@@ -142,6 +142,22 @@ Use tap — it tries multiple strategies automatically and returns a post-tap sc
|
|
|
142
142
|
tap returns a screenshot after every action (screenshot=true by default) — no need to call ios_screenshot/android_screenshot after tapping.
|
|
143
143
|
For coordinate/accessibility/OCR taps, it also verifies if the tap caused a visual change (verify=true by default). Set screenshot=false for fastest execution.
|
|
144
144
|
|
|
145
|
+
## Pinch to Zoom (Android emulator only — iOS in progress)
|
|
146
|
+
pinch sends REAL two-finger touch events through the Android emulator's multi-touch bridge, so it drives anything on screen — React Native, native views, WebViews, maps:
|
|
147
|
+
1. pinch(direction="out") — fingers spread apart, zooms IN at screen centre
|
|
148
|
+
2. pinch(direction="in") — fingers converge, zooms OUT
|
|
149
|
+
3. pinch(direction="out", x=..., y=...) — zoom pivots on that point (screenshot pixels, same space as tap and get_screen_state)
|
|
150
|
+
4. pinch(direction="out", scale=8) — bigger ratio; values too large for one gesture chain automatically
|
|
151
|
+
5. pinch(angle=90) — fingers on the vertical axis instead of horizontal
|
|
152
|
+
|
|
153
|
+
Read verification.meaningful, exactly like swipe: false means nothing zoomed (surface is not zoomable, already at a zoom limit, or the focal point missed it).
|
|
154
|
+
|
|
155
|
+
### Controlling the gesture's footprint with span
|
|
156
|
+
span is the fraction of the available screen the gesture occupies. It defaults to 1 for direction="out" and 0.5 for direction="in", because a pinch-in STARTS with the fingers far apart — a full span would land its contacts at the screen extremes, where a top bar or a bottom sheet takes the gesture before the zoomable surface sees it. Lower span further if a gesture still lands on surrounding UI; raise it to zoom out further in one gesture. It does not change the zoom ratio (that is scale).
|
|
157
|
+
|
|
158
|
+
### Platform support
|
|
159
|
+
Android emulators only. Physical Android devices have no gRPC bridge, and iOS needs a multi-touch HID helper that no released idb ships — both return an explicit error rather than a partial result. pinch never fakes a zoom by calling app code: success means real fingers moved.
|
|
160
|
+
|
|
145
161
|
## Best Practice: Use testID
|
|
146
162
|
Set testID on all interactive elements (buttons, inputs, links) for reliable tapping:
|
|
147
163
|
- More stable than text matching — doesn't break with translations or UI text changes
|
|
@@ -383,7 +399,7 @@ export const DECISION_TREE = [
|
|
|
383
399
|
"Call get_usage_guide(topic=...) for end-to-end workflows. Available topics:",
|
|
384
400
|
" setup — session setup (scan_metro, connect_metro, ensure_connection)",
|
|
385
401
|
" logs — console debugging (get_logs, search_logs)",
|
|
386
|
-
" interact — device interaction (tap, swipe, screenshots, android_input_text, dismiss_keyboard)",
|
|
402
|
+
" interact — device interaction (tap, swipe, pinch, screenshots, android_input_text, dismiss_keyboard)",
|
|
387
403
|
" layout — on-screen layout check (get_screen_state, get_screen_layout)",
|
|
388
404
|
" inspect — component inspection (find_components, inspect_component, inspect_at_point)",
|
|
389
405
|
" network — network request inspection (get_network_requests, search_network)",
|
package/build/core/guides.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"guides.js","sourceRoot":"","sources":["../../src/core/guides.ts"],"names":[],"mappings":"AAYA,MAAM,MAAM,GAAY;IACpB;QACI,EAAE,EAAE,OAAO;QACX,KAAK,EAAE,eAAe;QACtB,OAAO,EAAE,yDAAyD;QAClE,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+CA8B8B;KAC1C;IACD;QACI,EAAE,EAAE,SAAS;QACb,KAAK,EAAE,sBAAsB;QAC7B,OAAO,EAAE,mFAAmF;QAC5F,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4GAoC2F;KACvG;IACD;QACI,EAAE,EAAE,QAAQ;QACZ,KAAK,EAAE,kBAAkB;QACzB,OAAO,EAAE,0EAA0E;QACnF,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sFAoCqE;KACjF;IACD;QACI,EAAE,EAAE,UAAU;QACd,KAAK,EAAE,oBAAoB;QAC3B,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"guides.js","sourceRoot":"","sources":["../../src/core/guides.ts"],"names":[],"mappings":"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"}
|
package/build/core/index.d.ts
CHANGED
|
@@ -14,6 +14,8 @@ export { hasMetro, detectNativeDevices, buildMetroMissingHint, metroMissingHintI
|
|
|
14
14
|
export type { NativeDeviceAvailability, MetroMissingHintOptions } from "./nativeOnlyHints.js";
|
|
15
15
|
export { executeInApp, listDebugGlobals, inspectGlobal, reloadApp, getComponentTree, getScreenLayout, formatScreenLayoutTree, getScreenState, enrichScreenshotWithLayout, inspectComponent, findComponents, pressElement, inspectAtPoint, isInspectorActive, harvestStacksAtPoint, enrichWithSource, } from "./executor.js";
|
|
16
16
|
export { isAdbAvailable, listAndroidDevices, getDefaultAndroidDevice, androidScreenshot, androidInstallApp, androidLaunchApp, androidListPackages, ANDROID_KEY_EVENTS, androidTap, androidLongPress, androidSwipe, androidInputText, androidKeyEvent, androidGetScreenSize, androidGetDensity, androidGetStatusBarHeight, androidDescribeAll, androidDescribePoint, androidTapElement, androidGetUITree, androidFindElement, androidWaitForElement, } from "./android.js";
|
|
17
|
+
export { androidPinch } from "./androidPinch.js";
|
|
18
|
+
export type { AndroidPinchOptions, AndroidPinchResult } from "./androidPinch.js";
|
|
17
19
|
export type { AndroidAccessibilityElement, AndroidDescribeResult, AndroidUIElement, FindElementResult, WaitForElementResult, FindElementOptions, } from "./android.js";
|
|
18
20
|
export { isSimctlAvailable, listIOSSimulators, getBootedSimulatorUdid, findSimulatorByName, getActiveOrBootedSimulatorUdid, iosScreenshot, iosInstallApp, iosLaunchApp, iosOpenUrl, iosTerminateApp, iosBootSimulator, isIdbAvailable, isAxeAvailable, isUiDriverAvailable, getUiDriverInstallHint, iosTap, iosTapElement, iosSwipe, iosInputText, iosButton, iosKeyEvent, iosKeySequence, iosDescribeAll, iosDescribePoint, detectIOSSystemOverlay, formatIOSSystemOverlayWarning, IOS_BUTTON_TYPES, iosGetUITree, iosFindElement, iosWaitForElement, getDevicePixelRatio, getIOSSafeAreaTop, } from "./ios.js";
|
|
19
21
|
export type { iOSButtonType, iOSAccessibilityElement, iOSDescribeResult, IOSUIElement, IOSFindElementResult, IOSWaitForElementResult, IOSFindElementOptions, } from "./ios.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"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"}
|
package/build/core/index.js
CHANGED
|
@@ -10,6 +10,7 @@ export { awaitAppDetection } from "./appDetection.js";
|
|
|
10
10
|
export { hasMetro, detectNativeDevices, buildMetroMissingHint, metroMissingHintIfAbsent, } from "./nativeOnlyHints.js";
|
|
11
11
|
export { executeInApp, listDebugGlobals, inspectGlobal, reloadApp, getComponentTree, getScreenLayout, formatScreenLayoutTree, getScreenState, enrichScreenshotWithLayout, inspectComponent, findComponents, pressElement, inspectAtPoint, isInspectorActive, harvestStacksAtPoint, enrichWithSource, } from "./executor.js";
|
|
12
12
|
export { isAdbAvailable, listAndroidDevices, getDefaultAndroidDevice, androidScreenshot, androidInstallApp, androidLaunchApp, androidListPackages, ANDROID_KEY_EVENTS, androidTap, androidLongPress, androidSwipe, androidInputText, androidKeyEvent, androidGetScreenSize, androidGetDensity, androidGetStatusBarHeight, androidDescribeAll, androidDescribePoint, androidTapElement, androidGetUITree, androidFindElement, androidWaitForElement, } from "./android.js";
|
|
13
|
+
export { androidPinch } from "./androidPinch.js";
|
|
13
14
|
export { isSimctlAvailable, listIOSSimulators, getBootedSimulatorUdid, findSimulatorByName, getActiveOrBootedSimulatorUdid, iosScreenshot, iosInstallApp, iosLaunchApp, iosOpenUrl, iosTerminateApp, iosBootSimulator, isIdbAvailable, isAxeAvailable, isUiDriverAvailable, getUiDriverInstallHint, iosTap, iosTapElement, iosSwipe, iosInputText, iosButton, iosKeyEvent, iosKeySequence, iosDescribeAll, iosDescribePoint, detectIOSSystemOverlay, formatIOSSystemOverlayWarning, IOS_BUTTON_TYPES, iosGetUITree, iosFindElement, iosWaitForElement, getDevicePixelRatio, getIOSSafeAreaTop, } from "./ios.js";
|
|
14
15
|
export { BundleErrorBuffer, parseMetroError, formatBundleError, formatBundleErrors, connectMetroBuildEvents, disconnectMetroBuildEvents, isConnectedToMetroBuildEvents, fetchBundleStatus, getBundleErrors, getBundleStatusWithErrors, } from "./bundle.js";
|
|
15
16
|
export { mirrorOnce, startSdkMirrorPoller, stopSdkMirrorPoller, stopAllSdkMirrorPollers, isSdkMirrorPollerRunning, } from "./sdkMirrorPoller.js";
|
package/build/core/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AACA,cAAc,YAAY,CAAC;AAG3B,OAAO,EACL,2BAA2B,EAC3B,mBAAmB,EACnB,qBAAqB,EACrB,kBAAkB,EAClB,sBAAsB,EACtB,mBAAmB,EACnB,kBAAkB,EAClB,aAAa,EACb,mBAAmB,EACnB,sBAAsB,EACtB,qBAAqB,EACrB,uBAAuB,EACvB,wBAAwB,EACxB,qBAAqB,EACrB,4BAA4B,EAC5B,uBAAuB,EACvB,2BAA2B,EAC3B,uBAAuB,EACvB,qBAAqB,EACrB,cAAc,EAEd,iBAAiB,EACjB,gBAAgB,EAChB,mBAAmB,EACnB,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EAEnB,qBAAqB,EACrB,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EACL,UAAU,EACV,cAAc,EACd,YAAY,EACZ,gBAAgB,EAChB,UAAU,EACV,gBAAgB,EAChB,iBAAiB,EACjB,WAAW,EACX,aAAa,EACb,iBAAiB,EACjB,gBAAgB,EAChB,sBAAsB,EACtB,qBAAqB,EACrB,wBAAwB,EACxB,uBAAuB,EACvB,uBAAuB,EACvB,iBAAiB,GAClB,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,SAAS,EACT,cAAc,EACd,UAAU,EACV,OAAO,EACP,UAAU,EACV,aAAa,GACd,MAAM,WAAW,CAAC;AAGnB,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAI/C,OAAO,EACL,aAAa,EACb,aAAa,EACb,cAAc,EACd,oBAAoB,EACpB,kBAAkB,EAClB,qBAAqB,EACrB,eAAe,GAChB,MAAM,cAAc,CAAC;AAGtB,OAAO,EACL,YAAY,EACZ,UAAU,EACV,cAAc,EACd,YAAY,EACZ,gBAAgB,EAChB,uBAAuB,EACvB,uBAAuB,EACvB,oBAAoB,EACpB,eAAe,GAChB,MAAM,YAAY,CAAC;AAKpB,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,oBAAoB,EACpB,uBAAuB,EACvB,8BAA8B,EAC9B,gCAAgC,EAChC,eAAe,EACf,mBAAmB,EACnB,gBAAgB,EAChB,0BAA0B,EAC1B,wBAAwB,EACxB,oBAAoB,EACpB,0BAA0B,EAC1B,4BAA4B,EAC5B,6BAA6B,EAC7B,iBAAiB,EACjB,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,iBAAiB,CAAC;AAOzB,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAGtD,OAAO,EACL,QAAQ,EACR,mBAAmB,EACnB,qBAAqB,EACrB,wBAAwB,GACzB,MAAM,sBAAsB,CAAC;AAI9B,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,aAAa,EACb,SAAS,EAET,gBAAgB,EAChB,eAAe,EACf,sBAAsB,EACtB,cAAc,EACd,0BAA0B,EAC1B,gBAAgB,EAChB,cAAc,EACd,YAAY,EAEZ,cAAc,EACd,iBAAiB,EACjB,oBAAoB,EACpB,gBAAgB,GACjB,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,uBAAuB,EACvB,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,mBAAmB,EAEnB,kBAAkB,EAClB,UAAU,EACV,gBAAgB,EAChB,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,oBAAoB,EACpB,iBAAiB,EACjB,yBAAyB,EAEzB,kBAAkB,EAClB,oBAAoB,EACpB,iBAAiB,EAEjB,gBAAgB,EAChB,kBAAkB,EAClB,qBAAqB,GACtB,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { TouchPoint } from "./emulatorGrpc.js";
|
|
2
|
+
export interface EdgeGuards {
|
|
3
|
+
left: number;
|
|
4
|
+
right: number;
|
|
5
|
+
top: number;
|
|
6
|
+
bottom: number;
|
|
7
|
+
}
|
|
8
|
+
export interface PinchRequest {
|
|
9
|
+
focalX: number;
|
|
10
|
+
focalY: number;
|
|
11
|
+
direction: "in" | "out";
|
|
12
|
+
scale: number;
|
|
13
|
+
angleDeg: number;
|
|
14
|
+
durationMs: number;
|
|
15
|
+
screenWidth: number;
|
|
16
|
+
screenHeight: number;
|
|
17
|
+
guards?: EdgeGuards;
|
|
18
|
+
span?: number;
|
|
19
|
+
}
|
|
20
|
+
export interface PinchPlan {
|
|
21
|
+
gestures: TouchPoint[][][];
|
|
22
|
+
startHalf: number;
|
|
23
|
+
endHalf: number;
|
|
24
|
+
viable: boolean;
|
|
25
|
+
note?: string;
|
|
26
|
+
}
|
|
27
|
+
export declare function planPinch(request: PinchRequest): PinchPlan;
|
|
28
|
+
//# sourceMappingURL=pinchGeometry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pinchGeometry.d.ts","sourceRoot":"","sources":["../../src/core/pinchGeometry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAWpD,MAAM,WAAW,UAAU;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,IAAI,GAAG,KAAK,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IAOrB,MAAM,CAAC,EAAE,UAAU,CAAC;IAapB,IAAI,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,SAAS;IAEtB,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACjB;AA6ED,wBAAgB,SAAS,CAAC,OAAO,EAAE,YAAY,GAAG,SAAS,CA4E1D"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { EDGE_GUARD_PX, EDGE_UTILIZATION, FRAME_INTERVAL_MS, MAX_RATIO_PER_GESTURE, MIN_HALF_SEPARATION_PX, MIN_TRAVEL_PX, PRESSURE_DOWN, } from "./pinchThresholds.js";
|
|
2
|
+
const clamp = (v, lo, hi) => (v < lo ? lo : v > hi ? hi : v);
|
|
3
|
+
function maxHalfSeparation(req, fx, fy, guards) {
|
|
4
|
+
const rad = (req.angleDeg * Math.PI) / 180;
|
|
5
|
+
const ax = Math.abs(Math.cos(rad));
|
|
6
|
+
const ay = Math.abs(Math.sin(rad));
|
|
7
|
+
const limitX = ax < 1e-6
|
|
8
|
+
? Infinity
|
|
9
|
+
: Math.min(fx - guards.left, req.screenWidth - guards.right - fx) / ax;
|
|
10
|
+
const limitY = ay < 1e-6
|
|
11
|
+
? Infinity
|
|
12
|
+
: Math.min(fy - guards.top, req.screenHeight - guards.bottom - fy) / ay;
|
|
13
|
+
return Math.max(0, Math.min(limitX, limitY) * EDGE_UTILIZATION);
|
|
14
|
+
}
|
|
15
|
+
function decompose(ratio) {
|
|
16
|
+
if (ratio <= MAX_RATIO_PER_GESTURE)
|
|
17
|
+
return { count: 1, per: ratio };
|
|
18
|
+
const count = Math.ceil(Math.log(ratio) / Math.log(MAX_RATIO_PER_GESTURE));
|
|
19
|
+
return { count, per: ratio ** (1 / count) };
|
|
20
|
+
}
|
|
21
|
+
function buildFrames(fx, fy, angleDeg, fromHalf, toHalf, durationMs) {
|
|
22
|
+
const rad = (angleDeg * Math.PI) / 180;
|
|
23
|
+
const ux = Math.cos(rad);
|
|
24
|
+
const uy = Math.sin(rad);
|
|
25
|
+
const steps = Math.max(2, Math.round(durationMs / FRAME_INTERVAL_MS));
|
|
26
|
+
const frames = [];
|
|
27
|
+
for (let i = 0; i <= steps; i++) {
|
|
28
|
+
const t = i / steps;
|
|
29
|
+
const half = fromHalf + (toHalf - fromHalf) * t;
|
|
30
|
+
const pressure = i === steps ? 0 : PRESSURE_DOWN;
|
|
31
|
+
frames.push([
|
|
32
|
+
{ x: Math.round(fx - half * ux), y: Math.round(fy - half * uy), identifier: 0, pressure },
|
|
33
|
+
{ x: Math.round(fx + half * ux), y: Math.round(fy + half * uy), identifier: 1, pressure },
|
|
34
|
+
]);
|
|
35
|
+
}
|
|
36
|
+
return frames;
|
|
37
|
+
}
|
|
38
|
+
export function planPinch(request) {
|
|
39
|
+
const guards = request.guards ?? EDGE_GUARD_PX;
|
|
40
|
+
const fx = clamp(request.focalX, guards.left, request.screenWidth - guards.right);
|
|
41
|
+
const fy = clamp(request.focalY, guards.top, request.screenHeight - guards.bottom);
|
|
42
|
+
const maxHalf = maxHalfSeparation(request, fx, fy, guards);
|
|
43
|
+
if (maxHalf < MIN_HALF_SEPARATION_PX) {
|
|
44
|
+
return {
|
|
45
|
+
gestures: [],
|
|
46
|
+
startHalf: 0,
|
|
47
|
+
endHalf: 0,
|
|
48
|
+
viable: false,
|
|
49
|
+
note: "No room for two contacts around this focal point without leaving the screen. " +
|
|
50
|
+
"Move the focal point toward the centre.",
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
const ratio = Math.abs(request.scale);
|
|
54
|
+
if (!Number.isFinite(ratio) || ratio <= 1) {
|
|
55
|
+
return {
|
|
56
|
+
gestures: [],
|
|
57
|
+
startHalf: 0,
|
|
58
|
+
endHalf: 0,
|
|
59
|
+
viable: false,
|
|
60
|
+
note: `scale must be greater than 1 (got ${request.scale}); 1 would move the fingers nowhere.`,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
const { count, per } = decompose(ratio);
|
|
64
|
+
const spanFraction = clamp(Number.isFinite(request.span) ? request.span : 1, 0, 1);
|
|
65
|
+
const wide = maxHalf * spanFraction;
|
|
66
|
+
if (wide < MIN_HALF_SEPARATION_PX) {
|
|
67
|
+
return {
|
|
68
|
+
gestures: [],
|
|
69
|
+
startHalf: 0,
|
|
70
|
+
endHalf: 0,
|
|
71
|
+
viable: false,
|
|
72
|
+
note: `span ${spanFraction} leaves only ${Math.round(wide)}px between the contacts, ` +
|
|
73
|
+
`below the ${MIN_HALF_SEPARATION_PX}px needed for two distinct fingers. Increase span.`,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
const narrow = Math.max(MIN_HALF_SEPARATION_PX, wide / per);
|
|
77
|
+
const gestures = [];
|
|
78
|
+
for (let i = 0; i < count; i++) {
|
|
79
|
+
gestures.push(request.direction === "out"
|
|
80
|
+
? buildFrames(fx, fy, request.angleDeg, narrow, wide, request.durationMs)
|
|
81
|
+
: buildFrames(fx, fy, request.angleDeg, wide, narrow, request.durationMs));
|
|
82
|
+
}
|
|
83
|
+
const travel = Math.abs(wide - narrow) * 2;
|
|
84
|
+
const viable = travel >= MIN_TRAVEL_PX;
|
|
85
|
+
return {
|
|
86
|
+
gestures,
|
|
87
|
+
startHalf: request.direction === "out" ? narrow : wide,
|
|
88
|
+
endHalf: request.direction === "out" ? wide : narrow,
|
|
89
|
+
viable,
|
|
90
|
+
note: viable
|
|
91
|
+
? undefined
|
|
92
|
+
: `Fingers would move only ${Math.round(travel)}px apart, below the ` +
|
|
93
|
+
`${MIN_TRAVEL_PX}px a recognizer responds to. Increase scale or pick a focal ` +
|
|
94
|
+
`point with more room.`,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=pinchGeometry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pinchGeometry.js","sourceRoot":"","sources":["../../src/core/pinchGeometry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export declare const FRAME_INTERVAL_MS = 16;
|
|
2
|
+
export declare const PRESSURE_DOWN = 1024;
|
|
3
|
+
export declare const MIN_HALF_SEPARATION_PX = 8;
|
|
4
|
+
export declare const MIN_TRAVEL_PX = 72;
|
|
5
|
+
export declare const EDGE_GUARD_PX: {
|
|
6
|
+
left: number;
|
|
7
|
+
right: number;
|
|
8
|
+
top: number;
|
|
9
|
+
bottom: number;
|
|
10
|
+
};
|
|
11
|
+
export declare const EDGE_UTILIZATION = 0.98;
|
|
12
|
+
export declare const SETTLE_MS = 250;
|
|
13
|
+
export declare const MAX_RATIO_PER_GESTURE = 16;
|
|
14
|
+
export declare const PINCH_IN_DEFAULT_SPAN = 0.5;
|
|
15
|
+
//# sourceMappingURL=pinchThresholds.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pinchThresholds.d.ts","sourceRoot":"","sources":["../../src/core/pinchThresholds.ts"],"names":[],"mappings":"AAgBA,eAAO,MAAM,iBAAiB,KAAK,CAAC;AAGpC,eAAO,MAAM,aAAa,OAAO,CAAC;AASlC,eAAO,MAAM,sBAAsB,IAAI,CAAC;AAQxC,eAAO,MAAM,aAAa,KAAK,CAAC;AAyBhC,eAAO,MAAM,aAAa;;;;;CAA+C,CAAC;AAO1E,eAAO,MAAM,gBAAgB,OAAO,CAAC;AASrC,eAAO,MAAM,SAAS,MAAM,CAAC;AAU7B,eAAO,MAAM,qBAAqB,KAAK,CAAC;AAexC,eAAO,MAAM,qBAAqB,MAAM,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export const FRAME_INTERVAL_MS = 16;
|
|
2
|
+
export const PRESSURE_DOWN = 1024;
|
|
3
|
+
export const MIN_HALF_SEPARATION_PX = 8;
|
|
4
|
+
export const MIN_TRAVEL_PX = 72;
|
|
5
|
+
export const EDGE_GUARD_PX = { left: 4, right: 4, top: 220, bottom: 200 };
|
|
6
|
+
export const EDGE_UTILIZATION = 0.98;
|
|
7
|
+
export const SETTLE_MS = 250;
|
|
8
|
+
export const MAX_RATIO_PER_GESTURE = 16;
|
|
9
|
+
export const PINCH_IN_DEFAULT_SPAN = 0.5;
|
|
10
|
+
//# sourceMappingURL=pinchThresholds.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pinchThresholds.js","sourceRoot":"","sources":["../../src/core/pinchThresholds.ts"],"names":[],"mappings":"AAgBA,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAGpC,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,CAAC;AASlC,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC;AAQxC,MAAM,CAAC,MAAM,aAAa,GAAG,EAAE,CAAC;AAyBhC,MAAM,CAAC,MAAM,aAAa,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;AAO1E,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,CAAC;AASrC,MAAM,CAAC,MAAM,SAAS,GAAG,GAAG,CAAC;AAU7B,MAAM,CAAC,MAAM,qBAAqB,GAAG,EAAE,CAAC;AAexC,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAG,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interactionTools.d.ts","sourceRoot":"","sources":["../../src/tools/interactionTools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"interactionTools.d.ts","sourceRoot":"","sources":["../../src/tools/interactionTools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAwBzE,OAAO,EAAa,KAAK,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAevE,eAAO,MAAM,yBAAyB,MAAM,CAAC;AAE7C,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA2/BhE;AAOD,wBAAgB,uBAAuB,CAAC,CAAC,EAAE,eAAe,GAAG;IACzD,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB,CA+CA"}
|