diff --git a/lib/functions/check_app_updates.dart b/lib/functions/check_app_updates.dart index 7ab8352..e002556 100644 --- a/lib/functions/check_app_updates.dart +++ b/lib/functions/check_app_updates.dart @@ -14,7 +14,7 @@ Future checkAppUpdates({ }) async { var result = isBeta ? await ExternalRequests.getReleasesGitHub() - : await ExternalRequests.getLatestReleaseGitHub(); + : await ExternalRequests.getReleaseData(); if (result.successful == true) { late GitHubRelease gitHubRelease; @@ -30,7 +30,7 @@ Future checkAppUpdates({ gitHubRelease: gitHubRelease, isBeta: isBeta ); - +print(update); if (update == true) { setUpdateAvailable(gitHubRelease); diff --git a/lib/providers/servers_provider.dart b/lib/providers/servers_provider.dart index a8f1003..2cc634a 100644 --- a/lib/providers/servers_provider.dart +++ b/lib/providers/servers_provider.dart @@ -3,6 +3,7 @@ import 'dart:async'; import 'package:flutter/material.dart'; import 'package:sqflite/sqflite.dart'; +import 'package:adguard_home_manager/models/github_release.dart'; import 'package:adguard_home_manager/services/api_client.dart'; import 'package:adguard_home_manager/services/external_requests.dart'; import 'package:adguard_home_manager/models/server.dart'; @@ -188,9 +189,9 @@ class ServersProvider with ChangeNotifier { final result = await client!.checkServerUpdates(); if (result.successful == true) { UpdateAvailableData data = UpdateAvailableData.fromJson(result.content); - final gitHubResult = await ExternalRequests.getUpdateChangelog(releaseTag: data.newVersion ?? data.currentVersion); + final gitHubResult = await ExternalRequests.getReleaseData(releaseTag: data.newVersion ?? data.currentVersion); if (gitHubResult.successful == true) { - data.changelog = gitHubResult.content; + data.changelog = (gitHubResult.content as GitHubRelease).body; } setUpdateAvailableData(data); setUpdateAvailableLoadStatus(LoadStatus.loaded, true); @@ -262,7 +263,7 @@ class ServersProvider with ChangeNotifier { if (result.successful == true) { UpdateAvailableData data = UpdateAvailableData.fromJsonUpdate(result.content); if (data.currentVersion == data.newVersion) { - final gitHubResult = await ExternalRequests.getUpdateChangelog(releaseTag: data.newVersion ?? data.currentVersion); + final gitHubResult = await ExternalRequests.getReleaseData(releaseTag: data.newVersion ?? data.currentVersion); if (gitHubResult.successful == true) { data.changelog = gitHubResult.content; } diff --git a/lib/screens/clients/client/logs_list_client.dart b/lib/screens/clients/client/logs_list_client.dart index 422c80c..bd4d2af 100644 --- a/lib/screens/clients/client/logs_list_client.dart +++ b/lib/screens/clients/client/logs_list_client.dart @@ -8,6 +8,7 @@ import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:adguard_home_manager/screens/logs/log_tile.dart'; import 'package:adguard_home_manager/screens/logs/details/log_details_screen.dart'; +import 'package:adguard_home_manager/services/api_client.dart'; import 'package:adguard_home_manager/functions/desktop_mode.dart'; import 'package:adguard_home_manager/models/logs.dart'; import 'package:adguard_home_manager/providers/app_config_provider.dart'; @@ -21,13 +22,13 @@ class LogsListClient extends StatefulWidget { final bool splitView; const LogsListClient({ - Key? key, + super.key, required this.ip, this.name, required this.serversProvider, required this.appConfigProvider, required this.splitView, - }) : super(key: key); + }); @override State createState() => _LogsListClientState(); @@ -74,32 +75,28 @@ class _LogsListClientState extends State { ) ); - final result = await cancelableRequest?.value; + final result = await cancelableRequest?.value as ApiResponse; + if (!mounted) return; - if (result != null) { - if (loadingMore != null && loadingMore == true && mounted) { - setState(() => isLoadingMore = false); - } + if (loadingMore != null && loadingMore == true && mounted) { + setState(() => isLoadingMore = false); + } - if (mounted) { - if (result['result'] == 'success') { - setState(() => offset = inOffset != null ? inOffset+logsQuantity : offset+logsQuantity); - if (loadingMore != null && loadingMore == true && logsData != null) { - LogsData newLogsData = result['data']; - newLogsData.data = [...logsData!.data, ...result['data'].data]; - setState(() => logsData = newLogsData); - } - else { - LogsData newLogsData = result['data']; - setState(() => logsData = newLogsData); - } - setState(() => loadStatus = 1); - } - else { - setState(() => loadStatus = 2); - widget.appConfigProvider.addLog(result['log']); - } + if (result.successful == true) { + setState(() => offset = inOffset != null ? inOffset+logsQuantity : offset+logsQuantity); + if (loadingMore != null && loadingMore == true && logsData != null) { + LogsData newLogsData = result.content; + newLogsData.data = [...logsData!.data, ...result.content.data]; + setState(() => logsData = newLogsData); } + else { + LogsData newLogsData = result.content; + setState(() => logsData = newLogsData); + } + setState(() => loadStatus = 1); + } + else { + setState(() => loadStatus = 2); } } diff --git a/lib/services/api_client.dart b/lib/services/api_client.dart index a957fc3..d8ef244 100644 --- a/lib/services/api_client.dart +++ b/lib/services/api_client.dart @@ -689,10 +689,15 @@ class ApiClientV2 { server: server, body: data, ); - return ApiResponse( - successful: result.successful, - content: result.body != null ? jsonDecode(result.body!) : null - ); + try { + return ApiResponse( + successful: result.successful, + content: result.body != null ? jsonDecode(result.body!) : null + ); + } catch (e, stackTrace) { + Sentry.captureException(e, stackTrace: stackTrace); + return const ApiResponse(successful: false); + } } Future saveEncryptionSettings({ diff --git a/lib/services/external_requests.dart b/lib/services/external_requests.dart index b63b6fb..bd467fb 100644 --- a/lib/services/external_requests.dart +++ b/lib/services/external_requests.dart @@ -1,6 +1,6 @@ import 'dart:convert'; -import 'dart:io'; +import 'package:http/http.dart' as http; import 'package:sentry_flutter/sentry_flutter.dart'; import 'package:adguard_home_manager/models/github_release.dart'; @@ -8,72 +8,48 @@ import 'package:adguard_home_manager/constants/urls.dart'; import 'package:adguard_home_manager/services/api_client.dart'; class ExternalRequests { - static Future getUpdateChangelog({ - required String releaseTag - }) async { - try { - HttpClient httpClient = HttpClient(); - 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(); - if (response.statusCode == 200) { - return ApiResponse( - successful: true, - content: jsonDecode(reply)['body'], - statusCode: response.statusCode - ); - } - else { - return const ApiResponse(successful: false); - } - } catch (e, stackTrace) { - Sentry.captureException(e, stackTrace: stackTrace); - return const ApiResponse(successful: false); - } - } - static Future getReleasesGitHub() async { try { - HttpClient httpClient = HttpClient(); - HttpClientRequest request = await httpClient.getUrl(Uri.parse(Urls.getReleasesGitHub)); - HttpClientResponse response = await request.close(); - String reply = await response.transform(utf8.decoder).join(); - httpClient.close(); + final response = await http.get(Uri.parse(Urls.getReleasesGitHub)); if (response.statusCode == 200) { return ApiResponse( successful: true, - content: List.from(jsonDecode(reply).map((entry) => GitHubRelease.fromJson(entry))) + content: List.from( + jsonDecode(response.body).map((entry) => GitHubRelease.fromJson(entry)) + ) ); } else { return const ApiResponse(successful: false); } - } catch (e, stackTrace) { - Sentry.captureException(e, stackTrace: stackTrace); + } catch (e) { return const ApiResponse(successful: false); } } - static Future getLatestReleaseGitHub() async { + static Future getReleaseData({ + // If releaseTag is null gets latest release + String? releaseTag + }) 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(); + final response = await http.get( + Uri.parse( + releaseTag != null + ? "${Urls.adGuardHomeReleasesTags}/$releaseTag" + : Urls.getLatestReleaseGitHub + ) + ); if (response.statusCode == 200) { return ApiResponse( successful: true, - content: GitHubRelease.fromJson(jsonDecode(reply)), + content: GitHubRelease.fromJson(jsonDecode(response.body)), statusCode: response.statusCode ); } else { return const ApiResponse(successful: false); } - } catch (e, stackTrace) { - Sentry.captureException(e, stackTrace: stackTrace); + } catch (e) { return const ApiResponse(successful: false); } } diff --git a/lib/widgets/layout.dart b/lib/widgets/layout.dart index 4d6e131..9a42415 100644 --- a/lib/widgets/layout.dart +++ b/lib/widgets/layout.dart @@ -1,3 +1,4 @@ +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:animations/animations.dart'; import 'package:provider/provider.dart'; @@ -36,6 +37,7 @@ class _LayoutState extends State with WidgetsBindingObserver { super.initState(); WidgetsBinding.instance.addPostFrameCallback((_) async { + if (kDebugMode) return; // Don't check for app updates on debug mode final appConfigProvider = Provider.of(context, listen: false); final result = await checkAppUpdates( currentBuildNumber: appConfigProvider.getAppInfo!.buildNumber, diff --git a/pubspec.lock b/pubspec.lock index b32374c..0582275 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -319,7 +319,7 @@ packages: source: hosted version: "0.15.4" http: - dependency: transitive + dependency: "direct main" description: name: http sha256: "759d1a329847dd0f39226c688d3e06a6b8679668e350e2891a6474f8b4bb8525" diff --git a/pubspec.yaml b/pubspec.yaml index 482ca92..bc0da25 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -75,6 +75,7 @@ dependencies: flutter_reorderable_list: ^1.3.1 pie_chart: ^5.4.0 segmented_button_slide: ^1.0.4 + http: ^1.1.0 dev_dependencies: flutter_test: