Picture-in-picture

La fonctionnalité Picture-in-picture (PIP) pour les appareils mobiles Android permet aux utilisateurs de redimensionner une application avec une activité en cours dans une petite fenêtre. Le mode PIP est particulièrement utile pour les applications vidéo, car le contenu continue d'être lu pendant que l'utilisateur est libre d'effectuer d'autres actions. Les utilisateurs peuvent manipuler la position de cette fenêtre via SystemUI et interagir avec l'application actuellement en mode Picture-in-picture avec (jusqu'à trois) actions fournies par l'application.

Le PIP nécessite une activation explicite de la part des applications qui le prennent en charge et fonctionne par activité. (Une même application peut comporter plusieurs activités, mais une seule d'entre elles est en mode PIP.) Les activités demandent à passer en Picture-in-picture en appelant enterPictureInPictureMode() et reçoivent des rappels d'activité sous la forme de onPictureInPictureModeChanged().

La méthode setPictureInPictureParams() permet aux activités de contrôler leur format dans le mode PIP et les actions personnalisées, qui permettent aux utilisateurs d'interagir avec l'activité sans avoir à la développer. En mode PIP, l'activité est en pause, mais l'état et le rendu sont actifs. L'activité ne reçoit pas directement d'entrée tactile ni de focus de fenêtre. Une seule tâche peut être en mode PIP à la fois.

Pour en savoir plus, consultez la documentation Android Developer sur le Picture-in-picture.

Configuration d'appareil requise

Pour prendre en charge le mode PIP, activez la fonctionnalité système PackageManager#FEATURE_PICTURE_IN_PICTURE dans /android/frameworks/base/core/java/android/content/pm/PackageManager.java. Les appareils compatibles avec le mode PIP doivent avoir un écran dont la largeur minimale est supérieure à 220 dp. Comme le mode multifenêtre en écran partagé, le mode PIP permet à plusieurs activités de s'exécuter à l'écran en même temps. Par conséquent, les appareils doivent disposer de suffisamment de processeur et de RAM pour prendre en charge ce cas d'utilisation.

Implémentation

La majeure partie de la gestion du cycle de vie des activités est effectuée dans le système entre ActivityManager et WindowManager. L'implémentation de l'UI de référence se trouve dans le package SystemUI.

Les modifications apportées au système ne doivent pas affecter son comportement intrinsèque tel que défini par les tests de la suite de tests de compatibilité (CTS). La logique du système pour le PIP repose principalement sur la gestion des tâches et des activités dans la pile "épinglée". Voici un aperçu rapide des cours :

  • ActivityRecord : suit l'état Picture-in-picture de chaque activité. Pour empêcher les utilisateurs d'entrer en mode PIP dans certaines circonstances, par exemple depuis l'écran de verrouillage ou en mode VR, ajoutez des cas à checkEnterPictureInPictureState().
  • ActivityManagerService : interface principale de l'activité pour demander à passer en mode PIP et interface pour les appels de WindowManager et SystemUI afin de modifier l'état de l'activité PIP.
  • ActivityStackSupervisor : appelé à partir de ActivityManagerService pour déplacer des tâches dans ou hors de la pile épinglée, en mettant à jour WindowManager si nécessaire.
  • PinnedStackWindowController : interface WindowManager de ActivityManager.
  • PinnedStackController : signale les modifications apportées au système à SystemUI, telles que l'IME affiché/masqué, le changement de format ou les actions modifiées.
  • BoundsAnimationController anime les fenêtres d'activité PIP d'une manière qui ne déclenche pas de changement de configuration lors du redimensionnement.
  • PipSnapAlgorithm : classe partagée utilisée à la fois dans le système et SystemUI qui contrôle le comportement d'accrochage de la fenêtre PIP près des bords de l'écran.

La référence SystemUI fournit une implémentation complète de PIP qui permet de présenter des actions personnalisées aux utilisateurs et d'effectuer des manipulations générales, telles que l'expansion et la fermeture. Les fabricants d'appareils peuvent s'appuyer sur ces modifications, à condition qu'elles n'affectent pas les comportements intrinsèques définis par le CDD. Voici un aperçu rapide des cours :

  • PipManager : composant SystemUI qui est démarré avec SystemUI.
  • PipTouchHandler : gestionnaire tactile qui contrôle les gestes manipulant le PIP. Cette méthode n'est utilisée que lorsque le consommateur d'entrée pour le PIP est actif (voir InputConsumerController). De nouveaux gestes peuvent être ajoutés ici.
  • PipMotionHelper : classe pratique qui suit la position PIP et la région autorisée à l'écran. Appels à ActivityManagerService pour mettre à jour ou animer la position et la taille du PIP.
  • PipMenuActivityController : démarre une activité qui affiche les actions fournies par l'activité actuellement en PIP. Cette activité est une activité de superposition de tâches et supprime le consommateur d'entrée superposé pour lui permettre d'être interactif.
  • PipMenuActivity : implémentation de l'activité de menu.
  • PipMediaController : écouteur qui met à jour SystemUI lorsque la session multimédia change d'une manière qui pourrait affecter les actions par défaut sur le PIP.
  • PipNotificationController : contrôleur qui garantit qu'une notification est active lorsqu'un utilisateur utilise la fonctionnalité PIP.
  • PipDismissViewController : superposition affichée aux utilisateurs lorsqu'ils commencent à interagir avec le PIP pour indiquer qu'il peut être fermé.

Emplacement par défaut

Différentes ressources système contrôlent l'emplacement par défaut du PIP :

  • config_defaultPictureInPictureGravity : entier gravity qui contrôle l'angle où placer le PIP, tel que BOTTOM|RIGHT.
  • config_defaultPictureInPictureScreenEdgeInsets : décalages par rapport aux bords de l'écran pour placer le PIP.
  • config_pictureInPictureDefaultSizePercent et config_pictureInPictureDefaultAspectRatio : la combinaison du pourcentage de la largeur de l'écran et du format contrôle la taille du PIP. La taille PIP par défaut calculée ne doit pas être inférieure à @dimen/default_minimal_size_pip_resizable_task, comme défini par CTS et le CDD.
  • config_pictureInPictureSnapMode : comportement d'accrochage tel que défini dans PipSnapAlgorithm.

Les implémentations d'appareils ne doivent pas modifier les formats minimum et maximum définis dans le CDD et le CTS.

Autorisations

L'"opération d'application" par package (OP_PICTURE_IN_PICTURE) dans AppOpsManager (main/core/java/android/app/AppOpsManager.java) permet aux utilisateurs de contrôler le mode PIP au niveau de chaque application via les paramètres système. Les implémentations d'appareils doivent respecter cette vérification lorsqu'une activité demande à passer en mode Picture-in-picture.

Tests

Pour tester les implémentations PIP, exécutez tous les tests liés au mode Picture-in-picture qui se trouvent dans les tests CTS côté hôte sous /cts/hostsidetests/services/activitymanager, en particulier dans ActivityManagerPinnedStackTests.java.