Обзор функций и API

В Android 12 появились новые функции и API для разработчиков. В разделах ниже вы узнаете о функциях для приложений и о том, как начать работу с соответствующими API.

Подробный список новых, измененных и удаленных API можно найти в отчете о различиях API. Подробную информацию о новых API можно найти в документации по Android API. Они выделены для удобства. Чтобы узнать, как изменения платформы могут повлиять на ваши приложения, ознакомьтесь с изменениями в поведении Android 12 для приложений, предназначенных для Android 12, и для всех приложений.

Удобство использования

Material You

В Android 12 представлена новая система дизайна Material You, которая позволяет создавать более персонализированные и красивые приложения. Чтобы добавить в приложения все последние обновления Material Design 3, попробуйте альфа-версию компонентов Material Design.

Material You

Улучшения виджетов

В Android 12 обновлен существующий API виджетов, чтобы сделать платформу и средства запуска удобнее для пользователей и разработчиков. Мы создали руководство, которое поможет вам обеспечить совместимость виджета с Android 12 и добавить в него новые функции.

Подробнее об улучшениях виджетов в Android 12…

Вставка расширенного контента

В Android 12 появился новый унифицированный API, который позволяет приложению получать расширенные сведения о товаре из любого доступного источника: буфера обмена, клавиатуры или перетаскивания.

Подробнее о получении расширенного контента…

API заставок приложений

В Android 12 появилась новая анимация запуска для всех приложений. Она включает движение в приложение из точки запуска, заставку со значком приложения и переход к самому приложению. Подробную информацию вы найдете в руководстве для разработчиков по заставкам.

API для скругленных углов

В Android 12 появились методы RoundedCorner и WindowInsets.getRoundedCorner(int position), которые предоставляют радиус и центральную точку для скругленных углов.

Подробнее о скругленных углах…

Разнообразные тактильные ощущения

В Android 12 расширены инструменты для создания информативного виброотклика на события в интерфейсе, захватывающих и приятных эффектов для игр и привлекающих внимание вибраций для повышения продуктивности.

Эффекты привода

В Android 12 добавлены выразительные эффекты, такие как низкий тик, которые используют более широкую полосу частот новейших приводов. Теперь разработчики игр могут независимо обращаться к нескольким разным приводам в игровых контроллерах, чтобы синхронно воспроизводить один и тот же эффект или разные тактильные эффекты на нескольких приводах. Разработчикам мы рекомендуем использовать константы и примитивы в качестве строительных блоков для создания сложных тактильных эффектов. Константы позволяют улучшить события пользовательского интерфейса, а компоновщик тактильных эффектов – выстроить последовательность примитивов для создания более сложных эффектов. Эти API доступны для тестирования на устройствах Pixel 4. Мы продолжаем сотрудничать с партнерами-производителями устройств, чтобы обеспечить поддержку новейших тактильных технологий для пользователей всей экосистемы.

Виброотклик, связанный со звуком

Приложения для Android 12 могут генерировать виброотклик на основе аудиосеанса, используя вибрацию телефона. Это позволяет глубже погрузиться в игру или прослушивание аудио. Например, тактильные рингтоны могут помочь идентифицировать звонящих, а в гоночной игре можно имитировать ощущение неровной дороги.

Дополнительную информацию можно найти в справочной документации по HapticGenerator.

AppSearch

В Android 12 в качестве системного сервиса представлен AppSearch – высокопроизводительная поисковая система на устройстве. AppSearch позволяет приложениям индексировать структурированные данные и выполнять по ним полнотекстовый поиск. Кроме того, AppSearch поддерживает встроенные функции поиска, такие как высокоэффективное индексирование и извлечение, поддержка нескольких языков и ранжирование по релевантности.

Диаграмма, иллюстрирующая индексирование и поиск в AppSearch

AppSearch поставляется в двух вариантах: локальный индекс для вашего приложения, совместимый со старыми версиями Android, или центральный индекс, поддерживаемый для всей системы в Android 12. Благодаря центральному индексу ваше приложение может разрешить показ своих данных в интерфейсе системы с помощью предустановленного интеллектуального компонента. Какие именно данные будут показаны в интерфейсе системы, зависит от OEM. Кроме того, ваше приложение может безопасно обмениваться данными с другими приложениями, чтобы они также могли выполнять поиск по этим данным.

