Skip to content

Commit 17ece3c

Browse files
committed
release(v2.4.0): merge v2.4.0 into main
2 parents 41ecb13 + 71de821 commit 17ece3c

16 files changed

Lines changed: 789 additions & 149 deletions

File tree

β€ŽCHANGELOG.de.mdβ€Ž

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,81 @@ Das Format basiert auf [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
88

99
---
1010

11+
## [2.4.0] - 2026-05-04
12+
13+
### ✨ Neue Features
14+
15+
**Persistentes Sync-Debug-Log** ([1de5fdb](https://github.com/inventory69/simple-notes-sync/commit/1de5fdb), [1234f6c](https://github.com/inventory69/simple-notes-sync/commit/1234f6c), [d8d4284](https://github.com/inventory69/simple-notes-sync/commit/d8d4284), [13defa9](https://github.com/inventory69/simple-notes-sync/commit/13defa9), [62e75e7](https://github.com/inventory69/simple-notes-sync/commit/62e75e7))
16+
- Neuer persistenter `SyncDebugLogger`, der strukturierte EintrΓ€ge in `sync_debug.log` schreibt β€” hilft beim Diagnostizieren von Hintergrund-Sync-Problemen
17+
- Loggt jedes `SyncWorker`-Ergebnis (Start, Erfolg, Soft-Fehler, Retry, finales Scheitern)
18+
- Schema um `attempt`-ZΓ€hler und `holder` (Prozess-Tag) erweitert, um App-/Worker-Kontexte zu unterscheiden
19+
- WIFI_CONNECT-Events mit `first|change`-Grund annotiert
20+
- Expliziter finaler Status, wenn WorkManager Retries verwirft β€” keine unsichtbaren Fehler mehr
21+
- **StandardmÀßig deaktiviert** ([26cdf47](https://github.com/inventory69/simple-notes-sync/commit/26cdf47)) β€” in den Einstellungen β†’ Debug aktivierbar, um beim Melden von Sync-Problemen Logs zu sammeln
22+
23+
**Cold-Start-Guard nach langer Prozess-Pause ΓΌberspringen** ([17d57d5](https://github.com/inventory69/simple-notes-sync/commit/17d57d5))
24+
- Nach lΓ€ngerer InaktivitΓ€t (z. B. ΓΌber Nacht) wird der Cold-Start-Sync-Guard ΓΌbersprungen, damit der erste Sync sofort beim Resume lΓ€uft
25+
26+
### πŸ› Fehlerbehebungen
27+
28+
**ZuverlΓ€ssiger WiFi-Connect-Sync-Trigger**
29+
- Validiertes WiFi (nicht nur SSID) erforderlich, bevor Sync ausgelΓΆst wird ([a03eadf](https://github.com/inventory69/simple-notes-sync/commit/a03eadf))
30+
- WiFi-Trigger-Sync wird bei vorΓΌbergehender Nicht-Erreichbarkeit erneut versucht ([bea0558](https://github.com/inventory69/simple-notes-sync/commit/bea0558))
31+
- Globaler Cooldown wird fΓΌr WiFi-Connect-Trigger umgangen β€” der erste Sync nach Reconnect lΓ€uft tatsΓ€chlich ([5195ee0](https://github.com/inventory69/simple-notes-sync/commit/5195ee0))
32+
- WiFi-Trigger-Backoff bei 30 s linear gedeckelt, um ausufernde VerzΓΆgerungen zu vermeiden ([5ff2a70](https://github.com/inventory69/simple-notes-sync/commit/5ff2a70))
33+
- WiFi-Fallback-Intervall auf 30 min verkΓΌrzt fΓΌr schnellere Process-Death-Recovery ([42e6a64](https://github.com/inventory69/simple-notes-sync/commit/42e6a64))
34+
35+
**GΓΌnstigere, robustere Erreichbarkeits-PrΓΌfung**
36+
- GΓΌnstiger Reachability-Check vor teurem PROPFIND ([f46f326](https://github.com/inventory69/simple-notes-sync/commit/f46f326))
37+
- `monitoringStartTime` als volatile markiert und auf `elapsedRealtime()` umgestellt β€” vermeidet Wall-Clock-Drift ([7f980fb](https://github.com/inventory69/simple-notes-sync/commit/7f980fb))
38+
- Redundanten onResume-Sync-Cooldown entfernt ([69a7b05](https://github.com/inventory69/simple-notes-sync/commit/69a7b05))
39+
40+
**Einstellungen & Logging**
41+
- Debug-Log-Export auf allen GerΓ€ten robust (SAF-Edge-Cases behandelt) ([bbf466b](https://github.com/inventory69/simple-notes-sync/commit/bbf466b))
42+
- Der β€žLogs lΓΆschen"-Button lΓΆscht jetzt auch `sync_debug.log` ([caa329e](https://github.com/inventory69/simple-notes-sync/commit/caa329e))
43+
44+
### ♻️ Intern
45+
46+
**WebDAV-Server-Migration** ([41ecb13](https://github.com/inventory69/simple-notes-sync/commit/41ecb13))
47+
- Self-hosted Referenz-Server von `bytemark/webdav` auf `hacdias/webdav` migriert β€” aktive Wartung und bessere Protokoll-Abdeckung
48+
- Keine Auswirkungen fΓΌr App-Nutzer; betrifft nur den optionalen mitgelieferten Server in `server/`
49+
50+
### 🌍 Übersetzungen
51+
52+
- **Neue Sprache: Indonesisch (`in`)** β€” danke an [Arif Budiman](https://hosted.weblate.org/user/aribudiman/) ([c537455](https://github.com/inventory69/simple-notes-sync/commit/c537455), [6bc7a4e](https://github.com/inventory69/simple-notes-sync/commit/6bc7a4e))
53+
- **Neue Sprache: Norwegisch BokmΓ₯l (`nb`)** β€” danke an [xdpirate](https://hosted.weblate.org/user/xdpirate/) ([3ce9164](https://github.com/inventory69/simple-notes-sync/commit/3ce9164), [d11b34d](https://github.com/inventory69/simple-notes-sync/commit/d11b34d))
54+
- **Neue Sprache: Italienisch (`it`)** β€” danke an [Jean-Pierre](https://hosted.weblate.org/user/Jeannot/) ([3467756](https://github.com/inventory69/simple-notes-sync/commit/3467756), [4bf449c](https://github.com/inventory69/simple-notes-sync/commit/4bf449c))
55+
- **Neue Sprache: Hindi (`hi`)** β€” danke an [Silent Coder](https://hosted.weblate.org/user/silentcoder/) ([2c54735](https://github.com/inventory69/simple-notes-sync/commit/2c54735), [9ba64fd](https://github.com/inventory69/simple-notes-sync/commit/9ba64fd), [ecfb129](https://github.com/inventory69/simple-notes-sync/commit/ecfb129))
56+
- **Neue Sprache: Russisch (`ru`)** β€” danke an [PONYATIN](https://hosted.weblate.org/user/PONYATIN/) ([4078a59](https://github.com/inventory69/simple-notes-sync/commit/4078a59), [f96055e](https://github.com/inventory69/simple-notes-sync/commit/f96055e), [1eeebc1](https://github.com/inventory69/simple-notes-sync/commit/1eeebc1))
57+
- **Chinesisch (Vereinfacht) aktualisiert** β€” danke an [heretic43](https://hosted.weblate.org/user/heretic43/) ([7a2defb](https://github.com/inventory69/simple-notes-sync/commit/7a2defb))
58+
- Neue Locales `in` und `nb` in `locales_config.xml` registriert ([349e972](https://github.com/inventory69/simple-notes-sync/commit/349e972)); `ru`, `it`, `hi` in [84a5282](https://github.com/inventory69/simple-notes-sync/commit/84a5282)
59+
60+
### πŸ™ Danksagungen
61+
62+
Ein riesiges Dankeschân an die Weblate-Übersetzer, die Simple Notes Sync in immer mehr Sprachen verfügbar machen:
63+
- **Arif Budiman** β€” Indonesisch
64+
- **xdpirate** β€” Norwegisch BokmΓ₯l
65+
- **Jean-Pierre** β€” Italienisch
66+
- **Silent Coder** β€” Hindi
67+
- **PONYATIN** β€” Russisch
68+
- **heretic43** β€” Chinesisch (Vereinfacht)
69+
70+
---
71+
72+
## [2.3.1] - 2026-04-24
73+
74+
> Nur als Beta-Release im Google Play verΓΆffentlicht. Nicht auf F-Droid erschienen; die Γ„nderungen sind in v2.4.0 enthalten.
75+
76+
### πŸ› Fehlerbehebungen
77+
78+
**Sichtbarkeits-bewusster Fehler-Banner bei Soft-Sync-Fehlern** ([c4a40f8](https://github.com/inventory69/simple-notes-sync/commit/c4a40f8))
79+
- Stille Hintergrund-Sync-Fehler erscheinen nicht mehr als roter Fehler-Banner β€” sie setzen sauber zu IDLE zurΓΌck
80+
- Fehler werden nur dann zu einem sichtbaren Banner, wenn der Nutzer die App tatsΓ€chlich aktiv ansieht
81+
- Neue `SyncStateManager.errorIfVisible()`-API wird von `SyncWorker` und `MainViewModel.triggerAutoSync` fΓΌr alle Soft-Fehler-Pfade verwendet
82+
- Verhindert verwirrende kurzzeitige Warnungen bei Hintergrund-Retries
83+
84+
---
85+
1186
## [2.3.0] - 2026-04-18
1287

1388
### πŸ›‘οΈ Sicherheit

β€ŽCHANGELOG.mdβ€Ž

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,81 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
88

99
---
1010

11+
## [2.4.0] - 2026-05-04
12+
13+
### ✨ New Features
14+
15+
**Persistent Sync Debug Logger** ([1de5fdb](https://github.com/inventory69/simple-notes-sync/commit/1de5fdb), [1234f6c](https://github.com/inventory69/simple-notes-sync/commit/1234f6c), [d8d4284](https://github.com/inventory69/simple-notes-sync/commit/d8d4284), [13defa9](https://github.com/inventory69/simple-notes-sync/commit/13defa9), [62e75e7](https://github.com/inventory69/simple-notes-sync/commit/62e75e7))
16+
- New persistent `SyncDebugLogger` writing structured entries to `sync_debug.log` for diagnosing background-sync issues
17+
- Logs every `SyncWorker` outcome (start, success, soft errors, retries, final failure)
18+
- Schema enriched with `attempt` counter and `holder` (process tag) to distinguish app/worker contexts
19+
- WIFI_CONNECT events annotated with `first|change` reason for clarity
20+
- Explicit final outcome emitted when WorkManager drops retries, so failures aren't invisible
21+
- **Disabled by default** ([26cdf47](https://github.com/inventory69/simple-notes-sync/commit/26cdf47)) β€” enable in Settings β†’ Debug to collect logs when reporting sync issues
22+
23+
**Bypass Cold-Start Guard After Long Process Gap** ([17d57d5](https://github.com/inventory69/simple-notes-sync/commit/17d57d5))
24+
- After a long period without app process activity (e.g. overnight), the cold-start sync guard is bypassed so the first sync runs immediately on resume
25+
26+
### πŸ› Bug Fixes
27+
28+
**Reliable WiFi-Connect Sync Trigger**
29+
- Require validated WiFi (not just SSID) before triggering sync ([a03eadf](https://github.com/inventory69/simple-notes-sync/commit/a03eadf))
30+
- Retry WiFi-trigger sync on transient unreachability ([bea0558](https://github.com/inventory69/simple-notes-sync/commit/bea0558))
31+
- Bypass global cooldown for WiFi-connect trigger so the first sync after reconnect actually runs ([5195ee0](https://github.com/inventory69/simple-notes-sync/commit/5195ee0))
32+
- Cap WiFi-trigger backoff at 30 s linear to avoid runaway delays ([5ff2a70](https://github.com/inventory69/simple-notes-sync/commit/5ff2a70))
33+
- Shorten WiFi-fallback interval to 30 min for faster process-death recovery ([42e6a64](https://github.com/inventory69/simple-notes-sync/commit/42e6a64))
34+
35+
**Cheaper, More Robust Reachability**
36+
- Cheap reachability check before expensive PROPFIND ([f46f326](https://github.com/inventory69/simple-notes-sync/commit/f46f326))
37+
- `monitoringStartTime` made volatile and switched to `elapsedRealtime()` to avoid wall-clock skew ([7f980fb](https://github.com/inventory69/simple-notes-sync/commit/7f980fb))
38+
- Drop redundant onResume sync cooldown ([69a7b05](https://github.com/inventory69/simple-notes-sync/commit/69a7b05))
39+
40+
**Settings & Logging**
41+
- Make debug-log export robust on all devices (handles SAF edge cases) ([bbf466b](https://github.com/inventory69/simple-notes-sync/commit/bbf466b))
42+
- Clear `sync_debug.log` on the Delete-Logs button so users can reset the log easily ([caa329e](https://github.com/inventory69/simple-notes-sync/commit/caa329e))
43+
44+
### ♻️ Internal
45+
46+
**WebDAV Server Migration** ([41ecb13](https://github.com/inventory69/simple-notes-sync/commit/41ecb13))
47+
- Self-hosted reference server migrated from `bytemark/webdav` to `hacdias/webdav` for active maintenance and better protocol coverage
48+
- No user-visible change for app users; affects the optional bundled server in `server/`
49+
50+
### 🌍 Translations
51+
52+
- **New language: Indonesian (`in`)** β€” thanks to [Arif Budiman](https://hosted.weblate.org/user/aribudiman/) ([c537455](https://github.com/inventory69/simple-notes-sync/commit/c537455), [6bc7a4e](https://github.com/inventory69/simple-notes-sync/commit/6bc7a4e))
53+
- **New language: Norwegian BokmΓ₯l (`nb`)** β€” thanks to [xdpirate](https://hosted.weblate.org/user/xdpirate/) ([3ce9164](https://github.com/inventory69/simple-notes-sync/commit/3ce9164), [d11b34d](https://github.com/inventory69/simple-notes-sync/commit/d11b34d))
54+
- **New language: Italian (`it`)** β€” thanks to [Jean-Pierre](https://hosted.weblate.org/user/Jeannot/) ([3467756](https://github.com/inventory69/simple-notes-sync/commit/3467756), [4bf449c](https://github.com/inventory69/simple-notes-sync/commit/4bf449c))
55+
- **New language: Hindi (`hi`)** β€” thanks to [Silent Coder](https://hosted.weblate.org/user/silentcoder/) ([2c54735](https://github.com/inventory69/simple-notes-sync/commit/2c54735), [9ba64fd](https://github.com/inventory69/simple-notes-sync/commit/9ba64fd), [ecfb129](https://github.com/inventory69/simple-notes-sync/commit/ecfb129))
56+
- **New language: Russian (`ru`)** β€” thanks to [PONYATIN](https://hosted.weblate.org/user/PONYATIN/) ([4078a59](https://github.com/inventory69/simple-notes-sync/commit/4078a59), [f96055e](https://github.com/inventory69/simple-notes-sync/commit/f96055e), [1eeebc1](https://github.com/inventory69/simple-notes-sync/commit/1eeebc1))
57+
- **Chinese (Simplified) updated** β€” thanks to [heretic43](https://hosted.weblate.org/user/heretic43/) ([7a2defb](https://github.com/inventory69/simple-notes-sync/commit/7a2defb))
58+
- New locales `in` and `nb` registered in `locales_config.xml` ([349e972](https://github.com/inventory69/simple-notes-sync/commit/349e972)); `ru`, `it`, `hi` registered in [84a5282](https://github.com/inventory69/simple-notes-sync/commit/84a5282)
59+
60+
### πŸ™ Acknowledgements
61+
62+
A huge thank you to the Weblate translators making Simple Notes Sync available in more languages:
63+
- **Arif Budiman** β€” Indonesian
64+
- **xdpirate** β€” Norwegian BokmΓ₯l
65+
- **Jean-Pierre** β€” Italian
66+
- **Silent Coder** β€” Hindi
67+
- **PONYATIN** β€” Russian
68+
- **heretic43** β€” Chinese (Simplified)
69+
70+
---
71+
72+
## [2.3.1] - 2026-04-24
73+
74+
> Beta-only release on Google Play. Not published on F-Droid; the changes are included in v2.4.0.
75+
76+
### πŸ› Bug Fixes
77+
78+
**Visibility-Aware Error Banner on Soft Sync Errors** ([c4a40f8](https://github.com/inventory69/simple-notes-sync/commit/c4a40f8))
79+
- Silent background sync errors no longer surface as a red error banner β€” they reset cleanly to IDLE
80+
- Errors are only promoted to a visible banner when the user is actively viewing the app
81+
- New `SyncStateManager.errorIfVisible()` API used by `SyncWorker` and `MainViewModel.triggerAutoSync` for all soft-error paths
82+
- Prevents user-confusing transient warnings during background retries
83+
84+
---
85+
1186
## [2.3.0] - 2026-04-18
1287

1388
### πŸ›‘οΈ Security

β€Žandroid/app/build.gradle.ktsβ€Ž

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,14 @@ android {
2020
applicationId = "dev.dettmer.simplenotes"
2121
minSdk = 24
2222
targetSdk = 36
23-
versionCode = 31 // πŸ†• v2.3.1
24-
versionName = "2.3.1" // πŸ†• v2.3.1
23+
versionCode = 32 // πŸ†• v2.4.0 - Sync Reliability
24+
versionName = "2.4.0" // πŸ†• v2.4.0 - Sync Reliability
2525

2626
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
27+
// πŸ†• v2.4.0: Diagnostic phase finished (long-run log validated all v2.4.0 fixes).
28+
// Default to OFF so new installs/updates don't write sync_debug.log unless the
29+
// user explicitly enables it via Debug & Diagnose settings.
30+
buildConfigField("boolean", "SYNC_DEBUG_LOGGING_DEFAULT", "false")
2731
}
2832

2933
// Disable Google dependency metadata for F-Droid/IzzyOnDroid compatibility

β€Žandroid/app/src/main/java/dev/dettmer/simplenotes/SimpleNotesApplication.ktβ€Ž

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import dev.dettmer.simplenotes.utils.CredentialStore
1111
import dev.dettmer.simplenotes.utils.Logger
1212
import dev.dettmer.simplenotes.utils.NoteCorruptionRepair
1313
import dev.dettmer.simplenotes.utils.NotificationHelper
14+
import dev.dettmer.simplenotes.utils.SyncDebugLogger
1415
import kotlinx.coroutines.CoroutineScope
1516
import kotlinx.coroutines.Dispatchers
1617
import kotlinx.coroutines.SupervisorJob
@@ -57,6 +58,9 @@ class SimpleNotesApplication : Application() {
5758
Logger.d(TAG, "πŸ“ File logging enabled at Application startup")
5859
}
5960

61+
// πŸ†• v2.2.0: Persistent sync debug logger
62+
SyncDebugLogger.init(this)
63+
6064
Logger.d(TAG, "πŸš€ Application onCreate()")
6165

6266
// Initialize notification channel

0 commit comments

Comments
Β (0)