Skip to content

Mail: Kalender und Kontakte im Mail-Tab (Phase 2) - #164

Merged
CallMeTechie merged 3 commits into
mainfrom
feature/mail-calendar-contacts
Oct 31, 2026
Merged

CallMeTechie merged 3 commits into
mainfrom
feature/mail-calendar-contacts

Conversation

@CallMeTechie

Copy link
Copy Markdown
Owner

Phase 2 von GateControl Mail in der App: Kalender und Kontakte im Mail-Tab (Vertrag D2–D8, API C2/C3; Server Mail 1.2.0, series aus Mail 1.3.0). Baut auf #163 (Seitenleisten-Fuß) auf; main ist per Merge-Commit hereingeholt.

Bereiche und Seitenleiste (D1/D2)

  • Der Mail-Tab hat drei Bereiche: Mail, Kalender, Kontakte. Umschalten über die Symbole rechts im Fuß der Seitenleiste (nur mit features.calendar / features.contacts); ein Tipp auf das aktive Symbol oder „Posteingänge“ führt zurück, ebenso „Zurück“.
  • Die Seitenleiste zeigt je Bereich ihren Inhalt (Mockup MenueNeu): Kalender mit Häkchen und Farbe, gruppiert „GateControl“ / je Konto / „Eingeblendet · nur ansehen“, Zustand je Kalender; lange drücken: Farbe, Erinnerungen an/aus, Umbenennen und Löschen (eigene); „Kalender hinzufügen“ und „iCal-Abo“. Kontakte: „Alle Kontakte“, Adressbücher mit Häkchen und Anzahl, Gruppen, „Dubletten“.
  • Kalender und Kontakte lassen sich als Seite an Start anheften (wie Mail, aber ohne eigenen Tab): neue Seiten-IDs calendar / contacts hinter Mail. In „Leiste und Seiten“ heißt die Wahl dort „Im Mail-Tab | Seite“, „Seite entfernen“ lässt sie im Mail-Tab.

Kalender (D3, Mockups Kalender, Einladung)

  • Ansichten Tag, 3 Tage, Woche, Monat, Liste, „Heute“, ‹ › und Wischen (nicht auf einer Start-Seite); Chips der Kalender zum Ein-/Ausblenden.
  • Raster 0–24 Uhr (Start 7 Uhr), Ganztägige oben, Termine in Kalenderfarbe mit Farblinie, Überlappende nebeneinander, offene Einladung gestrichelt, abgesagt durchgestrichen, Eingeblendetes „nur ansehen“, Jetzt-Linie. Tippen auf freie Zeit → neuer Termin.
  • Termin ansehen: Zeit (mit abweichender Zeitzone), Wiederholung in Worten, Kalender, Ort (Karte), Online-Link („Teilnehmen“), Erinnerungen, Teilnehmer mit Antwort und „n von m zugesagt“ (antippen → Kontakt bzw. „Als Kontakt speichern“), Beschreibung (HTML wie Mail), Bearbeiten/Löschen bzw. Zusagen/Mit Vorbehalt/Absagen mit Kommentar; Löschen fragt „Nur dieser / ganze Serie“ und ob Teilnehmer benachrichtigt werden.
  • Termin bearbeiten/neu: Titel, Kalender (nur schreibbare), ganztägig, Beginn/Ende, Zeitzone (eingeklappt), Wiederholung (täglich, wöchentlich an Tagen, monatlich am Tag / am n-ten Wochentag, jährlich; Ende nie/am/nach n), Ort, Teams (nur canOnline) oder Link, Erinnerungen bis maxReminders, Teilnehmer mit Vorschlägen aus Kontakten und Gruppen, frei/beschäftigt, privat, Beschreibung; Hinweis „Einladungen werden gesendet über “.
  • Serien: vor dem Speichern „Nur dieser Termin“ / „Alle Termine der Serie“. Bei „Alle“ mit geänderter Zeit wird series.start (Mail 1.3.0) um die Verschiebung des Vorkommens in Tagen und Minuten der Wanduhr verschoben (wie L.shiftSeries im Portal); ohne Zeitänderung werden keine Zeitfelder geschickt. Ohne series (Server 1.2.0) ist bei Zeitänderung nur „Nur dieser Termin“ wählbar. 400 invalid { reason: 'series_shift' } → verständlicher Hinweis.
  • Konflikte: 409 conflict { current } → „Der Termin wurde inzwischen geändert“ mit „Neu laden“ und „Meine Änderung erneut anwenden“ (gleiches für Kontakte).
  • Einladungskarte in der Lese-Ansicht über dem Text (Mockup Einladung): Zeit, Ort, Mini-Tagesraster mit Konflikten, Zusagen / Mit Vorbehalt / Absagen, Kommentar, „Neue Zeit vorschlagen“, „Eintragen in: “, Teilnehmer „3 von 5 zugesagt“; Zustände beantwortet („Ändern“), abgesagt („Aus Kalender entfernen“), Antwort erhalten, Gegenvorschlag (Übernehmen/Ablehnen), veraltet. Ohne Kalender-Scope: „Kalender freigeben“ (Neu anmelden). In der Liste das Etikett „Einladung“.

