diff --git a/android/app/src/main/java/dev/dettmer/simplenotes/sync/WebDavSyncService.kt b/android/app/src/main/java/dev/dettmer/simplenotes/sync/WebDavSyncService.kt index 851db3b..9faebba 100644 --- a/android/app/src/main/java/dev/dettmer/simplenotes/sync/WebDavSyncService.kt +++ b/android/app/src/main/java/dev/dettmer/simplenotes/sync/WebDavSyncService.kt @@ -1055,6 +1055,10 @@ class WebDavSyncService(private val context: Context) { * Keine zusätzlichen HTTP-Requests! Nutzt die bereits geladene * serverNoteIds-Liste aus dem PROPFIND-Request. * + * Prüft ALLE Notizen (Notes + Checklists), da beide als + * JSON in /notes/{id}.json gespeichert werden. + * NoteType (NOTE vs CHECKLIST) spielt keine Rolle für die Detection. + * * @param serverNoteIds Set aller Note-IDs auf dem Server (aus PROPFIND) * @param localNotes Alle lokalen Notizen * @return Anzahl der als DELETED_ON_SERVER markierten Notizen @@ -1064,23 +1068,35 @@ class WebDavSyncService(private val context: Context) { localNotes: List ): Int { var deletedCount = 0 + val syncedNotes = localNotes.filter { it.syncStatus == SyncStatus.SYNCED } - localNotes.forEach { note -> + // 🆕 v1.8.0 (IMPL_022): Statistik-Log für Debugging + Logger.d(TAG, "🔍 detectServerDeletions: " + + "serverNotes=${serverNoteIds.size}, " + + "localSynced=${syncedNotes.size}, " + + "localTotal=${localNotes.size}") + + syncedNotes.forEach { note -> // Nur SYNCED-Notizen prüfen: // - LOCAL_ONLY: War nie auf Server → irrelevant // - PENDING: Soll hochgeladen werden → nicht überschreiben // - CONFLICT: Wird separat behandelt // - DELETED_ON_SERVER: Bereits markiert - if (note.syncStatus == SyncStatus.SYNCED && note.id !in serverNoteIds) { + if (note.id !in serverNoteIds) { val updatedNote = note.copy(syncStatus = SyncStatus.DELETED_ON_SERVER) storage.saveNote(updatedNote) deletedCount++ - Logger.d(TAG, "Note '${note.title}' (${note.id}) " + + Logger.d(TAG, "🗑️ Note '${note.title}' (${note.id}) " + "was deleted on server, marked as DELETED_ON_SERVER") } } + if (deletedCount > 0) { + Logger.d(TAG, "📊 Server deletion detection complete: " + + "$deletedCount of ${syncedNotes.size} synced notes deleted on server") + } + return deletedCount } diff --git a/android/app/src/main/java/dev/dettmer/simplenotes/ui/editor/NoteEditorViewModel.kt b/android/app/src/main/java/dev/dettmer/simplenotes/ui/editor/NoteEditorViewModel.kt index 3a67d67..93e4f2b 100644 --- a/android/app/src/main/java/dev/dettmer/simplenotes/ui/editor/NoteEditorViewModel.kt +++ b/android/app/src/main/java/dev/dettmer/simplenotes/ui/editor/NoteEditorViewModel.kt @@ -231,6 +231,8 @@ class NoteEditorViewModel( } val note = if (existingNote != null) { + // 🆕 v1.8.0 (IMPL_022): syncStatus wird immer auf PENDING gesetzt + // beim Bearbeiten - gilt für SYNCED, CONFLICT, DELETED_ON_SERVER, etc. existingNote!!.copy( title = title, content = content, @@ -272,6 +274,8 @@ class NoteEditorViewModel( } val note = if (existingNote != null) { + // 🆕 v1.8.0 (IMPL_022): syncStatus wird immer auf PENDING gesetzt + // beim Bearbeiten - gilt für SYNCED, CONFLICT, DELETED_ON_SERVER, etc. existingNote!!.copy( title = title, content = "", // Empty for checklists diff --git a/android/app/src/main/java/dev/dettmer/simplenotes/ui/main/MainViewModel.kt b/android/app/src/main/java/dev/dettmer/simplenotes/ui/main/MainViewModel.kt index 49a0899..940e46c 100644 --- a/android/app/src/main/java/dev/dettmer/simplenotes/ui/main/MainViewModel.kt +++ b/android/app/src/main/java/dev/dettmer/simplenotes/ui/main/MainViewModel.kt @@ -559,10 +559,18 @@ class MainViewModel(application: Application) : AndroidViewModel(application) { } if (result.isSuccess) { - val bannerMessage = if (result.syncedCount > 0) { - getString(R.string.toast_sync_success, result.syncedCount) - } else { - getString(R.string.snackbar_nothing_to_sync) + // 🆕 v1.8.0 (IMPL_022): Erweiterte Banner-Nachricht mit Löschungen + val bannerMessage = buildString { + if (result.syncedCount > 0) { + append(getString(R.string.toast_sync_success, result.syncedCount)) + } + if (result.deletedOnServerCount > 0) { + if (isNotEmpty()) append(" · ") + append(getString(R.string.sync_deleted_on_server_count, result.deletedOnServerCount)) + } + if (isEmpty()) { + append(getString(R.string.snackbar_nothing_to_sync)) + } } SyncStateManager.markCompleted(bannerMessage) loadNotes() diff --git a/android/app/src/main/res/values-de/strings.xml b/android/app/src/main/res/values-de/strings.xml index 9e99138..5fc2c87 100644 --- a/android/app/src/main/res/values-de/strings.xml +++ b/android/app/src/main/res/values-de/strings.xml @@ -73,6 +73,9 @@ Auf Server gelöscht Diese Notiz wurde auf einem anderen Gerät oder direkt auf dem Server gelöscht. Sie existiert noch lokal. + + %d auf Server gelöscht + diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml index 11b1a41..adc780b 100644 --- a/android/app/src/main/res/values/strings.xml +++ b/android/app/src/main/res/values/strings.xml @@ -80,6 +80,9 @@ Deleted on server This note was deleted on another device or directly on the server. It still exists locally. + + %d deleted on server +