Skip to content

Android: E-Mail-Links öffnen die Mail-App, das Kopfvideo war kein Fehler - #282

Merged
JumpLink merged 2 commits into
mainfrom
fix/android-reader-video-and-mailto
Sep 24, 2026
Merged

JumpLink merged 2 commits into
mainfrom
fix/android-reader-video-and-mailto

Conversation

@JumpLink

@JumpLink JumpLink commented Sep 24, 2026 •

Copy link
Copy Markdown
Collaborator

Worum es geht

Bei der Prüfung von #271 auf einem Android-Handy (Emulator) sind zwei Punkte aufgefallen:

  1. Das Video oben im Artikel lief nicht, es war nur ein Standbild zu sehen.
  2. Ein Tipp auf eine E-Mail-Adresse im Artikel öffnete keine Mail-App. Stattdessen verschwand der Artikel und die App zeigte eine Fehlerseite („net::ERR_UNKNOWN_URL_SCHEME“).

Was sich ändert

E-Mail-Adressen und Telefonnummern: Ein Tipp darauf gibt die Adresse jetzt an das Telefon weiter, also an die Mail-App oder die Telefon-App. Der Artikel bleibt dabei stehen, genau an der Stelle, an der man war. Ist keine passende App installiert, passiert einfach nichts, es gibt keine Fehlerseite mehr. Im Web war das schon mit #280 so, jetzt verhält sich die Android-App gleich.

Das Video: Hier gab es nichts zu reparieren. Auf dem Test-Emulator waren die Animationen des Systems ausgeschaltet. Android behandelt das wie die Einstellung „Animationen entfernen“, also wie den Wunsch nach weniger Bewegung. Die App zeigt dann absichtlich ein Standbild statt des Videos, so wie es gewollt ist. Mit eingeschalteten Animationen läuft das Video, im hellen und im dunklen Modus. Damit das beim nächsten Test niemand wieder für einen Fehler hält, steht es jetzt in TROUBLESHOOTING.md.

Das Video läuft, hell (zwei Aufnahmen im Abstand von drei Sekunden):
Kopfvideo, hell, zwei Aufnahmen drei Sekunden auseinander, das Bild hat sich bewegt

Das Video läuft, dunkel:
Kopfvideo, dunkel, zwei Aufnahmen drei Sekunden auseinander, das Bild hat sich bewegt

Mit ausgeschalteten Animationen zeigt die App mit Absicht das Standbild, beide Aufnahmen sind gleich:
Mit ausgeschalteten Animationen steht an derselben Stelle das Titelbild, unbewegt

E-Mail-Adresse im Artikel „Lagebericht Brandherd Desinformation“: vor dem Tipp, direkt danach (Gmail öffnet sich) und nach dem Zurückgehen (der Artikel ist noch da, an derselben Stelle):
Links der Artikel mit der E-Mail-Adresse, in der Mitte der Willkommensbildschirm von Gmail, rechts wieder der Artikel an derselben Stelle

iOS ist weiter nicht geprüft, dafür fehlt wie bei #262 ein Mac mit vollständigem Xcode. Deshalb bleibt #271 offen.

Refs #271

Technische Notizen

E-Mail/Telefon. onShouldStartLoadWithRequest gab für mailto:/tel: den Wert von onNavigate zurück, und classifyReaderLink sortiert beide Schemata als allow ein. Die Android-WebView hat die Adresse dann selbst geladen und konnte es nicht. Neu ist shouldStartReaderLoad(target, onNavigate, handOff) in apps/mobile/src/lib/articles/readerNavigation.ts, das native Gegenstück zu readerClickAction: Was onNavigate durchlässt und mailto: oder tel: ist, geht an handOff (openExternal, das die Ablehnung von Linking.openURL abfängt und loggt), und die WebView bekommt false. classifyReaderLink und onNavigate in artikel.tsx bleiben unverändert, damit der Web-Weg aus #280 ('let-through') weiter funktioniert. Tests in apps/mobile/__tests__/reader-navigation.test.ts.

Auf dem Emulator (API 36, WebView 152.0.7977.88) gemessen: Nach dem Tipp zeigt logcat START u0 {act=android.intent.action.VIEW dat=mailto:… cmp=com.google.android.gm/.ComposeActivityGmailExternal}, und nach „Zurück“ ist org.correctiv.app/.MainActivity wieder oben, mit dem Artikel an derselben Stelle. Auf dem Emulator ist Gmail vorinstalliert, deshalb öffnet sich Gmail statt einer ActivityNotFoundException. Der Fall ohne Mail-App ist also nicht gemessen, er läuft aber durch denselben catch in openExternal, den der Rest der App schon nutzt.

Video. Gemessen mit demselben Release-Build und demselben Artikel („Das Russische Haus“), nur settings put global animator_duration_scale geändert: Bei 0 unterscheiden sich zwei Aufnahmen im Abstand von drei Sekunden im Bereich des Kopfbilds um 0 Pixel, bei 1 bewegt sich das Video, hell wie dunkel. Chromium auf Android meldet bei animator_duration_scale 0 prefers-reduced-motion: reduce, und READER_LAYOUT_CSS blendet dann das Video aus und das Bild ein, während das media an der <source> den Download verhindert. Das media-Attribut, die CSP und loadDataWithBaseURL waren damit nicht die Ursache und sind unverändert. Die Testseite im Chrome des Emulators lief, weil sie keine Media Query hatte. Die Tour-Skripte stellen die Skalierung vorher auf 1 (quiet_system_ui) und danach zurück, ein Emulator mit 0 ist also ein normaler Zustand. Die direkte Abfrage von matchMedia in der App-WebView ist nicht gemacht (Release-Build, kein Debugging der WebView); der Schluss beruht auf dem Vorher-Nachher mit nur dieser einen Einstellung.

heroHtml und der Web-Reader sind nicht verändert, deshalb habe ich den Web-Export nicht neu gebaut.

🤖 Generated with Claude Code

…ding them

Android's WebView cannot load either scheme and replaced the article with
its own net::ERR_UNKNOWN_URL_SCHEME page. shouldStartReaderLoad sends the
two schemes onNavigate lets through to openExternal and tells the WebView
not to load them, the native counterpart of readerClickAction on the web.

The header video reported in the same issue was not a defect: an emulator
with animations off reports prefers-reduced-motion, and the reader shows
the still on purpose. TROUBLESHOOTING.md now says so.

Refs #271
@JumpLink
JumpLink merged commit 0760383 into main Sep 24, 2026
4 checks passed
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.

1 participant