Obróć sugestie

W systemie Android 8.0 użytkownicy mogli przełączać się między trybem automatycznego obracania i obracania w pionie za pomocą kafelka Szybkich ustawień lub ustawień wyświetlania. W systemie Android 9 zaktualizowaliśmy tryb obracania w pionie, aby wyeliminować niezamierzone obroty, przypinając bieżący obrót ekranu, nawet jeśli zmienia się pozycja urządzenia. Użytkownicy mogą w razie potrzeby ręcznie uruchomić rotację, naciskając nowy przycisk na pasku nawigacyjnym. Zmieniliśmy nazwę trybu portretowego na blokadę obrotu i aktywuje się on, gdy automatyczne obracanie jest wyłączone. Nie ma żadnych zmian w trybie automatycznego obracania.

Gdy urządzenie znajduje się w trybie blokady obrotu, użytkownicy mogą zablokować ekran w dowolnym kierunku obsługiwanym przez widoczną na górze Aktywność (biorąc pod uwagę bieżące ograniczenia systemu). Jeśli górne działanie można renderować z wieloma obrotami w trybie automatycznego obracania, te same opcje powinny być dostępne w trybie zablokowanego obrotu, z pewnymi wyjątkami wynikającymi z ustawienia screenOrientation działania.

Tryb blokady obrotu polega na wyświetlaniu przycisku na pasku nawigacyjnym w przypadku zmian obrotu urządzenia. Aby to osiągnąć, czujnik orientacji urządzenia musi pozostać aktywny nawet wtedy, gdy funkcja automatycznego obracania jest wyłączona. Dotknięcie tego przycisku skutecznie ustawia preferencje rotacji użytkownika ( Settings.System.USER_ROTATION ). WindowManager wykorzystuje tę preferencję wraz z innymi szczegółami dotyczącymi najwyższej aktywności i stanu systemu, aby zmienić rotację systemu. WindowManager w dalszym ciągu korzysta z preferencji rotacji użytkowników przy podejmowaniu decyzji, w jakiej rotacji ma być renderowany system podczas przechodzenia do innego działania.

Ten gif przedstawia telefon w orientacji poziomej z ekranem w orientacji pionowej. Pojawia się ikona pytająca użytkownika, czy chce zmienić orientację ekranu na poziomą.
Rysunek 1 . Obróć przycisk sugestii z włączonym gestem „Przesuń w górę na przycisku strony głównej”.

Podczas przechodzenia między działaniami należy zachować preferencję rotacji użytkowników. Ponieważ jednak większość użytkowników telefonów chce przebywać w krajobrazie tylko przez krótki, tymczasowy okres czasu, dodaliśmy naturalne odchylenie orientacji. Preferencje dotyczące rotacji użytkownika są resetowane do naturalnej orientacji urządzenia za każdym razem, gdy obrót systemu zmienia się na naturalną orientację urządzenia. W przypadku większości telefonów naturalna orientacja urządzenia to pionowa (0°). Resetowanie preferencji rotacji użytkowników często ma miejsce podczas korzystania z aplikacji działającej wyłącznie w orientacji pionowej, blokowania telefonu lub powrotu do obszaru roboczego programu uruchamiającego.

Interakcje rotacyjne z użytkownikami nie zmieniły się zbytnio w ciągu ostatniej dekady. Użytkownicy mogą mieć trudności z odkryciem tej funkcji, biorąc pod uwagę ich wcześniejszą historię związaną z rotacją i rozmieszczeniem przycisków na pasku nawigacyjnym. Z tego powodu do przycisku obracania dodaliśmy tryb wprowadzenia, który podświetla go, gdy się pojawi. Zachowanie trybu wprowadzenia ma miejsce tylko w przypadku kilku pierwszych interakcji z przyciskami, po czym tryb wprowadzenia zostaje wyłączony.

Źródło

