La fonctionnalité Picture-in-picture (PIP) pour les appareils Android portables permet aux utilisateurs de redimensionner une application avec une activité en cours dans une petite fenêtre. Le mode Picture-in-picture est particulièrement utile pour les applications vidéo, car le contenu continue de se lire 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 seule application peut avoir plusieurs activités, dont une seule est en PIP.) Les activités demandent à passer en mode 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 en mode PIP et en mode actions personnalisées, ce qui permet aux utilisateurs d'interagir avec l'activité sans avoir à l'étendre. En mode PIP, l'activité est en état de mise en pause, mais de rendu, et ne reçoit pas directement l'entrée tactile ni la sélection de la fenêtre.
Une seule tâche peut être affichée en mode PIP à la fois.
Pour en savoir plus, consultez la documentation Android Developer sur le mode Picture-in-picture.
Configuration d'appareil requise
Pour prendre en charge le 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 PIP doivent avoir un écran dont la largeur la plus petite est supérieure à 220 dp. Comme le mode multifenêtre en écran partagé, le mode PIP permet d'exécuter plusieurs activités à l'écran en même temps. Par conséquent, les appareils doivent disposer d'un processeur et d'une RAM suffisants 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 CTS (Compatibility Test Suite). La logique système du PIP repose principalement sur la gestion des tâches et des activités dans la pile "épinglée". Voici un bref aperçu de la classe:
ActivityRecord
:suit l'état Picture-in-picture de chaque activité. Pour empêcher les utilisateurs d'accéder au mode PIP dans certaines circonstances, par exemple depuis l'écran de verrouillage ou pendant la réalité virtuelle, ajoutez des cas àcheckEnterPictureInPictureState()
.ActivityManagerService
:interface principale de l'activité pour demander l'entrée en mode PIP et interface pour les appels deWindowManager
etSystemUI
afin de modifier l'état de l'activité PIP.ActivityStackSupervisor
:appelé à partir deActivityManagerService
pour déplacer des tâches dans ou hors de la pile épinglée, en mettant à jourWindowManager
si nécessaire.PinnedStackWindowController
:interfaceWindowManager
deActivityManager
.PinnedStackController
:signale les modifications apportées au système àSystemUI
, telles que l'affichage/le masquage de l'IME, le changement de format 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
:classe partagée utilisée à la fois dans le système et dans SystemUI, qui contrôle le comportement d'ancrage 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 de les manipuler de manière générale, comme les actions d'expansion et de fermeture.
Les fabricants d'appareils peuvent s'appuyer sur ces modifications, à condition qu'elles n'affectent pas les comportements intrinsèques tels que définis par le CDD. Voici un bref aperçu de la classe:
PipManager
:composantSystemUI
démarré avecSystemUI
.PipTouchHandler
:gestionnaire tactile qui contrôle les gestes qui manipulent le PIP. Cette valeur n'est utilisée que lorsque le client d'entrée de la PIP est actif (voirInputConsumerController
). Vous pouvez y ajouter de nouveaux gestes.PipMotionHelper
:classe pratique qui suit la position du PIP et la région autorisée à l'écran. Appels viaActivityManagerService
pour mettre à jour ou animer la position et la taille de la 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 qu'il soit interactif.PipMenuActivity
:implémentation de l'activité de menu.PipMediaController
:écouteur qui met à jourSystemUI
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 ignoré.
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 le coin dans lequel placer le PIP, par exempleBOTTOM|RIGHT
.config_defaultPictureInPictureScreenEdgeInsets
:décalages par rapport aux côtés de l'écran pour placer le PIP.config_pictureInPictureDefaultSizePercent
etconfig_pictureInPictureDefaultAspectRatio
:la combinaison du pourcentage de la largeur de l'écran et du format contrôle la taille de la 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 le CTS et le CDD.config_pictureInPictureSnapMode
:comportement d'ancrage tel que défini dansPipSnapAlgorithm
.
Les implémentations d'appareils ne doivent pas modifier les formats d'image minimaux et maximaux définis dans le CDD et le CTS.
Autorisations
L'opération d'application (OP_PICTURE_IN_PICTURE
) par package dans AppOpsManager
(main/core/java/android/app/AppOpsManager.java
) permet aux utilisateurs de contrôler le PIP au niveau de l'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 trouvés dans les tests CTS côté hôte sous /cts/hostsidetests/services/activitymanager
, en particulier dans ActivityManagerPinnedStackTests.java
.