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

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

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

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

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

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

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

Выполнение

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

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

  • ActivityRecord : отслеживает состояние «картинка в картинке» для каждого действия. Чтобы предотвратить переход пользователей в режим «картинка в картинке» в определённых ситуациях, например, с экрана блокировки или во время использования виртуальной реальности, добавьте случаи в 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, запустите все тесты, связанные с картинкой в ​​картинке, которые можно найти в тестах CTS на стороне хоста в /cts/hostsidetests/services/activitymanager , в частности в ActivityManagerPinnedStackTests.java .