Secretary Links - Android - Changelog
Every released version of the Secretary Links app, newest first.
App documentation: Apps/links
Status
Status 2026-10-13 (43)
Secretary Links 43 (versionCode 43): Ordner und ihre Einträge sind jetzt sichtbar ineinander verschachtelt. Die gemeinsame FolderRow (common/ui/FolderRow.kt) unterschied sich bisher nicht von den Eintragskarten: Ordner-Kopfzeile und Einträge lagen als gleich aussehende Karten in einer flachen LazyColumn, die Zugehörigkeit der Einträge zum Ordner war nicht zu erkennen. Die Kopfzeile ist jetzt eine getönte, abgerundete Zeile mit Ordner-Glyphe, Name, Anzahl und rotierendem Chevron in der Akzentfarbe; jeder Eintrag eines aufgeklappten Ordners ist über die neue Composable FolderChild eingerückt und links mit einer dünnen Führungslinie an die Kopfzeile gebunden. Die Linie wird in den Kartenabstand hinein verlängert und läuft dadurch über die Einträge eines Ordners durchgehend. Das trifft alle vier Listen-Clients (Notizen, Aufgaben, Links, Kontakte). versionCode 42 -> 43.
Tests: :common:compileDebugKotlin, :notes:compileDebugKotlin, :tasks:compileDebugKotlin, :links:compileDebugKotlin, :contacts:compileDebugKotlin grün.
Status 2026-10-09 (41)
Secretary Links 41 (versionCode 41): Ordner-Gruppierungen starten eingeklappt, mit gemeinsamer Einstellung Ordner eingeklappt.
(1) Eingeklappt per Vorgabe. Die Liste gruppiert nach Ordnern (erster TAG: = Ordner) mit einer Kopfzeile pro Ordner; deren Startzustand ist jetzt eingeklappt, ein Tipp auf die Kopfzeile klappt den Ordner auf/zu (FolderExpansionState/rememberFolderExpansion in common/ui/FolderRow.kt). Eine Liste mit nur einem Ordner zeichnet weder Kopfzeile noch Umschalter.
(2) Gemeinsame Einstellung. Der Startwert kommt aus der gemeinsamen UiPreferences.folders_collapsed (Default true = eingeklappt; SRS/common 1.6.0, FR-C-70..72) und liegt im Einstellungs-Screen in der neuen Sektion Ordner: Checkbox Ordner eingeklappt („Listen starten mit geschlossenen Ordnern"), gerendert von FolderSettingsSection. SecretarySettingsScreen traegt dafuer showFolderSettings – true bei Notizen, Aufgaben, Links und Kontakten, alle übrigen Clients bleiben beim Default false.
Tests: compileDebugKotlin (common + alle Module) und testDebugUnitTest (common + die vier Ordner-Clients) gruen; keine JVM-Verhaltensaenderung, keine neuen Unit-Tests. versionCode 40 -> 41.
Status 2026-10-01 (33)
Secretary Links 33 (versionCode 33): die Sync-Aktion ist ohne Konto weg, Passwortfelder zeigen Klartext. Beides sitzt im gemeinsamen Code und trifft damit alle acht Clients.
(1) Keine Sync-Aktion ohne Konto. AppHeader (Kit.kt) blendet die Sync-Aktion bereits aus, wenn onSync null ist - das war die vorhandene Konvention, nur wurde sie an keiner Stelle benutzt. OfflineBanner (StatusBanners.kt) verlangte dagegen einen nicht-nullbaren onSync und zeichnete den Refresh-Button bedingungslos; der Parameter ist jetzt (() -> Unit)?, und ohne Konto fehlt der Knopf (die Meldung "offline" bleibt stehen). Alle Aufrufstellen reichen den Callback nur noch durch, wenn wirklich ein Konto existiert: loggedIn der jeweiligen ViewModel, im Kalender der collected isLoggedIn-StateFlow. Das Journal ist der einzige Client, bei dem das sichtbar war - es hat keine Login-Sperre und laeuft im lokalen Modus (localMode = !repo.isConfigured()) ohne Konto weiter, zeigte den Sync-Knopf aber trotzdem. Beim Secrets-Tresor war der Knopf vorhanden und nur deaktiviert (enabled = state.connected); er wird jetzt gar nicht erst gezeichnet, der Spinner waehrend state.syncing bleibt. Am Launcher aendert sich nichts: die Server-Sync-Sektion im Settings-Screen war schon an account != null gehaengt.
(2) Passwortfelder zeigen Klartext. Alle Eingabefelder fuer Passwoerter nehmen VisualTransformation.None; die Tastatur bleibt KeyboardType.Password. Betroffen sind der gemeinsame Login-Screen (SecretaryLoginScreen), die Journal-Passwortdialoge (PasswordDialogs: Setzen, Aendern, Abfragen) und das Entschperren (UnlockScreen) sowie im Tresor die Felder fuer Recovery-Passphrase, Entschperr-Passphrase, KDBX-Import und KDBX-Export (SecretsApp) und das Passwortfeld im Eintrags-Editor (Browse). Anlass war die Darstellung, nicht die Sicherheit: die Maske besteht aus U+25CF (●), und die gebundelte Typewriter-Schrift Special Elite deckt dieses Zeichen nicht ab - die Felder zeigten unlesbare Ersatzglyphen. In den Tresor-Dialogen ist der Sichtbarkeits-Umschalter damit ueberfluessig und mit ihm die Felder passwordVisible/visible, der Eye-Button bzw. der Textbutton Anzeigen/Verbergen und die Visibility/VisibilityOff-Imports weg. Der Reveal-Pfad fuer gespeicherte Secrets in Browse (FieldRow) bleibt unberuehrt: das ist eine Anzeige, keine Eingabe.
Tests: keine neuen, kein JVM-Verhalten geaendert. 662 Tests gruen (Kalender 55, common 100, Kontakte 44, Launcher 12, Secrets 405, Tasks 46), verifiziert ueber gradle test; alle neun Module kompilieren (compileDebugKotlin, offline), und die Neuuebersetzung meldet in keiner der geaenderten Dateien eine Warnung. versionCode 32 -> 33.
Status 2026-09-30 (32)
Secretary Links 32 (versionCode 32): die Namensraum-Karte im
Einstellungs-Screen ist weg, die Version steht jetzt unten. Beides steckt im
gemeinsamen SecretarySettingsScreen in common (SRS common 1.3.0), trifft
also alle acht Clients. Der Parameter collectionNamespace und die Karte
Namensraum sind raus - sie zeigte eine Konstante, die der Nutzer ohnehin in
der Collection-Liste sieht. Die Konstante LINKS_NAMESPACE bleibt als
CalDAV-Basispfad, wird aber nicht mehr angezeigt. Neu ist die letzte Zeile des
Screens: die Version der jeweils laufenden App aus der PackageInfo des
eigenen Pakets, jede App zeigt so ihre eigene Nummer, ohne sie durchzureichen.
versionCode 31 -> 32.
Status 2026-09-30 (31)
Secretary Links 31 (versionCode 31): keine Code-Aenderung - der
Quelltext ist derselbe wie bei 30. Veraendert wurde in diesem Zug nur der
Launcher (Korrektur am Konfigurations-Sync, dort 460). Die Nummer geht trotzdem
hoch, weil ein Release alle acht Clients und beide Serverpakete zusammen
ausliefert: das Buildsystem ueberspringt einen Lauf, dessen Zieldateinamen alle
bereits im Archiv liegen, und ein gleichnamiges Paket mit gleichem Inhalt
waere auf dem Geraet nicht von 30 zu unterscheiden - bei einer APK
zusaetzlich ein versionCode, den ein Geraet nicht neu installiert. Server und
check-links gehen mit auf 0.24.0. versionCode 30 -> 31.
Status 2026-09-29 (30)
Secretary Links 30 (versionCode 30): Abschluss des Release-Zugs, der
Signiermaterial aus einer Umgebungsvariablen in eine Datei verlagert hat (siehe
29). Der Sprung ist der von 4d6b02eee5 für alle acht Module gemeinsam
gesetzte: BuildManager vergleicht Dateinamen statt Inhalte, also liefert
derselbe Code ohne neue versionCode denselben Namen und der Build wird als
„bereits im Repo“ abgewiesen. An Links änderte sich in diesem Schritt kein
Funktionscode. versionCode 29 -> 30.
Status 2026-09-29 (29)
Secretary Links 29 (versionCode 29): alle acht Clients signieren ihre
Release-APKs, nicht nur der Launcher. Vorher hatte nur der Launcher ein
signingConfig; die sieben anderen Module bauten *-unsigned.apk und
konnten kein signiertes Release liefern. Zwei Nacharbeiten blieben in derselben
Version: der Default-Pfad für das Keystore war um eine Ebene zu kurz, und die
Zugangsdaten wurden aus dem Prozess-Environment in eine Datei verlagert, damit
ein Release nicht von einer in keinem --help genannten Umgebungsvariable
abhängt. versionCode 28 -> 29.
Status 2026-09-29 (28)
Secretary Links 28 (versionCode 28): Signiermaterial in ein eigenes
Fossil-Repository signing-certs ausgelagert (vorher lag es im
Secretary-Repository selbst). An Links änderte das keine Zeile Funktionscode; die
Version trägt die neue Signierkonfiguration. versionCode 27 -> 28.
Status 2026-09-29 (27)
Secretary Links 27 (versionCode 27): Konto, gemeinsamer Einstellungs-Screen
und Konfigurations-Sync für den Launcher. Der Commit hielt die versionCode
aller acht Module gleichzeitig fest. An Links änderte sich dabei keine Zeile; die
Funktionsänderung betraf ausschließlich den Launcher. Die Nummern 25 und 26
entstanden am 24.09. mit den neuen Icons (siehe 25) beziehungsweise wurden nie
vergeben — dieser Commit sprang von 25 auf 27. versionCode 25 -> 27.
Status 2026-09-24 (25)
Secretary Links 25 (versionCode 25): neue Typewriter-Launcher-Icons für alle
Secretary-Apps. Das Schema ist die Glyphe als [glyph] in der Typewriter-
Schrift Special Elite, weiß auf einem app-spezifischen Akzent; die Icon-
Erzeugung (tools/generate-icons.sh) bekam dazu eine Option, weil Special Elite
U+263A nicht abdeckt. versionCode 24 -> 25.
Status 2026-09-22 (24)
Secretary Links 24 (versionCode 24): Geändert-Anzeige + Besuch räumt
die Warnung (serverseitiger Link-Checker, server 0.17.0). Der Server prüft
nun selbst im 30-min-Timer jede X-LINK-URL im /links/-Storage und schreibt
bei Content-Änderung X-LINK-CHANGED:true plus aktualisierte
X-LINK-HASH/X-LINK-ETAG/X-LINK-LAST-MODIFIED direkt in die VJOURNAL-
Beschreibung (atomar, mit Sync-Token-Bump). Die App ist der Gegenpart:
Linkträgt einchanged-Feld;X-LINK-CHANGEDwird aus der Beschreibung gelesen (fromNote) und beim Schreiben alsX-LINK-CHANGED:truegesetzt (toNote, nur beichanged=true– fehlende Zeile = false).LinksListScreen: jede Karte zeigt „Zuletzt geprüft: …" (ausX-LINK-LAST-CHECKED, „nie" wenn 0) und beichangedein Warn-Icon.markVisited: Öffnen in Browser, Detail oder Editor setztlastChecked = nowundchanged = falseund schreibt das VJOURNAL sofort auf den Server (Befund: Die RRULE-Gate des Server-Checkers läuft überX-LINK-LAST-CHECKEDweiter; die Server-Warnung wird erst durch den echten Besuch geräumt). Offline wird der Besuch in die Write-Behind-Queue gereiht (saveItemOffline).persistLastVisitedlöst die Collection über den href-Präfix auf (wiepersistFavicon).checkLinkNowmarkiert einen gefundenen Wechsel jetzt konsistent mitchanged = trueund persistiert ihn.- Die client-seitigen periodischen Kontrollen (AlarmManager + Lokal-Fetch +
Notification) bleiben unverändert aktiv; sie betreffen nur Cache/Hash-seitig,
der Server-Checker ist die maßgebliche Frequenzquelle.
Deployment-Reihenfolge: erst Server auf 0.17.0 (Timer via
systemctl --user enable --now secretary-check-links.timeraktivieren), dann die App. versionCode 23 -> 24.
Status 2026-09-19 (23)
Secretary Links 23 (versionCode 23): Eigener Namespace-Root /links/
statt /calendars/links-* (Namespace-Migration, server 0.16.0). Die
Sammlungen liegen jetzt unpräfixiert unter /links/ (kanonisch
/links/main/; zuvor /calendars/links-main/). LinkRepository nutzt
baseCollectionPath = "/links/" (neue CaldavClient.collectionRoot), der
NotesCodec(collectionBasePath = "/links/") und die Sync-Sektion zeigen
„Namensraum" statt „Sammlungspräfix". Der Offline-Cache wird beim ersten
Lesen via GOfflineStore.legacyPrefix = "links-" automatisch migriert
(/calendars/links-* → /links/…, idempotent; /local/-Homes bleiben);
auch LinkCheckScheduler.loadCachedLinks und
LinkCheckReceiver.refreshFaviconIfMissing lesen/schreiben den Cache im
neuen Layout. runServerSync filtert zusätzlich /links/ (Legacy-
/calendars/, /addressbooks/ bleiben im Filter).
Deployment-Reihenfolge: erst Server auf 0.16.0 updaten +
migrate-namespaces.sh, dann die App ausrollen. versionCode 22 -> 23.
CONTEXT.md updated.
Status 2026-09-19 (22)
Secretary Links 22 (versionCode 22): Rearm cadence: 12 hours. The
periodic rearm alarm that re-programs the per-link check alarms now fires
every 12 hours (it was 30 minutes in 21). This keeps the maintenance
alarm battery-cost negligible while still recovering lost/deferred check
alarms within half a day. Functional code identical to 21; rebuilt as 22 so
the package repository receives a fresh APK filename (secretary-links-22.apk
instead of the already-shipped 21). versionCode 21 -> 22.
Status 2026-09-19 (21)
Secretary Links 21 (versionCode 21): One icon per link card + regularly
re-armed reminders. (1) The link cards in the list show only the open in
browser icon now; the Share and "check now" icons were removed. Sharing stays
available via the long-press context menu (Bearbeiten / Teilen / Kopieren /
Verschieben / Löschen). (2) Reminders / check alarms are re-armed on a fixed
cadence. A new periodic rearm alarm fires every 30 minutes
(RearmReceiver, LinkCheckScheduler.armRearm); when it fires it reloads all
links from the local offline cache (loadCachedLinks, all collections) and
re-runs scheduleAll, re-programming every per-link check alarm and re-arming
itself. scheduleAll now arms the rearm alarm too, the real check receiver
re-arms it on every fire, and the BootReceiver re-arms after restart — so a
single lost/deferred alarm no longer kills the chain. scheduleChecks() now
schedules all cached links (every collection) instead of only the
currently selected collection. versionCode 20 -> 21.
Status 2026-09-16 (20)
Secretary Links 20 (versionCode 20): Sync-Härtung: kein Endlos-Sync,
kein Sync-Dienst-400 (gleiche Muster wie Journal v119/v120).
runServerSync() konnte syncStatus bei leerer Job-Liste endgültig auf
RUNNING stehen lassen (der Guard
if (syncStatus?.state == RUNNING) return blockierte danach jede weitere
Synchronisation für die Sitzung) und pollte Server-Jobs unbegrenzt. Neu:
leere Jobs brechen sauber ab (syncStatus = null), der Poll-Loop ist hart
begrenzt (maxPolls = 200 ≈ 100 s bei 500 ms; sonst FAILED
„Sync timed out"), und es werden nur echte Server-Collections übertragen
(href unter /calendars/ oder /addressbooks/ – eine lokale Pseudo-
Collection wie /local/ wird niemals an /sync/start gereicht).
versionCode 19 -> 20.
Status 2026-09-16 (19)
Secretary Links 19 (versionCode 19): Offline-Sync-Engine
(secretary-common-android v0.30.0). loadLinksInternal nutzt jetzt die
gemeinsame OfflineSyncEngine (CrudItemRemote + GOfflineStore +
NotesCodec("links-")): Server-Abruf, Rehome-Upload lokaler UIDs,
Pending-Delete-Filter, Prepare-Null-Erhalt und Cache-Ersatz liegen in
common; die lokale mergeWithPending-Logik wurde entfernt. Offline-Verhalten
(goOffline + Cache-Anzeige bei IOException) unverändert; nach dem Merge
laufen weiter flushPending(), scheduleChecks() und
refreshMissingFavicons(). View bleibt beim Sync stabil. versionCode 18 -> 19.
Status 2026-09-16 (18)
Secretary Links 18 (versionCode 18): Erinnerungen feuern zuverlässig.
Die geplanten Checks waren Einmal-Alarme: nach dem ersten Auslösen wurde kein
neuer Alarm gesetzt (Kette brach, bis die App wieder geöffnet wurde), der
BootReceiver war ein No-Op und auf Android 13+ fehlte die Runtime-Berechtigung
für Benachrichtigungen. (1) Selbst-arme-Alarme: LinkCheckScheduler.armNext
programmiert nach jedem Auslösen direkt den nächsten Termin aus der RRULE;
die RRULE wird dafür als Extra im Alarm-Intent mitgeführt, sodass die Kette
auch bei langsamen/fehlgeschlagenen Checks oder Prozess-Neu-Start bestehen
bleibt. (2) BootReceiver reschedult: nach BOOT_COMPLETED werden die
Links aus dem lokalen Offline-Cache (secretary_links_cache.json) geladen
und neu geplant – keine Netzwerk-Anfrage nötig. (3) POST_NOTIFICATIONS
Runtime-Berechtigung wird auf Android 13+ beim App-Start angefragt.
versionCode 18 == versionName 18.
Status 2026-09-13 (17)
Secretary Links 17 (versionCode 17): Build-Grundlage
secretary-common-android v0.26.0 (Kategorie-Escape-Härtung). Version 16
entstand bereits mit dem VJOURNAL-Fix (v0.25.0: CATEGORIES wird nur an
unescaped-gespeicherten Kommas gesplittet, Wochentags-Regeln
RRULE:FREQ=WEEKLY;BYDAY=MO\,WE\,FR bleiben beim erneuten Öffnen des
Wiederholungs-Editors vollständig erhalten). v0.26.0 verallgemeinert das
Escaping-Verhalten auf VTODO/VEVENT/VCARD (Tasks/Calendar/Contacts); für
Links ist das Verhalten funktional identisch zu Version 16, der APK steht
damit aber auf der aktuellen gemeinsamen Bibliothek. versionCode 17 ==
versionName 17.
Status 2026-09-13 (16)
Secretary Links 16 (versionCode 16, auf secretary-common-android
v0.25.0): Wiederholungen: BYDAY-Wochentage gehen verloren +
Erinnerungen feuern falsch. Zwei zusammenhängende Fixes. (1) Common-Read-
Bug: VJournal.parseNote (secretary-common-android) zerlegte die
CATEGORIES-Liste mit .split(',') ohne den RFC-5545-Backslash-Escape zu
beachten – eine per Wiederholungs-Editor gespeicherte Wochentags-Regel
RRULE:FREQ=WEEKLY;BYDAY=MO\,WE\,FR (escaped by escapeText) wurde beim
Laden bei jedem Komma geschnitten, sodass nur der erste Wochentag
wiederhergestellt wurde (FREQ=WEEKLY;BYDAY=MO, + verwaiste WE/FR-
Kategorien). Dadurch zeigte der erneut geöffnete Wiederholungs-Editor nur
noch den ersten Tag („ausgewählte Tage verloren"). Neu splittet
splitCategoryList() die Liste nur an unescape-gespeicherten Kommas und
reicht Escapes unangetastet an unescapeText weiter (bestehende, bereits
\,-escapte Server-Daten werden damit korrekt vollständig gelesen).
(2) Links-Scheduler: LinkCheckScheduler.computeNextCheck ignorierte
BYDAY komplett (WEEKLY = immer now + 7 Tage), sodass eine „3× pro
Woche"-Regel (Mo/Mi/Fr) trotz intakter RRULE nie an den ausgewählten Tagen
prüfte. Die Funktion nutzt jetzt den gemeinsamen RFC-5545-Expander
Recurrence(rrule).nextAfter(now, now) (unterstützt zusätzlich MONTHLY/
YEARLY und COUNT/UNTIL); unbekannte/ungültige Regeln fallen wie bisher auf
now + 1 Tag zurück. versionCode 16 == versionName 16.
Secretary Links 15 (versionCode 15): GET_ACCOUNTS für das zentrale
Konto. Die App deklariert jetzt android.permission.GET_ACCOUNTS (neben
dem legacy READ_ACCOUNT). Das gemeinsame Sekretär-Konto
(AccountManager, Typ org.beowulf.secretary) wird damit direkt lesbar und
hängt nicht mehr nur an der Signer-Visibility-Provisionierung des
Android-Kontos, die ein App-Update abwerfen konnte (Konto leer nach Update).
versionCode 15 == versionName 15.
Status 2026-09-09 (14)
Secretary Links 14 (versionCode 14): Sammlungen: einheitliches
Langdruck-Kontextmenü + Kopieren (secretary-common-android v0.19.0).
Die Sammlungsübersicht nutzt jetzt das gemeinsame CollectionContextMenu
(statt der Icon-Buttons): langer Druck auf eine Sammlungskarte öffnet
Umbenennen / Kopieren / Löschen. Kopieren legt eine Duplikat-Sammlung
mit allen enthaltenen Links an (CrudManager.copyCollection, Name
„<Name> (Kopie)", neue UIDs/hrefs, offline via Write-Behind-Queue).
Umbenennen/Anlegen laufen über die gemeinsamen RenameCollectionDialog/
CreateCollectionDialog. versionCode 14 == versionName 14.
Status 2026-09-09 (13)
Secretary Links 13 (versionCode 13): Privates Öffnen robuster. Aktuelle
Firefox-für-Android-Versionen ignorieren das private_tab-Intent-Extra –
private Fenster werden dort durch Firefox' eigene Einstellung „Links in einem
privaten Tab öffnen" gesteuert und sind von fremden Apps nicht mehr
erzwingbar. openLinkInBrowser für Links mit „Privat öffnen" nutzt daher
folgende Rangfolge: (1) Firefox Focus (org.mozilla.focus, ist immer
privat), (2) Firefox mit private_tab-Extra (Best-Effort, je nach Version),
(3) Standard-Browser. Ohne privates Fenster bleibt der Fallback der normale
Browser. versionCode 13 == versionName 13.
Status 2026-09-09 (12)
Secretary Links 12 (versionCode 12): **412-Konflikt beim Speichern behoben
- ETag-Frischhaltung**. Beim Öffnen des Editors lief im Hintergrund immer ein
Favicon-Neuabruf, der die VJOURNAL-ETag (Content-Hash) auf dem Server
weiterdrehte; speicherte man in dem Fenster (z. B. „Privat öffnen"), ging der
PUT mit dem inzwischen veralteten If-Match-ETag raus → 412 → fälschliche
Meldung „Notiz wurde auf dem Server geaendert (Konflikt)", Sync setzte den
Schalter zurück. (1)
putWire/putNote(secretary-common-android v0.18.0): ein erster 412 wird jetzt automatisch aufgelöst – der Client holt die aktuelle Server-ETag und wiederholt den PUT genau einmal (lokale Änderung gewinnt, kein Fehlerdialog mehr für eigene parallele Schreibvorgänge). (2)persistFaviconspeichert nur noch, wenn sich das Favicon wirklich geändert hat (kein Pseudo-Schreibvorgang bei jedem Editor-Öffnen) und übernimmt die neue ETag in Liste + Editor. (3)saveLink/checkLinkNowpropagieren die vom Server zurückgegebene ETag in die Liste, damit Folge-Speicherungen frische Preconditions nutzen. versionCode 12 == versionName 12.
Status 2026-09-09 (11)
Secretary Links 11 (versionCode 11): Sammlungs-Handling in
secretary-common-android + privater Tab korrigiert. (1) Das
Sammlungs-Handling (Offline-Merge neu angelegter/gelöschter Sammlungen und
die „wartet auf Synchronisierung"-Marker) lebt jetzt gemeinsam in
PendingSync (secretary-common-android v0.17.0) – nicht mehr app-lokal.
PendingSync.mergeCollections hält lokal bekannte (pending/offline/gerade
angelegte) Sammlungen sichtbar und blendet pending-gelöschte aus;
PendingSync.snapshotState liefert pendingCollectionIds/
pendingItemHrefs; das neue PendingBadge (SyncProblem) ersetzt die
lokalen Icons. (2) Privater Tab korrigiert: Firefox öffnet einen
ACTION_VIEW-Intent jetzt per setPackage("org.mozilla.firefox") +
Extra private_tab=true (statt IntentReceiverActivity +
private_browsing_mode); ohne installiertes Firefox fällt der Handler auf
den Standard-Browser (ohne privates Fenster) zurück. versionCode 11 ==
versionName 11.
Status 2026-09-09 (10)
Secretary Links 10 (versionCode 10): Pending-Sync-Marker + privates
Fenster pro Link. (1) Sammlungen und Einträge mit noch nicht synchronisierten
Aktionen (neu angelegt, umbenannt, gelöscht, editiert/dupliziert – offline in
der Write-Behind-Queue) zeigen jetzt ein „wartet auf Synchronisierung"-Badge
(SyncProblem-Icon) in der Liste. Dazu berechnet das ViewModel aus der
Pending-Queue pendingCollectionIds/pendingItemHrefs (Created/Rename/Delete
für Sammlungen, Put/Delete für Einträge) und aktualisiert sie bei jeder
Mutation/Flush. (2) Privates Fenster jetzt pro Link: der bisherige globale
Schalter (Einstellungen → Browser) wurde entfernt; stattdessen gibt es pro Link
eine „Privat öffnen"-Schalter im Editor, gespeichert als X-LINK-PRIVATE in
der VJOURNAL-Beschreibung. openLinkInBrowser respektiert das Flag pro Link.
(3) parseXProperties entfernt X-LINK-* Zeilen jetzt aus jedem Teil der
Beschreibung (auch wenn Daten bereits fehlerhaft unter body: gespeichert
wurden), sodass Legacydaten die X- Felder endgültig nicht mehr im
Beschreibungsfeld zeigen. versionCode 10 == versionName 10.
Status 2026-09-09 (9)
Secretary Links 9 (versionCode 9): Löschen im Kontextmenü + Collection-
Fixes. (1) Das Langdruck-Kontextmenü der Link-Karten enthält jetzt auch
Löschen (mit Bestätigungsdialog aus secretary-common-android), zusätzlich
zu Bearbeiten / Teilen / Kopieren / Verschieben. (2) Collection-Anlage sichtbar
ohne Sync: loadCollectionsInternal merged nun lokal bekannte (pending,
offline oder gerade angelegte) Sammlungen in die Serverliste, sodass eine neue
Sammlung sofort lokal erscheint und nicht erst nach einem Sync. (3) Beschreibung
clean: Link.fromNote fällt nicht mehr auf die rohe VJOURNAL-Beschreibung
zurück, wenn kein body:-Marker vorhanden ist – leere/legacy Links zeigen die
X-LINK-* Felder nicht mehr im Beschreibungsfeld. versionCode 9 == versionName 9.
Status 2026-09-08 (8)
Secretary Links 8 (versionCode 8): Konfigurierbares Kontextmenü. Die Aktionen Teilen / Kopieren / Verschieben des Langdruck-Menüs lassen sich in den Einstellungen (gemeinsame Sektion „Langdruck-Kontextmenü" aus secretary-common-android v0.16.0) per Checkbox aktivieren/deaktivieren (UiPreferences, Default: alle aktiv). ItemContextMenu blendet deaktivierte Aktionen aus und sperrt das Menü komplett, wenn alle vier aus sind (dann verhält sich die Karte wie eine gewöhnliche klickbare Karte). versionCode 8 == versionName 8.
Status 2026-09-08 (7)
Secretary Links 7 (versionCode 7): Einheitliches Langdruck-
Kontextmenü. Die Link-Karten nutzen jetzt das gemeinsame ItemContextMenu
(secretary-common-android): langer Druck auf eine Karte öffnet ein Menü mit
Bearbeiten / Teilen (über den bestehenden Share-Aktions-Button) / Kopieren /
Verschieben… (statt des bisherigen ⋮-Overflow-Menüs mit nur „Verschieben…").
Kopieren legt ein Duplikat in derselben Sammlung an (neue UID + href,
CrudManager.copyItem, offline via Write-Behind-Queue, inkl. erneuter
scheduleChecks()). Verschieben läuft über den gemeinsamen
MoveCollectionDialog; Löschen bleibt wie bisher nur in der Detailansicht.
Die schnellen Inline-Aktionen (Browser öffnen / Teilen / Prüfen) bleiben
erhalten. versionCode 7 == versionName 7.
Status 2026-09-08 (1)
Secretary Links 1 (versionCode 1): Initial release. CalDAV-based website
change monitor storing monitored URLs as VJOURNAL entries in links-* prefixed
collections. Features include:
- Add/edit/delete monitored website links
- Optional RRULE-based scheduling for periodic change detection
- SHA-256 content hashing for reliable change recognition
- ETag and Last-Modified headers for efficient re-checks
- Favicons fetched and stored as base64 in VJOURNAL
- Push notifications when changes are detected
- Share links to/from other apps
- Open links in browser
- Full CalDAV sync via secretary-common-android
- Offline support with stale-while-revalidate pattern
Status 2026-09-08 (6)
Secretary Links 6 (versionCode 6): Move zwischen Sammlungen +
privates Fenster. Ein Link kann per Langdruck auf die Link-Karte über das
Kontextmenü in eine andere Sammlung verschoben werden (PUT an neuer Stelle +
DELETE an alter, offline als PutItem/DeleteItem gereiht). Die Karte in der
Liste hat keinen Löschen-Button mehr – Löschen nur noch in der Detailansicht.
Neue Einstellung „Privates Fenster": Aktiviert öffnet die App Links in einem
privaten Firefox-Tab (Intent-Extra private_browsing_mode, Firefox ≥ 112)
mit Fallback auf den Standard-Browser. versionCode 6 == versionName 6.