Kontakte (D4, Mockups Kontakte, Kontakt, KontaktBearbeiten)

  • Liste mit Suche (lokal im Offline-Bestand, sonst Server), Reitern Kontakte | Gruppen, Buchstaben-Abschnitten (Ä→A …) mit A–Z-Leiste, Quelle als Farbpunkt des Kontos, Band „n mögliche Dubletten“, „Neuer Kontakt“; Gruppen mit Anzahl, „Neue Gruppe“; Gruppe: Mitglieder, „Mail an alle“, hinzufügen/entfernen, umbenennen/löschen.
  • Kontakt: Foto, Name, Position · Firma, Quelle(n) inkl. „verknüpft mit …“; Mail, Anrufen (tel:), Bearbeiten; Adressen, Nummern, Anschrift (Karte), Geburtstag („wird 46“), Notiz, Gruppen; Letzte Mails („Alle Mails von …“ → Absender-Ansicht) und Gemeinsame Termine. Nur-lesend-Quelle ohne Bearbeiten.
  • Bearbeiten/Neu: Foto (Kamera mit Berechtigungsabfrage oder Galerie, 512 px JPEG ≤ 256 KB), Vor-/Nachname, Firma, Position, mehrere Adressen/Nummern mit Art, Anschriften, Geburtstag (Jahr optional), Notiz, Gruppen, Adressbuch (nur neu). „Als Kontakt speichern“ aus der Mail füllt über cards/draft vor, bei vorhandenem Kontakt „Zu hinzufügen“.
  • Dubletten: Gründe, „Zusammenführen“ mit Auswahl des bleibenden Kontakts und je abweichendem Feld, Hinweis „werden verknüpft, beim Anbieter bleibt beides“; „Keine Dublette“.
  • vCard-Import (für Gmail) über den Datei-Dialog, Export zum Teilen oder Speichern (CreateDocument).

Absender, Schreiben, Microsoft (D5/D6)

  • Absender-Ansicht zeigt den echten Kontakt aus cards/lookup (Foto, Position · Firma, Nummern zum Anrufen, „Kontakt öffnen“), sonst „Als Kontakt speichern“; ohne features.contacts wie bisher. „Als Kontakt speichern“ auch im Menü der Lese-Ansicht.
  • Beim Schreiben (und bei Teilnehmern) Vorschläge mit Initialen und Quelle; Gruppen als „Familie (5)“ setzen alle Mitglieder ein.
  • missingScopes → Band „Kalender und Kontakte von freigeben“ mit Neu anmelden (bestehender relogin-Ablauf von MailAddAccountViewModel) im Kalender, in den Kontakten, im Konto-Dialog und an der Einladung. Bleibt der Scope danach fehlend, Hinweis, dass die Firma freigeben muss, mit adminConsentUrl zum Teilen.

Push, Live, Offline (D7)

  • calendar_reminder öffnet den Termin (auch das Vorkommen), calendar_invite die Einladung; Kanäle „Kalender“ und „Kalender-Einladungen“.
  • Live-Ereignisse calendar / contacts laden sichtbaren Zeitraum, Liste und Kontakt neu (eigene MailPimRepository).
  • Offline wie Mail (MailCache, je Anmeldung, nicht im Backup, Abmelden/Fernlöschen löscht mit): Kalenderliste, Vorkommen −30 … +90 Tage, geöffnete Termine und Kontakte, alle Kontakt-Zusammenfassungen (since-Abgleich), Fotos (500, LRU). Offline nur lesen: Neu/Bearbeiten/Antworten aus, Hinweis „Offline – geht wieder mit Verbindung“.

Technik

  • Modelle MailCalendarModels.kt, MailContactModels.kt; Parser MailPimJson (Gson-Baum wie MailJson, keine Reflection → R8 unkritisch; minifyReleaseWithR8 lokal grün); MailJson um die C2-Felder erweitert (missingScopes, calendar/contacts am Konto, adminConsentUrl, Summary.invite, Message.invite, Kontakt-/Gruppen-Vorschläge).
  • PATCH von Terminen/Kontakten mit null-Feldern (Leeren einer Regel, eines Links, eines Geburtstags) über pluginPatchRaw mit serializeNulls.
  • Neue Routen MailEvent, MailEventEdit, MailInvitation, MailContact, MailContactEdit, MailContactDuplicates, MailGroup.
  • Texte DE/EN in strings_pim.xml. Dunkle Darstellung über die bestehenden Theme-Farben.

