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":
MessageLookupByLibrary.simpleMessage("Shared with you"),
"sharing": MessageLookupByLibrary.simpleMessage("Sharing..."),
"showMemories": MessageLookupByLibrary.simpleMessage("Show memories"),
"signUpTerms": MessageLookupByLibrary.simpleMessage(
"I agree to the <u-terms>terms of service</u-terms> and <u-policy>privacy policy</u-policy>"),
"singleFileDeleteFromDevice": m47,

View file

@ -1,6 +1,7 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
import 'package:flutter/material.dart';
import 'package:intl/intl.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}}`
String yearsAgo(num count) {
return Intl.plural(

View file

@ -435,6 +435,7 @@
}
}
},
"showMemories": "Show memories",
"yearsAgo": "{count, plural, one{{count} year ago} other{{count} years ago}}",
"backupSettings": "Backup settings",
"backupOverMobileData": "Backup over mobile data",

View file

@ -173,7 +173,7 @@ Future<void> _init(bool isBackground, {String via = ''}) async {
TrashSyncService.instance.init(preferences);
RemoteSyncService.instance.init(preferences);
await SyncService.instance.init(preferences);
MemoriesService.instance.init();
MemoriesService.instance.init(preferences);
LocalSettings.instance.init(preferences);
LocalFileUpdateService.instance.init(preferences);
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/memories_db.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/memory.dart';
import 'package:photos/services/collections_service.dart';
import "package:shared_preferences/shared_preferences.dart";
class MemoriesService extends ChangeNotifier {
final _logger = Logger("MemoryService");
final _memoriesDB = MemoriesDB.instance;
final _filesDB = FilesDB.instance;
late SharedPreferences _prefs;
static const daysInAYear = 365;
static const yearsBefore = 30;
static const daysBefore = 7;
static const daysAfter = 1;
static const _showMemoryKey = "memories.enabled";
List<Memory>? _cachedMemories;
Future<List<Memory>>? _future;
@ -25,10 +30,11 @@ class MemoriesService extends ChangeNotifier {
static final MemoriesService instance = MemoriesService._privateConstructor();
void init() {
void init(SharedPreferences prefs) {
addListener(() {
_cachedMemories = null;
});
_prefs = prefs;
// Clear memory after a delay, in async manner.
// Intention of delay is to give more CPU cycles to other tasks
Future.delayed(const Duration(seconds: 5), () {
@ -54,7 +60,19 @@ class MemoriesService extends ChangeNotifier {
_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 {
if (!showMemories) {
return [];
}
if (_cachedMemories != null) {
return _cachedMemories!;
}

View file

@ -1,13 +1,43 @@
import "dart:async";
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/services/memories_service.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);
@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
Widget build(BuildContext context) {
if (!MemoriesService.instance.showMemories) {
return const SizedBox.shrink();
}
return FutureBuilder<List<Memory>>(
future: MemoriesService.instance.getMemories(),
builder: (context, snapshot) {
@ -62,9 +92,9 @@ class MemoriesWidget extends StatelessWidget {
bool _areMemoriesFromSameYear(Memory first, Memory second) {
final firstDate =
DateTime.fromMicrosecondsSinceEpoch(first.file.creationTime!);
DateTime.fromMicrosecondsSinceEpoch(first.file.creationTime!);
final secondDate =
DateTime.fromMicrosecondsSinceEpoch(second.file.creationTime!);
DateTime.fromMicrosecondsSinceEpoch(second.file.creationTime!);
return firstDate.year == secondDate.year;
}
}

View file

@ -1,6 +1,7 @@
import 'package:flutter/material.dart';
import "package:photos/core/error-reporting/super_logging.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/theme/ente_theme.dart';
import 'package:photos/ui/components/buttons/icon_button_widget.dart';
@ -94,6 +95,26 @@ class _AdvancedSettingsScreenState extends State<AdvancedSettingsScreen> {
const SizedBox(
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(
captionedTextWidget: CaptionedTextWidget(
title: S.of(context).manageDeviceStorage,