Оптимизация отвлечения внимания (DO) предоставляется как инструмент для уменьшения взаимодействия водителя с приложением «Настройки» во время движения автомобиля. Поскольку некоторые настройки может потребоваться изменить во время вождения, приложение не блокируется полностью. Однако по умолчанию большинство настроек отключено, а включены только ключевые и легко обновляемые настройки.

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

Рисунок 2. Все действия заблокированы
Основные настройки производительности DO можно выполнить с помощью наложений конфигурации. Если вам требуется более тонкая настройка, дополнительные изменения можно внести с помощью кода.
Настройка высокого уровня
Когда предпочтение отключено во время вождения, при нажатии на него отображается всплывающее сообщение о том, что предпочтение недоступно во время вождения, при условии, что к предпочтению подключен контроллер предпочтений. В сообщении используется строка restricted_while_driving , которую можно настроить с помощью наложения (при условии, что длина строки меньше 60-символьного ограничения).

Рисунок 3. Пользовательское наложение
Всю структуру DO можно отключить с помощью config_always_ignore_ux_restrictions . Установка значения true означает, что драйвер может взаимодействовать со всеми аспектами приложения «Настройки».
<bool name="config_always_ignore_ux_restrictions">true</bool>
Если для приведенной выше конфигурации установлено значение false, приложение «Настройки» возвращается к config_ignore_ux_restrictions , чтобы определить, какие настройки следует включить во время вождения. Предоставленные здесь строки должны указывать на строки, определенные в preference_keys.xml.
Пример
Чтобы показать, как включить глубоко вложенный параметр во время вождения, в этом примере показано, как включить параметры вывода текста в речь (TTS). Чтобы это работало, добавьте все настройки в иерархии в config_ignore_ux_restrictions . Это включает в себя систему, языки и ввод, а также настройки TTS для конфигурации, поскольку наша иерархия — Система-> Языки и ввод-> Преобразование текста в речь. Однако настройки во фрагменте преобразования текста в речь по-прежнему будут отключены. Чтобы включить их, нам нужно добавить ключи для настроек, которые мы хотим сделать доступными. В этом примере мы хотим включить настройки воспроизведения, но не настройки движка, поэтому мы добавим pk_tts_playback_group в нашу конфигурацию.
<string-array name="config_ignore_ux_restrictions">
[...]
<item>@string/pk_system_settings_entry</item>
<item>@string/pk_languages_and_input_settings</item>
<item>@string/pk_tts_settings_entry</item>
<item>@string/pk_tts_playback_group</item>
</string-array>
Детальная настройка
Есть некоторые настройки, которые могут потребовать более индивидуального поведения, чем простое включение/отключение настройки в зависимости от состояния вождения. Например, Bluetooth и Wi-Fi уже были изменены, чтобы отображать сохраненные устройства Bluetooth или точки доступа Wi-Fi во время вождения.
В настоящее время нет основанного на конфигурации решения для внесения таких корректировок. Вместо этого вы можете создать собственный класс, который расширяет PreferenceController и переопределяет onApplyUxRestrictions() для внесения необходимых изменений.
После создания пользовательского контроллера предпочтений вы можете наложить соответствующий XML-файл, чтобы заменить контроллер предпочтений по умолчанию вашей собственной реализацией.
Примеры
В CarSettings некоторые настройки имеют более индивидуальное поведение, которое можно использовать в качестве примеров для дополнительной настройки. Например, в списке точек доступа Wi-Fi желательно показывать только сохраненные точки доступа во время вождения (и скрывать остальные). Чтобы добиться этого, сделайте следующее:
mAccessPoints = CarUxRestrictionsHelper.isNoSetup(getUxRestrictions())
? getCarWifiManager().getSavedAccessPoints()
: getCarWifiManager().getAllAccessPoints();
Поскольку отображаемые здесь точки доступа уже ограничены, вы не хотите применять дополнительные UxRestrictions к этим настройкам. Поэтому переопределите onApplyUxRestrictions и выполните преднамеренное отсутствие операций:
@Override
protected void onApplyUxRestrictions(CarUxRestrictions uxRestrictions) {
// Since the list dynamically changes based on the ux restrictions, we
// enable this fragment regardless of the restriction. Intentional no-op.
}
Другой пример представлен в устройствах, подключенных по Bluetooth . Продолжать разрешать подключение и отключение устройств Bluetooth, но хотел отключить возможность доступа к дополнительным настройкам для этих устройств. Для этого мы снова переопределяем onApplyUxRestrictions, но на этот раз, если активно ограничение NO_SETUP , скрываем дополнительное действие для предпочтения.
@Override
protected void onApplyUxRestrictions(CarUxRestrictions uxRestrictions) {
super.onApplyUxRestrictions(uxRestrictions);
if (CarUxRestrictionsHelper.isNoSetup(uxRestrictions)) {
updateActionVisibility(getPreference(), /* isActionVisible= */ false);
}
}