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.
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.
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).
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); } }