O Google tem o compromisso de promover a igualdade racial para as comunidades negras. Saiba como.

Picture-in-picture

O recurso picture-in-picture (PIP) para dispositivos portáteis Android permite aos usuários redimensionar um aplicativo com uma atividade em andamento em uma pequena janela. O PIP é especialmente útil para aplicativos de vídeo porque o conteúdo continua a ser 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 requer aceitação explícita de aplicativos que o suportam e funciona por atividade. (Um único aplicativo pode ter várias atividades, apenas uma delas no PIP.) Solicitação de atividades para entrar em imagem na imagem chamando enterPictureInPictureMode() e receber retornos de chamada de atividade na forma de onPictureInPictureModeChanged() .

O método setPictureInPictureParams() permite que as atividades controlem sua proporção de aspecto enquanto em PIP e ações personalizadas, que permitem aos usuários interagir com a atividade sem ter que expandi-la. No PIP, a atividade está em pausa, mas renderizando, estado e não recebe entrada de toque ou foco de janela diretamente. Apenas uma única tarefa pode estar no PIP por vez.

Mais informações estão disponíveis na documentação Picture-in-picture do Android Developer.

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 220 dp em sua menor largura. Semelhante à tela dividida em várias 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 é feito no sistema entre ActivityManager e WindowManager . A implementação de UI 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 aula:

  • ActivityRecord : rastreia o estado picture-in-picture de cada atividade. Para evitar que os usuários entrem no PIP em certas circunstâncias, como na tela de bloqueio ou durante a RV, adicione casos a checkEnterPictureInPictureState() .
  • ActivityManagerService : a interface principal da atividade para solicitar a entrada do PIP e a interface para chamadas de WindowManager e SystemUI para alterar o estado da atividade PIP.
  • ActivityStackSupervisor : chamado de ActivityManagerService para mover tarefas para dentro ou para fora da pilha fixada, atualizando WindowManager conforme necessário.
  • PinnedStackWindowController : a interface WindowManager do ActivityManager .
  • PinnedStackController : relata alterações no sistema para SystemUI , como IME mostrado / oculto, proporção de aspecto alterada ou ações alteradas.
  • BoundsAnimationController : anima as janelas de atividade PIP de uma forma que não aciona uma mudança de configuração durante o redimensionamento.
  • PipSnapAlgorithm : uma classe compartilhada usada no sistema e no SystemUI que controla o comportamento de ajuste da janela PIP próximo às bordas da tela.

O SystemUI referência 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 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 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 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. Chamadas 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. Esta atividade é uma atividade de sobreposição de tarefa e remove o consumidor de entrada de sobreposição para permitir que seja interativo.
  • PipMenuActivity : a implementação para a 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 a proporção do aspecto 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 ( master/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.

Testando

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 .