Systemowo wyłączone animacje, brak informacji o zakończeniu animacji

Systemowo wyłączone animacje, brak informacji o zakończeniu animacji

Tags
Android
Published
August 7, 2019
Author
Mateusz Teteruk
W pracy rozwijam obecnie aplikację Ryanair Discovery. Kolega z pracy dał dzisiaj znać, że odkrył pewien problem, a mianowicie aplikacja nie działa poprawnie, gdy użytkownik wyłączy systemowo animacje. Jeśli nie wiesz jak to zrobić poczytaj o opcjach developerskich. Po wyłączeniu animacji aplikacja zatrzymywała się na tzw. SplashScreenie, czyli ekranie ładowania aplikacji. Wyjście z aplikacji, ponowne jej włączenie „naprawiało” ją i pozwalało na wyszukiwanie najtańszych połączeń lotniczych. Nie znam nikogo, kto wyłącza systemowe animacje, no ale tak nie może być :).

Przyczyna problemu

Po analizie problemu okazało się, że nie wykonuje się akcja końcowa ustawiana na animatora. Na tym ekranie wykorzystywane są ViewPropertyAnimator z istotnymi fragmentami kodu wykonywanymi w momencie zakończenia animacji, co jest osiągane poprzez withEndAction(Runnable runnable).
Dalsze rozpoznanie wskazało bezpośrednią przyczynę błędu. Wystarczyło wyłączyć w ustawieniach systemu tylko jedną animację – Animator Duration Scale. W rezultacie animacje kończą się od razu. Okej. Dziwne jest jednak to, że otrzymujemy callback w momencie rozpoczęcia animacji, lecz nie dostajemy takowego w momencie jej „błyskawicznego” zakończenia 🤨.

Rozwiązanie

Podczas przeszukiwania internetu nie natrafiłem na nic sensownego, co mogłoby pomóc w rozwiązaniu tego błędu. Wiedząc, że jeśli w ustawieniach developerskich zostanie wyłączona wcześniej wskazana animacja to nie otrzymamy żadnej informacji o zakończeniu animacji i nie przejdziemy do następnego ekranu, zaproponowałem następujące podejście.
Sprawdzam, czy animacja została wyłączona w systemie. Jeśli tak, wykorzystuję Rx’owe Observable.interval do cyklicznego nasłuchiwania na zmianę stanu, która umożliwia otwarcie następnego ekranu. Użytkownik i tak nie widzi pysznych animacji, więc takie podejście do tak ekstremalnej sytuacji jest akceptowalne.
Jeśli masz pomysł, w jaki sposób można rozwiązać ten problem to koniecznie daj znać. Może to wina ViewPropertyAnimatora? Może na innych animatorach działa to „poprawnie”? Jeśli działa to czemu tutaj nie działa?
No właśnie, to jest piękno Androida 😉.