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 dessa janela por meio do SystemUI e interagir com o aplicativo atualmente em picture-in-picture com (até três) ações fornecidas pelo aplicativo.
O PIP requer a aceitação explícita de aplicativos que o suportam e funciona por atividade. (Um único aplicativo pode ter várias atividades, das quais apenas uma está em PIP.) As atividades solicitam a inserção de imagem em imagem 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 em PIP e ações personalizadas, que permitem que os usuários interajam 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 a entrada de toque ou o foco da janela. Apenas uma única tarefa pode estar no PIP por vez.
Mais informações estão disponíveis na documentação do Android Developer Picture-in-picture .
Requisitos do dispositivo
Para oferecer suporte a PIP, ative o recurso de 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 220 dp em sua menor largura. Semelhante ao multi-janela de tela dividida, 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 esse caso de uso.
Implementação
A maior parte do gerenciamento do ciclo de vida da atividade é feito no sistema entre ActivityManager
e WindowManager
. A implementação da interface do usuário de referência 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 classe:
-
ActivityRecord
: rastreia o estado picture-in-picture de cada atividade. Para impedir que os usuários insiram o PIP em determinadas circunstâncias, como na tela de bloqueio ou durante a RV, adicione casos acheckEnterPictureInPictureState()
. -
ActivityManagerService
: a interface primária da atividade para solicitar a entrada de PIP e a interface para chamadas deWindowManager
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 forma que não acione 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 perto das bordas da tela.
A referência SystemUI
fornece uma implementação completa do PIP que suporta a apresentação de ações personalizadas aos usuários e manipulação geral, como expansão e demissão. Os fabricantes de dispositivos podem aproveitar essas alterações, desde que não afetem os comportamentos intrínsecos definidos pelo CDD. Aqui está uma visão geral rápida da classe:
-
PipManager
: o componenteSystemUI
que é iniciado comSystemUI
. -
PipTouchHandler
: o manipulador de toque, que controla os gestos que manipulam o PIP. Isso só é usado enquanto o consumidor de entrada para o PIP estiver 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 paraActivityManagerService
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 no PIP. Essa atividade é uma atividade de sobreposição de tarefas e remove o consumidor de entrada de sobreposição para permitir que ele seja interativo. -
PipMenuActivity
: a implementação para a atividade do menu. -
PipMediaController
: o ouvinte que atualiza oSystemUI
quando a sessão de mídia muda de uma maneira 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 estiver 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.
Canal 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 dos lados 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 encaixe 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
) no AppOpsManager
( master/core/java/android/app/AppOpsManager.java
), permite que os usuários controlem o PIP em um nível de aplicativo por meio das configurações do sistema. As implementações de dispositivos precisam respeitar essa verificação quando uma atividade solicita entrar no modo picture-in-picture.
Teste
Para testar implementações de PIP, execute todos os testes relacionados a imagem em imagem encontrados nos testes CTS do lado do host em /cts/hostsidetests/services/activitymanager
, particularmente em ActivityManagerPinnedStackTests.java
.