Otimização de distração nas configurações do carro

A otimização de distração (DO, na sigla em inglês) é uma ferramenta para reduzir a interação do motorista com o app Configurações enquanto o carro está em movimento. Algumas configurações podem precisar ser alteradas enquanto você dirige, para que o app não seja completamente bloqueado. No entanto, por padrão, a maioria das preferências fica desativada, e apenas as principais e facilmente atualizadas são ativadas.

Apps ativados enquanto você dirige

Figura 1. Apps ativados enquanto você dirige

Atividades inteiras também podem ser bloqueadas se não forem otimizadas para evitar distrações, conforme mostrado abaixo. Esse método é usado principalmente para a pesquisa de configurações.

Todas as atividades bloqueadas

Figura 2. Todas as atividades bloqueadas

Personalizações básicas para o desempenho da DO podem ser feitas com sobreposições de configuração. Se você precisar de uma personalização mais detalhada, outras mudanças poderão ser feitas por código.

Personalização de alto nível

Quando uma preferência é desativada durante a direção, tocar nela exibe uma mensagem de aviso informando que a preferência não está disponível durante a direção, desde que a preferência tenha um controlador de preferência anexado a ela. A mensagem usa a string restricted_while_driving, que pode ser personalizada com uma sobreposição (desde que a string esteja abaixo do limite de 60 caracteres).

Sobreposição personalizada

Figura 3. Sobreposição personalizada

Todo o framework DO pode ser desativado usando config_always_ignore_ux_restrictions. Definir esse valor como "true" significa que o driver pode interagir com todos os aspectos do app Configurações.

<bool name="config_always_ignore_ux_restrictions">true</bool>

Se a configuração acima for definida como "false", o app Configurações vai usar config_ignore_ux_restrictions para determinar quais preferências serão ativadas durante a direção. As strings fornecidas aqui precisam apontar para as strings definidas em preference_keys.xml..

Exemplo

Para mostrar como ativar uma configuração profundamente aninhada enquanto dirige, este exemplo demonstra como ativar as configurações de saída de texto para fala (TTS). Para que isso funcione, adicione todas as configurações na hierarquia a config_ignore_ux_restrictions. Isso inclui o sistema, os idiomas e a entrada e as preferências de TTS para a configuração, já que nossa hierarquia é Sistema->Idiomas e entrada->Saída de conversão de texto em voz. No entanto, as preferências no fragmento de conversão de texto em voz ainda estão desativadas. Para ativá-las, precisamos adicionar as chaves das preferências que queremos tornar acessíveis. Neste exemplo, queremos ativar as preferências de reprodução, mas não a preferência do mecanismo. Portanto, adicionamos pk_tts_playback_group à nossa configuração.

<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>

Personalização detalhada

Há algumas preferências que podem exigir um comportamento mais personalizado do que simplesmente ativar/desativar uma preferência com base no estado de direção. Por exemplo, o Bluetooth e o Wi-Fi já foram modificados para mostrar dispositivos Bluetooth salvos ou pontos de acesso Wi-Fi enquanto você dirige.

No momento, não há uma solução baseada em configuração para fazer esses tipos de ajustes. Em vez disso, crie uma classe personalizada que estenda PreferenceController e substitua onApplyUxRestrictions() para fazer as mudanças desejadas.

Quando um controlador de preferências personalizado é criado, é possível sobrepor o arquivo XML relevante para substituir o controlador de preferências padrão pela sua própria implementação.

Exemplos

No CarSettings, algumas preferências têm esse comportamento mais personalizado, que pode ser usado como exemplo para outras personalizações. Por exemplo, na lista de pontos de acesso Wi-Fi, o comportamento desejado é mostrar apenas os pontos de acesso salvos enquanto você dirige (e ocultar o restante). Para fazer isso, siga estas etapas:

} else if (shouldApplyUxRestrictions(getUxRestrictions())) {
    wifiEntries = getCarWifiManager().getSavedWifiEntries();
} else {
    wifiEntries = getCarWifiManager().getAllWifiEntries();
}

Como os pontos de acesso que aparecem aqui já estão restritos, não é necessário aplicar mais UxRestrictions a essas preferências. Portanto, substitua onApplyUxRestrictions e execute uma ação 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.
}

Outro exemplo é fornecido em Dispositivos vinculados por Bluetooth. Para continuar permitindo que os dispositivos Bluetooth sejam conectados e desconectados, mas queria desativar a capacidade de acessar outras configurações desses dispositivos. Para isso, substituímos onApplyUxRestrictions novamente, mas, dessa vez, se a restrição NO_SETUP estiver ativa, vamos ocultar a ação secundária na preferência.

@Override
protected void onApplyUxRestrictions(CarUxRestrictions uxRestrictions) {
    super.onApplyUxRestrictions(uxRestrictions);
    if (CarUxRestrictionsHelper.isNoSetup(uxRestrictions)) {
        updateActionVisibility(getPreference(), /* isActionVisible= */ false);
    }
}