Повернуть предложения

В Android 8.0 пользователи могли переключаться между режимами автоповорота и портретного поворота с помощью плитки быстрых настроек или настроек дисплея. В Android 9 мы обновили режим портретного поворота, чтобы устранить непреднамеренные повороты, закрепив текущий поворот экрана, даже если положение устройства изменилось. При необходимости пользователи могут запускать ротацию вручную, нажав новую кнопку на панели навигации. Мы переименовали портретный режим в блокировку вращения, и он активируется, когда автоповорот выключен. Никаких изменений в режиме автоповорота нет.

Когда устройство находится в режиме блокировки поворота, пользователи могут заблокировать свой экран для любого поворота, поддерживаемого верхней видимой активностью (с учетом текущих системных ограничений). Если верхнее действие может быть отображено с несколькими поворотами в режиме автоматического поворота, те же параметры должны быть доступны в режиме блокировки поворота, с некоторыми исключениями, основанными на настройке screenOrientation .

Режим блокировки поворота работает, отображая кнопку на панели навигации при изменении поворота устройства. Для этого датчик ориентации устройства должен оставаться активным даже при выключенном автоповороте. Нажатие этой кнопки эффективно устанавливает предпочтения пользователя по ротации ( Settings.System.USER_ROTATION ). WindowManager использует этот параметр вместе с другими сведениями о верхней активности и состоянии системы, чтобы изменить вращение системы. WindowManager продолжает использовать пользовательское предпочтение поворота при принятии решения о том, в каком повороте отображать систему при переходе к другому действию.

Этот gif показывает телефон в альбомной ориентации с экраном в портретной ориентации. Появляется значок, спрашивающий пользователя, хотят ли они изменить ориентацию экрана на альбомную.
Рисунок 1 . Повернуть кнопку предложения с включенным жестом «Проведите вверх по кнопке «Домой»»

При переходе между видами деятельности следует сохранять предпочтение ротации пользователей. Однако, поскольку большинство пользователей телефонов хотят находиться в альбомной ориентации только в течение короткого временного периода, мы добавили смещение естественной ориентации. Пользовательский параметр поворота сбрасывается до естественной ориентации устройства всякий раз, когда поворот системы изменяется на естественную ориентацию устройства. Для большинства телефонов естественная ориентация устройства — портретная (0º). Сброс настроек ротации пользователя часто происходит при использовании приложения только для портретной ориентации, блокировке телефона или возврате в рабочее пространство программы запуска.

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

Источник

В Android 9 добавлена ​​поддержка предложений по повороту. Большинство изменений содержится в следующих файлах.

  • services/.../server/policy/PhoneWindowManager.java :
    • Хуки, использующие выходные WindowOrientationListener ( MyOrientationListener , отвечающие за мониторинг датчиков, чтобы определить, было ли устройство повернуто)
    • WindowOrientationListener активным, даже если автоповорот отключен (см. needSensorRunningLp() )
    • Вычисляет ротацию системы с учетом предпочтения пользователя, настроек top Activity screenOrientation и состояния системы (см. rotateForOrientationLw rotationForOrientationLw() )
    • Определите, может ли верхняя активность вращаться до заданного поворота (см. isRotationChoicePossible() )
  • SystemUI/.../statusbar/phone/NavigationBarFragment :
    • Определяет, должна ли кнопка панели навигации отображаться при обратных вызовах предложения поворота из PhoneWindowManager (см. onRotationProposal() )
    • Обрабатывает, когда нужно скрыть кнопку поворота панели навигации (см. вызовы setRotateSuggestionButtonState(false) )
    • Обрабатывает время ожидания кнопки, включая особый случай, когда панель навигации скрыта (обычно в полноэкранном режиме)
    • Сбрасывает настройки пользователя при возвращении к естественной ориентации устройства ( mRotationWatcher )
    • Выбирает подходящий стиль для анимации кнопки панели навигации, применяемой в NavigationBarView (см. onRotationProposal() )
    • Добавляет логику режима введения, включая специализированную анимацию (см. ссылки на Settings.Secure.NUM_ROTATION_SUGGESTIONS_ACCEPTED )
    • Реализует флаг ротации disable2 (см. disable() )
  • SystemUI/.../statusbar/phone/NavigationBarView.java :
    • Анимация значка кнопки стилей для соответствия ожидающему повороту (см. updateRotateSuggestionButtonStyle() )
    • Обрабатывает изменения видимости кнопок (см. setRotateButtonVisibility() ), включая логику для скрытия кнопки поворота, если активны определенные службы специальных возможностей (с учетом ранжирования стека самой правой кнопки панели навигации)
  • SystemUI/res/layout/menu_ime.xml :
    • Включает новый KeyButtonView для кнопки поворота, расположенной над меню и средством выбора IME/клавиатуры, но ниже кнопки специальных возможностей.
  • SystemUI/res/drawable/ic_sysbar_rotate_button.xml :
    • Комплекс AnimatedVectorDrawable , используемый для анимации кнопки поворота панели навигации.
    • Стиль (в SystemUI/res/values/styles.xml ) используется для установки начального и конечного углов поворота, поэтому один и тот же объект рисования можно использовать для анимации различных начальных и конечных поворотов.
    • Оттенок значка задается через TintedKeyButtonDrawable

Реализация

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

Производители устройств, которые создают устройства с аппаратными навигационными клавишами, которые хотят реализовать эту функцию, должны будут разработать и реализовать свои собственные возможности системного пользовательского интерфейса или отключить эту функцию. Рекомендуется, чтобы любая введенная поверхность была удобной в использовании, когда устройство удерживается под углом 90° или 180° к текущему вращению системы и к нему можно быстро получить доступ. По этим причинам не рекомендуется использовать уведомления (как это делается для средства выбора IME/клавиатуры).

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

Для согласованности реализации необходимо, чтобы пользовательский параметр поворота ( Settings.System.USER_ROTATION ) сбрасывался на естественный поворот устройства, когда система по какой-либо причине переключается на естественный поворот устройства, когда автоповорот отключен. Предоставленная реализация делает это (см. NavigationBarFragment.mRotationWatcher ).

В StatusBarManager.disable2 появился новый флаг, который временно предотвращает появление предложений по вращению. См. StatusBarManager.DISABLE2_ROTATE_SUGGESTIONS . Этот флаг необходимо соблюдать во всех реализациях, поскольку он используется критически важными системными приложениями, включая мастер установки. Предоставленная реализация поддерживает это (см. NavigationBarFragment.disable() ).

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

Настройка

Поскольку предложения по чередованию отображаются только в режиме блокировки поворота (автоповорот выключен), можно выбрать, включена ли эта функция по умолчанию для новых установок, выбрав автоматическое поворот по умолчанию. См. def_accelerometer_rotation в SettingsProvider/res/values/defaults.xml , чтобы внести изменения по умолчанию.

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

Проверка

Для тестирования эту функцию можно включать и выключать, изменяя значение Settings.Secure . Проще всего это сделать, выполнив следующую команду из привилегированного экземпляра adb:

adb shell settings put secure show_rotation_suggestions <x>

Установите x равным 0 для выключения и 1 для включения.

Для тестирования ознакомительный режим можно сбросить, изменив соответствующее значение Settings.Secure . Проще всего это сделать, выполнив следующую команду из привилегированного экземпляра adb:

adb shell settings put secure num_rotation_suggestions_accepted 0