자동차 설정의 Distraction Optimization

Distraction Optimization(DO)은 자동차가 이동하는 동안 설정 앱과의 드라이버 상호작용을 줄이기 위한 도구로 제공됩니다. 운전 중에 일부 설정을 변경해야 할 수도 있으므로 앱이 완전히 차단되지는 않습니다. 하지만, 기본적으로 대부분의 환경설정은 키만 사용 중지되고 사용 설정된 환경설정은 쉽게 업데이트됩니다.

운전 중 사용 설정된 앱

그림 1. 운전 중 사용 설정된 앱

아래와 같이 전체 활동이 주의 분산 행동 최적화되지 않는다면 차단될 수도 있습니다. 이 메서드는 현재 주로 설정 검색에 사용됩니다.

모든 활동이 차단됨

그림 2. 모든 활동이 차단됨

DO 성능에 관한 기본 맞춤설정은 구성 오버레이를 통해 가능합니다. 더 세부적인 맞춤설정이 필요한 경우 코드를 통해 추가로 변경할 수 있습니다.

상위 수준 맞춤설정

운전 중 환경설정이 사용 중지될 때 환경설정에 연결된 환경설정 컨트롤러가 있는 경우 환경설정을 탭하면 운전 중 환경설정을 사용할 수 없다는 내용의 토스트 메시지를 표시합니다. 메시지는 오버레이로 맞춤설정할 수 있는 restricted_while_driving 문자열을 사용합니다(문자열이 영문 60자보다 짧은 경우).

맞춤설정된 오버레이

그림 3. 맞춤설정된 오버레이

전체 DO 프레임워크는 config_always_ignore_ux_restrictions를 사용하여 사용 중지됩니다. 이 값을 참으로 설정하면 드라이버가 설정 앱의 모든 관점에서 상호작용할 수 있습니다.

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

위 구성을 거짓으로 설정하면 설정 앱이 config_ignore_ux_restrictions로 돌아가 운전 중 어떤 환경설정을 활성화해야 하는지 결정합니다. 여기에 제공된 문자열은 preference_keys.xml.에 정의된 문자열을 가리켜야 합니다.

이 예에서는 운전 중에 복잡하게 중첩된 설정을 사용 설정하는 방법을 보여주기 위해 TTS(텍스트 음성 변환) 출력 설정 사용 방법을 보여줍니다. TTS 출력 설정이 작동하려면 계층 구조의 모든 설정을 config_ignore_ux_restrictions에 추가합니다. Google의 계층 구조는 시스템->언어 및 입력->텍스트 음성 변환 출력이므로, 여기에는 구성의 시스템, 언어 및 입력, TTS 환경설정이 포함됩니다. 그러나, 텍스트 음성 변환 프래그먼트의 환경설정은 계속 사용 중지됩니다. 환경설정을 사용 설정하려면 액세스하려는 환경설정 키를 추가해야 합니다. 이 예에서는 엔진 환경설정이 아닌 재생 환경설정을 사용 설정하므로 구성에 pk_tts_playback_group을 추가합니다.

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

세부 맞춤설정

단순히 운전 상태에 따라 환경설정을 사용 설정/사용 중지하는 것보다 더 많은 맞춤설정 동작이 필요한 환경설정이 있습니다. 예를 들어, 운전 중에 저장된 블루투스 기기 또는 Wi-Fi 액세스 포인트를 표시하기 위해 블루투스 및 Wi-Fi가 이미 수정되었습니다.

현재는 구성 기반 솔루션이 없으므로 이러한 조정을 실행할 수 없습니다. 대신, PreferenceController를 확장하고 onApplyUxRestrictions()를 재정의하여 원하는 변경사항을 적용하는 맞춤 클래스를 만들 수 있습니다.

맞춤 환경설정 컨트롤러가 생성된 후에는 관련 XML 파일을 오버레이하여 기본 환경설정 컨트롤러를 자체 구현으로 대체할 수 있습니다.

CarSettings에서 일부 환경설정에는 이러한 맞춤설정 동작이 포함되며, 이는 추가 맞춤설정을 위한 예로 사용할 수 있습니다. 예를 들어, Wi-Fi 액세스 포인트 목록에서 원하는 동작은 운전 중 저장된 액세스 포인트만 표시하는 것입니다(나머지는 숨김 처리). 이를 위해 다음을 실행합니다.

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

여기에 표시되는 액세스 포인트는 이미 제한되었으므로 환경설정에 UxRestrictions를 추가로 적용하지는 않을 것입니다. 따라서, onApplyUxRestrictions를 재정의하고 의도적인 노옵스(no-ops)를 실행합니다.

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

또 다른 예는 블루투스 연결 기기에 있습니다. 블루투스 기기를 연결하거나 연결 해제하지만 이러한 기기의 추가 설정에 액세스하는 기능은 사용 중지하도록 블루투스 기기 사용 설정을 계속하려고 합니다. 이를 위해 onApplyUxRestrictions는 다시 재정의하지만, 이번에는 NO_SETUP 제한이 활성화되면 환경설정에서 보조 작업을 숨깁니다.

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