Improved updater

This commit is contained in:
Juan Gilsanz Polo 2023-06-08 22:51:15 +02:00
parent 39c871b72d
commit a4ae8c2cdf
7 changed files with 66 additions and 64 deletions

View file

@ -18,7 +18,6 @@ class UpdateAvailableData {
final bool? canAutoupdate; final bool? canAutoupdate;
final bool disabled; final bool disabled;
String? changelog; String? changelog;
bool? updateAvailable;
UpdateAvailableData({ UpdateAvailableData({
required this.currentVersion, required this.currentVersion,
@ -28,7 +27,6 @@ class UpdateAvailableData {
required this.canAutoupdate, required this.canAutoupdate,
required this.disabled, required this.disabled,
this.changelog, this.changelog,
this.updateAvailable
}); });
factory UpdateAvailableData.fromJson(Map<String, dynamic> json) => UpdateAvailableData( factory UpdateAvailableData.fromJson(Map<String, dynamic> json) => UpdateAvailableData(
@ -39,7 +37,15 @@ class UpdateAvailableData {
canAutoupdate: json["can_autoupdate"], canAutoupdate: json["can_autoupdate"],
disabled: json["disabled"], disabled: json["disabled"],
changelog: json["changelog"], changelog: json["changelog"],
updateAvailable: json['update_available'] );
factory UpdateAvailableData.fromJsonUpdate(Map<String, dynamic> json) => UpdateAvailableData(
currentVersion: json["current_version"],
newVersion: json["new_version"],
announcement: json["announcement"],
announcementUrl: json["announcement_url"],
canAutoupdate: json["can_autoupdate"],
disabled: json["disabled"],
); );
Map<String, dynamic> toJson() => { Map<String, dynamic> toJson() => {
@ -50,6 +56,5 @@ class UpdateAvailableData {
"can_autoupdate": canAutoupdate, "can_autoupdate": canAutoupdate,
"disabled": disabled, "disabled": disabled,
"changelog": changelog, "changelog": changelog,
"update_available": updateAvailable
}; };
} }

View file

@ -8,7 +8,6 @@ import 'package:adguard_home_manager/models/update_available.dart';
import 'package:adguard_home_manager/services/http_requests.dart'; import 'package:adguard_home_manager/services/http_requests.dart';
import 'package:adguard_home_manager/functions/conversions.dart'; import 'package:adguard_home_manager/functions/conversions.dart';
import 'package:adguard_home_manager/services/db/queries.dart'; import 'package:adguard_home_manager/services/db/queries.dart';
import 'package:adguard_home_manager/functions/compare_versions.dart';
import 'package:adguard_home_manager/constants/enums.dart'; import 'package:adguard_home_manager/constants/enums.dart';
class ServersProvider with ChangeNotifier { class ServersProvider with ChangeNotifier {
@ -18,6 +17,8 @@ class ServersProvider with ChangeNotifier {
Server? _selectedServer; Server? _selectedServer;
ApiClient? _apiClient; ApiClient? _apiClient;
bool _updatingServer = false;
final UpdateAvailable _updateAvailable = UpdateAvailable( final UpdateAvailable _updateAvailable = UpdateAvailable(
loadStatus: LoadStatus.loading, loadStatus: LoadStatus.loading,
data: null, data: null,
@ -39,6 +40,10 @@ class ServersProvider with ChangeNotifier {
return _updateAvailable; return _updateAvailable;
} }
bool get updatingServer {
return _updatingServer;
}
void setDbInstance(Database db) { void setDbInstance(Database db) {
_dbInstance = db; _dbInstance = db;
} }
@ -70,6 +75,11 @@ class ServersProvider with ChangeNotifier {
notifyListeners(); notifyListeners();
} }
void setUpdatingServer(bool status) {
_updatingServer = status;
notifyListeners();
}
Future<dynamic> createServer(Server server) async { Future<dynamic> createServer(Server server) async {
final saved = await saveServerQuery(_dbInstance!, server); final saved = await saveServerQuery(_dbInstance!, server);
if (saved == null) { if (saved == null) {
@ -159,9 +169,8 @@ class ServersProvider with ChangeNotifier {
void checkServerUpdatesAvailable({ void checkServerUpdatesAvailable({
required Server server, required Server server,
bool? setValues
}) async { }) async {
if (setValues == true) setUpdateAvailableLoadStatus(LoadStatus.loading, true); setUpdateAvailableLoadStatus(LoadStatus.loading, true);
final result = await _apiClient!.checkServerUpdates(); final result = await _apiClient!.checkServerUpdates();
if (result['result'] == 'success') { if (result['result'] == 'success') {
UpdateAvailableData data = UpdateAvailableData.fromJson(result['data']); UpdateAvailableData data = UpdateAvailableData.fromJson(result['data']);
@ -169,40 +178,20 @@ class ServersProvider with ChangeNotifier {
if (gitHubResult['result'] == 'success') { if (gitHubResult['result'] == 'success') {
data.changelog = gitHubResult['body']; data.changelog = gitHubResult['body'];
} }
data.updateAvailable = data.newVersion != null
? compareVersions(
currentVersion: data.currentVersion,
newVersion: data.newVersion!,
)
: false;
if (setValues == true) {
setUpdateAvailableData(data); setUpdateAvailableData(data);
setUpdateAvailableLoadStatus(LoadStatus.loaded, true);
} }
else { else {
if (data.currentVersion == data.newVersion) setUpdateAvailableData(data); setUpdateAvailableLoadStatus(LoadStatus.error, true);
}
if (setValues == true) setUpdateAvailableLoadStatus(LoadStatus.loaded, true);
}
else {
if (setValues == true) setUpdateAvailableLoadStatus(LoadStatus.error, true);
}
}
void clearUpdateAvailable(Server server, String newCurrentVersion) {
if (_updateAvailable.data != null) {
_updateAvailable.data!.updateAvailable = null;
_updateAvailable.data!.currentVersion = newCurrentVersion;
notifyListeners();
} }
} }
Future initializateServer(Server server) async { Future initializateServer(Server server) async {
final serverStatus = await _apiClient!.getServerStatus(); final serverStatus = await _apiClient!.getServerStatus();
if (serverStatus['result'] == 'success') { if (serverStatus['result'] == 'success') {
checkServerUpdatesAvailable( checkServerUpdatesAvailable( // Do not await
server: server, server: server,
setValues: true );
); // Do not await
} }
} }
@ -245,15 +234,33 @@ class ServersProvider with ChangeNotifier {
void recheckPeriodServerUpdated() { void recheckPeriodServerUpdated() {
if (_selectedServer != null) { if (_selectedServer != null) {
setUpdatingServer(true);
Server server = _selectedServer!; Server server = _selectedServer!;
Timer.periodic( Timer.periodic(
const Duration(seconds: 2), const Duration(seconds: 2),
(timer) { (timer) async {
if (_selectedServer != null && _selectedServer == server) { if (_selectedServer != null && _selectedServer == server) {
checkServerUpdatesAvailable(server: server, setValues: false); final result = await _apiClient!.checkServerUpdates();
if (result['result'] == 'success') {
UpdateAvailableData data = UpdateAvailableData.fromJsonUpdate(result['data']);
if (data.currentVersion == data.newVersion) {
final gitHubResult = await _apiClient!.getUpdateChangelog(releaseTag: data.newVersion ?? data.currentVersion);
if (gitHubResult['result'] == 'success') {
data.changelog = gitHubResult['body'];
}
setUpdateAvailableData(data);
timer.cancel();
setUpdatingServer(false);
}
} }
else { else {
timer.cancel(); timer.cancel();
setUpdatingServer(false);
}
}
else {
timer.cancel();
setUpdatingServer(false);
} }
} }
); );

View file

@ -188,8 +188,7 @@ class SettingsWidget extends StatelessWidget {
title: AppLocalizations.of(context)!.updates, title: AppLocalizations.of(context)!.updates,
subtitle: AppLocalizations.of(context)!.updatesDescription, subtitle: AppLocalizations.of(context)!.updatesDescription,
trailing: serversProvider.updateAvailable.data != null && trailing: serversProvider.updateAvailable.data != null &&
serversProvider.updateAvailable.data!.updateAvailable != null && serversProvider.updateAvailable.data!.canAutoupdate == true
serversProvider.updateAvailable.data!.updateAvailable == true
? Container( ? Container(
width: 10, width: 10,
height: 10, height: 10,

View file

@ -40,7 +40,6 @@ class UpdateScreen extends StatelessWidget {
processModal.close(); processModal.close();
if (result['result'] == 'success') { if (result['result'] == 'success') {
serversProvider.clearUpdateAvailable(serversProvider.selectedServer!, serversProvider.updateAvailable.data!.newVersion!);
serversProvider.recheckPeriodServerUpdated(); serversProvider.recheckPeriodServerUpdated();
showSnacbkar( showSnacbkar(
appConfigProvider: appConfigProvider, appConfigProvider: appConfigProvider,
@ -82,7 +81,6 @@ class UpdateScreen extends StatelessWidget {
tooltip: AppLocalizations.of(context)!.checkUpdates, tooltip: AppLocalizations.of(context)!.checkUpdates,
onPressed: () => serversProvider.checkServerUpdatesAvailable( onPressed: () => serversProvider.checkServerUpdatesAvailable(
server: serversProvider.selectedServer!, server: serversProvider.selectedServer!,
setValues: true
) )
), ),
], ],
@ -101,11 +99,9 @@ class UpdateScreen extends StatelessWidget {
], ],
) )
: Icon( : Icon(
serversProvider.updateAvailable.data!.updateAvailable != null serversProvider.updateAvailable.data!.canAutoupdate == true
? serversProvider.updateAvailable.data!.updateAvailable == true
? Icons.system_update_rounded ? Icons.system_update_rounded
: Icons.system_security_update_good_rounded : Icons.system_security_update_good_rounded,
: Icons.system_security_update_warning_rounded,
size: 40, size: 40,
color: Theme.of(context).colorScheme.primary, color: Theme.of(context).colorScheme.primary,
), ),
@ -113,11 +109,9 @@ class UpdateScreen extends StatelessWidget {
Text( Text(
serversProvider.updateAvailable.loadStatus == LoadStatus.loading serversProvider.updateAvailable.loadStatus == LoadStatus.loading
? AppLocalizations.of(context)!.checkingUpdates ? AppLocalizations.of(context)!.checkingUpdates
: serversProvider.updateAvailable.data!.updateAvailable != null : serversProvider.updateAvailable.data!.canAutoupdate == true
? serversProvider.updateAvailable.data!.updateAvailable == true
? AppLocalizations.of(context)!.updateAvailable ? AppLocalizations.of(context)!.updateAvailable
: AppLocalizations.of(context)!.serverUpdated : AppLocalizations.of(context)!.serverUpdated,
: AppLocalizations.of(context)!.unknownStatus,
style: const TextStyle( style: const TextStyle(
fontSize: 24, fontSize: 24,
fontWeight: FontWeight.w400 fontWeight: FontWeight.w400
@ -131,7 +125,7 @@ class UpdateScreen extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Text( Text(
serversProvider.updateAvailable.data!.updateAvailable != null && serversProvider.updateAvailable.data!.updateAvailable == true serversProvider.updateAvailable.data!.canAutoupdate == true
? AppLocalizations.of(context)!.newVersion ? AppLocalizations.of(context)!.newVersion
: AppLocalizations.of(context)!.currentVersion, : AppLocalizations.of(context)!.currentVersion,
style: const TextStyle( style: const TextStyle(
@ -140,11 +134,9 @@ class UpdateScreen extends StatelessWidget {
), ),
const SizedBox(height: 4), const SizedBox(height: 4),
Text( Text(
serversProvider.updateAvailable.data!.updateAvailable != null serversProvider.updateAvailable.data!.canAutoupdate == true
? serversProvider.updateAvailable.data!.updateAvailable == true
? serversProvider.updateAvailable.data!.newVersion ?? 'N/A' ? serversProvider.updateAvailable.data!.newVersion ?? 'N/A'
: serversProvider.updateAvailable.data!.currentVersion : serversProvider.updateAvailable.data!.currentVersion,
: "N/A",
style: TextStyle( style: TextStyle(
fontSize: 12, fontSize: 12,
fontWeight: FontWeight.w700, fontWeight: FontWeight.w700,
@ -157,7 +149,9 @@ class UpdateScreen extends StatelessWidget {
FilledButton.icon( FilledButton.icon(
icon: const Icon(Icons.download_rounded), icon: const Icon(Icons.download_rounded),
label: Text(AppLocalizations.of(context)!.updateNow), label: Text(AppLocalizations.of(context)!.updateNow),
onPressed: serversProvider.updateAvailable.data!.updateAvailable != null && serversProvider.updateAvailable.data!.updateAvailable == true onPressed: serversProvider.updatingServer == true
? null
: serversProvider.updateAvailable.data!.canAutoupdate == true
? serversProvider.updateAvailable.data!.canAutoupdate != null && serversProvider.updateAvailable.data!.canAutoupdate == true ? serversProvider.updateAvailable.data!.canAutoupdate != null && serversProvider.updateAvailable.data!.canAutoupdate == true
? () => update() ? () => update()
: () => showAutoUpdateUnavailableModal() : () => showAutoUpdateUnavailableModal()
@ -178,7 +172,7 @@ class UpdateScreen extends StatelessWidget {
Padding( Padding(
padding: const EdgeInsets.symmetric(horizontal: 16), padding: const EdgeInsets.symmetric(horizontal: 16),
child: Text( child: Text(
"Changelog ${serversProvider.updateAvailable.data!.updateAvailable == true "Changelog ${serversProvider.updateAvailable.data!.canAutoupdate == true
? serversProvider.updateAvailable.data!.newVersion ? serversProvider.updateAvailable.data!.newVersion
: serversProvider.updateAvailable.data!.currentVersion}", : serversProvider.updateAvailable.data!.currentVersion}",
style: TextStyle( style: TextStyle(

View file

@ -66,8 +66,7 @@ class BottomNavBar extends StatelessWidget {
if ( if (
screen.name == 'settings' && screen.name == 'settings' &&
serversProvider.updateAvailable.data != null && serversProvider.updateAvailable.data != null &&
serversProvider.updateAvailable.data!.updateAvailable != null && serversProvider.updateAvailable.data!.canAutoupdate == true
serversProvider.updateAvailable.data!.updateAvailable == true
) Positioned( ) Positioned(
bottom: 0, bottom: 0,
right: -12, right: -12,

View file

@ -147,7 +147,6 @@ class _ServersListItemState extends State<ServersListItem> with SingleTickerProv
); );
serversProvider.checkServerUpdatesAvailable( serversProvider.checkServerUpdatesAvailable(
server: server, server: server,
setValues: true
); );
statusProvider.setServerStatusLoad(LoadStatus.loaded); statusProvider.setServerStatusLoad(LoadStatus.loaded);
} }

View file

@ -114,7 +114,6 @@ class _ServersTileItemState extends State<ServersTileItem> with SingleTickerProv
); );
serversProvider.checkServerUpdatesAvailable( serversProvider.checkServerUpdatesAvailable(
server: server, server: server,
setValues: true
); );
statusProvider.setServerStatusLoad(LoadStatus.loaded); statusProvider.setServerStatusLoad(LoadStatus.loaded);
} }