Imagen en imagen

La función de pantalla en pantalla (PIP) para dispositivos portátiles Android permite a los usuarios cambiar el tamaño de una app con una actividad en curso en una ventana pequeña. El PIP es especialmente útil para las apps de video, ya que el contenido se sigue reproduciendo mientras el usuario puede realizar otras acciones. Los usuarios pueden manipular la posición de esta ventana a través de SystemUI y, además, interactuar con la aplicación que se encuentra actualmente en pantalla en pantalla con hasta tres acciones proporcionadas por la app.

El PIP requiere la habilitación explícita de las aplicaciones que lo admiten y funciona por actividad. (Una sola aplicación puede tener varias actividades, pero solo una de ellas está en PIP). Las actividades solicitan ingresar al modo de pantalla en pantalla llamando a enterPictureInPictureMode() y reciben devoluciones de llamada de actividad en forma de onPictureInPictureModeChanged().

El método setPictureInPictureParams() permite que las actividades controlen su relación de aspecto mientras están en PIP y acciones personalizadas, lo que permite que los usuarios interactúen con la actividad sin tener que expandirla. En el modo PIP, la actividad está en un estado pausado, pero en renderización, y no recibe directamente la entrada táctil ni el enfoque de la ventana. Solo se puede tener una tarea en PIP a la vez.

Puedes encontrar más información en la documentación sobre pantalla en pantalla para desarrolladores de Android.

Requisitos del dispositivo

Para admitir el PIP, habilita la función del sistema PackageManager#FEATURE_PICTURE_IN_PICTURE en /android/frameworks/base/core/java/android/content/pm/PackageManager.java. Los dispositivos que admiten PIP deben tener una pantalla de más de 220 dp en su ancho más pequeño. Al igual que el modo multiventana de pantalla dividida, el PIP permite que se ejecuten varias actividades en la pantalla al mismo tiempo. Por lo tanto, los dispositivos deben tener suficiente CPU y RAM para admitir este caso de uso.

Implementación

La mayor parte de la administración del ciclo de vida de la actividad se realiza en el sistema entre ActivityManager y WindowManager. La implementación de referencia de la IU se encuentra en el paquete SystemUI.

Las modificaciones del sistema no deben afectar su comportamiento intrínseco, tal como se define en las pruebas del Conjunto de pruebas de compatibilidad (CTS). La lógica del sistema para el PIP se centra principalmente en la administración de tareas y actividades dentro de la pila "fijada". A continuación, se incluye una descripción general rápida de la clase:

  • ActivityRecord: Realiza un seguimiento del estado de pantalla en pantalla de cada actividad. Para evitar que los usuarios ingresen al modo PIP en ciertas circunstancias, como desde la pantalla de bloqueo o durante la VR, agrega casos a checkEnterPictureInPictureState().
  • ActivityManagerService: Es la interfaz principal de la actividad para solicitar que se ingrese al modo PIP y la interfaz para las llamadas de WindowManager y SystemUI para cambiar el estado de la actividad en PIP.
  • ActivityStackSupervisor: Se llama desde ActivityManagerService para mover tareas dentro o fuera de la pila fijada, y se actualiza WindowManager según sea necesario.
  • PinnedStackWindowController: Es la interfaz de WindowManager de ActivityManager.
  • PinnedStackController: Informa los cambios en el sistema a SystemUI, como la aparición o desaparición del IME, el cambio de relación de aspecto o el cambio de acciones.
  • BoundsAnimationController: Anima las ventanas de actividad de PIP de una manera que no activa un cambio de configuración mientras se cambia el tamaño.
  • PipSnapAlgorithm: Es una clase compartida que se usa en el sistema y en SystemUI, y que controla el comportamiento de ajuste de la ventana de PIP cerca de los bordes de la pantalla.

La referencia SystemUI proporciona una implementación completa del PIP que admite la presentación de acciones personalizadas a los usuarios y la manipulación general, como la expansión y el descarte. Los fabricantes de dispositivos pueden aprovechar estos cambios, siempre y cuando no afecten los comportamientos intrínsecos definidos por el CDD. A continuación, se incluye una descripción general rápida de la clase:

  • PipManager: Es el componente SystemUI que se inicia con SystemUI.
  • PipTouchHandler: El controlador táctil, que controla los gestos que manipulan el PIP. Solo se usa mientras el consumidor de entrada para el PIP está activo (consulta InputConsumerController). Aquí se pueden agregar nuevos gestos.
  • PipMotionHelper: Es una clase de conveniencia que hace un seguimiento de la posición del PIP y la región permitida en la pantalla. Llama a ActivityManagerService para actualizar o animar la posición y el tamaño del PIP.
  • PipMenuActivityController: Inicia una actividad que muestra las acciones proporcionadas por la actividad que se encuentra actualmente en PIP. Esta actividad es una actividad de superposición de tareas y quita el consumidor de entrada superpuesto para permitir que sea interactivo.
  • PipMenuActivity: Es la implementación de la actividad del menú.
  • PipMediaController: Es el objeto de escucha que actualiza SystemUI cuando la sesión de medios cambia de una manera que podría afectar las acciones predeterminadas en el PIP.
  • PipNotificationController: Es el controlador que garantiza que una notificación esté activa mientras el usuario usa la función de PIP.
  • PipDismissViewController: Es la superposición que se muestra a los usuarios cuando comienzan a interactuar con el PIP para indicar que se puede descartar.

Posición predeterminada

Existen varios recursos del sistema que controlan la ubicación predeterminada del PIP:

  • config_defaultPictureInPictureGravity: Es el número entero de gravedad que controla la esquina en la que se colocará el PIP, como BOTTOM|RIGHT.
  • config_defaultPictureInPictureScreenEdgeInsets: Son los desplazamientos desde los lados de la pantalla para colocar el PIP.
  • config_pictureInPictureDefaultSizePercent y config_pictureInPictureDefaultAspectRatio: La combinación del porcentaje del ancho de la pantalla y la relación de aspecto controla el tamaño del PIP. El tamaño predeterminado calculado del PIP no debe ser menor que @dimen/default_minimal_size_pip_resizable_task, según lo definen el CTS y el CDD.
  • config_pictureInPictureSnapMode: El comportamiento de ajuste, como se define en PipSnapAlgorithm.

Las implementaciones de dispositivos no deben cambiar las relaciones de aspecto mínimas y máximas definidas en la CDD y el CTS.

Permisos

La "operación de aplicación" (OP_PICTURE_IN_PICTURE) por paquete en AppOpsManager (main/core/java/android/app/AppOpsManager.java) permite a los usuarios controlar el PIP a nivel de la aplicación a través de la configuración del sistema. Las implementaciones de dispositivos deben respetar esta verificación cuando una actividad solicita ingresar al modo de pantalla en pantalla.

Prueba

Para probar las implementaciones de PIP, ejecuta todas las pruebas relacionadas con la función de PIP que se encuentran en las pruebas de CTS del host en /cts/hostsidetests/services/activitymanager, en particular en ActivityManagerPinnedStackTests.java.