mirror of
https://github.com/JGeek00/adguard-home-manager.git
synced 2025-05-04 20:30:35 +00:00
Fixed updater
This commit is contained in:
parent
33840c2c90
commit
71853d678a
8 changed files with 131 additions and 87 deletions
|
@ -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<Base> createState() => _BaseState();
|
||||
|
@ -41,35 +30,6 @@ class Base extends StatefulWidget {
|
|||
class _BaseState extends State<Base> with WidgetsBindingObserver {
|
||||
int selectedScreen = 0;
|
||||
|
||||
Future<GitHubRelease?> 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<Base> with WidgetsBindingObserver {
|
|||
super.initState();
|
||||
|
||||
WidgetsBinding.instance.addPostFrameCallback((_) async {
|
||||
final version = Provider.of<AppConfigProvider>(context, listen: false).getAppInfo!.version;
|
||||
if (!version.contains('beta')) {
|
||||
final result = await checkInstallationSource();
|
||||
final appConfigProvider = Provider.of<AppConfigProvider>(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),
|
||||
),
|
||||
);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
|
|
@ -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";
|
||||
}
|
51
lib/functions/check_app_updates.dart
Normal file
51
lib/functions/check_app_updates.dart
Normal file
|
@ -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<GitHubRelease?> 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;
|
||||
}
|
|
@ -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<int> appVersionSplit = List<int>.from(appVersion.split('.').map((e) => int.parse(e)));
|
||||
final List<int> gitHubVersionSplit = List<int>.from(gitHubVersion.split('.').map((e) => int.parse(e)));
|
||||
bool gitHubUpdateExists(String appVersion, List<GitHubRelease> 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<int> appVersionSplit = List<int>.from(appBetaSplit[0].split('.').map((e) => int.parse(e)));
|
||||
final int appBetaNumber = int.parse(appBetaSplit[1].split('.')[1]);
|
||||
|
||||
final List<int> gitHubVersionSplit = List<int>.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<int> appVersionSplit = List<int>.from(appVersion.split('.').map((e) => int.parse(e)));
|
||||
final List<int> gitHubVersionSplit = List<int>.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;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -239,7 +239,7 @@ class _MainState extends State<Main> {
|
|||
child: child!,
|
||||
);
|
||||
},
|
||||
home: Base(appConfigProvider: appConfigProvider),
|
||||
home: const Base(),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
|
|
@ -199,7 +199,7 @@ class AppConfigProvider with ChangeNotifier {
|
|||
}
|
||||
}
|
||||
|
||||
void setAppUpdatesAvailable(GitHubRelease value) {
|
||||
void setAppUpdatesAvailable(GitHubRelease? value) {
|
||||
_appUpdatesAvailable = value;
|
||||
notifyListeners();
|
||||
}
|
||||
|
|
|
@ -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<GeneralSettings> {
|
|||
|
||||
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<GeneralSettings> {
|
|||
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(
|
||||
|
|
|
@ -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<GitHubRelease>.from(jsonDecode(reply).map((entry) => GitHubRelease.fromJson(entry)))
|
||||
};
|
||||
}
|
||||
else {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue