Splash screen Android : durée retenue + icône animée - #25
Merged
Conversation
…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
marked this pull request as ready for review
July 16, 2026 22:51
4 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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
android:windowSplashScreenBackground/windowBackground(posés dansthemes.xmlpar 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 parsetContentView(webView)dansMainActivity.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.icodansloadWhenServerReady).MainActivityretient désormais le splash viaActivity.getSplashScreen().setKeepOnScreenCondition(...)— API nativeandroid.window, API 31+, sans AndroidX. La condition est liée à unAtomicBoolean uiReady, mis àtrueparWebViewClient.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)
AnimatedVectorDrawabledédié (res/drawable/kairos_splash_icon*.xml+res/animator/kairos_splash_wedge_sweep.xml) — natifandroid.graphics.drawable, API 21+, toujours sans AndroidX.ic_launcher_foreground.xml).pathDatapar 5 images-clés (0/20/40/60/80°) plutôt qu'un simple départ/arrivée à deux points : l'interpolation d'unpathDatadé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.android:windowSplashScreenAnimatedIcon(API 31+, durée 700ms) : le système détecte l'Animatableet joue l'animation automatiquement, sans code Java dédié.windowBackgroundseul reste le comportement sur ces versions, comme avant.Documentation mise à jour dans
docs/ANDROID_PACKAGING.mdetdocs/spec/packaging-lancement.md.Test plan
pytest(suite complète, 413 tests) — vert (changements Android uniquement, aucun impact côté Python attendu ni observé)xml.dom.minidom)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