Skip to content

feat(drive): Orte und Personen in den Fotos (Drive 1.16) - #170

Merged
CallMeTechie merged 3 commits into
mainfrom
feat/drive-places-people
Nov 1, 2026
Merged

CallMeTechie merged 3 commits into
mainfrom
feat/drive-places-people

Conversation

@CallMeTechie

@CallMeTechie CallMeTechie commented Nov 1, 2026 •

Copy link
Copy Markdown
Owner

Drive › Fotos findet Fotos nach Ort und Person (Drive 1.16, Vertrag „Orte und Personen“, Mockups 1–7). Alles hängt an photoPlaces und photoPeople aus GET me; ohne die Features bleibt die App wie bisher.

Orte (photoPlaces)

  • Die Foto-Sicherung sendet geo beim Commit (EXIF aus DriveTakenAt.shot), nur mit „Aufnahmeort mitsichern“ (keepGeo). Aus heißt: nichts senden.
  • Orte nachtragen (Einstellungen): WorkManager-Job über photos?unlocated=1. Liegt das Original noch auf dem Handy, geht sein Ort (oder none) per PUT nodes/<id>/geo hoch; Fotos, die nicht hier liegen, bleiben für andere Geräte. Fehlt der Zugriff auf Fotostandorte, fragt die Zeile danach.
  • Karte (Mockup 2): osmdroid wie ui/familie/OsmMap.kt (gleiche User-Agent-/Kachel-Policy, Cache, Attribution „© OpenStreetMap-Mitwirkende“). Bündel aus photos/map, beim Verschieben/Zoomen gedrosselt nachgeladen (gepolsterte Box, neu nur bei Zoomwechsel oder Verlassen der Box, 450 ms). Blatt mit Vorschau, Zeitraum, „Auf diesen Fotos“, „Alle ansehen“; „Ort suchen“, „Mein Standort“ (nur mit Standortrecht), Privat/Arbeit.
  • Ort (Mockup 3): kleine Karte, Fotos nach Tag mit Ortsteil, Personen-Chips als Filter, „Als Album speichern“. Ortsteil-Schlüssel aus den Vorschlägen gehen auch (Abweichung des Plugins).

Personen (photoPeople)

  • Erkennung auf dem Handy: YuNet (Box + 5 Punkte) und SFace (128 Werte, Modell-ID sface-2021dec) aus OpenCV Zoo, Laufzeit onnxruntime-android 1.23.2 (die 1.27+ bringen einen Telemetrie-Provider mit, der beim App-Start lädt und an Microsoft sendet). Kein OpenCV: Ausrichtung auf 112×112 wie FaceRecognizerSF::alignCrop (Ähnlichkeitstransformation, bilinear), YuNet-Dekodierung wie FaceDetectorYN. Ausgabe L2-normiert, base64 von Float32 LE.
  • Modell fp32, nicht int8: int8 weicht auf demselben Rechner schon ab (Kosinus zu fp32 0,965–0,978) und rechnet auf x86/ARM verschieden. In drive-places-people-deviations.md (Abschnitt „Modell“) vermerkt; Vorverarbeitung und Testvektor für Windows in drive-face-model.md.
  • SFace kommt erst beim Einschalten: Das Modell (39 MB) ist nicht in APK/AAB. Die App lädt es nach dem Einschalten von „Personen erkennen“ einmal herunter: zuerst das Asset des eigenen Releases (…/releases/download/v<versionName>/face_recognition_sface_2021dec.onnx), sonst OpenCV Zoo auf GitHub, dann Hugging Face. Immer mit SHA-256-Prüfung (falsche Bytes werden verworfen, die nächste Quelle versucht), nach noBackupFilesDir/faces/, atomar per Umbenennen, nach Abbruch per Range fortgesetzt. Standardmäßig nur im WLAN, „Jetzt über mobile Daten laden“ auf Wunsch. Fortschritt „Erkennungsmodell wird geladen · 12 von 39 MB“ in den Einstellungen und unter Personen, bei Fehlern „Erneut versuchen“. Erst wenn das Modell da ist, startet der Erkennungs-Job; Ausschalten löscht auch die Modelldatei.
  • release.yml holt SFace per :app:faceModels (SHA-256-Prüfung) und hängt es an jedes Release, zusammen mit APK und AAB. YuNet (0,2 MB) liegt unverändert in assets/faces/.
  • Job (WorkManager) nur mit people an: WLAN, Akku nicht schwach, mit „Nur beim Laden“ (Gerätewahl, Standard an) beim Laden. Neue Fotos nach der Sicherung aus dem Original, alte über photos?unfaced=1&model=… aus dem Original auf dem Handy, sonst der Vorschau (largeUrl). Kinderordner nur mit peopleKids (ein 403 feature_off mit reason: kids überspringt nur das Foto).
  • Personen (Mockup 4): Fortschritt, Benannt, „Wer ist das?“, Ausgeblendet (wieder zeigen). Person (Mockup 5): unsichere Treffer („Ja, alle“ / einzeln), Zusammen mit (Filter), Orte, Fotos nach Jahr; Menü Umbenennen, Mit Kontakt verknüpfen, Zusammenführen, Ausblenden. Benennen (Mockup 6): Namensvorschläge aus Familienmitgliedern (FamilieRepository) und Mail-Kontakten (MailPimRepository.cards), „Sieht aus wie …“ (similar), Ausblenden, danach Rückgängig (nicht nach Zusammenführen) und „Nächste Person“. Gesichtsausschnitte schneidet die App aus der Vorschau per box.

