read static method

Future<String?> read({
  1. Future<String?> query()?,
  2. bool? isAndroid,
  3. Duration timeout = defaultTimeout,
})

Reads the referrer. query and isAndroid are for tests.

Implementation

static Future<String?> read({
  Future<String?> Function()? query,
  bool? isAndroid,
  Duration timeout = defaultTimeout,
}) async {
  final android =
      isAndroid ??
      (!kIsWeb && defaultTargetPlatform == TargetPlatform.android);
  if (!android) return null;
  final ask =
      query ??
      () async =>
          (await AndroidPlayInstallReferrer.installReferrer).installReferrer;

  final deadline = DateTime.now().add(timeout);
  for (var attempt = 0; attempt < 2; attempt++) {
    final remaining = deadline.difference(DateTime.now());
    if (remaining <= Duration.zero) break;
    try {
      final value = await ask().timeout(remaining);
      return value != null && value.trim().isNotEmpty ? value : null;
    } on TimeoutException {
      LinkFortyLogger.log('Play install referrer: no answer in time');
      return null;
    } on MissingPluginException {
      LinkFortyLogger.log('Play install referrer: plugin not available');
      return null;
    } catch (e) {
      LinkFortyLogger.log('Play install referrer unavailable: $e');
      if (attempt == 0) {
        final left = deadline.difference(DateTime.now());
        await Future<void>.delayed(left < _retryDelay ? left : _retryDelay);
      }
    }
  }
  return null;
}