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

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

Для включения режима «картинка в картинке» требуется явное согласие приложений, поддерживающих эту функцию, и он работает для каждой активности отдельно. (Одно приложение может иметь несколько активностей, только одна из которых находится в режиме «картинка в картинке».) Активности запрашивают переход в режим «картинка в картинке», вызывая 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 .

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

  • ActivityRecord : отслеживает состояние «картинка в картинке» для каждого действия. Чтобы предотвратить переход пользователей в режим «картинка в картинке» в определенных ситуациях, например, с экрана блокировки или во время VR, добавьте варианты действий в checkEnterPictureInPictureState() .
  • ActivityManagerService : основной интерфейс от активности для запроса перехода в режим «картинка в картинке» (PIP) и интерфейс для вызовов из WindowManager и SystemUI для изменения состояния активности в режиме «картинка в картинке».
  • 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 : запускает активность, которая отображает действия, предоставляемые активностью, находящейся в данный момент в режиме «картинка в картинке». Эта активность является активностью-наложением задачи и удаляет наложенный потребитель ввода, чтобы обеспечить интерактивность.
  • PipMenuActivity : реализация для активности меню.
  • PipMediaController : обработчик событий, который обновляет SystemUI при изменении медиасессии, которое может повлиять на действия по умолчанию в режиме «картинка в картинке».
  • PipNotificationController : контроллер, который гарантирует, что уведомление активно, пока пользователь использует функцию «картинка в картинке».
  • PipDismissViewController : всплывающее окно, отображаемое пользователям при начале взаимодействия с PIP, указывающее на возможность его закрытия.

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

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

  • config_defaultPictureInPictureGravity : целочисленное значение параметра gravity , определяющее угол, в котором будет располагаться PIP (картинка в картинке), например, BOTTOM|RIGHT .
  • config_defaultPictureInPictureScreenEdgeInsets : смещение относительно краев экрана для размещения режима «картинка в картинке».
  • 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 .