Fotos, Suche, Einstellungen

  • Fotos (Mockup 1): Suchfeld, Personenleiste mit „Wer ist das?“, Orte-Karte mit Ort-Chips (nur bei „Alle“), Karten-Knopf in der Leiste; der Rest wie bisher.
  • Suche: Vorschläge beim Tippen (photos/suggest: Personen, Orte, Bildinhalt), „Kein Ort, keine Person …“, Tipp; Marken der Suche (search.people/places) als Chips mit ✕.
  • Orte und Personen (Mockup 7, Drive › Einstellungen): Aufnahmeort mitsichern, Ort beim Teilen entfernen (nur wenn der Server ihn meldet – das Plugin meldet ihn nicht), Orte nachtragen, Alle Orte löschen, Personen erkennen (Aus fragt und löscht alle Gesichtsdaten), Nur beim Laden, Kinderordner einbeziehen, Lizenzhinweis.

Lizenzen, Datenschutz

  • YuNet MIT, SFace Apache-2.0 (bei OpenCV Zoo geprüft), ONNX Runtime MIT: NOTICE, assets/faces/ (Lizenztexte) und auf der Einstellungsseite.
  • Datenschutzerklärung DE/EN (docs/PRIVACY_POLICY.md, privacy-policy.html): Orte (Koordinaten an den eigenen Server), Gesichtsmerkmale (nur nach Einschalten, nur eigener Server) und der einmalige Download des Modells von GitHub bzw. Hugging Face (nur IP-Adresse und übliche Verbindungsdaten, keine Fotos). docs/GOOGLE_PLAY.md nennt beides; die Datensicherheits-CSV ist unverändert.

Auswahlmodus ohne Sprung (eigener Commit fix(drive): …)

