selectLatestCompatible method

SoftwareUpdate? selectLatestCompatible({
  1. required List<SoftwareRelease> releases,
  2. required Map<String, List<SoftwareAsset>> assetsByReleaseId,
  3. required InstalledSoftware installed,
})

Implementation

SoftwareUpdate? selectLatestCompatible({
  required List<SoftwareRelease> releases,
  required Map<String, List<SoftwareAsset>> assetsByReleaseId,
  required InstalledSoftware installed,
}) {
  final candidates = <SoftwareUpdate>[];
  for (final release in releases) {
    for (final asset in assetsByReleaseId[release.event.id] ?? const []) {
      final versionCode = asset.versionCode;
      if (asset.mimeType != androidPackageMimeType ||
          asset.urls.isEmpty ||
          asset.identifier != installed.packageId ||
          versionCode == null ||
          (asset.minPlatformVersion ?? 0) > installed.platformVersion ||
          (asset.minAllowedVersionCode ?? 0) > installed.versionCode ||
          (asset.variant != null && asset.variant != installed.variant) ||
          !_supportsPlatform(asset.platforms, installed.platforms) ||
          !_hasMatchingCertificate(
            asset.certificateHashes,
            installed.certificateHashes,
          )) {
        continue;
      }
      candidates.add(SoftwareUpdate(release: release, asset: asset));
    }
  }
  candidates.sort(
    (a, b) => b.asset.versionCode!.compareTo(a.asset.versionCode!),
  );
  return candidates.firstOrNull;
}