Added unsupported version warning and handle alpha versions

This commit is contained in:
Juan Gilsanz Polo 2023-05-13 18:33:09 +02:00
parent 3e281095cd
commit 3f0997f5d6
11 changed files with 234 additions and 72 deletions

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View 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)
)
],
)
],
);
}
}