mirror of
https://github.com/JGeek00/adguard-home-manager.git
synced 2025-04-22 14:59:12 +00:00
Adapted added clients new version
This commit is contained in:
parent
415194d7a5
commit
f54770dbba
17 changed files with 343 additions and 94 deletions
|
@ -2,6 +2,7 @@ import 'dart:convert';
|
||||||
|
|
||||||
import 'package:adguard_home_manager/constants/enums.dart';
|
import 'package:adguard_home_manager/constants/enums.dart';
|
||||||
import 'package:adguard_home_manager/models/clients_allowed_blocked.dart';
|
import 'package:adguard_home_manager/models/clients_allowed_blocked.dart';
|
||||||
|
import 'package:adguard_home_manager/models/safe_search.dart';
|
||||||
|
|
||||||
class Clients {
|
class Clients {
|
||||||
LoadStatus loadStatus;
|
LoadStatus loadStatus;
|
||||||
|
@ -100,9 +101,10 @@ class Client {
|
||||||
final bool filteringEnabled;
|
final bool filteringEnabled;
|
||||||
final bool parentalEnabled;
|
final bool parentalEnabled;
|
||||||
final bool safebrowsingEnabled;
|
final bool safebrowsingEnabled;
|
||||||
final bool safesearchEnabled;
|
final bool? safesearchEnabled;
|
||||||
final bool useGlobalBlockedServices;
|
final bool useGlobalBlockedServices;
|
||||||
final bool useGlobalSettings;
|
final bool useGlobalSettings;
|
||||||
|
final SafeSearch? safeSearch;
|
||||||
|
|
||||||
Client({
|
Client({
|
||||||
required this.name,
|
required this.name,
|
||||||
|
@ -116,6 +118,7 @@ class Client {
|
||||||
required this.safesearchEnabled,
|
required this.safesearchEnabled,
|
||||||
required this.useGlobalBlockedServices,
|
required this.useGlobalBlockedServices,
|
||||||
required this.useGlobalSettings,
|
required this.useGlobalSettings,
|
||||||
|
required this.safeSearch,
|
||||||
});
|
});
|
||||||
|
|
||||||
factory Client.fromJson(Map<String, dynamic> json) => Client(
|
factory Client.fromJson(Map<String, dynamic> json) => Client(
|
||||||
|
@ -130,6 +133,9 @@ class Client {
|
||||||
safesearchEnabled: json["safesearch_enabled"],
|
safesearchEnabled: json["safesearch_enabled"],
|
||||||
useGlobalBlockedServices: json["use_global_blocked_services"],
|
useGlobalBlockedServices: json["use_global_blocked_services"],
|
||||||
useGlobalSettings: json["use_global_settings"],
|
useGlobalSettings: json["use_global_settings"],
|
||||||
|
safeSearch: json["safe_search"] != null
|
||||||
|
? SafeSearch.fromJson(json["safe_search"])
|
||||||
|
: null
|
||||||
);
|
);
|
||||||
|
|
||||||
Map<String, dynamic> toJson() => {
|
Map<String, dynamic> toJson() => {
|
||||||
|
@ -142,6 +148,7 @@ class Client {
|
||||||
"parental_enabled": parentalEnabled,
|
"parental_enabled": parentalEnabled,
|
||||||
"safebrowsing_enabled": safebrowsingEnabled,
|
"safebrowsing_enabled": safebrowsingEnabled,
|
||||||
"safesearch_enabled": safesearchEnabled,
|
"safesearch_enabled": safesearchEnabled,
|
||||||
|
"safe_search": safeSearch,
|
||||||
"use_global_blocked_services": useGlobalBlockedServices,
|
"use_global_blocked_services": useGlobalBlockedServices,
|
||||||
"use_global_settings": useGlobalSettings,
|
"use_global_settings": useGlobalSettings,
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,25 +1,13 @@
|
||||||
import 'package:adguard_home_manager/constants/enums.dart';
|
|
||||||
|
|
||||||
class SafeSearch {
|
class SafeSearch {
|
||||||
LoadStatus loadStatus = LoadStatus.loading;
|
bool enabled = false;
|
||||||
SafeSearchData? data;
|
bool bing = false;
|
||||||
|
bool duckduckgo = false;
|
||||||
|
bool google = false;
|
||||||
|
bool pixabay = false;
|
||||||
|
bool yandex = false;
|
||||||
|
bool youtube = false;
|
||||||
|
|
||||||
SafeSearch({
|
SafeSearch({
|
||||||
required this.loadStatus,
|
|
||||||
this.data
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
class SafeSearchData {
|
|
||||||
final bool enabled;
|
|
||||||
final bool bing;
|
|
||||||
final bool duckduckgo;
|
|
||||||
final bool google;
|
|
||||||
final bool pixabay;
|
|
||||||
final bool yandex;
|
|
||||||
final bool youtube;
|
|
||||||
|
|
||||||
SafeSearchData({
|
|
||||||
required this.enabled,
|
required this.enabled,
|
||||||
required this.bing,
|
required this.bing,
|
||||||
required this.duckduckgo,
|
required this.duckduckgo,
|
||||||
|
@ -29,7 +17,7 @@ class SafeSearchData {
|
||||||
required this.youtube,
|
required this.youtube,
|
||||||
});
|
});
|
||||||
|
|
||||||
factory SafeSearchData.fromJson(Map<String, dynamic> json) => SafeSearchData(
|
factory SafeSearch.fromJson(Map<String, dynamic> json) => SafeSearch(
|
||||||
enabled: json["enabled"],
|
enabled: json["enabled"],
|
||||||
bing: json["bing"],
|
bing: json["bing"],
|
||||||
duckduckgo: json["duckduckgo"],
|
duckduckgo: json["duckduckgo"],
|
||||||
|
|
|
@ -16,6 +16,7 @@ import 'package:adguard_home_manager/functions/snackbar.dart';
|
||||||
import 'package:adguard_home_manager/constants/enums.dart';
|
import 'package:adguard_home_manager/constants/enums.dart';
|
||||||
import 'package:adguard_home_manager/classes/process_modal.dart';
|
import 'package:adguard_home_manager/classes/process_modal.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/compare_versions.dart';
|
||||||
import 'package:adguard_home_manager/models/clients.dart';
|
import 'package:adguard_home_manager/models/clients.dart';
|
||||||
import 'package:adguard_home_manager/providers/app_config_provider.dart';
|
import 'package:adguard_home_manager/providers/app_config_provider.dart';
|
||||||
import 'package:adguard_home_manager/providers/servers_provider.dart';
|
import 'package:adguard_home_manager/providers/servers_provider.dart';
|
||||||
|
@ -146,6 +147,7 @@ class _AddedListState extends State<AddedList> {
|
||||||
fullscreenDialog: true,
|
fullscreenDialog: true,
|
||||||
builder: (BuildContext context) => ClientScreen(
|
builder: (BuildContext context) => ClientScreen(
|
||||||
onConfirm: confirmEditClient,
|
onConfirm: confirmEditClient,
|
||||||
|
serverVersion: serversProvider.serverStatus.data!.serverVersion,
|
||||||
onDelete: deleteClient,
|
onDelete: deleteClient,
|
||||||
client: client,
|
client: client,
|
||||||
)
|
)
|
||||||
|
@ -260,13 +262,25 @@ class _AddedListState extends State<AddedList> {
|
||||||
Icon(
|
Icon(
|
||||||
Icons.search_rounded,
|
Icons.search_rounded,
|
||||||
size: 19,
|
size: 19,
|
||||||
color: widget.data[index].safesearchEnabled == true
|
color: versionIsGreater(
|
||||||
? appConfigProvider.useThemeColorForStatus == true
|
currentVersion: serversProvider.serverStatus.data!.serverVersion,
|
||||||
? Theme.of(context).colorScheme.primary
|
referenceVersion: 'v0.107.28',
|
||||||
: Colors.green
|
referenceVersionBeta: 'v0.108.0-b.33'
|
||||||
: appConfigProvider.useThemeColorForStatus == true
|
) == true
|
||||||
? Colors.grey
|
? widget.data[index].safeSearch!.enabled == true
|
||||||
: Colors.red,
|
? appConfigProvider.useThemeColorForStatus == true
|
||||||
|
? Theme.of(context).colorScheme.primary
|
||||||
|
: Colors.green
|
||||||
|
: appConfigProvider.useThemeColorForStatus == true
|
||||||
|
? Colors.grey
|
||||||
|
: Colors.red
|
||||||
|
: widget.data[index].safesearchEnabled == true
|
||||||
|
? appConfigProvider.useThemeColorForStatus == true
|
||||||
|
? Theme.of(context).colorScheme.primary
|
||||||
|
: Colors.green
|
||||||
|
: appConfigProvider.useThemeColorForStatus == true
|
||||||
|
? Colors.grey
|
||||||
|
: Colors.red,
|
||||||
)
|
)
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
|
@ -4,20 +4,26 @@ import 'package:uuid/uuid.dart';
|
||||||
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
||||||
|
|
||||||
import 'package:adguard_home_manager/screens/clients/remove_client_modal.dart';
|
import 'package:adguard_home_manager/screens/clients/remove_client_modal.dart';
|
||||||
|
import 'package:adguard_home_manager/screens/clients/safe_search_modal.dart';
|
||||||
import 'package:adguard_home_manager/screens/clients/services_modal.dart';
|
import 'package:adguard_home_manager/screens/clients/services_modal.dart';
|
||||||
import 'package:adguard_home_manager/screens/clients/tags_modal.dart';
|
import 'package:adguard_home_manager/screens/clients/tags_modal.dart';
|
||||||
|
import 'package:adguard_home_manager/widgets/custom_list_tile.dart';
|
||||||
|
|
||||||
|
import 'package:adguard_home_manager/functions/compare_versions.dart';
|
||||||
|
import 'package:adguard_home_manager/models/safe_search.dart';
|
||||||
import 'package:adguard_home_manager/providers/servers_provider.dart';
|
import 'package:adguard_home_manager/providers/servers_provider.dart';
|
||||||
import 'package:adguard_home_manager/models/clients.dart';
|
import 'package:adguard_home_manager/models/clients.dart';
|
||||||
|
|
||||||
class ClientScreen extends StatefulWidget {
|
class ClientScreen extends StatefulWidget {
|
||||||
final Client? client;
|
final Client? client;
|
||||||
|
final String serverVersion;
|
||||||
final void Function(Client) onConfirm;
|
final void Function(Client) onConfirm;
|
||||||
final void Function(Client)? onDelete;
|
final void Function(Client)? onDelete;
|
||||||
|
|
||||||
const ClientScreen({
|
const ClientScreen({
|
||||||
Key? key,
|
Key? key,
|
||||||
this.client,
|
this.client,
|
||||||
|
required this.serverVersion,
|
||||||
required this.onConfirm,
|
required this.onConfirm,
|
||||||
this.onDelete,
|
this.onDelete,
|
||||||
}) : super(key: key);
|
}) : super(key: key);
|
||||||
|
@ -46,6 +52,15 @@ class _ClientScreenState extends State<ClientScreen> {
|
||||||
bool? enableSafeBrowsing;
|
bool? enableSafeBrowsing;
|
||||||
bool? enableParentalControl;
|
bool? enableParentalControl;
|
||||||
bool? enableSafeSearch;
|
bool? enableSafeSearch;
|
||||||
|
SafeSearch safeSearch = SafeSearch(
|
||||||
|
enabled: false,
|
||||||
|
bing: false,
|
||||||
|
duckduckgo: false,
|
||||||
|
google: false,
|
||||||
|
pixabay: false,
|
||||||
|
yandex: false,
|
||||||
|
youtube: false
|
||||||
|
);
|
||||||
|
|
||||||
bool useGlobalSettingsServices = true;
|
bool useGlobalSettingsServices = true;
|
||||||
List<String> blockedServices = [];
|
List<String> blockedServices = [];
|
||||||
|
@ -66,8 +81,16 @@ class _ClientScreenState extends State<ClientScreen> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool version = false;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void initState() {
|
void initState() {
|
||||||
|
version = versionIsGreater(
|
||||||
|
currentVersion: widget.serverVersion,
|
||||||
|
referenceVersion: 'v0.107.28',
|
||||||
|
referenceVersionBeta: 'v0.108.0-b.33'
|
||||||
|
);
|
||||||
|
|
||||||
if (widget.client != null) {
|
if (widget.client != null) {
|
||||||
editMode = false;
|
editMode = false;
|
||||||
|
|
||||||
|
@ -81,7 +104,12 @@ class _ClientScreenState extends State<ClientScreen> {
|
||||||
enableFiltering = widget.client!.filteringEnabled;
|
enableFiltering = widget.client!.filteringEnabled;
|
||||||
enableParentalControl = widget.client!.parentalEnabled;
|
enableParentalControl = widget.client!.parentalEnabled;
|
||||||
enableSafeBrowsing = widget.client!.safebrowsingEnabled;
|
enableSafeBrowsing = widget.client!.safebrowsingEnabled;
|
||||||
enableSafeSearch = widget.client!.safesearchEnabled;
|
if (version == true) {
|
||||||
|
safeSearch = widget.client!.safeSearch!;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
enableSafeSearch = widget.client!.safesearchEnabled!;
|
||||||
|
}
|
||||||
useGlobalSettingsServices = widget.client!.useGlobalBlockedServices;
|
useGlobalSettingsServices = widget.client!.useGlobalBlockedServices;
|
||||||
blockedServices = widget.client!.blockedServices;
|
blockedServices = widget.client!.blockedServices;
|
||||||
upstreamServers = widget.client!.upstreams.map((e) => {
|
upstreamServers = widget.client!.upstreams.map((e) => {
|
||||||
|
@ -104,7 +132,8 @@ class _ClientScreenState extends State<ClientScreen> {
|
||||||
filteringEnabled: enableFiltering ?? false,
|
filteringEnabled: enableFiltering ?? false,
|
||||||
parentalEnabled: enableParentalControl ?? false,
|
parentalEnabled: enableParentalControl ?? false,
|
||||||
safebrowsingEnabled: enableSafeBrowsing ?? false,
|
safebrowsingEnabled: enableSafeBrowsing ?? false,
|
||||||
safesearchEnabled: enableSafeSearch ?? false,
|
safesearchEnabled: version == true ? enableSafeSearch : null,
|
||||||
|
safeSearch: version == true ? safeSearch : null,
|
||||||
useGlobalBlockedServices: useGlobalSettingsServices,
|
useGlobalBlockedServices: useGlobalSettingsServices,
|
||||||
blockedServices: blockedServices,
|
blockedServices: blockedServices,
|
||||||
upstreams: List<String>.from(upstreamServers.map((e) => e['controller'].text)),
|
upstreams: List<String>.from(upstreamServers.map((e) => e['controller'].text)),
|
||||||
|
@ -141,7 +170,7 @@ class _ClientScreenState extends State<ClientScreen> {
|
||||||
enableFiltering = false;
|
enableFiltering = false;
|
||||||
enableSafeBrowsing = false;
|
enableSafeBrowsing = false;
|
||||||
enableParentalControl = false;
|
enableParentalControl = false;
|
||||||
enableSafeSearch = false;
|
safeSearch.enabled = false;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
else if (useGlobalSettingsFiltering == false) {
|
else if (useGlobalSettingsFiltering == false) {
|
||||||
|
@ -151,7 +180,7 @@ class _ClientScreenState extends State<ClientScreen> {
|
||||||
enableFiltering = null;
|
enableFiltering = null;
|
||||||
enableSafeBrowsing = null;
|
enableSafeBrowsing = null;
|
||||||
enableParentalControl = null;
|
enableParentalControl = null;
|
||||||
enableSafeSearch = null;
|
safeSearch.enabled = false;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -203,6 +232,17 @@ class _ClientScreenState extends State<ClientScreen> {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void openSafeSearchModal() {
|
||||||
|
showDialog(
|
||||||
|
context: context,
|
||||||
|
builder: (context) => SafeSearchModal(
|
||||||
|
safeSearch: safeSearch,
|
||||||
|
disabled: !editMode,
|
||||||
|
onConfirm: (s) => setState(() => safeSearch = s)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
Widget settignsTile({
|
Widget settignsTile({
|
||||||
required String label,
|
required String label,
|
||||||
required bool? value,
|
required bool? value,
|
||||||
|
@ -233,10 +273,12 @@ class _ClientScreenState extends State<ClientScreen> {
|
||||||
? Switch(
|
? Switch(
|
||||||
value: value!,
|
value: value!,
|
||||||
onChanged: onChange,
|
onChanged: onChange,
|
||||||
activeColor: Theme.of(context).colorScheme.primary,
|
|
||||||
)
|
)
|
||||||
: Padding(
|
: Padding(
|
||||||
padding: const EdgeInsets.symmetric(vertical: 14),
|
padding: const EdgeInsets.symmetric(
|
||||||
|
vertical: 14,
|
||||||
|
horizontal: 12
|
||||||
|
),
|
||||||
child: Text(
|
child: Text(
|
||||||
"Global",
|
"Global",
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
|
@ -461,7 +503,6 @@ class _ClientScreenState extends State<ClientScreen> {
|
||||||
onChanged: editMode == true
|
onChanged: editMode == true
|
||||||
? (value) => enableDisableGlobalSettingsFiltering()
|
? (value) => enableDisableGlobalSettingsFiltering()
|
||||||
: null,
|
: null,
|
||||||
activeColor: Theme.of(context).colorScheme.primary,
|
|
||||||
)
|
)
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
@ -491,7 +532,34 @@ class _ClientScreenState extends State<ClientScreen> {
|
||||||
? (value) => setState(() => enableParentalControl = value)
|
? (value) => setState(() => enableParentalControl = value)
|
||||||
: null
|
: null
|
||||||
),
|
),
|
||||||
settignsTile(
|
if (
|
||||||
|
versionIsGreater(
|
||||||
|
currentVersion: serversProvider.serverStatus.data!.serverVersion,
|
||||||
|
referenceVersion: 'v0.107.28',
|
||||||
|
referenceVersionBeta: 'v0.108.0-b.33'
|
||||||
|
) == true
|
||||||
|
) CustomListTile(
|
||||||
|
title: AppLocalizations.of(context)!.safeSearch,
|
||||||
|
padding: const EdgeInsets.symmetric(
|
||||||
|
horizontal: 42,
|
||||||
|
vertical: 16
|
||||||
|
),
|
||||||
|
trailing: Padding(
|
||||||
|
padding: const EdgeInsets.only(right: 16),
|
||||||
|
child: Icon(
|
||||||
|
Icons.chevron_right_rounded,
|
||||||
|
color: Theme.of(context).colorScheme.onSurfaceVariant,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
onTap: openSafeSearchModal,
|
||||||
|
),
|
||||||
|
if (
|
||||||
|
versionIsGreater(
|
||||||
|
currentVersion: serversProvider.serverStatus.data!.serverVersion,
|
||||||
|
referenceVersion: 'v0.107.28',
|
||||||
|
referenceVersionBeta: 'v0.108.0-b.33'
|
||||||
|
) == false
|
||||||
|
) settignsTile(
|
||||||
label: AppLocalizations.of(context)!.enableSafeSearch,
|
label: AppLocalizations.of(context)!.enableSafeSearch,
|
||||||
value: enableSafeSearch,
|
value: enableSafeSearch,
|
||||||
onChange: editMode == true
|
onChange: editMode == true
|
||||||
|
@ -529,7 +597,6 @@ class _ClientScreenState extends State<ClientScreen> {
|
||||||
onChanged: editMode == true
|
onChanged: editMode == true
|
||||||
? (value) => updateServicesGlobalSettings(value)
|
? (value) => updateServicesGlobalSettings(value)
|
||||||
: null,
|
: null,
|
||||||
activeColor: Theme.of(context).colorScheme.primary,
|
|
||||||
)
|
)
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
|
|
@ -7,6 +7,7 @@ import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
||||||
import 'package:adguard_home_manager/screens/clients/client_screen.dart';
|
import 'package:adguard_home_manager/screens/clients/client_screen.dart';
|
||||||
|
|
||||||
import 'package:adguard_home_manager/functions/snackbar.dart';
|
import 'package:adguard_home_manager/functions/snackbar.dart';
|
||||||
|
import 'package:adguard_home_manager/functions/compare_versions.dart';
|
||||||
import 'package:adguard_home_manager/models/clients.dart';
|
import 'package:adguard_home_manager/models/clients.dart';
|
||||||
import 'package:adguard_home_manager/services/http_requests.dart';
|
import 'package:adguard_home_manager/services/http_requests.dart';
|
||||||
import 'package:adguard_home_manager/classes/process_modal.dart';
|
import 'package:adguard_home_manager/classes/process_modal.dart';
|
||||||
|
@ -25,7 +26,16 @@ class ClientsFab extends StatelessWidget {
|
||||||
ProcessModal processModal = ProcessModal(context: context);
|
ProcessModal processModal = ProcessModal(context: context);
|
||||||
processModal.open(AppLocalizations.of(context)!.addingClient);
|
processModal.open(AppLocalizations.of(context)!.addingClient);
|
||||||
|
|
||||||
final result = await postAddClient(server: serversProvider.selectedServer!, data: client.toJson());
|
final result = await postAddClient(
|
||||||
|
server: serversProvider.selectedServer!,
|
||||||
|
data: versionIsGreater(
|
||||||
|
currentVersion: serversProvider.serverStatus.data!.serverVersion,
|
||||||
|
referenceVersion: 'v0.107.28',
|
||||||
|
referenceVersionBeta: 'v0.108.0-b.33'
|
||||||
|
) == false
|
||||||
|
? client.toJson().remove('safesearch_enabled')
|
||||||
|
: client.toJson().remove('safe_search')
|
||||||
|
);
|
||||||
|
|
||||||
processModal.close();
|
processModal.close();
|
||||||
|
|
||||||
|
@ -58,6 +68,7 @@ class ClientsFab extends StatelessWidget {
|
||||||
fullscreenDialog: true,
|
fullscreenDialog: true,
|
||||||
builder: (BuildContext context) => ClientScreen(
|
builder: (BuildContext context) => ClientScreen(
|
||||||
onConfirm: confirmAddClient,
|
onConfirm: confirmAddClient,
|
||||||
|
serverVersion: serversProvider.serverStatus.data!.serverVersion,
|
||||||
)
|
)
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
196
lib/screens/clients/safe_search_modal.dart
Normal file
196
lib/screens/clients/safe_search_modal.dart
Normal file
|
@ -0,0 +1,196 @@
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
||||||
|
|
||||||
|
import 'package:adguard_home_manager/widgets/custom_checkbox_list_tile.dart';
|
||||||
|
|
||||||
|
import 'package:adguard_home_manager/models/safe_search.dart';
|
||||||
|
|
||||||
|
class SafeSearchModal extends StatefulWidget {
|
||||||
|
final SafeSearch safeSearch;
|
||||||
|
final bool disabled;
|
||||||
|
final void Function(SafeSearch) onConfirm;
|
||||||
|
|
||||||
|
const SafeSearchModal({
|
||||||
|
Key? key,
|
||||||
|
required this.safeSearch,
|
||||||
|
required this.disabled,
|
||||||
|
required this.onConfirm
|
||||||
|
}) : super(key: key);
|
||||||
|
|
||||||
|
@override
|
||||||
|
State<SafeSearchModal> createState() => _SafeSearchModalState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _SafeSearchModalState extends State<SafeSearchModal> {
|
||||||
|
bool generalEnabled = false;
|
||||||
|
bool bingEnabled = false;
|
||||||
|
bool duckduckgoEnabled = false;
|
||||||
|
bool googleEnabled = false;
|
||||||
|
bool pixabayEnabled = false;
|
||||||
|
bool yandexEnabled = false;
|
||||||
|
bool youtubeEnabled = false;
|
||||||
|
|
||||||
|
@override
|
||||||
|
void initState() {
|
||||||
|
generalEnabled = widget.safeSearch.enabled;
|
||||||
|
bingEnabled = widget.safeSearch.bing;
|
||||||
|
duckduckgoEnabled = widget.safeSearch.duckduckgo;
|
||||||
|
googleEnabled = widget.safeSearch.google;
|
||||||
|
pixabayEnabled = widget.safeSearch.pixabay;
|
||||||
|
yandexEnabled = widget.safeSearch.yandex;
|
||||||
|
youtubeEnabled = widget.safeSearch.youtube;
|
||||||
|
|
||||||
|
super.initState();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return AlertDialog(
|
||||||
|
contentPadding: const EdgeInsets.symmetric(horizontal: 0, vertical: 16),
|
||||||
|
title: Column(
|
||||||
|
children: [
|
||||||
|
Icon(
|
||||||
|
Icons.search_rounded,
|
||||||
|
size: 24,
|
||||||
|
color: Theme.of(context).listTileTheme.iconColor
|
||||||
|
),
|
||||||
|
const SizedBox(height: 16),
|
||||||
|
Text(
|
||||||
|
AppLocalizations.of(context)!.safeSearch,
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
style: TextStyle(
|
||||||
|
color: Theme.of(context).colorScheme.onSurface
|
||||||
|
),
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
content: Wrap(
|
||||||
|
children: [
|
||||||
|
Padding(
|
||||||
|
padding: const EdgeInsets.symmetric(horizontal: 16),
|
||||||
|
child: Material(
|
||||||
|
color: Theme.of(context).colorScheme.primary.withOpacity(0.1),
|
||||||
|
borderRadius: BorderRadius.circular(28),
|
||||||
|
child: InkWell(
|
||||||
|
onTap: widget.disabled == true
|
||||||
|
? null
|
||||||
|
: () => setState(() => generalEnabled = !generalEnabled),
|
||||||
|
borderRadius: BorderRadius.circular(28),
|
||||||
|
child: Padding(
|
||||||
|
padding: const EdgeInsets.symmetric(
|
||||||
|
horizontal: 20,
|
||||||
|
vertical: 5
|
||||||
|
),
|
||||||
|
child: Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
|
children: [
|
||||||
|
Text(
|
||||||
|
AppLocalizations.of(context)!.enable,
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 16,
|
||||||
|
color: widget.disabled == true
|
||||||
|
? Colors.grey
|
||||||
|
: Theme.of(context).colorScheme.onSurface
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Switch(
|
||||||
|
value: generalEnabled,
|
||||||
|
onChanged: widget.disabled == true
|
||||||
|
? null
|
||||||
|
: (value) => setState(() => generalEnabled = value),
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
const SizedBox(height: 4, width: double.maxFinite),
|
||||||
|
CustomCheckboxListTile(
|
||||||
|
value: bingEnabled,
|
||||||
|
onChanged: (value) => setState(() => bingEnabled = value),
|
||||||
|
title: "Bing",
|
||||||
|
disabled: widget.disabled || !generalEnabled,
|
||||||
|
padding: const EdgeInsets.symmetric(
|
||||||
|
horizontal: 36,
|
||||||
|
vertical: 4
|
||||||
|
),
|
||||||
|
),
|
||||||
|
CustomCheckboxListTile(
|
||||||
|
value: duckduckgoEnabled,
|
||||||
|
onChanged: (value) => setState(() => duckduckgoEnabled = value),
|
||||||
|
title: "DuckDuckGo",
|
||||||
|
disabled: widget.disabled || !generalEnabled,
|
||||||
|
padding: const EdgeInsets.symmetric(
|
||||||
|
horizontal: 36,
|
||||||
|
vertical: 4
|
||||||
|
),
|
||||||
|
),
|
||||||
|
CustomCheckboxListTile(
|
||||||
|
value: googleEnabled,
|
||||||
|
onChanged: (value) => setState(() => googleEnabled = value),
|
||||||
|
title: "Google",
|
||||||
|
disabled: widget.disabled || !generalEnabled,
|
||||||
|
padding: const EdgeInsets.symmetric(
|
||||||
|
horizontal: 36,
|
||||||
|
vertical: 4
|
||||||
|
),
|
||||||
|
),
|
||||||
|
CustomCheckboxListTile(
|
||||||
|
value: pixabayEnabled,
|
||||||
|
onChanged: (value) => setState(() => pixabayEnabled = value),
|
||||||
|
title: "Pixabay",
|
||||||
|
disabled: widget.disabled || !generalEnabled,
|
||||||
|
padding: const EdgeInsets.symmetric(
|
||||||
|
horizontal: 36,
|
||||||
|
vertical: 4
|
||||||
|
),
|
||||||
|
),
|
||||||
|
CustomCheckboxListTile(
|
||||||
|
value: yandexEnabled,
|
||||||
|
onChanged: (value) => setState(() => yandexEnabled = value),
|
||||||
|
title: "Yandex",
|
||||||
|
disabled: widget.disabled || !generalEnabled,
|
||||||
|
padding: const EdgeInsets.symmetric(
|
||||||
|
horizontal: 36,
|
||||||
|
vertical: 4
|
||||||
|
),
|
||||||
|
),
|
||||||
|
CustomCheckboxListTile(
|
||||||
|
value: youtubeEnabled,
|
||||||
|
onChanged: (value) => setState(() => youtubeEnabled = value),
|
||||||
|
title: "YouTube",
|
||||||
|
disabled: widget.disabled || !generalEnabled,
|
||||||
|
padding: const EdgeInsets.symmetric(
|
||||||
|
horizontal: 36,
|
||||||
|
vertical: 4
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
actions: [
|
||||||
|
TextButton(
|
||||||
|
onPressed: () => Navigator.pop(context),
|
||||||
|
child: Text(AppLocalizations.of(context)!.cancel)
|
||||||
|
),
|
||||||
|
TextButton(
|
||||||
|
onPressed: widget.disabled == false ? () {
|
||||||
|
widget.onConfirm(
|
||||||
|
SafeSearch(
|
||||||
|
enabled: generalEnabled,
|
||||||
|
bing: bingEnabled,
|
||||||
|
duckduckgo: duckduckgoEnabled,
|
||||||
|
google: googleEnabled,
|
||||||
|
pixabay: pixabayEnabled,
|
||||||
|
yandex: yandexEnabled,
|
||||||
|
youtube: youtubeEnabled
|
||||||
|
)
|
||||||
|
);
|
||||||
|
Navigator.pop(context);
|
||||||
|
} : null,
|
||||||
|
child: Text(AppLocalizations.of(context)!.confirm)
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
|
@ -13,6 +13,7 @@ import 'package:adguard_home_manager/widgets/custom_list_tile.dart';
|
||||||
|
|
||||||
import 'package:adguard_home_manager/services/http_requests.dart';
|
import 'package:adguard_home_manager/services/http_requests.dart';
|
||||||
import 'package:adguard_home_manager/classes/process_modal.dart';
|
import 'package:adguard_home_manager/classes/process_modal.dart';
|
||||||
|
import 'package:adguard_home_manager/functions/compare_versions.dart';
|
||||||
import 'package:adguard_home_manager/functions/snackbar.dart';
|
import 'package:adguard_home_manager/functions/snackbar.dart';
|
||||||
import 'package:adguard_home_manager/providers/app_config_provider.dart';
|
import 'package:adguard_home_manager/providers/app_config_provider.dart';
|
||||||
import 'package:adguard_home_manager/models/clients.dart';
|
import 'package:adguard_home_manager/models/clients.dart';
|
||||||
|
@ -188,6 +189,7 @@ class _SearchClientsWidgetState extends State<SearchClientsWidget> {
|
||||||
onConfirm: confirmEditClient,
|
onConfirm: confirmEditClient,
|
||||||
onDelete: deleteClient,
|
onDelete: deleteClient,
|
||||||
client: client,
|
client: client,
|
||||||
|
serverVersion: serversProvider.serverStatus.data!.serverVersion,
|
||||||
)
|
)
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
@ -337,13 +339,25 @@ class _SearchClientsWidgetState extends State<SearchClientsWidget> {
|
||||||
Icon(
|
Icon(
|
||||||
Icons.search_rounded,
|
Icons.search_rounded,
|
||||||
size: 19,
|
size: 19,
|
||||||
color: clientsScreen[index].safesearchEnabled == true
|
color: versionIsGreater(
|
||||||
? appConfigProvider.useThemeColorForStatus == true
|
currentVersion: serversProvider.serverStatus.data!.serverVersion,
|
||||||
? Theme.of(context).colorScheme.primary
|
referenceVersion: 'v0.107.28',
|
||||||
: Colors.green
|
referenceVersionBeta: 'v0.108.0-b.33'
|
||||||
: appConfigProvider.useThemeColorForStatus == true
|
) == true
|
||||||
? Colors.grey
|
? clientsScreen[index].safeSearch!.enabled == true
|
||||||
: Colors.red,
|
? appConfigProvider.useThemeColorForStatus == true
|
||||||
|
? Theme.of(context).colorScheme.primary
|
||||||
|
: Colors.green
|
||||||
|
: appConfigProvider.useThemeColorForStatus == true
|
||||||
|
? Colors.grey
|
||||||
|
: Colors.red
|
||||||
|
: clientsScreen[index].safesearchEnabled == true
|
||||||
|
? appConfigProvider.useThemeColorForStatus == true
|
||||||
|
? Theme.of(context).colorScheme.primary
|
||||||
|
: Colors.green
|
||||||
|
: appConfigProvider.useThemeColorForStatus == true
|
||||||
|
? Colors.grey
|
||||||
|
: Colors.red,
|
||||||
)
|
)
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
|
@ -200,7 +200,6 @@ class _AddCustomRuleState extends State<AddCustomRule> {
|
||||||
Switch(
|
Switch(
|
||||||
value: addImportant,
|
value: addImportant,
|
||||||
onChanged: (value) => setState(() => addImportant = value),
|
onChanged: (value) => setState(() => addImportant = value),
|
||||||
activeColor: Theme.of(context).colorScheme.primary,
|
|
||||||
)
|
)
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
|
|
@ -197,7 +197,6 @@ class _ManagementModalState extends State<ManagementModal> with SingleTickerProv
|
||||||
filter: legacyMode == true ? 'general_legacy' : 'general'
|
filter: legacyMode == true ? 'general_legacy' : 'general'
|
||||||
);
|
);
|
||||||
} : null,
|
} : null,
|
||||||
activeColor: Theme.of(context).colorScheme.primary,
|
|
||||||
)
|
)
|
||||||
]
|
]
|
||||||
);
|
);
|
||||||
|
@ -357,7 +356,6 @@ class _ManagementModalState extends State<ManagementModal> with SingleTickerProv
|
||||||
onChanged: disabled == false
|
onChanged: disabled == false
|
||||||
? onChange
|
? onChange
|
||||||
: null,
|
: null,
|
||||||
activeColor: Theme.of(context).colorScheme.primary,
|
|
||||||
)
|
)
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
|
|
@ -202,7 +202,6 @@ class _LogsConfigModalWidgetState extends State<LogsConfigModalWidget> {
|
||||||
Switch(
|
Switch(
|
||||||
value: generalSwitch,
|
value: generalSwitch,
|
||||||
onChanged: (value) => setState(() => generalSwitch = value),
|
onChanged: (value) => setState(() => generalSwitch = value),
|
||||||
activeColor: Theme.of(context).colorScheme.primary,
|
|
||||||
)
|
)
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
@ -233,7 +232,6 @@ class _LogsConfigModalWidgetState extends State<LogsConfigModalWidget> {
|
||||||
Switch(
|
Switch(
|
||||||
value: anonymizeClientIp,
|
value: anonymizeClientIp,
|
||||||
onChanged: (value) => setState(() => anonymizeClientIp = value),
|
onChanged: (value) => setState(() => anonymizeClientIp = value),
|
||||||
activeColor: Theme.of(context).colorScheme.primary,
|
|
||||||
)
|
)
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
|
|
@ -50,7 +50,6 @@ class AdvancedSettings extends StatelessWidget {
|
||||||
trailing: Switch(
|
trailing: Switch(
|
||||||
value: appConfigProvider.overrideSslCheck,
|
value: appConfigProvider.overrideSslCheck,
|
||||||
onChanged: updateSslCheck,
|
onChanged: updateSslCheck,
|
||||||
activeColor: Theme.of(context).colorScheme.primary,
|
|
||||||
),
|
),
|
||||||
onTap: () => updateSslCheck(!appConfigProvider.overrideSslCheck),
|
onTap: () => updateSslCheck(!appConfigProvider.overrideSslCheck),
|
||||||
padding: const EdgeInsets.only(
|
padding: const EdgeInsets.only(
|
||||||
|
|
|
@ -449,7 +449,6 @@ class _DhcpWidgetState extends State<DhcpWidget> {
|
||||||
onChanged: selectedInterface != null
|
onChanged: selectedInterface != null
|
||||||
? (value) => setState(() => enabled = value)
|
? (value) => setState(() => enabled = value)
|
||||||
: null,
|
: null,
|
||||||
activeColor: Theme.of(context).colorScheme.primary,
|
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
|
|
@ -58,7 +58,6 @@ class EncryptionMasterSwitch extends StatelessWidget {
|
||||||
Switch(
|
Switch(
|
||||||
value: value,
|
value: value,
|
||||||
onChanged: (value) => onChange(value),
|
onChanged: (value) => onChange(value),
|
||||||
activeColor: Theme.of(context).colorScheme.primary,
|
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
|
|
@ -69,7 +69,6 @@ class GeneralSettings extends StatelessWidget {
|
||||||
trailing: Switch(
|
trailing: Switch(
|
||||||
value: appConfigProvider.hideZeroValues,
|
value: appConfigProvider.hideZeroValues,
|
||||||
onChanged: updateHideZeroValues,
|
onChanged: updateHideZeroValues,
|
||||||
activeColor: Theme.of(context).colorScheme.primary,
|
|
||||||
),
|
),
|
||||||
onTap: () => updateHideZeroValues(!appConfigProvider.hideZeroValues),
|
onTap: () => updateHideZeroValues(!appConfigProvider.hideZeroValues),
|
||||||
padding: const EdgeInsets.only(
|
padding: const EdgeInsets.only(
|
||||||
|
@ -86,7 +85,6 @@ class GeneralSettings extends StatelessWidget {
|
||||||
trailing: Switch(
|
trailing: Switch(
|
||||||
value: appConfigProvider.showNameTimeLogs,
|
value: appConfigProvider.showNameTimeLogs,
|
||||||
onChanged: updateShowNameTimeLogs,
|
onChanged: updateShowNameTimeLogs,
|
||||||
activeColor: Theme.of(context).colorScheme.primary,
|
|
||||||
),
|
),
|
||||||
onTap: () => updateShowNameTimeLogs(!appConfigProvider.showNameTimeLogs),
|
onTap: () => updateShowNameTimeLogs(!appConfigProvider.showNameTimeLogs),
|
||||||
padding: const EdgeInsets.only(
|
padding: const EdgeInsets.only(
|
||||||
|
|
|
@ -4,11 +4,10 @@ import 'package:flutter/material.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
||||||
|
|
||||||
import 'package:adguard_home_manager/widgets/custom_switch_list_tile.dart';
|
import 'package:adguard_home_manager/widgets/custom_checkbox_list_tile.dart';
|
||||||
|
|
||||||
import 'package:adguard_home_manager/classes/process_modal.dart';
|
import 'package:adguard_home_manager/classes/process_modal.dart';
|
||||||
import 'package:adguard_home_manager/functions/snackbar.dart';
|
import 'package:adguard_home_manager/functions/snackbar.dart';
|
||||||
import 'package:adguard_home_manager/widgets/custom_checkbox_list_tile.dart';
|
|
||||||
import 'package:adguard_home_manager/models/server_status.dart';
|
import 'package:adguard_home_manager/models/server_status.dart';
|
||||||
import 'package:adguard_home_manager/services/http_requests.dart';
|
import 'package:adguard_home_manager/services/http_requests.dart';
|
||||||
import 'package:adguard_home_manager/providers/app_config_provider.dart';
|
import 'package:adguard_home_manager/providers/app_config_provider.dart';
|
||||||
|
|
|
@ -2255,41 +2255,6 @@ Future requestUpdateServer({
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Future getSafeSearchSettings({
|
|
||||||
required Server server,
|
|
||||||
}) async {
|
|
||||||
final result = await apiRequest(
|
|
||||||
urlPath: '/safesearch/status',
|
|
||||||
method: 'get',
|
|
||||||
server: server,
|
|
||||||
type: 'safesearch_settings'
|
|
||||||
);
|
|
||||||
|
|
||||||
if (result['hasResponse'] == true) {
|
|
||||||
if (result['statusCode'] == 200) {
|
|
||||||
return {
|
|
||||||
'result': 'success',
|
|
||||||
'data': SafeSearchData.fromJson(jsonDecode(result['body']))
|
|
||||||
};
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return {
|
|
||||||
'result': 'error',
|
|
||||||
'log': AppLog(
|
|
||||||
type: 'safesearch_settings',
|
|
||||||
dateTime: DateTime.now(),
|
|
||||||
message: 'error_code_not_expected',
|
|
||||||
statusCode: result['statusCode'].toString(),
|
|
||||||
resBody: result['body'],
|
|
||||||
)
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Future updateSafeSearchSettings({
|
Future updateSafeSearchSettings({
|
||||||
required Server server,
|
required Server server,
|
||||||
required Map<String, bool> body
|
required Map<String, bool> body
|
||||||
|
|
|
@ -580,7 +580,6 @@ class _AddServerModalState extends State<AddServerModal> {
|
||||||
onChanged: widget.server == null
|
onChanged: widget.server == null
|
||||||
? (value) => setState(() => defaultServer = value)
|
? (value) => setState(() => defaultServer = value)
|
||||||
: null,
|
: null,
|
||||||
activeColor: Theme.of(context).colorScheme.primary,
|
|
||||||
)
|
)
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
@ -606,7 +605,6 @@ class _AddServerModalState extends State<AddServerModal> {
|
||||||
Switch(
|
Switch(
|
||||||
value: homeAssistant,
|
value: homeAssistant,
|
||||||
onChanged: (value) => setState(() => homeAssistant = value),
|
onChanged: (value) => setState(() => homeAssistant = value),
|
||||||
activeColor: Theme.of(context).colorScheme.primary,
|
|
||||||
)
|
)
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
|
Loading…
Add table
Reference in a new issue