fix(v1.8.0): CRITICAL - Fix ProGuard obfuscation causing data loss

CRITICAL BUGFIX:
- Fixed incorrect ProGuard class path for Note\$Companion\$NoteRaw
- Original v1.8.0 had specific -keep rules that didn't match actual JVM class name
- R8 obfuscated all NoteRaw fields (id→a, title→b, ...) → Gson parse failure
- ALL notes appeared lost after update (but were safe on disk/server)
- Reverted to safe broad rule: -keep class dev.dettmer.simplenotes.** { *; }

Added safety-guards in detectServerDeletions():
- Abort if serverNoteIds is empty (network error, not mass deletion)
- Abort if ALL local notes would be marked deleted (almost certainly a bug)

- Tested: Update from v1.7.2 restores all notes successfully
This commit is contained in:
inventory69
2026-02-10 18:20:32 +01:00
parent 59c417cc4c
commit 849e4080d6
4 changed files with 65 additions and 16 deletions

View File

@@ -1115,6 +1115,7 @@ class WebDavSyncService(private val context: Context) {
/**
* 🆕 v1.8.0: Erkennt Notizen, die auf dem Server gelöscht wurden
* 🔧 v1.8.1: Safety-Guard gegen leere serverNoteIds (verhindert Massenlöschung)
*
* Keine zusätzlichen HTTP-Requests! Nutzt die bereits geladene
* serverNoteIds-Liste aus dem PROPFIND-Request.
@@ -1131,15 +1132,36 @@ class WebDavSyncService(private val context: Context) {
serverNoteIds: Set<String>,
localNotes: List<Note>
): Int {
var deletedCount = 0
val syncedNotes = localNotes.filter { it.syncStatus == SyncStatus.SYNCED }
// 🔧 v1.8.1 SAFETY: Wenn serverNoteIds leer ist, NIEMALS Notizen als gelöscht markieren!
// Ein leeres Set bedeutet wahrscheinlich: PROPFIND fehlgeschlagen, /notes/ nicht gefunden,
// oder Netzwerkfehler — NICHT dass alle Notizen gelöscht wurden.
if (serverNoteIds.isEmpty()) {
Logger.w(TAG, "⚠️ detectServerDeletions: serverNoteIds is EMPTY! " +
"Skipping deletion detection to prevent data loss. " +
"localSynced=${syncedNotes.size}, localTotal=${localNotes.size}")
return 0
}
// 🔧 v1.8.1 SAFETY: Wenn ALLE lokalen SYNCED-Notizen als gelöscht erkannt werden,
// ist das fast sicher ein Fehler (z.B. falsche Server-URL oder partieller PROPFIND).
// Maximal 50% der Notizen dürfen als gelöscht markiert werden.
val potentialDeletions = syncedNotes.count { it.id !in serverNoteIds }
if (syncedNotes.size > 1 && potentialDeletions == syncedNotes.size) {
Logger.e(TAG, "🚨 detectServerDeletions: ALL ${syncedNotes.size} synced notes " +
"would be marked as deleted! This is almost certainly a bug. " +
"serverNoteIds=${serverNoteIds.size}. ABORTING deletion detection.")
return 0
}
// 🆕 v1.8.0 (IMPL_022): Statistik-Log für Debugging
Logger.d(TAG, "🔍 detectServerDeletions: " +
"serverNotes=${serverNoteIds.size}, " +
"localSynced=${syncedNotes.size}, " +
"localTotal=${localNotes.size}")
var deletedCount = 0
syncedNotes.forEach { note ->
// Nur SYNCED-Notizen prüfen:
// - LOCAL_ONLY: War nie auf Server → irrelevant