Option to Hide memories (#1345)

This commit is contained in:
Neeraj Gupta 2023-08-24 21:09:18 +05:30 committed by GitHub
commit bd8a868c57
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 92 additions and 5 deletions

View 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 {}

View file

@ -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,

View file

@ -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(

View file

@ -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",

View file

@ -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();

View file

@ -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!;
} }

View file

@ -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) {

View file

@ -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,