Подробнее об AppSearch рассказывается в руководстве для разработчиков. Чтобы начать работу с этим инструментом, используйте библиотеку AppSearch Jetpack, которая предоставляет удобный API и поддержку инструмента обработки аннотаций.

Игровой режим

Game Mode API и вмешательства игрового режима позволяют оптимизировать геймплей, отдавая приоритет таким характеристикам, как производительность или время работы от батареи, в зависимости от настроек пользователя или конфигураций игры.

Подробнее об игровом режиме…

Рекомендации и улучшения для режима "Картинка в картинке"

В Android 12 появились следующие улучшения режима "Картинка в картинке":

Поддержка новых жестов в режиме "Картинка в картинке"

В Android 12 теперь поддерживаются жесты для скрытия и масштабирования окна в режиме "Картинка в картинке".

  • Чтобы убрать окно, пользователь может перетащить его к левому или правому краю. Чтобы вернуть окно на экран, пользователь может нажать на его видимую часть или перетащить его.

  • Теперь пользователь может изменить размер окна картинки в картинке, сведя или разведя пальцы.

В Android 12 были добавлены значительные косметические улучшения для анимированных переходов между полноэкранным режимом и режимом "картинка в картинке". Мы настоятельно рекомендуем реализовать все применимые изменения. После этого они будут автоматически масштабироваться для больших экранов, например складных устройств и планшетов, без каких-либо дополнительных действий.

К ним относятся:

Новые уведомления о телефонных звонках, позволяющие ранжировать важность входящих вызовов

В Android 12 добавлен новый стиль уведомлений Notification.CallStyle для телефонных звонков. Этот шаблон позволяет приложению показывать важность активных вызовов, отображая в строке состояния заметный чип с временем вызова. Пользователь может нажать на этот чип, чтобы вернуться к вызову.

Поскольку входящие и текущие вызовы наиболее важны для пользователей, уведомления о них показываются в верхней части панели. Это также позволяет системе переадресовывать приоритетные вызовы на другие устройства.

Для всех типов звонков используйте следующий код:

Kotlin

// Create a new call with the user as caller.
val incoming_caller = Person.Builder()
    .setName("Jane Doe")
    .setImportant(true)
    .build()

Java

// Create a new call with the user as caller.
Person incoming_caller = new Person.Builder()
    .setName("Jane Doe")
    .setImportant(true)
    .build();

Используйте forIncomingCall(), чтобы создать уведомление о входящем вызове.

Kotlin

// Create a call style notification for an incoming call.
val builder = Notification.Builder(context, CHANNEL_ID)
    .setContentIntent(contentIntent)
    .setSmallIcon(smallIcon)
    .setStyle(
         Notification.CallStyle.forIncomingCall(caller, declineIntent, answerIntent))
    .addPerson(incoming_caller)

Java

// Create a call style notification for an incoming call.
Notification.Builder builder = Notification.Builder(context, CHANNEL_ID)
    .setContentIntent(contentIntent)
    .setSmallIcon(smallIcon)
    .setStyle(
        Notification.CallStyle.forIncomingCall(caller, declineIntent, answerIntent))
    .addPerson(incoming_caller);

Используйте forOngoingCall(), чтобы создать уведомление в стиле звонка для текущего вызова.

Kotlin

// Create a call style notification for an ongoing call.
val builder = Notification.Builder(context, CHANNEL_ID)
    .setContentIntent(contentIntent)
    .setSmallIcon(smallIcon)
    .setStyle(
         Notification.CallStyle.forOnGoingCall(caller, hangupIntent))
    .addPerson(second_caller)

Java

// Create a call style notification for an ongoing call.
Notification.Builder builder = Notification.Builder(context, CHANNEL_ID)
    .setContentIntent(contentIntent)
    .setSmallIcon(smallIcon)
    .setStyle(
        Notification.CallStyle.forOnGoingCall(caller, hangupIntent))
    .addPerson(second_caller);

Используйте forScreeningCall(), чтобы создать уведомление в стиле звонка для фильтра вызовов.

Kotlin

// Create a call style notification for screening a call.
val builder = Notification.Builder(context, CHANNEL_ID)
    .setContentIntent(contentIntent)
    .setSmallIcon(smallIcon)
    .setStyle(
         Notification.CallStyle.forScreeningCall(caller, hangupIntent, answerIntent))
    .addPerson(second_caller)

