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 é totalmente bloqueado. No entanto, por padrão, a maioria das preferências está desativada, com apenas as preferências principais e facilmente atualizadas sendo ativadas.

Aplicativos ativados durante a condução

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

Personalizações básicas para o desempenho do DO podem ser feitas por meio de sobreposições de configuração. Se você precisar de 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 de brinde informando que a preferência não está disponível durante a condução, desde que a preferência tenha um controlador de preferências anexado a ela. A mensagem usa a string 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

Toda a estrutura DO pode ser desativada 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 for definida como falsa, o aplicativo Configurações retrocederá 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 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 o sistema, os idiomas e a entrada e as preferências de TTS para a configuração, pois nossa hierarquia é Sistema->Idiomas e entrada->Saída de conversão de texto em fala. No entanto, as preferências dentro do fragmento de conversão de texto em fala ainda serão desativadas. Para habilitá-los, precisamos adicionar as chaves para as preferências que queremos que sejam acessíveis. Neste exemplo, queremos ativar as preferências de reprodução, mas não a preferência do mecanismo, portanto, adicionaremos 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 há nenhuma 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 ligados por Bluetooth . Para continuar a permitir que dispositivos Bluetooth sejam conectados e desconectados, mas deseja desativar a capacidade de acessar configurações adicionais para esses dispositivos. Para conseguir isso, novamente substituímos 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);
    }
}