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