Skip to content

Latest commit

 

History

History
2611 lines (1894 loc) · 176 KB

File metadata and controls

2611 lines (1894 loc) · 176 KB

Changelog

Alle wichtigen Änderungen an Simple Notes Sync werden in dieser Datei dokumentiert.

Das Format basiert auf Keep a Changelog.

🌍 Sprachen: Deutsch · English


[2.14.0] - 2026-08-08

✨ Neue Features

Ein Aktivitätsprotokoll, das das Gerät nie verlässt (ae27ff2, 40fd353, cf449ae, fd15fbe)

  • Wenn eine Notiz verschwand, gab es keine Möglichkeit herauszufinden, was mit ihr passiert ist. In den Einstellungen steht jetzt ein Aktivitätsprotokoll: erstellt, bearbeitet, verschoben, in den Papierkorb gelegt, wiederhergestellt - und jeder Sync mit dem Grund, aus dem er startete: ein Speichern, das Widget, ein Pull-to-Refresh, der periodische Job. Es wird lokal geschrieben, nie hochgeladen, und verlässt das Gerät nur, wenn du es selbst teilst
  • Jede Zeile sagt, woher die Aktion kam - als Text, nicht nur als Symbol (fac13a0, 96716d4)

Bilder: eine Standardgröße und Kopieren aus dem Longpress-Menü (3dbd400, 8f5ef72)

  • Neu eingefügte Bilder nahmen die volle Breite ein und mussten jedes Mal von Hand verkleinert werden. In den Anzeige-Einstellungen steht jetzt eine Standardgröße, mit der neue Bilder starten
  • Das Longpress-Menü eines Bildes kann es jetzt kopieren, zusätzlich zu den bisherigen Aktionen

Digest-Authentifizierung (bd009ec)

  • WebDAV-Server, die keine Basic-Authentifizierung anbieten, funktionieren jetzt. Beide Verfahren werden automatisch ausgehandelt - nichts einzustellen

🔒 Datenschutz

Logs werden gesäubert, bevor sie das Gerät verlassen (0d7ce77, 7ec7eff, 7645954, e7ff37e, a333dfb)

  • Ein Debug-Log ist der schnellste Weg, ein Sync-Problem zu beheben, und der einfachste Weg, mehr zu veröffentlichen als beabsichtigt. In der Kopie, die der Teilen-Button herausgibt, sind jetzt Server-Host und -Pfad, Benutzername, Notiztitel, Ordnernamen und Markdown-Dateinamen durch Platzhalter ersetzt. Die Datei auf dem Gerät bleibt vollständig
  • Notiz-UUIDs bleiben bewusst stehen: sie identifizieren niemanden und sind der einzige Faden, an dem sich ein Problem über mehrere Logzeilen verfolgen lässt
  • Manche Server legen den Klarnamen des Kontoinhabers in den WebDAV-Pfad. Der steht in keiner Titel- oder Ordnerliste und blieb deshalb stehen, bis der Pfad selbst ersetzt wurde - in allen drei Schreibweisen, in denen er auftauchen kann
  • Ersetzungen halten sich an Wortgrenzen, ein Ordner namens „Auto" macht aus „Automatischer Upload" also keinen Platzhalterbrei mehr

Das Sync-Log liest nicht mehr die Post der Nachbarn (4088e3d)

  • Eine einmalige Aufräumroutine schrieb jeden Eintrag des Verzeichnisses über den Sync-Ordnern ins Log - fremde Ordnernamen und Dokumenttitel, die mit dieser App nichts zu tun haben und die keine Anonymisierung erkennen kann. Geloggt wird jetzt nur noch die Anzahl
  • Danke an David Jany fürs Entdecken in einem Beta-Log

🐛 Bug-Fixes

