Browse Source

Add option to turn off memories

Signed-off-by: Neeraj Gupta <254676+ua741@users.noreply.github.com>
Neeraj Gupta 1 year ago
parent
commit
42d0bb8da5

+ 5 - 0
lib/events/memories_setting_changed.dart

@@ -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 - 0
lib/generated/intl/messages_en.dart

@@ -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 - 0
lib/generated/l10n.dart

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

+ 1 - 0
lib/l10n/intl_en.arb

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

+ 1 - 1
lib/main.dart

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

+ 19 - 1
lib/services/memories_service.dart

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

+ 33 - 3
lib/ui/home/memories/memories_widget.dart

@@ -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) {
@@ -62,9 +92,9 @@ class MemoriesWidget extends StatelessWidget {
 
 
   bool _areMemoriesFromSameYear(Memory first, Memory second) {
   bool _areMemoriesFromSameYear(Memory first, Memory second) {
     final firstDate =
     final firstDate =
-        DateTime.fromMicrosecondsSinceEpoch(first.file.creationTime!);
+    DateTime.fromMicrosecondsSinceEpoch(first.file.creationTime!);
     final secondDate =
     final secondDate =
-        DateTime.fromMicrosecondsSinceEpoch(second.file.creationTime!);
+    DateTime.fromMicrosecondsSinceEpoch(second.file.creationTime!);
     return firstDate.year == secondDate.year;
     return firstDate.year == secondDate.year;
   }
   }
 }
 }

+ 21 - 0
lib/ui/settings/advanced_settings_screen.dart

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