Java

Notification.Builder builder = Notification.Builder(context, CHANNEL_ID)
    .setContentIntent(contentIntent)
    .setSmallIcon(smallIcon)
    .setStyle(
        Notification.CallStyle.forScreeningCall(caller, hangupIntent, answerIntent))
    .addPerson(second_caller);

Поддержка изображений в уведомлениях

В Android 12 вы можете добавлять в уведомления MessagingStyle() и BigPictureStyle() анимированные изображения. Кроме того, теперь пользователи могут отправлять сообщения с изображениями, когда отвечают на сообщения на панели уведомлений.

Улучшения режима погружения для навигации жестами

В Android 12 существующие функции объединены, чтобы пользователям было проще выполнять команды навигации жестами в режиме комфортного просмотра. Кроме того, в Android 12 предусмотрена обратная совместимость для режима погружения с закреплением.

Отправка URL из списка недавних приложений (только на устройствах Pixel)

На устройствах Pixel пользователи теперь могут делиться ссылками на недавно просмотренный веб-контент прямо с экрана "Недавние". После просмотра контента в приложении пользователь может перейти на экран "Недавние", найти приложение, в котором он просматривал контент, и нажать кнопку со ссылкой, чтобы скопировать или отправить URL.

Подробнее о том, как включить отправку URL недавно открытых страниц…

Безопасность и конфиденциальность

Панель управления разрешениями

Вертикальная хронология показывает, какие приложения получали доступ к геоданным и когда.
Рисунок 1. Экран использования местоположения, часть панели управления разрешениями.

На поддерживаемых устройствах с Android 12 или более поздней версии в системных настройках есть панель управления разрешениями. На этом экране пользователи могут перейти к отдельным экранам, на которых показано, когда приложения получают доступ к информации о местоположении, камере и микрофону. На каждом экране показана хронология доступа разных приложений к определенному типу данных. На рисунке 1 показана временная шкала доступа к данным о местоположении.

Вы можете объяснить пользователям, зачем приложению нужен доступ к местоположению, камере или микрофону. Это обоснование может показываться на новой панели управления разрешениями, на экране разрешений приложения или в обоих местах.

Разрешения Bluetooth

В Android 12 появились разрешения BLUETOOTH_SCAN, BLUETOOTH_ADVERTISE и BLUETOOTH_CONNECT. Эти разрешения упрощают взаимодействие с устройствами Bluetooth для приложений, предназначенных для Android 12, особенно для тех, которым не требуется доступ к данным о местоположении устройства.

Обновите декларации разрешений на использование Bluetooth в приложении

Чтобы подготовить устройство к работе с Android 12 или более поздней версией, обновите логику приложения. Вместо устаревшего набора разрешений Bluetooth используйте более современный.

Поиск группы разрешений

На устройствах с Android 12 и более поздними версиями ОС можно узнать, как система распределяет разрешения по группам разрешений.

  • Чтобы определить, в какую группу разрешений система поместила разрешение, определенное платформой, вызовите getGroupOfPlatformPermission().
  • Чтобы определить, какие разрешения, заданные платформой, система поместила в определенную группу разрешений, вызовите getPlatformPermissionsForGroup().

Скрывать окна приложений, наложенные поверх других

Чтобы разработчики могли лучше контролировать, что видят пользователи при взаимодействии с приложением, в Android 12 добавлена возможность скрывать окна, которые накладываются приложениями с разрешением SYSTEM_ALERT_WINDOW.

После объявления разрешения HIDE_OVERLAY_WINDOWS приложение может вызвать setHideOverlayWindows(), чтобы указать, что все окна типа TYPE_APPLICATION_OVERLAY должны быть скрыты, когда видно окно самого приложения. Это может быть полезно, например, при показе экранов с конфиденциальной информацией, таких как подтверждение транзакции.

Разработчикам приложений, в которых используются окна типа TYPE_APPLICATION_OVERLAY, следует рассмотреть альтернативные варианты, например картинку в картинке или всплывающие чаты.

Пометка о защите разрешений для известных подписавших сторон

Начиная с Android 12 атрибут knownCerts для разрешений на уровне подписи позволяет ссылаться на дайджесты известных сертификатов подписи во время объявления.

