La optimización de distracciones (DO) se proporciona como una herramienta para reducir la interacción del conductor con la app de Configuración mientras el automóvil está en movimiento. Es posible que debas cambiar algunos parámetros de configuración mientras conduces para que la app no se bloquee por completo. Sin embargo, de forma predeterminada, la mayoría de las preferencias están inhabilitadas, y solo se habilitan las preferencias clave y que se pueden actualizar fácilmente.
Figura 1: Apps habilitadas mientras conduces
También se pueden bloquear actividades completas si no están optimizadas para evitar distracciones, como se muestra a continuación. Actualmente, este método se usa principalmente para la búsqueda de parámetros de configuración.
Figura 2: Todas las actividades bloqueadas
Las personalizaciones básicas del rendimiento de DO se pueden realizar a través de superposiciones de configuración. Si necesitas una personalización más detallada, se pueden realizar cambios adicionales a través del código.
Personalización de alto nivel
Cuando una preferencia está inhabilitada mientras se conduce, si se presiona, se muestra un mensaje de notificación que indica que la preferencia no está disponible mientras se conduce, siempre y cuando la preferencia tenga un controlador de preferencias adjunto. El mensaje usa la cadena restricted_while_driving
, que se puede personalizar con una superposición (siempre que la cadena sea inferior al límite de 60 caracteres).
Figura 3: Superposición personalizada
Todo el framework de DO se puede inhabilitar con config_always_ignore_ux_restrictions
.
Si estableces este valor en verdadero, el controlador puede interactuar con todos los aspectos de la app de configuración.
<bool name="config_always_ignore_ux_restrictions">true</bool>
Si la configuración anterior se establece como falsa, la app de Configuración recurre a
config_ignore_ux_restrictions
para determinar qué preferencias se deben habilitar mientras se conduce. Las cadenas proporcionadas aquí deben apuntar a las cadenas definidas en preference_keys.xml.
.
Ejemplo
Para mostrar cómo habilitar un parámetro de configuración anidado en profundidad mientras se conduce, en este ejemplo se muestra cómo habilitar la configuración de salida de texto a voz (TTS). Para que esto funcione, agrega todos los parámetros de configuración de la jerarquía a config_ignore_ux_restrictions
.
Esto incluye el sistema, los idiomas y la entrada, y las preferencias de TTS en la configuración, ya que nuestra jerarquía es Sistema->Idiomas y entrada->Salida de texto a voz. Sin embargo, las preferencias dentro del fragmento de texto a voz aún están inhabilitadas. Para habilitarlas, debemos
añadir las claves de las preferencias a las que queremos que se pueda acceder. En este ejemplo, queremos habilitar las preferencias de reproducción, pero no la preferencia del motor, por lo que agregamos pk_tts_playback_group
a nuestra configuración.
<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>
Personalización detallada
Hay algunas preferencias que podrían requerir un comportamiento más personalizado que simplemente habilitar o inhabilitar una preferencia según el estado de conducción. Por ejemplo, Bluetooth y Wi-Fi ya se modificaron para mostrar dispositivos Bluetooth o puntos de acceso Wi-Fi guardados mientras se conduce.
Actualmente, no hay una solución basada en la configuración para realizar este tipo de ajustes. En su lugar, puedes crear una clase personalizada que extienda PreferenceController y anule onApplyUxRestrictions()
para realizar los cambios deseados.
Cuando se crea un controlador de preferencias personalizado, puedes superponer el archivo XML relevante para reemplazar el controlador de preferencias predeterminado con tu propia implementación.
Ejemplos
En CarSettings, algunas preferencias tienen este comportamiento más personalizado, que se puede usar como ejemplo para una personalización adicional. Por ejemplo, en la lista de puntos de acceso Wi-Fi, el comportamiento deseado es mostrar solo los puntos de acceso guardados mientras se conduce (y ocultar el resto). Para lograrlo, haz lo siguiente:
} else if (shouldApplyUxRestrictions(getUxRestrictions())) { wifiEntries = getCarWifiManager().getSavedWifiEntries(); } else { wifiEntries = getCarWifiManager().getAllWifiEntries(); }
Como los puntos de acceso que aparecen aquí ya están restringidos, no querrás aplicar UxRestrictions
adicionales a estas preferencias.
Por lo tanto, anula onApplyUxRestrictions
y realiza una operación no ejecutada de forma intencional:
@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. }
Otro ejemplo se proporciona en Dispositivos vinculados por Bluetooth.
Para seguir habilitando la conexión y desconexión de dispositivos Bluetooth, pero inhabilitar la capacidad de acceder a la configuración adicional de estos dispositivos. Para lograrlo, nuevamente anulamos onApplyUxRestrictions
, pero esta vez, si la restricción NO_SETUP
está activa, ocultamos la acción secundaria en la preferencia.
@Override protected void onApplyUxRestrictions(CarUxRestrictions uxRestrictions) { super.onApplyUxRestrictions(uxRestrictions); if (CarUxRestrictionsHelper.isNoSetup(uxRestrictions)) { updateActionVisibility(getPreference(), /* isActionVisible= */ false); } }