refactor(memory-home-widget): streamline memory update logic and improve synchronization handling

This commit is contained in:
Prateek Sunal
2025-03-20 18:26:25 +05:30
parent 9327238d19
commit ca7ff8cd16
5 changed files with 57 additions and 29 deletions

View File

@@ -66,8 +66,7 @@ class _EnteAppState extends State<EnteApp> with WidgetsBindingObserver {
_memoriesChangedSubscription =
Bus.instance.on<MemoriesChangedEvent>().listen(
(event) async {
await MemoryHomeWidgetService.instance.updateMemoryChanged(true);
await MemoryHomeWidgetService.instance.initMemoryHW(true);
await MemoryHomeWidgetService.instance.memoryChanged();
},
);
}

View File

@@ -370,6 +370,10 @@ class MemoriesCacheService {
}
}
Future<List<SmartMemory>?> getCachedMemories() async {
return _cachedMemories;
}
Future<void> goToMemoryFromGeneratedFileID(
BuildContext context,
int generatedFileID,

View File

@@ -5,6 +5,7 @@ import "package:photos/models/file/file.dart";
import "package:photos/service_locator.dart";
import "package:photos/services/home_widget_service.dart";
import "package:shared_preferences/shared_preferences.dart";
import "package:synchronized/synchronized.dart";
class MemoryHomeWidgetService {
final Logger _logger = Logger((MemoryHomeWidgetService).toString());
@@ -16,6 +17,7 @@ class MemoryHomeWidgetService {
late final SharedPreferences _prefs;
final _memoryForceRefreshLock = Lock();
bool _hasSyncedMemory = false;
static const memoryChangedKey = "memoryChanged.widget";
@@ -31,14 +33,6 @@ class MemoryHomeWidgetService {
}
Future<void> _memorySync() async {
final total = await _getTotal();
if (total == 0 || total == null) {
_logger.warning(
"sync stopped because no memory is cached yet, so nothing to sync",
);
return;
}
final homeWidgetCount = await HomeWidgetService.instance.countHomeWidgets();
if (homeWidgetCount == 0) {
_logger.warning("no home widget active");
@@ -57,13 +51,20 @@ class MemoryHomeWidgetService {
return;
}
forceFetchNewMemories ??= await getForceFetchCondition();
await _memoryForceRefreshLock.synchronized(() async {
final isTotalEmpty = await checkIfTotalEmpty();
forceFetchNewMemories ??= await getForceFetchCondition(isTotalEmpty);
if (forceFetchNewMemories) {
await _forceMemoryUpdate();
} else {
await _memorySync();
}
_logger.warning(
"init memory hw: forceFetch: $forceFetchNewMemories, isTotalEmpty: $isTotalEmpty",
);
if (forceFetchNewMemories!) {
await _forceMemoryUpdate();
} else if (!isTotalEmpty) {
await _memorySync();
}
});
}
Future<void> clearWidget() async {
@@ -84,19 +85,27 @@ class MemoryHomeWidgetService {
await _prefs.setBool(memoryChangedKey, value);
}
Future<bool> getForceFetchCondition() async {
final memoryChanged = _prefs.getBool(memoryChangedKey);
Future<bool> checkIfTotalEmpty() async {
final total = await _getTotal();
return total == 0 || total == null;
}
Future<bool> getForceFetchCondition(bool isTotalEmpty) async {
final memoryChanged = _prefs.getBool(memoryChangedKey);
if (memoryChanged == true) return true;
final cachedMemories = await memoriesCacheService.getCachedMemories();
final forceFetchNewMemories =
memoryChanged == true || total == 0 || total == null;
isTotalEmpty && (cachedMemories?.isNotEmpty ?? false);
return forceFetchNewMemories;
}
Future<void> checkPendingMemorySync() async {
await Future.delayed(const Duration(seconds: 5), () {});
final forceFetchNewMemories = await getForceFetchCondition();
final isTotalEmpty = await checkIfTotalEmpty();
final forceFetchNewMemories = await getForceFetchCondition(isTotalEmpty);
if (_hasSyncedMemory && !forceFetchNewMemories) {
_logger.info(">>> Memory already synced");
@@ -141,6 +150,22 @@ class MemoryHomeWidgetService {
_logger.info(">>> Home Widget updated");
}
Future<void> memoryChanged() async {
final cachedMemories = await memoriesCacheService.getCachedMemories();
final currentTotal = cachedMemories?.length ?? 0;
final int total = await _getTotal() ?? 0;
if (total == currentTotal && total == 0) {
_logger.info(">>> Memories not changed, doing nothing");
return;
}
_logger.info(">>> Memories changed, updating widget");
await updateMemoryChanged(true);
await initMemoryHW(true);
}
Future<int?> _getTotal() async {
return HomeWidgetService.instance.getData<int>(totalSet);
}

View File

@@ -124,7 +124,9 @@ class _HomeWidgetState extends State<HomeWidget> {
_logger.info("Building initstate");
super.initState();
MemoryHomeWidgetService.instance.checkPendingMemorySync();
if (LocalSyncService.instance.hasCompletedFirstImport()) {
MemoryHomeWidgetService.instance.checkPendingMemorySync();
}
_tabChangedEventSubscription =
Bus.instance.on<TabChangedEvent>().listen((event) {
_selectedTabIndex = event.selectedIndex;
@@ -184,13 +186,11 @@ class _HomeWidgetState extends State<HomeWidget> {
}
Future.delayed(
delayInRefresh,
() => {
if (mounted)
{
setState(
() {},
),
},
() {
if (mounted) {
setState(() {});
MemoryHomeWidgetService.instance.checkPendingMemorySync();
}
},
);
}

View File

@@ -189,7 +189,7 @@ dependencies:
styled_text: ^8.1.0
syncfusion_flutter_core: ^25.2.5
syncfusion_flutter_sliders: ^25.2.5
synchronized: ^3.1.0
synchronized: ^3.3.0+3
system_info_plus: ^0.0.6
tuple: ^2.0.0
ua_client_hints: ^1.4.0