fetchAndroid function

Future<AppVersionData> fetchAndroid({
  1. PackageInfo? packageInfo,
  2. String? playStoreId,
})

Implementation

Future<AppVersionData> fetchAndroid({
  PackageInfo? packageInfo,
  String? playStoreId,
}) async {
  playStoreId = playStoreId ?? packageInfo?.packageName;

  final parameters = {"id": playStoreId};
  // DICA: Forçar o local 'en' ajuda a manter a estrutura do HTML previsível
  var uri = Uri.https(playStoreAuthority, playStoreUndecodedPath, parameters);

  final response =
      await http.get(uri, headers: headers).catchError((e) => throw e);

  if (response.statusCode == 200) {
    final String htmlString = response.body;

    // 1. Regex ultra-focado: captura qualquer string de versão que esteja isolada por aspas
    // dentro dos blocos de dados, suportando formatos normais (1.0.2) e Meta/Facebook (563.1.0.50.73)
    final RegExp versionRegex = RegExp(r'"(\d+\.\d+\.\d+[^"]*)"');
    final matches = versionRegex.allMatches(htmlString);

    if (matches.isNotEmpty) {
      List<String> detectedVersions = [];

      for (var match in matches) {
        String version = match.group(1)!;

        // Filtros para evitar pegar IDs grandes, datas ou strings com letras perdidas
        if (version.length < 18 &&
            !version.contains(',') &&
            !version.contains('/') &&
            RegExp(r'^\d').hasMatch(version)) {
          // Garante que começa com número
          detectedVersions.add(version);
        }
      }

      if (detectedVersions.isNotEmpty) {
        // A versão do app costuma aparecer primeiro ou repetidas vezes no bloco de metadados.
        // Se a primeira falhar no seu teste, você pode testar detectedVersions[1] ou [2]
        String lastVersion = detectedVersions.first;

        return AppVersionData(
          storeVersion: lastVersion,
          storeUrl: uri.toString(),
          localVersion: packageInfo?.version ?? "0.0.0",
          targetPlatform: TargetPlatform.android,
        );
      }
    }

    // 2. Fallback multilíngue (independe se está em inglês, português ou espanhol)
    final fallbackRegex =
        RegExp(r'(?:version|versão|versión).*?([\d\.]+)', caseSensitive: false);
    final fallbackMatch = fallbackRegex.firstMatch(htmlString);

    if (fallbackMatch != null) {
      return AppVersionData(
        storeVersion: fallbackMatch.group(1)!,
        storeUrl: uri.toString(),
        localVersion: packageInfo?.version ?? "0.0.0",
        targetPlatform: TargetPlatform.android,
      );
    }

    throw "Application not found in Play Store or layout changed, verify your app id.";
  } else {
    throw "Application not found in Play Store, verify your app id. Status: ${response.statusCode}";
  }
}