車の設定での注意散漫防止の最適化

注意散漫防止の最適化(DO)は、車の移動中に設定アプリとドライバーのやり取りを軽減するツールとして提供されています。一部の設定を運転中に変更する必要がある場合もあるため、アプリが完全にブロックされるわけではありません。ただし、デフォルトでは、ほとんどの設定は無効になっており、キーと簡単に更新できる設定のみが有効になっています。

運転中に有効になっているアプリ

図 1. 運転中に有効になっているアプリ

以下に示すように、注意散漫防止の最適化がなされていない場合は、アクティビティ全体をブロックすることもできます。現在、この方法は設定の検索に使用されています。

すべてのアクティビティのブロック化

図 2. すべてのアクティビティのブロック化

DO のパフォーマンスの基本的なカスタマイズは、構成オーバーレイを介して行えます。さらに細かいカスタマイズが必要な場合は、コードを編集することで変更を加えることができます。

基本的なカスタマイズ

運転中に設定が無効になっている場合、設定をタップすると、設定コントローラが接続されている場合には、運転中に設定を使用できないことを示すトースト メッセージが表示されます。メッセージには、オーバーレイを使ってカスタマイズできる restricted_while_driving 文字列が使用されます(文字列が 60 文字の制限未満の場合)。

カスタマイズされたオーバーレイ

図 3. カスタマイズされたオーバーレイ

DO フレームワークは、config_always_ignore_ux_restrictions を使用してすべて無効にできます。これを true に設定すると、ドライバは設定アプリのあらゆる側面とやり取りできます。

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

上記の設定が false の場合、設定アプリは config_ignore_ux_restrictions にフォールバックして、運転中にどの設定を有効にすべきかを判断します。ここで指定する文字列は、preference_keys.xml. で定義されている文字列を指す必要があります。

深くネストされた設定を運転中に有効にする方法を示します。この例では、テキスト読み上げ(TTS)出力設定を有効にする方法を示します。これを行うには、階層のすべての設定を config_ignore_ux_restrictions に追加します。つまり、システム、言語と入力、および TTS の設定です。これは、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>

詳細なカスタマイズ

運転状態に基づいて単に設定を有効または無効にするだけではなく、よりカスタマイズされた動作が必要になる場合があります。たとえば、Bluetooth と Wi-Fi の場合、運転中は保存済みの Bluetooth デバイスまたは Wi-Fi アクセス ポイントを表示するよう、あらかじめ調整されています。

現在のところ、設定を通じてこうした調整を行う方法はありません。代わりに、PreferenceController を拡張し onApplyUxRestrictions() をオーバーライドするカスタムクラスを作成することで、必要な変更を加えることができます。

カスタム設定コントローラが作成された後、関連する XML ファイルをオーバーレイして、デフォルトの設定コントローラを独自の実装に置き換えることができます。

CarSettings では、一部の設定にはさらにカスタマイズされた動作があり、追加のカスタマイズの例として使用できます。たとえば、Wi-Fi アクセス ポイント リストでは、運転中には保存されたアクセス ポイントのみを表示し、それ以外は非表示にするという動作が想定されています。これを行う手順は以下のとおりです。

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

ここに表示されるアクセス ポイントはすでに制限されているため、これらの設定に UxRestrictions を追加する必要はありません。そのため、onApplyUxRestrictions をオーバーライドして意図的に何も行わないようにします。

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

Bluetooth ボンディング デバイス設定コントローラで別の例を確認しましょう。 Bluetooth デバイスの接続と接続解除を切り替える機能は有効にしたまま、このデバイスのその他の設定にアクセスする機能を無効にするために、ここでも onApplyUxRestrictions をオーバーライドします。ただし、NO_SETUP 制限が有効になっている場合、設定のセカンダリ アクションを非表示にします。

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