Do Androida 9 dodano obsługę sugestii rotacji. Większość zmian zawarta jest w poniższych plikach.

  • services/.../server/policy/PhoneWindowManager.java :
    • Hooki zużywające wyjście WindowOrientationListener ( MyOrientationListener , odpowiedzialny za monitorowanie czujników w celu ustalenia, czy urządzenie zostało obrócone)
    • Utrzymuje aktywność WindowOrientationListener nawet wtedy, gdy automatyczne obracanie jest wyłączone (patrz needSensorRunningLp() )
    • Oblicza rotację systemu, biorąc pod uwagę preferencje rotacji użytkownika, górny screenOrientation aktywności, ustawienia orientacji i stan systemu (patrz rotationForOrientationLw() )
    • Określ, czy górne działanie może obrócić się o zadany obrót (zobacz isRotationChoicePossible() )
  • SystemUI/.../statusbar/phone/NavigationBarFragment :
    • Określa, czy przycisk paska nawigacyjnego powinien być wyświetlany podczas wywołań zwrotnych sugestii rotacji z PhoneWindowManager (patrz onRotationProposal() )
    • Uchwyty, kiedy ukryć przycisk obracania paska nawigacyjnego (zobacz wywołania setRotateSuggestionButtonState(false) )
    • Obsługuje limity czasu przycisków, w tym specjalny przypadek, gdy pasek nawigacyjny jest ukryty (zwykle na pełnym ekranie)
    • Resetuje preferencje użytkownika po powrocie do naturalnej orientacji urządzenia ( mRotationWatcher )
    • Wybiera odpowiedni styl animacji przycisku paska nawigacyjnego, zastosowany w NavigationBarView (zobacz onRotationProposal() )
    • Dodaje logikę trybu wprowadzenia, w tym wyspecjalizowaną animację (zobacz odniesienia do Settings.Secure.NUM_ROTATION_SUGGESTIONS_ACCEPTED )
    • Implementuje flagę rotacji Disable2 (zobacz disable() )
  • SystemUI/.../statusbar/phone/NavigationBarView.java :
    • Animacja ikony przycisku stylów dopasowana do oczekującej rotacji (zobacz updateRotateSuggestionButtonStyle() )
    • Obsługuje zmiany widoczności przycisków (zobacz setRotateButtonVisibility() ), w tym logikę ukrywania przycisku obracania, jeśli aktywne są pewne usługi ułatwień dostępu (uwzględniając ranking stosu przycisków paska nawigacyjnego po prawej stronie)
  • SystemUI/res/layout/menu_ime.xml :
    • Zawiera nowy KeyButtonView dla przycisku obracania, umieszczony nad menu i selektorem edytora IME/klawiatury, ale poniżej przycisku ułatwień dostępu
  • SystemUI/res/drawable/ic_sysbar_rotate_button.xml :
    • Złożony AnimatedVectorDrawable używany do animacji przycisku obracania paska nawigacyjnego
    • Stylizacja (w SystemUI/res/values/styles.xml ) służy do ustawiania początkowego i końcowego kąta obrotu, dzięki czemu ten sam rysunek może być używany do animacji różnych początkowych i końcowych obrotów
    • Barwienie ikon ustawia się za pomocą TintedKeyButtonDrawable

Realizacja

Android 9 zawiera wszystkie niezbędne zmiany, aby sugestie dotyczące rotacji działały na urządzeniach korzystających z programowych klawiszy nawigacyjnych (wstecz, dom itp.).

Producenci urządzeń tworzący urządzenia ze sprzętowymi klawiszami nawigacyjnymi i chcący wdrożyć tę funkcję będą musieli zaprojektować i wdrożyć własny interfejs użytkownika systemu lub wyłączyć tę funkcję. Zaleca się, aby każda wprowadzona powierzchnia była łatwa w obsłudze, gdy urządzenie jest trzymane pod kątem 90° lub 180° w stosunku do aktualnego obrotu systemu i była szybko dostępna. Z tych powodów nie zaleca się używania powiadomień (tak jak ma to miejsce w przypadku selektora IME/klawiatury).

Wymagania sprzętowe umożliwiające korzystanie z tej funkcji są takie same, jak wymagania dotyczące automatycznego obracania.

Dla spójności implementacji konieczne jest, aby preferencja rotacji użytkownika ( Settings.System.USER_ROTATION ) została zresetowana do naturalnego obrotu urządzenia, gdy system z jakiegokolwiek powodu zmieni naturalny obrót urządzenia, gdy funkcja automatycznego obracania jest wyłączona. Dostarczona implementacja to robi (zobacz NavigationBarFragment.mRotationWatcher ).

W StatusBarManager.disable2 dostępna jest nowa flaga, która tymczasowo zapobiega wyświetlaniu sugestii dotyczących rotacji. Zobacz StatusBarManager.DISABLE2_ROTATE_SUGGESTIONS . Ta flaga musi być przestrzegana we wszystkich implementacjach, ponieważ jest używana przez krytyczne aplikacje systemowe, w tym Kreator instalacji. Dostarczona implementacja obsługuje to (zobacz NavigationBarFragment.disable() ).

Zdecydowanie zalecamy włączenie tej funkcji i, jeśli to możliwe, wdrożenie AOSP. Naszym celem jest utrzymanie podobnego obrotu na różnych urządzeniach, odzwierciedlając jednolitość działania obecnie większości telefonów między automatycznym obracaniem a blokadą w pionie.

Dostosowywanie

Ponieważ sugestie dotyczące rotacji pojawiają się tylko w trybie blokady rotacji (automatyczne obracanie wyłączone), można wybrać, czy funkcja ma być domyślnie włączona w przypadku nowych instalacji, wybierając domyślne wyłączenie automatycznego obracania. Zobacz def_accelerometer_rotation w SettingsProvider/res/values/defaults.xml aby wprowadzić zmiany domyślne.

Użytkownicy mogą łatwo zmienić, czy automatyczne obracanie jest aktywne, czy nie (niezależnie od ustawień domyślnych), korzystając z kafelka obracania w Szybkich ustawieniach lub Ustawieniach wyświetlania.

Walidacja

Na potrzeby testowania tę funkcję można wyłączać i włączać, zmieniając wartość bramki Settings.Secure . Najłatwiej można to osiągnąć, uruchamiając następujące polecenie z uprzywilejowanej instancji adb:

adb shell settings put secure show_rotation_suggestions <x>

Ustaw x na 0 dla wyłączenia i 1 dla włączenia.

Na potrzeby testowania tryb wprowadzenia można zresetować, zmieniając powiązaną wartość Settings.Secure . Najłatwiej można to osiągnąć, uruchamiając następujące polecenie z uprzywilejowanej instancji adb:

adb shell settings put secure num_rotation_suggestions_accepted 0