diff --git a/lib/base.dart b/lib/base.dart index 5869774..b2b593b 100644 --- a/lib/base.dart +++ b/lib/base.dart @@ -39,9 +39,10 @@ class _BaseState extends State with WidgetsBindingObserver { WidgetsBinding.instance.addPostFrameCallback((_) async { final appConfigProvider = Provider.of(context, listen: false); final result = await checkAppUpdates( - appVersion: appConfigProvider.getAppInfo!.version, + currentBuildNumber: appConfigProvider.getAppInfo!.buildNumber, installationSource: appConfigProvider.installationSource, - setUpdateAvailable: appConfigProvider.setAppUpdatesAvailable + setUpdateAvailable: appConfigProvider.setAppUpdatesAvailable, + isBeta: appConfigProvider.getAppInfo!.version.contains('beta'), ); if (result != null && appConfigProvider.doNotRememberVersion != result.tagName) { diff --git a/lib/functions/app_update_download_link.dart b/lib/functions/app_update_download_link.dart index 76c1a2d..48c798a 100644 --- a/lib/functions/app_update_download_link.dart +++ b/lib/functions/app_update_download_link.dart @@ -3,19 +3,23 @@ import 'dart:io'; import 'package:adguard_home_manager/models/github_release.dart'; String? getAppUpdateDownloadLink(GitHubRelease gitHubRelease) { - if (Platform.isAndroid) { - return gitHubRelease.assets.firstWhere((item) => item.browserDownloadUrl.contains('apk')).browserDownloadUrl; - } - else if (Platform.isMacOS) { - return gitHubRelease.assets.firstWhere((item) => item.browserDownloadUrl.contains('macOS')).browserDownloadUrl; // macOS package is a zip - } - else if (Platform.isWindows) { - return gitHubRelease.assets.firstWhere((item) => item.browserDownloadUrl.contains('exe')).browserDownloadUrl; - } - else if (Platform.isLinux) { - return gitHubRelease.assets.firstWhere((item) => item.browserDownloadUrl.contains('deb')).browserDownloadUrl; - } - else { + try { + if (Platform.isAndroid) { + return gitHubRelease.assets.firstWhere((item) => item.browserDownloadUrl.contains('apk')).browserDownloadUrl; + } + else if (Platform.isMacOS) { + return gitHubRelease.assets.firstWhere((item) => item.browserDownloadUrl.contains('macOS')).browserDownloadUrl; + } + else if (Platform.isWindows) { + return gitHubRelease.assets.firstWhere((item) => item.browserDownloadUrl.contains('exe')).browserDownloadUrl; + } + else if (Platform.isLinux) { + return gitHubRelease.assets.firstWhere((item) => item.browserDownloadUrl.contains('deb')).browserDownloadUrl; + } + else { + return null; + } + } catch (e) { return null; } } \ No newline at end of file diff --git a/lib/functions/check_app_updates.dart b/lib/functions/check_app_updates.dart index 2063f20..eb44177 100644 --- a/lib/functions/check_app_updates.dart +++ b/lib/functions/check_app_updates.dart @@ -7,17 +7,22 @@ import 'package:adguard_home_manager/models/github_release.dart'; import 'package:adguard_home_manager/services/http_requests.dart'; Future checkAppUpdates({ - required String appVersion, + required String currentBuildNumber, required void Function(GitHubRelease?) setUpdateAvailable, - required Source installationSource + required Source installationSource, + required bool isBeta }) async { final result = await checkAppUpdatesGitHub(); if (result['result'] == 'success') { - final update = gitHubUpdateExists(appVersion, result['body']); + final update = gitHubUpdateExists( + currentBuildNumber: currentBuildNumber, + gitHubReleases: result['body'], + isBeta: isBeta + ); if (update == true) { - final release = appVersion.contains('beta') + final release = isBeta == true ? result['body'].firstWhere((release) => release.prerelease == true) : result['body'].firstWhere((release) => release.prerelease == false); diff --git a/lib/functions/compare_versions.dart b/lib/functions/compare_versions.dart index e10662a..4bdc178 100644 --- a/lib/functions/compare_versions.dart +++ b/lib/functions/compare_versions.dart @@ -149,52 +149,36 @@ bool serverVersionIsAhead({ } } -bool gitHubUpdateExists(String appVersion, List gitHubReleases) { - if (appVersion.contains('beta')) { - final gitHubVersion = gitHubReleases.firstWhere((release) => release.prerelease == true).tagName; +bool gitHubUpdateExists({ + required String currentBuildNumber, + required List gitHubReleases, + required bool isBeta +}) { + final release = isBeta == true + ? gitHubReleases.firstWhere((release) => release.prerelease == true) + : gitHubReleases.firstWhere((release) => release.prerelease == false); + + final versionNumberRegex = RegExp(r'\(\d+\)'); + final releaseNumberExtracted = versionNumberRegex.allMatches(release.tagName).first.group(0); - final appBetaSplit = appVersion.split('-'); - final gitHubBetaSplit = gitHubVersion.split('-'); - - final List appVersionSplit = List.from(appBetaSplit[0].split('.').map((e) => int.parse(e))); - final int appBetaNumber = int.parse(appBetaSplit[1].split('.')[1]); - - final List gitHubVersionSplit = List.from(gitHubBetaSplit[0].split('.').map((e) => int.parse(e))); - final int gitHubBetaNumber = int.parse(gitHubBetaSplit[1].split('.')[1]); - - if (gitHubVersionSplit[0] > appVersionSplit[0]) { - return true; - } - else if (gitHubVersionSplit[0] == appVersionSplit[0] && gitHubVersionSplit[1] > appVersionSplit[1]) { - return true; - } - else if (gitHubVersionSplit[0] == appVersionSplit[0] && gitHubVersionSplit[1] == appVersionSplit[1] && gitHubVersionSplit[2] > appVersionSplit[2]) { - return true; - } - else if (gitHubVersionSplit[0] == appVersionSplit[0] && gitHubVersionSplit[1] == appVersionSplit[1] && gitHubVersionSplit[2] == appVersionSplit[2] && gitHubBetaNumber > appBetaNumber) { - return true; - } - else { + if (releaseNumberExtracted != null) { + final releaseNumber = releaseNumberExtracted.replaceAll(RegExp(r'\(|\)'), ''); + try { + final newReleaseParsed = int.parse(releaseNumber); + final currentReleaseParsed = int.parse(currentBuildNumber); + if (newReleaseParsed > currentReleaseParsed) { + return true; + } + else { + return false; + } + } catch (e) { + Sentry.captureMessage("Invalid release number. Current release: $currentBuildNumber. New release: $releaseNumber"); return false; } } else { - final gitHubVersion = gitHubReleases.firstWhere((release) => release.prerelease == false).tagName; - - final List appVersionSplit = List.from(appVersion.split('.').map((e) => int.parse(e))); - final List gitHubVersionSplit = List.from(gitHubVersion.split('.').map((e) => int.parse(e))); - - if (gitHubVersionSplit[0] > appVersionSplit[0]) { - return true; - } - else if (gitHubVersionSplit[0] == appVersionSplit[0] && gitHubVersionSplit[1] > appVersionSplit[1]) { - return true; - } - else if (gitHubVersionSplit[0] == appVersionSplit[0] && gitHubVersionSplit[1] == appVersionSplit[1] && gitHubVersionSplit[2] > appVersionSplit[2]) { - return true; - } - else { - return false; - } + Sentry.captureMessage("Invalid release number. Tagname: ${release.tagName}"); + return false; } } \ No newline at end of file diff --git a/lib/screens/settings/general_settings.dart b/lib/screens/settings/general_settings.dart index 718bda7..e68aae3 100644 --- a/lib/screens/settings/general_settings.dart +++ b/lib/screens/settings/general_settings.dart @@ -57,9 +57,10 @@ class _GeneralSettingsState extends State { setState(() => appUpdatesStatus = AppUpdatesStatus.checking); final res = await checkAppUpdates( - appVersion: appConfigProvider.getAppInfo!.version, + currentBuildNumber: appConfigProvider.getAppInfo!.buildNumber, setUpdateAvailable: appConfigProvider.setAppUpdatesAvailable, - installationSource: appConfigProvider.installationSource + installationSource: appConfigProvider.installationSource, + isBeta: appConfigProvider.getAppInfo!.version.contains('beta'), ); if (res != null) { diff --git a/lib/widgets/update_modal.dart b/lib/widgets/update_modal.dart index d8f164f..5b99b66 100644 --- a/lib/widgets/update_modal.dart +++ b/lib/widgets/update_modal.dart @@ -60,7 +60,7 @@ class _UpdateModalState extends State { ), const SizedBox(height: 10), Text( - "${AppLocalizations.of(context)!.newVersion}: ${widget.gitHubRelease.tagName}", + "${AppLocalizations.of(context)!.newVersion}: ${widget.gitHubRelease.name.replaceAll('v', '')}", style: TextStyle( color: Theme.of(context).colorScheme.onSurfaceVariant ), @@ -101,7 +101,9 @@ class _UpdateModalState extends State { ), actions: [ Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, + mainAxisAlignment: downloadLink != null + ? MainAxisAlignment.spaceBetween + : MainAxisAlignment.end, children: [ if (downloadLink != null) TextButton( onPressed: () {