W tym tygodniu wydano jedna po drugiej dwie ważne poprawki, dotyczące dwóch zupełnie różnych kwestii. Pierwsza dotyczy wbudowanych pakietów ikon, które przestały być poprawnie stosowane — szczególnie uciążliwy błąd, który dyskretnie ciągnął się przez kilka wersji. Druga dotyczy licznika kroków na lewej stronie, który mógł pomijać pierwsze kroki dnia.
1.0.8 — przywrócone pakiety ikon
Objaw
Od kilku wersji wybranie jednego z wbudowanych pakietów ikon Sola (Pixelarticons, Lucide, Fluent Emoji, Bootstrap, Feather, Heroicons) nie działało zgodnie z oczekiwaniami: zamiast wyświetlać ikony wybranego pakietu, wszystkie ikony w doku i szufladzie pokazywały samą ikonę Sola. Pakiety ikon innych producentów zainstalowane z Play Store działały normalnie.
Przyczyna
Winowajcą był resource shrinker Androida — narzędzie, które podczas kompilowania wersji release usuwa z pliku APK wszystkie zasoby graficzne uznane za nieużywane. Przydatne do zmniejszenia ostatecznego rozmiaru aplikacji, ale zawodne: jeśli aplikacja ładuje zasób dynamicznie (na przykład poprzez jego nazwę jako ciąg znaków, np. iconpack_google_chrome), shrinker nie może wiedzieć, że jest on używany. Usuwa go, po cichu.
Dokładnie to przydarzyło się 558 ikonom składającym się na wbudowane pakiety Sola. Ładowane dynamicznie po nazwie w momencie wyboru pakietu przez użytkownika, były niewidoczne dla shrinkera w momencie budowania aplikacji.
Rozwiązanie
Rozwiązaniem jest plik res/raw/keep.xml, który wprost informuje shrinker, że wszystkie zasoby, których nazwa zaczyna się od iconpack_, muszą zostać zachowane, niezależnie od okoliczności:
Przy okazji przebudowano też selektor pakietów: dotknięcie pakietu daje teraz podgląd na żywo (dok i ekran główny aktualizują się natychmiast), a pływający przycisk "Zastosuj" pojawia się w celu potwierdzenia wyboru. Nie trzeba już wychodzić z menu, by zobaczyć efekt. Dok, ekran główny i szuflada pozostają idealnie zsynchronizowane po każdej zmianie pakietu.
Dodano trzy serie zautomatyzowanych testów, które mają zagwarantować, że podobny błąd się nie powtórzy: test jednostkowy sprawdzający, czy wszystkie 558 zasobów graficznych daje się poprawnie rozwiązać, test sprawdzający, czy wybrany pakiet prawidłowo rozprzestrzenia się na wszystkie komponenty, oraz test symulujący cykl A → B → domyślny bez wycieku stanu.
1.0.9 — bardziej niezawodny licznik kroków
Objaw
Licznik kroków wyświetlany na lewej stronie (dashboard) mógł przy otwarciu pokazywać 0, a odliczanie zaczynało się dopiero od tego momentu. W praktyce: przejście 3000 kroków rano bez otwierania lewej strony mogło sprawić, że te kroki nie były widoczne aż do pierwszego zdarzenia zarejestrowanego po otwarciu.
Przyczyna
Logika licznika była wbudowana bezpośrednio w komponent (composable) lewej strony. W efekcie czujnik kroków nasłuchiwał zdarzeń tylko wtedy, gdy ta strona była widoczna. Gdy tylko przełączałeś się na ekran główny lub szufladę, licznik przestawał nasłuchiwać.
Na Androidzie sprzętowy czujnik kroków (TYPE_STEP_COUNTER) jest kumulatywny od ostatniego restartu telefonu. Nie traci żadnego kroku — sprzęt liczy 24 godziny na dobę. Ale jeśli żadna aplikacja aktywnie nie nasłuchuje jego zdarzeń, wyświetlana wartość nigdy się nie odświeża. Do tego dochodzi linia odniesienia (baseline) pozwalająca obliczyć kroki bieżącego dnia, która była ustalana dopiero przy pierwszym otrzymanym zdarzeniu — czyli przy pierwszym otwarciu lewej strony.
Rozwiązanie
Logikę wydzielono do komponentu singleton — StepCounterManager — który istnieje niezależnie od lewej strony. Aktywuje się, gdy tylko zostanie przyznane uprawnienie Activity Recognition, i pozostaje aktywny tak długo, jak aplikacja jest wczytana w pamięci (co jest niemal permanentne dla domyślnego launchera). Efekt: czujnik nasłuchuje zdarzeń kroków w sposób ciągły, wartość bazowa jest ustalana przy pierwszym kroku dnia (znacznie wcześniej), a wyświetlana wartość jest zawsze aktualna w momencie otwarcia strony.
W ramach bonusu ostatnia znana wartość jest teraz zachowywana między sesjami. Koniec z tymczasowym 0 na ekranie: przy ponownym otwarciu lewej strony wartość ostatniego zdarzenia jest przywracana natychmiast, a prawdziwa wartość zapisywana jest, gdy tylko czujnik wyemituje nowe zdarzenie.
Uwaga o bardzo restrykcyjnych Androidach
Na telefonach o agresywnej polityce zarządzania pamięcią (niektóre chińskie Xiaomi, Huawei, OnePlus) proces Sola może zostać zabity, nawet jeśli jest domyślnym launcherem. W tym rzadkim przypadku baseline dnia może zostać przeliczona przy pierwszym restarcie — tracąc kroki wykonane w międzyczasie. Rozwiązanie oparte na Health Connect (który utrzymuje historię 24/7 niezależnie od Sola) jest rozważane na przyszłą wersję: całkowicie wyeliminuje ten skrajny przypadek, ale wymaga formalności administracyjnych u Google Play, które zostaną podjęte później.
Jak uzyskać te aktualizacje
Obie wersje są wdrażane stopniowo przez Play Store. Powinny być dostępne dla wszystkich w ciągu 24–48 godzin. Można też wymusić sprawdzenie aktualizacji z poziomu aplikacji Play Store, w sekcji "Zarządzaj aplikacjami i urządzeniem".
Otwórz w Google Play