Ваше приложение может объявить этот атрибут и использовать флаг knownSigner, чтобы разрешить устройствам и приложениям предоставлять разрешения на подпись другим приложениям без необходимости подписывать приложения во время производства и поставки устройств.

Подтверждение свойств устройства

В Android 12 расширен набор приложений, которые могут проверять свойства устройства, указанные в сертификате подтверждения, когда эти приложения генерируют новый ключ.

Начиная с Android 9 (уровень API 28) владельцы правил для устройств, использующие Keymaster 4.0 или более поздней версии, могут проверять свойства устройств в этих сертификатах. Начиная с Android 12, любое приложение, предназначенное для Android 12 (уровень API 31) или более поздней версии, может выполнять эту проверку с помощью метода setDevicePropertiesAttestationIncluded().

Сгенерированные свойства устройства включают следующие поля Build:

  • BRAND
  • DEVICE
  • MANUFACTURER
  • MODEL
  • PRODUCT

Действия с уведомлениями на заблокированном экране

Начиная с Android 12 класс Notification.Action.Builder поддерживает метод setAuthenticationRequired(), который позволяет приложению требовать разблокировки устройства, прежде чем приложение выполнит определенное действие с уведомлением. Этот метод помогает добавить дополнительный уровень безопасности для уведомлений на заблокированных устройствах.

Локализуемые строки для BiometricPrompt

В Android 12 появились новые API, которые помогут вам улучшить биометрическую аутентификацию в приложении. Новый вложенный класс BiometricManager.Strings включает методы getButtonLabel(), getPromptMessage() и getSettingName(), которые позволяют приложению получать понятные пользователю и локализованные названия кнопок, сообщения с подсказками и названия настроек приложения. Используйте эти ярлыки, чтобы создавать более точные пользовательские инструкции, относящиеся к используемым методам биометрической аутентификации, например "Использовать фейсконтроль" или "Использовать отпечаток пальца для продолжения".

Мультимедиа

Перекодирование медиафайлов в совместимый формат

Начиная с Android 12 (уровень API 31) система может автоматически перекодировать видео в форматах HEVC(H.265) и HDR (HDR10 и HDR10+), записанные на устройстве, в формат AVC (H.264), который совместим со стандартными проигрывателями. Это позволяет использовать преимущества современных кодеков, когда они доступны, не жертвуя совместимостью со старыми приложениями.

Подробнее о перекодировании медиафайлов в совместимый формат…

Класс производительности

В Android 12 появился стандарт, который называется классом производительности. Класс производительности определяет аппаратные возможности, выходящие за рамки базовых требований Android. Каждое устройство Android заявляет класс производительности, который оно поддерживает. Разработчики могут проверять класс производительности устройства во время выполнения и предоставлять улучшенные возможности, которые в полной мере используют возможности устройства.

Подробнее о классах производительности…

Улучшения кодирования видео

В Android 12 определен стандартный набор ключей для управления значением параметра квантования (QP) при кодировании видео, что позволяет разработчикам избегать кода, зависящего от поставщика.

Новые ключи доступны в API MediaFormat и медиабиблиотеке NDK.

Начиная с Android 12 видеокодеры применяют минимальный порог качества. Это гарантирует, что пользователи не столкнутся с крайне низким качеством при кодировании видео с высокой сложностью сцены.

Аудиофокус

Начиная с Android 12 (уровень API 31), когда приложение запрашивает аудиофокус, а другое приложение имеет фокус и воспроизводит звук, система постепенно уменьшает громкость воспроизводящего приложения.

Подробнее об аудиофокусе в Android 12 и более поздних версиях…

Обновления MediaDrm

Чтобы определить, требуется ли компонент защищенного декодера для текущих API MediaDrm, выполните следующие действия:

  1. Создайте MediaDrm.
  2. Откройте сеанс, чтобы получить его идентификатор.
  3. Создайте MediaCrypto, используя идентификатор сеанса.
  4. Позвоните по номеру MediaCrypto.requiresSecureDecoderComponent(mimeType).

С помощью новых методов requiresSecureDecoder(@NonNull String mime) и requiresSecureDecoder(@NonNull String mime, @SecurityLevel int level) вы можете определить это сразу после создания MediaDrm.

Камера

Расширения Camera2 от поставщиков

