diff --git a/lib/constants/urls.dart b/lib/constants/urls.dart index 440c8d7..b7eb069 100644 --- a/lib/constants/urls.dart +++ b/lib/constants/urls.dart @@ -3,6 +3,7 @@ class Urls { static const String gitHub = "https://github.com/JGeek00/adguard-home-manager"; static const String customRuleDocs = "https://kb.adguard.com/en/general/how-to-create-your-own-ad-filters"; static const String getReleasesGitHub = "https://api.github.com/repos/JGeek00/adguard-home-manager/releases"; + static const String getLatestReleaseGitHub = "https://api.github.com/repos/JGeek00/adguard-home-manager/releases/latest"; static const String adGuardHomeReleasesTags = "https://api.github.com/repos/AdGuardTeam/AdGuardHome/releases/tags"; static const String googleSearchUrl = "https://www.google.com/search"; static const String connectionInstructions = "https://github.com/JGeek00/adguard-home-manager/wiki/Create-a-connection"; diff --git a/lib/functions/check_app_updates.dart b/lib/functions/check_app_updates.dart index eb44177..306b2ea 100644 --- a/lib/functions/check_app_updates.dart +++ b/lib/functions/check_app_updates.dart @@ -12,21 +12,27 @@ Future checkAppUpdates({ required Source installationSource, required bool isBeta }) async { - final result = await checkAppUpdatesGitHub(); + var result = isBeta + ? await getReleasesGitHub() + : await getLatestReleaseGitHub(); if (result['result'] == 'success') { + late GitHubRelease gitHubRelease; + if (isBeta) { + gitHubRelease = (result['body'] as List).firstWhere((r) => r.prerelease == true); + } + else { + gitHubRelease = result['body'] as GitHubRelease; + } + final update = gitHubUpdateExists( currentBuildNumber: currentBuildNumber, - gitHubReleases: result['body'], + gitHubRelease: gitHubRelease, isBeta: isBeta ); if (update == true) { - final release = isBeta == true - ? result['body'].firstWhere((release) => release.prerelease == true) - : result['body'].firstWhere((release) => release.prerelease == false); - - setUpdateAvailable(release); + setUpdateAvailable(gitHubRelease); if (Platform.isAndroid) { if ( @@ -34,7 +40,7 @@ Future checkAppUpdates({ installationSource == Source.IS_INSTALLED_FROM_PLAY_PACKAGE_INSTALLER || installationSource == Source.UNKNOWN ) { - return release; + return gitHubRelease; } else { return null; @@ -44,7 +50,7 @@ Future checkAppUpdates({ return null; } else { - return release; + return gitHubRelease; } } else { diff --git a/lib/functions/compare_versions.dart b/lib/functions/compare_versions.dart index 33ae8fe..b2f37e1 100644 --- a/lib/functions/compare_versions.dart +++ b/lib/functions/compare_versions.dart @@ -151,15 +151,11 @@ bool serverVersionIsAhead({ bool gitHubUpdateExists({ required String currentBuildNumber, - required List gitHubReleases, + required GitHubRelease gitHubRelease, 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 releaseNumberExtractedMatches = versionNumberRegex.allMatches(release.tagName); + final releaseNumberExtractedMatches = versionNumberRegex.allMatches(gitHubRelease.tagName); if (releaseNumberExtractedMatches.isNotEmpty) { final releaseNumberExtracted = releaseNumberExtractedMatches.first.group(0); @@ -181,12 +177,12 @@ bool gitHubUpdateExists({ } } else { - Sentry.captureMessage("Invalid release number. Tagname: ${release.tagName}"); + Sentry.captureMessage("Invalid release number. Tagname: ${gitHubRelease.tagName}"); return false; } } else { - Sentry.captureMessage("No matches. ${release.tagName}"); + Sentry.captureMessage("No matches. ${gitHubRelease.tagName}"); return false; } } \ No newline at end of file diff --git a/lib/services/http_requests.dart b/lib/services/http_requests.dart index e1f4552..7fe18e0 100644 --- a/lib/services/http_requests.dart +++ b/lib/services/http_requests.dart @@ -2322,7 +2322,7 @@ class ApiClient { } } -Future checkAppUpdatesGitHub() async { +Future getReleasesGitHub() async { try { HttpClient httpClient = HttpClient(); HttpClientRequest request = await httpClient.getUrl(Uri.parse(Urls.getReleasesGitHub)); @@ -2391,4 +2391,75 @@ Future checkAppUpdatesGitHub() async { ) }; } +} + +Future getLatestReleaseGitHub() async { + try { + HttpClient httpClient = HttpClient(); + HttpClientRequest request = await httpClient.getUrl(Uri.parse(Urls.getLatestReleaseGitHub)); + HttpClientResponse response = await request.close(); + String reply = await response.transform(utf8.decoder).join(); + httpClient.close(); + if (response.statusCode == 200) { + return { + 'result': 'success', + 'hasResponse': true, + 'error': false, + 'statusCode': response.statusCode, + 'body': GitHubRelease.fromJson(jsonDecode(reply)) + }; + } + else { + return { + 'result': 'error', + 'log': AppLog( + type: 'update_encryption_settings', + dateTime: DateTime.now(), + message: 'error_code_not_expected', + statusCode: response.statusCode.toString(), + resBody: reply, + ) + }; + } + } on SocketException { + return { + 'result': 'no_connection', + 'message': 'SocketException', + 'log': AppLog( + type: 'check_latest_release_github', + dateTime: DateTime.now(), + message: 'SocketException' + ) + }; + } on TimeoutException { + return { + 'result': 'no_connection', + 'message': 'TimeoutException', + 'log': AppLog( + type: 'check_latest_release_github', + dateTime: DateTime.now(), + message: 'TimeoutException' + ) + }; + } on HandshakeException { + return { + 'result': 'ssl_error', + 'message': 'HandshakeException', + 'log': AppLog( + type: 'check_latest_release_github', + dateTime: DateTime.now(), + message: 'HandshakeException' + ) + }; + } catch (e) { + return { + 'result': 'error', + 'message': e.toString(), + 'log': AppLog( + type: 'check_latest_release_github', + dateTime: DateTime.now(), + message: e.toString() + ) + }; + } } \ No newline at end of file