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 {