mirror of
https://github.com/JGeek00/adguard-home-manager.git
synced 2025-05-04 20:30:35 +00:00
Added unsupported version warning and handle alpha versions
This commit is contained in:
parent
3e281095cd
commit
3f0997f5d6
11 changed files with 234 additions and 72 deletions
|
@ -5,20 +5,54 @@ bool compareVersions({
|
|||
required String newVersion
|
||||
}) {
|
||||
try {
|
||||
final currentSplit = currentVersion.split('.').map((e) => int.parse(e)).toList();
|
||||
final newSplit = newVersion.split('.').map((e) => int.parse(e)).toList();
|
||||
if (currentVersion.contains('a')) { // alpha
|
||||
return true;
|
||||
}
|
||||
else if (currentVersion.contains('b')) { // beta
|
||||
final current = currentVersion.replaceAll('v', '');
|
||||
final newV = currentVersion.replaceAll('v', '');
|
||||
|
||||
if (newSplit[0] > currentSplit[0]) {
|
||||
return true;
|
||||
final currentSplit = current.split('-')[0].split('.').map((e) => int.parse(e)).toList();
|
||||
final newSplit = newV.split('-')[0].split('.').map((e) => int.parse(e)).toList();
|
||||
|
||||
final currentBeta = int.parse(current.split('-')[1].replaceAll('b.', ''));
|
||||
final newBeta = int.parse(newV.split('-')[1].replaceAll('b.', ''));
|
||||
|
||||
if (newSplit[0] > currentSplit[0]) {
|
||||
return true;
|
||||
}
|
||||
else if (newSplit[1] > currentSplit[1]) {
|
||||
return true;
|
||||
}
|
||||
else if (newSplit[2] > currentSplit[2]) {
|
||||
return true;
|
||||
}
|
||||
else if (newBeta > currentBeta) {
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else if (newSplit[1] > currentSplit[1]) {
|
||||
return true;
|
||||
}
|
||||
else if (newSplit[2] > currentSplit[2]) {
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
return false;
|
||||
else { // stable
|
||||
final current = currentVersion.replaceAll('v', '');
|
||||
final newV = currentVersion.replaceAll('v', '');
|
||||
|
||||
final currentSplit = current.split('.').map((e) => int.parse(e)).toList();
|
||||
final newSplit = newV.split('.').map((e) => int.parse(e)).toList();
|
||||
|
||||
if (newSplit[0] > currentSplit[0]) {
|
||||
return true;
|
||||
}
|
||||
else if (newSplit[1] > currentSplit[1]) {
|
||||
return true;
|
||||
}
|
||||
else if (newSplit[2] > currentSplit[2]) {
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
} catch (e) {
|
||||
Sentry.captureException(e);
|
||||
|
@ -33,45 +67,6 @@ bool compareVersions({
|
|||
}
|
||||
}
|
||||
|
||||
bool compareBetaVersions({
|
||||
required String currentVersion,
|
||||
required String newVersion
|
||||
}) {
|
||||
try {
|
||||
final currentSplit = currentVersion.split('-')[0].split('.').map((e) => int.parse(e)).toList();
|
||||
final newSplit = newVersion.split('-')[0].split('.').map((e) => int.parse(e)).toList();
|
||||
|
||||
final currentBeta = int.parse(currentVersion.split('-')[1].replaceAll('b.', ''));
|
||||
final newBeta = int.parse(newVersion.split('-')[1].replaceAll('b.', ''));
|
||||
|
||||
if (newSplit[0] > currentSplit[0]) {
|
||||
return true;
|
||||
}
|
||||
else if (newSplit[1] > currentSplit[1]) {
|
||||
return true;
|
||||
}
|
||||
else if (newSplit[2] > currentSplit[2]) {
|
||||
return true;
|
||||
}
|
||||
else if (newBeta > currentBeta) {
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
return false;
|
||||
}
|
||||
} catch (e) {
|
||||
Sentry.captureException(e);
|
||||
Sentry.captureMessage("compareBetaVersions error", params: [
|
||||
{
|
||||
"fn": "compareBetaVersions",
|
||||
"currentVersion": currentVersion,
|
||||
"newVersion": newVersion,
|
||||
}.toString()
|
||||
]);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
bool serverVersionIsAhead({
|
||||
required String currentVersion,
|
||||
required String referenceVersion,
|
||||
|
@ -82,7 +77,10 @@ bool serverVersionIsAhead({
|
|||
final reference = referenceVersion.replaceAll('v', '');
|
||||
final referenceBeta = referenceVersionBeta?.replaceAll('v', '');
|
||||
|
||||
if (current.contains('b')) {
|
||||
if (currentVersion.contains('a')) { // alpha
|
||||
return true;
|
||||
}
|
||||
else if (current.contains('b')) { // beta
|
||||
if (referenceBeta != null) {
|
||||
final currentSplit = current.split('-')[0].split('.').map((e) => int.parse(e)).toList();
|
||||
final newSplit = referenceBeta.split('-')[0].split('.').map((e) => int.parse(e)).toList();
|
||||
|
@ -113,7 +111,7 @@ bool serverVersionIsAhead({
|
|||
return false;
|
||||
}
|
||||
}
|
||||
else {
|
||||
else { // stable
|
||||
final currentSplit = current.split('.').map((e) => int.parse(e)).toList();
|
||||
final newSplit = reference.split('.').map((e) => int.parse(e)).toList();
|
||||
|
||||
|
|
|
@ -617,5 +617,8 @@
|
|||
"seeDetails": "See details",
|
||||
"listNotAvailable": "List not available",
|
||||
"copyListUrl": "Copy list URL",
|
||||
"listUrlCopied": "List URL copied to the clipboard"
|
||||
"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"
|
||||
}
|
|
@ -617,5 +617,8 @@
|
|||
"seeDetails": "Ver los detalles",
|
||||
"listNotAvailable": "Lista no disponible",
|
||||
"copyListUrl": "Copiar URL de lista",
|
||||
"listUrlCopied": "URL de la lista copiada al portapapeles"
|
||||
"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"
|
||||
}
|
|
@ -535,15 +535,10 @@ class ServersProvider with ChangeNotifier {
|
|||
data.changelog = gitHubResult['body'];
|
||||
}
|
||||
data.updateAvailable = data.newVersion != null
|
||||
? data.newVersion!.contains('b')
|
||||
? compareBetaVersions(
|
||||
currentVersion: data.currentVersion.replaceAll('v', ''),
|
||||
newVersion: data.newVersion!.replaceAll('v', ''),
|
||||
)
|
||||
: compareVersions(
|
||||
currentVersion: data.currentVersion.replaceAll('v', ''),
|
||||
newVersion: data.newVersion!.replaceAll('v', ''),
|
||||
)
|
||||
? compareVersions(
|
||||
currentVersion: data.currentVersion,
|
||||
newVersion: data.newVersion!,
|
||||
)
|
||||
: false;
|
||||
setUpdateAvailableData(data);
|
||||
setUpdateAvailableLoadStatus(LoadStatus.loaded, true);
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
import 'package:adguard_home_manager/widgets/add_server_modal.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import 'package:adguard_home_manager/widgets/add_server_modal.dart';
|
||||
import 'package:adguard_home_manager/widgets/version_warning_modal.dart';
|
||||
|
||||
class FabConnect extends StatelessWidget {
|
||||
const FabConnect({Key? key}) : super(key: key);
|
||||
|
||||
|
@ -14,16 +16,30 @@ class FabConnect extends StatelessWidget {
|
|||
showDialog(
|
||||
context: context,
|
||||
barrierDismissible: false,
|
||||
builder: (context) => const AddServerModal(
|
||||
builder: (context) => AddServerModal(
|
||||
window: true,
|
||||
onUnsupportedVersion: (version) => showDialog(
|
||||
context: context,
|
||||
builder: (ctx) => VersionWarningModal(
|
||||
version: version
|
||||
),
|
||||
barrierDismissible: false
|
||||
),
|
||||
),
|
||||
)
|
||||
}
|
||||
else {
|
||||
Navigator.push(context, MaterialPageRoute(
|
||||
fullscreenDialog: true,
|
||||
builder: (BuildContext context) => const AddServerModal(
|
||||
builder: (BuildContext context) => AddServerModal(
|
||||
window: false,
|
||||
onUnsupportedVersion: (version) => showDialog(
|
||||
context: context,
|
||||
builder: (ctx) => VersionWarningModal(
|
||||
version: version
|
||||
),
|
||||
barrierDismissible: false
|
||||
),
|
||||
)
|
||||
))
|
||||
}
|
||||
|
|
|
@ -6,6 +6,7 @@ import 'package:flutter/rendering.dart';
|
|||
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
import 'package:adguard_home_manager/widgets/version_warning_modal.dart';
|
||||
import 'package:adguard_home_manager/widgets/servers_list/servers_list.dart';
|
||||
import 'package:adguard_home_manager/widgets/add_server_modal.dart';
|
||||
|
||||
|
@ -72,16 +73,30 @@ class _ServersState extends State<Servers> {
|
|||
showDialog(
|
||||
context: context,
|
||||
barrierDismissible: false,
|
||||
builder: (context) => const AddServerModal(
|
||||
builder: (context) => AddServerModal(
|
||||
window: true,
|
||||
onUnsupportedVersion: (version) => showDialog(
|
||||
context: context,
|
||||
builder: (ctx) => VersionWarningModal(
|
||||
version: version
|
||||
),
|
||||
barrierDismissible: false
|
||||
),
|
||||
),
|
||||
)
|
||||
}
|
||||
else {
|
||||
Navigator.push(context, MaterialPageRoute(
|
||||
fullscreenDialog: true,
|
||||
builder: (BuildContext context) => const AddServerModal(
|
||||
builder: (BuildContext context) => AddServerModal(
|
||||
window: false,
|
||||
onUnsupportedVersion: (version) => showDialog(
|
||||
context: context,
|
||||
builder: (ctx) => VersionWarningModal(
|
||||
version: version
|
||||
),
|
||||
barrierDismissible: false
|
||||
),
|
||||
)
|
||||
))
|
||||
}
|
||||
|
|
|
@ -263,6 +263,40 @@ Future loginHA(Server server) async {
|
|||
}
|
||||
}
|
||||
|
||||
Future getServerVersion(Server server) async {
|
||||
final result = await apiRequest(
|
||||
server: server,
|
||||
method: 'get',
|
||||
urlPath: '/status',
|
||||
type: 'get_server_version'
|
||||
);
|
||||
|
||||
if (result['hasResponse'] == true) {
|
||||
if (result['statusCode'] == 200 && result['body'] != null) {
|
||||
print( result['body']['version']);
|
||||
return {
|
||||
'result': 'success',
|
||||
'data': result['body']['version']
|
||||
};
|
||||
}
|
||||
else {
|
||||
return {
|
||||
'result': 'error',
|
||||
'log': AppLog(
|
||||
type: 'get_server_version',
|
||||
dateTime: DateTime.now(),
|
||||
message: 'error_code_not_expected',
|
||||
statusCode: result['statusCode'].toString(),
|
||||
resBody: result['body']
|
||||
)
|
||||
};
|
||||
}
|
||||
}
|
||||
else {
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
Future getServerStatus(Server server) async {
|
||||
final result = await Future.wait([
|
||||
apiRequest(server: server, method: 'get', urlPath: '/stats', type: 'server_status'),
|
||||
|
|
|
@ -18,11 +18,13 @@ enum ConnectionType { http, https}
|
|||
class AddServerModal extends StatefulWidget {
|
||||
final Server? server;
|
||||
final bool window;
|
||||
final void Function(String version) onUnsupportedVersion;
|
||||
|
||||
const AddServerModal({
|
||||
Key? key,
|
||||
this.server,
|
||||
required this.window
|
||||
required this.window,
|
||||
required this.onUnsupportedVersion
|
||||
}) : super(key: key);
|
||||
|
||||
@override
|
||||
|
@ -256,16 +258,25 @@ class _AddServerModalState extends State<AddServerModal> {
|
|||
final serverCreated = await serversProvider.createServer(serverObj);
|
||||
if (serverCreated == null) {
|
||||
serversProvider.setServerStatusLoad(0);
|
||||
|
||||
final serverStatus = await getServerStatus(serverObj);
|
||||
|
||||
if (serverStatus['result'] == 'success') {
|
||||
serversProvider.setServerStatusData(serverStatus['data']);
|
||||
serversProvider.setServerStatusLoad(1);
|
||||
if (serverStatus['data'].serverVersion.contains('a') || serverStatus['data'].serverVersion.contains('b')) {
|
||||
Navigator.pop(context);
|
||||
widget.onUnsupportedVersion(serverStatus['data'].serverVersion);
|
||||
}
|
||||
else {
|
||||
Navigator.pop(context);
|
||||
}
|
||||
}
|
||||
else {
|
||||
appConfigProvider.addLog(serverStatus['log']);
|
||||
serversProvider.setServerStatusLoad(2);
|
||||
Navigator.pop(context);
|
||||
}
|
||||
Navigator.pop(context);
|
||||
}
|
||||
else {
|
||||
setState(() => isConnecting = false);
|
||||
|
@ -364,8 +375,19 @@ class _AddServerModalState extends State<AddServerModal> {
|
|||
serverObj.authToken = encodeBase64UserPass(serverObj.user!, serverObj.password!);
|
||||
}
|
||||
final serverSaved = await serversProvider.editServer(serverObj);
|
||||
|
||||
if (serverSaved == null) {
|
||||
Navigator.pop(context);
|
||||
final version = await getServerVersion(serverObj);;
|
||||
if (
|
||||
version['result'] == 'success' &&
|
||||
(version['data'].contains('a') || version['data'].contains('b')) // alpha or beta
|
||||
) {
|
||||
Navigator.pop(context);
|
||||
widget.onUnsupportedVersion(version);
|
||||
}
|
||||
else {
|
||||
Navigator.pop(context);
|
||||
}
|
||||
}
|
||||
else {
|
||||
appConfigProvider.addLog(
|
||||
|
|
|
@ -5,6 +5,7 @@ import 'package:expandable/expandable.dart';
|
|||
import 'package:provider/provider.dart';
|
||||
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
||||
|
||||
import 'package:adguard_home_manager/widgets/version_warning_modal.dart';
|
||||
import 'package:adguard_home_manager/widgets/add_server_modal.dart';
|
||||
import 'package:adguard_home_manager/widgets/servers_list/delete_modal.dart';
|
||||
|
||||
|
@ -93,6 +94,13 @@ class _ServersListItemState extends State<ServersListItem> with SingleTickerProv
|
|||
builder: (context) => AddServerModal(
|
||||
server: server,
|
||||
window: true,
|
||||
onUnsupportedVersion: (version) => showDialog(
|
||||
context: context,
|
||||
builder: (ctx) => VersionWarningModal(
|
||||
version: version
|
||||
),
|
||||
barrierDismissible: false
|
||||
),
|
||||
),
|
||||
)
|
||||
}
|
||||
|
@ -102,6 +110,13 @@ class _ServersListItemState extends State<ServersListItem> with SingleTickerProv
|
|||
builder: (BuildContext context) => AddServerModal(
|
||||
server: server,
|
||||
window: false,
|
||||
onUnsupportedVersion: (version) => showDialog(
|
||||
context: context,
|
||||
builder: (ctx) => VersionWarningModal(
|
||||
version: version
|
||||
),
|
||||
barrierDismissible: false
|
||||
),
|
||||
)
|
||||
))
|
||||
}
|
||||
|
|
|
@ -4,6 +4,7 @@ import 'package:flutter/material.dart';
|
|||
import 'package:provider/provider.dart';
|
||||
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
||||
|
||||
import 'package:adguard_home_manager/widgets/version_warning_modal.dart';
|
||||
import 'package:adguard_home_manager/widgets/add_server_modal.dart';
|
||||
import 'package:adguard_home_manager/widgets/servers_list/delete_modal.dart';
|
||||
|
||||
|
@ -60,6 +61,13 @@ class _ServersTileItemState extends State<ServersTileItem> with SingleTickerProv
|
|||
builder: (context) => AddServerModal(
|
||||
server: server,
|
||||
window: true,
|
||||
onUnsupportedVersion: (version) => showDialog(
|
||||
context: context,
|
||||
builder: (ctx) => VersionWarningModal(
|
||||
version: version
|
||||
),
|
||||
barrierDismissible: false
|
||||
),
|
||||
),
|
||||
)
|
||||
}
|
||||
|
@ -69,6 +77,13 @@ class _ServersTileItemState extends State<ServersTileItem> with SingleTickerProv
|
|||
builder: (BuildContext context) => AddServerModal(
|
||||
server: server,
|
||||
window: false,
|
||||
onUnsupportedVersion: (version) => showDialog(
|
||||
context: context,
|
||||
builder: (ctx) => VersionWarningModal(
|
||||
version: version
|
||||
),
|
||||
barrierDismissible: false
|
||||
),
|
||||
)
|
||||
))
|
||||
}
|
||||
|
|
46
lib/widgets/version_warning_modal.dart
Normal file
46
lib/widgets/version_warning_modal.dart
Normal file
|
@ -0,0 +1,46 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
||||
|
||||
class VersionWarningModal extends StatelessWidget {
|
||||
final String version;
|
||||
|
||||
const VersionWarningModal({
|
||||
Key? key,
|
||||
required this.version,
|
||||
}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return AlertDialog(
|
||||
scrollable: true,
|
||||
title: Column(
|
||||
children: [
|
||||
Icon(
|
||||
Icons.warning_rounded,
|
||||
size: 24,
|
||||
color: Theme.of(context).listTileTheme.iconColor
|
||||
),
|
||||
const SizedBox(height: 16),
|
||||
Text(
|
||||
AppLocalizations.of(context)!.unsupportedVersion,
|
||||
style: TextStyle(
|
||||
color: Theme.of(context).colorScheme.onSurface
|
||||
),
|
||||
)
|
||||
],
|
||||
),
|
||||
content: Text(AppLocalizations.of(context)!.unsupprtedVersionMessage(version)),
|
||||
actions: [
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.end,
|
||||
children: [
|
||||
TextButton(
|
||||
onPressed: () => Navigator.pop(context),
|
||||
child: Text(AppLocalizations.of(context)!.iUnderstand)
|
||||
)
|
||||
],
|
||||
)
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue