システム UI の実装

Android Automotive では、自動車専用に開発された新しいシステム UI が提供されています。システム UI のほとんどのコンポーネントが、フレームワーク サービスと緊密に統合されています。システム UI とは、画面に表示されるあらゆるアプリ外の要素を指します。Automotive システム UI(CarSystemUI 要素パッケージ内)は、自動車専用にカスタマイズされた Android システム UI(SystemUI パッケージ内)の拡張機能です。

システム UI とは

Automotive システム UI に固有のコンポーネントには次のようなものがあります。

コンポーネント 説明
ロック画面 UI ユーザーが特定のユーザー アカウントとして認証を行うための画面。
ナビゲーション バー 画面の左側、下部、または右側に配置できるシステムバー。さまざまなアプリに移動するためのファセット ボタンの表示、通知パネルの切り替え、車両制御機能(暖房換気空調システムなど)の提供などが可能です。これは、戻るボタン、ホームボタン、アプリスタック ボタンを提供する Android システム UI 実装とは異なります。
ステータスバー 画面に表示され、ナビゲーション バーとして機能するシステムバー。ステータスバーは、以下をサポートする機能も提供します。
  • 接続アイコン。Bluetooth、Wi-Fi、アクセス ポイント / モバイル接続を含みます。
  • プルダウン通知パネル。たとえば、画面の上から下にスワイプできます。
  • ヘッドアップ通知(HUN)
システム UI 画面に表示されるあらゆるアプリ外の要素を指します。
ユーザー スイッチャー UI ユーザーが別のユーザーを選択できる画面
音量 UI ドライバーが物理的な音量ボタンを使用してデバイスの音量を変更したときに表示されるダイアログ。

システム UI の仕組み

システム UI は、デバイスの電源が入っているときに実行される Android アプリケーションです。アプリケーションは SystemServer によるリフレクションを通じて起動します。ユーザーに表示されるシステム UI 要素に対して最も関連性の高いエントリ ポイントを下に示します。これらのコンポーネントを使用することで、Automotive 固有の機能向けに Android システム UI をカスタマイズできます。

  • config_statusBarComponent
  • config_systemUIFactoryComponent

CarSystemUI は SystemUI パッケージの拡張機能です。つまり、CarSystemUI パッケージは SystemUI パッケージ内のクラスとリソースを使用およびオーバーライドできます。

システム UI のカスタマイズ

オーバーレイ

Android のソースコードを変更してシステム UI をカスタマイズすることは可能ですが、これを行うと、将来の Android アップデートを適用するための作業が困難かつ複雑になってしまいます。そこで、Android ではオーバーレイ ディレクトリの使用がサポートされています。これにより、ソースコードを変更せずにリソース ファイルを置き換えることができます。Android ビルドシステムでは、オーバーレイ システムによるファイルのオーバーライドは、特定の方法で実施する必要があります。変更されたファイルはすべて、AOSP ソースコードのツリー全体を走査することなく明確に識別されます。

オーバーレイ ファイルは、PRODUCT_PACKAGE_OVERLAYS ディレクトリに配置し、元の AOSP ルート構造とまったく同じサブフォルダを含む必要があります。Android 10 以降の場合、PRODUCT_PACKAGE_OVERLAYS は次のように設定します。

PRODUCT_PACKAGE_OVERLAYS := packages/services/Car/car_product/overlay

Automotive システム UI は SystemUI パッケージと CarSystemUI パッケージのリソースを使用します。つまり、各ロケーションのリソースをオーバーレイでオーバーライドすることで Automotive システム UI のデザインを変更できます。

ファイルを置き換えるには、指定した /overlay ディレクトリに、置換対象ファイルのディレクトリ構造を複製したうえで、その複製したディレクトリに別のファイル(置換ファイル)を追加します。置換方法の一例を次に示します。

frameworks/base/packages/CarSystemUI/res/layout/super_status_bar.xml

次の場所に置換ファイル super_status_bar.xml を追加します。

packages/services/Car/car_product/overlay/frameworks/base/packages/CarSystemUI/res/layout/

frameworks/base/packages/SystemUI/res/values/config.xml(CarSystemUI 内ではなく SystemUI 内)を置き換えるには、次の場所に config.xml ファイルを追加します。

packages/services/Car/car_product/overlay/frameworks/base/packages/SystemUI/res/layout/

または次の場所に追加します。

packages/services/Car/car_product/overlay/frameworks/base/packages/CarSystemUI/res/layout/

2 つの主なカスタマイズ エントリ ポイントの説明を以下に示します。

Automotive システム UI では、画面の左側、下部、右側に、3 つのナビゲーション バーを表示できます。各システムバーの表示 / 非表示を切り替えるには、以下の設定を使用します。

  • config_enableLeftNavigationBar
  • config_enableBottomNavigationBar
  • config_enableRightNavigationBar

各バーにプロビジョニング状態と未プロビジョニング状態があり、それぞれのレイアウト ファイルをオーバーレイすることでカスタマイズできます。

  • car_left_navigation_bar.xml
  • car_left_navigation_bar_unprovisioned.xml
  • car_navigation_bar.xml (下部のナビゲーション バーのレイアウト)
  • car_navigation_bar_unprovisioned.xml
  • car_right_navigation_bar.xml
  • car_right_navigation_bar_unprovisioned.xml

これらのレイアウトでは、com.android.systemui.statusbar.car.CarNavigationBarView をトップレベルに含める必要があります。これには必要なその他のビューを含めることができます。ナビゲーション バー内のボタンを含めるには、次のいずれかを使用します。

  • com.android.systemui.statusbar.car.CarFacetButton
  • com.android.systemui.statusbar.car.CarNavigationButton(さらに XML を活用した設定が可能)

特定のユーザー用にデバイスが適切にプロビジョニングされている場合、これらのビューは CarStatusBar#createNavigationBar でインフレートされます。

ステータスバー

ステータスバーは、機能が追加されたナビゲーション バーであると考えることができます。ナビゲーション バーと異なり、ステータスバーに無効化するためのフラグはありません。ステータスバーは次の方法で変更できます。

  • car_top_navigation_bar.xml
  • car_top_navigation_bar_unprovisioned.xml

これらのレイアウトでは、トップレベルに com.android.systemui.statusbar.car.CarNavigationBarView を含める必要があります。ステータスバーにはステータス アイコンが含まれます。アイコンのサイズを変更するには、サイズを個別に指定するのではなく、スケーリング ファクタを使用して均一にサイズを調整します。たとえば、オーバーレイ ファイル /overlay/frameworks/base/packages/CarSystemUI/res/values/dimens.xml で、次のディメンションを追加するとアイコンのサイズが 2 倍になります。

<resources>
    <!-- The amount by which to scale up the status bar icons.-->
    <item name="status_bar_icon_scale_factor" format="float" type="dimen">2</item>
</resources>

ステータスバーは特別なウィンドウ処理レイヤに配置されます。そのレイヤには、通知パネル、ユーザー スイッチャー、ヘッドアップ通知(HUN)、キーガードなども含まれます。それらに対応するさまざまなレイアウトは super_status_bar.xml に含まれています。

システム UI ソースコードの変更

システム UI の動作を十分にカスタマイズするために必要な柔軟性が、オーバーレイでは得られない場合があります。

アラート。Android のソースコードに変更を加えると、Android の今後のリリースで、更新が困難になります。コードを直接変更するのではなく Automotive システム UI のコードを拡張することを強くおすすめします。この方法ではすべてのカスタマイズが既知の API サーフェスを介して実装されるため、マージの際の競合を最小限に抑えながら、基盤となる Automotive システム UI のソースコードをアップグレードできます。

システム UI のほとんどの要素は、次の 2 つのエントリ ポイントを通してカスタマイズできます。

  • config_statusBarComponent
  • config_systemUIFactoryComponent

たとえば、CarStatusBar を拡張する com.android.systemui.statusbar.car.custom.CustomCarStatusBar という名前のクラスを作成する場合は、config_statusBarComponent を更新してこの新しいコンポーネントを参照します。このクラスを拡張することにより、システムバーと通知ロジックに関連するほとんどの要素のカスタマイズが可能になります。

同様に、CustomCarSystemUIFactory を作成して config_systemUIFactoryComponent に配置することができます。このクラスを使用することで、VolumeUI とロック画面の機能を更新できます。

ユーザー切り替えとロック解除のカスタマイズ

以下では、ユーザー切り替えエクスペリエンスをカスタマイズする方法について説明します。

