2022-10-04 15:43:16 +02:00
|
|
|
// ignore_for_file: use_build_context_synchronously
|
|
|
|
|
2023-05-17 21:50:13 +02:00
|
|
|
import 'dart:io';
|
|
|
|
|
2022-10-04 15:43:16 +02:00
|
|
|
import 'package:flutter/material.dart';
|
|
|
|
import 'package:provider/provider.dart';
|
2023-05-17 21:50:13 +02:00
|
|
|
import 'package:store_checker/store_checker.dart';
|
2022-10-04 15:43:16 +02:00
|
|
|
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
|
|
|
|
2022-10-21 02:06:53 +02:00
|
|
|
import 'package:adguard_home_manager/widgets/custom_list_tile.dart';
|
2023-05-25 21:14:26 +02:00
|
|
|
import 'package:adguard_home_manager/widgets/section_label.dart';
|
2022-10-04 15:43:16 +02:00
|
|
|
|
2023-05-25 21:14:26 +02:00
|
|
|
import 'package:adguard_home_manager/functions/check_app_updates.dart';
|
|
|
|
import 'package:adguard_home_manager/functions/snackbar.dart';
|
2023-05-17 21:50:13 +02:00
|
|
|
import 'package:adguard_home_manager/functions/open_url.dart';
|
|
|
|
import 'package:adguard_home_manager/functions/app_update_download_link.dart';
|
2022-10-04 15:43:16 +02:00
|
|
|
import 'package:adguard_home_manager/providers/app_config_provider.dart';
|
|
|
|
|
2023-05-17 21:50:13 +02:00
|
|
|
class GeneralSettings extends StatefulWidget {
|
2022-10-04 15:43:16 +02:00
|
|
|
const GeneralSettings({Key? key}) : super(key: key);
|
|
|
|
|
2023-05-17 21:50:13 +02:00
|
|
|
@override
|
|
|
|
State<GeneralSettings> createState() => _GeneralSettingsState();
|
|
|
|
}
|
|
|
|
|
|
|
|
enum AppUpdatesStatus { available, checking, recheck }
|
|
|
|
|
|
|
|
class _GeneralSettingsState extends State<GeneralSettings> {
|
|
|
|
AppUpdatesStatus appUpdatesStatus = AppUpdatesStatus.recheck;
|
|
|
|
|
2022-10-04 15:43:16 +02:00
|
|
|
@override
|
|
|
|
Widget build(BuildContext context) {
|
|
|
|
final appConfigProvider = Provider.of<AppConfigProvider>(context);
|
|
|
|
|
2023-05-20 21:12:52 +02:00
|
|
|
Future updateSettings({
|
|
|
|
required bool newStatus,
|
|
|
|
required Future Function(bool) function
|
|
|
|
}) async {
|
|
|
|
final result = await function(newStatus);
|
2022-10-04 15:43:16 +02:00
|
|
|
if (result == true) {
|
2023-05-20 21:12:52 +02:00
|
|
|
showSnacbkar(
|
|
|
|
appConfigProvider: appConfigProvider,
|
|
|
|
label: AppLocalizations.of(context)!.settingsUpdatedSuccessfully,
|
|
|
|
color: Colors.green
|
2022-10-04 15:43:16 +02:00
|
|
|
);
|
|
|
|
}
|
|
|
|
else {
|
2023-05-20 21:12:52 +02:00
|
|
|
showSnacbkar(
|
|
|
|
appConfigProvider: appConfigProvider,
|
|
|
|
label: AppLocalizations.of(context)!.cannotUpdateSettings,
|
|
|
|
color: Colors.red
|
2022-10-27 22:57:59 +02:00
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-05-17 21:50:13 +02:00
|
|
|
Future checkUpdatesAvailable() async {
|
|
|
|
setState(() => appUpdatesStatus = AppUpdatesStatus.checking);
|
2023-05-25 21:14:26 +02:00
|
|
|
|
|
|
|
final res = await checkAppUpdates(
|
2023-05-28 03:08:25 +02:00
|
|
|
currentBuildNumber: appConfigProvider.getAppInfo!.buildNumber,
|
2023-05-25 21:14:26 +02:00
|
|
|
setUpdateAvailable: appConfigProvider.setAppUpdatesAvailable,
|
2023-05-28 03:08:25 +02:00
|
|
|
installationSource: appConfigProvider.installationSource,
|
|
|
|
isBeta: appConfigProvider.getAppInfo!.version.contains('beta'),
|
2023-05-25 21:14:26 +02:00
|
|
|
);
|
|
|
|
|
2023-08-28 20:19:49 +02:00
|
|
|
if (!mounted) return;
|
2023-05-25 21:14:26 +02:00
|
|
|
if (res != null) {
|
|
|
|
setState(() => appUpdatesStatus = AppUpdatesStatus.available);
|
2023-05-17 21:50:13 +02:00
|
|
|
}
|
|
|
|
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,
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-10-04 15:43:16 +02:00
|
|
|
return Scaffold(
|
2023-05-21 14:52:35 +02:00
|
|
|
appBar: AppBar(
|
|
|
|
title: Text(AppLocalizations.of(context)!.generalSettings),
|
|
|
|
),
|
|
|
|
body: ListView(
|
|
|
|
children: [
|
|
|
|
SectionLabel(label: AppLocalizations.of(context)!.home),
|
|
|
|
CustomListTile(
|
|
|
|
icon: Icons.exposure_zero_rounded,
|
|
|
|
title: AppLocalizations.of(context)!.hideZeroValues,
|
|
|
|
subtitle: AppLocalizations.of(context)!.hideZeroValuesDescription,
|
|
|
|
trailing: Switch(
|
|
|
|
value: appConfigProvider.hideZeroValues,
|
|
|
|
onChanged: (value) => updateSettings(
|
|
|
|
newStatus: value,
|
|
|
|
function: appConfigProvider.setHideZeroValues
|
|
|
|
),
|
|
|
|
),
|
|
|
|
onTap: () => updateSettings(
|
|
|
|
newStatus: !appConfigProvider.hideZeroValues,
|
|
|
|
function: appConfigProvider.setHideZeroValues
|
|
|
|
),
|
|
|
|
padding: const EdgeInsets.only(
|
|
|
|
top: 10,
|
|
|
|
bottom: 10,
|
|
|
|
left: 16,
|
|
|
|
right: 10
|
|
|
|
)
|
|
|
|
),
|
|
|
|
CustomListTile(
|
|
|
|
icon: Icons.show_chart_rounded,
|
|
|
|
title: AppLocalizations.of(context)!.combinedChart,
|
|
|
|
subtitle: AppLocalizations.of(context)!.combinedChartDescription,
|
|
|
|
trailing: Switch(
|
|
|
|
value: appConfigProvider.combinedChartHome,
|
|
|
|
onChanged: (value) => updateSettings(
|
|
|
|
newStatus: value,
|
|
|
|
function: appConfigProvider.setCombinedChartHome
|
|
|
|
),
|
|
|
|
),
|
|
|
|
onTap: () => updateSettings(
|
|
|
|
newStatus: !appConfigProvider.combinedChartHome,
|
|
|
|
function: appConfigProvider.setCombinedChartHome
|
|
|
|
),
|
|
|
|
padding: const EdgeInsets.only(
|
|
|
|
top: 10,
|
|
|
|
bottom: 10,
|
|
|
|
left: 16,
|
|
|
|
right: 10
|
|
|
|
)
|
|
|
|
),
|
2023-09-09 21:25:21 +02:00
|
|
|
CustomListTile(
|
|
|
|
icon: Icons.remove_red_eye_rounded,
|
|
|
|
title: AppLocalizations.of(context)!.hideServerAddress,
|
|
|
|
subtitle: AppLocalizations.of(context)!.hideServerAddressDescription,
|
|
|
|
trailing: Switch(
|
|
|
|
value: appConfigProvider.hideServerAddress,
|
|
|
|
onChanged: (value) => updateSettings(
|
|
|
|
newStatus: value,
|
|
|
|
function: appConfigProvider.setHideServerAddress
|
|
|
|
),
|
|
|
|
),
|
|
|
|
onTap: () => updateSettings(
|
|
|
|
newStatus: !appConfigProvider.hideServerAddress,
|
|
|
|
function: appConfigProvider.setHideServerAddress
|
|
|
|
),
|
|
|
|
padding: const EdgeInsets.only(
|
|
|
|
top: 10,
|
|
|
|
bottom: 10,
|
|
|
|
left: 16,
|
|
|
|
right: 10
|
|
|
|
)
|
|
|
|
),
|
2023-05-21 14:52:35 +02:00
|
|
|
SectionLabel(label: AppLocalizations.of(context)!.logs),
|
|
|
|
CustomListTile(
|
|
|
|
icon: Icons.timer_rounded,
|
|
|
|
title: AppLocalizations.of(context)!.timeLogs,
|
|
|
|
subtitle: AppLocalizations.of(context)!.timeLogsDescription,
|
|
|
|
trailing: Switch(
|
|
|
|
value: appConfigProvider.showTimeLogs,
|
|
|
|
onChanged: (value) => updateSettings(
|
|
|
|
newStatus: value,
|
|
|
|
function: appConfigProvider.setshowTimeLogs
|
|
|
|
),
|
|
|
|
),
|
|
|
|
onTap: () => updateSettings(
|
|
|
|
newStatus: !appConfigProvider.showTimeLogs,
|
|
|
|
function: appConfigProvider.setshowTimeLogs
|
|
|
|
),
|
|
|
|
padding: const EdgeInsets.only(
|
|
|
|
top: 10,
|
|
|
|
bottom: 10,
|
|
|
|
left: 16,
|
|
|
|
right: 10
|
2022-10-04 15:43:16 +02:00
|
|
|
)
|
2023-05-21 14:52:35 +02:00
|
|
|
),
|
|
|
|
CustomListTile(
|
|
|
|
icon: Icons.more,
|
|
|
|
title: AppLocalizations.of(context)!.ipLogs,
|
|
|
|
subtitle: AppLocalizations.of(context)!.ipLogsDescription,
|
|
|
|
trailing: Switch(
|
|
|
|
value: appConfigProvider.showIpLogs,
|
|
|
|
onChanged: (value) => updateSettings(
|
|
|
|
newStatus: value,
|
|
|
|
function: appConfigProvider.setShowIpLogs
|
|
|
|
),
|
|
|
|
),
|
|
|
|
onTap: () => updateSettings(
|
|
|
|
newStatus: !appConfigProvider.showIpLogs,
|
|
|
|
function: appConfigProvider.setShowIpLogs
|
2022-10-27 22:57:59 +02:00
|
|
|
),
|
2023-05-21 14:52:35 +02:00
|
|
|
padding: const EdgeInsets.only(
|
|
|
|
top: 10,
|
|
|
|
bottom: 10,
|
|
|
|
left: 16,
|
|
|
|
right: 10
|
|
|
|
)
|
|
|
|
),
|
|
|
|
if (
|
|
|
|
!(Platform.isAndroid || Platform.isIOS) ||
|
|
|
|
(Platform.isAndroid && (
|
2023-05-21 23:21:03 +02:00
|
|
|
appConfigProvider.installationSource == Source.IS_INSTALLED_FROM_LOCAL_SOURCE ||
|
|
|
|
appConfigProvider.installationSource == Source.IS_INSTALLED_FROM_PLAY_PACKAGE_INSTALLER ||
|
2023-05-21 14:52:35 +02:00
|
|
|
appConfigProvider.installationSource == Source.UNKNOWN
|
2023-05-25 21:14:26 +02:00
|
|
|
))
|
2023-05-21 14:52:35 +02:00
|
|
|
) ...[
|
|
|
|
SectionLabel(label: AppLocalizations.of(context)!.application),
|
|
|
|
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()
|
|
|
|
)
|
|
|
|
]
|
|
|
|
],
|
2023-05-18 13:54:50 +02:00
|
|
|
)
|
2022-10-04 15:43:16 +02:00
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|