Многие из наших партнеров – производителей устройств создали собственные расширения камеры, такие как боке, HDR, ночной режим и другие, которые они хотят использовать в приложениях, чтобы создавать дифференцированный опыт на своих устройствах. Библиотека CameraX уже поддерживает эти расширения. В Android 12 эти расширения поставщиков теперь доступны непосредственно на платформе.

Это дополнение позволяет приложениям со сложными реализациями Camera2 использовать расширения поставщиков без необходимости вносить значительные изменения в устаревший код. Camera2 Extension API предоставляет тот же набор расширений, что и CameraX. Они уже поддерживаются на множестве устройств, поэтому вы можете использовать их без дополнительной настройки.

Дополнительную информацию вы найдете в статье CameraExtensionCharacteristics.

Поддержка датчика камеры Quad Bayer

Многие современные устройства Android поставляются с датчиками камеры сверхвысокого разрешения, обычно с фильтрами Quad или Nona Bayer, которые обеспечивают большую гибкость с точки зрения качества изображения и производительности при слабом освещении. В Android 12 появились новые API платформы, которые позволяют сторонним приложениям использовать все возможности этих датчиков. Новые API поддерживают уникальное поведение этих датчиков и учитывают, что они могут поддерживать разные конфигурации и комбинации потоков при работе в режиме полного или максимального разрешения по сравнению с режимом по умолчанию.

Графика и изображения

Предоставлять приложениям прямой доступ к трассировкам аварийных дампов

Начиная с Android 12 вы можете получить доступ к файлу tombstone, который создается при сбое на уровне ОС, в виде буфера протокола с помощью метода ApplicationExitInfo.getTraceInputStream(). Буфер протокола сериализуется с помощью этой схемы. Раньше получить доступ к этой информации можно было только через Android Debug Bridge (adb).

Подробнее о том, как предоставить приложениям прямой доступ к трассировкам надгробий…

Поддержка изображений AVIF

В Android 12 добавлена поддержка изображений в формате AVIF. AVIF – это формат контейнера для изображений и их последовательностей, закодированных с помощью AV1. В AVIF используется внутрикадровое кодирование, которое применяется при сжатии видео. Это значительно улучшает качество изображения при том же размере файла по сравнению со старыми графическими форматами, такими как JPEG. Подробную информацию о преимуществах этого формата можно найти в записи блога Джейка Арчибальда (Jake Archibald).

Упрощенное размытие, цветовые фильтры и другие эффекты

В Android 12 добавлен новый класс RenderEffect, который применяет к объектам View и иерархиям рендеринга распространенные графические эффекты, такие как размытие, цветовые фильтры, эффекты шейдеров Android и т. д. Эффекты можно комбинировать, создавая цепочки (внутренний и внешний эффекты) или смешанные эффекты. Некоторые устройства Android могут не поддерживать эту функцию из-за ограниченной вычислительной мощности.

Эффекты также можно применять к базовому объекту RenderNode для View, вызвав View.setRenderEffect(RenderEffect).

Чтобы реализовать RenderEffect:

view.setRenderEffect(RenderEffect.createBlurEffect(radiusX, radiusY, SHADER_TILE_MODE))

Встроенное декодирование анимированных изображений

В Android 12 API ImageDecoder NDK был расширен, чтобы декодировать все кадры и данные о времени из изображений, в которых используются анимированные форматы файлов GIF и WebP. Когда этот API был представлен в Android 11, он декодировал только первое изображение из анимаций в этих форматах.

Используйте ImageDecoder вместо сторонних библиотек, чтобы уменьшить размер APK-файла и получать обновления, связанные с безопасностью и производительностью.

Дополнительную информацию об API можно найти в документации по API и в примере на GitHub.

Функции связи

Как не дать сопутствующим приложениям перейти в спящий режим

Чтобы сопутствующие приложения могли работать в фоновом режиме и управлять устройствами, в Android 12 добавлены API, которые:

  • Вы сможете активировать приложение, когда сопутствующее устройство находится в зоне действия.
  • Гарантирует, что процесс будет продолжаться, пока устройство находится в зоне действия.

Чтобы использовать API, устройства должны быть подключены с помощью менеджера подключенных устройств. Дополнительную информацию вы найдете в статьях CompanionDeviceManager.startObservingDevicePresence() и CompanionDeviceService.onDeviceAppeared().

