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 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 a checkEnterPictureInPictureState() .
  • ActivityManagerService : a interface primária da atividade para solicitar a entrada de PIP e a interface para chamadas de 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 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 componente SystemUI que é iniciado com SystemUI .
  • 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 (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 para 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 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 o SystemUI 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, como BOTTOM|RIGHT .
  • config_defaultPictureInPictureScreenEdgeInsets : os deslocamentos dos lados 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 encaixe 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 ) 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 .