diff --git a/app/src/main/kotlin/com/syncflow/worker/FileWatchService.kt b/app/src/main/kotlin/com/syncflow/worker/FileWatchService.kt
index ef73b15..5ee01fc 100644
--- a/app/src/main/kotlin/com/syncflow/worker/FileWatchService.kt
+++ b/app/src/main/kotlin/com/syncflow/worker/FileWatchService.kt
@@ -149,6 +149,9 @@ class FileWatchService : Service() {
return
}
fileObservers[pairId] = mutableListOf()
+ // Set startup cooldown BEFORE registering watchers so inotify events that fire
+ // immediately on registration don't trigger the debounce before catchupScan runs.
+ syncCooldownUntil[pairId] = System.currentTimeMillis() + 15_000
watchDirRecursive(dir, pairId, wifiOnly, chargingOnly)
Timber.d("FileWatchService: watching pair $pairId at $path (${fileObservers[pairId]?.size} dirs)")
scope.launch { catchupScan(pairId, dir, wifiOnly, chargingOnly) }
@@ -207,7 +210,10 @@ class FileWatchService : Service() {
if (hasNew || hasModified || hasDeleted) {
Timber.d("FileWatchService: catchup detected changes for pair $pairId, scheduling sync")
val pair = syncPairDao.getById(pairId) ?: return
- // Set cooldown so file writes during this sync don't immediately re-trigger
+ // Cancel any debounce that started before our startup cooldown was set
+ debounceJobs[pairId]?.cancel()
+ debounceJobs.remove(pairId)
+ // Hold cooldown for duration of sync + 60s settle
syncCooldownUntil[pairId] = System.currentTimeMillis() + 120_000
val req = SyncWorker.buildOneTimeRequest(pairId, wifiOnly, chargingOnly)
WorkManager.getInstance(applicationContext)
@@ -238,6 +244,12 @@ class FileWatchService : Service() {
debounceJobs[pairId]?.cancel()
debounceJobs[pairId] = scope.launch {
delay(5_000)
+ // Re-check: catchupScan or another path may have already set a cooldown
+ // and handled this sync while we were waiting.
+ if (System.currentTimeMillis() < (syncCooldownUntil[pairId] ?: 0L)) {
+ Timber.d("FileWatchService: debounce fired but cooldown active for pair $pairId, skipping")
+ return@launch
+ }
val pair = syncPairDao.getById(pairId)
if (pair == null || !pair.isEnabled) return@launch
Timber.d("FileWatchService: triggering sync for pair $pairId after debounce")
diff --git a/app/src/main/res/drawable/ic_launcher_foreground.xml b/app/src/main/res/drawable/ic_launcher_foreground.xml
index 8124678..88e597b 100644
--- a/app/src/main/res/drawable/ic_launcher_foreground.xml
+++ b/app/src/main/res/drawable/ic_launcher_foreground.xml
@@ -6,71 +6,79 @@
android:viewportHeight="108">
-
+
+ android:pathData="M 54,36 A 18,18 0 1,1 45,70"/>
-
-
-
-
+
+ android:pathData="M 54,72 A 18,18 0 1,1 63,38"/>
-
+
+
+
+
+ android:pathData="M 36,54 A 18,18 0 1,1 69,63"/>
-
+
+
+
+
+ android:pathData="M 45,54 A 9,9 0 1,0 63,54 A 9,9 0 1,0 45,54 Z"/>
-
+
+ android:pathData="M 46.5,54 A 7.5,7.5 0 1,0 61.5,54 A 7.5,7.5 0 1,0 46.5,54 Z"/>
-
+
+ android:pathData="M 54,46.5 L 57,50.5 L 51,50.5 Z"/>
-
+
+ android:pathData="M 54,61.5 L 51,57.5 L 57,57.5 Z"/>
diff --git a/version.properties b/version.properties
index 1acd08d..581ccc6 100644
--- a/version.properties
+++ b/version.properties
@@ -1,2 +1,2 @@
-VERSION_NAME=1.0.30
-VERSION_CODE=31
+VERSION_NAME=1.0.31
+VERSION_CODE=32