#1238 tagging while vaults are unlocked does not yield recent tags visible when vaults are locked

This commit is contained in:
Thibault Deckers 2024-10-29 19:29:06 +01:00
parent 00a4890fb1
commit 104403948c
5 changed files with 37 additions and 7 deletions

View file

@ -19,6 +19,7 @@ All notable changes to this project will be documented in this file.
- crash when loading large collection - crash when loading large collection
- Viewer: copying content URI item - Viewer: copying content URI item
- Albums: creating album with same name as existing empty directory - 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
## <a id="v1.11.16"></a>[v1.11.16] - 2024-10-10 ## <a id="v1.11.16"></a>[v1.11.16] - 2024-10-10

View file

@ -1,5 +1,6 @@
import 'package:aves/model/filters/filters.dart'; import 'package:aves/model/filters/filters.dart';
import 'package:aves/model/settings/defaults.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/widgets/aves_app.dart';
import 'package:aves_model/aves_model.dart'; import 'package:aves_model/aves_model.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
@ -7,6 +8,10 @@ import 'package:flutter/widgets.dart';
mixin AppSettings on SettingsAccess { mixin AppSettings on SettingsAccess {
static const int recentFilterHistoryMax = 20; static const int recentFilterHistoryMax = 20;
void initAppSettings() {
vaults.addListener(_onVaultsChanged);
}
bool get hasAcceptedTerms => getBool(SettingKeys.hasAcceptedTermsKey) ?? SettingsDefaults.hasAcceptedTerms; bool get hasAcceptedTerms => getBool(SettingKeys.hasAcceptedTermsKey) ?? SettingsDefaults.hasAcceptedTerms;
set hasAcceptedTerms(bool newValue) => set(SettingKeys.hasAcceptedTermsKey, newValue); set hasAcceptedTerms(bool newValue) => set(SettingKeys.hasAcceptedTermsKey, newValue);
@ -106,7 +111,24 @@ mixin AppSettings on SettingsAccess {
set recentDestinationAlbums(List<String> newValue) => set(SettingKeys.recentDestinationAlbumsKey, newValue.take(recentFilterHistoryMax).toList()); set recentDestinationAlbums(List<String> newValue) => set(SettingKeys.recentDestinationAlbumsKey, newValue.take(recentFilterHistoryMax).toList());
List<CollectionFilter> get recentTags => (getStringList(SettingKeys.recentTagsKey) ?? []).map(CollectionFilter.fromJson).nonNulls.toList(); // recent tags
set recentTags(List<CollectionFilter> newValue) => set(SettingKeys.recentTagsKey, newValue.take(recentFilterHistoryMax).map((filter) => filter.toJson()).toList()); List<CollectionFilter> get _recentTags => (getStringList(SettingKeys.recentTagsKey) ?? []).map(CollectionFilter.fromJson).nonNulls.toList();
set _recentTags(List<CollectionFilter> newValue) => set(SettingKeys.recentTagsKey, newValue.take(recentFilterHistoryMax).map((filter) => filter.toJson()).toList());
// when vaults are unlocked, recent tags are transient and not persisted
List<CollectionFilter>? _protectedRecentTags;
List<CollectionFilter> get recentTags => vaults.needProtection ? _protectedRecentTags ?? List.of(_recentTags) : _recentTags;
set recentTags(List<CollectionFilter> newValue) {
if (vaults.needProtection) {
_protectedRecentTags = newValue;
} else {
_recentTags = newValue;
}
}
void _onVaultsChanged() => _protectedRecentTags = null;
} }

View file

@ -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/privacy.dart';
import 'package:aves/model/settings/modules/search.dart'; import 'package:aves/model/settings/modules/search.dart';
import 'package:aves/model/settings/modules/viewer.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/ref/bursts.dart';
import 'package:aves/services/accessibility_service.dart'; import 'package:aves/services/accessibility_service.dart';
import 'package:aves/services/common/services.dart'; import 'package:aves/services/common/services.dart';
@ -69,6 +70,7 @@ class Settings with ChangeNotifier, SettingsAccess, AppSettings, DisplaySettings
..clear(); ..clear();
_subscriptions.add(_platformSettingsChangeChannel.receiveBroadcastStream().listen((event) => _onPlatformSettingsChanged(event as Map?))); _subscriptions.add(_platformSettingsChangeChannel.receiveBroadcastStream().listen((event) => _onPlatformSettingsChanged(event as Map?)));
} }
initAppSettings();
} }
Future<void> reload() => store.reload(); Future<void> reload() => store.reload();

View file

@ -82,10 +82,7 @@ abstract class CollectionSource with SourceBase, AlbumMixin, CountryMixin, Place
_onFilterVisibilityChanged(newlyVisibleFilters); _onFilterVisibilityChanged(newlyVisibleFilters);
} }
}); });
vaults.addListener(() { vaults.addListener(_onVaultsChanged);
final newlyVisibleFilters = vaults.vaultDirectories.whereNot(vaults.isLocked).map((v) => AlbumFilter(v, null)).toSet();
_onFilterVisibilityChanged(newlyVisibleFilters);
});
} }
@mustCallSuper @mustCallSuper
@ -93,6 +90,7 @@ abstract class CollectionSource with SourceBase, AlbumMixin, CountryMixin, Place
if (kFlutterMemoryAllocationsEnabled) { if (kFlutterMemoryAllocationsEnabled) {
LeakTracking.dispatchObjectDisposed(object: this); LeakTracking.dispatchObjectDisposed(object: this);
} }
vaults.removeListener(_onVaultsChanged);
_rawEntries.forEach((v) => v.dispose()); _rawEntries.forEach((v) => v.dispose());
} }
@ -598,6 +596,11 @@ abstract class CollectionSource with SourceBase, AlbumMixin, CountryMixin, Place
analyze(null, entries: candidateEntries); analyze(null, entries: candidateEntries);
} }
} }
void _onVaultsChanged() {
final newlyVisibleFilters = vaults.vaultDirectories.whereNot(vaults.isLocked).map((v) => AlbumFilter(v, null)).toSet();
_onFilterVisibilityChanged(newlyVisibleFilters);
}
} }
class AspectRatioChangedEvent {} class AspectRatioChangedEvent {}

View file

@ -184,8 +184,10 @@ class Vaults extends ChangeNotifier {
void _onScreenOff() => lock(all.where((v) => v.autoLockScreenOff).map((v) => v.path).toSet()); void _onScreenOff() => lock(all.where((v) => v.autoLockScreenOff).map((v) => v.path).toSet());
bool get needProtection => _unlockedDirPaths.isNotEmpty;
void _onLockStateChanged() { void _onLockStateChanged() {
windowService.secureScreen(_unlockedDirPaths.isNotEmpty); windowService.secureScreen(needProtection);
notifyListeners(); notifyListeners();
} }
} }