@@ -8,6 +8,136 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
88
99---
1010
11+ ## [ 1.8.2] - 2026-02-16
12+
13+ ### 🔧 Stability, Editor & Widget Improvements
14+
15+ Major stability release fixing 26 issues — sync deadlocks, data loss prevention, SSL certificates, markdown sync loop, silent download failures, editor UX improvements, widget polish, and APK size optimization.
16+
17+ ### 🐛 Bug Fixes
18+
19+ ** Sync Stuck in "Already in Progress"** * (IMPL_01)* ([ a62ab78] ( https://github.com/inventory69/simple-notes-sync/commit/a62ab78 ) )
20+ - Fixed 5 code paths in SyncWorker where ` tryStartSync() ` was called but state was never reset
21+ - Early returns (no changes, gate blocked, server unreachable) now call ` SyncStateManager.reset() `
22+ - CancellationException handler now resets state instead of leaving it in SYNCING
23+ - Generic Exception handler now calls ` markError() ` to properly transition state
24+ - Root cause: SyncStateManager stayed in SYNCING state permanently, blocking all future syncs
25+
26+ ** Self-Signed SSL Certificates in Release Builds** * (IMPL_02)* ([ b3f4915] ( https://github.com/inventory69/simple-notes-sync/commit/b3f4915 ) )
27+ - Added ` <certificates src="user" /> ` to network security base config
28+ - User-installed CA certificates now work in release builds (previously debug-only)
29+ - Required for self-hosted WebDAV servers with self-signed SSL certificates
30+
31+ ** Text Notes Not Scrollable in Medium Widgets** * (IMPL_04)* ([ 8429306] ( https://github.com/inventory69/simple-notes-sync/commit/8429306 ) )
32+ - Changed NARROW_MED and WIDE_MED widget size classes to use ` TextNoteFullView ` (scrollable)
33+ - Previously used ` TextNotePreview ` which was truncated and non-scrollable
34+ - 2x1 and 4x1 widgets now show scrollable text content
35+ - Removed unused ` TextNotePreview ` function and related constants
36+
37+ ** Keyboard Auto-Capitalization** * (IMPL_05)* ([ d93b439] ( https://github.com/inventory69/simple-notes-sync/commit/d93b439 ) )
38+ - Title field now uses ` KeyboardCapitalization.Words `
39+ - Content field now uses ` KeyboardCapitalization.Sentences `
40+ - Checklist items now use ` KeyboardCapitalization.Sentences `
41+
42+ ** Documentation: Sort Option Naming** * (IMPL_06)* ([ 465bd9c] ( https://github.com/inventory69/simple-notes-sync/commit/465bd9c ) )
43+ - Changed "color"/"Farbe" to "type"/"Typ" in README files
44+ - Updated F-Droid metadata descriptions (de-DE and en-US)
45+
46+ ** Keyboard Auto-Scroll for Text Notes** * (IMPL_07)* ([ bc266b9] ( https://github.com/inventory69/simple-notes-sync/commit/bc266b9 ) )
47+ - Migrated TextNoteContent from ` TextFieldValue ` API to ` TextFieldState ` API
48+ - Added external ` scrollState ` parameter to ` OutlinedTextField `
49+ - Auto-scrolls to cursor position when keyboard opens
50+
51+ ** Checklist Scroll Jump When Typing** * (IMPL_10)* ([ 974ef13] ( https://github.com/inventory69/simple-notes-sync/commit/974ef13 ) )
52+ - Replaced faulty auto-scroll logic from v1.8.1 with viewport-aware scroll
53+ - Only scrolls if item actually extends below viewport
54+
55+ ** Checklist Visual Glitch During Fast Scrolling** * (IMPL_11)* ([ 82e8972] ( https://github.com/inventory69/simple-notes-sync/commit/82e8972 ) )
56+ - Added ` isDragConfirmed ` state to prevent accidental drag activation during scroll
57+ - Scoped ` animateItem() ` to confirmed drag operations only
58+ - Root cause: ` Modifier.animateItem() ` caused fade-in/out animations when items entered/left viewport
59+
60+ ** Checklist Drag Interrupted at Separator** * (IMPL_26)* ([ 8828391] ( https://github.com/inventory69/simple-notes-sync/commit/8828391 ) )
61+ - Dragging a checklist item across the checked/unchecked separator no longer drops the item
62+ - Item stays in active drag while its checked state toggles seamlessly
63+ - Root cause: Separate ` itemsIndexed ` blocks destroyed Composition on boundary crossing — unified into single ` items ` block
64+
65+ ** SyncMutex Deadlock via clearSessionCache() Exception** * (IMPL_13)* ([ 99f451b] ( https://github.com/inventory69/simple-notes-sync/commit/99f451b ) )
66+ - Wrapped ` clearSessionCache() ` in try-catch inside ` finally ` block
67+ - Prevents Mutex from staying locked when cache cleanup throws
68+
69+ ** False Error Banner on Sync Cancellation** * (IMPL_14)* ([ 1c45680] ( https://github.com/inventory69/simple-notes-sync/commit/1c45680 ) )
70+ - CancellationException no longer shows error banner to user
71+ - Removed duplicate state resets in SyncWorker catch blocks
72+
73+ ** Socket Leak in isServerReachable()** * (IMPL_15)* ([ fac54d7] ( https://github.com/inventory69/simple-notes-sync/commit/fac54d7 ) )
74+ - Socket now properly closed in all code paths (was leaking on successful connect)
75+
76+ ** CancellationException Swallowed in ParallelDownloader** * (IMPL_16)* ([ 4c34746] ( https://github.com/inventory69/simple-notes-sync/commit/4c34746 ) )
77+ - CancellationException now re-thrown instead of caught and retried
78+ - Prevents infinite retry loop when WorkManager cancels sync
79+
80+ ** Checklist Data Loss on onResume** * (IMPL_17)* ([ b436623] ( https://github.com/inventory69/simple-notes-sync/commit/b436623 ) )
81+ - Checklist edits now persist when returning from notification shade or app switcher
82+ - Root cause: ` onResume() ` reloaded note from database, discarding unsaved in-memory changes
83+
84+ ** Duplicate Stale-Sync Cleanup** * (IMPL_18)* ([ 71ae747] ( https://github.com/inventory69/simple-notes-sync/commit/71ae747 ) )
85+ - Removed copy-paste duplicate reset block in ` SimpleNotesApplication.onCreate() `
86+
87+ ** NotesStorage Shadow + Download Cancellation** * (IMPL_19)* ([ ede429c] ( https://github.com/inventory69/simple-notes-sync/commit/ede429c ) , [ 50ae9d8] ( https://github.com/inventory69/simple-notes-sync/commit/50ae9d8 ) )
88+ - Removed shadow ` NotesStorage ` instance in ` hasUnsyncedChanges() ` (19a)
89+ - Replaced ` runBlocking ` with ` coroutineScope ` in ` downloadRemoteNotes() ` for proper cancellation (19b)
90+ - Added read timeout to OkHttpClient instances (19c)
91+
92+ ** Silent Download Failures Reported as Success** * (IMPL_21)* ([ 371d5e3] ( https://github.com/inventory69/simple-notes-sync/commit/371d5e3 ) )
93+ - Download exceptions now propagate instead of being silently caught
94+ - Sync correctly reports failure when downloads fail
95+
96+ ** PENDING Notes Not Detected** * (IMPL_22)* ([ 20de019] ( https://github.com/inventory69/simple-notes-sync/commit/20de019 ) )
97+ - ` hasUnsyncedChanges() ` now checks for notes with PENDING sync status
98+ - Fixes issue where switching servers left notes unsynced
99+
100+ ** E-Tag/Timestamp Download Order** * (IMPL_23)* ([ 68dbb4e] ( https://github.com/inventory69/simple-notes-sync/commit/68dbb4e ) )
101+ - E-Tag comparison now runs before timestamp check (was skipping changed notes)
102+ - Fixes cross-device sync where timestamps matched but content differed
103+
104+ ** Silent Sync Promote to Visible** * (IMPL_24)* ([ 940a494] ( https://github.com/inventory69/simple-notes-sync/commit/940a494 ) )
105+ - Pull-to-refresh during background sync now shows sync banner instead of "already in progress" error
106+
107+ ** Markdown Sync Feedback Loop** * (IMPL_25)* ([ 74194d4] ( https://github.com/inventory69/simple-notes-sync/commit/74194d4 ) )
108+ - Fixed 5 root causes creating an infinite export→import→re-export cycle
109+ - UUID normalization, server-mtime preservation, timezone-aware comparison, path sanitization, content-type-aware comparison
110+
111+ ### ✨ New Features
112+
113+ ** Enter-Key Navigation from Title to Content** * (IMPL_09)* ([ 81b9aca] ( https://github.com/inventory69/simple-notes-sync/commit/81b9aca ) )
114+ - Title field is now single-line with ` ImeAction.Next `
115+ - Pressing Enter/Next jumps to content field or first checklist item
116+
117+ ### 🔄 Improvements
118+
119+ ** Widget Content Padding** * (IMPL_08)* ([ 2ae5ce5] ( https://github.com/inventory69/simple-notes-sync/commit/2ae5ce5 ) )
120+ - Unified padding for all widget views: 12dp horizontal, 4dp top, 12dp bottom
121+
122+ ** Widget Entry Spacing** * (IMPL_12)* ([ c3d4b33] ( https://github.com/inventory69/simple-notes-sync/commit/c3d4b33 ) )
123+ - Increased checklist and text widget spacing for better readability
124+
125+ ** Sync State Timeout**
126+ - Added 5-minute timeout for stale sync states in ` SyncStateManager `
127+ - ` tryStartSync() ` auto-resets if existing sync is older than 5 minutes
128+
129+ ** Cold Start State Cleanup**
130+ - ` SimpleNotesApplication.onCreate() ` now resets orphaned SYNCING state
131+
132+ ** APK Size Optimization** * (IMPL_03)* ([ 7867894] ( https://github.com/inventory69/simple-notes-sync/commit/7867894 ) )
133+ - Replaced broad ProGuard rule with granular rules — keeps only what reflection actually needs
134+
135+ ** Version Bump**
136+ - versionCode: 21 → 22
137+ - versionName: 1.8.1 → 1.8.2
138+
139+ ---
140+
11141## [ 1.8.1] - 2026-02-11
12142
13143### 🛠️ Bugfix & Polish Release
0 commit comments