diff --git a/lib/account.dart b/lib/account.dart index f3d6fed8..953c7e62 100644 --- a/lib/account.dart +++ b/lib/account.dart @@ -73,26 +73,42 @@ class Account with EquatableMixin { } class AccountSettings with EquatableMixin { - const AccountSettings(); + const AccountSettings({ + this.isEnableFaceRecognitionApp = true, + }); factory AccountSettings.fromJson(JsonObj json) { - return AccountSettings(); + return AccountSettings( + isEnableFaceRecognitionApp: json["isEnableFaceRecognitionApp"] ?? true, + ); } - JsonObj toJson() => {}; + JsonObj toJson() => { + "isEnableFaceRecognitionApp": isEnableFaceRecognitionApp, + }; @override toString() { return "$runtimeType {" + "isEnableFaceRecognitionApp: $isEnableFaceRecognitionApp, " "}"; } - AccountSettings copyWith() { - return AccountSettings(); + AccountSettings copyWith({ + bool? isEnableFaceRecognitionApp, + }) { + return AccountSettings( + isEnableFaceRecognitionApp: + isEnableFaceRecognitionApp ?? this.isEnableFaceRecognitionApp, + ); } @override - get props => []; + get props => [ + isEnableFaceRecognitionApp, + ]; + + final bool isEnableFaceRecognitionApp; } extension AccountExtension on Account { diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 86b71183..c8294605 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -322,6 +322,10 @@ "@settingsIncludedFoldersTitle": { "description": "Change the included folders of an account" }, + "settingsServerAppSectionTitle": "Server app support", + "@settingsServerAppSectionTitle": { + "description": "Enable/disable various server apps" + }, "settingsViewerTitle": "Viewer", "settingsViewerDescription": "Customize the image/video viewer", "settingsViewerPageTitle": "Viewer settings", diff --git a/lib/l10n/untranslated-messages.txt b/lib/l10n/untranslated-messages.txt index 57782261..217becaa 100644 --- a/lib/l10n/untranslated-messages.txt +++ b/lib/l10n/untranslated-messages.txt @@ -3,6 +3,7 @@ "settingsAccountTitle", "settingsAccountPageTitle", "settingsIncludedFoldersTitle", + "settingsServerAppSectionTitle", "settingsAlbumTitle", "settingsAlbumDescription", "settingsAlbumPageTitle", @@ -45,6 +46,7 @@ "settingsAccountTitle", "settingsAccountPageTitle", "settingsIncludedFoldersTitle", + "settingsServerAppSectionTitle", "settingsAlbumTitle", "settingsAlbumDescription", "settingsAlbumPageTitle", @@ -102,6 +104,7 @@ "settingsAccountTitle", "settingsAccountPageTitle", "settingsIncludedFoldersTitle", + "settingsServerAppSectionTitle", "settingsViewerTitle", "settingsViewerDescription", "settingsViewerPageTitle", @@ -212,6 +215,7 @@ "settingsAccountTitle", "settingsAccountPageTitle", "settingsIncludedFoldersTitle", + "settingsServerAppSectionTitle", "settingsAlbumTitle", "settingsAlbumDescription", "settingsAlbumPageTitle", @@ -255,6 +259,7 @@ "settingsAccountTitle", "settingsAccountPageTitle", "settingsIncludedFoldersTitle", + "settingsServerAppSectionTitle", "settingsViewerTitle", "settingsViewerDescription", "settingsViewerPageTitle", @@ -345,6 +350,7 @@ "settingsAccountTitle", "settingsAccountPageTitle", "settingsIncludedFoldersTitle", + "settingsServerAppSectionTitle", "settingsAlbumTitle", "settingsAlbumDescription", "settingsAlbumPageTitle", diff --git a/lib/pref.dart b/lib/pref.dart index d33d24d1..f00c9893 100644 --- a/lib/pref.dart +++ b/lib/pref.dart @@ -284,4 +284,11 @@ extension PrefExtension on Pref { return null; } } + + AccountSettings getAccountSettings(Account account) { + return Pref.inst() + .getAccounts2()! + .firstWhere((element) => element.account == account) + .settings; + } } diff --git a/lib/use_case/compat/v32.dart b/lib/use_case/compat/v32.dart index 33559e1c..5f36baa4 100644 --- a/lib/use_case/compat/v32.dart +++ b/lib/use_case/compat/v32.dart @@ -22,7 +22,9 @@ class CompatV32 { for (final j in jsons) { newJsons.add({ "account": jsonDecode(j), - "settings": {}, + "settings": { + "isEnableFaceRecognitionApp": true, + }, }); } if (await pref.setStringList( diff --git a/lib/widget/home_albums.dart b/lib/widget/home_albums.dart index 5937ab53..b766a8d9 100644 --- a/lib/widget/home_albums.dart +++ b/lib/widget/home_albums.dart @@ -442,7 +442,11 @@ class _HomeAlbumsState extends State } }).map((e) => e.item2); itemStreamListItems = [ - _buildPersonItem(context), + if (Pref.inst() + .getAccountSettings(widget.account) + .isEnableFaceRecognitionApp == + true) + _buildPersonItem(context), _buildSharingItem(context), _buildArchiveItem(context), _buildTrashbinItem(context), diff --git a/lib/widget/settings.dart b/lib/widget/settings.dart index 3ed7b2c3..3711ddc0 100644 --- a/lib/widget/settings.dart +++ b/lib/widget/settings.dart @@ -385,6 +385,9 @@ class _AccountSettingsState extends State { initState() { super.initState(); _account = widget.account; + + final settings = Pref.inst().getAccountSettings(_account); + _isEnableFaceRecognitionApp = settings.isEnableFaceRecognitionApp; } @override @@ -420,6 +423,13 @@ class _AccountSettingsState extends State { subtitle: Text(_account.roots.map((e) => "/$e").join("; ")), onTap: _onIncludedFoldersPressed, ), + _buildCaption( + context, L10n.global().settingsServerAppSectionTitle), + SwitchListTile( + title: const Text("Face Recognition"), + value: _isEnableFaceRecognitionApp, + onChanged: _onEnableFaceRecognitionAppChanged, + ), ], ), ), @@ -496,6 +506,52 @@ class _AccountSettingsState extends State { } } + Future _onEnableFaceRecognitionAppChanged(bool value) async { + final oldValue = _isEnableFaceRecognitionApp; + setState(() { + _isEnableFaceRecognitionApp = value; + }); + if (!await _modifyAccountSettings( + _account, + isEnableFaceRecognitionApp: value, + )) { + _log.severe("[_onEnableFaceRecognitionAppChanged] Failed writing pref"); + SnackBarManager().showSnackBar(SnackBar( + content: Text(L10n.global().writePreferenceFailureNotification), + duration: k.snackBarDurationNormal, + )); + setState(() { + _isEnableFaceRecognitionApp = oldValue; + }); + } else { + setState(() { + _hasModified = true; + }); + } + } + + static Future _modifyAccountSettings( + Account account, { + bool? isEnableFaceRecognitionApp, + }) { + try { + final accounts = Pref.inst().getAccounts2()!; + final index = _findAccount(account, accounts); + accounts[index] = accounts[index].copyWith( + settings: accounts[index].settings.copyWith( + isEnableFaceRecognitionApp: isEnableFaceRecognitionApp, + ), + ); + return Pref.inst().setAccounts2(accounts); + } catch (e, stackTrace) { + _log.severe( + "[_modifyAccountSettings] Failed while setting account settings", + e, + stackTrace); + return Future.value(false); + } + } + /// Return the index of [account] in [Pref.getAccounts2] static int _findAccount(Account account, [List? accounts]) { final from = accounts ?? Pref.inst().getAccounts2Or([]); @@ -504,6 +560,7 @@ class _AccountSettingsState extends State { bool _hasModified = false; late Account _account; + late bool _isEnableFaceRecognitionApp; static final _log = Logger("widget.settings._AccountSettingsState"); }