Picture-in-picture

La fonctionnalité d'image dans l'image (PIP) pour les appareils portables Android permet aux utilisateurs de redimensionner une application avec une activité en cours dans une petite fenêtre. PIP est particulièrement utile pour les applications vidéo, car le contenu continue à être lu tandis 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 image dans l'image avec (jusqu'à trois) actions fournies par l'application.

PIP nécessite un consentement explicite de la part des applications qui le prennent en charge et fonctionne par activité. (Une seule application peut avoir plusieurs activités, dont une seule dans PIP.) Les activités demandent à entrer une image dans l'image 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 leurs proportions dans les actions PIP et personnalisées, ce qui permet aux utilisateurs d'interagir avec l'activité sans avoir à la développer. Dans PIP, l’activité est dans un état de pause, mais de rendu et ne reçoit pas directement de saisie tactile ou de focus de fenêtre. Une seule tâche à la fois peut être dans PIP.

Plus d’informations sont disponibles dans la documentation Picture-in-Picture du développeur Android.

Exigences relatives à l'appareil

Pour prendre en charge PIP, activez la fonctionnalité système PackageManager#FEATURE_PICTURE_IN_PICTURE dans /android/frameworks/base/core/java/android/content/pm/PackageManager.java . Les appareils prenant en charge PIP doivent avoir un écran d'une taille supérieure à 220 dp dans sa plus petite largeur. Semblable au multi-fenêtre en écran partagé, PIP permet à plusieurs activités de s'exécuter simultanément à l'écran. Par conséquent, les appareils doivent disposer de suffisamment de processeur et de RAM pour prendre en charge ce cas d’utilisation.

Mise en œuvre

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 référence de l’interface utilisateur 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 Compatibility Test Suite (CTS) . La logique système de PIP tourne principalement autour de la gestion des tâches et des activités au sein de la pile « épinglée ». Voici un aperçu rapide de la classe :

  • ActivityRecord : suit l'état d'image dans l'image de chaque activité. Pour empêcher les utilisateurs de saisir PIP dans certaines circonstances, par exemple à partir de l'écran de verrouillage ou pendant la réalité virtuelle, ajoutez des cas à checkEnterPictureInPictureState() .
  • ActivityManagerService : l'interface principale de l'activité pour demander la saisie de PIP et l'interface pour les appels de WindowManager et SystemUI pour modifier l'état de l'activité PIP.
  • ActivityStackSupervisor : appelé depuis ActivityManagerService pour déplacer les tâches dans ou hors de la pile épinglée, en mettant à jour le WindowManager si nécessaire.
  • PinnedStackWindowController : l'interface WindowManager d' ActivityManager .
  • PinnedStackController : signale les modifications apportées au système à SystemUI , telles que l'IME affiché/masqué, le rapport hauteur/largeur modifié ou les actions modifiées.
  • BoundsAnimationController : anime les fenêtres d'activité PIP de manière à ne pas déclencher de changement de configuration lors du redimensionnement.
  • PipSnapAlgorithm : une classe partagée utilisée à la fois dans le système et dans 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 prend en charge la présentation d'actions personnalisées aux utilisateurs et la manipulation générale, telle que l'expansion et le licenciement. Les fabricants d'appareils peuvent s'appuyer sur ces changements, à condition qu'ils n'affectent pas les comportements intrinsèques tels que définis par le CDD. Voici un aperçu rapide de la classe :

  • PipManager : le composant SystemUI démarré avec SystemUI .
  • PipTouchHandler : le gestionnaire tactile, qui contrôle les gestes qui manipulent le PIP. Ceci n'est utilisé que lorsque le consommateur d'entrée du PIP est actif (voir InputConsumerController ). De nouveaux gestes peuvent être ajoutés ici.
  • PipMotionHelper : une 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 dans 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 : l'implémentation de l'activité de menu.
  • PipMediaController : l'écouteur qui met à jour SystemUI lorsque la session multimédia change d'une manière susceptible d'affecter les actions par défaut sur le PIP.
  • PipNotificationController : le contrôleur qui garantit qu'une notification est active lorsqu'un utilisateur utilise la fonctionnalité PIP.
  • PipDismissViewController : la superposition affichée aux utilisateurs lorsqu'ils commencent à interagir avec le PIP pour indiquer qu'il peut être ignoré.

Emplacement par défaut

Il existe diverses ressources système qui contrôlent l'emplacement par défaut du PIP :

  • config_defaultPictureInPictureGravity : l'entier de gravité , qui contrôle le coin pour placer le PIP, tel que BOTTOM|RIGHT .
  • config_defaultPictureInPictureScreenEdgeInsets : les décalages des côtés de l'écran pour placer le PIP.
  • config_pictureInPictureDefaultSizePercent et config_pictureInPictureDefaultAspectRatio : la combinaison du pourcentage de la largeur de l'écran et du rapport hauteur/largeur 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 , telle que définie par CTS et le CDD.
  • config_pictureInPictureSnapMode : le comportement de capture tel que défini dans PipSnapAlgorithm .

Les implémentations de périphériques ne doivent pas modifier les proportions minimales et maximales définies 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 PIP au niveau de chaque application via les paramètres système. Les implémentations de périphériques doivent respecter cette vérification lorsqu'une activité demande à passer en mode image dans l'image.

Essai

Pour tester les implémentations PIP, exécutez tous les tests liés à l'image dans l'image trouvés dans les tests CTS côté hôte sous /cts/hostsidetests/services/activitymanager , en particulier dans ActivityManagerPinnedStackTests.java .