From 9b460ca1dc44760aecad2bc43ffb4d2001c8fe94 Mon Sep 17 00:00:00 2001 From: laurenspriem Date: Fri, 16 May 2025 11:30:44 +0530 Subject: [PATCH] Init onThisDay method --- .../models/memories/on_this_day_memory.dart | 24 +++++++ mobile/lib/models/memories/smart_memory.dart | 3 + .../lib/services/smart_memories_service.dart | 64 +++++++++++++++++++ 3 files changed, 91 insertions(+) create mode 100644 mobile/lib/models/memories/on_this_day_memory.dart diff --git a/mobile/lib/models/memories/on_this_day_memory.dart b/mobile/lib/models/memories/on_this_day_memory.dart new file mode 100644 index 0000000000..cf69f6bad0 --- /dev/null +++ b/mobile/lib/models/memories/on_this_day_memory.dart @@ -0,0 +1,24 @@ +import "package:photos/generated/l10n.dart"; +import "package:photos/models/memories/memory.dart"; +import "package:photos/models/memories/smart_memory.dart"; + +class OnThisDayMemory extends SmartMemory { + OnThisDayMemory( + List memories, + int firstDateToShow, + int lastDateToShow, { + super.firstCreationTime, + super.lastCreationTime, + }) : super( + memories, + MemoryType.onThisDay, + '', + firstDateToShow, + lastDateToShow, + ); + + @override + String createTitle(S s, String languageCode) { + return "On this day"; + } +} diff --git a/mobile/lib/models/memories/smart_memory.dart b/mobile/lib/models/memories/smart_memory.dart index b05ff64959..74b666cf66 100644 --- a/mobile/lib/models/memories/smart_memory.dart +++ b/mobile/lib/models/memories/smart_memory.dart @@ -7,6 +7,7 @@ enum MemoryType { clip, time, filler, + onThisDay, } MemoryType memoryTypeFromString(String type) { @@ -21,6 +22,8 @@ MemoryType memoryTypeFromString(String type) { return MemoryType.filler; case "clip": return MemoryType.clip; + case "onThisDay": + return MemoryType.onThisDay; default: throw ArgumentError("Invalid memory type: $type"); } diff --git a/mobile/lib/services/smart_memories_service.dart b/mobile/lib/services/smart_memories_service.dart index 5b66526b36..94dd9431b3 100644 --- a/mobile/lib/services/smart_memories_service.dart +++ b/mobile/lib/services/smart_memories_service.dart @@ -21,6 +21,7 @@ import "package:photos/models/memories/clip_memory.dart"; import "package:photos/models/memories/filler_memory.dart"; import "package:photos/models/memories/memories_cache.dart"; import "package:photos/models/memories/memory.dart"; +import "package:photos/models/memories/on_this_day_memory.dart"; import "package:photos/models/memories/people_memory.dart"; import "package:photos/models/memories/smart_memory.dart"; import "package:photos/models/memories/smart_memory_constants.dart"; @@ -1542,6 +1543,69 @@ class SmartMemoriesService { return memoryResults; } + static Future> _getOnThisDayResults( + Iterable allFiles, + DateTime currentTime, { + required Map seenTimes, + }) async { + final List memoryResults = []; + if (allFiles.isEmpty) return []; + + final daysToCompute = kMemoriesUpdateFrequency.inDays + 1; + final currentYear = currentTime.year; + final currentMonth = currentTime.month; + final currentDay = currentTime.day; + final startPoint = DateTime(currentYear, currentMonth, currentDay); + final cutOffTime = startPoint + .subtract(const Duration(days: 363) - kMemoriesUpdateFrequency); + final diffThreshold = Duration(days: daysToCompute); + + final Map> daysToMemories = {}; + + final timeTillYearEnd = DateTime(currentYear + 1).difference(startPoint); + final bool almostYearEnd = timeTillYearEnd < diffThreshold; + + for (final file in allFiles) { + if (file.creationTime! > cutOffTime.microsecondsSinceEpoch) { + continue; + } + final fileDate = DateTime.fromMicrosecondsSinceEpoch(file.creationTime!); + final fileTimeInYear = fileDate.copyWith(year: currentYear); + final diff = fileTimeInYear.difference(startPoint); + if (!diff.isNegative && diff < diffThreshold) { + final yearsAgo = currentYear - fileDate.year; + daysToMemories + .putIfAbsent(diff.inDays, () => []) + .add(Memory.fromFile(file, seenTimes)); + } else if (almostYearEnd) { + final altDiff = fileDate.copyWith(year: currentYear + 1).difference( + currentTime, + ); + if (!altDiff.isNegative && altDiff < diffThreshold) { + final yearsAgo = currentYear - fileDate.year + 1; + daysToMemories + .putIfAbsent(altDiff.inDays, () => []) + .add(Memory.fromFile(file, seenTimes)); + } + } + } + for (var day = 0; day < daysToCompute; day++) { + final memories = daysToMemories[day]; + if (memories == null) continue; + if (memories.length < 10) continue; + memories.sort( + (a, b) => a.file.creationTime!.compareTo(b.file.creationTime!), + ); + final onThisDayMemory = OnThisDayMemory( + memories, + startPoint.add(Duration(days: day)).microsecondsSinceEpoch, + startPoint.add(Duration(days: day + 1)).microsecondsSinceEpoch, + ); + memoryResults.add(onThisDayMemory); + } + return memoryResults; + } + static Future getDateFormattedLocale({ required int creationTime, }) async {