Профили менеджера подключенных устройств

Диалоговое окно разрешений, в котором используется профиль дополнительного устройства для запроса нескольких разрешений в одном запросе.

Приложения-партнеры на устройствах с Android 12 (уровень API 31) и более поздних версий могут использовать профили дополнительных устройств при подключении к часам. Использование профиля упрощает процесс регистрации, объединяя предоставление набора разрешений для конкретного типа устройства в один шаг.

Сопутствующее приложение получает пакет разрешений, когда устройство подключается, и они действуют, пока устройство связано. Если вы удалите приложение или связь с ним, разрешения будут отозваны.

Дополнительную информацию вы найдете в статье AssociationRequest.Builder.setDeviceProfile().

Улучшена оценка пропускной способности.

В Android 12 улучшены возможности оценки пропускной способности, предоставляемые getLinkDownstreamBandwidthKbps() и getLinkUpstreamBandwidthKbps(), как для Wi-Fi, так и для передачи данных по мобильной сети. Теперь возвращаемые значения представляют собой средневзвешенную пропускную способность пользователя за все время для каждого оператора или SSID Wi-Fi, типа сети и уровня сигнала во всех приложениях на устройстве. Это позволяет получить более точную и реалистичную оценку ожидаемой пропускной способности, а также оценить холодный запуск приложения. Кроме того, этот метод требует меньше циклов, чем другие.

Улучшения Wi-Fi Aware (NAN)

В Android 12 добавлены следующие улучшения Wi-Fi Aware:

  • На устройствах с Android 12 (уровень API 31) и более поздних версий можно использовать обратный вызов onServiceLost(), чтобы получать оповещения о том, что приложение потеряло обнаруженный сервис, потому что он был остановлен или вышел из зоны действия.
  • Изменился способ настройки нескольких путей передачи данных (NAN Data Paths). Теперь он стал более эффективным. В более ранних версиях для обмена информацией об инициаторах использовались сообщения L2, что приводило к задержкам. На устройствах с Android 12 и более поздними версиями ОС ответчик (сервер) можно настроить так, чтобы он принимал любые одноранговые узлы, то есть ему не нужно заранее знать информацию об инициаторе. Это ускоряет запуск пути передачи данных и позволяет создавать несколько соединений типа "точка-точка" с помощью всего одного сетевого запроса.
  • Чтобы фреймворк не отклонял запросы на обнаружение или подключение из-за нехватки ресурсов, на устройствах с Android 12 и более поздними версиями ОС можно вызвать WifiAwareManager.getAvailableAwareResources(). Возвращаемое значение этого метода позволяет получить количество доступных путей передачи данных, а также количество доступных сеансов публикации и подписки.

Одновременное одноранговое подключение и подключение к интернету

Если устройства с Android 12 (уровень API 31) и более поздними версиями ОС поддерживают аппаратное ускорение, то при создании однорангового подключения существующее подключение по Wi-Fi не будет прерываться. Чтобы проверить, поддерживается ли эта функция, используйте WifiManager.isMultiStaConcurrencySupported().

Как разрешить оплату через NFC при выключенном экране

В приложениях, предназначенных для Android 12 и более поздних версий, можно включить оплату через NFC без включения экрана устройства, установив для requireDeviceScreenOn значение false. Подробнее о поведении заблокированного экрана и экрана в спящем режиме…

Хранилище

В Android 12 появились следующие возможности управления хранилищем:

Основные функции

Автоматическое обновление приложений

В Android 12 появился метод setRequireUserAction() для приложений, использующих API PackageInstaller. Этот метод позволяет установщикам обновлять приложения без подтверждения со стороны пользователя.

Информация о чипсете устройства

В Android 12 в android.os.Build добавлены две константы, которые предоставляют информацию о поставщике и модели однокристальной системы через SDK. Чтобы получить эту информацию, вызовите методы Build.SOC_MANUFACTURER и Build.SOC_MODEL соответственно.

Обновления основных API Java

По просьбам разработчиков и в сотрудничестве с ними мы добавили в Android 12 следующие основные библиотеки:

Класс API
java.lang.Deprecated
java.lang.Byte
java.lang.Short
java.lang.Math
java.lang.StrictMath
java.util.Set copyOf()
java.util.Map copyOf()
java.util.List copyOf()
java.time.Duration
java.time.LocalTime