Tests

  • MailPimLogicTest (Wochen-/Monatsraster, Überlappung, über Mitternacht, ganztägig inklusiv, Agenda, Zeitzonen inkl. Sommerzeit, Serienverschiebung, RRULE-Text DE/EN, Erinnerungen, Buchstaben, lokale Suche, since-Abgleich, Merge, Geburtstage, Offline-Logik), MailPimJsonTest (alle Antworten, Konflikte, Request-Bodies, Push-Ziele), Ergänzungen in MainTabsTest.
  • Screenshot-Unit-Tests für Mail gibt es im Repo nicht.
  • Lokal grün: :app:testDebugUnitTest, :app:lintRelease, :app:assembleDebug, :app:minifyReleaseWithR8.

Abweichungen

  • Ansichten: Telefon und Tablet bieten alle fünf (Tag, 3 Tage, Woche, Monat, Liste) über eine Auswahl; Standard ist die Server-Einstellung (3day).
  • Kontakte sind – wie gewünscht – ebenfalls als Seite anheftbar (Vertrag G2 empfahl nur Kalender).
  • Ganztägige Erinnerungen: Der Server rechnet „Minuten vor der Mitternacht des Tages“ (1080 = 6:00 am Vortag, nicht 18:00 wie im Vertrag); die App zeigt die echte Zeit und bietet 18:00/9:00 am Vortag, 9:00 zwei Tage und eine Woche vorher an.
  • Tablet: Seitenleiste bleibt die ausziehbare Leiste wie heute im Mail-Tab (keine feste Spalte).

Generated by Claude Code

Claude added 3 commits October 31, 2026 09:47
…/Kalender rechts)

- Fuß der Mail-Seitenleiste wie Mockup „Seitenmenü neu“: links das Zahnrad
  (Mail-Einstellungen), rechtsbündig Kontakte und Kalender (je 44×44, aktiver
  Bereich im Akzent). Beide erscheinen nur mit features.contacts bzw.
  features.calendar und sobald die App den Bereich öffnen kann (folgt mit
  Kalender und Kontakten).
- Das „+“ entfällt: ein Konto kommt nur noch über die Mail-Einstellungen dazu.
  „Konto hinzufügen“ im Leer-Zustand öffnet die Mail-Einstellungen mit
  „Konto hinzufügen“ darüber (Zurück führt in die Einstellungen).
- Texte DE/EN, Unit-Test für die Feature-Abfrage.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016xX1efcZF1f6G9rhmaJNLD
Der Mail-Tab bekommt die Bereiche Kalender und Kontakte (Vertrag D2–D8,
API C2/C3 von Mail 1.2.0, `series` aus Mail 1.3.0):

- Seitenleiste je Bereich: Kalender mit Häkchen/Farbe, Gruppen
  GateControl / Konto / Eingeblendet, Optionen per langem Druck,
  „Kalender hinzufügen“, „iCal-Abo“; Kontakte mit Adressbüchern,
  Gruppen und Dubletten. Kalender und Kontakte lassen sich als Seite an
  Start anheften (ohne eigenen Tab).
- Kalender: Tag, 3 Tage, Woche, Monat, Liste; Raster mit Überlappung,
  Ganztägigen, offenen Einladungen, Abgesagten, Einblendungen und
  Jetzt-Linie; Termin ansehen, anlegen, bearbeiten (Wiederholung,
  Zeitzone, Erinnerungen, Teilnehmer mit Vorschlägen, Ort, Teams/Link),
  „Nur dieser / ganze Serie“ (Serie über series.start), Antworten,
  „Meine Änderung erneut anwenden“ bei Konflikten, Einladungskarte in
  der Lese-Ansicht.
- Kontakte: Liste mit Suche, Buchstaben, A–Z, Gruppen-Reiter; Kontakt
  mit Mail, Anrufen, Bearbeiten, letzten Mails und gemeinsamen
  Terminen; Bearbeiten mit Foto; Dubletten zusammenführen; vCard-Import
  und -Export.
- Absender-Ansicht mit echtem Kontakt und „Als Kontakt speichern“;
  Empfänger-Vorschläge mit Kontakten und Gruppen.
- Microsoft: Band „Kalender und Kontakte freigeben“ mit „Neu anmelden“
  bei missingScopes, danach Hinweis mit adminConsentUrl.
- Push (Erinnerung → Termin, Einladung), Live-Ereignisse calendar und
  contacts, Offline-Kopie wie bei Mail (nur lesen).
- Parser MailPimJson über den Gson-Baum (keine Reflection), Texte DE/EN,
  Unit-Tests für Raster, Ganztägiges, RRULE-Text, Zeitzonen,
  Serienverschiebung, Merge, Parser und Push.

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

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016xX1efcZF1f6G9rhmaJNLD
@CallMeTechie
CallMeTechie merged commit 0eddadd into main Oct 31, 2026
9 checks passed
CallMeTechie pushed a commit that referenced this pull request Oct 31, 2026
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