nativeTapAndroid function

Future<NativeTapResult> nativeTapAndroid(
  1. NativeTapInput input, {
  2. required String? deviceId,
  3. AdbRunner? adb,
  4. AppDevicePixelRatioReader? appDevicePixelRatio,
  5. DateTime now()?,
  6. Future<void> sleep(
    1. Duration
    )?,
  7. 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');
  }
}