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

A otimização da distração (DO) é fornecida como uma ferramenta para reduzir a interação do motorista com o aplicativo Configurações enquanto o carro está em movimento. Algumas configurações podem precisar ser alteradas durante a condução, para que o aplicativo não seja completamente bloqueado. No entanto, por padrão, a maioria das preferências está desativada, sendo ativadas apenas as preferências principais e de fácil atualização.

Aplicativos ativados enquanto você dirige

Figura 1. Aplicativos ativados durante a condução

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

Todas as atividades bloqueadas

Figura 2. Todas as atividades bloqueadas

Personalizações básicas para o desempenho do DO podem ser feitas por meio de sobreposições de configuração. Se você precisar de uma personalização mais refinada, alterações adicionais poderão ser feitas por meio do código.

Personalização de alto nível

Quando uma preferência é desativada durante a condução, tocar nela exibe uma mensagem informando que a preferência não está disponível durante a conduçã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 seja inferior ao limite de 60 caracteres).

Sobreposição personalizada

Figura 3. Sobreposição personalizada

Toda a estrutura DO pode ser desabilitada usando config_always_ignore_ux_restrictions . Definir isso como verdadeiro significa que o driver pode interagir com todos os aspectos do aplicativo Configurações.

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

Se a configuração acima for definida como falsa, o aplicativo Configurações volta para config_ignore_ux_restrictions para determinar quais preferências devem ser habilitadas durante a condução. As sequências fornecidas aqui devem apontar para as sequências definidas em preference_keys.xml.

Exemplo

Para mostrar como ativar uma configuração profundamente aninhada durante a condução, este exemplo demonstra como ativar as configurações de saída de conversão de texto em fala (TTS). Para que isso funcione, adicione todas as configurações na hierarquia a config_ignore_ux_restrictions . Isso inclui o sistema, idiomas e entrada, e preferências de TTS para a configuração, já que nossa hierarquia é Sistema->Idiomas e entrada->Saída de texto para fala. No entanto, as preferências no fragmento de conversão de texto em fala ainda estão desativadas. Para habilitá-los, precisamos adicionar as chaves das preferências que queremos que sejam acessíveis. Neste exemplo, queremos habilitar as preferências de reprodução, mas não a preferência do mecanismo, então 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

Existem 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, Bluetooth e Wi-Fi já foram modificados para mostrar dispositivos Bluetooth salvos ou pontos de acesso Wi-Fi durante a condução.

Atualmente não existe uma solução baseada em configuração para fazer esses tipos de ajustes. Em vez disso, você pode criar uma classe personalizada que estenda PreferenceController e substitua onApplyUxRestrictions() para fazer as alterações desejadas.

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

Exemplos

No CarSettings, algumas preferências possuem esse comportamento mais customizado, que pode ser usado como exemplo para customização adicional. Por exemplo, na lista de pontos de acesso Wi-Fi , o comportamento desejado é mostrar apenas os pontos de acesso salvos durante a condução (e ocultar o resto). Para conseguir isso, faça o seguinte:

mAccessPoints = CarUxRestrictionsHelper.isNoSetup(getUxRestrictions())
               ? getCarWifiManager().getSavedAccessPoints()
               : getCarWifiManager().getAllAccessPoints();

Como os pontos de acesso exibidos aqui já estão restritos, você não deseja aplicar UxRestrictions adicionais a essas preferências. Portanto, substitua onApplyUxRestrictions e execute uma operação autônoma 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 com ligação Bluetooth . Para continuar a permitir que dispositivos Bluetooth sejam conectados e desconectados, mas queria desativar a capacidade de acessar configurações adicionais para esses dispositivos. Para conseguir isso, substituímos novamente onApplyUxRestrictions , mas desta vez, se a restrição NO_SETUP estiver ativa, ocultamos 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);
    }
}