From 71853d678aa9bef3b4d91a860cad57779bfa8843 Mon Sep 17 00:00:00 2001 From: Juan Gilsanz Polo Date: Thu, 25 May 2023 21:14:26 +0200 Subject: [PATCH] Fixed updater --- lib/base.dart | 70 +++++----------------- lib/constants/urls.dart | 2 +- lib/functions/check_app_updates.dart | 51 ++++++++++++++++ lib/functions/compare_versions.dart | 58 ++++++++++++++---- lib/main.dart | 2 +- lib/providers/app_config_provider.dart | 2 +- lib/screens/settings/general_settings.dart | 29 ++++----- lib/services/http_requests.dart | 4 +- 8 files changed, 131 insertions(+), 87 deletions(-) create mode 100644 lib/functions/check_app_updates.dart diff --git a/lib/base.dart b/lib/base.dart index 6b9f3b0..5869774 100644 --- a/lib/base.dart +++ b/lib/base.dart @@ -1,15 +1,11 @@ // ignore_for_file: use_build_context_synchronously, depend_on_referenced_packages -import 'dart:async'; -import 'dart:io'; - import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:animations/animations.dart'; import 'package:flutter_dotenv/flutter_dotenv.dart'; import 'package:provider/provider.dart'; import 'package:sentry_flutter/sentry_flutter.dart'; -import 'package:store_checker/store_checker.dart'; import 'package:flutter/services.dart'; import 'package:adguard_home_manager/widgets/bottom_nav_bar.dart'; @@ -18,21 +14,14 @@ import 'package:adguard_home_manager/widgets/update_modal.dart'; import 'package:adguard_home_manager/widgets/navigation_rail.dart'; import 'package:adguard_home_manager/providers/app_config_provider.dart'; -import 'package:adguard_home_manager/functions/compare_versions.dart'; -import 'package:adguard_home_manager/models/github_release.dart'; +import 'package:adguard_home_manager/functions/check_app_updates.dart'; import 'package:adguard_home_manager/functions/open_url.dart'; -import 'package:adguard_home_manager/services/http_requests.dart'; import 'package:adguard_home_manager/models/app_screen.dart'; import 'package:adguard_home_manager/config/app_screens.dart'; import 'package:adguard_home_manager/providers/servers_provider.dart'; class Base extends StatefulWidget { - final AppConfigProvider appConfigProvider; - - const Base({ - Key? key, - required this.appConfigProvider, - }) : super(key: key); + const Base({Key? key}) : super(key: key); @override State createState() => _BaseState(); @@ -41,35 +30,6 @@ class Base extends StatefulWidget { class _BaseState extends State with WidgetsBindingObserver { int selectedScreen = 0; - Future checkInstallationSource() async { - final result = await checkAppUpdatesGitHub(); - if (result['result'] == 'success') { - final update = gitHubUpdateExists(widget.appConfigProvider.getAppInfo!.version, result['body'].tagName); - if (update == true) { - widget.appConfigProvider.setAppUpdatesAvailable(result['body']); - if (Platform.isAndroid) { - if ( - widget.appConfigProvider.installationSource == Source.IS_INSTALLED_FROM_LOCAL_SOURCE || - widget.appConfigProvider.installationSource == Source.IS_INSTALLED_FROM_PLAY_PACKAGE_INSTALLER || - widget.appConfigProvider.installationSource == Source.UNKNOWN - ) { - return result['body']; - } - else { - return null; - } - } - else if (Platform.isIOS) { - return null; - } - else { - return result['body']; - } - } - } - return null; - } - @override void initState() { WidgetsBinding.instance.addObserver(this); @@ -77,19 +37,21 @@ class _BaseState extends State with WidgetsBindingObserver { super.initState(); WidgetsBinding.instance.addPostFrameCallback((_) async { - final version = Provider.of(context, listen: false).getAppInfo!.version; - if (!version.contains('beta')) { - final result = await checkInstallationSource(); + final appConfigProvider = Provider.of(context, listen: false); + final result = await checkAppUpdates( + appVersion: appConfigProvider.getAppInfo!.version, + installationSource: appConfigProvider.installationSource, + setUpdateAvailable: appConfigProvider.setAppUpdatesAvailable + ); - if (result != null && widget.appConfigProvider.doNotRememberVersion != result.tagName) { - await showDialog( - context: context, - builder: (context) => UpdateModal( - gitHubRelease: result, - onDownload: (link, version) => openUrl(link), - ), - ); - } + if (result != null && appConfigProvider.doNotRememberVersion != result.tagName) { + await showDialog( + context: context, + builder: (context) => UpdateModal( + gitHubRelease: result, + onDownload: (link, version) => openUrl(link), + ), + ); } }); } diff --git a/lib/constants/urls.dart b/lib/constants/urls.dart index c8b1afa..cd92b8c 100644 --- a/lib/constants/urls.dart +++ b/lib/constants/urls.dart @@ -2,6 +2,6 @@ class Urls { static const String playStore = "https://play.google.com/store/apps/details?id=com.jgeek00.adguard_home_manager"; 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 checkLatestReleaseUrl = "https://api.github.com/repos/JGeek00/adguard-home-manager/releases/latest"; + static const String getReleasesGitHub = "https://api.github.com/repos/JGeek00/adguard-home-manager/releases"; static const String adGuardHomeReleasesTags = "https://api.github.com/repos/AdGuardTeam/AdGuardHome/releases/tags"; } \ No newline at end of file diff --git a/lib/functions/check_app_updates.dart b/lib/functions/check_app_updates.dart new file mode 100644 index 0000000..e5244fe --- /dev/null +++ b/lib/functions/check_app_updates.dart @@ -0,0 +1,51 @@ +import 'dart:io'; +import 'dart:math'; + +import 'package:store_checker/store_checker.dart'; + +import 'package:adguard_home_manager/functions/compare_versions.dart'; +import 'package:adguard_home_manager/models/github_release.dart'; +import 'package:adguard_home_manager/services/http_requests.dart'; + +Future checkAppUpdates({ + required String appVersion, + required void Function(GitHubRelease?) setUpdateAvailable, + required Source installationSource +}) async { + final result = await checkAppUpdatesGitHub(); + + if (result['result'] == 'success') { + final update = gitHubUpdateExists(appVersion, result['body']); + + if (update == true) { + final release = appVersion.contains('beta') + ? result['body'].firstWhere((release) => release.prerelease == true) + : result['body'].firstWhere((release) => release.prerelease == false); + + setUpdateAvailable(release); + + if (Platform.isAndroid) { + if ( + installationSource == Source.IS_INSTALLED_FROM_LOCAL_SOURCE || + installationSource == Source.IS_INSTALLED_FROM_PLAY_PACKAGE_INSTALLER || + installationSource == Source.UNKNOWN + ) { + return release; + } + else { + return null; + } + } + else if (Platform.isIOS) { + return null; + } + else { + return release; + } + } + else { + setUpdateAvailable(null); + } + } + return null; +} \ No newline at end of file diff --git a/lib/functions/compare_versions.dart b/lib/functions/compare_versions.dart index b28bf65..e10662a 100644 --- a/lib/functions/compare_versions.dart +++ b/lib/functions/compare_versions.dart @@ -1,5 +1,7 @@ import 'package:sentry_flutter/sentry_flutter.dart'; +import 'package:adguard_home_manager/models/github_release.dart'; + bool compareVersions({ required String currentVersion, required String newVersion @@ -147,20 +149,52 @@ bool serverVersionIsAhead({ } } -bool gitHubUpdateExists(String appVersion, String gitHubVersion) { - final List appVersionSplit = List.from(appVersion.split('.').map((e) => int.parse(e))); - final List gitHubVersionSplit = List.from(gitHubVersion.split('.').map((e) => int.parse(e))); +bool gitHubUpdateExists(String appVersion, List gitHubReleases) { + if (appVersion.contains('beta')) { + final gitHubVersion = gitHubReleases.firstWhere((release) => release.prerelease == true).tagName; - 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; + 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 { + return false; + } } else { - return false; + 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; + } } } \ No newline at end of file diff --git a/lib/main.dart b/lib/main.dart index 6fa26e1..4dcd872 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -239,7 +239,7 @@ class _MainState extends State
{ child: child!, ); }, - home: Base(appConfigProvider: appConfigProvider), + home: const Base(), ), ); } diff --git a/lib/providers/app_config_provider.dart b/lib/providers/app_config_provider.dart index 0f8096d..7aeb917 100644 --- a/lib/providers/app_config_provider.dart +++ b/lib/providers/app_config_provider.dart @@ -199,7 +199,7 @@ class AppConfigProvider with ChangeNotifier { } } - void setAppUpdatesAvailable(GitHubRelease value) { + void setAppUpdatesAvailable(GitHubRelease? value) { _appUpdatesAvailable = value; notifyListeners(); } diff --git a/lib/screens/settings/general_settings.dart b/lib/screens/settings/general_settings.dart index 792d463..718bda7 100644 --- a/lib/screens/settings/general_settings.dart +++ b/lib/screens/settings/general_settings.dart @@ -2,20 +2,19 @@ import 'dart:io'; -import 'package:adguard_home_manager/functions/snackbar.dart'; -import 'package:adguard_home_manager/widgets/section_label.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:store_checker/store_checker.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:adguard_home_manager/widgets/custom_list_tile.dart'; +import 'package:adguard_home_manager/widgets/section_label.dart'; +import 'package:adguard_home_manager/functions/check_app_updates.dart'; +import 'package:adguard_home_manager/functions/snackbar.dart'; import 'package:adguard_home_manager/functions/open_url.dart'; import 'package:adguard_home_manager/functions/app_update_download_link.dart'; -import 'package:adguard_home_manager/services/http_requests.dart'; import 'package:adguard_home_manager/providers/app_config_provider.dart'; -import 'package:adguard_home_manager/functions/compare_versions.dart'; class GeneralSettings extends StatefulWidget { const GeneralSettings({Key? key}) : super(key: key); @@ -56,16 +55,15 @@ class _GeneralSettingsState extends State { Future checkUpdatesAvailable() async { setState(() => appUpdatesStatus = AppUpdatesStatus.checking); - final result = await checkAppUpdatesGitHub(); - if (result['result'] == 'success') { - final update = gitHubUpdateExists(appConfigProvider.getAppInfo!.version, result['body'].tagName); - if (update == true) { - appConfigProvider.setAppUpdatesAvailable(result['body']); - setState(() => appUpdatesStatus = AppUpdatesStatus.available); - } - else { - setState(() => appUpdatesStatus = AppUpdatesStatus.recheck); - } + + final res = await checkAppUpdates( + appVersion: appConfigProvider.getAppInfo!.version, + setUpdateAvailable: appConfigProvider.setAppUpdatesAvailable, + installationSource: appConfigProvider.installationSource + ); + + if (res != null) { + setState(() => appUpdatesStatus = AppUpdatesStatus.available); } else { setState(() => appUpdatesStatus = AppUpdatesStatus.recheck); @@ -210,8 +208,7 @@ class _GeneralSettingsState extends State { appConfigProvider.installationSource == Source.IS_INSTALLED_FROM_LOCAL_SOURCE || appConfigProvider.installationSource == Source.IS_INSTALLED_FROM_PLAY_PACKAGE_INSTALLER || appConfigProvider.installationSource == Source.UNKNOWN - )) && - !appConfigProvider.getAppInfo!.version.contains('beta') + )) ) ...[ SectionLabel(label: AppLocalizations.of(context)!.application), CustomListTile( diff --git a/lib/services/http_requests.dart b/lib/services/http_requests.dart index 2cf9820..4d129ae 100644 --- a/lib/services/http_requests.dart +++ b/lib/services/http_requests.dart @@ -2204,7 +2204,7 @@ class ApiClient { Future checkAppUpdatesGitHub() async { try { HttpClient httpClient = HttpClient(); - HttpClientRequest request = await httpClient.getUrl(Uri.parse(Urls.checkLatestReleaseUrl)); + HttpClientRequest request = await httpClient.getUrl(Uri.parse(Urls.getReleasesGitHub)); HttpClientResponse response = await request.close(); String reply = await response.transform(utf8.decoder).join(); httpClient.close(); @@ -2214,7 +2214,7 @@ Future checkAppUpdatesGitHub() async { 'hasResponse': true, 'error': false, 'statusCode': response.statusCode, - 'body': GitHubRelease.fromJson(jsonDecode(reply)) + 'body': List.from(jsonDecode(reply).map((entry) => GitHubRelease.fromJson(entry))) }; } else {