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

A Otimização de 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. Como algumas configurações podem precisar ser alteradas durante a condução, o aplicativo não está completamente bloqueado. No entanto, por padrão, a maioria das preferências está desativada, com apenas as preferências de chave e facilmente atualizadas sendo ativadas.

Aplicativos ativados ao dirigir

Figura 1. Aplicativos ativados ao dirigir

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

Todas as atividades bloqueadas

Figura 2. Todas as atividades bloqueadas

As 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 podem 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 de notificação 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 restricted_while_driving , que pode ser personalizada com uma sobreposição (desde que a string seja menor que o limite de 60 caracteres).

Sobreposição personalizada

Figura 3. Sobreposição personalizada

Todo o framework DO pode ser desabilitado usando config_always_ignore_ux_restrictions . Definir isso como verdadeiro significa que o motorista pode interagir com todos os aspectos do aplicativo Configurações.

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

Se a configuração acima estiver 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 strings fornecidas aqui devem apontar para as strings definidas em preference_keys.xml.

Exemplo

Para mostrar como habilitar uma configuração profundamente aninhada durante a condução, este exemplo demonstra como habilitar as configurações de saída Text-to-Speech (TTS). Para que isso funcione, adicione todas as configurações na hierarquia a config_ignore_ux_restrictions . Isso inclui as preferências do sistema, idiomas e entrada e TTS para a configuração, já que nossa hierarquia é Sistema->Idiomas e entrada->Saída de conversão de texto em fala. No entanto, as preferências no fragmento de conversão de texto em fala ainda estarão desativadas. Para habilitá-los, precisamos adicionar as chaves para as 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 adicionaremos pk_tts_playback_group ao nosso config.

<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 condução. Por exemplo, bluetooth e wifi já foram modificados para mostrar dispositivos bluetooth salvos ou pontos de acesso wifi 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 estende PreferenceController e substitui onApplyUxRestrictions() para fazer as alterações desejadas.

Depois que um controlador de preferência personalizado é criado, você pode sobrepor o arquivo XML relevante para substituir o controlador de preferência padrão por sua própria implementação.

Exemplos

Em 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 restante). Para conseguir isso, faça o seguinte:

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

Como os pontos de acesso que aparecem aqui já são restritos, você não deseja aplicar UxRestrictions adicionais a essas preferências. Portanto, substitua onApplyUxRestrictions e execute um no-op 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 conectados por Bluetooth . Para continuar a permitir que os dispositivos Bluetooth sejam conectados e desconectados, mas deseja desativar a capacidade de acessar configurações adicionais para esses dispositivos. Para conseguir isso, novamente sobrescrevemos onApplyUxRestrictions, mas desta vez, se a restrição NO_SETUP estiver ativa, oculte 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);
    }
}