From 9bebed506b08adcd8d792c01f45d544c303956a9 Mon Sep 17 00:00:00 2001 From: zarzet Date: Mon, 16 Mar 2026 22:35:17 +0700 Subject: [PATCH] fix: honor local library auto-scan cooldown --- lib/main.dart | 8 +++---- lib/providers/local_library_provider.dart | 13 ++++------ lib/utils/local_library_scan_prefs.dart | 29 +++++++++++++++++++++++ 3 files changed, 37 insertions(+), 13 deletions(-) create mode 100644 lib/utils/local_library_scan_prefs.dart diff --git a/lib/main.dart b/lib/main.dart index 7ead4a8..5ac51db 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -14,6 +14,7 @@ import 'package:spotiflac_android/providers/settings_provider.dart'; import 'package:spotiflac_android/services/notification_service.dart'; import 'package:spotiflac_android/services/share_intent_service.dart'; import 'package:spotiflac_android/services/cover_cache_manager.dart'; +import 'package:spotiflac_android/utils/local_library_scan_prefs.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); @@ -100,8 +101,6 @@ class _EagerInitializationState extends ConsumerState<_EagerInitialization> bool _localLibraryWarmupScheduled = false; bool _autoScanTriggeredOnLaunch = false; - static const _lastScannedAtKey = 'local_library_last_scanned_at'; - @override void initState() { super.initState(); @@ -200,10 +199,9 @@ class _EagerInitializationState extends ConsumerState<_EagerInitialization> // Determine cooldown based on auto-scan mode. final now = DateTime.now(); final prefs = await SharedPreferences.getInstance(); - final lastScannedMs = prefs.getInt(_lastScannedAtKey); + final lastScanned = readLocalLibraryLastScannedAt(prefs); - if (lastScannedMs != null) { - final lastScanned = DateTime.fromMillisecondsSinceEpoch(lastScannedMs); + if (lastScanned != null) { final elapsed = now.difference(lastScanned); switch (settings.localLibraryAutoScan) { diff --git a/lib/providers/local_library_provider.dart b/lib/providers/local_library_provider.dart index 78ac4f6..02fa69b 100644 --- a/lib/providers/local_library_provider.dart +++ b/lib/providers/local_library_provider.dart @@ -9,11 +9,11 @@ import 'package:spotiflac_android/services/library_database.dart'; import 'package:spotiflac_android/services/notification_service.dart'; import 'package:spotiflac_android/services/platform_bridge.dart'; import 'package:spotiflac_android/utils/logger.dart'; +import 'package:spotiflac_android/utils/local_library_scan_prefs.dart'; import 'package:spotiflac_android/utils/path_match_keys.dart'; final _log = AppLogger('LocalLibrary'); -const _lastScannedAtKey = 'local_library_last_scanned_at'; const _excludedDownloadedCountKey = 'local_library_excluded_downloaded_count'; final _prefs = SharedPreferences.getInstance(); @@ -165,10 +165,7 @@ class LocalLibraryNotifier extends Notifier { var excludedDownloadedCount = 0; try { final prefs = await prefsFuture; - final lastScannedAtStr = prefs.getString(_lastScannedAtKey); - if (lastScannedAtStr != null && lastScannedAtStr.isNotEmpty) { - lastScannedAt = DateTime.tryParse(lastScannedAtStr); - } + lastScannedAt = readLocalLibraryLastScannedAt(prefs); excludedDownloadedCount = prefs.getInt(_excludedDownloadedCountKey) ?? 0; } catch (e) { @@ -336,7 +333,7 @@ class LocalLibraryNotifier extends Notifier { final now = DateTime.now(); try { final prefs = await SharedPreferences.getInstance(); - await prefs.setString(_lastScannedAtKey, now.toIso8601String()); + await writeLocalLibraryLastScannedAt(prefs, now); await prefs.setInt(_excludedDownloadedCountKey, skippedDownloads); _log.d('Saved lastScannedAt: $now'); } catch (e) { @@ -500,7 +497,7 @@ class LocalLibraryNotifier extends Notifier { final now = DateTime.now(); try { final prefs = await SharedPreferences.getInstance(); - await prefs.setString(_lastScannedAtKey, now.toIso8601String()); + await writeLocalLibraryLastScannedAt(prefs, now); await prefs.setInt(_excludedDownloadedCountKey, skippedDownloads); _log.d('Saved lastScannedAt: $now'); } catch (e) { @@ -818,7 +815,7 @@ class LocalLibraryNotifier extends Notifier { try { final prefs = await SharedPreferences.getInstance(); - await prefs.remove(_lastScannedAtKey); + await clearLocalLibraryLastScannedAt(prefs); await prefs.remove(_excludedDownloadedCountKey); } catch (e) { _log.w('Failed to clear lastScannedAt: $e'); diff --git a/lib/utils/local_library_scan_prefs.dart b/lib/utils/local_library_scan_prefs.dart new file mode 100644 index 0000000..1d544f8 --- /dev/null +++ b/lib/utils/local_library_scan_prefs.dart @@ -0,0 +1,29 @@ +import 'package:shared_preferences/shared_preferences.dart'; + +const localLibraryLastScannedAtKey = 'local_library_last_scanned_at'; + +DateTime? readLocalLibraryLastScannedAt(SharedPreferences prefs) { + final lastScannedAtStr = prefs.getString(localLibraryLastScannedAtKey); + if (lastScannedAtStr != null && lastScannedAtStr.isNotEmpty) { + return DateTime.tryParse(lastScannedAtStr); + } + + // Backward compatibility for older builds that may have stored epoch millis. + final lastScannedAtMs = prefs.getInt(localLibraryLastScannedAtKey); + if (lastScannedAtMs != null) { + return DateTime.fromMillisecondsSinceEpoch(lastScannedAtMs); + } + + return null; +} + +Future writeLocalLibraryLastScannedAt( + SharedPreferences prefs, + DateTime value, +) { + return prefs.setString(localLibraryLastScannedAtKey, value.toIso8601String()); +} + +Future clearLocalLibraryLastScannedAt(SharedPreferences prefs) { + return prefs.remove(localLibraryLastScannedAtKey); +}