Added option to recheck app updates

This commit is contained in:
Juan Gilsanz Polo 2023-05-17 21:50:13 +02:00
parent e0ecac5415
commit 71a7908da5
9 changed files with 171 additions and 47 deletions

View file

@ -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) {

View 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;
}
}

View file

@ -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;
}
}

View file

@ -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"
}

View file

@ -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"
}

View file

@ -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']);

View file

@ -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!,

View file

@ -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()
)
],
),
);

View file

@ -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,