Compatibilidad con el editor de método de entrada

A continuación, se incluyen las actualizaciones realizadas en estas áreas específicas de la pantalla:

Android 10 admite el teclado en software para apps que se ejecutan en una pantalla no predeterminada.

Apps que se ejecutan en una pantalla no predeterminada

En términos de qué pantalla muestra el teclado en software del editor de métodos de entrada (IME), existen diferentes modos. El teclado en pantalla se muestra en las siguientes ubicaciones:

  • La misma pantalla en la que aparece la app enfocada
  • Pantalla predeterminada mientras la app enfocada se ejecuta en una pantalla que no es predeterminada.
  • No se muestra nada.

El sistema determina qué modo usar en función de la configuración de la pantalla en la que aparece la app enfocada. Para obtener más información, consulta los siguientes vínculos:

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

Figura 1: Teclado en software IME como aparece en la pantalla secundaria, incluida la app de destino

El sistema usa un solo IME, pero puede cambiar entre pantallas para seguir el enfoque del usuario. Android 10 espera automáticamente que todos los IME propios y de terceros revisen el diseño y cambien el tamaño en función del nuevo tamaño de visualización cuando se crean.

Si hay una conexión activa en la pantalla A y un campo de entrada solicita el enfoque de entrada en la pantalla B, se produce el siguiente flujo:

  1. Una nueva conexión de entrada proviene del campo de entrada en la pantalla B.
  2. InputMethodManagerService verifica si se debe aprobar la conexión.
  3. Se selecciona una pantalla para el IME. Si la pantalla B admite mostrar el IME y puede mostrarlo, se usa B. De lo contrario, se seleccionará la pantalla del dispositivo principal.
  4. Si la pantalla seleccionada no es de la pantalla A, se restablece la conexión. InputMethodService se destruye y, luego, se vuelve a crear.

Restricción de seguridad

El sistema no mostrará un IME en pantallas virtuales que no sean del sistema. Esto se debe a un problema de seguridad que podría permitir que una app maliciosa cree una pantalla virtual con la compatibilidad con decoraciones del sistema habilitada y lea información sensible del usuario desde la superficie, como predicciones de escritura y fondos personalizados.

Implementación

En Android 9 (y versiones anteriores), el IME solo estaba disponible en la pantalla predeterminada, como se describe en Métodos de entrada en pantalla. En Android 10 (y versiones posteriores), un usuario puede cambiar de enfoque entre diferentes campos de texto de entrada en diferentes pantallas, y la ventana del IME se mueve a las pantallas secundarias.

La implementación en WindowManager hace un seguimiento de la ventana del método de entrada (la ventana del IME en la que se dibuja el teclado en pantalla) y el objetivo del método de entrada (la ventana en la que se coloca la entrada del IME) para administrar el estado del IME.

En el caso de InputMethodManagerService (IMMS), ningún otro mecanismo integrado puede propagar el cambio de pantalla a InputMethodService (IMS) ni volver a configurar el diseño del teclado durante el tiempo de ejecución cuando se mueve el enfoque a otra pantalla.

Para lograr el cambio de ventana del IME entre pantallas, Android 10 implementa lo siguiente:

  • Ahora se realiza un seguimiento del IME y de la ventana de destino de entrada por pantalla en DisplayContent#mInputMethodWindow y DisplayContent#mInputMethodTarget, de modo que WindowManager (WM) puede administrar el estado del enfoque del IME de forma independiente de cada pantalla.
  • En el lado de IMMS, cuando se recibe a través de ViewRootImpl#handleWindowFocusChanged -> InputMethodManager#onPostWindowFocus -> IMMS#startInputOrWindowGainedFocus la solicitud de enfoque de un cliente de app desde la pantalla externa, primero se desvincula el servicio de método de entrada actual y, luego, se vuelve a vincular el servicio para volver a conectar el nuevo token de ventana del IME para la pantalla externa en onServiceConnected().
  • En el lado del IMS, después de recibir el IMS#attachToken, se produce el siguiente flujo:
    • Se llama a ContextImpl#updateDisplay para actualizar la visualización del contexto del servicio en InputMethodService#attachToken(). Esto llama a ViewGroup#addView() para revisar el diseño del teclado y adaptarse a la pantalla de destino verificando el contexto actual.
    • Después de llamar a DisplayContent#setInputMethodWindowLocked(), la implementación envía cambios de configuración de la pantalla a nivel del proceso con WindowProcessController al proceso de IME para anular los recursos y mostrar las métricas.
    • El cliente InputMethodService obtiene la configuración correcta con las métricas de visualización correctas después de onConfigurationChanged() y la llamada ViewGroup#addView() para volver a inicializar la vista de entrada.