mirror of
https://github.com/JGeek00/adguard-home-manager.git
synced 2025-05-25 11:22:23 +00:00
Added option to recheck app updates
This commit is contained in:
parent
e0ecac5415
commit
71a7908da5
9 changed files with 171 additions and 47 deletions
|
@ -18,6 +18,7 @@ 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/open_url.dart';
|
||||
import 'package:adguard_home_manager/services/http_requests.dart';
|
||||
|
@ -40,36 +41,23 @@ class Base extends StatefulWidget {
|
|||
class _BaseState extends State<Base> with WidgetsBindingObserver {
|
||||
int selectedScreen = 0;
|
||||
|
||||
bool updateExists(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)));
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
Future<GitHubRelease?> checkInstallationSource() async {
|
||||
final result = await checkAppUpdatesGitHub();
|
||||
if (result['result'] == 'success') {
|
||||
final update = updateExists(widget.appConfigProvider.getAppInfo!.version, result['body'].tagName);
|
||||
final update = gitHubUpdateExists(widget.appConfigProvider.getAppInfo!.version, result['body'].tagName);
|
||||
if (update == true) {
|
||||
widget.appConfigProvider.setAppUpdatesAvailable(result['body']);
|
||||
if (Platform.isAndroid) {
|
||||
Source installationSource = await StoreChecker.getSource;
|
||||
if (installationSource == Source.IS_INSTALLED_FROM_PLAY_STORE) {
|
||||
return null;
|
||||
if (
|
||||
widget.appConfigProvider.installationSource == Source.IS_INSTALLED_FROM_LOCAL_SOURCE ||
|
||||
widget.appConfigProvider.installationSource == Source.UNKNOWN
|
||||
) {
|
||||
return result['body'];
|
||||
}
|
||||
else {
|
||||
return result['body'];
|
||||
return null;
|
||||
}
|
||||
}
|
||||
else if (Platform.isIOS) {
|
||||
|
|
21
lib/functions/app_update_download_link.dart
Normal file
21
lib/functions/app_update_download_link.dart
Normal file
|
@ -0,0 +1,21 @@
|
|||
import 'dart:io';
|
||||
|
||||
import 'package:adguard_home_manager/models/github_release.dart';
|
||||
|
||||
String? getAppUpdateDownloadLink(GitHubRelease gitHubRelease) {
|
||||
if (Platform.isAndroid) {
|
||||
return gitHubRelease.assets.firstWhere((item) => item.browserDownloadUrl.contains('apk')).browserDownloadUrl;
|
||||
}
|
||||
else if (Platform.isMacOS) {
|
||||
return gitHubRelease.assets.firstWhere((item) => item.browserDownloadUrl.contains('macOS')).browserDownloadUrl; // macOS package is a zip
|
||||
}
|
||||
else if (Platform.isWindows) {
|
||||
return gitHubRelease.assets.firstWhere((item) => item.browserDownloadUrl.contains('exe')).browserDownloadUrl;
|
||||
}
|
||||
else if (Platform.isLinux) {
|
||||
return gitHubRelease.assets.firstWhere((item) => item.browserDownloadUrl.contains('deb')).browserDownloadUrl;
|
||||
}
|
||||
else {
|
||||
return null;
|
||||
}
|
||||
}
|
|
@ -143,4 +143,22 @@ bool serverVersionIsAhead({
|
|||
]);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
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)));
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
|
@ -620,5 +620,7 @@
|
|||
"listUrlCopied": "List URL copied to the clipboard",
|
||||
"unsupportedVersion": "Unsupported version",
|
||||
"unsupprtedVersionMessage": "The support for your server version {version} is not guaranteed. This application may have some issues working with that server version.\n\nAdGuard Home Manager is designed to work with the stable releases of the AdGuard Home server. It may work with alpha and beta releases, but the compatibility is not guaranteed and the app may have some issues working with that versions.",
|
||||
"iUnderstand": "I understand"
|
||||
"iUnderstand": "I understand",
|
||||
"appUpdates": "Application updates",
|
||||
"usingLatestVersion": "You are using the latest version"
|
||||
}
|
|
@ -620,5 +620,7 @@
|
|||
"listUrlCopied": "URL de la lista copiada al portapapeles",
|
||||
"unsupportedVersion": "Versión no soportada",
|
||||
"unsupprtedVersionMessage": "El soporte para la versión del servidor {version} no está garantizada. Esta aplicación puede tener problemas al trabajar con esa versión del servidor.\n\nAdGuard Home Manager está diseñado para trabajar con las versiones estables del servidor AdGuard Home. Puede funcionar con versiones alpha y beta, pero la compatibilidad no está asegurada y la aplicación puede tener problemas para trabajar con esas versiones.",
|
||||
"iUnderstand": "Lo entiendo"
|
||||
"iUnderstand": "Lo entiendo",
|
||||
"appUpdates": "Actualizaciones de la app",
|
||||
"usingLatestVersion": "Estás usando la última versión"
|
||||
}
|
|
@ -10,6 +10,7 @@ import 'package:device_info_plus/device_info_plus.dart';
|
|||
import 'package:package_info_plus/package_info_plus.dart';
|
||||
import 'package:sentry_flutter/sentry_flutter.dart';
|
||||
import 'package:sqflite_common_ffi/sqflite_ffi.dart';
|
||||
import 'package:store_checker/store_checker.dart';
|
||||
import 'package:window_size/window_size.dart';
|
||||
import 'package:flutter_localizations/flutter_localizations.dart';
|
||||
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
||||
|
@ -60,6 +61,9 @@ void main() async {
|
|||
HttpOverrides.global = MyHttpOverrides();
|
||||
}
|
||||
|
||||
Source installationSource = await StoreChecker.getSource;
|
||||
appConfigProvider.setInstallationSource(installationSource);
|
||||
|
||||
serversProvider.setDbInstance(dbData['dbInstance']);
|
||||
appConfigProvider.saveFromDb(dbData['dbInstance'], dbData['appConfig']);
|
||||
serversProvider.saveFromDb(dbData['servers']);
|
||||
|
|
|
@ -1,9 +1,11 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:device_info_plus/device_info_plus.dart';
|
||||
import 'package:flutter/scheduler.dart';
|
||||
import 'package:store_checker/store_checker.dart';
|
||||
import 'package:package_info_plus/package_info_plus.dart';
|
||||
import 'package:sqflite/sqlite_api.dart';
|
||||
|
||||
import 'package:adguard_home_manager/models/github_release.dart';
|
||||
import 'package:adguard_home_manager/services/db/queries.dart';
|
||||
import 'package:adguard_home_manager/functions/conversions.dart';
|
||||
import 'package:adguard_home_manager/models/app_log.dart';
|
||||
|
@ -39,6 +41,10 @@ class AppConfigProvider with ChangeNotifier {
|
|||
|
||||
String? _doNotRememberVersion;
|
||||
|
||||
GitHubRelease? _appUpdatesAvailable;
|
||||
|
||||
Source _installationSource = Source.UNKNOWN;
|
||||
|
||||
PackageInfo? get getAppInfo {
|
||||
return _appInfo;
|
||||
}
|
||||
|
@ -125,6 +131,14 @@ class AppConfigProvider with ChangeNotifier {
|
|||
return _selectedSettingsScreen;
|
||||
}
|
||||
|
||||
GitHubRelease? get appUpdatesAvailable {
|
||||
return _appUpdatesAvailable;
|
||||
}
|
||||
|
||||
Source get installationSource {
|
||||
return _installationSource;
|
||||
}
|
||||
|
||||
void setDbInstance(Database db) {
|
||||
_dbInstance = db;
|
||||
}
|
||||
|
@ -173,6 +187,16 @@ class AppConfigProvider with ChangeNotifier {
|
|||
}
|
||||
}
|
||||
|
||||
void setAppUpdatesAvailable(GitHubRelease value) {
|
||||
_appUpdatesAvailable = value;
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
void setInstallationSource(Source value) {
|
||||
_installationSource = value;
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
Future<bool> setOverrideSslCheck(bool status) async {
|
||||
final updated = await updateConfigQuery(
|
||||
db: _dbInstance!,
|
||||
|
|
|
@ -1,16 +1,32 @@
|
|||
// ignore_for_file: use_build_context_synchronously
|
||||
|
||||
import 'dart:io';
|
||||
|
||||
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/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 StatelessWidget {
|
||||
class GeneralSettings extends StatefulWidget {
|
||||
const GeneralSettings({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
State<GeneralSettings> createState() => _GeneralSettingsState();
|
||||
}
|
||||
|
||||
enum AppUpdatesStatus { available, checking, recheck }
|
||||
|
||||
class _GeneralSettingsState extends State<GeneralSettings> {
|
||||
AppUpdatesStatus appUpdatesStatus = AppUpdatesStatus.recheck;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final appConfigProvider = Provider.of<AppConfigProvider>(context);
|
||||
|
@ -55,6 +71,60 @@ class GeneralSettings extends StatelessWidget {
|
|||
}
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
else {
|
||||
setState(() => appUpdatesStatus = AppUpdatesStatus.recheck);
|
||||
}
|
||||
}
|
||||
|
||||
Widget generateAppUpdateStatus() {
|
||||
if (appUpdatesStatus == AppUpdatesStatus.available) {
|
||||
return IconButton(
|
||||
onPressed: appConfigProvider.appUpdatesAvailable != null
|
||||
? () async {
|
||||
final link = getAppUpdateDownloadLink(appConfigProvider.appUpdatesAvailable!);
|
||||
if (link != null) {
|
||||
openUrl(link);
|
||||
}
|
||||
}
|
||||
: null,
|
||||
icon: const Icon(Icons.download_rounded),
|
||||
tooltip: AppLocalizations.of(context)!.downloadUpdate,
|
||||
);
|
||||
}
|
||||
else if (appUpdatesStatus == AppUpdatesStatus.checking) {
|
||||
return const Padding(
|
||||
padding: EdgeInsets.only(right: 16),
|
||||
child: SizedBox(
|
||||
width: 24,
|
||||
height: 24,
|
||||
child: CircularProgressIndicator(
|
||||
strokeWidth: 3,
|
||||
)
|
||||
),
|
||||
);
|
||||
}
|
||||
else {
|
||||
return IconButton(
|
||||
onPressed: checkUpdatesAvailable,
|
||||
icon: const Icon(Icons.refresh_rounded),
|
||||
tooltip: AppLocalizations.of(context)!.checkUpdates,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
return Scaffold(
|
||||
appBar: AppBar(
|
||||
title: Text(AppLocalizations.of(context)!.generalSettings),
|
||||
|
@ -74,7 +144,7 @@ class GeneralSettings extends StatelessWidget {
|
|||
padding: const EdgeInsets.only(
|
||||
top: 10,
|
||||
bottom: 10,
|
||||
left: 20,
|
||||
left: 16,
|
||||
right: 10
|
||||
)
|
||||
),
|
||||
|
@ -90,10 +160,24 @@ class GeneralSettings extends StatelessWidget {
|
|||
padding: const EdgeInsets.only(
|
||||
top: 10,
|
||||
bottom: 10,
|
||||
left: 20,
|
||||
left: 16,
|
||||
right: 10
|
||||
)
|
||||
),
|
||||
if (
|
||||
!(Platform.isAndroid || Platform.isIOS) ||
|
||||
(Platform.isAndroid && (
|
||||
appConfigProvider.installationSource == Source.IS_INSTALLED_FROM_LOCAL_SOURCE) ||
|
||||
appConfigProvider.installationSource == Source.UNKNOWN
|
||||
)
|
||||
) CustomListTile(
|
||||
icon: Icons.system_update_rounded,
|
||||
title: AppLocalizations.of(context)!.appUpdates,
|
||||
subtitle: appConfigProvider.appUpdatesAvailable != null
|
||||
? AppLocalizations.of(context)!.updateAvailable
|
||||
: AppLocalizations.of(context)!.usingLatestVersion,
|
||||
trailing: generateAppUpdateStatus()
|
||||
)
|
||||
],
|
||||
),
|
||||
);
|
||||
|
|
|
@ -1,9 +1,8 @@
|
|||
import 'dart:io';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
||||
|
||||
import 'package:adguard_home_manager/functions/app_update_download_link.dart';
|
||||
import 'package:adguard_home_manager/models/github_release.dart';
|
||||
import 'package:adguard_home_manager/providers/app_config_provider.dart';
|
||||
|
||||
|
@ -24,29 +23,11 @@ class UpdateModal extends StatefulWidget {
|
|||
class _UpdateModalState extends State<UpdateModal> {
|
||||
bool doNotRemember = false;
|
||||
|
||||
String? getDownloadLink() {
|
||||
if (Platform.isAndroid) {
|
||||
return widget.gitHubRelease.assets.firstWhere((item) => item.browserDownloadUrl.contains('apk')).browserDownloadUrl;
|
||||
}
|
||||
else if (Platform.isMacOS) {
|
||||
return widget.gitHubRelease.assets.firstWhere((item) => item.browserDownloadUrl.contains('macOS')).browserDownloadUrl; // macOS package is a zip
|
||||
}
|
||||
else if (Platform.isWindows) {
|
||||
return widget.gitHubRelease.assets.firstWhere((item) => item.browserDownloadUrl.contains('exe')).browserDownloadUrl;
|
||||
}
|
||||
else if (Platform.isLinux) {
|
||||
return widget.gitHubRelease.assets.firstWhere((item) => item.browserDownloadUrl.contains('deb')).browserDownloadUrl;
|
||||
}
|
||||
else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final appConfigProvider = Provider.of<AppConfigProvider>(context);
|
||||
|
||||
final downloadLink = getDownloadLink();
|
||||
final downloadLink = getAppUpdateDownloadLink(widget.gitHubRelease);
|
||||
|
||||
return AlertDialog(
|
||||
scrollable: true,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue