nativeTapAndroid function
Future<NativeTapResult>
nativeTapAndroid(
- NativeTapInput input, {
- required String? deviceId,
- AdbRunner? adb,
- AppDevicePixelRatioReader? appDevicePixelRatio,
- DateTime now()?,
- Future<
void> sleep()?, - String? dumpFile,
Android side of fdb native-tap: by coordinates (--at, optionally
--logical) or by label (--text).
adb, appDevicePixelRatio, now, sleep and dumpFile are
injectable for tests. Never throws.
Implementation
Future<NativeTapResult> nativeTapAndroid(
NativeTapInput input, {
required String? deviceId,
AdbRunner? adb,
AppDevicePixelRatioReader? appDevicePixelRatio,
DateTime Function()? now,
Future<void> Function(Duration)? sleep,
String? dumpFile,
}) async {
final deviceArgs = deviceId != null ? ['-s', deviceId] : <String>[];
final runAdb = adb ?? _runAdb;
Future<ProcessResult> run(List<String> args) => runAdb([...deviceArgs, ...args]);
try {
final text = input.text;
if (text != null) {
return await _tapByText(
query: text,
index: input.index,
timeout: Duration(seconds: input.timeoutSeconds ?? defaultNativeTapTextTimeoutSeconds),
run: run,
now: now ?? DateTime.now,
sleep: sleep ?? Future<void>.delayed,
dumpFile: dumpFile ?? androidUiDumpFileFor(pid: pid, timestampMs: DateTime.now().millisecondsSinceEpoch),
);
}
final x = input.x!;
final y = input.y!;
if (!input.logical) {
return await _inputTap(run, x.toInt(), y.toInt());
}
final dpr = await _resolveDevicePixelRatio(run, appDevicePixelRatio ?? readAppDevicePixelRatio);
switch (dpr) {
case _DprUnavailable(:final reason):
return NativeTapDevicePixelRatioUnavailable(reason);
case _DprKnown(:final value):
final physical = logicalToPhysical(x, y, value);
return await _inputTap(run, physical.x, physical.y);
}
} on ProcessException catch (e) {
return NativeTapAdbExecutionFailed(e.toString());
} catch (e) {
return NativeTapAdbFailed('$e');
}
}