Picture in picture

La funzionalità Picture-in-Picture (PIP) per i dispositivi portatili Android consente agli utenti di ridimensionare un'app con un'attività in corso in una piccola finestra. PIP è particolarmente utile per le app video perché il contenuto continua a essere riprodotto mentre l'utente è libero di eseguire altre azioni. Gli utenti possono manipolare la posizione di questa finestra tramite SystemUI e interagire con l'applicazione attualmente in modalità Picture in Picture con (fino a tre) azioni fornite dall'app.

PIP richiede il consenso esplicito da parte delle applicazioni che lo supportano e funziona in base alle attività. (Una singola applicazione può avere più attività, solo una delle quali è in PIP.) Le attività richiedono di accedere all'immagine nell'immagine chiamando enterPictureInPictureMode() e ricevono callback di attività sotto forma di onPictureInPictureModeChanged() .

Il metodo setPictureInPictureParams() consente alle attività di controllare le proporzioni mentre si trovano in PIP e azioni personalizzate, che consentono agli utenti di interagire con l'attività senza doverla espandere. In PIP, l'attività è in uno stato di pausa, ma di rendering, e non riceve direttamente l'input tocco o il focus della finestra. Nel PIP può essere presente solo una singola attività alla volta.

Ulteriori informazioni sono disponibili nella documentazione Picture-in-picture per sviluppatori Android.

Requisiti del dispositivo

Per supportare PIP, abilitare la funzionalità di sistema PackageManager#FEATURE_PICTURE_IN_PICTURE in /android/frameworks/base/core/java/android/content/pm/PackageManager.java . I dispositivi che supportano PIP devono avere uno schermo più grande di 220 dp nella larghezza minima. Simile alla multifinestra a schermo diviso, PIP consente di eseguire più attività contemporaneamente sullo schermo. Pertanto, i dispositivi dovrebbero avere CPU e RAM sufficienti per supportare questo caso d'uso.

Implementazione

La maggior parte della gestione del ciclo di vita delle attività viene eseguita nel sistema tra ActivityManager e WindowManager . L'implementazione dell'interfaccia utente di riferimento si trova nel pacchetto SystemUI .

Le modifiche al sistema non dovrebbero influenzarne il comportamento intrinseco come definito dai test Compatibility Test Suite (CTS) . La logica del sistema per PIP ruota principalmente attorno alla gestione dei compiti e delle attività all'interno dello stack "bloccato". Ecco una rapida panoramica della lezione:

  • ActivityRecord : tiene traccia dello stato immagine nell'immagine di ciascuna attività. Per impedire agli utenti di inserire PIP in determinate circostanze, ad esempio dalla schermata di blocco o durante la realtà virtuale, aggiungere casi a checkEnterPictureInPictureState() .
  • ActivityManagerService : l'interfaccia primaria dell'attività per richiedere l'immissione di PIP e l'interfaccia per le chiamate da WindowManager e SystemUI per modificare lo stato dell'attività PIP.
  • ActivityStackSupervisor : chiamato da ActivityManagerService per spostare le attività dentro o fuori lo stack bloccato, aggiornando WindowManager secondo necessità.
  • PinnedStackWindowController : l'interfaccia WindowManager da ActivityManager .
  • PinnedStackController : segnala le modifiche nel sistema a SystemUI , ad esempio IME mostrato/nascosto, proporzioni modificate o azioni modificate.
  • BoundsAnimationController : anima le finestre delle attività PIP in modo da non attivare una modifica della configurazione durante il ridimensionamento.
  • PipSnapAlgorithm : una classe condivisa utilizzata sia nel sistema che in SystemUI che controlla il comportamento di aggancio della finestra PIP vicino ai bordi dello schermo.

Il riferimento SystemUI fornisce un'implementazione completa di PIP che supporta la presentazione di azioni personalizzate agli utenti e la manipolazione generale, come l'espansione e la chiusura. I produttori di dispositivi possono basarsi su questi cambiamenti, purché non influenzino i comportamenti intrinseci definiti dalla CDD. Ecco una rapida panoramica della lezione:

  • PipManager : il componente SystemUI avviato con SystemUI .
  • PipTouchHandler : il gestore del tocco, che controlla i gesti che manipolano il PIP. Viene utilizzato solo mentre il consumatore di input per il PIP è attivo (vedere InputConsumerController ). Qui è possibile aggiungere nuovi gesti.
  • PipMotionHelper : una classe di convenienza che tiene traccia della posizione PIP e della regione consentita sullo schermo. Chiama ActivityManagerService per aggiornare o animare la posizione e la dimensione del PIP.
  • PipMenuActivityController : avvia un'attività che mostra le azioni fornite dall'attività attualmente in PIP. Questa attività è un'attività in sovrapposizione di attività e rimuove il consumatore di input in sovrapposizione per consentirgli di essere interattivo.
  • PipMenuActivity : l'implementazione per l'attività del menu.
  • PipMediaController : il listener che aggiorna SystemUI quando la sessione multimediale cambia in un modo che potrebbe influenzare le azioni predefinite sul PIP.
  • PipNotificationController : il controller che garantisce che una notifica sia attiva mentre un utente utilizza la funzionalità PIP.
  • PipDismissViewController : l'overlay mostrato agli utenti quando iniziano a interagire con il PIP per indicare che può essere ignorato.

Posizionamento predefinito

Esistono varie risorse di sistema che controllano il posizionamento predefinito del PIP:

  • config_defaultPictureInPictureGravity : il numero intero di gravità , che controlla l'angolo in cui posizionare il PIP, come BOTTOM|RIGHT .
  • config_defaultPictureInPictureScreenEdgeInsets : gli offset dai lati dello schermo per posizionare il PIP.
  • config_pictureInPictureDefaultSizePercent e config_pictureInPictureDefaultAspectRatio : la combinazione della percentuale della larghezza dello schermo e delle proporzioni controlla la dimensione del PIP. La dimensione PIP predefinita calcolata non deve essere inferiore a @dimen/default_minimal_size_pip_resizable_task , come definito da CTS e CDD.
  • config_pictureInPictureSnapMode : il comportamento di snap come definito in PipSnapAlgorithm .

Le implementazioni dei dispositivi non dovrebbero modificare le proporzioni minime e massime definite nel CDD e nel CTS.

Autorizzazioni

L'"operazione dell'applicazione" per pacchetto ( OP_PICTURE_IN_PICTURE ) in AppOpsManager ( main/core/java/android/app/AppOpsManager.java ), consente agli utenti di controllare PIP a livello di applicazione tramite le impostazioni di sistema. Le implementazioni del dispositivo devono rispettare questo controllo quando un'attività richiede di accedere alla modalità immagine nell'immagine.

Test

Per testare le implementazioni PIP, eseguire tutti i test correlati all'immagine nell'immagine presenti nei test CTS lato host in /cts/hostsidetests/services/activitymanager , in particolare in ActivityManagerPinnedStackTests.java .