Ein langer Druck auf ein Foto ersetzte bisher den ganzen Kopf (Titel, Dateien/Fotos, Chips, Hinweisband) durch „N ausgewählt“. Das Raster sprang nach oben, der noch aufliegende Finger markierte andere Fotos.

  • SelectionSwap: Die Auswahlleiste ersetzt nur die Titelzeile, in einer Zeile so hoch wie die höhere der beiden (beide werden gemessen, eine gezeigt). Die Hinweiszeile ist einzeilig.
  • Drive-Tab: Titelzeile tauscht in der Leiste des Tabs; Dateien/Fotos, Suchfeld, Filter-Chips und Hinweisbänder bleiben stehen, abgeblendet und ohne Eingaben. Der Kopf des Rasters (Personen, Orte, Erinnerungen) bleibt.
  • Ebenso in Ordner, Album, Suche, Speicher und Tresor. Personen und Ort haben keinen Auswahlmodus.
  • Ausgewählte Kacheln schrumpfen nur in ihrer eigenen Zelle.
  • Test: DriveSelectionSwapTest (Compose auf Robolectric) vergleicht die Lage einer Kachel vor und nach Ein- und Ausstieg sowie die Lage der Nachbarn einer ausgewählten Kachel. Robolectrics Android-Jar holt Gradle (robolectricDeps, Offline-Modus).

APK

Debug-APK gegenüber main: +20,4 MB (149,7 → 170,1 MB), davon libonnxruntime.so 19,3 MB (arm64, unkomprimiert, 16-KB-ausgerichtet) und YuNet 0,2 MB. SFace ist nicht mehr im Paket. assembleRelease war lokal nicht signierbar.

Tests

DriveFacesLogicTest (Matrix gegen OpenCVs Umeyama, Ausrichtung gegen warpAffine, YuNet-Dekodierung, NMS, base64, Referenzvektoren), DrivePlacesLogicTest (Bündel/Nachladen, Tage, Zeitraum, Suchmarken, Vorschläge, Filter, Namensvorschläge), DrivePlacesJsonTest, DriveFaceModelFetcherTest (Reihenfolge der Quellen, falscher Hash wird verworfen, Fortsetzen, Fortschritt, Abbruch). Lokal: :app:compileDebugKotlin, :app:testDebugUnitTest (1544 grün), :app:lintRelease, :app:assembleDebug.

https://claude.ai/code/session_016xX1efcZF1f6G9rhmaJNLD


Generated by Claude Code

Claude added 3 commits November 1, 2026 08:17
Drive › Fotos findet Fotos jetzt nach Ort und Person, wenn der Server
`photoPlaces` bzw. `photoPeople` meldet. Ohne die Features bleibt alles
wie bisher.

Orte (`photoPlaces`)
- Die Foto-Sicherung schickt beim Commit `geo` (EXIF-Koordinaten aus
  DriveTakenAt.shot), nur mit „Aufnahmeort mitsichern“ (keepGeo).
- „Orte nachtragen“: WorkManager-Job über `photos?unlocated=1`; ein
  Foto, dessen Original noch auf dem Handy liegt, bekommt seinen Ort
  bzw. `none` (PUT nodes/<id>/geo). Fotos, die nicht hier liegen,
  bleiben für andere Geräte.
- Karte (osmdroid wie in Familie, gleiche User-Agent-/Kachel-Policy,
  Attribution sichtbar): Bündel aus `photos/map`, beim Verschieben und
  Zoomen gedrosselt nachgeladen (gepolsterte Box, Zoomwechsel, 450 ms).
  Blatt mit Vorschau, Zeitraum und Personen, „Ort suchen“, „Mein
  Standort“, Privat/Arbeit.
- Ort: kleine Karte, Fotos nach Tag mit Ortsteil, Personen als Filter,
  „Als Album speichern“.

Personen (`photoPeople`)
- Gesichter erkennt das Handy selbst: YuNet (5 Punkte) und SFace
  (128 Werte, Modell-ID `sface-2021dec`) aus OpenCV Zoo, ONNX Runtime
  1.23.2 (ohne Telemetrie). Ausrichtung auf 112×112 wie OpenCVs
  alignCrop (Ähnlichkeitstransformation, bilinear), Ausgabe L2-normiert,
  base64 von Float32 LE (PUT nodes/<id>/faces). Kein OpenCV nötig.
- Die Modelle (fp32, unverändert) holt der Build mit SHA-256-Prüfung
  (Task faceModels); int8 passt nicht zu fp32 und rechnet auf x86/ARM
  verschieden.
