mirror of
https://github.com/JGeek00/adguard-home-manager.git
synced 2025-05-04 20:30:35 +00:00
Improved updater
This commit is contained in:
parent
39c871b72d
commit
a4ae8c2cdf
7 changed files with 66 additions and 64 deletions
|
@ -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
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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(
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue