Deux correctifs importants livrés coup sur coup cette semaine, sur deux sujets bien distincts. Le premier concerne les packs d'icônes intégrés qui ne s'appliquaient plus correctement — un bug particulièrement gênant qui trainait discrètement depuis plusieurs versions. Le second concerne le compteur de pas de la page de gauche, qui pouvait manquer les premiers pas de la journée.

1.0.8 — packs d'icônes restaurés

Le symptôme

Depuis quelques versions, sélectionner l'un des packs d'icônes intégrés à Sola (Pixelarticons, Lucide, Fluent Emoji, Bootstrap, Feather, Heroicons) ne fonctionnait pas comme prévu : au lieu d'afficher les icônes du pack choisi, toutes les icônes du dock et du tiroir affichaient l'icône Sola elle-même. Les packs d'icônes tiers installés depuis le Play Store, eux, fonctionnaient normalement.

La cause

Le coupable était le resource shrinker d'Android — un outil qui, au moment de compiler la version release, retire du fichier APK toutes les ressources graphiques qu'il pense inutilisées. Utile pour réduire la taille finale de l'app, mais fragile : si l'app charge une ressource dynamiquement (par exemple via son nom sous forme de chaîne de caractères, comme iconpack_google_chrome), le shrinker ne peut pas deviner qu'elle est utilisée. Il la supprime, silencieusement.

C'est exactement ce qui s'était passé pour les 558 icônes qui composent les packs intégrés à Sola. Chargées dynamiquement via leur nom au moment où l'utilisateur sélectionne un pack, elles étaient invisibles au shrinker au moment du build.

Le correctif

La solution est un fichier res/raw/keep.xml qui indique explicitement au shrinker que toutes les ressources dont le nom commence par iconpack_ doivent être conservées, quoi qu'il arrive :

Le sélecteur de packs a également été retravaillé au passage : un tap sur un pack donne désormais un aperçu en direct (le dock et l'écran d'accueil se mettent à jour instantanément), et un bouton flottant « Appliquer » apparaît pour confirmer le choix. Plus besoin de sortir du menu pour voir le résultat. Le dock, l'accueil et le tiroir restent parfaitement synchronisés après tout changement de pack.

Trois séries de tests automatisés ont été ajoutées pour garantir qu'un bug similaire ne repasse pas à travers les mailles : un test unitaire qui vérifie que les 558 drawables sont bien résolvables, un test qui vérifie que le pack sélectionné se propage bien à tous les composants, et un test qui simule le cycle A → B → défaut sans fuite de state.

1.0.9 — compteur de pas robuste

Le symptôme

Le compteur de pas affiché sur la page de gauche (dashboard) pouvait afficher 0 à l'ouverture, puis démarrer son décompte seulement à partir de ce moment-là. Concrètement : marcher 3 000 pas dans la matinée sans avoir ouvert la page de gauche pouvait faire perdre l'affichage de ces pas jusqu'au premier événement capté après l'ouverture.

La cause

La logique du compteur était intégrée directement dans le composable de la page de gauche. Résultat : le capteur de pas n'écoutait les événements que lorsque cette page était visible. Dès que vous swipiez vers l'écran d'accueil ou vers le tiroir, le compteur s'arrêtait d'écouter.

Sur Android, le capteur matériel de pas (TYPE_STEP_COUNTER) est cumulatif depuis le dernier redémarrage du téléphone. Il ne perd aucun pas — le hardware compte 24 h/24. Mais si aucune app n'écoute activement ses événements, la valeur affichée n'est jamais rafraîchie. Ajouté à cela, la ligne de référence (baseline) qui permet de calculer les pas de la journée en cours n'était établie qu'au premier événement reçu — donc à la première ouverture de la page de gauche.

Le correctif

La logique a été extraite dans un composant singleton — un StepCounterManager — qui vit indépendamment de la page de gauche. Il s'active dès que la permission Activity Recognition est accordée, et reste actif tant que l'app est chargée en mémoire (ce qui est quasi permanent pour un launcher par défaut). Résultat : le capteur écoute les événements de pas en continu, la baseline est établie au premier pas de la journée (bien plus tôt), et la valeur affichée est toujours à jour au moment où vous ouvrez la page.

En bonus, la dernière valeur connue est désormais persistée entre les sessions. Plus de 0 transitoire à l'affichage : quand vous rouvrez la page de gauche, la valeur du dernier événement est restaurée immédiatement, et la vraie valeur est écrite dès que le capteur émet un nouvel événement.

Note sur les Android très restrictifs

Sur les téléphones à politique de gestion mémoire agressive (certains Xiaomi, Huawei, OnePlus chinois), le processus Sola peut être tué même s'il est le launcher par défaut. Dans ce cas rare, il reste possible que le baseline du jour soit recalculé au premier redémarrage — perdant les pas faits entre-temps. Une solution basée sur Health Connect (qui garde un historique 24/7 indépendamment de Sola) est envisagée pour une version future : elle éliminera complètement ce cas limite, mais nécessite des démarches administratives auprès de Google Play qui seront prises plus tard.

Comment obtenir ces mises à jour

Les deux versions sont déployées progressivement via le Play Store. Elles devraient être disponibles pour tous dans les 24 à 48 heures. Il est aussi possible de forcer la vérification depuis l'application Play Store, section « Gérer les apps et l'appareil ».

Ouvrir sur Google Play