- WorkManager-Job nur mit `people` an: WLAN, Akku nicht schwach, mit
  „Nur beim Laden“ (Gerätewahl, Standard an) beim Laden. Neue Fotos
  nach der Sicherung aus dem Original, alte über `unfaced` aus dem
  Original auf dem Handy oder der Vorschau. Kinderordner nur mit
  `peopleKids`.
- Personen, Person (unsichere Treffer, Zusammen mit, Orte, Jahre,
  Verknüpfen, Zusammenführen, Ausblenden), „Wer ist das?“ mit
  Namensvorschlägen aus Familie und Mail-Kontakten, Rückgängig.

Fotos und Suche
- Suchfeld, Personenleiste mit „Wer ist das?“, Orte-Karte mit Chips,
  Karten-Knopf in der Leiste.
- Suche mit Vorschlägen (`photos/suggest`) und Marken (`search.people`,
  `search.places`).
- Einstellungen „Orte und Personen“: Aufnahmeort, Ort beim Teilen
  entfernen (nur wenn gemeldet), Orte nachtragen, Orte löschen,
  Personen erkennen (Aus löscht alle Gesichtsdaten), Nur beim Laden,
  Kinderordner.

Lizenzen (YuNet MIT, SFace Apache-2.0, ONNX Runtime MIT) in NOTICE,
assets/faces und auf der Einstellungsseite; Datenschutzerklärung
(DE/EN, HTML) und Play-Notizen ergänzt. Unit-Tests: Ausrichtung und
Matrix gegen OpenCV, YuNet-Dekodierung, base64, Bündel-Logik, Tage,
Suchmarken, Filter, Namensvorschläge, JSON.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016xX1efcZF1f6G9rhmaJNLD
SFace (fp32, 39 MB) ist nicht mehr in APK und AAB. Die App lädt es,
sobald „Personen erkennen“ eingeschaltet wird; YuNet (0,2 MB) liegt
weiter in assets/faces, onnxruntime bleibt in der App.

- Quellen in dieser Reihenfolge: das Asset des eigenen Releases
  (releases/download/v<versionName>/face_recognition_sface_2021dec.onnx),
  sonst OpenCV Zoo auf GitHub, dann Hugging Face.
- Immer mit SHA-256-Prüfung: Falsche Bytes werden verworfen, die nächste
  Quelle wird versucht. Ziel ist noBackupFilesDir/faces/. Die Datei
  entsteht erst durch Umbenennen der fertigen .part-Datei; nach einem
  Abbruch geht es per Range an derselben Quelle weiter.
- WorkManager-Job, standardmäßig nur im WLAN. „Jetzt über mobile Daten
  laden“ auf Wunsch, „Erneut versuchen“ nach einem Fehler.
- Fortschritt „Erkennungsmodell wird geladen · 12 von 39 MB“ in den
  Einstellungen und auf der Seite Personen.
- Der Erkennungs-Job startet erst, wenn das Modell da ist.
  Ausschalten (auch auf einem anderen Gerät) löscht die Modelldatei.
- release.yml holt SFace per :app:faceModels mit SHA-256-Prüfung und
  hängt es an jedes Release an. Der Task packt nichts mehr ins APK.
- Datenschutzerklärung (DE/EN, HTML), NOTICE und „So funktioniert es“
  nennen den einmaligen Download (nur IP und Verbindungsdaten, keine
  Fotos).
- Unit-Tests: Reihenfolge der Quellen, falscher Hash wird verworfen,
  Fortsetzen nur an derselben Quelle, Fortschritt, Abbruch.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016xX1efcZF1f6G9rhmaJNLD
