Merge branch 'main' into release/v1.8.1
This commit is contained in:
25
android/app/proguard-rules.pro
vendored
25
android/app/proguard-rules.pro
vendored
@@ -63,21 +63,16 @@
|
||||
# App-specific rules: Only keep what Gson/reflection needs
|
||||
# ═══════════════════════════════════════════════════════════════════════
|
||||
|
||||
# Gson data models (serialized/deserialized via reflection)
|
||||
-keep class dev.dettmer.simplenotes.models.Note { *; }
|
||||
-keep class dev.dettmer.simplenotes.models.Note$NoteRaw { *; }
|
||||
-keep class dev.dettmer.simplenotes.models.ChecklistItem { *; }
|
||||
-keep class dev.dettmer.simplenotes.models.DeletionRecord { *; }
|
||||
-keep class dev.dettmer.simplenotes.models.DeletionTracker { *; }
|
||||
-keep class dev.dettmer.simplenotes.backup.BackupData { *; }
|
||||
-keep class dev.dettmer.simplenotes.backup.BackupResult { *; }
|
||||
|
||||
# Keep enum values (used in serialization and widget state)
|
||||
-keepclassmembers enum dev.dettmer.simplenotes.** {
|
||||
<fields>;
|
||||
public static **[] values();
|
||||
public static ** valueOf(java.lang.String);
|
||||
}
|
||||
# 🔧 v1.8.1 FIX: Breite Regel verwenden statt spezifischer Klassen
|
||||
#
|
||||
# GRUND: NoteRaw ist eine private data class innerhalb von Note.Companion.
|
||||
# Der JVM-Klassenname ist Note$Companion$NoteRaw, NICHT Note$NoteRaw.
|
||||
# Die spezifische Regel griff nicht → R8 obfuskierte NoteRaw-Felder
|
||||
# → Gson konnte keine JSON-Felder matchen → ALLE Notizen unlesbar!
|
||||
#
|
||||
# Sichere Lösung: Alle App-Klassen behalten (wie in v1.7.2).
|
||||
# APK-Größenoptimierung kann in v1.9.0 sicher evaluiert werden.
|
||||
-keep class dev.dettmer.simplenotes.** { *; }
|
||||
|
||||
# v1.7.1: Suppress TextInclusionStrategy warnings on older Android versions
|
||||
# This class only exists on API 35+ but Compose handles the fallback gracefully
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user