Skip to content

Splash screen Android : durée retenue + icône animée - #25

Merged
SKOHscripts merged 2 commits into
mainfrom
fix/android-splash-screen-duration
Jul 16, 2026
Merged

Splash screen Android : durée retenue + icône animée#25
SKOHscripts merged 2 commits into
mainfrom
fix/android-splash-screen-duration

Conversation

@SKOHscripts

@SKOHscripts SKOHscripts commented Jul 16, 2026

Copy link
Copy Markdown
Owner

Summary

Suite de PR #24 (revue produit F-Droid/mobile) : après vérification manuelle sur appareil réel, la bottom nav et le geste retour prédictif fonctionnent, mais le splash screen natif (point 5) n'était pas visible.

1. Durée retenue jusqu'au premier rendu réel

  • Cause : android:windowSplashScreenBackground/windowBackground (posés dans themes.xml par PR Correctifs UI mobile+desktop  #24) ne couvrent que la fenêtre de thème — le splash se ferme dès la première frame dessinée par setContentView(webView) dans MainActivity.onCreate, bien avant que Python/uvicorn n'ait fini de démarrer. L'utilisateur se retrouvait donc face à une WebView blanche pendant toute l'attente réelle du serveur (jusqu'à 30s, sonde /favicon.ico dans loadWhenServerReady).
  • Fix : MainActivity retient désormais le splash via Activity.getSplashScreen().setKeepOnScreenCondition(...) — API native android.window, API 31+, sans AndroidX. La condition est liée à un AtomicBoolean uiReady, mis à true par WebViewClient.onPageFinished — le splash reste donc affiché jusqu'à ce que la première page ait réellement fini de charger, pas seulement jusqu'à la réponse du serveur.

2. Icône animée (le cadran balaie depuis midi jusqu'au logo)

  • Remplace l'icône de lanceur adaptative statique par un AnimatedVectorDrawable dédié (res/drawable/kairos_splash_icon*.xml + res/animator/kairos_splash_wedge_sweep.xml) — natif android.graphics.drawable, API 21+, toujours sans AndroidX.
  • Le secteur terracotta du cadran balaie d'un sweep nul (aiguille collapsée à midi) jusqu'à sa position finale (secteur de 80° depuis midi, mêmes coordonnées que ic_launcher_foreground.xml).
  • Morph de pathData par 5 images-clés (0/20/40/60/80°) plutôt qu'un simple départ/arrivée à deux points : l'interpolation d'un pathData déplace les coordonnées de l'arc en ligne droite (corde), jamais l'angle réel — sur un seul segment de 80°, la corde coupe jusqu'à ~3.7 sur un rayon de 16 au plus fort du geste (secteur visiblement aplati à mi-course, vérifié par calcul) ; des images-clés tous les 20° ramènent cet écart à ~0.24, imperceptible.
  • Posée sur android:windowSplashScreenAnimatedIcon (API 31+, durée 700ms) : le système détecte l'Animatable et joue l'animation automatiquement, sans code Java dédié.
  • En dessous de l'API 31, aucun des deux mécanismes ne s'applique (méthodes/attributs absents du framework) — windowBackground seul reste le comportement sur ces versions, comme avant.

Documentation mise à jour dans docs/ANDROID_PACKAGING.md et docs/spec/packaging-lancement.md.

Test plan

  • pytest (suite complète, 413 tests) — vert (changements Android uniquement, aucun impact côté Python attendu ni observé)
  • Tous les fichiers XML ajoutés/modifiés validés bien formés (xml.dom.minidom)
  • Géométrie du sweep vérifiée par calcul (angle exact 80°, écart de rayon par segment de keyframe ≈0.24 sur un rayon de 16)
  • Build Android réel (cd android && ./gradlew assembleDebug) sur émulateur/appareil physique pour confirmer visuellement le rendu de l'animation et la durée du splash — non exécutable dans le sandbox de développement

🤖 Generated with Claude Code

claude added 2 commits July 16, 2026 21:43
…bView

Vérification manuelle post-merge (PR #24) : la bottom nav et le geste retour
prédictif fonctionnent, mais le splash screen natif n'apparaît pas
visiblement. Cause : android:windowSplashScreenBackground/windowBackground
seuls ne couvrent que la fenêtre de thème — le splash se ferme dès la
première frame dessinée par setContentView(webView), bien avant que
Python/uvicorn n'ait fini de démarrer, laissant place à une WebView blanche
pendant toute l'attente réelle (jusqu'à 30s, sonde /favicon.ico).

Fix : MainActivity retient le splash via
Activity.getSplashScreen().setKeepOnScreenCondition(...) (natif,
android.window, API 31+, pas AndroidX), condition liée à un AtomicBoolean
mis à true par WebViewClient.onPageFinished — donc jusqu'à ce que la
première page ait réellement fini de charger, pas seulement jusqu'à la
réponse du serveur. Sans effet en dessous de l'API 31 (méthode absente du
framework, appel gardé par un contrôle de version explicite).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012rz3jgonqVHP4fzQsJh8oP
…u logo

Suite au fix de durée du splash (même PR) : l'icône était jusqu'ici statique
(icône de lanceur adaptative reprise telle quelle). Ajoute une icône dédiée
animée (AnimatedVectorDrawable natif, android.graphics.drawable, API 21+,
toujours sans AndroidX) qui reprend le tracé exact du logo Kairos et anime
le secteur terracotta d'un balayage nul (aiguille collapsée à midi) jusqu'à
sa position finale (secteur de 80° depuis midi, coordonnées identiques à
ic_launcher_foreground.xml).

Le morph de pathData se fait par 5 images-clés (0/20/40/60/80°) plutôt qu'un
simple départ/arrivée à deux points : l'interpolation d'un pathData déplace
les coordonnées de l'arc en ligne droite (corde), jamais l'angle réel — sur
un seul segment de 80° la corde coupe jusqu'à ~3.7 sur un rayon de 16 au
plus fort du geste (secteur visiblement aplati à mi-course, vérifié par
calcul) ; des images-clés tous les 20° ramènent cet écart à ~0.24,
imperceptible.

Posée sur android:windowSplashScreenAnimatedIcon (API 31+) : le système
détecte l'Animatable et joue l'animation automatiquement à l'affichage du
splash, sans code Java dédié.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012rz3jgonqVHP4fzQsJh8oP
@SKOHscripts SKOHscripts changed the title Retient le splash screen Android jusqu'au premier rendu de la WebView Splash screen Android : durée retenue + icône animée Jul 16, 2026
@SKOHscripts
SKOHscripts marked this pull request as ready for review July 16, 2026 22:51
@SKOHscripts
SKOHscripts merged commit bc2af8b into main Jul 16, 2026
1 check passed
@SKOHscripts
SKOHscripts deleted the fix/android-splash-screen-duration branch July 16, 2026 22:51
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