O recurso picture-in-picture (PIP) para dispositivos portáteis Android permite que os usuários redimensionem um aplicativo com uma atividade contínua em uma pequena janela. O PIP é especialmente útil para aplicativos de vídeo porque o conteúdo continua sendo reproduzido enquanto o usuário está livre para realizar outras ações. Os usuários podem manipular a posição desta janela por meio do SystemUI e interagir com o aplicativo atualmente em imagem em imagem com (até três) ações fornecidas pelo aplicativo.
O PIP exige aceitação explícita de aplicativos que o suportam e funciona por atividade. (Um único aplicativo pode ter diversas atividades, das quais apenas uma está em PIP.) As atividades solicitam a entrada picture-in-picture chamando enterPictureInPictureMode()
e recebem retornos de chamada de atividade na forma de onPictureInPictureModeChanged()
.
O método setPictureInPictureParams()
permite que as atividades controlem sua proporção enquanto estão em PIP e ações personalizadas, o que permite aos usuários interagir com a atividade sem precisar expandi-la. No PIP, a atividade está em um estado pausado, mas de renderização, e não recebe diretamente entrada de toque ou foco da janela. Apenas uma única tarefa pode estar no PIP por vez.
Mais informações estão disponíveis na documentação Picture-in-picture do desenvolvedor Android.
Requisitos do dispositivo
Para oferecer suporte ao PIP, ative o recurso do sistema PackageManager#FEATURE_PICTURE_IN_PICTURE
em /android/frameworks/base/core/java/android/content/pm/PackageManager.java
. Os dispositivos que suportam PIP devem ter uma tela maior que 220dp em sua menor largura. Semelhante à tela dividida em múltiplas janelas, o PIP permite que várias atividades sejam executadas na tela ao mesmo tempo. Portanto, os dispositivos devem ter CPU e RAM suficientes para suportar este caso de uso.
Implementação
A maior parte do gerenciamento do ciclo de vida da atividade é feita no sistema entre ActivityManager
e WindowManager
. A implementação de referência da UI está no pacote SystemUI
.
As modificações no sistema não devem afetar seu comportamento intrínseco conforme definido pelos testes do Compatibility Test Suite (CTS) . A lógica do sistema para PIP gira principalmente em torno do gerenciamento de tarefas e atividades dentro da pilha “fixada”. Aqui está uma visão geral rápida da aula:
-
ActivityRecord
: rastreia o estado picture-in-picture de cada atividade. Para evitar que os usuários entrem no PIP em determinadas circunstâncias, como na tela de bloqueio ou durante a VR, adicione casos acheckEnterPictureInPictureState()
. -
ActivityManagerService
: a interface primária da atividade para solicitar a entrada do PIP e a interface para chamadas doWindowManager
eSystemUI
para alterar o estado da atividade PIP. -
ActivityStackSupervisor
: chamado doActivityManagerService
para mover tarefas para dentro ou para fora da pilha fixada, atualizando oWindowManager
conforme necessário. -
PinnedStackWindowController
: a interfaceWindowManager
doActivityManager
. -
PinnedStackController
: relata alterações no sistema paraSystemUI
, como IME mostrado/oculto, proporção alterada ou ações alteradas. -
BoundsAnimationController
: anima as janelas de atividade PIP de uma forma que não aciona uma alteração de configuração durante o redimensionamento. -
PipSnapAlgorithm
: uma classe compartilhada usada no sistema e no SystemUI que controla o comportamento de encaixe da janela PIP próximo às bordas da tela.
A referência SystemUI
fornece uma implementação completa de PIP que suporta a apresentação de ações personalizadas aos usuários e manipulação geral, como expansão e dispensa. Os fabricantes de dispositivos podem aproveitar essas mudanças, desde que não afetem os comportamentos intrínsecos definidos pelo CDD. Aqui está uma visão geral rápida da aula:
-
PipManager
: o componenteSystemUI
iniciado comSystemUI
. -
PipTouchHandler
: o manipulador de toque, que controla os gestos que manipulam o PIP. Isso é usado apenas enquanto o consumidor de entrada do PIP está ativo (consulteInputConsumerController
). Novos gestos podem ser adicionados aqui. -
PipMotionHelper
: uma classe de conveniência que rastreia a posição PIP e a região permitida na tela. Chama oActivityManagerService
para atualizar ou animar a posição e o tamanho do PIP. -
PipMenuActivityController
: inicia uma atividade que mostra as ações fornecidas pela atividade atualmente em PIP. Esta atividade é uma atividade de sobreposição de tarefas e remove o consumidor de entrada sobreposto para permitir que seja interativa. -
PipMenuActivity
: a implementação da atividade do menu. -
PipMediaController
: o ouvinte que atualizaSystemUI
quando a sessão de mídia muda de uma forma que pode afetar as ações padrão no PIP. -
PipNotificationController
: o controlador que garante que uma notificação esteja ativa enquanto um usuário está usando o recurso PIP. -
PipDismissViewController
: a sobreposição mostrada aos usuários quando eles começam a interagir com o PIP para indicar que ele pode ser dispensado.
Posicionamento padrão
Existem vários recursos do sistema que controlam o posicionamento padrão do PIP:
-
config_defaultPictureInPictureGravity
: o inteiro de gravidade , que controla o canto para colocar o PIP, comoBOTTOM|RIGHT
. -
config_defaultPictureInPictureScreenEdgeInsets
: os deslocamentos das laterais da tela para colocar o PIP. -
config_pictureInPictureDefaultSizePercent
econfig_pictureInPictureDefaultAspectRatio
: a combinação da porcentagem da largura da tela e da proporção controla o tamanho do PIP. O tamanho PIP padrão calculado não deve ser menor que@dimen/default_minimal_size_pip_resizable_task
, conforme definido pelo CTS e pelo CDD. -
config_pictureInPictureSnapMode
: o comportamento de ajuste conforme definido emPipSnapAlgorithm
.
As implementações de dispositivos não devem alterar as proporções mínimas e máximas definidas no CDD e no CTS.
Permissões
A "operação de aplicativo" por pacote ( OP_PICTURE_IN_PICTURE
) em AppOpsManager
( main/core/java/android/app/AppOpsManager.java
), permite que os usuários controlem o PIP em um nível por aplicativo por meio das configurações do sistema. As implementações de dispositivos precisam respeitar essa verificação quando uma atividade solicita a entrada no modo picture-in-picture.
Teste
Para testar implementações de PIP, execute todos os testes relacionados ao picture-in-picture encontrados nos testes CTS do lado do host em /cts/hostsidetests/services/activitymanager
, particularmente em ActivityManagerPinnedStackTests.java
.