Ein langer Druck auf ein Foto startete den Auswahlmodus. Die Leiste
„N ausgewählt“ ersetzte dabei den ganzen Kopf: Titel, Dateien/Fotos,
Filter-Chips und Hinweisband verschwanden. Das Raster sprang um etwa
ein Drittel nach oben, und der Finger, der noch auf dem Bildschirm lag,
markierte beim Weiterziehen oder beim nächsten Tipp andere Fotos.

- SelectionSwap: Die Auswahlleiste ersetzt nur die Titelzeile, in einer
  Zeile so hoch wie die höhere der beiden (beide werden gemessen,
  gezeigt wird eine). Die Hinweiszeile der Auswahlleiste ist einzeilig,
  damit die Höhe nicht vom Text abhängt.
- Drive-Tab: Die Titelzeile tauscht in der Leiste des Tabs (Fotos und
  Dateien); Dateien/Fotos, Suchfeld, Filter-Chips und Hinweisbänder
  bleiben stehen, im Auswahlmodus abgeblendet und ohne Eingaben. Der
  Kopf des Rasters (Personen, Orte, Erinnerungen) bleibt ebenfalls.
- Ebenso in Ordner, Album, Suche, Speicher und Tresor. Personen und Ort
  haben keinen Auswahlmodus.
- Ausgewählte Kacheln schrumpfen nur innerhalb ihrer eigenen Zelle,
  die Nachbarn bleiben (Test).
- Compose-UI-Test auf Robolectric (DriveSelectionSwapTest): die
  Y-Position einer Kachel vor und nach dem Ein- und Ausstieg, und die
  Lage der Nachbarn einer ausgewählten Kachel. Robolectrics
  Android-Jar kommt über Gradle (robolectricDeps, offline-Modus).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016xX1efcZF1f6G9rhmaJNLD
@CallMeTechie
CallMeTechie merged commit ba62410 into main Nov 1, 2026
9 checks passed
CallMeTechie pushed a commit that referenced this pull request Nov 1, 2026
CallMeTechie pushed a commit that referenced this pull request Nov 1, 2026
…CI aus dem Speicher

Seit Drive 1.16 bricht compileReleaseKotlin mit 2 GB (GC overhead limit exceeded) ab, auch auf
main (Lint nach #170). Die Runner haben 16 GB.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016xX1efcZF1f6G9rhmaJNLD
CallMeTechie added a commit that referenced this pull request Nov 1, 2026
…d Kalenderauswahl (Drive 1.17) (#171)

* feat(drive): Fristen auch in einen Mail-Kalender – „Fristen aus …“ und Kalenderauswahl (Drive 1.17)

- Drive-Einstellungen, „KI für Dokumente“: unter jedem Bereich mit KI die Zeile „Fristen aus <Bereich>“,
  rechts das Ziel; Tippen öffnet die Auswahl Nicht eintragen, Familienkalender (nur wenn erreichbar),
  Mail-Kalender nach Konto (Feature 'deadlineMailCalendar', GET|PUT deadlines/targets,
  GET deadlines/calendars).
- Ohne das Feature bleibt der Schalter in den Familienkalender, jetzt mit eindeutigem Titel
  „Fristen aus <Bereich>“ (Bereichsname aus den Daten).
- „Fristen“: „In Kalender eintragen“ fragt bei mehr als einem Ziel nach dem Kalender, vorausgewählt ist
  das Ziel des Bereichs (POST deadlines/<id>/calendar { target }); danach „Im Kalender · Outlook“.
  mail_unavailable bekommt einen eigenen Text.
- Texte DE/EN; Unit-Tests für Auswahl, Gruppierung, Vorauswahl und JSON.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016xX1efcZF1f6G9rhmaJNLD

* feat(drive): Gradle mit 4 GB Heap – compileReleaseKotlin lief in der CI aus dem Speicher

Seit Drive 1.16 bricht compileReleaseKotlin mit 2 GB (GC overhead limit exceeded) ab, auch auf
main (Lint nach #170). Die Runner haben 16 GB.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016xX1efcZF1f6G9rhmaJNLD

---------

Co-authored-by: Claude <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants