В Android 8.0 пользователи могли переключаться между автоматическим поворотом экрана и портретным режимом с помощью параметра в быстрых настройках или настроек экрана. В Android 9 мы обновили режим портретной ориентации, чтобы исключить случайные повороты экрана. Теперь текущая ориентация экрана сохраняется, даже если положение устройства меняется. Пользователи могут вручную запускать поворот экрана, когда это необходимо, нажав на новую кнопку на панели навигации. Мы переименовали режим "Книжная ориентация" в "Блокировка поворота". Он включается, когда автоповорот отключен. Сам режим автоповорота не изменился.
Если на устройстве включена блокировка поворота экрана, пользователи могут зафиксировать экран в любом положении, которое поддерживается верхним видимым объектом Activity (с учетом текущих системных ограничений). Если верхний Activity можно отрисовать в нескольких поворотах в режиме автоповорота, те же варианты должны быть доступны в режиме блокировки ориентации, за исключением случаев, когда это запрещено настройкой screenOrientation Activity.
В режиме блокировки поворота на панели навигации при изменении ориентации устройства появляется кнопка. Для этого датчик ориентации устройства должен быть активен, даже если автоповорот отключен. Нажатие на эту кнопку фактически задает предпочтительную ориентацию экрана (Settings.System.USER_ROTATION). Менеджер окон использует это предпочтение, а также другие сведения о верхнем окне и статусе системы, чтобы изменить ориентацию экрана. При переходе к другому Activity WindowManager по-прежнему использует настройки поворота, заданные пользователем, чтобы определить, в каком положении отображать систему.
При переходе между действиями ориентация экрана должна сохраняться. Однако большинство пользователей телефонов хотят использовать альбомную ориентацию лишь на короткое время, поэтому мы добавили естественное смещение ориентации. Настройки поворота экрана, заданные пользователем, сбрасываются до стандартной ориентации устройства, когда системная ориентация меняется на стандартную. Для большинства телефонов естественная ориентация – вертикальная (0°). Сброс настроек ориентации экрана часто происходит при использовании приложения, которое поддерживает только портретную ориентацию, блокировке телефона или возврате на рабочий стол.
За последнее десятилетие взаимодействие пользователей с экраном не сильно изменилось. Пользователям может быть сложно найти эту функцию, поскольку она отличается от того, как они привыкли работать с поворотом экрана и кнопками на панели навигации. Поэтому мы добавили режим обучения для кнопки поворота экрана, который выделяет ее, когда она появляется. Режим Intro Mode действует только при первых нескольких нажатиях на кнопки, после чего отключается.
Источник
В Android 9 добавлена поддержка подсказок по повороту экрана. Большинство изменений содержится в следующих файлах:
services/.../server/policy/PhoneWindowManager.java:- Хуки, использующие выходные данные
WindowOrientationListener(MyOrientationListener, отвечающий за мониторинг датчиков, чтобы определить, было ли повернуто устройство). - Оставляет
WindowOrientationListenerактивным, даже когда автоповорот отключен (см.needSensorRunningLp()). - Вычисляет поворот системы с учетом предпочтений пользователя, настроек верхнего объекта
screenOrientationи состояния системы (см.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.
Пользователи могут легко включить или отключить автоповорот (независимо от настроек по умолчанию) с помощью переключателя в быстрых настройках или настройках экрана.
Проверка
Для тестирования функцию можно включать и отключать, изменяя значение параметра gating
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