Ein Ordner, der sich nicht auflisten ließ, sah aus wie eine Löschung (9569173)

  • Wenn der Server einen Ordner nicht auflisten konnte, fehlten die Notizen darin in der Auflistung - und fehlend liest sich wie gelöscht. Die Notizen lagen unangetastet auf dem Server und landeten lokal im Papierkorb. Die Löschungserkennung läuft jetzt nicht mehr auf einer unvollständigen Auflistung, und bereits falsch markierte Notizen heilen beim nächsten Sync
  • Danke an @daalja für den Bericht! (#128)

Ordnernamen mit Leerzeichen fielen aus der Server-Auflistung (68f87d3)

  • Ein rohes Leerzeichen in der konfigurierten Server-URL erzeugte eine Anfrage, die der Server mit einem Fehler beantwortete, woran der Sync starb. Die URL wird jetzt einmal kanonisiert, was auf die Leitung geht, ist also enkodiert - egal wie sie eingetippt wurde

Teilen oder Kopieren einer Notiz verlor ihre Bilder (46ccccf)

  • Geteilter und kopierter Notiztext ließ die Bildreferenzen fallen, die empfangende App bekam eine Notiz mit Löchern

Das Aufräumen eines Ordners versuchte Verzeichnisse zu löschen, die es nicht gab (dda9ab2)

  • Wenn die letzte Notiz einen Ordner verlässt, entfernt die App das nun leere Verzeichnis vom Server. Ein Verzeichnis, das der Server gar nicht hatte, galt dabei als "leer" und bekam eine Löschanfrage, die nur scheitern konnte - eine pro Aufräumvorgang, jedes Mal ein vergeudeter Roundtrip und eine Warnung im Log, die nach einem echten Problem aussah
  • Danke an @xmichelf für das Beta-Log, das das ans Licht gebracht hat

Kleinere

  • Eine fehlende deletions.json oder folders.json wird als normales Ereignis protokolliert statt als Warnung - in einem Sync-Ordner, in dem noch nichts gelöscht wurde, ist der 404 die erwartete Antwort, und er ersäufte die Warnungen, die etwas bedeuteten (2b94d28)
  • Debug-Logs zeigen das Ende eines E-Tags statt seinen Anfang. Manche Server geben jeder Datei dieselben führenden Zeichen, wodurch im Log alle Notizen gleich aussahen (fc3b980)
  • Eine tiefe Verzeichnisauflistung ohne verschachtelte Einträge wird nicht mehr für bare Münze genommen (48ffa8d)
  • JSON-Dateien auf dem Server, die keine Notizen sind, bleiben aus der Notiz-ID-Menge heraus (1fa738f)
  • Der Retry-Zähler zählte Durchläufe statt Wiederholungen (d2ca5ae)
  • Sync-Ergebnisse werden für jeden Aufrufer protokolliert, nicht nur für den Hintergrund-Worker (3b4cf32)
  • Das Debug-Log überlebt einen Prozess-Neustart und wird erst gekürzt, wenn es tatsächlich gewachsen ist (399c1c5, 38d97d0)

⚡ Performance

Der Sync fragt nicht mehr nach Dingen, die er schon weiß (ef54a2b, 6493018, 17d5218, 79d1ec6, 20a86e1)

  • Jede Anfrage an einen WebDAV-Server kostet echte Zeit - gegen Nextcloud hinter Cloudflare gemessen etwa eine halbe Sekunde pro Stück. Ein Sync ohne Änderungen verbrauchte davon zehn bis zwölf. Jetzt sind es etwa zwei, und ein gemessener Sync ging von 6,5 auf 4,0 Sekunden
  • Die App meldet sich nicht mehr bei jedem einzelnen Sync neu an. Eine Anmeldung pro App-Start reicht, wiederholt wird sie nur bei geänderten Zugangsdaten
  • Verzeichnisprüfungen, Ordnerlisten und das Löschprotokoll werden zwischen Syncs gemerkt statt jedes Mal neu erfragt. Notizen zu löschen hat das gemeinsame Protokoll bisher einmal pro Notiz neu geschrieben - jetzt ist es ein Lesen und ein Schreiben
  • Eine Prüfung lief bei jedem Sync mit, die nie etwas anderes antworten konnte als "ja, schau auf den Server" - sie ist samt ihrer Anfragen entfernt
  • Sind Markdown-Export oder Bilder ausgeschaltet, fasst die App die zugehörigen Ordner gar nicht mehr an. Sind sie an, werden gerade exportierte Dateien nicht mehr heruntergeladen, nur um ihre ID zurückzulesen
  • Ordner werden in einem Durchgang geholt statt mit einer Anfrage pro Ordner, sofern der Server das unterstützt
  • Eine Notiz in einen Ordner zu verschieben oder einen Ordner umzubenennen lädt die Notiz nicht mehr direkt wieder herunter. Das Verschieben lädt sie auf den neuen Pfad hoch und räumt danach den alten auf - und dieses Aufräumen warf weg, was der Upload gerade gelernt hatte. Ein Ordner-Rename kostete so einen sinnlosen Download pro Notiz darin (dba25cf)
  • Das Ordner-Aufräumen greift nicht mehr nach dem Markdown-Spiegel, wenn Markdown abgeschaltet ist (9924cf4)

🔧 Technische Verbesserungen

Eigener WebDAV-Client statt ungepflegter Bibliothek (bd009ec)

  • Der Sync lief über sardine-android, das seit Jahren keine Updates mehr bekommt. Ersetzt durch einen kleinen Client direkt auf OkHttp, der genau das abdeckt, was die App braucht: PROPFIND, GET, PUT, DELETE, MKCOL. Nicht mehr
  • Alle Server-Workarounds sind unverändert übernommen - Jianguoyun mit seinem 403, bewCloud ohne HEAD, der MKCOL-Fallback. Sie sind jetzt durch Tests gegen einen Mock-Server abgedeckt, was vorher nicht möglich war
  • Die App wurde kleiner: Die Abhängigkeit und ihre ProGuard-Regeln sind weg
  • Wenn irgendetwas anders synct als vorher, bitte ein Issue aufmachen. Dieses Release tauscht genau das Stück der App aus, das mit deinem Server spricht, und keine Testsuite deckt jeden WebDAV-Server da draußen ab

Schärferes Code-Qualitätsgate (61ea842)

  • Die Komplexitätsgrenzen waren über die Zeit angehoben worden, um Bestandscode durchzulassen - damit waren sie auch für neuen Code wirkungslos. Sie stehen wieder auf ihren Zielwerten; die Stellen, die sie noch überschreiten, sind einzeln markiert und werden Release für Release abgebaut

Ein Build-Typ für Tester (6f1c616, 572b267, 25b27a8, 1fc02a9)

  • Beta-Builds sind identisch zu Release-Builds - gleicher Signing-Key, gleiches R8 - und schalten nur Datei-Logging, Sync-Debug-Log und die Entwickleroptionen frei, damit ein Tester ein Log herausgeben kann, ohne nach einem versteckten Schalter zu suchen. Tags mit Suffix veröffentlichen ein Pre-Release und erreichen weder Play noch F-Droid; überholte Pre-Releases werden automatisch aufgeräumt
  • Danke an alle, die die Betas dieser Version getestet und Logs geschickt haben

🌍 Übersetzungen

  • Chinesisch (vereinfacht) (99 %): @heretic43
  • Indonesisch (95 %): Arif Budiman
  • Norwegisch Bokmål (95 %): @xdpirate
  • Russisch (95 %): PONYATIN
  • Italienisch (91 %): GVE
  • Französisch (85 %): Fred
  • Niederländisch und brasilianisches Portugiesisch wurden in diesem Release begonnen - danke an Quinten und Rafael. Ausgeliefert werden sie noch nicht: Eine Sprache kommt ab 40 % Übersetzungsgrad in die System-Sprachauswahl, damit niemand nach der Auswahl in einer überwiegend englischen Oberfläche landet. Beide stehen auf Hosted Weblate offen, wer mithelfen mag

[2.13.1] - 2026-07-25

🐛 Bug-Fixes

Archivieren und Löschen fehlten im Editor-Menü (b058088)

  • Das Überlaufmenü las seinen State nicht an einer Stelle, die Compose beobachten konnte. Der Abschnitt mit Archivieren und Löschen hing damit an einem veralteten Snapshot und blieb verborgen, bis das Menü einmal geschlossen und wieder geöffnet wurde. Bei ganz neuen Notizen fehlte er komplett, weil die Notiz erst nach dem ersten Autosave auf der Platte liegt. Beide Einträge werden jetzt immer angezeigt; das Löschen einer noch nie gespeicherten Notiz verwirft sie, statt sie in den Papierkorb zu verschieben, und Archivieren speichert sie vorher
  • Danke an @lincomax für die Meldung! (#114)

Verlassen einer Widget-Notiz führte an die falsche Stelle (6fa7257)

  • Beide Wege aus dem Editor taten dasselbe, wo man landete hing also davon ab, was in „Zuletzt verwendet" noch offen war: Der Pfeil in der Werkzeugleiste konnte in einer anderen Notiz landen, und die System-Zurück-Geste konnte den Editor zurückholen statt zum Startbildschirm zu führen. Der Pfeil öffnet jetzt immer die Notizliste, Zurück verlässt immer die App. In der App oder per Teilen geöffnete Notizen sind unverändert
  • Danke an @lincomax für den Wunsch! (#117)

„Notiz-Icon zeigen" wurde vom Notizlisten-Widget ignoriert (f24909b)

  • Die Anzeige-Einstellung erreichte nur die Notizkarten in der App. Das Widget las seinen eigenen Glance-State und zeigte Typ-Icon und Pin-Markierung weiter an, auch wenn die Einstellung aus war. Es liest jetzt die App-Einstellung und aktualisiert die Widgets, sobald der Schalter umgelegt wird
  • Danke an @lincomax für den Wunsch! (#120)

🎨 UI-Verbesserungen

Ein Kartenlayout für alle Einstellungsbildschirme (2f15ce6, 01382d2)

  • Import, Backup, Debug, Sicherheit, Sprache und Über nutzten noch das alte flache Layout, während Anzeige und Sync längst auf Abschnittskarten umgestellt waren. Alle folgen jetzt demselben Muster, die Trennlinien sind weg, und die sieben fast identischen Chip-Reihen fallen zu einer gemeinsamen Komponente zusammen. Abschnittsüberschriften sind zentriert wie die in der Notizliste. Der Server-Bildschirm bleibt unverändert und folgt separat

🌍 Übersetzungen

  • Chinesisch (vereinfacht) (100%): @heretic43 — alle 15 neuen Strings aus v2.13.0 innerhalb weniger Tage nach dem Release übersetzt

[2.13.0] - 2026-07-25

✨ Neue Funktionen

Gruppierte Einstellungen (0a859f0, 114ddf3, a22e683, 3fcdc21)

  • Die Anzeige-Einstellungen waren auf 15 Optionsgruppen in einer flachen Liste angewachsen, deren Überschriften nicht mehr zum Inhalt passten. Sie stehen jetzt in vier Karten: Erscheinungsbild, Notizliste, Editor und Bildkomprimierung. Jede Karte sammelt ihren eigenen State ein, ein einzelner Schalter komponiert also nicht mehr den ganzen Bildschirm neu
  • Der Markdown-Einstellungsbildschirm bestand aus einem Schalter, einer Ordnerzeile und einem Sync-Button — zu wenig für einen eigenen Bildschirm samt Menükarte. Er wird zum vierten Abschnitt des Sync-Bildschirms, dessen drei bestehende Abschnitte ebenfalls zu Karten werden
  • Die Einstellungsübersicht gruppiert ihre zehn Karten unter den Überschriften App, Synchronisation, Daten und Info

Notizkarten nur mit Titel (726b0ab, 7cc17ff)

  • Eine neue Stufe der Vorschaulänge zeigt in Listen- und Rasteransicht nur noch den Titel, mit passender Option im Notizlisten-Widget. Notizen ohne Titel behalten ihre erste Inhaltszeile im Titelbereich, statt eine leere Karte zu rendern
  • Danke an @iergun71 für den Wunsch (Diskussion #110)!

Zeitstempel und Notiz-Icon ausblenden (46c88e7)

  • Zwei Schalter entfernen die Zeitstempel-Fußzeile und das Typ-Icon aus Listen-, Kompakt- und Rasterkarten. Ohne Fußzeile wandert das Sync-Status-Icon ans Ende der letzten Vorschauzeile, statt hinter dem Auslassungszeichen zu verschwinden
  • Danke an @iu0v1 für die Meldung! (#100)

Scroll nach oben beim Abwählen ist optional (61c9fb6)

  • Das Abwählen eines Eintrags scrollte die Checkliste an den Anfang, was Abläufe wie das Reaktivieren von Einträgen auf einer Einkaufsliste stört. Ein Schalter in den Anzeige-Einstellungen schaltet es ab, der Standard bleibt unverändert
  • Danke an @abacus-tabletop-games für die Meldung! (#112)

Automatisch schrumpfende Rastertitel (de05dbf)

  • Lange Titel im Raster schrumpfen auf 80%, bevor abgekürzt wird; Titel und Vorschautext trennen jetzt Wörter, sodass lange Wörter umbrechen, statt früh in die nächste Zeile zu springen

🐛 Bug-Fixes

Checkboxen verschwanden unter einem Aufzählungspunkt (40d4d7c)

  • Ein einfacher Aufzählungspunkt direkt über Aufgabenzeilen verschluckte die ganze Checkliste und stellte sie als Aufzählung mit wörtlichem [ ] / [x] dar — genau die Liste, die der Checklisten-Button der Werkzeugleiste erzeugt. Der Fehler stammt aus v1.9.0 und war in Vorschau, Notizkarten, Widgets und PDF-Export sichtbar, da alle vier denselben Parser nutzen. Die Aufgaben-Regex akzeptiert jetzt auch */+-Marker, leere Klammern und fehlenden Text und wird von Vorschau, Live-Formatierung und Tippen geteilt

Animation beim Abwählen in Checklisten (bfd6868)

  • Abwählen mit Umsortierung über den Trenner hinweg ließ eine Geisterzeile am Rand des Sichtbereichs zurück und drückte die Nachbarn mitten im Scrollen auseinander. Die Zeile animiert ihren Abgang jetzt selbst und klappt an Ort und Stelle zusammen, bevor das Modell übernimmt; das Scrollen nach oben ist ein einziger pixelgenauer Gleitvorgang statt eines sichtbaren Zwei-Phasen-Sprungs. Abgesichert durch bildgenaue instrumentierte Regressionstests

Widget-Bilder ignorierten die Größe (394f40e)

  • Die vier Größenvorgaben hatten im Notiz-Widget keine Wirkung, jedes Bild wurde mit fester Höhe gerendert. Der Standard von 50% entspricht weiterhin der bisherigen Größe, bestehende Notizen sehen also unverändert aus

Notizlisten-Widget zeigte veraltete Notizen (6984c5a)

  • Das Widget lud seine Notizen außerhalb der neu komponierten Lambda, die Liste blieb also für die gesamte Glance-Sitzung eingefroren — Änderungen nach dem Öffnen einer Notiz aus dem Widget tauchten nie auf

Fehlendes Bild-Emoji in Widget-Vorschauen (f0e42bc)

  • Notizen mit Bildern zeigten im Notizlisten-Widget nur ihren (oft leeren) Alt-Text statt des 🖼-Hinweises, den die Notizkarten der App verwenden

[2.12.1] - 2026-07-17

🐛 Bug-Fixes

Text-Widgets zeigten einen Fehler (503dc2b)

  • Jedes Text-Notiz-Widget zeigte in allen Größen Glances Fehler-Layout („Inhalt kann nicht angezeigt werden") statt der Notiz. Die Markdown-Ansicht des Widgets las den Compose-UI-LocalContext, den eine Glance-Composition nie bereitstellt. Checklisten-Widgets waren nicht betroffen. Eine detekt-Regel verhindert jetzt, dass der falsche Import per Autovervollständigung zurückkommt

Fett + kursiv in Markdown (052d9eb)

  • ***Text*** und ___Text___ wurden nie fett-kursiv dargestellt, und ein einzelnes *** verschob die Marker-Zuordnung für alle folgenden Inline-Tags derselben Zeile, was die ganze Zeile zerlegte. Behoben in Viewer, Widget, HTML-Export und Editor-Live-Vorschau

🌍 Übersetzungen


[2.12.0] - 2026-07-14

✨ Neue Funktionen

Bildanhänge in Notizen (1f88777, c67725a, c7ce100)

  • Bilder über die Auswahl einfügen oder direkt aus der Zwischenablage einsetzen; sie werden inline im Editor und in der Vorschau dargestellt, gestützt auf einen inhaltsadressierten Asset-Store mit Komprimierungs-Pipeline

Formatiertes HTML einfügen (c7ce100)

  • Beim Einfügen aus einer Webseite bleibt die Formatierung erhalten: Überschriften, Listen, Links und Tabellen werden in Markdown umgewandelt statt auf reinen Text reduziert. Das Größenlimit wurde von 200 KB auf 8 MB angehoben und die Umwandlung läuft außerhalb des Main-Threads, sodass große Seiten sauber und ohne Einfrieren des Editors eingefügt werden
  • Danke an @infosundtips für den Vorschlag und das Testen!

Bildgröße, Ausrichtung & Viewer (b91b522, 9a02592)

  • Bilder per Menü skalieren und ausrichten, im Vollbild öffnen und EXIF-Metadaten in einem Info-Dialog einsehen; Größe und Ausrichtung werden als Markdown-Tokens gespeichert

Bild-Synchronisation über WebDAV (7461ddb, 927d06b)

  • Bild-Assets werden zusammen mit den Notizen synchronisiert, verwaiste Dateien per Garbage Collection entfernt, und Asset-Links zwischen JSON- und Markdown-Mirror-Format übersetzt

Bilder überall sonst (3672f53, a839e2a, f8186d9, d528001)

  • Der PDF-Export rendert Anhänge unter Beachtung von Größen- und Ausrichtungs-Tokens, Widgets zeigen echte Bitmaps, und Backups enthalten die Anhänge

Einstellung zur Bildkomprimierung (f36877d)

  • Wählbar, wie stark eingefügte Bilder komprimiert werden

Vorschaumodus als Standard (af1e1c3)

  • Textnotizen können direkt in der Vorschau statt im Editor geöffnet werden

Strategien für Kalender-Parsing (c27db7f, c3fb84d, 5348771)

  • Der Kalender-Export nutzt den geparsten Titel, Ort und die Teilnehmer, und die im Experiment-Screen gewählte Parsing-Strategie bleibt erhalten

Bilder nativ teilen (9f0b1cd)

  • Beim Teilen einer Notiz werden Bilder als native Anhänge mitgegeben statt als Rohtext

⚡ Performance

Schnellerer Papierkorb (4afa86a)

  • Das Löschen im Papierkorb läuft gebündelt, und der Papierkorb öffnet spürbar schneller

🐛 Bug-Fixes

EXIF-Rotation & Seitenverhältnis (41a9149, d126a6f, 9aa8927)

  • PDF-Export und Vorschau beachten die EXIF-Ausrichtung, behalten bei gedrehten Bildern das korrekte Seitenverhältnis und laden Bilder nach einer Größenänderung neu

Editor-Feinschliff (1a5b0ca, 30c2ebd, 4a0c561)

  • Der Cursor landet hinter eingefügtem Link- und Bild-Markdown, der Bild-Info-Button erscheint auch ohne EXIF-Daten, und eingeklappte Bereiche werden pro Ordner gemerkt

Spanische Akzente (eeb847e)

  • Akzente in den spanischen Sync- und Backup-Strings korrigiert

Sprachauswahl (d3fc8dd)

  • Französisch war vollständig übersetzt, aber nie registriert und tauchte deshalb nie als Auswahl auf; im In-App-Picker für Android 12 und älter fehlten zudem Spanisch, Italienisch, Indonesisch, Norwegisch und Russisch

🌍 Übersetzungen

  • Französisch (93%): Fred, @carotte31
  • Italienisch (93%): GVE
  • Chinesisch (vereinfacht) (93%): @heretic43
  • Estnisch (2%): Priit Jõerüüt

Französisch ist jetzt auswählbar - es war übersetzt, aber nie in der Sprachauswahl registriert.

Hindi (5%) und Estnisch (2%) werden noch nicht ausgeliefert. Eine Sprache wird erst ab 40% Übersetzungsgrad mitgeliefert und in der Auswahl angeboten; darunter wäre die Oberfläche ohnehin fast komplett englisch. Beide bleiben in Weblate und kommen mit, sobald sie die Schwelle reißen - Mithilfe willkommen.


[2.11.0] - 2026-07-06

✨ Neue Funktionen

Notizen archivieren (4a306b5)

  • Notizen aus der Hauptliste ins Archiv verschieben, ohne sie zu löschen; eine eigene Archivansicht erlaubt späteres Wiederherstellen und Verwalten

Standardfarbe & Cursor-Fokus (cfdf542)

  • Standardfarbe für jede neue Notiz wählen und den Cursor beim Erstellen optional direkt in den Textkörper setzen

Sortierung je Ordner (4437419)

  • Jeder Ordner merkt sich seine eigene Sortieroption und -richtung über Neustarts hinweg

Einstellbare Vorschaulänge (43f6eb0)

  • Festlegen, wie viele Zeilen Vorschautext Notizen in der Liste anzeigen

Code-Block in der Markdown-Leiste (99af39d)

  • Neuer Leisten-Button fügt beim Bearbeiten einen umschlossenen Code-Block ein

Vereinheitlichter Wechsel des Sync-Ziels (c0ede47, 47844b0, 13be3fa, 3ecf658)

  • Server- und Ordnerwechsel laufen jetzt über ein einziges Gate, das vor dem Wechsel den Umgang mit den Daten bestätigt; der Server-Untertitel zeigt den aktiven Ordner, und der Markdown-Exportordner erscheint als Karte mit Kopier-Aktion

🐛 Bug-Fixes

Markdown-Formatierung im PDF-Export (495646f, 41ceb09, 0fb65dc)

  • Der PDF-Export rendert jetzt echte Markdown-Formatierung statt Rohtext, füllt leere Code-Zeilen, hinterlegt Inline-Code und stellt snake_case-Bezeichner nicht mehr kursiv dar
  • Danke an @hoseinhzk für den Bug-Report!

Passwort-Anzeige neu absichern (f32ee55)

  • Das erneute Anzeigen des gespeicherten Passworts erfordert jetzt erst ein vollständiges Löschen, damit es nach einer Teilbearbeitung nicht ausgespäht werden kann

Sortier-Flackern & Ersteinrichtungs-Gate (c58001a, 3ebe7d2)

  • Jeder Ordnerbereich sortiert nach seiner eigenen Einstellung, um ein visuelles Flackern zu verhindern, und das Remote-Ziel-Gate wird während der Ersteinrichtung unterdrückt

Umgang mit Sync-Ordnern (d5f606a, ed472a1, 0c6e0e9)

  • Der Verbindungstest erkennt einen vorhandenen Markdown-Ordner, der Ordnerwechsel-Dialog bleibt bis zum Abschluss der Wiederherstellung offen, und Ordner-Metadaten werden vor einer REPLACE-Wiederherstellung zurückgesetzt

Liste & Editor-Feinschliff (9dbfd98, d0a4f9e, 24a2a5b)

  • Der Leerzustand ist scrollbar, damit Pull-to-Refresh funktioniert, unbenannte Notizen füllen den Titel mit einer Inhaltsvorschau, und der Kalenderexport behält den vollständigen Checklisten-Text im Titel

🌍 Übersetzungen

  • Italienisch (48%): GVE
  • Chinesisch (Vereinfacht) (99%): @heretic43

[2.10.0] - 2026-07-01

✨ Neue Funktionen

Biometrische App-Sperre (a6e1f20, a2f0628)

  • Optionale App-Sperre via Fingerabdruck, Gesichtserkennung oder Geräte-PIN, mit konfigurierbarer Karenzzeit vor der erneuten Sperrung
  • FLAG_SECURE blockiert Screenshots/Bildschirmaufnahmen und verbirgt Inhalte im Recents-Thumbnail während die App gesperrt ist

Konfigurierbare Papierkorb-Aufbewahrung (e6b2df3)

  • Einstellbar, wie lange gelöschte Notizen im Papierkorb bleiben, bevor sie endgültig gelöscht werden: Sofort, 7, 14, 30 (Standard) oder 90 Tage
  • Danke an @xdpirate für die Anfrage!

Formatiertes Einfügen (bf003d1)

  • HTML-Einfügen aus Telegram, Word, Google Docs oder einem Browser wird jetzt zu Markdown konvertiert (Fett/Kursiv/Links/Listen/Überschriften/Code/Zitate) statt die Formatierung zu verwerfen, mit Klartext-Fallback

Einklappbare und verschiebbare Bereiche (6d50b81)

  • Angeheftet/Ordner/Notizen-Bereichsköpfe lassen sich einklappen und per Long-Press neu anordnen; beides bleibt über Neustarts erhalten

🐛 Bug-Fixes

Scroll-Hänger bei langen Vorschauen (a51394c)

  • Notiz-Vorschautext wird jetzt vor dem Layout gekürzt, was ein ANR beim Scrollen von Listen mit sehr langen Notizen verhindert

Sicherheits-Einstellungen-Untertitel (ddbc3a4)

  • Der Sicherheit-Untertitel zeigt jetzt „Biometrische Entsperrung aus" statt nur „Aus"

⚡ Performance-Verbesserungen

Schnellere Notiz-(De-)Serialisierung (452e557, e084759)

  • Note.fromJson() streamt jetzt JSON statt einen vollständigen Parse-Baum via Reflection aufzubauen, was den Kaltstart bei tausenden Notizen beschleunigt

Schnelleres Listen-Rendering & Sync-Buchführung (845c3ec, 4d7a240, 50bfebe, 1cba7a7)

  • Aufteilung in angeheftet/nicht angeheftet und Checklisten-Vorschau-Sortierung werden gecacht statt bei jedem Frame neu berechnet
  • Notiz-Sortierung/-Filterung/-Suche laufen jetzt außerhalb des Hauptthreads
  • DeletionTracker wird von einer Map statt einer Liste unterstützt
  • NotesStorage.loadAllNotes liest Dateien parallel

🌍 Übersetzungen

  • Spanisch (66%): @PaikLC / Francisco Isaac Ordoñez Pedrero, @Kiimby / Kimby
  • Indonesisch (100%): @arifpedia / Arif Budiman
  • Italienisch (46%): GVE
  • Norwegisch (Bokmål) (100%): @xdpirate
  • Chinesisch (vereinfacht) (100%): @heretic43

[2.9.0] - 2026-06-22

✨ Neue Funktionen

Changelog in der App (60a275c, d4e2702, db7a682)

  • Ein nativer Changelog-Bildschirm ist jetzt direkt in der App verfügbar, erreichbar über die Einstellungen und einen "Changelog anzeigen"-Button im "Neuigkeiten"-Fenster
  • Changelog und Mitwirkende sind im Über-Bereich unter einem Abschnitt "App" gruppiert

Mitwirkende-Bildschirm (5c614ca)

  • Ein neuer Mitwirkende-Bildschirm im Über-Bereich würdigt alle, die zum Projekt beigetragen haben

Markierbare Markdown-Vorschau (b07a112)

  • Text in der Markdown-Vorschau kann jetzt markiert und kopiert werden
  • Danke an @victoriamontero443-wq für den Vorschlag!

🐛 Bug-Fixes

Sichtbarkeit der Entwickleroptionen (fb9a97f)

  • Einmal freigeschaltet, bleiben die Entwickleroptionen bis zum Neustart des App-Prozesses sichtbar, statt zu verschwinden

🌍 Übersetzungen

  • Spanisch (64%): @PaikLC / Francisco Isaac Ordoñez Pedrero
  • Chinesisch (vereinfacht) (99%): @heretic43

[2.8.0] - 2026-06-16

✨ Neue Funktionen

Papierkorb (1d6fa60, d2dd414)

  • Das Löschen einer Notiz verschiebt sie nun in einen Papierkorb, statt sie zu entfernen; ein neuer Papierkorb-Bildschirm (über die Einstellungen erreichbar) erlaubt das Wiederherstellen oder endgültige Löschen
  • Notizen im Papierkorb werden nach einer Aufbewahrungsfrist automatisch geleert
  • Auf dem Server gelöschte Notizen landen im lokalen Papierkorb, statt zu verschwinden - so lässt sich auch eine Server-Löschung wiederherstellen (7d9d4b3)

Lokale Ordner (6a0dd97, 72cb314)

  • Ordner können nun als lokal markiert werden, sodass ihre Notizen nie zum WebDAV-Server synchronisiert werden - ideal für private oder gerätespezifische Notizen
  • Danke an @alas-he für den Vorschlag (Diskussion #88)!

Scrollbares Notizlisten-Widget (ca30ad7, 0566ce9)

  • Ein neues Homescreen-Widget zeigt eine scrollbare Liste deiner Notizen mit Inline-Markdown-Formatierung (11c069f)
  • Optionen, um Kopfzeile, angeheftete Notizen und Ordner auszublenden, nach Ordner zu filtern und die Schriftgröße einzustellen
  • Danke an @lincomax für die Vorschläge!

Live-Markdown im Editor & in Vorschauen (9c96cc0, 17ad8d8)

  • Der Editor hebt Markdown nun live hervor und erlaubt das Abhaken von Aufgaben per Tipp
  • Notizlisten- und Raster-Karten-Vorschauen rendern Markdown, inklusive ☑/☐-Präfixen für Checklisten und gestylter Code-Blöcke (f48209a, a4324a6)

Schriftgrößen-Optionen (30de416, 2cda14d)

  • Neue app-weite Schriftgröße plus eine unabhängige Schriftgröße pro Widget
  • Danke an @lincomax für den Vorschlag!

Checklisten-Einträge in den Kalender (82f3bfc)

  • Jeder Checklisten-Eintrag hat nun einen Eintrag „In Kalender eintragen" im Kontextmenü
  • Danke an Papa für den Vorschlag!

Standard-Öffnungsmodus (5a70f14, 1882210)

  • Wähle, ob Textnotizen standardmäßig im Bearbeiten- oder Vorschaumodus öffnen (jetzt standardmäßig Bearbeiten)

🐛 Bug-Fixes

Sync-Loop- & Ordner-Fixes (516cd15, 741ba37, f3062c0)

  • Bearbeitungen mit gleichem Zeitstempel übernehmen nun die Server-Kopie, um eine Upload/Download-Schleife zu durchbrechen
  • Beim Umbenennen eines Ordners verschobene Notizen werden nicht mehr vom Server gelöscht
  • Das Verschieben einer Notiz in einen lokalen Ordner wird korrekt als Server-Löschung vorgemerkt

Backup enthält Ordner-Metadaten (a854fb9)

  • Backups speichern und stellen nun Ordner-Metadaten wieder her, statt sie beim Wiederherstellen zu verlieren

Benachrichtigungsberechtigung nur einmal anfragen (58f6e7c)

  • Die Benachrichtigungsberechtigung wird nun nur einmal automatisch angefragt statt bei jedem Start
  • Danke an @xdpirate für die Meldung!

Editor- & Markdown-Politur (552f44d, 27ae90d, e15ecb0)

  • Die Markdown-Symbolleiste erscheint nur, wenn das Inhaltsfeld fokussiert ist, und ist beim Bearbeiten des Titels ausgeblendet
  • Aneinandergrenzende Inline-Trennzeichen und die Kursiv-Erkennung rendern nun korrekt

Widget-Fixes (ec761f7, a9aa973, cb6a937)

  • Korrekte Sichtbarkeit von Kopf-/Angeheftet-Bereich, Größenänderung auf volle Höhe und automatische Tag-/Nacht-Textfarbe

Checklisten-Animationsfixes (a6002fd, cac2e3b, de5347a)

  • Leere Einträge bleiben erhalten, wenn der Editor in den Hintergrund geht, die Abhak-Animation läuft bei Rückgängig/Wiederholen, und Einträge sortieren sich sofort nach der Umwandlung von Notiz zu Checkliste

Weitere UI-Fixes (5f3c10e, c3bf07f, 40c9148)

  • Hilfe-Button und Pull-to-Refresh reagieren nun sofort auf Änderungen der Serverkonfiguration
  • Der Ordner-erstellen-Dialog wird nicht mehr zu breit, und die Mehrfachauswahl-Leiste zeigt nur noch die Anzahl

🔧 Technisches

Dependency-Updates (4d5cc1e)

  • Compose BOM 2026.03.00 - 2026.05.01 (Foundation 1.11, Material3 1.4)
  • Material 1.13.0 - 1.14.0
  • Coroutines 1.10.2 - 1.11.0
  • Gson 2.13.2 - 2.14.0
  • WorkManager 2.11.1 - 2.11.2
  • MockK 1.14.9 - 1.14.11
  • Compose Foundation 1.11 unterdrückt animateItem-Platzierungsanimationen während animateScrollToItem(); der upstream Rollout-Flag wurde deaktiviert, um das Verhalten von 1.10 wiederherzustellen, bis der Fix upstream landet (b/493183465)

[2.7.2] - 2026-06-07

🐛 Bug-Fixes

Sync: Ordner & falsches Gelöscht-Flag auf no-ETag-Servern repariert (1d3a5a1)

  • Auf WebDAV-Servern ohne ETags konnten übersprungene Notizen dauerhaft einen veralteten folderName oder ein falsches DELETED_ON_SERVER-Flag behalten; beide Fälle werden jetzt beim Überspringen korrigiert – ohne Re-Upload-Loop

UI: Notizliste startet nach Kaltstart wieder oben (a9d4533)

  • Das Staggered-Grid scrollte beim initialen Laden automatisch von Index 0 weg (Compose-Foundation-Quirk) und versteckte den „Angeheftete"-Abschnittskopf; ein Top-Settle-Guard hält die Liste nun oben, bis das Layout stabil ist

Widget: OptionsBar-Icons im hellen Modus sichtbar (c448a43)

  • Widget-OptionsBar-Icons (Sperren, Aktualisieren, Einstellungen, In-App-Öffnen) hatten eine hartcodierte weiße Füllfarbe und waren auf hellen Hintergründen unsichtbar; sie passen sich jetzt über ColorFilter.tint(onSurface) dem System-Theme an

🌍 Übersetzungen

  • Spanisch: weiter ausgebaut — Francisco Isaac Ordoñez Pedrero
  • Indonesisch: aktualisiert — Arif Budiman
  • Vereinfachtes Chinesisch: aktualisiert — heretic43
  • Norwegisch Bokmål: aktualisiert — xdpirate

[2.7.1] - 2026-06-02

🐛 Bug-Fixes

Ordner-Sync: Waisendateien auf dem Server (77b4029)

  • Notizen, die beim Ordner-Löschen zurück ins Root verschoben werden, werden nun für die Server-Löschung aus ihrem alten Unterordner-Pfad vorgemerkt – keine verwaisten Dateien mehr auf dem Server
  • URL-kodierte Ordnernamen (Leerzeichen als %20) führten dazu, dass deleteServerFolderIfEmpty die Bereinigung übersprungen hat – behoben
  • Leere Server-Ordnerverzeichnisse werden nun nach Batch-Löschungen aufgeräumt (4e05ad1)

Ordner-Sync: Endlosschleife PENDING nach Ordner-Verschieben (18f186a)

  • Der Server-Scan dedupliziert Notizen jetzt nach noteId; nach einem Ordner-Move konnte dieselbe Notiz in mehreren WebDAV-Verzeichnissen auftauchen und widersprüchliche Ordnerzuweisungen verursachen, was zu einem endlosen PENDING-Zustand führte

Sync: Stilles Sync überschreibt keine sichtbaren Banner mehr (1f43b50)

  • Stille Hintergrund-Syncs können jetzt kein Ergebnis-Banner mehr leeren oder ersetzen, dessen Auto-Hide-Timer noch läuft

UI: Banner-Inhalt flackerte beim Ausblenden (af07399)

  • Behoben: AnimatedContent erhielt IDLE während der Ausblend-Animation und renderte kurz den leeren Zustand; der sichtbare Inhalt bleibt jetzt stabil bis die Animation abgeschlossen ist

UI: Ordner-Dialog-Polishing (fb72623)

  • Tastatur öffnet sich jetzt automatisch beim Öffnen des Dialogs (kein extra Tap mehr nötig)
  • Erster Buchstabe des Ordnernamens wird automatisch großgeschrieben

UI: Falscher Plural-String beim Ordner-Löschen (99dfbae)

  • Das Bestätigungs-Banner nach dem Ordner-Löschen nutzt jetzt die korrekte Plural-Ressource je nachdem, ob Notizen nur lokal oder auch auf dem Server gelöscht wurden

🌍 Übersetzungen

  • Spanisch: von teilweise auf breite Abdeckung erweitert, Terminologie-Fix (borrareliminar) (2f19d18), Locale in locales_config registriert (974efe1)
  • Vereinfachtes Chinesisch: 7 Debug-Screen-Strings ergänzt (100% Abdeckung) (2f19d18)

[2.7.0] - 2026-05-30

✨ Neue Features

Ordner-Unterstützung (e38553d)

  • Notizen können in Ordner organisiert werden; jede Notiz trägt ein optionales folderName-Feld
  • Ordner erstellen, umbenennen und löschen über dedizierte CRUD-Dialoge
  • Notizen per Bottom-Sheet in der Notizliste in Ordner verschieben
  • Ordner-Navigation in der Hauptansicht filtert die Liste nach Ordner
  • Ordner werden mit Tombstone-basiertem Lösch-Tracking persistiert (FolderStore)
  • Ordner synchronisieren bidirektional via WebDAV mit ordner-bewusstem URL-Routing (FolderSyncManager)
  • Danke an @happy-turtle und @racehd für die Idee, und an @afoni95 fürs Testen!

🐛 Bug-Fixes

Raster & Angepinnte Notizen – Polishing (1e02895)

  • Pop-in-Artefakt beim Erscheinen angepinnter Notizen im gestaffelten Raster behoben
  • Scroll-Position wird beim Filterwechsel wieder auf den Anfang zurückgesetzt (2375c97)
  • Berechnungen der gestaffelten Raster-Aufteilung gecacht, weniger Layout-Stress (dc117ba)
  • Visuellen Glitch beim GridColumnChip in der Spaltenauswahl der Anzeigeeinstellungen behoben (27a7c0a)

🌍 Übersetzungen


[2.6.0] - 2026-05-24

✨ Neue Features

Angepinnte-Notizen-Bereich (e849bdf)

  • Notizen können per Multi-Select-Batch-Aktion angepinnt werden und erscheinen in einem eigenen „Angepinnt"-Bereich oberhalb der regulären Liste
  • Bereich nur sichtbar, wenn mindestens eine Notiz angepinnt ist; angepinnte Karten zeigen ein Pin-Symbol
  • Funktioniert in Listen- und Rasteransicht
  • Vorgeschlagen von @ASFHU, @james0336, @isawaway!

Typkonvertierung: Text ↔ Checkliste (714a7e6)

  • Jede Textnotiz lässt sich in eine Checkliste umwandeln und zurück; GFM-Checkbox-Notation (- [ ] / - [x]) bleibt in beide Richtungen erhalten
  • Vollständige Rückgängig/Wiederholen-Unterstützung für Typkonvertierungen

Bare-URLs im Markdown-Preview als Links (745a4cd)

  • Nackte http://- und https://-URLs werden im Markdown-Preview automatisch als anklickbare Links erkannt
  • Abschließende Satzzeichen werden nicht in den Link einbezogen
  • Vorgeschlagen von @james0336, @isawaway!

„Text kopieren" im Editor-Überlaufmenü (83e6a3c)

  • Kopiert den vollständigen Notizinhalt (Titel + Text) mit einem Tippen in die Zwischenablage; Android 13+ zeigt die Systembestätigung, ältere Versionen eine Snackbar
  • Danke an @xdpirate für den Vorschlag!

Geteilten Text an bestehende Notiz anhängen (dc59351)

  • Der Teilen-Intent bietet jetzt eine dritte Option, um freigegebenen Text an eine bestehende Notiz anzuhängen
  • Eine Notizauswahl (sortiert nach zuletzt geändert) ermöglicht die Auswahl; der Editor öffnet sich mit dem zusammengeführten Inhalt zur Kontrolle

🐛 Bug-Fixes

Einstellungen reagieren nicht auf Offline-Modus-Umschalten (b388016)

  • isServerConfigured war eine einfache Funktion, die einmalig pro Composable aufgerufen wurde; durch Umstellung auf StateFlow reagiert die UI jetzt sofort auf Änderungen
  • Statusbeschriftungen unterscheiden nun korrekt zwischen „Offline-Modus aktiv" und „Kein Server konfiguriert"

Parallele-Verbindungen-Einstellung im Offline-Modus aktiv (c6cf4e5)

  • Die Radiogruppe für parallele Verbindungen blieb interaktiv, während alle anderen Sync-Einstellungen ausgegraut waren; sie wird jetzt korrekt deaktiviert

Checkliste: Unicode-Aufzählungszeichen beim Einfügen via Teilen-Intent (8e67ccd)

  • • Element (U+2022), ✓ Element, ☑ Element und ✔ Element werden beim Einfügen via Teilen-Intent jetzt korrekt normalisiert

Checkliste: Trennlinie springt beim Einblenden/Ausblenden der Tastatur (8295522)

  • Der Trenner zwischen abgehakten und nicht abgehakten Items fehlte animateItem() und sprang anstatt zu gleiten, wenn die Bildschirmtastatur die Liste verkleinerte

Checkliste: Gemischte GFM- und Plaintext-Zeilen nicht zeilenweise geparst (2bd8106)

  • Gemischte Eingaben (teils GFM, teils Klartext) wurden als Rohtext behandelt und ließen - [ ] Milch als wörtlichen Itemtext stehen; der Parser klassifiziert nun jede Zeile einzeln

[2.5.2] - 2026-05-22

🐛 Bug-Fixes

Navigationsleistenfarbe wird bei Android < 10 im Dunkelmodus nicht gesetzt (5554710)

  • Auf API < 30 blieb die Navigationsleiste hell, obwohl Dunkelmodus aktiv war; das Window-Flag navigationBarColor wird jetzt explizit für diese Geräte gesetzt
  • Danke an dfxflkbvnsr für den Hinweis!

Snackbar verdeckt FAB auf dem Hauptbildschirm (a9ff4f5)

  • Die Snackbar erschien hinter dem Floating Action Button; sie wird jetzt korrekt oberhalb des FAB angezeigt
  • Danke an dfxflkbvnsr für den Hinweis!

Zurück-Taste wird im Auswahlmodus nicht abgefangen (b8689eb)

  • Ein Druck auf Zurück beim Auswählen von Notizen beendete den Auswahlmodus nicht; der Back-Handler wird jetzt korrekt registriert, sobald die Auswahl aktiv ist
  • Danke an dfxflkbvnsr für den Hinweis!

Farbauswahl im Multi-Select zeigt keine aktuelle Farbe (1365893)

  • Der Farb-Picker im Multi-Select öffnete sich immer ohne vorausgewählte Farbe; er markiert jetzt die gemeinsame Farbe, wenn alle ausgewählten Notizen dieselbe haben

Notizfarbe geht beim Wechsel in den Auswahlmodus verloren (9c4cc5d)

  • Ein Tippen auf eine Notizkarte zum Starten der Auswahl setzte die Notizfarbe auf „Keine" zurück; die Farbe bleibt jetzt erhalten

Checklisten: UNCHECKED_FIRST-Sortierung springt beim Umschalten (2c008fd)

  • UNCHECKED_FIRST teilte sich denselben sortedBy { originalOrder }-Zweig wie MANUAL, wodurch Items beim Abhaken sprangen (Abgehakte landeten am Ende der abgehakten Gruppe, Abgehobene an der Spitze der nicht-abgehakten Gruppe)
  • Behoben durch einen eigenen stabilen Filter-Zweig für UNCHECKED_FIRST, der die relative Reihenfolge innerhalb jeder Gruppe erhält; MANUAL behält die originalOrder-basierte Wiederherstellung unverändert
  • Danke an @WuTangWilli für den Hinweis!

🌍 Übersetzungen

  • Indonesisch (100 %): @arifpedia / Arif Budiman
  • Chinesisch (Vereinfacht) (100 %): heretic43
  • Hindi (teilweise): Silent Coder

[2.5.1] - 2026-05-16

🎉 Erstes Google-Play-Production-Release — v2.5.0 war als initialer Production-Build vorbereitet, wurde aber nie im Play Store veröffentlicht. v2.5.1 ist die Version, die tatsächlich in Production geht. Sie vervollständigt das Notizfarben-Feature aus v2.5.0 durch das eine fehlende Stück: die Sortierung nach Farbe.

✨ Neue Features

Notizlisten-Farb-Sortierung (93f7852)

  • Neue Option Farbe im Sort-Dialog gruppiert Notizen in kanonischer Palettenreihenfolge (Rot → Orange → Gelb → Grün → Blaugrün → Blau → Dunkelblau → Lila → Rosa → Braun → Grau)
  • Farblose Notizen landen am Ende (aufsteigend) bzw. am Anfang (absteigend) der Liste
  • Innerhalb einer Farbgruppe werden Notizen nach Änderungsdatum absteigend sortiert — konsistent mit der bestehenden Typ-Sortierung
  • Die Sortierauswahl bleibt über App-Neustarts hinweg in den SharedPreferences erhalten

[2.5.0] - 2026-05-15

🎉 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.

✨ Neue Features

Google-Keep-Import (#65)

  • Notizen direkt aus einer Google-Keep- / Google-Takeout-.zip importieren — komplett auf dem Gerät, kein Upload
  • Vorab-Analyse klassifiziert das Archiv (aktiv / archiviert / Papierkorb / Labels / geteilt / Gesamtgröße), bevor du bestätigst
  • Konflikt-Strategie pro Lauf: immer neu erstellen (Standard), überspringen, falls vorhanden oder ersetzen, falls vorhanden — Vergleich per Inhalts-Hash (Titel + Body + Checklisten-Items)
  • Optionale Schalter für archivierte und Papierkorb-Notizen
  • Eingerückte Checklisten bis 3 Ebenen erhalten (DnD-Verhalten unverändert)
  • Keep-color wird mitimportiert und sofort angezeigt (siehe Notizfarben unten); isPinned wird im Notiz-Modell gespeichert (Anzeige folgt in einem späteren Release)
  • Labels werden in einer separaten notes_labels.json-Indexdatei gespeichert
  • Abbrechbar während des Imports; bereits importierte Notizen bleiben erhalten; Ergebnis-Dialog zeigt importiert / ersetzt / übersprungen / Fehler mit ausklappbarer Fehlerliste
  • Bestätigungs-Schritt bei Archiven über 200 MB
  • Einmaliger Auto-Sync am Ende (nur wenn ≥ 1 Notiz importiert oder ersetzt wurde; respektiert vorhandenes Sync-beim-Speichern-Gate, Throttle und Offline-Modus)
  • Zu finden unter Einstellungen → Import → Google Keep importieren
  • Danke an @simianaya für den Feature-Wunsch!

Notizfarben (#65)

  • 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)
  • Notizkarten auf dem Startbildschirm werden in der gewählten Farbe eingefärbt (7ced207)
  • Neuer Farbwähler als Bottom-Sheet (cd0361e)
  • Farbe einer Notiz im Editor über das Overflow-Menü setzen (b244db9)
  • Mehrfachauswahl auf dem Startbildschirm: Farbe für mehrere Notizen gleichzeitig setzen (7341462)
  • Im Editor wird die Farbe als dezenter 3-dp-Akzentstreifen statt als ganzflächige Tönung dargestellt — angenehm zu lesen (bd5c943)
  • Farben aus Google-Keep-Importen werden automatisch auf diese Palette gemappt
  • Danke an @simianaya für den Feature-Wunsch!

Konflikt-Strategie für lokale & WebDAV-Importe

  • Die Konflikt-Strategie, die bereits beim Keep-Import bestand, gibt es jetzt auch für den lokalen Datei-Import (3a3d55c) und den WebDAV-Scan-Import (d369536)
  • 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
  • Der Button für den lokalen Datei-Import nutzt jetzt den Standard-SettingsButton für ein einheitliches Erscheinungsbild (75f4dbd)

Alle auswählen / Auswahl aufheben beim WebDAV-Import (d928ddb)

  • Nach dem Scan eines WebDAV-Ordners kannst du mit einem einzigen Toggle alle Ergebnisse auf einmal an- oder abwählen
  • Spart bei großen Notizsammlungen viel Tippen

Notizlisten-Farbfilter (e773a05)

  • Palette-Icon-Chip in der Filterleiste öffnet ein Farbfilter-Dropdown mit der Anzahl Notizen je Farbe
  • Kombiniert sich mit dem bestehenden Typ-Filter (UND-Logik) und wird in den SharedPreferences gespeichert
  • Text- und Listen-Chips auf reine Icon-Darstellung umgestellt für ein einheitlicheres Erscheinungsbild
  • Schließt #65

✨ Verbesserungen

Checklisten-Tap-Animation

  • 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, 2551d21)
  • Der erste Eintrag „springt" beim Öffnen des Editors nicht mehr — die Placement-Animation wird beim ersten Render unterdrückt (2515874)
  • Die Liste behält ihre Scroll-Position korrekt bei, wenn Einträge zwischen dem unchecked- und checked-Zweig wechseln (9792968)

🐛 Fehlerbehebungen

  • Importierte Notizen bekommen immer SyncStatus.PENDING (51ea959) — importierte Notizen werden jetzt zuverlässig vom nächsten Sync-Lauf erfasst, egal aus welcher Quelle sie kommen
  • Editor-Autosave berücksichtigt Farbänderungen (a0a34b9) — eine im Editor geänderte Notizfarbe wird nicht mehr vom No-Change-Guard verworfen

♻️ Intern

SyncScheduler extrahiert

  • 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)

APK-Größe −11 % durch Locale- & Ressourcen-Filterung (5a631cb)

  • localeFilters auf die 10 unterstützten Sprachen beschränkt — entfernt ungenutzte Übersetzungen aus resources.arsc
  • Striktes Ressourcen-Shrinking (keep.xml) — sicher, da die App keine dynamischen Ressourcen-Zugriffe hat
  • Packaging-Excludes um Build-time-Metadaten erweitert
  • Ergebnis: 5,23 MB → 4,65 MB (−577 KB, −11 %); resources.arsc: 1,49 MB → 0,95 MB (−540 KB)

📚 Dokumentation

  • Neue Anleitung: project-docs/simple-notes-sync/v2.5.0/google-keep-import-user-guide.de.md (EN + DE)
  • Neues QA-Cheatsheet: project-docs/simple-notes-sync/v2.5.0/google-keep-import-adb-tests.md

🙏 Danksagungen

  • @simianaya — für den Wunsch nach Google-Keep-Import und Notizfarben (#65)
  • Alle, die frühe Google-Keep-Exporte getestet und Sonderfälle gemeldet haben
  • Alle Beta-Tester, die uns zum ersten Play-Store-Production-Release geholfen haben — danke! 🎉

[2.4.0] - 2026-05-04

✨ Neue Features

Persistentes Sync-Debug-Log (1de5fdb, 1234f6c, d8d4284, 13defa9, 62e75e7)

  • Neuer persistenter SyncDebugLogger, der strukturierte Einträge in sync_debug.log schreibt — hilft beim Diagnostizieren von Hintergrund-Sync-Problemen
  • Loggt jedes SyncWorker-Ergebnis (Start, Erfolg, Soft-Fehler, Retry, finales Scheitern)
  • Schema um attempt-Zähler und holder (Prozess-Tag) erweitert, um App-/Worker-Kontexte zu unterscheiden
  • WIFI_CONNECT-Events mit first|change-Grund annotiert
  • Expliziter finaler Status, wenn WorkManager Retries verwirft — keine unsichtbaren Fehler mehr
  • Standardmäßig deaktiviert (26cdf47) — in den Einstellungen → Debug aktivierbar, um beim Melden von Sync-Problemen Logs zu sammeln

Cold-Start-Guard nach langer Prozess-Pause überspringen (17d57d5)

  • 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

🐛 Fehlerbehebungen

Zuverlässiger WiFi-Connect-Sync-Trigger

  • Validiertes WiFi (nicht nur SSID) erforderlich, bevor Sync ausgelöst wird (a03eadf)
  • WiFi-Trigger-Sync wird bei vorübergehender Nicht-Erreichbarkeit erneut versucht (bea0558)
  • Globaler Cooldown wird für WiFi-Connect-Trigger umgangen — der erste Sync nach Reconnect läuft tatsächlich (5195ee0)
  • WiFi-Trigger-Backoff bei 30 s linear gedeckelt, um ausufernde Verzögerungen zu vermeiden (5ff2a70)
  • WiFi-Fallback-Intervall auf 30 min verkürzt für schnellere Process-Death-Recovery (42e6a64)

Günstigere, robustere Erreichbarkeits-Prüfung

  • Günstiger Reachability-Check vor teurem PROPFIND (f46f326)
  • monitoringStartTime als volatile markiert und auf elapsedRealtime() umgestellt — vermeidet Wall-Clock-Drift (7f980fb)
  • Redundanten onResume-Sync-Cooldown entfernt (69a7b05)

Einstellungen & Logging

  • Debug-Log-Export auf allen Geräten robust (SAF-Edge-Cases behandelt) (bbf466b)
  • Der „Logs löschen"-Button löscht jetzt auch sync_debug.log (caa329e)

♻️ Intern

WebDAV-Server-Migration (41ecb13)

  • Self-hosted Referenz-Server von bytemark/webdav auf hacdias/webdav migriert — aktive Wartung und bessere Protokoll-Abdeckung
  • Keine Auswirkungen für App-Nutzer; betrifft nur den optionalen mitgelieferten Server in server/

🌍 Übersetzungen

🙏 Danksagungen

Ein riesiges Dankeschön an die Weblate-Übersetzer, die Simple Notes Sync in immer mehr Sprachen verfügbar machen:

  • Arif Budiman — Indonesisch
  • xdpirate — Norwegisch Bokmål
  • Jean-Pierre — Italienisch
  • Silent Coder — Hindi
  • PONYATIN — Russisch
  • heretic43 — Chinesisch (Vereinfacht)

[2.3.1] - 2026-04-24

Nur als Beta-Release im Google Play veröffentlicht. Nicht auf F-Droid erschienen; die Änderungen sind in v2.4.0 enthalten.

🐛 Fehlerbehebungen

Sichtbarkeits-bewusster Fehler-Banner bei Soft-Sync-Fehlern (c4a40f8)

  • Stille Hintergrund-Sync-Fehler erscheinen nicht mehr als roter Fehler-Banner — sie setzen sauber zu IDLE zurück
  • Fehler werden nur dann zu einem sichtbaren Banner, wenn der Nutzer die App tatsächlich aktiv ansieht
  • Neue SyncStateManager.errorIfVisible()-API wird von SyncWorker und MainViewModel.triggerAutoSync für alle Soft-Fehler-Pfade verwendet
  • Verhindert verwirrende kurzzeitige Warnungen bei Hintergrund-Retries

[2.3.0] - 2026-04-18

🛡️ Sicherheit

WebDAV-Zugangsdaten werden jetzt verschlüsselt gespeichert (bf117f8)

  • WebDAV-Benutzername und -Passwort wurden bisher als Klartext in regulären SharedPreferences gespeichert
  • Migration zu EncryptedSharedPreferences mit AES256-GCM-Verschlüsselung
  • Einmalige Auto-Migration beim ersten Start: bestehende Zugangsdaten werden in den verschlüsselten Speicher übernommen und aus dem Klartext-Speicher entfernt

✨ Neue Features

Akkuoptimierung-Dialog bei Sync-Aktivierung & Migration (da2ab36)

  • Wenn der Nutzer den Offline-Modus deaktiviert, prüft die App sofort die Akkuoptimierungs-Ausnahme und zeigt den System-Dialog bei Bedarf
  • Einmalige Migration für bestehende Nutzer: Nutzer mit bereits aktiviertem Sync, die noch nie gefragt wurden, sehen den Dialog einmalig beim nächsten App-Start
  • Verwendet neuen SharedPreferences-Key battery_opt_migration_shown

🐛 Fehlerbehebungen

Markdown-Auto-Sync löst beim Speichern nicht aus (1756af4)

  • SharedPreferences für Markdown-Export/Auto-Import wurden erst nach erfolgreichem Initial-Export gespeichert — bei Fehler (HTTP 405, Timeout, Netzwerkfehler) wurden die Prefs nie gesetzt und On-Save-Export hat nie ausgelöst
  • Prefs werden jetzt sofort nach Server-Konfigurations-Validierung gespeichert; Initial-Export ist Best-Effort
  • HTTP-405-Fallback in ensureMarkdownDirExists() hinzugefügt (List-after-failed-exists-Pattern)
  • Danke an @minosimo für den detaillierten Bug-Report mit Logs! (#50)

MKCOL-404-Fehlerbehandlung und WebDAV-Validierung verbessert (8c5907a)

  • SafeSardineWrapper.createDirectory(): 404 mit list()-Fallback behandeln (analog zur bestehenden 405-Behandlung)
  • WebDavSyncService.testConnection(): WebDAV-Fähigkeit via PROPFIND nach HEAD-Check verifizieren, um falschen „Erreichbar"-Status zu verhindern
  • SyncExceptionMapper: MKCOL-Fehler erkennen und benutzerfreundliche Meldung mit WebDAV-URL-Hinweis anzeigen
  • Danke an @Ichigo-Meow für die Meldung! (#55)

Phantom-„Untitled"-Notizen vom WebDAV-Root-Scan stoppen (fab23eb)

  • Fremde JSON-Dateien im WebDAV-Root (z. B. info.json) wurden bei jedem Sync geparst und erzeugten eine neue „Untitled"-Geistnotiz mit zufälliger UUID — als SYNCED gespeichert, sofort als DELETED_ON_SERVER markiert, und so endlos akkumuliert
  • Der v1.2.0-Root-Fallback im normalen Sync-Pfad ist deaktiviert; der Migrations-Scan läuft weiterhin in restoreFromServer()
  • UUID-Format- und id-vs-Dateinamen-Prüfungen in NoteDownloader Phase 2 als Defense-in-Depth ergänzt
  • Danke an @angeld-jr2 für das ausführliche Debug-Log, das die Diagnose ermöglichte! (#62)

Notizen ohne Titel in Backup-Validierung erlauben (d41d02b)

  • Backup-Wiederherstellung lehnte v2.2.0-Backups mit titellosen Notizen (z. B. Checklisten) ab
  • validateBackup() verhält sich nun wie der Editor: eine Notiz ist nur ungültig, wenn Titel UND Inhalt/Checklisten-Items leer sind
  • Danke an @angeld-jr2 für die Meldung!

HTTP 401 beim Verzeichnis-Anlegen als Auth-Fehler erkennen (02c3f77)

  • ensureNotesDirectoryExists() und ensureMarkdownDirectoryExists() haben 401 verschluckt und zu MKCOL durchgereicht — Anzeige war „Sync-Ordner kann nicht erstellt werden" statt „Authentifizierung fehlgeschlagen"
  • Auth-Fehler werden jetzt vor MKCOL erkannt und durchgereicht; Defense-in-Depth in SyncExceptionMapper

Widget-Checklisten-Sortierung mit Editor für alle Sortier-Optionen abgeglichen (dcc740b)

  • Widget ToggleChecklistItemAction unterstützte nur MANUAL und UNCHECKED_FIRST
  • Gemeinsame ChecklistSorter-Utility extrahiert und in Widget und Editor eingesetzt — konsistente Sortierung für alle sieben Optionen
  • Danke an MrsMinchen für den Beitrag!

Auto-Speichern bei Änderung der Sortier-Option auslösen (06c5228)

  • sortChecklistItems(option) setzte weder isDirty noch scheduleAutosave — Sortier-Änderungen gingen ohne explizites Speichern verloren
  • Widget-Updates auch nach Auto-Save und saveOnBack hinzugefügt
  • Danke an freemen für die Meldung!

Widget-Inhalt kürzen, um TransactionTooLargeException zu verhindern (7aba796)

  • Text-Notizen auf 100 Zeilen, Checklisten auf 100 Items im Widget begrenzt — sehr lange Notizen sprengten das 1MB-Binder-IPC-Limit für RemoteViews

Widget-Empty-State lokalisieren und Tap-to-Reconfigure (0b7dbf8)

  • Hardcoded „Note not found" durch String-Resource ersetzt
  • Tippen aufs Widget öffnet die Konfigurations-Activity, sodass Nutzer nach gelöschten Notiz-Daten wiederherstellen können

NotesStorage-Datei-I/O vom Main Thread weg (645ce9e)

  • saveNote, loadNote, loadAllNotes, deleteNote sind jetzt suspend-Funktionen auf Dispatchers.IO
  • Behebt Race-Condition-Crash in loadAllNotes() (FileNotFoundException zwischen listFiles/readText)
  • Behebt leeres TextFieldState beim ersten Öffnen einer Notiz nach App-Start
  • Behebt fälschliches PENDING-Markieren bei Zurück-Navigation aus leerem Editor
  • Behebt „Notiz nicht gefunden"-Anzeige im Widget: loadNoteSync() läuft jetzt innerhalb provideContent, sodass jedes Widget-Update frische Daten lädt

Editor-State-Flackern beim asynchronen Notiz-Laden verhindern (b7b3a1c)

  • Async-Laden zeigte 1+ Frames lang TEXT-Mode-Defaults, was bei Checklisten kurzzeitig falschen TopBar-Titel und falschen Inhalts-Typ verursachte
  • isNewNote=false wird jetzt synchron vor der Coroutine gesetzt; isLoading gated den gesamten Screen

Mutex-geschütztes Deletion-Tracking nutzen (e777259)

  • deleteNote() nutzt jetzt trackDeletionSafe(), um Race Conditions bei Batch-Löschungen zu verhindern; die ungeschützte Legacy-Variante ist deprecated

Listen-Scrollposition beim Rückkehren aus dem Editor erhalten (c5b4955)

  • Neue-Notiz-Erkennung vom unsortierten Load in den sortierten Flow verschoben — Bearbeiten einer existierenden Notiz setzt die Scrollposition nicht mehr zurück

Navigation-Flags über Process Death persistieren (78b331b)

  • cameFromEditor/cameFromSettings werden via onSaveInstanceState gespeichert/wiederhergestellt — verhindert falsches Scroll-to-Top und Sync-Unterdrückung nach System-Process-Kill

onSave-Sync nach Editor-Löschung auslösen (5c7f008)

  • deleteNoteFromEditor löst jetzt einen Sync aus, um die Löschung sofort an den Server zu propagieren — konsistent mit saveNote

Erreichbarkeits-Check für Settings-syncNow() (d1928be)

  • Der „Jetzt synchronisieren"-Pfad in den Einstellungen war der einzige Aufrufer, der SyncGateChecker.isServerReachable() umging — unerreichbare Server lösten FATAL-Exceptions statt sauberem Abbruch aus

HTTP-HEAD-Check im Erreichbarkeits-Gate (13ad82e)

  • SyncGateChecker führt nach dem TCP-Socket-Check einen HEAD-Request aus, um sicherzustellen, dass der Server tatsächlich HTTP spricht — verhindert False-Positives bei Servern mit TLS-Problemen

Zeitstempel-basierte Stale-Sync-State-Erkennung (bd394fa)

  • SyncStateManager setzt SYNCING-Zustand älter als 5 Minuten automatisch zurück; aufgerufen aus Application.onCreate und MainViewModel.init, um sowohl Process Death als auch Configuration Changes abzudecken

Logging in 18 stillen Catch-Blöcken (728f33a)

  • catch (_: Exception) durch geloggte Exceptions ersetzt in ImportWizard, WebDavSyncService, ConnectionManager, SyncGateChecker, ThemePreferences, MainViewModel, NoteDownloader und Widget-Code

Logging und Nutzer-Hinweise für stille Fehler-Pfade (e6dac28)

  • WidgetConfig loggt jetzt Fehler; Import zeigt einen sichtbaren Hinweis, wenn trotz Kandidaten null Notizen importiert wurden

Logging für 403-Workaround in SafeSardineWrapper.exists (4917fc4)

  • Warnung im Log, wenn der Jianguoyun-403-als-existiert-Workaround greift, sodass False-Positives in Debug-Logs sichtbar werden

Null-Check für sardine.getInputStream in readContent (98a778f)

  • Sardine kann für nicht existierende Ressourcen null zurückgeben; Safe-Call verhindert NPE beim Import

Deprecated-APIs und Lint-Warnungen behoben (6b87dd2)

  • LocalClipboardManagerLocalClipboard + ClipEntry
  • Icons.Filled.PlaylistAddIcons.AutoMirrored.Filled.PlaylistAdd
  • EncryptedSharedPreferences/MasterKey: Suppression dokumentiert (kein Ersatz für Android 7+ verfügbar)
  • Alle SharedPreferences.edit().putX().apply()-Ketten zu KTX-edit { }-Blöcken konvertiert

NPE in UrlValidator bei fehlerhaften URLs verhindern (1a3c6a7)

  • parsedUrl.host kann bei URLs wie http:///path null sein; Safe-Call mit Early-Return

Hardcoded Deutsch im Akkuoptimierungs-Fallback ersetzen (98c39a6)

  • ComposeSettingsActivity nutzt jetzt die existierende String-Resource battery_optimization_open_settings_failed

Hinweis bei Widget-Konfig-Ladefehler (8d7d03f)

  • Die Widget-Konfigurations-Activity loggt jetzt den Fallback auf Defaults und zeigt einen Hinweis, wenn die vorherige Konfiguration nicht geladen werden konnte

✨ Verbesserungen

Alle Toast-Nachrichten zu Material 3 Snackbar migriert (a834e25)

  • Alle 9 Toast.makeText()-Aufrufstellen durch ViewModel-getriebene Snackbar-Events ersetzt — einheitliches UX
  • emitSnackbar()-Helper in MainViewModel und NoteEditorViewModel ergänzt; showToast()-Extension deprecated

Zentrale Spacing-Tokens (db4ce8f)

  • SpacingXSmall (2dp), SpacingMediumLarge (12dp), SpacingXXLarge (32dp) zu Dimensions ergänzt; MarkdownRenderer auf zentrale Tokens migriert

Hardcoded Legacy-Pfad-Filter durch Konstanten ersetzen (5f4d044)

  • Constants.DEFAULT_SYNC_FOLDER_NAME und SyncUrlBuilder.MARKDOWN_SUFFIX statt Magic Strings im Root-Fallback-Filter

DEFAULT_OFFLINE_MODE-Konstante extrahieren (051054d)

  • Magic-Boolean in 3 getBoolean()-Aufrufen ersetzt; Kommentar dokumentiert, warum Default true ist (sicher bei Erstinstallation)

🔧 Interne Änderungen

  • StateFlow-Migration im NoteEditorViewModel (9071905) — existingNote, isDirty, hasUnsavedChecklistEdits, isRestoringSnapshot werden jetzt von MutableStateFlow getragen
  • In-Memory-Cache für loadAllNotes mit 2s TTL (8b74b43) — verhindert wiederholtes Lesen und Parsen aller JSON-Dateien bei jedem onResume; race-sicher via AtomicLong-Versions-Counter
  • android.util.Log durch Project Logger in 4 Dateien ersetzt (57c3246) — DragDropListState, NoteEditorScreen, ChecklistItemRow, SettingsViewModel
  • getTimeoutMs in ConnectionManager dedupliziert (ea05e03) — SyncGateChecker delegiert jetzt
  • BatteryOptimizationHelper extrahiert (c3a1e3b) — ComposeSettingsActivity und ComposeMainActivity dedupliziert; setAutoSync() zeigt den Dialog nur, wenn nicht bereits exempt
  • Schreibreihenfolge SharedPreferences/StateFlow vereinheitlicht (908493b) — erst Prefs, dann State; In-Memory-Zustand divergiert nicht mehr bei Teilfehlern
  • WidgetUpdateHelper extrahiert (00f66db) — einheitlicher Helper für das GlanceAppWidgetManager → getGlanceIds → forEach update-Pattern
  • @Immutable auf Note dokumentiert (15c6a12)
  • Leere Product Flavors dokumentiert (602c06a)
  • Redundantes viewBinding = false entfernt (0e02124)
  • Widget-Magic-Numbers in benannte Konstanten extrahiert (2a84b32)
  • Sichere Long-zu-Int-Konvertierung für Socket-Timeout (b77ac4d)
  • MAX_LOG_ENTRIES von 500 auf 5000 erhöht (b18fa8f) — vollständige Sync-Zyklen mit 30+ Notizen können 500 Zeilen überschreiten
  • Toten Legacy-toReadableTime ohne Context-Param entfernt (d3ea343)
  • Versions-Bump 2.2.0 → 2.3.0 (71cf215)

🌍 Übersetzungen

  • Chinesisch (vereinfacht) über Weblate aktualisiert (1be36bb) — danke an @heretic43!

Übersetzungs-Hosting freundlicherweise bereitgestellt von Weblate — danke für das Sponsoring von Open-Source-Projekten! 🙏

🙏 Danksagungen

  • @angeld-jr2 — meldete den Backup-Validierungs-Crash und lieferte das Debug-Log, das den Phantom-Notizen-Bug diagnostizierbar machte
  • @Ichigo-Meow — meldete das MKCOL/WebDAV-Validierungs-Problem (#55)
  • @minosimo — meldete die Markdown-Auto-Sync-Regression (#50)
  • MrsMinchen — beigetragen: Widget-Checklisten-Sortier-Fix
  • freemen — meldete das fehlende Auto-Speichern bei Sortier-Änderungen

[2.2.0] - 2026-03-30

✨ Neue Features

Share-Intent: Text als neue Notiz oder Checkliste empfangen (766f67e)

  • Text/plain-Share-Intents aus anderen Apps als neue Notizen oder Checklisten empfangen
  • Danke an @madelgijs für den Feature-Wunsch! (Discussion #46)

Neue-Notiz-Shortcut-Widget (5c79ab6)

  • Homescreen-Widget mit Auto-Layout zum schnellen Erstellen neuer Notizen
  • Danke an @Stowaway2979 für den Feature-Wunsch! (Discussion #49)

Checklisten-Button in Markdown-Toolbar (2157a09)

  • Checklisten-Items direkt aus der Markdown-Editor-Toolbar einfügen

Checklisten-Item-Kontextmenü: Kopieren, Duplizieren, In-Checkliste-Kopieren (d98edd7)

  • Fokussiertes MoreVert-Menü an Checklisten-Items mit Text kopieren, Item duplizieren und Item in andere Checkliste kopieren
  • Danke an freemen für den Feature-Wunsch!

Auto-Einklappen erweiterter Items beim Ziehen (c030794)

  • Erweiterte Checklisten-Items klappen automatisch ein wenn Drag-and-Drop startet

🐛 Fehlerbehebungen

Checklisten-Titel-Korruption durch fehlende Leerzeile behoben (c6cd50e)

  • Kritischer Fix: toMarkdown() hat keine Leerzeile zwischen # Titel und erstem Checklisten-Item geschrieben → progressive Titel-Korruption bei jedem Sync-Zyklus (erstes Item wurde in den Titel verschluckt)
  • Defensives Parsing in fromMarkdown() und fromJson() erkennt und repariert korrupte Titel
  • Einmalige Migration repariert alle lokal gespeicherten korrupten Checklisten-Notizen beim ersten Start nach dem Update
  • CRLF-Zeilenumbruch-Normalisierung im Markdown-Parser verhindert Parse-Fehler bei Windows-bearbeiteten Dateien
  • Korruptions-Warn-Logging im Markdown-Sync-Import zur Überwachung
  • Danke an freemen für die Hilfe beim Aufspüren der Korruptions-Kaskade!

WiFi-Sync-WorkManager-Fallback (ee0b54c)

  • Connectivity-Change-WorkManager-Fallback für zuverlässigen WiFi-getriggerten Sync hinzugefügt

🌍 Übersetzungen

  • Chinesisch (vereinfacht) über Weblate aktualisiert (9bcd4db, 864b23e)

📦 Code-Qualität

  • APK-Packaging optimiert: gebündelte kotlin_builtins und LICENSE-Dateien entfernt (−28 KB)

[2.1.0] - 2026-03-26

🐛 Fehlerbehebungen & UX-Verbesserungen

Editor-Toolbar-Skalierung für schmale Displays (9b6ee8a)

  • Adaptive Toolbar: auf breiten Displays volle Titel + Undo/Redo in der Toolbar; auf schmalen Displays / großer Schriftskalierung: gekürzte Titel („Bearbeiten", „Neu") + Undo/Redo im Overflow-Menü
  • Verhindert Textumbruch auf kleinen Bildschirmen und bei hoher Barrierefreiheits-Schriftskalierung
  • Danke an @xdpirate für die Meldung! (#48)

Markdown-Vorschau als Standardansicht (f8b15a5)

  • Bestehende Textnotizen öffnen jetzt standardmäßig in der Markdown-Vorschau
  • Neue Notizen starten weiterhin im Bearbeitungsmodus mit automatischem Tastatur-Fokus
  • Danke an @james0336, @isawaway und MrsMinchen für den Vorschlag!

📝 Dokumentation & Metadaten

Lizenz-Metadaten korrigiert (89667d1)

  • Verbleibende Apache-2.0-Referenzen in F-Droid-Changelogs (versionCode 27) korrigiert — zeigen jetzt alle korrekt AGPL v3

Issue-Templates vereinfacht (5a56cf4)

  • Bug-Report- und Frage-Templates neu geschrieben: nur Englisch, weniger Pflichtfelder, aufgeräumteres Layout
  • Danke an @xdpirate für das Feedback! (#48)

Geplante Features v2.2.0 (5e9168b)

📦 Code-Qualität

Detekt / Lint / ProGuard-Audit (b9e6782)

  • Vollständiger Code-Qualitäts-Audit: detekt, lint, ktlint, ProGuard und Unit-Tests nach allen v2.1.0-Änderungen verifiziert

[2.0.0] - 2026-03-20

🎨 Kompletter Compose-Rewrite, Multi-Theme-System & Architektur-Überarbeitung

Major-Release: vollständige Migration zu Jetpack Compose, Entfernung aller Legacy-View-Codes (~2.300 Zeilen gelöscht), komplettes WebDavSyncService-Refactoring in fokussierte Module, Multi-Theme-System mit 7 Farbschemata und animierten Übergängen, Material 3 Shared-Axis-Navigation, Checklisten-Drag-and-Drop-Rewrite, umfassende Sync-Zuverlässigkeitsfixes und modernisierte Abhängigkeiten.

✨ Neue Features

Multi-Theme-System mit animierten Übergängen und getönten Oberflächen (315c0a5)

  • Neuer ThemeMode-Selector: System, Hell, Dunkel, AMOLED
  • 7 Farbschemata: Standard, Blau, Grün, Rot, Lila, Orange, Dynamisch (Material You ab API 31)
  • Live-Vorschau mit Farbfeldern in den Anzeige-Einstellungen
  • Crossfade-Theme-Übergänge (500 ms) — flüssig auch in Debug-Builds
  • Getönte Oberflächenpaletten für alle Farbschemata (Notizkarten passen zum gewählten Theme)
  • Status- und Navigationsleistenfarben synchronisieren sich bei Theme-Wechsel

Grid-Spalten-Skalierungssteuerung (3d4c2e0)

  • Umschalten zwischen automatischer Grid-Skalierung (adaptive 150dp) und fester Spaltenanzahl
  • Manuelle Spaltenanzahl 1–5 über Chip-Selector mit Mini-Grid-Vorschau
  • Abschnitt nur sichtbar wenn Grid-Modus aktiv
  • In Backup/Restore enthalten

Undo/Redo direkt in der TopAppBar (75edf00)

  • Undo und Redo vom Overflow-Menü zu direkten TopAppBar-Aktionen verschoben
  • Buttons respektieren canUndo/canRedo-State und erscheinen ausgegraut wenn nicht verfügbar

Anzeigemodus-Chip-Selector (046f325)

  • Radiogruppe durch Icon-über-Label-Chips ersetzt (konsistent mit Theme-/Farb-Selektoren)
  • Einstellungs-Untertitel zeigt Anzeigemodus, Theme und Farbschema (z.B. „Listenansicht · Dunkel · Standard")

Vollständiges App-Einstellungen-Backup/-Restore (4d07c11)

  • Backup/Restore umfasst jetzt alle Einstellungen: Server, Sync, Markdown, Anzeige, Notiz-Verhalten, Benachrichtigungen

Autosave-Status in Anzeige-Einstellungen (92da701)

  • Anzeige-Einstellungen-Untertitel zeigt Autosave-Status statt Theme-Info

Logging-Deaktivierungs-Dialog nach Export (2525a85)

  • Nach dem Teilen der Debug-Logs fragt ein Dialog, ob das Datei-Logging deaktiviert werden soll

Material 3 Shared-Axis-Übergänge (3f5d19d, 365b0dd)

  • Horizontale Shared-Axis-Übergänge (Slide + Fade) für alle Navigationen
  • Konsistente Animationen für Zurück-Pfeil und Wisch-Geste ab API 34

🐛 Fehlerbehebungen

Checklisten-Drag-and-Drop-Rewrite (89cc9a6)

  • Kompletter Rewrite von DragDropListState (~200 → 797 Zeilen): unkontrolliertes Auto-Scroll, Index-Desync bei Separator-Kreuzungen, gleichzeitige Swap-Race-Conditions und Swap-Oszillation an Viewport-Kanten behoben
  • Key-basiertes Item-Tracking, kontinuierliche Auto-Scroll-Schleife mit Mutex-gesperrten Swaps, Anti-Flapping-Guard, Viewport-Sicherheitschecks

Offline-Server-Löschungen in Warteschlange (1a5c889)

  • Bei „Überall löschen" werden Notizen jetzt in eine Warteschlange gestellt und beim nächsten Sync verarbeitet, statt lautlos verloren zu gehen

WebDAV-403-Kompatibilität (9523733)

  • Jianguoyun-WebDAV gibt 403 für HEAD auf Collections zurück — wird jetzt korrekt als „existiert" behandelt statt „nicht gefunden". Danke @james0336 für die Meldung!

Thread-Sicherheit und Ressourcen-Lecks (2ab04d1, 3c31f61)

  • Activity-Leaks in NetworkMonitor behoben, syncStatus zu StateFlow migriert, fileLock für Logger, Race-Conditions in MainViewModel mit StateFlow.update{} eliminiert
  • Alle InputStream-/Connection-Leaks in Sardine-Aufrufen geschlossen, File-I/O vom Main-Thread verlagert, HttpURLConnection-Leak im Server-Statuscheck behoben

Sync-Zuverlässigkeit (ec4bb1c, 3d02118, 150543c)

  • onResume-Sync-Throttle überlebt keinen Prozess-Neustart mehr (jetzt In-Memory)
  • Falscher Sync nach Paket-Update verhindert (Race-Condition in NetworkMonitor)
  • Auto-Sync bei Rückkehr vom Editor und Einstellungen übersprungen

Layout-Skalierung für kleine Bildschirme und große Schriften (ef38a0e)

  • Responsive Fixes: scrollbare Dialoge, FilterChipRow Spaltenlayout, adaptiver Grid-Schwellwert 180→150dp reduziert. Danke an Mama <3

Leere Pluralformen in de/tr/uk (2db80a4)

  • Fehlende Pluralformen für Zeitangaben ergänzt — Zeitstempel waren auf Notizkarten in Deutsch, Türkisch und Ukrainisch unsichtbar

Sprachauswahl auf API 33+ (f54ef49)

  • Weiterleitung zu nativen App-Spracheinstellungen auf API 33+ statt In-App-Auswahl (eliminiert Activity-Neustart-Flash)

Speichern-bei-Zurück-Race-Condition (afbef19)

  • TextFieldState flushen und in onPause speichern um Datenverlust bei Zurück-Navigation zu verhindern

Banner-Farb-Blitz (9b7a285)

  • Letzte sichtbare Banner-Farben während Dismiss-Animation einfrieren

Splash-Screen-Blitz (a5e0899)

  • Splash-Screen bleibt sichtbar bis Notizen geladen sind — kein leerer Bildschirm mehr beim Kaltstart

FAB-Scrim-Übergangs-Artefakt (833c30e, 2f75467)

  • FAB-Scrim wird vor Activity-Transition-Erfassung auf unsichtbar gesetzt, Fade-Out-Animation wiederhergestellt

Snackbar in Einstellungen (24c62b8, 0c76087)

  • Unzuverlässigen Toast durch Snackbar in allen Einstellungsscreens ersetzt, wird über Tastatur angezeigt

🏗️ Architektur & Refactoring

WebDavSyncService-Aufteilung (e0abff47f467d7)

  • Monolithischer 2.735-Zeilen-WebDavSyncService in 8 fokussierte Module aufgeteilt: SyncGateChecker, ETagCache, SyncTimestampManager, SyncExceptionMapper, SyncUrlBuilder, ConnectionManager, NoteUploader, NoteDownloader, MarkdownSyncManager

Legacy-Code-Entfernung (901ca77, 39b6e9f, fb64a31)

  • SettingsActivity (1.072 Zeilen), MainActivity (857 Zeilen), NoteEditorActivity (344 Zeilen), alle XML-Layouts/Menüs/Drawables gelöscht
  • Compose-Activities sind jetzt die einzigen Implementierungen

Modernisierung (dfd3b33, ad137c3, 65b6a26, 9e547d2, 07a7502)

  • LocalBroadcastManager durch SharedFlow ersetzt, viewModelFactory-DSL, overridePendingTransition durch ActivityOptions (API 34+), alle @Suppress("DEPRECATION") entfernt, AlertDialog.Builder durch Compose-AlertDialog

📦 Abhängigkeiten & Build

Dependency-Updates (b57512f)

  • Kotlin 2.0.21 → 2.1.0, Compose BOM 2026.01 → 2026.03, Lifecycle 2.7 → 2.8.7, Coroutines 1.7 → 1.9, Navigation 2.7 → 2.8.5, Activity 1.8 → 1.9.3 und 15+ weitere

Code-Qualität (cf95fcd, 3933df0)

  • Alle Lint- und Detekt-Warnungen behoben, 500 unbenutzte Strings gelöscht, ktlint-Formatierung in 91 Dateien, Kotlin 2.3.20

APK-Größenoptimierung (ce86b68)

  • R8/ProGuard-Keep-Regeln verschärft — APK-Größe 5,4 MB → 5,2 MB (-200 KB, classes.dex -507 KB)

CI/CD (c6a3f25)

  • Tag-basierter GitHub-Actions-Release-Workflow für Draft-Releases

📄 Lizenz

Lizenzwechsel (6baaeda)

  • Von MIT zu AGPL v3 gewechselt

[1.12.0] - 2026-03-12

🌍 Internationalisierung, Einstellungen & Community

Fokussiertes Release mit Chinesisch (vereinfacht) Lokalisierung, korrekten Pluralformen für Zeitangaben, Benachrichtigungsstatus-Anzeige in der Einstellungs-Übersicht und Liberapay-Spendenintegration in der README.

🌍 Übersetzungen

Chinesisch (vereinfacht) Übersetzung (15a49d6)

  • Vollständige zh-CN Lokalisierung (547 Strings) basierend auf Weblate-Beitrag von @heretic43 (#40)
  • App-Name bleibt als „Simple Notes" (nicht übersetzt)

🐛 Fehlerbehebungen

Korrekte i18n-Pluralformen für Zeitangaben (c804964)

  • time_minutes_ago, time_hours_ago und time_days_ago von <string> zu <plurals> konvertiert für grammatisch korrekte Formen in Sprachen wie Ukrainisch
  • Extensions.kt auf getQuantityString umgestellt
  • Alle bestehenden Sprachen aktualisiert (en/de/tr/uk/zh)

✨ Neue Features

Benachrichtigungsstatus in der Einstellungs-Übersicht (5d82e7d)

  • Die Sync & Benachrichtigungen-Karte auf dem Einstellungs-Hauptscreen zeigt jetzt den aktuellen Benachrichtigungsstatus neben der Trigger-Anzahl an
  • Drei Zustände: „Benachrichtigungen aktiv", „Nur Fehler und Warnungen", „Benachrichtigungen deaktiviert"
  • Konsistent mit dem Zusammenfassungsstil der anderen Einstellungskarten

📝 Dokumentation

Liberapay-Spendenintegration (7081286)

  • Shields.io-Spendenbadge in die Badge-Reihe von README.md und README.de.md eingefügt
  • Offizieller Liberapay-Spendenbutton im Contributing-Abschnitt hinzugefügt
  • Beide Sprachversionen (EN/DE) der README aktualisiert

[1.11.0] - 2026-03-10

🔔 Benachrichtigungen, FAB-Überarbeitung & Checklisten-Sortierung

Fokussiertes Release mit konfigurierbaren Benachrichtigungseinstellungen und Android 13+ Berechtigungshandling, auf- und absteigende Sortierung nach Erstellungsdatum für Checklisten, überarbeitetem FAB-Overlay mit animiertem Scrim und vereinheitlichten Action-Pills, umstrukturierten Sync-Einstellungen, versteckten Entwickleroptionen und mehreren Bugfixes rund um Autosave-Verhalten und Sync-Zählung.

✨ Neue Features

Benachrichtigungseinstellungen mit Berechtigungshandling (c1f5078)

  • Drei neue Toggles unter Sync & Benachrichtigungen: Global ein/aus, Nur-Fehler-Modus, Server-nicht-erreichbar-Warnung
  • Vollständiger Android 13+ POST_NOTIFICATIONS Permission-Flow: Abfrage beim ersten Aktivieren, Erklärungsdialog bei Ablehnung, Weiterleitung zu App-Einstellungen bei dauerhafter Ablehnung
  • Berechtigungsstatus wird bei jedem Screen-Resume geprüft — Toggle synchronisiert mit Systemstatus

Checklisten nach Erstellungsdatum sortieren (auf- und absteigend) (a265e3c)

  • Neue Sortieroption „Erstellungsdatum ↑" (älteste zuerst) und „Erstellungsdatum ↓" (neueste zuerst)
  • Jedes Checklisten-Item erhält einen createdAt-Zeitstempel, der über Bearbeitungen und Syncs erhalten bleibt
  • Abwärtskompatibel: alte Items ohne Zeitstempel verwenden Index als Fallback
  • Separator zwischen offenen/erledigten Gruppen bleibt bei beiden Richtungen erhalten

Entwickleroptionen hinter Easter Egg versteckt (186a345)

  • Debug & Diagnose-Einstellungen standardmäßig ausgeblendet
  • Freischaltung durch 5× Tippen auf die App-Info-Karte im Über-Screen (Android-Entwickleroptionen-Stil)
  • Nur für die Sitzung: wird beim App-Neustart zurückgesetzt, nicht in SharedPreferences persistiert
  • Countdown-Toast für die letzten 2 Taps, Bestätigungs-Toast bei Freischaltung

🐛 Fehlerbehebungen

Autosave bei leeren Checklisten-Items ausgelöst (f7e25db)

  • Hinzufügen oder Löschen leerer Checklisten-Items löst kein Autosave mehr aus
  • No-Change-Guard in performSave() und saveOnBack() überspringt Speichern wenn nur leere Items vom gespeicherten Stand abweichen
  • Autosave-Indikator erscheint nicht mehr irreführend nach dem Hinzufügen eines leeren Items

Markdown-Auto-Sync: Doppelzählung (7dd092e)

  • Das Erstellen einer Notiz mit aktiviertem Markdown-Auto-Sync zeigt nicht mehr „2 Notizen synchronisiert" statt 1
  • Exportierte Markdown-Dateien werden im selben Sync-Zyklus per Notiz-ID-Tracking vom Re-Import ausgeschlossen
  • Technische Re-Uploads nach Markdown-Import zählen nicht mehr zum Sync-Count
  • null vs. emptyList()-Inkonsistenz im Checklisten-Inhaltsvergleich behoben

Irreführendes „Markdown importieren"-Banner bei unveränderter Dateilage (e352ce1)

  • Progress-Banner zeigt keinen Dateinamen (z. B. „Test Neu.md") mehr wenn tatsächlich 0 Dateien importiert werden
  • Fast-Path überspringt die IMPORTING_MARKDOWN-Phase vollständig wenn alle Server-Dateien unverändert sind
  • Dateiname im Progress-Update wird nur noch gesetzt wenn die Datei tatsächlich heruntergeladen wird

🎨 UI-Verbesserungen

Animierter FAB-Scrim und verbesserte Farben (4a8a202)

  • FAB-Overlay deckt jetzt den gesamten Bildschirm ab, inklusive Statusleiste (aus dem Scaffold herausbewegt)
  • Semi-transparenter animierter Scrim (50 % Schwarz, 250 ms Tween) ersetzt transparentes Dismiss-Overlay
  • Sub-Action-Farben von secondaryContainer auf primaryContainer geändert für bessere Hierarchie

Vereinheitlichte Action-Pills (847154f)

  • Label-Text und Icon in einer einzigen breiten Pill pro Aktion zusammengefasst (Aegis Authenticator-Stil)
  • Gesamte Pill ist ein Klickziel — kein separates Label + Icon-FAB mehr
  • Verwendet surfaceContainerHigh / onSurface für konsistente Darstellung im Dark Mode

Sync-Einstellungen umstrukturiert (e9d48cb)

  • Screen umbenannt von „Sync-Einstellungen" zu „Sync & Benachrichtigungen"
  • Sektions-Header umbenannt von „Netzwerk & Performance" zu „Netzwerk"
  • Sub-Header „Sofort-Sync" und „Hintergrund-Sync" entfernt für saubereres Layout
  • Sync-Trigger, Netzwerk und Benachrichtigungen in separate Composables extrahiert für isolierte Recomposition

Smooth Fade-Transitions in der Settings-Navigation (1ef565d)

  • Alle Settings-Routen nutzen jetzt einen 700 ms Fade statt des abrupten Standard-Crossfades
  • Global auf NavHost-Ebene definiert — kein duplizierter Code pro Route

🌍 Übersetzungen

Dank an @FromKaniv für die ukrainische Übersetzung und @ksuheyl für die türkische Übersetzung!


[1.10.0] - 2026-03-01

✏️ Editor-Überarbeitung, Teilen / Export & Sync-Zuverlässigkeit

Großes Release mit PDF-Export, Text- und Kalender-Teilen, überarbeitetem FAB-Menü, Löschen aus dem Editor mit Rückgängig, Batch-Serverlöschung mit Fortschrittsanzeige, adaptiven Tablet-Layouts, WorkManager-Zuverlässigkeitsverbesserungen und echten deterministischen Fortschrittsbalken für alle Sync-Phasen.

✨ Neue Features

Teilen & Exportieren aus dem Editor (e2b9f79, 2aca873, 57c4e96) (Danke an @james0336 für den PDF-Export-Wunsch!)

  • Neues Überlaufmenü (⋮) in der Editor-Toolbar: Als Text teilen, Als PDF teilen, In Kalender exportieren
  • PDF nativ über PdfDocument-API erstellt — keine Drittanbieter-Bibliothek erforderlich
  • Teilen via FileProvider für sichere Freigabe mit beliebigen PDF-Viewern
  • Kalender-Export füllt Titel, ganztägiges Startdatum (heute) und Notizinhalt als Beschreibung vor

Aufklappendes FAB-Menü (85d68c4, 61788e3)

  • FAB durch Speed-Dial ersetzt: Tippen auf + zeigt animierte Sub-Action-Buttons für Text-Notiz und Checkliste
  • +-Icon rotiert zu × beim Aufklappen; Sub-Actions gleiten mit gestaffelter Feder-Animation ein
  • Transparentes Dismiss-Overlay schließt das Menü beim Tippen außerhalb
  • Sub-Action-Buttons und Label-Pills nutzen secondaryContainer-Farbe als visuelle Einheit
  • Stärkere Schatten-Elevation (8–10 dp) für klare visuelle Trennung vom Notiz-Grid in hellem und dunklem Theme

Notiz aus Editor löschen mit Rückgängig (f3fd806)

  • Löschaktion von blockierendem Dialog auf ein Bottom Sheet umgestellt
  • Nach Bestätigung schließt der Editor und der Hauptscreen zeigt eine timed Rückgängig-Snackbar
  • Rückgängig stellt die Notiz wieder her und bricht eine geplante Server-Löschung ab

Batch-Serverlöschung mit Fortschrittsanzeige (39a873f)

  • Neue DELETING-Sync-Phase im Banner beim Batch-Löschen mehrerer Notizen vom Server
  • Fortschrittsbalken zeigt aktuell / gesamt mit dem aktuellen Notiz-Titel
  • Phase wechselt sanft zu COMPLETED mit einer Ergebnis-Meldung

Adaptive Layouts für Tablets & Querformat (a117cbe)

  • Editor-Inhalt auf maximal 720 dp Breite begrenzt und auf breiten Bildschirmen zentriert
  • Einstellungs-Screens auf maximal 600 dp Breite begrenzt und zentriert
  • Haupt-Grid nutzt Adaptive(180 dp) Spalten — auf Tablets und im Querformat erscheinen automatisch mehr Spalten
  • Vorbereitung für Android 16 (targetSdk 36), das screenOrientation-Locks auf Displays ≥ 600 dp ignoriert

Rückgängig/Wiederherstellen im Notiz-Editor (484bf3a)

  • Vollständige Undo/Redo-Unterstützung für Text-Notizen und Checklisten via Toolbar-Buttons
  • Debounced Snapshots: schnelles Tippen wird zu einem einzelnen Undo-Schritt gruppiert (500 ms Fenster)
  • Stack auf 50 Einträge begrenzt; wird beim Notizwechsel geleert
  • Wiederhergestellte Snapshots aktualisieren die Cursor-Position korrekt

Konfigurierbarer WebDAV-Verbindungs-Timeout (b1aebc4)

  • Neuer Settings-Slider (1–30 s, Standard 8 s) zur Konfiguration des WebDAV-Timeouts
  • Wird auf alle OkHttpClient-Instanzen angewendet (Connect, Read, Write)
  • Einheitliche Fehlermeldungen für Timeout, Auth-Fehler, Nicht gefunden und Server-Fehler

Markdown-Auto-Sync Timeout-Schutz (7f74ae9)

  • Aktivierung von Markdown-Auto-Sync hat jetzt einen 10-s-Timeout für den initialen Export
  • UI-Toggle aktualisiert optimistisch und kehrt bei Fehler oder Timeout zurück
  • Verhindert, dass der Einstellungs-Screen bei unerreichbaren Servern hängt

Speichern beim Zurücknavigieren (402382c) (Danke an @GitNichtGibtsNicht für den Autosave-beim-Zurück-Wunsch!)

  • Ungespeicherte Notizen werden beim Verlassen des Editors automatisch gespeichert (System-Zurück + Toolbar-Zurück)
  • Nur aktiv wenn Autosave aktiviert ist; synchrones Speichern ohne Sync auszulösen
  • Autosave-Toggle-Beschreibung erwähnt jetzt dieses Verhalten

🐛 Fehlerbehebungen

Download-Fortschritt immer indeterminate (c83aae3)

  • ParallelDownloader trackte abgeschlossen / gesamt intern korrekt, aber syncNotes() hat total = 0 hardcodiert
  • Behoben: total wird jetzt korrekt weitergegeben → DOWNLOADING-Phase zeigt einen echten LinearProgressIndicator
  • importMarkdownFiles() meldet jetzt ebenfalls Datei-für-Datei-Fortschritt: Banner zeigt X / Y dateiname.md mit determiniertem Balken

FGS-Timeout auf Android 15+ (1e6eb64)

  • ensureActive()-Checkpoints in der Download-Schleife und beim Markdown-Import von WebDavSyncService hinzugefügt, damit Coroutines bei WorkManager-Abbruch auf targetSdk 35+ sofort reagieren
  • CancellationException-Handler in SyncWorker loggt jetzt den Stop-Grund (API 31+)

WorkManager-Quota / Standby-Stops nicht sichtbar (3d66a19)

  • Detailliertes Stop-Reason-Logging: 16 WorkManager-Stop-Codes auf lesbare Namen gemappt
  • Wenn ein Sync durch JobScheduler-Quota oder App-Standby gestoppt wird, erscheint beim nächsten App-Start ein Info-Banner

Konsistente Position des Editor-Überlaufmenüs (242ece3)

  • Überlaufmenü (⋮) ist jetzt am -Button verankert, auch bei Checklisten-Notizen
  • Zuvor war das Menü an der äußeren Actions-Row verankert und erschien bei Checklisten zu weit links

Markdown-Import: Inhalt vor Überschrift verloren (e33ac23)

  • Inhalt vor dem ersten #-Heading wurde beim Markdown-Import still verworfen
  • Checklisten-Erkennung verbessert: mehr Item-Muster werden jetzt erkannt

Checklisten-Autosave nicht bei Item-Änderungen ausgelöst (5401df3)

  • Löschen, Hinzufügen und Verschieben von Checklisten-Items markiert die Notiz jetzt korrekt als geändert und löst Autosave aus

Minimales Scrollen beim Hinzufügen neuer Checklisten-Items (c2fbe0b)

  • Neue Checklisten-Items scrollen nur so weit, dass das Item sichtbar wird, statt zur Listenoberseite zu springen

Falsches Autosave beim Tippen in Checkliste (9ea7089)

  • Antippen eines Checklisten-Items zum Platzieren des Cursors löst kein falsches Autosave mehr aus
  • No-Op-Guards in updateChecklistItemText() und updateChecklistItemChecked()

Undo auf Originalzustand löste trotzdem Autosave aus (cf5027b)

  • Rückgängig-Machen aller Änderungen zum letzten Speicherzustand setzt isDirty jetzt korrekt zurück und bricht das ausstehende Autosave ab
  • Neues savedSnapshot-Property erfasst den Zustand beim Laden und nach jedem expliziten Speichern

Fremde JSON-Dateien unnötig heruntergeladen (c409243)

  • Nicht-Notiz-JSON-Dateien (z.B. google-services.json) werden jetzt vor dem Download via UUID-Format-Check gefiltert

Notiz-Anzahl-Strings nicht korrekt pluralisiert (8ca8df3)

  • Notiz-Anzahl-Strings in korrekte Android-Pluralformen konvertiert (EN + DE)

🎨 UI-Verbesserungen

Sanfte Sync-Banner-Animationen (c409243)

  • Banner-Einblendung: fadeIn (300 ms, EaseOutCubic) — kein abruptes „Reinschieben von oben" mehr
  • Banner-Ausblendung: fadeOut + shrinkVertically (300/400 ms, EaseInCubic)
  • Phasen-Übergänge nutzen AnimatedContent-Crossfade (250 ms) für Textwechsel
  • Mindest-Anzeigedauer pro aktiver Phase (400 ms) verhindert unlesbare Blitze
  • Auto-Hide-Job vom Flow-Collector entkoppelt — garantierte Mindest-Anzeigedauer

Markdown-Ordner in Sync-Einstellungen erwähnt (a8bb80c)

  • Sync-Ordner-Hinweis erwähnt jetzt explizit das notes-md/-Unterverzeichnis, das für Markdown-Auto-Sync verwendet wird

[1.9.0] - 2026-02-25

🔄 Sync-Qualität, Performance & UI

Großes Release mit Notiz-Filterung, Markdown-Vorschau, konfigurierbarem Sync-Ordner, Opt-in-Autosave, Widget-Polish und signifikanten Sync-Verbesserungen — Server-Wechsel-Datenverlust behoben, parallele Uploads, Import-Assistent und drei Sync-Edge-Cases gelöst.

🐛 Fehlerbehebungen

Erster Sync schlägt fehl wenn /notes/-Ordner auf Server fehlt (e012d17)

  • Der erste Sync schlägt nicht mehr still fehl, wenn das Verzeichnis /notes/ noch nicht auf dem Server angelegt wurde
  • Ursache: checkServerForChanges() lieferte false (keine Änderungen) statt true (fortfahren), wenn lastSyncTime > 0 und der Ordner fehlte
  • Fix: gibt true zurück, damit der initiale Upload startet — der Server legt den Ordner beim ersten PUT automatisch an

Server-Wechsel verursacht falschen "Auf Server gelöscht"-Status (0985209)

  • Der Wechsel zu einem neuen Server markiert lokale Notizen nicht mehr fälschlich als gelöscht
  • Ursache: E-Tag- und Content-Hash-Caches des alten Servers wurden nicht geleert — Upload-Skip feuerte fälschlich, Notizen erschienen als SYNCED ohne tatsächlich hochgeladen zu sein
  • Fix: clearServerCaches() leert alle E-Tag-, Content-Hash-, Sync-Timestamp- und Deletion-Tracker-Einträge bei Server-Wechsel
  • resetAllSyncStatusToPending() setzt jetzt auch DELETED_ON_SERVER auf PENDING zurück

Server-Löscherkennung zu aggressiv bei wenigen Notizen (56c0363)

  • Nutzer mit 2–9 Notizen, die alle über die Nextcloud-Web-UI löschten, bekamen nie den DELETED_ON_SERVER-Status
  • Guard-Schwellenwert von >1 auf ≥10 angehoben

Race Condition bei parallelem Markdown-Export mit gleichen Titeln (56c0363)

  • Zwei Notizen mit identischem Titel konnten sich gegenseitig die Markdown-Datei überschreiben
  • Ursache: gleichzeitige exists()put()-Sequenz ohne Synchronisation
  • Fix: Markdown-Export wird per Mutex serialisiert (JSON-Uploads bleiben parallel)

E-Tag nicht gecacht bei "Lokal neuer"-Download-Skip (56c0363)

  • Wenn eine lokale Notiz neuer war als die Server-Version, wurde der Server-E-Tag nicht gespeichert
  • Verursachte unnötige Re-Downloads bei jedem folgenden Sync
  • Fix: E-Tag wird jetzt auch im else-Branch der Download-Ergebnis-Verarbeitung gespeichert

Tune-Button-Farbe passt nicht zur Standard-Iconfarbe (135559a)

  • Untoggled-Tune-Button nutzt jetzt die Standard-TopAppBar-Iconfarbe statt einer eigenen Farbe

Import-Assistent verliert Checklisten-Inhalt (5031848)

  • Checklisten-Erkennung beim Markdown-Import behält jetzt den vollständigen Notiz-Inhalt

Checklisten-Scroll-Sprung beim Abhaken des ersten sichtbaren Items (8238af4)

  • Abhaken des ersten sichtbaren Checklisten-Items verursacht keinen Scroll-Sprung mehr

Checklisten-Originalreihenfolge verloren nach Einfügen/Löschen (e601642)

  • Originalreihenfolge wird nach Einfüge-/Löschoperationen zementiert, um Reihenfolge-Glitches zu verhindern

Inkonsistentes Scrollen beim Check/Un-Check (19dfb03)

  • Konsistentes Scroll-Verhalten beim Abhaken und Aufheben von Checklisten-Items

✨ Neue Features

Notizen-Import-Assistent (e012d17)

  • Neuer Import-Screen in den Einstellungen — Notizen von WebDAV-Server oder lokalem Speicher importieren
  • Unterstützte Formate: .md (mit/ohne YAML-Frontmatter), .json (Simple Notes Format oder generisch), .txt (Klartext)
  • WebDAV-Scan: rekursiver Unterordner-Scan (Tiefe 1), berücksichtigt bestehende DeletionTracker-Einträge
  • Notizen mit YAML-Frontmatter oder Simple Notes JSON werden als SYNCED importiert; andere als PENDING
  • Erreichbar über Einstellungen → Import

Parallele Uploads (187d338)

  • Notizen werden parallel statt sequentiell hochgeladen — ~2× schneller bei mehreren geänderten Notizen
  • Upload-Zeit für 4 Notizen von ~11,5 s auf ~6 s reduziert (auf Gerät gemessen)
  • Zweiter Sync mit unveränderten Notizen: Upload-Phase ~0 ms (alle per Content-Hash übersprungen)
  • Begrenzte Parallelität via Semaphore; Datei-I/O-Schreibzugriffe via Mutex serialisiert
  • Neu: /notes-md/-Existenzprüfung pro Sync-Lauf gecacht (spart ~480 ms × N exists()-Aufrufe)

Vereinheitlichte Parallele-Verbindungen-Einstellung (ef200d0)

  • Parallele Downloads (1/3/5/7/10) und Uploads (versteckt, max 6) zu einer einzelnen "Parallele Verbindungen"-Einstellung zusammengeführt
  • Neue Optionen: 1, 3, 5 (reduziert von 5 Optionen — 7 und 10 entfernt da Uploads auf 6 begrenzt)
  • Nutzer mit 7 oder 10 werden automatisch auf 5 migriert
  • Uploads zur Laufzeit auf min(Einstellung, 6) begrenzt

Filter Chip Row (952755f, 71a0469, 07c41bb)

  • Neue Filter-Leiste unter der TopAppBar — Notizen filtern nach Alle / Text / Checklisten
  • Inline-Suchfeld für schnelle Notiz-Filterung nach Titel
  • Sortier-Button aus Dialog in kompaktes Filter-Row-Icon verschoben
  • Tune-Button in TopAppBar schaltet Filter-Zeile ein/aus

Markdown-Vorschau (e83a89a)

  • Live-Markdown-Vorschau für Textnotizen mit Formatierungs-Toolbar
  • Unterstützt Überschriften, Fett, Kursiv, Durchgestrichen, Listen, Trennlinien, Code-Blöcke
  • Umschalten zwischen Bearbeitungs- und Vorschaumodus

Benutzerdefinierter App-Titel (bf478c7)

  • Konfigurierbarer App-Name in den Einstellungen

Konfigurierbarer WebDAV-Sync-Ordner (58cdf1e)

  • Eigener Sync-Ordnername (Standard: notes, konfigurierbar für Multi-App-Setups)

Opt-in Autosave (5800183)

  • Autosave mit Debounce-Timer (3s nach letzter Bearbeitung, konfigurierbar in Einstellungen)
  • Standardmäßig deaktiviert, Opt-in über Einstellungen

Nach oben scrollen nach manuellem Sync (4697e49)

  • Notizliste scrollt nach Abschluss eines manuellen Syncs nach oben

🔄 Verbesserungen

Widget: Monet-Farbton in transluzenten Hintergründen (0f5a734)

  • Monet-Dynamic-Color-Farbton in transluzenten Widget-Hintergründen erhalten

Widget: Options-Leisten-Hintergrund entfernt (5e3273a)

  • Options-Leisten-Hintergrund für nahtlose Widget-Integration entfernt

Widget: Durchstreichung für erledigte Items (eb9db2e)

  • Erledigte Checklisten-Items in Widgets zeigen jetzt Durchstreichung

Widget: Auto-Refresh bei onStop (2443908)

  • Widgets aktualisieren automatisch beim Verlassen der App (onStop Lifecycle Hook)

Checkliste: Abhaken-Rückgängig stellt Originalposition wieder her (188a0f6)

  • Aufheben eines Hakens stellt das Item an seiner Originalposition wieder her

Sortier-Button: Kompakter Icon-Button (a1bd15a)

  • AssistChip durch kompakten IconButton + SwapVert-Icon ersetzt

🛠️ Intern

Code-Qualität (6708156)

  • Deprecated Icons.Outlined.NotesIcons.AutoMirrored.Outlined.Notes behoben
  • Ungenutzten Color-Import aus ServerSettingsScreen + Detekt-Baseline-Eintrag entfernt
  • Logger-Timestamps nutzen Locale.ROOT statt Locale.getDefault()
  • Obsoleten Build.VERSION_CODES.N-Check entfernt (minSdk=24)

Detekt-Compliance (f0e143c)

  • ALL_DELETED_GUARD_THRESHOLD-Konstante für MagicNumber-Compliance extrahiert

ProGuard/R8-Verifikation

  • Release-Build verifiziert — keine Regeländerungen für v1.9.0 nötig

Image Support auf v2.0.0 verschoben (845ba03)

  • Lokales Bild-Embedding aus v1.9.0 Scope entfernt
  • Feature als v2.0.0 Spezifikation mit vollständigem Architektur-Vorschlag erhalten

Weblate PR-Workflow (efd782f)

  • Weblate-Integration auf PR-basierten Übersetzungs-Workflow umgestellt

Dokumentation (395d154)

  • Dokumentation für v1.8.2 und v1.9.0 aktualisiert (FEATURES, UPCOMING, QUICKSTART)
  • Fehlerhafte Links in Docs behoben (schließt #22)

[1.8.2] - 2026-02-16

🔧 Stabilität, Editor- & Widget-Verbesserungen

Großes Stabilitäts-Release mit 26 behobenen Problemen — Sync-Deadlocks, Datenverlust-Prävention, SSL-Zertifikate, Markdown-Sync-Loop, stille Download-Fehler, Editor-UX-Verbesserungen, Widget-Polish und APK-Größenoptimierung.

🐛 Fehlerbehebungen

Sync blockiert dauerhaft bei "Bereits aktiv" (IMPL_01) (a62ab78)

  • 5 Code-Pfade in SyncWorker behoben, bei denen tryStartSync() aufgerufen wurde, aber der State nie zurückgesetzt wurde
  • Early Returns rufen nun SyncStateManager.reset() auf
  • CancellationException-Handler setzt State jetzt zurück statt ihn im SYNCING-Zustand zu belassen
  • Ursache: SyncStateManager blieb dauerhaft im SYNCING-State

Selbstsignierte SSL-Zertifikate in Release-Builds (IMPL_02) (b3f4915)

  • <certificates src="user" /> zur Netzwerk-Sicherheitskonfiguration hinzugefügt
  • User-installierte CA-Zertifikate funktionieren jetzt auch in Release-Builds

Text-Notizen nicht scrollbar in mittleren Widgets (IMPL_04) (8429306)

  • NARROW_MED und WIDE_MED Widget-Größenklassen nutzen jetzt TextNoteFullView (scrollbar)
  • 2x1- und 4x1-Widgets zeigen jetzt scrollbaren Textinhalt

Tastatur Auto-Großschreibung (IMPL_05) (d93b439)

  • Titel: KeyboardCapitalization.Words, Inhalt/Checklisten: KeyboardCapitalization.Sentences

Dokumentation: Sortieroption-Benennung (IMPL_06) (465bd9c)

  • "color"/"Farbe" zu "type"/"Typ" in README-Dateien und F-Droid-Metadaten geändert

Tastatur-Auto-Scroll für Text-Notizen (IMPL_07) (bc266b9)

  • TextNoteContent von TextFieldValue-API zu TextFieldState-API migriert
  • Scrollt automatisch zur Cursor-Position wenn Tastatur öffnet

Checklisten-Scroll-Sprung beim Tippen (IMPL_10) (974ef13)

  • Fehlerhafte Auto-Scroll-Logik aus v1.8.1 durch Viewport-aware Scroll ersetzt
  • Scrollt nur wenn Item tatsächlich unter den sichtbaren Bereich ragt

Visueller Glitch beim schnellen Scrollen in Checklisten (IMPL_11) (82e8972)

  • isDragConfirmed-State verhindert versehentliche Drag-Aktivierung beim Scrollen
  • Ursache: Modifier.animateItem() verursachte Fade-Animationen beim Scrolling

Checklisten-Drag am Separator unterbrochen (IMPL_26) (8828391)

  • Drag über die Erledigt/Offen-Trennlinie hinaus bricht nicht mehr ab
  • Item bleibt im aktiven Drag während der Haken nahtlos gesetzt/entfernt wird
  • Ursache: Getrennte itemsIndexed-Blöcke zerstörten die Composition beim Grenzübertritt — zu einheitlichem items-Block zusammengeführt

SyncMutex-Deadlock durch clearSessionCache()-Exception (IMPL_13) (99f451b)

  • clearSessionCache() in try-catch gewrappt im finally-Block
  • Verhindert, dass Mutex dauerhaft gesperrt bleibt

Falscher Error-Banner bei Sync-Abbruch (IMPL_14) (1c45680)

  • CancellationException zeigt keinen Error-Banner mehr
  • Doppelte State-Resets in SyncWorker catch-Blöcken entfernt

Socket-Leak in isServerReachable() (IMPL_15) (fac54d7)

  • Socket wird jetzt in allen Code-Pfaden korrekt geschlossen

CancellationException in ParallelDownloader verschluckt (IMPL_16) (4c34746)

  • CancellationException wird jetzt weitergeworfen statt gefangen und erneut versucht
  • Verhindert Endlosschleife wenn WorkManager Sync abbricht

Checklisten-Datenverlust bei onResume (IMPL_17) (b436623)

  • Checklisten-Änderungen bleiben erhalten beim Zurückkehren aus Benachrichtigungsleiste
  • Ursache: onResume() lud Notiz aus Datenbank neu, verwarf ungespeicherte Änderungen

Doppelter Stale-Sync Cleanup (IMPL_18) (71ae747)

  • Copy-Paste-Duplikat in SimpleNotesApplication.onCreate() entfernt

NotesStorage-Shadow + Download-Abbruch (IMPL_19) (ede429c, 50ae9d8)

  • Shadow-NotesStorage-Instanz in hasUnsyncedChanges() entfernt (19a)
  • runBlocking durch coroutineScope ersetzt für korrekte Abbruch-Propagation (19b)
  • Read-Timeout zu OkHttpClient-Instanzen hinzugefügt (19c)

Stille Download-Fehler als Erfolg gemeldet (IMPL_21) (371d5e3)

  • Download-Exceptions werden jetzt propagiert statt still verschluckt
  • Sync meldet korrekt Fehler wenn Downloads fehlschlagen

PENDING-Notizen nicht erkannt (IMPL_22) (20de019)

  • hasUnsyncedChanges() prüft jetzt auf Notizen mit PENDING-Sync-Status
  • Behebt Problem beim Server-Wechsel

E-Tag/Timestamp Download-Reihenfolge (IMPL_23) (68dbb4e)

  • E-Tag-Vergleich läuft jetzt vor Timestamp-Check (übersprang geänderte Notizen)
  • Behebt Cross-Device-Sync wo Timestamps stimmten aber Inhalt sich unterschied

Silent Sync zu sichtbarem Sync (IMPL_24) (940a494)

  • Pull-to-Refresh während Hintergrund-Sync zeigt jetzt Sync-Banner statt "bereits aktiv"-Fehler

Markdown-Sync Feedback-Loop (IMPL_25) (74194d4)

  • 5 Ursachen behoben die einen endlosen Export→Import→Re-Export-Zyklus verursachten
  • UUID-Normalisierung, Server-mtime-Erhaltung, Zeitzonen-Vergleich, Pfad-Sanitierung, Inhaltstyp-Vergleich

✨ Neue Features

Enter-Taste: Navigation von Titel zu Inhalt (IMPL_09) (81b9aca)

  • Titel-Feld ist jetzt einzeilig mit ImeAction.Next
  • Enter/Weiter springt zum Inhaltsfeld oder erstem Checklisten-Item

🔄 Verbesserungen

Widget-Inhalts-Padding (IMPL_08) (2ae5ce5)

  • Einheitliches Padding für alle Widget-Ansichten: 12dp horizontal, 4dp oben, 12dp unten

Widget-Eintrags-Abstände (IMPL_12) (c3d4b33)

  • Erhöhte Abstände in Checklisten- und Text-Widgets für bessere Lesbarkeit

Sync-State-Timeout

  • 5-Minuten-Timeout für verwaiste Sync-States in SyncStateManager
  • Verhindert dauerhaften Deadlock selbst wenn alle anderen Schutzmaßnahmen versagen

Kaltstart State-Cleanup

  • SimpleNotesApplication.onCreate() setzt jetzt verwaiste SYNCING-States zurück

APK-Größenoptimierung (IMPL_03) (7867894)

  • Breite ProGuard-Regel durch granulare Regeln ersetzt — behält nur was Reflection braucht

Versionsanhebung

  • versionCode: 21 → 22
  • versionName: 1.8.1 → 1.8.2

1.8.1 - 2026-02-11

🛠️ Bugfix & Polish Release

Checklisten-Fixes, Widget-Verbesserungen, Sync-Härtung und Code-Qualität.

🐛 Fehlerbehebungen

Checklisten-Sortierung Persistenz (7dbc06d)

  • Sortier-Option wurde beim erneuten Öffnen einer Checkliste nicht angewendet
  • Ursache: sortChecklistItems() sortierte immer unchecked-first statt _lastChecklistSortOption zu lesen
  • Alle Sortier-Modi werden nun korrekt wiederhergestellt (Manuell, Alphabetisch, Unchecked/Checked First)

Widget-Scroll bei Standard-Größe (c72b3fe)

  • Scrollen funktionierte nicht bei Standard-3×2-Widget-Größe (110–150dp Höhe)
  • Neue Größenklassen NARROW_SCROLL und WIDE_SCROLL mit 150dp-Schwelle
  • clickable-Modifier bei entsperrten Checklisten entfernt, um Scrollen zu ermöglichen

Auto-Sync Toast entfernt (fe6935a)

  • Unerwartete Toast-Benachrichtigung bei automatischem Hintergrund-Sync entfernt
  • Stiller Auto-Sync bleibt still; nur Fehler werden angezeigt

Gradient- & Drag-Regression (24fe32a)

  • Gradient-Overlay-Regression bei langen Checklisten-Items behoben
  • Drag-and-Drop-Flackern beim Verschieben zwischen Bereichen behoben

🆕 Neue Funktionen

Widget-Checklisten: Sortierung & Trennlinien (66d98c0)

  • Widgets übernehmen die gespeicherte Sortier-Option aus dem Editor
  • Visuelle Trennlinie zwischen unerledigten/erledigten Items (MANUAL & UNCHECKED_FIRST)
  • Auto-Sortierung beim Abhaken von Checkboxen im Widget
  • Emoji-Änderung: ✅ → ☑️ für erledigte Items

Checklisten-Vorschau-Sortierung (2c43b47)

  • Hauptbildschirm-Vorschau (NoteCard, NoteCardCompact, NoteCardGrid) zeigt gespeicherte Sortierung
  • Neuer ChecklistPreviewHelper mit geteilter Sortier-Logik

Auto-Scroll bei Zeilenumbruch (3e4b1bd)

  • Checklisten-Editor scrollt automatisch wenn Text in eine neue Zeile umbricht
  • Cursor bleibt am unteren Rand sichtbar während der Eingabe

Separator Drag Cross-Boundary (7b55811)

  • Drag-and-Drop funktioniert nun über die Checked/Unchecked-Trennlinie hinweg
  • Items wechseln automatisch ihren Status beim Verschieben über die Grenze
  • Extrahiertes DraggableChecklistItem-Composable für Wiederverwendbarkeit

🔄 Verbesserungen

Sync-Ratenlimit & Akkuschutz (ffe0e46, a1a574a)

  • Globaler 30-Sekunden-Cooldown zwischen Sync-Operationen (Auto/WiFi/Periodisch)
  • onSave-Syncs umgehen den globalen Cooldown (behalten eigenen 5s-Throttle)
  • Neuer SyncStateManager-Singleton für zentrales State-Tracking
  • Verhindert Akkuverbrauch durch schnelle aufeinanderfolgende Syncs

Toast → Banner-Migration (27e6b9d)

  • Alle nicht-interaktiven Benachrichtigungen auf einheitliches Banner-System migriert
  • Server-Lösch-Ergebnisse als INFO/ERROR-Banner angezeigt
  • INFO-Phase zu SyncPhase-Enum mit Auto-Hide (2,5s) hinzugefügt
  • Snackbars mit Undo-Aktionen bleiben unverändert

ProGuard-Regeln Audit (6356173)

  • Fehlende Keep-Regeln für Widget-ActionCallback-Klassen hinzugefügt
  • Compose-spezifische ProGuard-Regeln hinzugefügt
  • Verhindert ClassNotFoundException in Release-Builds

🧹 Code-Qualität

Detekt-Compliance (1a6617a)

  • Alle 12 Detekt-Findings behoben (0 Issues verbleibend)
  • NoteEditorViewModel.loadNote() refactored um Verschachtelungstiefe zu reduzieren
  • Konstanten für Magic Numbers im Editor extrahiert
  • Unbenutzte Imports aus UpdateChangelogSheet entfernt
  • maxIssues: 0 in Detekt-Konfiguration gesetzt

1.8.0 - 2026-02-10

🚨 CRITICAL BUGFIX (Tag neu erstellt)

R8/ProGuard Obfuscation Fix - Verhindert Datenverlust

  • 🔧 KRITISCH: Falscher ProGuard-Klassenpfad für Note$Companion$NoteRaw korrigiert
    • Original v1.8.0 hatte spezifische -keep Regeln die nicht griffen
    • R8 obfuskierte alle NoteRaw-Felder (id→a, title→b, ...)
    • Gson konnte JSON nicht mehr parsen → ALLE Notizen erschienen verschwunden
    • Zurück zur sicheren breiten Regel: -keep class dev.dettmer.simplenotes.** { *; }
  • 🛡️ Safety-Guards in detectServerDeletions() hinzugefügt
    • Verhindert Massenlöschung bei leeren serverNoteIds (Netzwerkfehler)
    • Abort wenn ALLE lokalen Notizen als gelöscht erkannt würden
  • ✅ Notizen waren nie wirklich verloren (JSON-Dateien intakt auf Disk + Server)
  • ✅ Downgrade auf v1.7.2 holte alle Notizen zurück

⚠️ Falls du v1.8.0 erste Version installiert hattest: Deine Notizen sind sicher! Einfach updaten.

🎉 Major: Widgets, Sortierung & Erweiterte Sync-Features

Komplettes Widget-System mit interaktiven Checklisten, Notiz-Sortierung und umfangreiche Sync-Verbesserungen!

🆕 Homescreen-Widgets

Vollständiges Jetpack Glance Widget-Framework (539987f)

  • 5 responsive Größenklassen (SMALL, NARROW_MED, NARROW_TALL, WIDE_MED, WIDE_TALL)
  • Interaktive Checklist-Checkboxen die sofort zum Server synchronisieren
  • Material You Dynamic Colors mit konfigurierbarer Hintergrund-Transparenz (0-100%)
  • Widget-Sperre-Toggle zum Verhindern versehentlicher Änderungen
  • Read-Only-Modus mit permanenter Options-Leiste für gesperrte Widgets
  • Widget-Konfigurations-Activity mit Notiz-Auswahl und Einstellungen
  • Auto-Refresh nach Sync-Abschluss
  • Tippen auf Inhalt öffnet Editor (entsperrt) oder zeigt Optionen (gesperrt)
  • Vollständige Resource-Cleanup-Fixes für Connection Leaks

Widget State Management:

  • NoteWidgetState Keys für pro-Instanz-Persistierung via DataStore
  • Fünf Top-Level ActionCallbacks (Toggle Checkbox, Lock, Options, Refresh, Config)
  • Type-Safe Parameter-Übergabe mit NoteWidgetActionKeys

📊 Notiz- & Checklisten-Sortierung

Notiz-Sortierung (96c819b)

  • Sortieren nach: Aktualisiert (neueste/älteste), Erstellt, Titel (A-Z/Z-A), Typ
  • Persistente Sortierungs-Präferenzen (gespeichert in SharedPreferences)
  • Sortierungs-Dialog im Hauptbildschirm mit Richtungs-Toggle
  • Kombinierte sortedNotes StateFlow im MainViewModel

Checklisten-Sortierung (96c819b, 900dad7)

  • Sortieren nach: Manual, Alphabetisch, Offen zuerst, Erledigt zuletzt
  • Visueller Separator zwischen offenen/erledigten Items mit Anzahl-Anzeige
  • Auto-Sort bei Item-Toggle und Neuordnung
  • Drag nur innerhalb gleicher Gruppe (offen/erledigt)
  • Sanfte Fade/Slide-Animationen für Item-Übergänge
  • Unit-getestet mit 9 Testfällen für Sortierungs-Logik-Validierung

🔄 Sync-Verbesserungen

Server-Löschungs-Erkennung (40d7c83, bf7a74e)

  • Neuer DELETED_ON_SERVER Sync-Status für Multi-Device-Szenarien
  • Erkennt wenn Notizen auf anderen Clients gelöscht wurden
  • Zero Performance-Impact (nutzt existierende PROPFIND-Daten)
  • Löschungs-Anzahl im Sync-Banner: "3 synchronisiert · 2 auf Server gelöscht"
  • Bearbeitete gelöschte Notizen werden automatisch zum Server hochgeladen (Status → PENDING)

Sync-Status-Legende (07607fc)

  • Hilfe-Button (?) in Hauptbildschirm TopAppBar
  • Dialog erklärt alle 5 Sync-Status-Icons mit Beschreibungen
  • Nur sichtbar wenn Sync konfiguriert ist

Live-Sync-Fortschritts-UI (df37d2a)

  • Echtzeit-Phasen-Indikatoren: PREPARING, UPLOADING, DOWNLOADING, IMPORTING_MARKDOWN
  • Upload-Fortschritt zeigt x/y Counter (bekannte Gesamtzahl)
  • Download-Fortschritt zeigt Anzahl (unbekannte Gesamtzahl)
  • Einheitliches SyncProgressBanner (ersetzt Dual-System)
  • Auto-Hide: COMPLETED (2s), ERROR (4s)
  • Keine irreführenden Counter wenn nichts zu synchronisieren ist
  • Stiller Auto-Sync bleibt still, Fehler werden immer angezeigt

Parallele Downloads (bdfc0bf)

  • Konfigurierbare gleichzeitige Downloads (Standard: 3 simultan)
  • Kotlin Coroutines async/awaitAll Pattern
  • Individuelle Download-Timeout-Behandlung
  • Graceful sequentieller Fallback bei gleichzeitigen Fehlern
  • Optimierte Netzwerk-Auslastung für schnelleren Sync

✨ UX-Verbesserungen

Checklisten-Verbesserungen:

  • Überlauf-Verlauf für lange Text-Items (3462f93)
  • Auto-Expand bei Fokus, Collapse auf 5 Zeilen bei Fokus-Verlust
  • Drag & Drop Flackern-Fix mit Straddle-Target-Center-Erkennung (538a705)
  • Adjacency-Filter verhindert Item-Sprünge bei schnellem Drag
  • Race-Condition-Fix für Scroll + Move-Operationen

Einstellungs-UI-Polish:

  • Sanfter Sprachwechsel ohne Activity-Recreate (881c0fd)
  • Raster-Ansicht als Standard für Neu-Installationen (6858446)
  • Sync-Einstellungen umstrukturiert in klare Sektionen: Auslöser & Performance (eaac5a0)
  • Changelog-Link zum About-Screen hinzugefügt (49810ff)

Post-Update Changelog-Dialog (661d9e0)

  • Zeigt lokalisierten Changelog beim ersten Start nach Update
  • Material 3 ModalBottomSheet mit Slide-up-Animation
  • Lädt F-Droid Changelogs via Assets (Single Source of Truth)
  • Einmalige Anzeige pro versionCode (gespeichert in SharedPreferences)
  • Klickbarer GitHub-Link für vollständigen Changelog
  • Durch Button oder Swipe-Geste schließbar
  • Test-Modus in Debug-Einstellungen mit Reset-Option

Backup-Einstellungs-Verbesserungen (3e946ed)

  • Neue BackupProgressCard mit LinearProgressIndicator
  • 3-Phasen-Status-System: In Progress → Abschluss → Löschen
  • Erfolgs-Status für 2s angezeigt, Fehler für 3s
  • Redundante Toast-Nachrichten entfernt
  • Buttons bleiben sichtbar und deaktiviert während Operationen
  • Exception-Logging für besseres Error-Tracking

🐛 Fehlerbehebungen

Widget-Text-Anzeige (d045d4d)

  • Text-Notizen zeigen nicht mehr nur 3 Zeilen in Widgets
  • Von Absatz-basiert zu Zeilen-basiertem Rendering geändert
  • LazyColumn scrollt jetzt korrekt durch gesamten Inhalt
  • Leere Zeilen als 8dp Spacer beibehalten
  • Vorschau-Limits erhöht: compact 100→120, full 200→300 Zeichen

🔧 Code-Qualität

Detekt-Cleanup (1da1a63)

  • Alle 22 Detekt-Warnungen behoben
  • 7 ungenutzte Imports entfernt
  • Konstanten für 5 Magic Numbers definiert
  • State-Reads mit derivedStateOf optimiert
  • Build: 0 Lint-Fehler + 0 Detekt-Warnungen

📚 Dokumentation

  • Vollständige Implementierungs-Pläne für alle 23 v1.8.0 Features
  • Widget-System-Architektur und State-Management-Docs
  • Sortierungs-Logik Unit-Tests mit Edge-Case-Coverage
  • F-Droid Changelogs (Englisch + Deutsch)

1.7.2 - 2026-02-04

🐛 Kritische Fehlerbehebungen

JSON/Markdown Timestamp-Synchronisation

Problem: Externe Editoren (Obsidian, Typora, VS Code, eigene Editoren) aktualisieren Markdown-Inhalt, aber nicht den YAML updated: Timestamp, wodurch die Android-App Änderungen überspringt.

Lösung:

  • Server-Datei Änderungszeit (mtime) wird jetzt als Source of Truth statt YAML-Timestamp verwendet
  • Inhaltsänderungen werden via Hash-Vergleich erkannt
  • Notizen nach Markdown-Import als PENDING markiert → JSON automatisch beim nächsten Sync hochgeladen
  • Behebt Sortierungsprobleme nach externen Bearbeitungen

SyncStatus auf Server immer PENDING

Problem: Alle JSON-Dateien auf dem Server enthielten "syncStatus": "PENDING" auch nach erfolgreichem Sync, was externe Clients verwirrte.

Lösung:

  • Status wird jetzt auf SYNCED gesetzt vor JSON-Serialisierung
  • Server- und lokale Kopien sind jetzt konsistent
  • Externe Web/Tauri-Editoren können Sync-Status korrekt interpretieren

Deletion Tracker Race Condition

Problem: Batch-Löschungen konnten Lösch-Einträge verlieren durch konkurrierenden Dateizugriff.

Lösung:

  • Mutex-basierte Synchronisation für Deletion Tracking
  • Neue trackDeletionSafe() Funktion verhindert Race Conditions
  • Garantiert Zombie-Note-Prevention auch bei schnellen Mehrfach-Löschungen

ISO8601 Timezone-Parsing

Problem: Markdown-Importe schlugen fehl mit Timezone-Offsets wie +01:00 oder -05:00.

Lösung:

  • Multi-Format ISO8601 Parser mit Fallback-Kette
  • Unterstützt UTC (Z), Timezone-Offsets (+01:00, +0100) und Millisekunden
  • Kompatibel mit Obsidian, Typora, VS Code Timestamps

⚡ Performance-Verbesserungen

E-Tag Batch Caching

  • E-Tags werden jetzt in einer einzigen Batch-Operation geschrieben statt N einzelner Schreibvorgänge
  • Performance-Gewinn: ~50-100ms pro Sync mit mehreren Notizen
  • Reduzierte Disk-I/O-Operationen

Memory Leak Prevention

  • SafeSardineWrapper implementiert jetzt Closeable für explizites Resource-Cleanup
  • HTTP Connection Pool wird nach Sync korrekt aufgeräumt
  • Verhindert Socket-Exhaustion bei häufigen Syncs

🔧 Technische Details

  • IMPL_001: kotlinx.coroutines.sync.Mutex für thread-sicheres Deletion Tracking
  • IMPL_002: Pattern-basierter ISO8601 Parser mit 8 Format-Varianten
  • IMPL_003: Connection Pool Eviction + Dispatcher Shutdown in close()
  • IMPL_004: Batch SharedPreferences.Editor Updates
  • IMPL_014: Server mtime Parameter in Note.fromMarkdown()
  • IMPL_015: syncStatus vor toJson() Aufruf gesetzt

📚 Dokumentation

  • External Editor Specification für Web/Tauri-Editor-Entwickler
  • Detaillierte Implementierungs-Dokumentation für alle Bugfixes

1.7.1 - 2026-02-02

🐛 Kritische Fehlerbehebungen

Android 9 App-Absturz Fix (#15)

Problem: App stürzte auf Android 9 (API 28) ab wenn WorkManager Expedited Work für Hintergrund-Sync verwendet wurde.

Root Cause: Wenn setExpedited() in WorkManager verwendet wird, muss die CoroutineWorker die Methode getForegroundInfo() implementieren um eine Foreground Service Notification zurückzugeben. Auf Android 9-11 ruft WorkManager diese Methode auf, aber die Standard-Implementierung wirft IllegalStateException: Not implemented.

Lösung: getForegroundInfo() in SyncWorker implementiert um eine korrekte ForegroundInfo mit Sync-Progress-Notification zurückzugeben.

Details:

  • ForegroundInfo mit Sync-Progress-Notification für Android 9-11 hinzugefügt
  • Android 10+: Setzt FOREGROUND_SERVICE_TYPE_DATA_SYNC für korrekte Service-Typisierung
  • Foreground Service Permissions in AndroidManifest.xml hinzugefügt
  • Notification zeigt Sync-Progress mit indeterminiertem Progress Bar
  • Danke an @roughnecks für das detaillierte Debugging!

VPN-Kompatibilitäts-Fix (#11)

  • WiFi Socket-Binding erkennt jetzt korrekt Wireguard VPN-Interfaces (tun*, wg*, -wg-)
  • Traffic wird korrekt durch VPN-Tunnel geleitet statt direkt über WiFi
  • Behebt "Verbindungs-Timeout" beim Sync zu externen Servern über VPN

🔧 Technische Änderungen

  • Neue SafeSardineWrapper Klasse stellt korrektes HTTP-Connection-Cleanup sicher
  • Weniger unnötige 401-Authentifizierungs-Challenges durch preemptive Auth-Header
  • ProGuard-Regel hinzugefügt um harmlose TextInclusionStrategy-Warnungen zu unterdrücken
  • VPN-Interface-Erkennung via NetworkInterface.getNetworkInterfaces() Pattern-Matching
  • Foreground Service Erkennung und Notification-System für Hintergrund-Sync-Tasks

🌍 Lokalisierung

  • Hardcodierte deutsche Fehlermeldungen behoben - jetzt String-Resources für korrekte Lokalisierung
  • Deutsche und englische Strings für Sync-Progress-Notifications hinzugefügt

1.7.0 - 2026-01-26

🎉 Major: Grid-Ansicht, Nur-WLAN Sync & VPN-Unterstützung

Pinterest-Style Grid, Nur-WLAN Sync-Modus und korrekte VPN-Unterstützung!

🎨 Grid-Layout

  • Pinterest-Style Staggered Grid ohne Lücken
  • Konsistente 12dp Abstände zwischen Cards
  • Scroll-Position bleibt erhalten nach Einstellungen
  • Neue einheitliche NoteCardGrid mit dynamischen Vorschauzeilen (3 klein, 6 groß)

📡 Sync-Verbesserungen

  • Nur-WLAN Sync Toggle - Sync nur wenn WLAN verbunden
  • VPN-Unterstützung - Sync funktioniert korrekt bei aktivem VPN (Traffic über VPN)
  • Server-Wechsel Erkennung - Alle Notizen auf PENDING zurückgesetzt bei Server-URL Änderung
  • Schnellere Server-Prüfung - Socket-Timeout von 2s auf 1s reduziert
  • "Sync läuft bereits" Feedback - Zeigt Snackbar wenn Sync bereits läuft

🔒 Self-Signed SSL Unterstützung

  • Dokumentation hinzugefügt - Anleitung für selbst-signierte Zertifikate
  • Nutzt Android's eingebauten CA Trust Store
  • Funktioniert mit ownCloud, Nextcloud, Synology, Home-Servern

🔧 Technisch

  • NoteCardGrid Komponente mit dynamischen maxLines
  • FullLine Spans entfernt für lückenloses Layout
  • resetAllSyncStatusToPending() in NotesStorage
  • VPN-Erkennung in getOrCacheWiFiAddress()

1.6.1 - 2026-01-20

🧹 Code-Qualität & Build-Verbesserungen

  • detekt: 0 Issues - Alle 29 Code-Qualitäts-Issues behoben

    • Triviale Fixes: Unused Imports, MaxLineLength
    • Datei umbenannt: DragDropState.kt → DragDropListState.kt
    • MagicNumbers → Constants (Dimensions.kt, SyncConstants.kt)
    • SwallowedException: Logger.w() für besseres Error-Tracking hinzugefügt
    • LongParameterList: ChecklistEditorCallbacks data class erstellt
    • LongMethod: ServerSettingsScreen in Komponenten aufgeteilt
    • @Suppress Annotationen für Legacy-Code (WebDavSyncService, SettingsActivity)
  • Zero Build Warnings - Alle 21 Deprecation Warnings eliminiert

    • File-level @Suppress für deprecated Imports
    • ProgressDialog, LocalBroadcastManager, AbstractSavedStateViewModelFactory
    • onActivityResult, onRequestPermissionsResult
    • Gradle Compose Config bereinigt (StrongSkipping ist jetzt Standard)
  • ktlint reaktiviert - Linting mit Compose-spezifischen Regeln wieder aktiviert

    • .editorconfig mit Compose Formatierungsregeln erstellt
    • Legacy-Dateien ausgeschlossen: WebDavSyncService.kt, build.gradle.kts
    • ignoreFailures=true für graduelle Migration
  • CI/CD Verbesserungen - GitHub Actions Lint-Checks integriert

    • detekt + ktlint + Android Lint laufen vor Build in pr-build-check.yml
    • Stellt Code-Qualität bei jedem Pull Request sicher

🔧 Technische Verbesserungen

  • Constants Refactoring - Bessere Code-Organisation

    • ui/theme/Dimensions.kt: UI-bezogene Konstanten
    • utils/SyncConstants.kt: Sync-Operations Konstanten
  • Vorbereitung für v2.0.0 - Legacy-Code für Entfernung markiert

    • SettingsActivity und MainActivity (ersetzt durch Compose-Versionen)
    • Alle deprecated APIs mit Removal-Plan dokumentiert

1.6.0 - 2026-01-19

🎉 Major: Konfigurierbare Sync-Trigger

Feingranulare Kontrolle darüber, wann deine Notizen synchronisiert werden - wähle die Trigger, die am besten zu deinem Workflow passen!

⚙️ Sync-Trigger System

  • Individuelle Trigger-Kontrolle - Jeden Sync-Trigger einzeln in den Einstellungen aktivieren/deaktivieren

  • 5 Unabhängige Trigger:

    • onSave Sync - Sync sofort nach dem Speichern einer Notiz (5s Throttle)
    • onResume Sync - Sync beim Öffnen der App (60s Throttle)
    • WiFi-Connect Sync - Sync bei WiFi-Verbindung
    • Periodischer Sync - Hintergrund-Sync alle 15/30/60 Minuten (konfigurierbar)
    • Boot Sync - Startet Hintergrund-Sync nach Geräteneustart
  • Smarte Defaults - Nur ereignisbasierte Trigger standardmäßig aktiv (onSave, onResume, WiFi-Connect)

  • Akku-optimiert - ~0.2%/Tag mit Defaults, bis zu ~1.0% mit aktiviertem periodischen Sync

  • Offline-Modus UI - Ausgegraute Sync-Toggles wenn kein Server konfiguriert

  • Dynamischer Settings-Subtitle - Zeigt Anzahl aktiver Trigger im Haupteinstellungs-Screen

🔧 Server-Konfiguration Verbesserungen

  • Offline-Modus Toggle - Alle Netzwerkfunktionen mit einem Schalter deaktivieren
  • Getrennte Protokoll & Host Eingabe - Protokoll (http/https) als nicht-editierbares Präfix angezeigt
  • Klickbare Settings-Cards - Gesamte Card klickbar für bessere UX
  • Klickbare Toggle-Zeilen - Text/Icon klicken um Switches zu bedienen (nicht nur der Switch selbst)

🐛 Bug Fixes

  • Fix: Fehlender 5. Sync-Trigger (Boot) in der Haupteinstellungs-Screen Subtitle-Zählung
  • Fix: Offline-Modus Status wird nicht aktualisiert beim Zurückkehren aus Einstellungen
  • Fix: Pull-to-Refresh funktioniert auch im Offline-Modus

🔧 Technische Verbesserungen

  • Reaktiver Offline-Modus Status - StateFlow stellt sicher, dass UI korrekt aktualisiert wird
  • Getrennte Server-Config Checks - hasServerConfig() vs isServerConfigured() (offline-aware)
  • Verbesserte Konstanten - Alle Sync-Trigger Keys und Defaults in Constants.kt
  • Bessere Code-Organisation - Settings-Screens für Klarheit refactored

Looking Ahead

🚀 v1.7.0 wird Server-Ordner Prüfung und weitere Community-Features bringen. Feature-Requests sind willkommen als GitHub Issue.


1.5.0 - 2026-01-15

🎉 Major: Jetpack Compose UI Redesign

Das komplette UI wurde von XML-Views auf Jetpack Compose migriert. Die App ist jetzt moderner, schneller und flüssiger.

🌍 New Feature: Internationalization (i18n)

  • Englische Sprachunterstützung - Alle 400+ Strings übersetzt
  • Automatische Spracherkennung - Folgt der System-Sprache
  • Manuelle Sprachauswahl - In den Einstellungen umschaltbar
  • Per-App Language (Android 13+) - Native Spracheinstellung über System-Settings
  • locales_config.xml - Vollständige Android-Integration

⚙️ Modernized Settings

  • 7 kategorisierte Settings-Screens - Übersichtlicher und intuitiver
  • Compose Navigation - Flüssige Übergänge zwischen Screens
  • Konsistentes Design - Material Design 3 durchgängig

✨ UI Improvements

  • Selection Mode - Long-Press für Mehrfachauswahl statt Swipe-to-Delete
  • Batch Delete - Mehrere Notizen gleichzeitig löschen
  • Silent-Sync Mode - Kein Banner bei Auto-Sync (nur bei manuellem Sync)
  • App Icon in About Screen - Hochwertige Darstellung
  • App Icon in Empty State - Statt Emoji bei leerer Notizliste
  • Splash Screen Update - Verwendet App-Foreground-Icon
  • Slide Animations - Flüssige Animationen im NoteEditor

🔧 Technical Improvements

  • Jetpack Compose - Komplette UI-Migration
  • Compose ViewModel Integration - StateFlow für reactive UI
  • Improved Code Quality - Detekt/Lint Warnings behoben
  • Unused Imports Cleanup - Sauberer Codebase

Looking Ahead

🚀 v1.6.0 wird Server-Ordner Prüfung und weitere technische Modernisierungen bringen. Feature-Requests gerne als GitHub Issue einreichen.


1.4.1 - 2026-01-11

Fixed

  • 🗑️ Löschen älterer Notizen (v1.2.0 Kompatibilität)

    • Notizen aus App-Version v1.2.0 oder früher werden jetzt korrekt vom Server gelöscht
    • Behebt Problem bei Multi-Device-Nutzung mit älteren Notizen
  • 🔄 Checklisten-Sync Abwärtskompatibilität

    • Checklisten werden jetzt auch als Text-Fallback im content-Feld gespeichert
    • Ältere App-Versionen (v1.3.x) zeigen Checklisten als lesbaren Text
    • Format: GitHub-Style Task-Listen ([ ] Item / [x] Item)
    • Recovery-Mode: Falls Checklisten-Items verloren gehen, werden sie aus dem Content wiederhergestellt

Improved

  • 📝 Checklisten Auto-Zeilenumbruch
    • Lange Checklisten-Texte werden jetzt automatisch umgebrochen
    • Keine Begrenzung auf 3 Zeilen mehr
    • Enter-Taste erstellt weiterhin ein neues Item

Looking Ahead

🚀 v1.5.0 wird das nächste größere Release. Wir sammeln Ideen und Feedback!
Feature-Requests gerne als GitHub Issue einreichen.


1.4.0 - 2026-01-10

🎉 New Feature: Checklists

  • ✅ Checklist Notes

    • New note type: Checklists with tap-to-toggle items
    • Add items via dedicated input field with "+" button
    • Drag & drop reordering (long-press to activate)
    • Swipe-to-delete items
    • Visual distinction: Checked items get strikethrough styling
    • Type selector when creating new notes (Text or Checklist)
  • 📝 Markdown Integration

    • Checklists export as GitHub-style task lists (- [ ] / - [x])
    • Compatible with Obsidian, Notion, and other Markdown editors
    • Full round-trip: Edit in Obsidian → Sync back to app
    • YAML frontmatter includes type: checklist for identification

Fixed

  • � Markdown Parsing Robustness

    • Fixed content extraction after title (was returning empty for some formats)
    • Now handles single newline after title (was requiring double newline)
    • Protection: Skips import if parsed content is empty but local has content
  • 📂 Duplicate Filename Handling

    • Notes with identical titles now get unique Markdown filenames
    • Format: title_shortid.md (e.g., test_71540ca9.md)
    • Prevents data loss from filename collisions
  • 🔔 Notification UX

    • No sync notifications when app is in foreground
    • User sees changes directly in UI - no redundant notification
    • Background syncs still show notifications as expected

Privacy Improvements

  • 🔒 WiFi Permissions Removed
    • Removed ACCESS_WIFI_STATE permission
    • Removed CHANGE_WIFI_STATE permission
    • WiFi binding now works via IP detection instead of SSID matching
    • Cleaned up all SSID-related code from codebase and documentation

Technical Improvements

  • 📦 New Data Model

    • NoteType enum: TEXT, CHECKLIST
    • ChecklistItem data class with id, text, isChecked, order
    • Note.kt extended with noteType and checklistItems fields
  • 🔄 Sync Protocol v1.4.0

    • JSON format updated to include checklist fields
    • Full backward compatibility with v1.3.x notes
    • Robust JSON parsing with manual field extraction

1.3.2 - 2026-01-10

Changed

  • 🧹 Code-Qualität: "Clean Slate" Release
    • Alle einfachen Lint-Issues behoben (Phase 1-7 des Cleanup-Plans)
    • Unused Imports und Members entfernt
    • Magic Numbers durch benannte Konstanten ersetzt
    • SwallowedExceptions mit Logger.w() versehen
    • MaxLineLength-Verstöße reformatiert
    • ConstructorParameterNaming (snake_case → camelCase mit @SerializedName)
    • Custom Exceptions: SyncException.kt und ValidationException.kt erstellt

Added

  • 📝 F-Droid Privacy Notice
    • Datenschutz-Hinweis für die Datei-Logging-Funktion
    • Erklärt dass Logs nur lokal gespeichert werden
    • Erfüllt F-Droid Opt-in Consent-Anforderungen

Technical Improvements

  • ⚡ Neue Konstanten für bessere Wartbarkeit

    • SYNC_COMPLETED_DELAY_MS, ERROR_DISPLAY_DELAY_MS (MainActivity)
    • CONNECTION_TIMEOUT_MS (SettingsActivity)
    • SOCKET_TIMEOUT_MS, MAX_FILENAME_LENGTH, ETAG_PREVIEW_LENGTH (WebDavSyncService)
    • AUTO_CANCEL_TIMEOUT_MS (NotificationHelper)
    • RFC 1918 IP-Range Konstanten (UrlValidator)
    • DAYS_THRESHOLD, TRUNCATE_SUFFIX_LENGTH (Extensions)
  • 🔒 @Suppress Annotations für legitime Patterns

    • ReturnCount: Frühe Returns für Validierung sind idiomatisch
    • LoopWithTooManyJumpStatements: Komplexe Sync-Logik dokumentiert

Notes

  • Komplexe Refactorings (LargeClass, LongMethod) für v1.3.3+ geplant
  • Deprecation-Warnungen (LocalBroadcastManager, ProgressDialog) bleiben bestehen

1.3.1 - 2026-01-08

Fixed

  • 🔧 Multi-Device JSON Sync (Danke an Thomas aus Bielefeld)
    • JSON-Dateien werden jetzt korrekt zwischen Geräten synchronisiert
    • Funktioniert auch ohne aktiviertes Markdown
    • Hybrid-Optimierung: Server-Timestamp (Primary) + E-Tag (Secondary) Checks
    • E-Tag wird nach Upload gecached um Re-Download zu vermeiden

Performance Improvements

  • ⚡ JSON Sync Performance-Parität

    • JSON-Sync erreicht jetzt gleiche Performance wie Markdown (~2-3 Sekunden)
    • Timestamp-basierte Skip-Logik für unveränderte Dateien (~500ms pro Datei gespart)
    • E-Tag-Matching als Fallback für Dateien die seit letztem Sync modifiziert wurden
    • Beispiel: 24 Dateien von 12-14s auf ~2.7s reduziert (keine Änderungen)
  • ⏭️ Skip unveränderte Dateien (Haupt-Performance-Fix!)

    • JSON-Dateien: Überspringt alle Notizen, die seit letztem Sync nicht geändert wurden
    • Markdown-Dateien: Überspringt unveränderte MD-Dateien basierend auf Server-Timestamp
    • Spart ~500ms pro Datei bei Nextcloud (~20 Dateien = 10 Sekunden gespart!)
    • Von 21 Sekunden Sync-Zeit auf 2-3 Sekunden reduziert
  • ⚡ Session-Caching für WebDAV

    • Sardine-Client wird pro Sync-Session wiederverwendet (~600ms gespart)
    • WiFi-IP-Adresse wird gecacht statt bei jeder Anfrage neu ermittelt (~300ms gespart)
    • /notes/ Ordner-Existenz wird nur einmal pro Sync geprüft (~500ms gespart)
    • Gesamt: ~1.4 Sekunden zusätzlich gespart
  • 📝 Content-basierte Markdown-Erkennung

    • Extern bearbeitete Markdown-Dateien werden auch erkannt wenn YAML-Timestamp nicht aktualisiert wurde
    • Löst das Problem: Obsidian/Texteditor-Änderungen wurden nicht importiert
    • Hybridansatz: Erst Timestamp-Check (schnell), dann Content-Vergleich (zuverlässig)

Added

  • 🔄 Sync-Status-Anzeige (UI)
    • Sichtbares Banner "Synchronisiere..." mit ProgressBar während Sync läuft
    • Sync-Button und Pull-to-Refresh werden deaktiviert während Sync aktiv
    • Verhindert versehentliche Doppel-Syncs durch visuelle Rückmeldung
    • Auch in Einstellungen: "Jetzt synchronisieren" Button wird deaktiviert

Fixed

  • 🔧 Sync-Mutex verhindert doppelte Syncs

    • Keine doppelten Toast-Nachrichten mehr bei schnellem Pull-to-Refresh
    • Concurrent Sync-Requests werden korrekt blockiert
  • 🐛 Lint-Fehler behoben

    • View.generateViewId() statt hardcodierte IDs in RadioButtons
    • app:tint statt android:tint für AppCompat-Kompatibilität

Added

  • 🔍 detekt Code-Analyse

    • Statische Code-Analyse mit detekt 1.23.4 integriert
    • Pragmatische Konfiguration für Sync-intensive Codebasis
    • 91 Issues identifiziert (als Baseline für v1.4.0)
  • 🏗️ Debug Build mit separatem Package

    • Debug-APK kann parallel zur Release-Version installiert werden
    • Package: dev.dettmer.simplenotes.debug (Debug) vs dev.dettmer.simplenotes (Release)
    • App-Name zeigt "Simple Notes (Debug)" für einfache Unterscheidung
  • 📊 Debug-Logging UI

    • Neuer "Debug Log" Button in Einstellungen → Erweitert
    • Zeigt letzte Sync-Logs mit Zeitstempeln
    • Export-Funktion für Fehlerberichte

Technical

  • WebDavSyncService: Hybrid-Optimierung für JSON-Downloads (Timestamp PRIMARY, E-Tag SECONDARY)
  • WebDavSyncService: E-Tag refresh nach Upload statt Invalidierung (verhindert Re-Download)
  • E-Tag Caching: SharedPreferences mit Key-Pattern etag_json_{noteId}
  • Skip-Logik: if (serverModified <= lastSync) skip → ~1ms pro Datei
  • Fallback E-Tag: if (serverETag == cachedETag) skip → für Dateien modifiziert nach lastSync
  • PROPFIND nach PUT: Fetch E-Tag nach Upload für korrektes Caching
  • SyncStateManager: Neuer Singleton mit StateFlow<Boolean> für Sync-Status
  • MainActivity: Observer auf SyncStateManager.isSyncing für UI-Updates
  • Layout: sync_status_banner mit ProgressBar + TextView
  • WebDavSyncService: Skip-Logik für unveränderte JSON/MD Dateien basierend auf lastSyncTimestamp
  • WebDavSyncService: Neue Session-Cache-Variablen (sessionSardine, sessionWifiAddress, notesDirEnsured)
  • getOrCreateSardine(): Cached Sardine-Client mit automatischer Credentials-Konfiguration
  • getOrCacheWiFiAddress(): WiFi-Adresse wird nur einmal pro Sync ermittelt
  • clearSessionCache(): Aufräumen am Ende jeder Sync-Session
  • ensureNotesDirectoryExists(): Cached Directory-Check
  • Content-basierter Import: Vergleicht MD-Content mit lokaler Note wenn Timestamps gleich
  • Build-Tooling: detekt aktiviert, ktlint vorbereitet (deaktiviert wegen Parser-Problemen)
  • Debug BuildType: applicationIdSuffix = ".debug", versionNameSuffix = "-debug"

1.3.0 - 2026-01-07

Added

  • 🚀 Multi-Device Sync (Thanks to Thomas from Bielefeld for reporting!)

    • Automatic download of new notes from other devices
    • Deletion tracking prevents "zombie notes" (deleted notes don't come back)
    • Smart cleanup: Re-created notes (newer timestamp) are downloaded
    • Works with all devices: v1.2.0, v1.2.1, v1.2.2, and v1.3.0
  • 🗑️ Server Deletion via Swipe Gesture

    • Swipe left on notes to delete from server (requires confirmation)
    • Prevents duplicate notes on other devices
    • Works with deletion tracking system
    • Material Design confirmation dialog
  • ⚡ E-Tag Performance Optimization

    • Smart server checking with E-Tag caching (~150ms vs 3000ms for "no changes")
    • 20x faster when server has no updates
    • E-Tag hybrid approach: E-Tag for JSON (fast), timestamp for Markdown (reliable)
    • Battery-friendly with minimal server requests
  • 📥 Markdown Auto-Sync Toggle

    • NEW: Unified Auto-Sync toggle in Settings (replaces separate Export/Auto-Import toggles)
    • When enabled: Notes export to Markdown AND import changes automatically
    • When disabled: Manual sync button appears for on-demand synchronization
    • Performance: Auto-Sync OFF = 0ms overhead
  • 🔘 Manual Markdown Sync Button

    • Manual sync button for performance-conscious users
    • Shows import/export counts after completion
    • Only visible when Auto-Sync is disabled
    • On-demand synchronization (~150-200ms only when triggered)
  • ⚙️ Server-Restore Modes

    • MERGE: Keep local notes + add server notes
    • REPLACE: Delete all local + download from server
    • OVERWRITE: Update duplicates, keep non-duplicates
    • Restore modes now work correctly for WebDAV restore

Technical

  • New DeletionTracker model with JSON persistence
  • NotesStorage: Added deletion tracking methods
  • WebDavSyncService.hasUnsyncedChanges(): Intelligent server checks with E-Tag caching
  • WebDavSyncService.downloadRemoteNotes(): Deletion-aware downloads
  • WebDavSyncService.restoreFromServer(): Support for restore modes
  • WebDavSyncService.deleteNoteFromServer(): Server deletion with YAML frontmatter scanning
  • WebDavSyncService.importMarkdownFiles(): Automatic Markdown import during sync
  • WebDavSyncService.manualMarkdownSync(): Manual sync with result counts
  • MainActivity.setupSwipeToDelete(): Two-stage swipe deletion with confirmation
  • E-Tag caching in SharedPreferences for performance

1.2.2 - 2026-01-06

Fixed

  • Backward Compatibility for v1.2.0 Users (Critical)
    • App now reads BOTH old (Root) AND new (/notes/) folder structures
    • Users upgrading from v1.2.0 no longer lose their existing notes
    • Server-Restore now finds notes from v1.2.0 stored in Root folder
    • Automatic deduplication prevents loading the same note twice
    • Graceful error handling if Root folder is not accessible

Technical

  • WebDavSyncService.downloadRemoteNotes() - Dual-mode download (Root + /notes/)
  • WebDavSyncService.restoreFromServer() - Now uses dual-mode download
  • Migration happens naturally: new uploads go to /notes/, old notes stay readable

1.2.1 - 2026-01-05

Fixed

  • Markdown Initial Export Bugfix

    • Existing notes are now exported as Markdown when Desktop Integration is activated
    • Previously, only new notes created after activation were exported
    • Progress dialog shows export status with current/total counter
    • Error handling for network issues during export
    • Individual note failures don't abort the entire export
  • Markdown Directory Structure Fix

    • Markdown files now correctly land in /notes-md/ folder
    • Smart URL detection supports both Root-URL and /notes URL structures
    • Previously, MD files were incorrectly placed in the root directory
    • Markdown import now finds files correctly
  • JSON URL Normalization

    • Simplified server configuration: enter only base URL (e.g., http://server:8080/)
    • App automatically creates /notes/ for JSON files and /notes-md/ for Markdown
    • Smart detection: both http://server:8080/ and http://server:8080/notes/ work correctly
    • Backward compatible: existing setups with /notes in URL continue to work
    • No migration required for existing users

Changed

  • Markdown Directory Creation

    • notes-md/ folder is now created on first sync (regardless of Desktop Integration setting)
    • Prevents 404 errors when mounting WebDAV folder
    • Better user experience: folder is visible before enabling the feature
  • Settings UI Improvements

    • Updated example URL from /webdav to /notes to match app behavior
    • Example now shows: http://192.168.0.188:8080/notes

Technical

  • WebDavSyncService.ensureMarkdownDirectoryExists() - Creates MD folder early
  • WebDavSyncService.getMarkdownUrl() - Smart URL detection for both structures
  • WebDavSyncService.exportAllNotesToMarkdown() - Exports all local notes with progress callback
  • SettingsActivity.onMarkdownExportToggled() - Triggers initial export with ProgressDialog

1.2.0 - 2026-01-04

Added

  • Local Backup System

    • Export all notes as JSON file to any location (Downloads, SD card, cloud folder)
    • Import backup with 3 modes: Merge, Replace, or Overwrite duplicates
    • Automatic safety backup created before every restore
    • Backup validation (format and version check)
  • Markdown Desktop Integration

    • Optional Markdown export parallel to JSON sync
    • .md files synced to notes-md/ folder on WebDAV
    • YAML frontmatter with id, created, updated, device
    • Manual import button to pull Markdown changes from server
    • Last-Write-Wins conflict resolution via timestamps
  • Settings UI Extensions

    • New "Backup & Restore" section with local + server restore
    • New "Desktop Integration" section with Markdown toggle
    • Universal restore dialog with radio button mode selection

Changed

  • Server Restore Behavior: Users now choose restore mode (Merge/Replace/Overwrite) instead of hard-coded replace-all

Technical

  • BackupManager.kt - Complete backup/restore logic
  • Note.toMarkdown() / Note.fromMarkdown() - Markdown conversion with YAML frontmatter
  • WebDavSyncService - Extended for dual-format sync (JSON master + Markdown mirror)
  • ISO8601 timestamp formatting for desktop compatibility
  • Filename sanitization for safe Markdown file names

Documentation

  • Added WebDAV mount instructions (Windows, macOS, Linux)
  • Complete sync architecture documentation
  • Desktop integration analysis

1.1.2 - 2025-12-28

Fixed

  • "Job was cancelled" Error

    • Fixed coroutine cancellation in sync worker
    • Proper error handling for interrupted syncs
  • UI Improvements

    • Back arrow instead of X in note editor (better UX)
    • Pull-to-refresh for manual sync trigger
    • HTTP/HTTPS protocol selection with radio buttons
    • Inline error display (no toast spam)
  • Performance & Battery

    • Sync only on actual changes (saves battery)
    • Auto-save notifications removed
    • 24-hour server offline warning instead of instant error

Changed

  • Settings grouped into "Auto-Sync" and "Sync Interval" sections
  • HTTP only allowed for local networks (RFC 1918 IPs)
  • Swipe-to-delete without UI flicker

1.1.1 - 2025-12-27

Fixed

  • WiFi Connect Sync
    • No error notifications in foreign WiFi networks
    • Server reachability check before sync (2s timeout)
    • Silent abort when server offline
    • Pre-check waits until network is ready
    • No errors during network initialization

Changed

  • Notifications
    • Old sync notifications cleared on app start
    • Error notifications auto-dismiss after 30 seconds

UI

  • Sync icon only shown when sync is configured
  • Swipe-to-delete without flicker
  • Scroll to top after saving note

Technical

  • Server check with 2-second timeout before sync attempts
  • Network readiness check in WiFi connect trigger
  • Notification cleanup on MainActivity.onCreate()

1.1.0 - 2025-12-26

Added

  • Configurable Sync Intervals

    • User choice: 15, 30, or 60 minutes
    • Real-world battery impact displayed (15min: ~0.8%/day, 30min: ~0.4%/day, 60min: ~0.2%/day)
    • Radio button selection in settings
    • Doze Mode optimization (syncs batched in maintenance windows)
  • About Section

    • App version from BuildConfig
    • Links to GitHub repository and developer profile
    • MIT license information
    • Material 3 card design

Changed

  • Settings UI redesigned with grouped sections
  • Periodic sync updated dynamically when interval changes
  • WorkManager uses selected interval for background sync

Removed

  • Debug/Logs section from settings (cleaner UI)

Technical

  • PREF_SYNC_INTERVAL_MINUTES preference key
  • NetworkMonitor reads interval from SharedPreferences
  • ExistingPeriodicWorkPolicy.UPDATE for live interval changes

1.0.0 - 2025-12-25

Added

  • Initial release
  • WebDAV synchronization
  • Note creation, editing, deletion
  • 6 sync triggers:
    • Periodic sync (configurable interval)
    • App start sync
    • WiFi connect sync
    • Manual sync (menu button)
    • Pull-to-refresh
    • Settings "Sync Now" button
  • Material 3 design
  • Light/Dark theme support
  • F-Droid compatible (100% FOSS)