用語 説明
キーガード フォアグラウンド アプリの誤操作を防ぐ全画面表示ダイアログ。 複数のユーザーが設定されている場合に、各ユーザーのプライバシーを保護します。
読み込みダイアログ ユーザーを切り替えるときに表示される読み込み画面。
ロック画面、バウンサー PIN、パターン、またはパスワードの入力をユーザーに求める画面。
ユーザー Android ユーザー。
ユーザー選択 デバイスを起動すると表示されるユーザー選択画面。
ユーザー スイッチャー QuickSettings から画面を切り替えるときに表示されるユーザー スイッチャー。

ユーザー切り替えのカスタマイズ

キーガードとバウンサー

Android Automotive OS では、ユーザーがロック画面で [キャンセル] ボタンをクリックした場合にのみ、ユーザー選択が可能なキーガード画面が表示されます。キーガード画面を以下に示します。

キーガード画面

図 1.キーガード画面

デバイスをロック解除するプライバシー タイプをユーザーが選択すると、次のように、バウンサー付きのロック画面が表示されます。

ロック画面

図 2.ロック画面

電源のオン / オフを手動で切り替えるようにロックを設定している場合は、次の命令を使用します。

adb shell input keyevent 26

ユーザー選択

ユーザー選択画面は、車両のシステム UI ステータスバーおよびマップに統合されたデバイスを再起動すると表示されます。詳しくは、FullscreenUserSwitcher をご覧ください。

読み込み画面

図 3. 読み込み画面

この画面のレイアウトは car_fullscreen_user_switcher.xml でカスタマイズできます。

読み込み画面

読み込み画面は、エントリ ポイントに関係なく、ユーザーを切り替えるたびに表示されます。たとえば、ユーザー選択や設定画面などでユーザーを切り替える場合などです。読み込み画面は、フレームワーク システム UI に統合されており、CarUserSwitchingDialog という名前のパブリック クラスにマッピングされます。上の図 3 で例をご覧ください。

テーマは Theme_DeviceDefault_Light_Dialog_Alert_UserSwitchingDialog でカスタマイズできます。

Android ユーザーをセットアップするには、初期設定ウィザードのフローを使用します。このフローを使用することで、ドライバー自身がユーザー名を設定できます。その後ドライバーが Android ユーザーを Google アカウントに関連付けると、そのアカウントからユーザー名が選択されます。ただし、ドライバーが名前(たとえば DriverB)を指定した後にそのユーザー名を Maddy という Google アカウントに関連付けた場合、元の割り当て名(DriverB)は、明示的に設定されたものなので変更されません。ドライバーによる名前の変更は [設定] メニューでのみ可能です。

レイアウトは car_user_switching_dialog.xml. でカスタマイズできます

OEM は、NoActionBar.Fullscreen という名前のテーマを使用して、ステータスとナビゲーション バーを非表示にすることができます(これは、オリジナルのシステム UI を車両リファレンス UI 用にアップデートしたものです)。詳細については、カスタマイズをご覧ください。

OEM はユーザーを切り替えるユーザー インターフェースのエントリ ポイントを提供できますが、場合によっては望ましい結果が得られない可能性があります。その場合、OEM は以下を実施する必要があります。

  1. カスタムの読み込み画面(またはダイアログ)を作成して表示する。
    • UX については、ユーザーが切り替え方法を選択したときにこのカスタムの読み込み画面を起動し、切り替えが完了すると非表示にできるようにします。
    • 必要に応じて優先ウィンドウを設定する必要があります。たとえば、優先度の高いウィンドウ タイプを設定します。Priority 優先度がキーガードの優先度を超えることはできません
  2. config_customuserswitchui で説明されているように、コア フレームワーク config.xmlconfig_customUserSwitchUi=true を設定する。その結果、フレームワークは CarUserSwitchingDialog を表示しなくなります

ロック画面のカスタマイズ

ロック画面は、システム UI に統合されており、OEM はこれをカスタマイズできます。フローをカスタマイズするには、frameworks/base/packages/CarSystemUI/ から開始します。

初回ユーザー設定のカスタマイズ

設定ウィザードでは、初回ユーザー設定を実行できます。これもカスタマイズ可能です。ユーザーを作成するには、UserManager API を使用します。一部のケースでは、これをバックグラウンドで実装して、設定ウィザードを簡素化できます。