Skip to content

Commit 8d95f6e

Browse files
committed
release(v2.5.0): merge feature/v2.5.0 into main
Includes: color filter chip for note list, APK size optimization (-11%, 5.23 MB -> 4.65 MB), resource shrinking and locale filtering. Closes #65
2 parents 17ece3c + 2de7021 commit 8d95f6e

83 files changed

Lines changed: 6291 additions & 213 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

β€ŽCHANGELOG.de.mdβ€Ž

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

99
---
1010

11+
## [2.5.0] - 2026-05-15
12+
13+
> πŸŽ‰ **Erstes Google-Play-Production-Release!** Nach mehreren Beta-Runden ist v2.5.0 der erste Build, der in den Production-Track im Play Store wandert. Riesiges DankeschΓΆn an alle, die frΓΌhe Builds installiert, Probleme gemeldet und uns geholfen haben, die letzten Ecken auszubΓΌgeln.
14+
15+
### ✨ Neue Features
16+
17+
**Google-Keep-Import** ([#65](https://github.com/inventory69/simple-notes-sync/issues/65))
18+
- Notizen direkt aus einer Google-Keep- / Google-Takeout-`.zip` importieren β€” komplett auf dem GerΓ€t, kein Upload
19+
- Vorab-Analyse klassifiziert das Archiv (aktiv / archiviert / Papierkorb / Labels / geteilt / Gesamtgrâße), bevor du bestÀtigst
20+
- **Konflikt-Strategie** pro Lauf: *immer neu erstellen* (Standard), *ΓΌberspringen, falls vorhanden* oder *ersetzen, falls vorhanden* β€” Vergleich per Inhalts-Hash (Titel + Body + Checklisten-Items)
21+
- Optionale Schalter fΓΌr **archivierte** und **Papierkorb**-Notizen
22+
- EingerΓΌckte Checklisten bis 3 Ebenen erhalten (DnD-Verhalten unverΓ€ndert)
23+
- Keep-`color` wird mitimportiert und sofort angezeigt (siehe *Notizfarben* unten); `isPinned` wird im Notiz-Modell gespeichert (Anzeige folgt in einem spΓ€teren Release)
24+
- Labels werden in einer separaten `notes_labels.json`-Indexdatei gespeichert
25+
- Abbrechbar wΓ€hrend des Imports; bereits importierte Notizen bleiben erhalten; Ergebnis-Dialog zeigt importiert / ersetzt / ΓΌbersprungen / Fehler mit ausklappbarer Fehlerliste
26+
- BestΓ€tigungs-Schritt bei Archiven ΓΌber 200 MB
27+
- Einmaliger Auto-Sync am Ende (nur wenn β‰₯ 1 Notiz importiert oder ersetzt wurde; respektiert vorhandenes Sync-beim-Speichern-Gate, Throttle und Offline-Modus)
28+
- Zu finden unter **Einstellungen β†’ Import β†’ Google Keep importieren**
29+
- Danke an [@simianaya](https://github.com/simianaya) fΓΌr den Feature-Wunsch!
30+
31+
**Notizfarben** ([#65](https://github.com/inventory69/simple-notes-sync/issues/65))
32+
- Neue Farbpalette (Keine, Rot, Orange, Gelb, GrΓΌn, BlaugrΓΌn, Blau, Dunkelblau, Lila, Rosa, Braun, Grau) mit getrennten Light-/Dark-Slots, damit Farben in beiden Themes lesbar bleiben ([4465615](https://github.com/inventory69/simple-notes-sync/commit/4465615))
33+
- Notizkarten auf dem Startbildschirm werden in der gewΓ€hlten Farbe eingefΓ€rbt ([7ced207](https://github.com/inventory69/simple-notes-sync/commit/7ced207))
34+
- Neuer FarbwΓ€hler als Bottom-Sheet ([cd0361e](https://github.com/inventory69/simple-notes-sync/commit/cd0361e))
35+
- Farbe einer Notiz im Editor ΓΌber das Overflow-MenΓΌ setzen ([b244db9](https://github.com/inventory69/simple-notes-sync/commit/b244db9))
36+
- Mehrfachauswahl auf dem Startbildschirm: Farbe fΓΌr mehrere Notizen gleichzeitig setzen ([7341462](https://github.com/inventory69/simple-notes-sync/commit/7341462))
37+
- Im Editor wird die Farbe als dezenter 3-dp-Akzentstreifen statt als ganzflΓ€chige TΓΆnung dargestellt β€” angenehm zu lesen ([bd5c943](https://github.com/inventory69/simple-notes-sync/commit/bd5c943))
38+
- Farben aus Google-Keep-Importen werden automatisch auf diese Palette gemappt
39+
- Danke an [@simianaya](https://github.com/simianaya) fΓΌr den Feature-Wunsch!
40+
41+
**Konflikt-Strategie fΓΌr lokale & WebDAV-Importe**
42+
- Die Konflikt-Strategie, die bereits beim Keep-Import bestand, gibt es jetzt auch fΓΌr den **lokalen Datei-Import** ([3a3d55c](https://github.com/inventory69/simple-notes-sync/commit/3a3d55c)) und den **WebDAV-Scan-Import** ([d369536](https://github.com/inventory69/simple-notes-sync/commit/d369536))
43+
- Pro Import-Lauf wΓ€hlbar: *immer neu erstellen*, *ΓΌberspringen* oder *ersetzen* β€” gleicher Inhalts-Hash-Vergleich wie beim Keep-Import, damit alle drei Quellen konsistent funktionieren
44+
- Der Button fΓΌr den lokalen Datei-Import nutzt jetzt den Standard-`SettingsButton` fΓΌr ein einheitliches Erscheinungsbild ([75f4dbd](https://github.com/inventory69/simple-notes-sync/commit/75f4dbd))
45+
46+
**Alle auswΓ€hlen / Auswahl aufheben beim WebDAV-Import** ([d928ddb](https://github.com/inventory69/simple-notes-sync/commit/d928ddb))
47+
- Nach dem Scan eines WebDAV-Ordners kannst du mit einem einzigen Toggle alle Ergebnisse auf einmal an- oder abwΓ€hlen
48+
- Spart bei großen Notizsammlungen viel Tippen
49+
50+
**Notizlisten-Farbfilter** ([e773a05](https://github.com/inventory69/simple-notes-sync/commit/e773a05))
51+
- Palette-Icon-Chip in der Filterleiste ΓΆffnet ein Farbfilter-Dropdown mit der Anzahl Notizen je Farbe
52+
- Kombiniert sich mit dem bestehenden Typ-Filter (UND-Logik) und wird in den SharedPreferences gespeichert
53+
- Text- und Listen-Chips auf reine Icon-Darstellung umgestellt fΓΌr ein einheitlicheres Erscheinungsbild
54+
- Schließt [#65](https://github.com/inventory69/simple-notes-sync/issues/65)
55+
56+
### ✨ Verbesserungen
57+
58+
**Checklisten-Tap-Animation**
59+
- Beim Abhaken eines Checklisten-Eintrags lΓ€uft jetzt eine brandneue Animation: kurzer Scale-Pop auf der Zeile, sanftes Radial-Glow und ein animiertes Abhaken ([7156c12](https://github.com/inventory69/simple-notes-sync/commit/7156c12), [2551d21](https://github.com/inventory69/simple-notes-sync/commit/2551d21))
60+
- Der erste Eintrag β€žspringt" beim Γ–ffnen des Editors nicht mehr β€” die Placement-Animation wird beim ersten Render unterdrΓΌckt ([2515874](https://github.com/inventory69/simple-notes-sync/commit/2515874))
61+
- Die Liste behΓ€lt ihre Scroll-Position korrekt bei, wenn EintrΓ€ge zwischen dem unchecked- und checked-Zweig wechseln ([9792968](https://github.com/inventory69/simple-notes-sync/commit/9792968))
62+
63+
### πŸ› Fehlerbehebungen
64+
65+
- **Importierte Notizen bekommen immer `SyncStatus.PENDING`** ([51ea959](https://github.com/inventory69/simple-notes-sync/commit/51ea959)) β€” importierte Notizen werden jetzt zuverlΓ€ssig vom nΓ€chsten Sync-Lauf erfasst, egal aus welcher Quelle sie kommen
66+
- **Editor-Autosave berΓΌcksichtigt FarbΓ€nderungen** ([a0a34b9](https://github.com/inventory69/simple-notes-sync/commit/a0a34b9)) β€” eine im Editor geΓ€nderte Notizfarbe wird nicht mehr vom No-Change-Guard verworfen
67+
68+
### ♻️ Intern
69+
70+
**`SyncScheduler` extrahiert**
71+
- Die duplizierte `triggerOnSaveSync()`-Logik aus `NoteEditorViewModel` und `MainViewModel` liegt jetzt zentral in `sync/SyncScheduler` (Verhalten strikt Γ€quivalent zu v2.4.0; wird vom Keep-Import-Flow wiederverwendet)
72+
73+
**APK-Grâße βˆ’11 % durch Locale- & Ressourcen-Filterung** ([5a631cb](https://github.com/inventory69/simple-notes-sync/commit/5a631cb))
74+
- `localeFilters` auf die 10 unterstΓΌtzten Sprachen beschrΓ€nkt β€” entfernt ungenutzte Übersetzungen aus `resources.arsc`
75+
- Striktes Ressourcen-Shrinking (`keep.xml`) β€” sicher, da die App keine dynamischen Ressourcen-Zugriffe hat
76+
- Packaging-Excludes um Build-time-Metadaten erweitert
77+
- Ergebnis: 5,23 MB β†’ 4,65 MB (βˆ’577 KB, βˆ’11 %); `resources.arsc`: 1,49 MB β†’ 0,95 MB (βˆ’540 KB)
78+
79+
### πŸ“š Dokumentation
80+
81+
- Neue Anleitung: `project-docs/simple-notes-sync/v2.5.0/google-keep-import-user-guide.de.md` (EN + DE)
82+
- Neues QA-Cheatsheet: `project-docs/simple-notes-sync/v2.5.0/google-keep-import-adb-tests.md`
83+
84+
### πŸ™ Danksagungen
85+
86+
- [@simianaya](https://github.com/simianaya) β€” fΓΌr den Wunsch nach Google-Keep-Import und Notizfarben ([#65](https://github.com/inventory69/simple-notes-sync/issues/65))
87+
- Alle, die frΓΌhe Google-Keep-Exporte getestet und SonderfΓ€lle gemeldet haben
88+
- Alle Beta-Tester, die uns zum **ersten Play-Store-Production-Release** geholfen haben β€” danke! πŸŽ‰
89+
90+
---
91+
1192
## [2.4.0] - 2026-05-04
1293

1394
### ✨ Neue Features

β€ŽCHANGELOG.mdβ€Ž

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

99
---
1010

11+
## [2.5.0] - 2026-05-15
12+
13+
> πŸŽ‰ **First Google Play production release!** After several rounds of beta testing, v2.5.0 is the first build promoted to the Play Store production track. A huge thank you to everyone who installed early builds, reported issues and helped us shake out the rough edges.
14+
15+
### ✨ New Features
16+
17+
**Google Keep Import** ([#65](https://github.com/inventory69/simple-notes-sync/issues/65))
18+
- Import notes directly from a Google Keep / Google Takeout `.zip` archive β€” fully on-device, no upload
19+
- Pre-scan classifies the archive (active / archived / trashed / labels / shared / total size) before you confirm
20+
- Per-run **conflict strategy**: *always create* (default), *skip if exists*, or *replace if exists* β€” matched by content hash (title + body + checklist items)
21+
- Optional **archived** and **trashed** include switches
22+
- Indented checklists preserved up to 3 levels (DnD behaviour unchanged)
23+
- Keep `color` is imported and applied immediately (see *Note Colours* below); `isPinned` is persisted in the note model (rendering follows in a later release)
24+
- Labels persisted in a separate `notes_labels.json` index
25+
- Cancellable mid-import; already-imported notes are kept; result dialog shows imported / replaced / skipped / errors with an expandable error list
26+
- Confirmation step for archives larger than 200 MB
27+
- Single auto-sync triggered at the end (only when β‰₯ 1 note was imported or replaced; respects existing on-save sync gate, throttle, and offline-mode settings)
28+
- Find it under **Settings β†’ Import β†’ Import from Google Keep**
29+
- Thanks to [@simianaya](https://github.com/simianaya) for the feature request!
30+
31+
**Note Colours** ([#65](https://github.com/inventory69/simple-notes-sync/issues/65))
32+
- New colour palette (None, Red, Orange, Yellow, Green, Teal, Blue, Dark blue, Purple, Pink, Brown, Gray) with separate light/dark slots so colours stay readable in both themes ([4465615](https://github.com/inventory69/simple-notes-sync/commit/4465615))
33+
- Note cards on the home screen are tinted by the chosen colour ([7ced207](https://github.com/inventory69/simple-notes-sync/commit/7ced207))
34+
- New colour picker bottom sheet ([cd0361e](https://github.com/inventory69/simple-notes-sync/commit/cd0361e))
35+
- Set a note's colour from the editor's overflow menu ([b244db9](https://github.com/inventory69/simple-notes-sync/commit/b244db9))
36+
- Bulk-set the colour for multiple selected notes from the home screen ([7341462](https://github.com/inventory69/simple-notes-sync/commit/7341462))
37+
- In the editor, the colour is rendered as a subtle 3 dp accent stripe instead of a full-screen tint, so reading stays comfortable ([bd5c943](https://github.com/inventory69/simple-notes-sync/commit/bd5c943))
38+
- Colours from Google Keep imports are mapped to this palette automatically
39+
- Thanks to [@simianaya](https://github.com/simianaya) for the feature request!
40+
41+
**Conflict Strategy for Local & WebDAV Imports**
42+
- The conflict strategy that already shipped with the Keep import is now also available for the **local file import** ([3a3d55c](https://github.com/inventory69/simple-notes-sync/commit/3a3d55c)) and the **WebDAV scan import** ([d369536](https://github.com/inventory69/simple-notes-sync/commit/d369536))
43+
- Choose per import run whether to *always create*, *skip*, or *replace* matching notes β€” same content-hash comparison as the Keep import, so behaviour is consistent across all three sources
44+
- Local file import button now uses the standard `SettingsButton` for visual consistency ([75f4dbd](https://github.com/inventory69/simple-notes-sync/commit/75f4dbd))
45+
46+
**Select All / Deselect All for WebDAV Import** ([d928ddb](https://github.com/inventory69/simple-notes-sync/commit/d928ddb))
47+
- After scanning a WebDAV folder, a single toggle lets you tick or untick every result at once
48+
- Saves a lot of tapping when restoring large note sets
49+
50+
**Note List Colour Filter** ([e773a05](https://github.com/inventory69/simple-notes-sync/commit/e773a05))
51+
- Palette icon chip in the filter bar opens a colour-filter dropdown with per-colour note counts
52+
- Combines with the existing type filter (AND logic) and is persisted in SharedPreferences
53+
- Text and List type chips converted to icon-only for visual consistency
54+
- Closes [#65](https://github.com/inventory69/simple-notes-sync/issues/65)
55+
56+
### ✨ Improvements
57+
58+
**Checklist Tap Animation**
59+
- Ticking a checklist item now plays a brand-new animation: a brief scale-pop on the row, a soft radial glow and a satisfying check-off effect ([7156c12](https://github.com/inventory69/simple-notes-sync/commit/7156c12), [2551d21](https://github.com/inventory69/simple-notes-sync/commit/2551d21))
60+
- The first item no longer "jumps" when the editor opens β€” the placement animation is suppressed on initial render ([2515874](https://github.com/inventory69/simple-notes-sync/commit/2515874))
61+
- The list keeps its scroll position correctly when items move between the unchecked and checked branches ([9792968](https://github.com/inventory69/simple-notes-sync/commit/9792968))
62+
63+
### πŸ› Bug Fixes
64+
65+
- **Imports always assign `SyncStatus.PENDING`** ([51ea959](https://github.com/inventory69/simple-notes-sync/commit/51ea959)) β€” imported notes are now reliably picked up by the next sync run, regardless of the import source
66+
- **Editor autosave includes colour changes** ([a0a34b9](https://github.com/inventory69/simple-notes-sync/commit/a0a34b9)) β€” switching a note's colour from the editor no longer gets discarded by the no-change guard
67+
68+
### ♻️ Internal
69+
70+
**`SyncScheduler` extracted**
71+
- The duplicated `triggerOnSaveSync()` logic from `NoteEditorViewModel` and `MainViewModel` is now centralised in `sync/SyncScheduler` (behaviour strictly equivalent to v2.4.0; reused by the Keep import flow)
72+
73+
**APK Size βˆ’11% via Locale & Resource Filtering** ([5a631cb](https://github.com/inventory69/simple-notes-sync/commit/5a631cb))
74+
- `localeFilters` restricted to the 10 supported languages β€” removes unused translations from `resources.arsc`
75+
- Strict resource shrinking (`keep.xml`) β€” safe because the app has no dynamic resource lookups
76+
- Packaging excludes expanded to remove build-time-only metadata
77+
- Result: 5.23 MB β†’ 4.65 MB (βˆ’577 KB, βˆ’11%); `resources.arsc`: 1.49 MB β†’ 0.95 MB (βˆ’540 KB)
78+
79+
### πŸ“š Documentation
80+
81+
- New user guide: `project-docs/simple-notes-sync/v2.5.0/google-keep-import-user-guide.md` (EN + DE)
82+
- New QA cheatsheet: `project-docs/simple-notes-sync/v2.5.0/google-keep-import-adb-tests.md`
83+
84+
### πŸ™ Acknowledgements
85+
86+
- [@simianaya](https://github.com/simianaya) β€” for requesting Google Keep import and note colours ([#65](https://github.com/inventory69/simple-notes-sync/issues/65))
87+
- Everyone who tested early Google Keep exports and reported edge cases
88+
- All beta testers who helped us reach the **first Play Store production release** β€” thank you! πŸŽ‰
89+
90+
---
91+
1192
## [2.4.0] - 2026-05-04
1293

1394
### ✨ New Features

β€ŽREADME.de.mdβ€Ž

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,6 @@ GNU Affero General Public License v3.0 – siehe [LICENSE](LICENSE)
159159
<div align="center">
160160
<br /><br />
161161

162-
**v2.3.0** · Built with ❀️ using Kotlin + Jetpack Compose + Material Design 3
162+
**v2.5.0** · Built with ❀️ using Kotlin + Jetpack Compose + Material Design 3
163163

164164
</div>

β€ŽREADME.mdβ€Ž

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,6 @@ GNU Affero General Public License v3.0 - see [LICENSE](LICENSE)
169169
<div align="center">
170170
<br /><br />
171171

172-
**v2.3.0** · Built with ❀️ using Kotlin + Jetpack Compose + Material Design 3
172+
**v2.5.0** · Built with ❀️ using Kotlin + Jetpack Compose + Material Design 3
173173

174174
</div>

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

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,18 @@ android {
2020
applicationId = "dev.dettmer.simplenotes"
2121
minSdk = 24
2222
targetSdk = 36
23-
versionCode = 32 // πŸ†• v2.4.0 - Sync Reliability
24-
versionName = "2.4.0" // πŸ†• v2.4.0 - Sync Reliability
23+
versionCode = 33 // πŸ†• v2.5.0 - Google Keep Import
24+
versionName = "2.5.0" // πŸ†• v2.5.0 - Google Keep Import
25+
26+
// APK-Size: nur tatsΓ€chlich gepflegte Locales ausliefern. AndroidX/Material/
27+
// Compose schleppen sonst ~70+ Sprachvarianten in resources.arsc mit. GerΓ€te
28+
// mit nicht gelisteten Locales fallen wie gewohnt auf den Default (en) zurΓΌck.
29+
// Liste muss synchron zu app/src/main/res/values-* gehalten werden.
30+
androidResources {
31+
localeFilters += listOf(
32+
"en", "de", "hi", "in", "it", "nb-rNO", "ru", "tr", "uk", "zh-rCN",
33+
)
34+
}
2535

2636
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
2737
// πŸ†• v2.4.0: Diagnostic phase finished (long-run log validated all v2.4.0 fixes).
@@ -115,6 +125,12 @@ android {
115125
"META-INF/**/LICENSE",
116126
"META-INF/**/NOTICE.txt",
117127
"META-INF/**/NOTICE",
128+
// v2.5.x: Buildzeit-only Artefakte ohne Runtime-Bedeutung
129+
"META-INF/proguard/**", // Consumer-Rules (zur Buildzeit konsumiert)
130+
"META-INF/com.android.tools/**", // R8/AGP-spezifische Hints
131+
"META-INF/*.version", // AndroidX/Kotlin-Versionsmarker
132+
"META-INF/androidx/**", // andere AndroidX-Metadaten
133+
"**/*.kotlin_metadata", // Kotlin Reflection (nicht genutzt)
118134
)
119135
}
120136
}

β€Žandroid/app/proguard-rules.proβ€Ž

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,25 @@
8282
}
8383
# NoteRaw ist Note$Companion$NoteRaw β€” durch das ** Pattern abgedeckt.
8484

85+
# ═══════════════════════════════════════════════════════════════════════
86+
# Keep-Import DTOs (Gson-Reflection)
87+
# ═══════════════════════════════════════════════════════════════════════
88+
# Die Keep-Takeout-JSONs werden ΓΌber typisierte DTOs in
89+
# noteimport.keep.parser.dto.** deserialisiert. Class-Literale werden im
90+
# Quellcode verwendet (`fromJson(json, KeepNoteJson::class.java)`), daher
91+
# dΓΌrfen die Klassennamen obfuskiert werden β€” nur Felder + Konstruktoren
92+
# mΓΌssen erhalten bleiben.
93+
-keep,allowobfuscation class dev.dettmer.simplenotes.noteimport.keep.parser.dto.** { <init>(...); }
94+
-keepclassmembers class dev.dettmer.simplenotes.noteimport.keep.parser.dto.** {
95+
<fields>;
96+
}
97+
98+
# LabelIndex wird via Gson serialisiert/deserialisiert (notes_labels.json).
99+
-keep,allowobfuscation class dev.dettmer.simplenotes.noteimport.keep.persistence.LabelIndex { <init>(...); }
100+
-keepclassmembers class dev.dettmer.simplenotes.noteimport.keep.persistence.LabelIndex {
101+
<fields>;
102+
}
103+
85104
# ═══════════════════════════════════════════════════════════════════════
86105
# App-Backup-Datenklassen
87106
# ═══════════════════════════════════════════════════════════════════════

0 commit comments

Comments
Β (0)