From 5edb30294471ddf0019d26a93d09c5ae22d574c0 Mon Sep 17 00:00:00 2001 From: Juan Gilsanz Polo Date: Fri, 7 Apr 2023 16:48:58 +0200 Subject: [PATCH] Update improvements --- lib/constants/urls.dart | 2 +- lib/l10n/app_en.arb | 4 +- lib/l10n/app_es.arb | 4 +- lib/providers/servers_provider.dart | 14 +++--- lib/screens/settings/settings.dart | 2 +- .../update_server/autoupdate_unavailable.dart | 46 +++++++++++++++++++ .../settings/{ => update_server}/update.dart | 19 ++++++-- lib/services/http_requests.dart | 3 +- lib/widgets/servers_list/servers_list.dart | 1 + 9 files changed, 79 insertions(+), 16 deletions(-) create mode 100644 lib/screens/settings/update_server/autoupdate_unavailable.dart rename lib/screens/settings/{ => update_server}/update.dart (95%) diff --git a/lib/constants/urls.dart b/lib/constants/urls.dart index e37435d..c8b1afa 100644 --- a/lib/constants/urls.dart +++ b/lib/constants/urls.dart @@ -3,5 +3,5 @@ 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 checkLatestReleaseUrl = "https://api.github.com/repos/JGeek00/adguard-home-manager/releases/latest"; - static const String adGuardHomeLatestRelease = "https://api.github.com/repos/AdGuardTeam/AdGuardHome/releases/latest"; + static const String adGuardHomeReleasesTags = "https://api.github.com/repos/AdGuardTeam/AdGuardHome/releases/tags"; } \ No newline at end of file diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 088a127..f99ceb6 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -596,5 +596,7 @@ "unknownStatus": "Unknown status", "checkingUpdates": "Checking updates...", "checkUpdates": "Check updates", - "requestingUpdate": "Requesting update..." + "requestingUpdate": "Requesting update...", + "autoupdateUnavailable": "Autoupdate unavailable", + "autoupdateUnavailableDescription": "The autoupdate service is not available for this server. It could be because the server is running on a Docker container. You have to update your server manually." } \ No newline at end of file diff --git a/lib/l10n/app_es.arb b/lib/l10n/app_es.arb index 026aade..9a48639 100644 --- a/lib/l10n/app_es.arb +++ b/lib/l10n/app_es.arb @@ -596,5 +596,7 @@ "unknownStatus": "Estado desconocido", "checkingUpdates": "Comprobando actualizaciones...", "checkUpdates": "Comprobar actualizaciones", - "requestingUpdate": "Solicitando actualización..." + "requestingUpdate": "Solicitando actualización...", + "autoupdateUnavailable": "Autoactualización no disponible", + "autoupdateUnavailableDescription": "El servicio de actualización automática del servidor no está disponible. Puede ser porque el servidor se esté ejecutando en un contenedor Docker. Tienes que actualizar tu servidor manualmente." } \ No newline at end of file diff --git a/lib/providers/servers_provider.dart b/lib/providers/servers_provider.dart index 40210a5..1695049 100644 --- a/lib/providers/servers_provider.dart +++ b/lib/providers/servers_provider.dart @@ -485,13 +485,13 @@ class ServersProvider with ChangeNotifier { void checkServerUpdatesAvailable(Server server) async { setUpdateAvailableLoadStatus(LoadStatus.loading, true); - final result = await Future.wait([ - checkServerUpdates(server: server), - getUpdateChangelog(server: server) - ]); - if (result[0]['result'] == 'success') { - UpdateAvailableData data = result[0]['data']; - data.changelog = result[1]['body']; + final result = await checkServerUpdates(server: server); + if (result['result'] == 'success') { + UpdateAvailableData data = result['data']; + final gitHubResult = await getUpdateChangelog(server: server, releaseTag: data.newVersion); + if (gitHubResult['result'] == 'success') { + data.changelog = gitHubResult['body']; + } data.updateAvailable = data.newVersion.contains('b') ? compareBetaVersions( currentVersion: data.currentVersion.replaceAll('v', ''), diff --git a/lib/screens/settings/settings.dart b/lib/screens/settings/settings.dart index aacaa01..5f805ec 100644 --- a/lib/screens/settings/settings.dart +++ b/lib/screens/settings/settings.dart @@ -9,7 +9,7 @@ import 'package:adguard_home_manager/screens/settings/access_settings/access_set import 'package:adguard_home_manager/screens/settings/customization/customization.dart'; import 'package:adguard_home_manager/screens/settings/dhcp/dhcp.dart'; import 'package:adguard_home_manager/widgets/section_label.dart'; -import 'package:adguard_home_manager/screens/settings/update.dart'; +import 'package:adguard_home_manager/screens/settings/update_server/update.dart'; import 'package:adguard_home_manager/screens/settings/dns/dns.dart'; import 'package:adguard_home_manager/screens/settings/dns_rewrites/dns_rewrites.dart'; import 'package:adguard_home_manager/screens/servers/servers.dart'; diff --git a/lib/screens/settings/update_server/autoupdate_unavailable.dart b/lib/screens/settings/update_server/autoupdate_unavailable.dart new file mode 100644 index 0000000..9846448 --- /dev/null +++ b/lib/screens/settings/update_server/autoupdate_unavailable.dart @@ -0,0 +1,46 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_gen/gen_l10n/app_localizations.dart'; + +class AutoUpdateUnavailableModal extends StatelessWidget { + const AutoUpdateUnavailableModal({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return AlertDialog( + title: Column( + children: [ + Icon( + Icons.error_rounded, + size: 24, + color: Theme.of(context).listTileTheme.iconColor + ), + const SizedBox(height: 16), + Text( + AppLocalizations.of(context)!.autoupdateUnavailable, + textAlign: TextAlign.center, + style: TextStyle( + color: Theme.of(context).colorScheme.onSurface + ), + ) + ], + ), + content: Text( + AppLocalizations.of(context)!.autoupdateUnavailableDescription, + style: TextStyle( + color: Theme.of(context).colorScheme.onSurface + ), + ), + actions: [ + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + TextButton( + onPressed: () => Navigator.pop(context), + child: Text(AppLocalizations.of(context)!.close) + ), + ], + ) + ], + ); + } +} \ No newline at end of file diff --git a/lib/screens/settings/update.dart b/lib/screens/settings/update_server/update.dart similarity index 95% rename from lib/screens/settings/update.dart rename to lib/screens/settings/update_server/update.dart index beba263..682eebc 100644 --- a/lib/screens/settings/update.dart +++ b/lib/screens/settings/update_server/update.dart @@ -1,5 +1,7 @@ // ignore_for_file: use_build_context_synchronously +import 'package:adguard_home_manager/screens/settings/update_server/autoupdate_unavailable.dart'; +import 'package:animations/animations.dart'; import 'package:flutter/material.dart'; import 'package:flutter_html/flutter_html.dart'; import 'package:html/parser.dart' as html; @@ -7,8 +9,6 @@ import 'package:markdown/markdown.dart' as md; import 'package:provider/provider.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; -import 'package:adguard_home_manager/functions/compare_versions.dart'; - import 'package:adguard_home_manager/providers/app_config_provider.dart'; import 'package:adguard_home_manager/services/http_requests.dart'; import 'package:adguard_home_manager/functions/snackbar.dart'; @@ -24,6 +24,13 @@ class UpdateScreen extends StatelessWidget { Widget build(BuildContext context) { final serversProvider = Provider.of(context); final appConfigProvider = Provider.of(context); + + void showAutoUpdateUnavailableModal() { + showModal( + context: context, + builder: (context) => const AutoUpdateUnavailableModal() + ); + } void update() async { ProcessModal processModal = ProcessModal(context: context); @@ -149,7 +156,9 @@ class UpdateScreen extends StatelessWidget { icon: const Icon(Icons.download_rounded), label: Text(AppLocalizations.of(context)!.updateNow), onPressed: serversProvider.updateAvailable.data!.updateAvailable != null && serversProvider.updateAvailable.data!.updateAvailable == true - ? () => update() + ? serversProvider.updateAvailable.data!.canAutoupdate == true + ? () => update() + : () => showAutoUpdateUnavailableModal() : null ) ], @@ -259,7 +268,9 @@ class UpdateScreen extends StatelessWidget { icon: const Icon(Icons.download_rounded), label: Text(AppLocalizations.of(context)!.updateNow), onPressed: serversProvider.updateAvailable.data!.updateAvailable != null && serversProvider.updateAvailable.data!.updateAvailable == true - ? () => update() + ? serversProvider.updateAvailable.data!.canAutoupdate == true + ? () => update() + : () => showAutoUpdateUnavailableModal() : null ) ], diff --git a/lib/services/http_requests.dart b/lib/services/http_requests.dart index 309ef75..2962937 100644 --- a/lib/services/http_requests.dart +++ b/lib/services/http_requests.dart @@ -2026,10 +2026,11 @@ Future checkServerUpdates({ Future getUpdateChangelog({ required Server server, + required String releaseTag }) async { try { HttpClient httpClient = HttpClient(); - HttpClientRequest request = await httpClient.getUrl(Uri.parse(Urls.adGuardHomeLatestRelease)); + HttpClientRequest request = await httpClient.getUrl(Uri.parse("${Urls.adGuardHomeReleasesTags}/$releaseTag")); HttpClientResponse response = await request.close(); String reply = await response.transform(utf8.decoder).join(); httpClient.close(); diff --git a/lib/widgets/servers_list/servers_list.dart b/lib/widgets/servers_list/servers_list.dart index ea0fc35..9dd080b 100644 --- a/lib/widgets/servers_list/servers_list.dart +++ b/lib/widgets/servers_list/servers_list.dart @@ -117,6 +117,7 @@ class _ServersListState extends State with SingleTickerProviderStat final serverStatus = await getServerStatus(server); if (serverStatus['result'] == 'success') { serversProvider.setServerStatusData(serverStatus['data']); + serversProvider.checkServerUpdatesAvailable(server); serversProvider.setServerStatusLoad(1); } else {