Option to Hide memories (#1345)
This commit is contained in:
commit
bd8a868c57
8 changed files with 92 additions and 5 deletions
5
lib/events/memories_setting_changed.dart
Normal file
5
lib/events/memories_setting_changed.dart
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
import "package:photos/events/event.dart";
|
||||||
|
|
||||||
|
// todo: consider removing this once we opt for riverpod or similar state management
|
||||||
|
// solution
|
||||||
|
class MemoriesSettingChanged extends Event {}
|
1
lib/generated/intl/messages_en.dart
generated
1
lib/generated/intl/messages_en.dart
generated
|
@ -1133,6 +1133,7 @@ class MessageLookup extends MessageLookupByLibrary {
|
||||||
"sharedWithYou":
|
"sharedWithYou":
|
||||||
MessageLookupByLibrary.simpleMessage("Shared with you"),
|
MessageLookupByLibrary.simpleMessage("Shared with you"),
|
||||||
"sharing": MessageLookupByLibrary.simpleMessage("Sharing..."),
|
"sharing": MessageLookupByLibrary.simpleMessage("Sharing..."),
|
||||||
|
"showMemories": MessageLookupByLibrary.simpleMessage("Show memories"),
|
||||||
"signUpTerms": MessageLookupByLibrary.simpleMessage(
|
"signUpTerms": MessageLookupByLibrary.simpleMessage(
|
||||||
"I agree to the <u-terms>terms of service</u-terms> and <u-policy>privacy policy</u-policy>"),
|
"I agree to the <u-terms>terms of service</u-terms> and <u-policy>privacy policy</u-policy>"),
|
||||||
"singleFileDeleteFromDevice": m47,
|
"singleFileDeleteFromDevice": m47,
|
||||||
|
|
11
lib/generated/l10n.dart
generated
11
lib/generated/l10n.dart
generated
|
@ -1,6 +1,7 @@
|
||||||
// GENERATED CODE - DO NOT MODIFY BY HAND
|
// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:intl/intl.dart';
|
import 'package:intl/intl.dart';
|
||||||
|
|
||||||
import 'intl/messages_all.dart';
|
import 'intl/messages_all.dart';
|
||||||
|
|
||||||
// **************************************************************************
|
// **************************************************************************
|
||||||
|
@ -2950,6 +2951,16 @@ class S {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// `Show memories`
|
||||||
|
String get showMemories {
|
||||||
|
return Intl.message(
|
||||||
|
'Show memories',
|
||||||
|
name: 'showMemories',
|
||||||
|
desc: '',
|
||||||
|
args: [],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
/// `{count, plural, one{{count} year ago} other{{count} years ago}}`
|
/// `{count, plural, one{{count} year ago} other{{count} years ago}}`
|
||||||
String yearsAgo(num count) {
|
String yearsAgo(num count) {
|
||||||
return Intl.plural(
|
return Intl.plural(
|
||||||
|
|
|
@ -435,6 +435,7 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"showMemories": "Show memories",
|
||||||
"yearsAgo": "{count, plural, one{{count} year ago} other{{count} years ago}}",
|
"yearsAgo": "{count, plural, one{{count} year ago} other{{count} years ago}}",
|
||||||
"backupSettings": "Backup settings",
|
"backupSettings": "Backup settings",
|
||||||
"backupOverMobileData": "Backup over mobile data",
|
"backupOverMobileData": "Backup over mobile data",
|
||||||
|
|
|
@ -173,7 +173,7 @@ Future<void> _init(bool isBackground, {String via = ''}) async {
|
||||||
TrashSyncService.instance.init(preferences);
|
TrashSyncService.instance.init(preferences);
|
||||||
RemoteSyncService.instance.init(preferences);
|
RemoteSyncService.instance.init(preferences);
|
||||||
await SyncService.instance.init(preferences);
|
await SyncService.instance.init(preferences);
|
||||||
MemoriesService.instance.init();
|
MemoriesService.instance.init(preferences);
|
||||||
LocalSettings.instance.init(preferences);
|
LocalSettings.instance.init(preferences);
|
||||||
LocalFileUpdateService.instance.init(preferences);
|
LocalFileUpdateService.instance.init(preferences);
|
||||||
SearchService.instance.init();
|
SearchService.instance.init();
|
||||||
|
|
|
@ -5,18 +5,23 @@ import "package:photos/core/event_bus.dart";
|
||||||
import 'package:photos/db/files_db.dart';
|
import 'package:photos/db/files_db.dart';
|
||||||
import 'package:photos/db/memories_db.dart';
|
import 'package:photos/db/memories_db.dart';
|
||||||
import "package:photos/events/files_updated_event.dart";
|
import "package:photos/events/files_updated_event.dart";
|
||||||
|
import "package:photos/events/memories_setting_changed.dart";
|
||||||
import 'package:photos/models/filters/important_items_filter.dart';
|
import 'package:photos/models/filters/important_items_filter.dart';
|
||||||
import 'package:photos/models/memory.dart';
|
import 'package:photos/models/memory.dart';
|
||||||
import 'package:photos/services/collections_service.dart';
|
import 'package:photos/services/collections_service.dart';
|
||||||
|
import "package:shared_preferences/shared_preferences.dart";
|
||||||
|
|
||||||
class MemoriesService extends ChangeNotifier {
|
class MemoriesService extends ChangeNotifier {
|
||||||
final _logger = Logger("MemoryService");
|
final _logger = Logger("MemoryService");
|
||||||
final _memoriesDB = MemoriesDB.instance;
|
final _memoriesDB = MemoriesDB.instance;
|
||||||
final _filesDB = FilesDB.instance;
|
final _filesDB = FilesDB.instance;
|
||||||
|
late SharedPreferences _prefs;
|
||||||
|
|
||||||
static const daysInAYear = 365;
|
static const daysInAYear = 365;
|
||||||
static const yearsBefore = 30;
|
static const yearsBefore = 30;
|
||||||
static const daysBefore = 7;
|
static const daysBefore = 7;
|
||||||
static const daysAfter = 1;
|
static const daysAfter = 1;
|
||||||
|
static const _showMemoryKey = "memories.enabled";
|
||||||
|
|
||||||
List<Memory>? _cachedMemories;
|
List<Memory>? _cachedMemories;
|
||||||
Future<List<Memory>>? _future;
|
Future<List<Memory>>? _future;
|
||||||
|
@ -25,10 +30,11 @@ class MemoriesService extends ChangeNotifier {
|
||||||
|
|
||||||
static final MemoriesService instance = MemoriesService._privateConstructor();
|
static final MemoriesService instance = MemoriesService._privateConstructor();
|
||||||
|
|
||||||
void init() {
|
void init(SharedPreferences prefs) {
|
||||||
addListener(() {
|
addListener(() {
|
||||||
_cachedMemories = null;
|
_cachedMemories = null;
|
||||||
});
|
});
|
||||||
|
_prefs = prefs;
|
||||||
// Clear memory after a delay, in async manner.
|
// Clear memory after a delay, in async manner.
|
||||||
// Intention of delay is to give more CPU cycles to other tasks
|
// Intention of delay is to give more CPU cycles to other tasks
|
||||||
Future.delayed(const Duration(seconds: 5), () {
|
Future.delayed(const Duration(seconds: 5), () {
|
||||||
|
@ -54,7 +60,19 @@ class MemoriesService extends ChangeNotifier {
|
||||||
_future = null;
|
_future = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool get showMemories {
|
||||||
|
return _prefs.getBool(_showMemoryKey) ?? true;
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> setShowMemories(bool value) async {
|
||||||
|
await _prefs.setBool(_showMemoryKey, value);
|
||||||
|
Bus.instance.fire(MemoriesSettingChanged());
|
||||||
|
}
|
||||||
|
|
||||||
Future<List<Memory>> getMemories() async {
|
Future<List<Memory>> getMemories() async {
|
||||||
|
if (!showMemories) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
if (_cachedMemories != null) {
|
if (_cachedMemories != null) {
|
||||||
return _cachedMemories!;
|
return _cachedMemories!;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,13 +1,43 @@
|
||||||
|
import "dart:async";
|
||||||
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import "package:photos/core/event_bus.dart";
|
||||||
|
import "package:photos/events/memories_setting_changed.dart";
|
||||||
import 'package:photos/models/memory.dart';
|
import 'package:photos/models/memory.dart';
|
||||||
import 'package:photos/services/memories_service.dart';
|
import 'package:photos/services/memories_service.dart';
|
||||||
import "package:photos/ui/home/memories/memory_cover_widget.dart";
|
import "package:photos/ui/home/memories/memory_cover_widget.dart";
|
||||||
|
|
||||||
class MemoriesWidget extends StatelessWidget {
|
class MemoriesWidget extends StatefulWidget {
|
||||||
const MemoriesWidget({Key? key}) : super(key: key);
|
const MemoriesWidget({Key? key}) : super(key: key);
|
||||||
|
|
||||||
|
@override
|
||||||
|
State<MemoriesWidget> createState() => _MemoriesWidgetState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _MemoriesWidgetState extends State<MemoriesWidget> {
|
||||||
|
late StreamSubscription<MemoriesSettingChanged> _subscription;
|
||||||
|
|
||||||
|
@override
|
||||||
|
void initState() {
|
||||||
|
super.initState();
|
||||||
|
_subscription = Bus.instance.on<MemoriesSettingChanged>().listen((event) {
|
||||||
|
if (mounted) {
|
||||||
|
setState(() {});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void dispose() {
|
||||||
|
_subscription.cancel();
|
||||||
|
super.dispose();
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
|
if (!MemoriesService.instance.showMemories) {
|
||||||
|
return const SizedBox.shrink();
|
||||||
|
}
|
||||||
return FutureBuilder<List<Memory>>(
|
return FutureBuilder<List<Memory>>(
|
||||||
future: MemoriesService.instance.getMemories(),
|
future: MemoriesService.instance.getMemories(),
|
||||||
builder: (context, snapshot) {
|
builder: (context, snapshot) {
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import "package:photos/core/error-reporting/super_logging.dart";
|
import "package:photos/core/error-reporting/super_logging.dart";
|
||||||
import "package:photos/generated/l10n.dart";
|
import "package:photos/generated/l10n.dart";
|
||||||
|
import "package:photos/services/memories_service.dart";
|
||||||
import "package:photos/services/user_remote_flag_service.dart";
|
import "package:photos/services/user_remote_flag_service.dart";
|
||||||
import 'package:photos/theme/ente_theme.dart';
|
import 'package:photos/theme/ente_theme.dart';
|
||||||
import 'package:photos/ui/components/buttons/icon_button_widget.dart';
|
import 'package:photos/ui/components/buttons/icon_button_widget.dart';
|
||||||
|
@ -94,6 +95,26 @@ class _AdvancedSettingsScreenState extends State<AdvancedSettingsScreen> {
|
||||||
const SizedBox(
|
const SizedBox(
|
||||||
height: 24,
|
height: 24,
|
||||||
),
|
),
|
||||||
|
MenuItemWidget(
|
||||||
|
captionedTextWidget: CaptionedTextWidget(
|
||||||
|
title: S.of(context).showMemories,
|
||||||
|
),
|
||||||
|
menuItemColor: colorScheme.fillFaint,
|
||||||
|
singleBorderRadius: 8,
|
||||||
|
alignCaptionedTextToLeft: true,
|
||||||
|
trailingWidget: ToggleSwitchWidget(
|
||||||
|
value: () =>
|
||||||
|
MemoriesService.instance.showMemories,
|
||||||
|
onChanged: () async {
|
||||||
|
MemoriesService.instance.setShowMemories(
|
||||||
|
!MemoriesService.instance.showMemories,
|
||||||
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
|
const SizedBox(
|
||||||
|
height: 24,
|
||||||
|
),
|
||||||
MenuItemWidget(
|
MenuItemWidget(
|
||||||
captionedTextWidget: CaptionedTextWidget(
|
captionedTextWidget: CaptionedTextWidget(
|
||||||
title: S.of(context).manageDeviceStorage,
|
title: S.of(context).manageDeviceStorage,
|
||||||
|
|
Loading…
Add table
Reference in a new issue