Картинка в картинке

Функция «картинка в картинке» (PIP) для портативных устройств Android позволяет пользователям изменять размер приложения с текущей активностью в маленькое окно. PIP особенно полезен для видеоприложений, поскольку контент продолжает воспроизводиться, пока пользователь может выполнять другие действия. Пользователи могут управлять положением этого окна через SystemUI и взаимодействовать с приложением, которое в данный момент находится в режиме «картинка в картинке», с помощью (до трех) действий, предоставляемых приложением.

PIP требует явного согласия от приложений, которые его поддерживают, и работает на основе каждого действия. (Одно приложение может иметь несколько действий, только одно из которых находится в PIP.) Действия запрашивают вход в режим «картинка в картинке» с помощью вызова enterPictureInPictureMode() и получают обратные вызовы действий в форме onPictureInPictureModeChanged() .

Метод setPictureInPictureParams() позволяет действиям управлять соотношением сторон в режиме PIP и настраиваемыми действиями, которые позволяют пользователям взаимодействовать с действием без необходимости его разворачивать. В режиме PIP действие находится в приостановленном, но отрисовывающемся состоянии и не получает напрямую сенсорный ввод или фокус окна. В режиме PIP может находиться только одна задача.

Более подробную информацию можно найти в документации Android Developer «Картинка в картинке» .

Требования к устройству

Для поддержки PIP включите системную функцию PackageManager#FEATURE_PICTURE_IN_PICTURE в /android/frameworks/base/core/java/android/content/pm/PackageManager.java . Устройства, поддерживающие PIP, должны иметь экран, который больше 220dp при минимальной ширине. Подобно многооконному режиму с разделенным экраном, PIP позволяет запускать на экране несколько действий одновременно. Поэтому устройства должны иметь достаточный объем ЦП и ОЗУ для поддержки этого варианта использования.

Выполнение

Большая часть управления жизненным циклом активности выполняется в системе между ActivityManager и WindowManager . Реализация эталонного пользовательского интерфейса находится в пакете SystemUI .

Изменения в системе не должны влиять на ее внутреннее поведение, как определено тестами Compatibility Test Suite (CTS) . Системная логика для PIP в основном вращается вокруг управления задачами и действиями в «закрепленном» стеке. Вот краткий обзор класса:

  • ActivityRecord : отслеживает состояние картинки в картинке каждой активности. Чтобы запретить пользователям входить в PIP в определенных обстоятельствах, например с экрана блокировки или во время VR, добавьте случаи в checkEnterPictureInPictureState() .
  • ActivityManagerService : основной интерфейс активности для запроса входа в PIP и интерфейс для вызовов из WindowManager и SystemUI для изменения состояния активности PIP.
  • ActivityStackSupervisor : вызывается из ActivityManagerService для перемещения задач в закрепленный стек или из него, обновляя WindowManager по мере необходимости.
  • PinnedStackWindowController : интерфейс WindowManager из ActivityManager .
  • PinnedStackController : сообщает об изменениях в системе в SystemUI , таких как отображение/скрытие IME, изменение соотношения сторон или изменение действий.
  • BoundsAnimationController : анимирует окна активности PIP таким образом, чтобы не вызывать изменение конфигурации при изменении размера.
  • PipSnapAlgorithm : общий класс, используемый как в системе, так и в SystemUI, который управляет поведением привязки окна PIP к краям экрана.

Справочный SystemUI обеспечивает полную реализацию PIP, которая поддерживает представление пользовательских действий пользователям и общие манипуляции, такие как расширение и отклонение. Производители устройств могут использовать эти изменения, пока они не влияют на внутреннее поведение, определенное CDD. Вот краткий обзор класса:

  • PipManager : компонент SystemUI , который запускается вместе с SystemUI .
  • PipTouchHandler : обработчик касаний, который управляет жестами, манипулирующими PIP. Используется только тогда, когда активен потребитель ввода для PIP (см. InputConsumerController ). Здесь можно добавлять новые жесты.
  • PipMotionHelper : удобный класс, который отслеживает позицию PIP и допустимую область на экране. Вызывает ActivityManagerService для обновления или анимации позиции и размера PIP.
  • PipMenuActivityController : запускает активность, которая показывает действия, предоставляемые активностью, которая в данный момент находится в PIP. Эта активность является активностью наложения задач и удаляет накладывающегося потребителя ввода, чтобы сделать ее интерактивной.
  • PipMenuActivity : реализация действия меню.
  • PipMediaController : прослушиватель, который обновляет SystemUI при изменении сеанса мультимедиа таким образом, что это может повлиять на действия по умолчанию в PIP.
  • PipNotificationController : контроллер, который обеспечивает активность уведомления, пока пользователь использует функцию PIP.
  • PipDismissViewController : наложение, показываемое пользователям, когда они начинают взаимодействовать с PIP, чтобы указать, что его можно закрыть.

Размещение по умолчанию

Существуют различные системные ресурсы, которые управляют размещением PIP по умолчанию:

  • config_defaultPictureInPictureGravity : целое число гравитации , которое управляет углом размещения PIP, например BOTTOM|RIGHT .
  • config_defaultPictureInPictureScreenEdgeInsets : смещения от сторон экрана для размещения PIP.
  • config_pictureInPictureDefaultSizePercent и config_pictureInPictureDefaultAspectRatio : комбинация процента ширины экрана и соотношения сторон управляет размером PIP. Вычисленный размер PIP по умолчанию не должен быть меньше @dimen/default_minimal_size_pip_resizable_task , как определено CTS и CDD.
  • config_pictureInPictureSnapMode : поведение привязки, определенное в PipSnapAlgorithm .

Реализации устройств не должны изменять минимальные и максимальные соотношения сторон, определенные в CDD и CTS.

Разрешения

"Операция приложения" для каждого пакета ( OP_PICTURE_IN_PICTURE ) в AppOpsManager ( main/core/java/android/app/AppOpsManager.java ) позволяет пользователям контролировать PIP на уровне каждого приложения через системные настройки. Реализации устройств должны учитывать эту проверку, когда действие запрашивает вход в режим "картинка в картинке".

Тестирование

Для тестирования реализаций PIP запустите все тесты, связанные с функцией «картинка в картинке», которые находятся в тестах CTS на стороне хоста в /cts/hostsidetests/services/activitymanager , в частности в ActivityManagerPinnedStackTests.java .