Optymalizacja rozpraszania uwagi w ustawieniach samochodu

Optymalizacja rozproszenia uwagi (DO) to narzędzie ograniczające interakcję kierowcy z aplikacją Ustawienia podczas jazdy samochodem. Niektóre ustawienia mogą wymagać zmiany podczas jazdy, aby aplikacja nie została całkowicie zablokowana. Jednak domyślnie większość preferencji jest wyłączona, a włączone są tylko najważniejsze i łatwe do aktualizacji preferencje.

Włączone aplikacje podczas jazdy

Rysunek 1. Włączone aplikacje podczas jazdy

Można również zablokować całe działania, jeśli nie są zoptymalizowane pod kątem rozpraszania uwagi, jak pokazano poniżej. Ta metoda jest obecnie używana głównie do wyszukiwania ustawień.

Wszystkie działania zablokowane

Rysunek 2. Wszystkie działania zablokowane

Podstawowe dostosowania wydajności DO można dokonać poprzez nakładki konfiguracyjne. Jeśli potrzebujesz bardziej szczegółowego dostosowania, dodatkowe zmiany można wprowadzić za pomocą kodu.

Personalizacja na wysokim poziomie

Jeśli preferencja zostanie wyłączona podczas jazdy, dotknięcie jej spowoduje wyświetlenie komunikatu toastowego z informacją, że preferencja nie jest dostępna podczas jazdy, pod warunkiem, że jest do niej podłączony kontroler preferencji. W wiadomości zastosowano ciąg znaków restricted_while_driving , który można dostosować za pomocą nakładki (pod warunkiem, że ciąg znaków jest krótszy niż 60 znaków).

Dostosowana nakładka

Rysunek 3. Dostosowana nakładka

Całą strukturę DO można wyłączyć za pomocą config_always_ignore_ux_restrictions . Ustawienie tej opcji na wartość true oznacza, że ​​sterownik może wchodzić w interakcję z każdym aspektem aplikacji Ustawienia.

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

Jeśli powyższa konfiguracja ma wartość Fałsz, aplikacja Ustawienia powraca do config_ignore_ux_restrictions aby określić, które preferencje powinny być włączone podczas jazdy. Podane tutaj ciągi powinny wskazywać na ciągi zdefiniowane w preference_keys.xml.

Przykład

Aby pokazać, jak włączyć głęboko zagnieżdżone ustawienie podczas jazdy, w tym przykładzie pokazano, jak włączyć ustawienia wyjściowe zamiany tekstu na mowę (TTS). Aby to zadziałało, dodaj wszystkie ustawienia w hierarchii do config_ignore_ux_restrictions . Obejmuje to system, języki i wprowadzanie oraz preferencje TTS w konfiguracji, ponieważ nasza hierarchia to System->Języki i wprowadzanie->Wyjście zamiany tekstu na mowę. Jednak preferencje we fragmencie zamiany tekstu na mowę są nadal wyłączone. Aby je włączyć, musimy dodać klucze do preferencji, które chcemy, aby były dostępne. W tym przykładzie chcemy włączyć preferencje odtwarzania, ale nie preferencje silnika, dlatego dodajemy pk_tts_playback_group do naszej konfiguracji.

<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>

Szczegółowe dostosowywanie

Istnieją pewne preferencje, które mogą wymagać bardziej spersonalizowanego zachowania niż zwykłe włączanie/wyłączanie preferencji w zależności od stanu jazdy. Na przykład Bluetooth i Wi-Fi zostały już zmodyfikowane, aby podczas jazdy wyświetlać zapisane urządzenia Bluetooth lub punkty dostępu Wi-Fi.

Obecnie nie ma rozwiązania opartego na konfiguracji, które umożliwiałoby dokonywanie tego rodzaju dostosowań. Zamiast tego możesz utworzyć niestandardową klasę, która rozszerza PreferenceController i zastępuje funkcję onApplyUxRestrictions() aby wprowadzić żądane zmiany.

Po utworzeniu niestandardowego kontrolera preferencji można nałożyć odpowiedni plik XML, aby zastąpić domyślny kontroler preferencji własną implementacją.

Przykłady

W CarSettings niektóre preferencje mają bardziej spersonalizowane zachowanie, które można wykorzystać jako przykłady dodatkowego dostosowania. Na przykład na liście punktów dostępu Wi-Fi pożądanym zachowaniem jest pokazywanie podczas jazdy tylko zapisanych punktów dostępu (i ukrywanie pozostałych). Aby to osiągnąć, wykonaj następujące czynności:

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

Ponieważ punkty dostępu, które się tutaj pojawiają, są już ograniczone, nie chcesz stosować dodatkowych UxRestrictions do tych preferencji. Dlatego zastąp onApplyUxRestrictions i wykonaj celową operację „no-op”:

@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.
}

Inny przykład dotyczy urządzeń połączonych za pomocą technologii Bluetooth . Aby kontynuować umożliwianie podłączania i odłączania urządzeń Bluetooth, ale chciałem wyłączyć możliwość dostępu do dodatkowych ustawień tych urządzeń. Aby to osiągnąć, ponownie nadpiszemy onApplyUxRestrictions ale tym razem, jeśli aktywne jest ograniczenie NO_SETUP , ukryj dodatkową akcję w preferencjach.

@Override
protected void onApplyUxRestrictions(CarUxRestrictions uxRestrictions) {
    super.onApplyUxRestrictions(uxRestrictions);
    if (CarUxRestrictionsHelper.isNoSetup(uxRestrictions)) {
        updateActionVisibility(getPreference(), /* isActionVisible= */ false);
    }
}