diff --git a/CHANGELOG.md b/CHANGELOG.md index f3f18c483..8d06af5c5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,7 @@ All notable changes to this project will be documented in this file. - crash when loading large collection - Viewer: copying content URI item - Albums: creating album with same name as existing empty directory +- Privacy: tagging while vaults are unlocked does not yield recent tags visible when vaults are locked ## [v1.11.16] - 2024-10-10 diff --git a/lib/model/settings/modules/app.dart b/lib/model/settings/modules/app.dart index a6e7d35aa..2b9caa141 100644 --- a/lib/model/settings/modules/app.dart +++ b/lib/model/settings/modules/app.dart @@ -1,5 +1,6 @@ import 'package:aves/model/filters/filters.dart'; import 'package:aves/model/settings/defaults.dart'; +import 'package:aves/model/vaults/vaults.dart'; import 'package:aves/widgets/aves_app.dart'; import 'package:aves_model/aves_model.dart'; import 'package:flutter/widgets.dart'; @@ -7,6 +8,10 @@ import 'package:flutter/widgets.dart'; mixin AppSettings on SettingsAccess { static const int recentFilterHistoryMax = 20; + void initAppSettings() { + vaults.addListener(_onVaultsChanged); + } + bool get hasAcceptedTerms => getBool(SettingKeys.hasAcceptedTermsKey) ?? SettingsDefaults.hasAcceptedTerms; set hasAcceptedTerms(bool newValue) => set(SettingKeys.hasAcceptedTermsKey, newValue); @@ -106,7 +111,24 @@ mixin AppSettings on SettingsAccess { set recentDestinationAlbums(List newValue) => set(SettingKeys.recentDestinationAlbumsKey, newValue.take(recentFilterHistoryMax).toList()); - List get recentTags => (getStringList(SettingKeys.recentTagsKey) ?? []).map(CollectionFilter.fromJson).nonNulls.toList(); + // recent tags - set recentTags(List newValue) => set(SettingKeys.recentTagsKey, newValue.take(recentFilterHistoryMax).map((filter) => filter.toJson()).toList()); + List get _recentTags => (getStringList(SettingKeys.recentTagsKey) ?? []).map(CollectionFilter.fromJson).nonNulls.toList(); + + set _recentTags(List newValue) => set(SettingKeys.recentTagsKey, newValue.take(recentFilterHistoryMax).map((filter) => filter.toJson()).toList()); + + // when vaults are unlocked, recent tags are transient and not persisted + List? _protectedRecentTags; + + List get recentTags => vaults.needProtection ? _protectedRecentTags ?? List.of(_recentTags) : _recentTags; + + set recentTags(List newValue) { + if (vaults.needProtection) { + _protectedRecentTags = newValue; + } else { + _recentTags = newValue; + } + } + + void _onVaultsChanged() => _protectedRecentTags = null; } diff --git a/lib/model/settings/settings.dart b/lib/model/settings/settings.dart index 088bfa415..3856ef1de 100644 --- a/lib/model/settings/settings.dart +++ b/lib/model/settings/settings.dart @@ -19,6 +19,7 @@ import 'package:aves/model/settings/modules/navigation.dart'; import 'package:aves/model/settings/modules/privacy.dart'; import 'package:aves/model/settings/modules/search.dart'; import 'package:aves/model/settings/modules/viewer.dart'; +import 'package:aves/model/vaults/vaults.dart'; import 'package:aves/ref/bursts.dart'; import 'package:aves/services/accessibility_service.dart'; import 'package:aves/services/common/services.dart'; @@ -69,6 +70,7 @@ class Settings with ChangeNotifier, SettingsAccess, AppSettings, DisplaySettings ..clear(); _subscriptions.add(_platformSettingsChangeChannel.receiveBroadcastStream().listen((event) => _onPlatformSettingsChanged(event as Map?))); } + initAppSettings(); } Future reload() => store.reload(); diff --git a/lib/model/source/collection_source.dart b/lib/model/source/collection_source.dart index f36f733a1..6ea63b1b2 100644 --- a/lib/model/source/collection_source.dart +++ b/lib/model/source/collection_source.dart @@ -82,10 +82,7 @@ abstract class CollectionSource with SourceBase, AlbumMixin, CountryMixin, Place _onFilterVisibilityChanged(newlyVisibleFilters); } }); - vaults.addListener(() { - final newlyVisibleFilters = vaults.vaultDirectories.whereNot(vaults.isLocked).map((v) => AlbumFilter(v, null)).toSet(); - _onFilterVisibilityChanged(newlyVisibleFilters); - }); + vaults.addListener(_onVaultsChanged); } @mustCallSuper @@ -93,6 +90,7 @@ abstract class CollectionSource with SourceBase, AlbumMixin, CountryMixin, Place if (kFlutterMemoryAllocationsEnabled) { LeakTracking.dispatchObjectDisposed(object: this); } + vaults.removeListener(_onVaultsChanged); _rawEntries.forEach((v) => v.dispose()); } @@ -598,6 +596,11 @@ abstract class CollectionSource with SourceBase, AlbumMixin, CountryMixin, Place analyze(null, entries: candidateEntries); } } + + void _onVaultsChanged() { + final newlyVisibleFilters = vaults.vaultDirectories.whereNot(vaults.isLocked).map((v) => AlbumFilter(v, null)).toSet(); + _onFilterVisibilityChanged(newlyVisibleFilters); + } } class AspectRatioChangedEvent {} diff --git a/lib/model/vaults/vaults.dart b/lib/model/vaults/vaults.dart index 718b1cd49..a621c2952 100644 --- a/lib/model/vaults/vaults.dart +++ b/lib/model/vaults/vaults.dart @@ -184,8 +184,10 @@ class Vaults extends ChangeNotifier { void _onScreenOff() => lock(all.where((v) => v.autoLockScreenOff).map((v) => v.path).toSet()); + bool get needProtection => _unlockedDirPaths.isNotEmpty; + void _onLockStateChanged() { - windowService.secureScreen(_unlockedDirPaths.isNotEmpty); + windowService.secureScreen(needProtection); notifyListeners(); } }