Imagem em imagem

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 a checkEnterPictureInPictureState() .
  • ActivityManagerService : a interface primária da atividade para solicitar a entrada do PIP e a interface para chamadas do WindowManager e SystemUI para alterar o estado da atividade PIP.
  • ActivityStackSupervisor : chamado do ActivityManagerService para mover tarefas para dentro ou para fora da pilha fixada, atualizando o WindowManager conforme necessário.
  • PinnedStackWindowController : a interface WindowManager do ActivityManager .
  • PinnedStackController : relata alterações no sistema para SystemUI , 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 componente SystemUI iniciado com SystemUI .
  • 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 (consulte InputConsumerController ). 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 o ActivityManagerService 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 atualiza SystemUI 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, como BOTTOM|RIGHT .
  • config_defaultPictureInPictureScreenEdgeInsets : os deslocamentos das laterais da tela para colocar o PIP.
  • config_pictureInPictureDefaultSizePercent e config_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 em PipSnapAlgorithm .

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 .