Obsługa edytora metody wprowadzania

Poniżej przedstawiamy zmiany wprowadzone w tych obszarach dotyczących reklam displayowych:

Android 10 obsługuje klawiaturę programową w aplikacjach działających na ekranie innym niż domyślny.

Aplikacje działające na ekranie innym niż domyślny

Jeśli chodzi o to, który wyświetlacz pokazuje klawiaturę oprogramowania w edytorze metody wprowadzania (IME), dostępne są różne tryby. Klawiatura programowa jest wyświetlana na:

  • Ten sam ekran, na którym pojawia się aplikacja, na której się skupiasz.
  • Domyślny ekran, gdy aplikacja w centrum uwagi działa na ekranie innym niż domyślny.
  • Brak wyświetlania.

System określa, który tryb ma być używany, na podstawie ustawień wyświetlacza, na którym wyświetla się aplikacja. Więcej informacji znajdziesz w artykułach:

  • WindowManager#setDisplayImePolicy()
  • WindowManager#getDisplayImePolicy()

Rysunek 1. klawiaturę IME, tak jak jest widoczna na wyświetlaczu dodatkowym, w tym aplikację docelową.

System używa jednego IME, ale może przełączać się między wyświetlaczami, aby śledzić punkt zainteresowania użytkownika. Android 10 automatycznie oczekuje, że wszystkie IME własne i firm zewnętrznych będą zmieniać układ i rozmiar zgodnie z nowym rozmiarem wyświetlacza.

Jeśli na wyświetlaczu A jest aktywne połączenie, a pole wprowadzania prosi o skupienie się na wyświetlaczu B, następuje ta sekwencja:

  1. Nowe połączenie z polem wejściowym na wyświetlaczu B.
  2. InputMethodManagerService sprawdza, czy połączenie powinno zostać zatwierdzone.
  3. Wybrano wyświetlanie dla IME. Jeśli wyświetlacz B obsługuje wyświetlanie IME i może to robić, jest używany wyświetlacz B. W przeciwnym razie wybrany zostanie wyświetlacz głównego urządzenia.
  4. Jeśli wybrany wyświetlacz nie pochodzi z wyświetlacza A, połączenie zostanie ponownie nawiązane. InputMethodService zostaje zniszczony, a następnie utworzony ponownie.

Ograniczenie związane z bezpieczeństwem

System nie wyświetla IME na wyświetlaczach wirtualnych, które nie należą do systemu. Jest to spowodowane względami bezpieczeństwa – aplikacja złośliwa może utworzyć wirtualny wyświetlacz z włączoną obsługą dekoracji systemu i odczytać poufne informacje o użytkowniku z ekranu, takie jak przewidywania podczas pisania czy niestandardowe tła.

Implementacja

W Androidzie 9 (i starszych) IME było dostępne tylko na ekranie domyślnym, jak opisano w artykule Metody wprowadzania na ekranie. W Androidzie 10 (i nowszych) użytkownik może przełączać się między różnymi polami tekstowymi na różnych ekranach, przenosząc fokus, a okno IME przenosi się na ekrany dodatkowe.

Implementacja w WindowManager śledzi okno metody wprowadzania (okno IME, w którym wyświetla się klawiatura ekranowa) i docelnik metody wprowadzania (okno, do którego trafia dane wejściowe IME), aby zarządzać stanem IME.

W przypadku InputMethodManagerService (IMMS) żaden inny wbudowany mechanizm nie może rozpowszechniać zmiany wyświetlania na InputMethodService (IMS) i konfigurować układu klawiatury w czasie działania podczas przenoszenia fokusu na inny wyświetlacz.

Aby umożliwić przełączanie okna IME między ekranami, Android 10 udostępnia te funkcje:

  • Okno docelowe IME i okno docelowe wprowadzania danych są teraz śledzone na każdym wyświetlaczu w DisplayContent#mInputMethodWindowDisplayContent#mInputMethodTarget, dzięki czemu menedżer okien (WM) może zarządzać stanem fokusu IME niezależnie od każdego wyświetlacza.
  • Po stronie IMMS, gdy przez ViewRootImpl#handleWindowFocusChanged -> InputMethodManager#onPostWindowFocus -> IMMS#startInputOrWindowGainedFocus zostanie odebrana prośba o skupienie się klienta aplikacji z zewnętrznego wyświetlacza, najpierw odłącza bieżącą usługę metody wprowadzania danych, a następnie ponownie łączy usługę, aby ponownie dołączyć nowy token okna IME dla zewnętrznego wyświetlacza w onServiceConnected().
  • Po otrzymaniu IMS#attachToken po stronie IMS następuje ta sekwencja:
    • Funkcja ContextImpl#updateDisplay jest wywoływana, aby zaktualizować wyświetlanie kontekstu usługi w komponencie InputMethodService#attachToken(). Wywołuje to funkcję ViewGroup#addView(), aby zmienić układ klawiatury i dostosować go do wyświetlacza docelowego, sprawdzając bieżący kontekst.
    • Po wywołaniu funkcji DisplayContent#setInputMethodWindowLocked() implementacja wysyła zmiany konfiguracji wyświetlania na poziomie procesu za pomocą funkcji WindowProcessController do procesu IME, aby zastąpić zasoby i dane wyświetlania.
    • Po wywołaniu funkcji onConfigurationChanged()ViewGroup#addView() klient InputMethodService otrzymuje prawidłową konfigurację z prawidłowymi danymi wyświetlania.