OEM 集成指南

本文介紹瞭如何在 VHAL 中處理旋轉輸入、配置您的構建以包含旋轉服務,以及如何在所有應用程序中自定義旋轉體驗。對於OEM預裝的應用程序,例如OEM提供的發射器,看車的用戶界面庫(車的UI庫)

虛擬機

旋轉控制器支持以下操作:

  • 向上、向下、向左和向右輕推。
  • 順時針和逆時針旋轉。
  • 按中心按鈕。
  • 按返回按鈕。
  • 按主頁按鈕。
  • 按其他按鈕,例如電話和媒體。

hardware/interfaces/automotive/vehicle/2.0/types.hal用於在系統屬性的文檔和相應int32Values

VHAL 應處理以下操作:

輕推

當用戶按下旋轉式調節權,VHAL應該使用HW_KEY_INPUT具有以下屬性int32Values發送事件到Android:

  1. ACTION_DOWN
  2. KEYCODE_SYSTEM_NAVIGATION_RIGHT
  3. 目標顯示。

當用戶釋放所述旋轉控制器,所述VHAL應該使用相同的屬性和密鑰號碼與ACTION_UP 。其他方向的微調應使用相應的鍵碼。

對角線沒有鍵碼,但如果硬件支持對角線,VHAL 可以結合水平和垂直事件來產生對角線。例如,向上和向左輕推應該會產生:

  • HW_KEY_INPUT KEYCODE_SYSTEM_NAVIGATION_LEFT ACTION_DOWN
  • HW_KEY_INPUT KEYCODE_SYSTEM_NAVIGATION_UP ACTION_DOWN

以任一順序(以及隨後)釋放旋轉控制器應產生:

  • HW_KEY_INPUT KEYCODE_SYSTEM_NAVIGATION_LEFT ACTION_UP
  • HW_KEY_INPUT KEYCODE_SYSTEM_NAVIGATION_UP ACTION_UP

用戶可以在釋放之前沿垂直方向推動旋轉控制器。例如,以下場景:

垂直方向
圖1垂直的方向

這應該生成以下事件序列:

  1. HW_KEY_INPUT KEYCODE_SYSTEM_NAVIGATION_LEFT ACTION_DOWN
  2. HW_KEY_INPUT KEYCODE_SYSTEM_NAVIGATION_UP ACTION_DOWN
  3. HW_KEY_INPUT KEYCODE_SYSTEM_NAVIGATION_LEFT ACTION_UP
  4. HW_KEY_INPUT KEYCODE_SYSTEM_NAVIGATION_UP ACTION_UP

而旋轉控制器在一個方向上舉行應當產生不重複的事件。

旋轉

當用戶旋轉旋轉控制器順時針由一個止動器(點擊),則VHAL應該使用HW_ROTARY_INPUT與下列屬性int32Values發送事件到Android:

  1. ROTARY_INPUT_TYPE_SYSTEM_NAVIGATION
  2. 一 (1) 個制動器。
  3. 目標顯示。

事件的時間戳應設置為以納秒為單位的經過時間。

一 (1) 個棘爪逆時針旋轉應生成相同的事件,但棘爪數量為 -1。

如果在同一方向上的多個旋轉制動器快速連續發生,則 VHAL 應將製動器組合為單個事件,以免系統因事件而過載。在這種情況下,事件的時間戳應該是第一次旋轉制動發生的時間。該int32Values應包括旋轉連續制動器之間納秒數。

例如,以下旋轉序列:

  • 在時間 t0,用戶逆時針旋轉一個棘爪。
  • 在時間 t0 + 5 ns 時,用戶逆時針旋轉一個棘爪。
  • 在時間 t0 + 8 ns 時,用戶逆時針旋轉一個棘爪。

應該生成這個事件:

  • 物業: HW_ROTARY_INPUT
  • 時間戳: t0
  • int32Values
    1. ROTARY_INPUT_TYPE_SYSTEM_NAVIGATION
    2. -3(逆時針三個棘爪)。
    3. 目標顯示。
    4. 第一個和第二個棘爪之間有 5 ns。
    5. 第二個和第三個棘爪之間有 3 ns。

中心按鈕

當用戶按下中間按鈕,將VHAL應該使用HW_KEY_INPUT具有以下屬性int32Values發送事件到Android:

  1. ACTION_DOWN
  2. KEYCODE_DPAD_CENTER
  3. 目標顯示。

當用戶釋放所述旋轉控制器,所述VHAL應該使用相同的屬性和密鑰號碼與ACTION_UP

當中央按鈕被按下不產生重複的事件。

返回鍵

當用戶按下後退按鈕時,VHAL應該使用HW_KEY_INPUT具有以下屬性int32Values發送事件到Android:

  1. ACTION_DOWN
  2. KEYCODE_BACK
  3. 目標顯示。

當用戶釋放所述旋轉控制器,所述VHAL應該使用相同的屬性和密鑰號碼與ACTION_UP

而中心按鈕被按下應該不會產生重複的事件。

主頁按鈕

處理Home鍵,你會後退按鈕但KEYCODE_HOME而不是KEYCODE_BACK

其他按鈕

如果旋轉控制器包含任何其他按鈕,則 VHAL 可以處理它們,但 OEM 喜歡,因為從 Android 的角度來看,它們不被視為旋轉的一部分。這些通常像後退和主頁按鈕一樣處理,但具有不同的鍵碼。例如, KEYCODE_CALLKEYCODE_MUSIC

構建配置

旋轉導航被稱為輔助服務提供RotaryService 。要將此服務包含在您設備的系統映像中,請將以下行添加到您的 makefile 中:

PRODUCT_PACKAGES += CarRotaryController

您可能還希望在調試版本中包含以下包:

  • RotaryPlayground對旋轉的參考應用程序(見RotaryPlayground )。
  • RotaryIME演示旋轉IME(見輸入法編輯器)。
  • CarRotaryImeRRO用於疊加RotaryIME

當設備啟動和發生用戶切換時,會自動啟用旋轉服務。這確保用戶可以在設置期間使用旋轉控制器。

如果您使用汽車相同的構建有和沒有一個旋轉控制器,加CarRotaryController如上圖所示,以便必要的代碼包含在構建中。為了防止在非旋轉車被啟用旋轉的服務,創建一個靜態RRO以覆蓋rotaryService在字符串資源packages/services/Car/service有一個空字符串。對於旋轉和非旋轉設備,您將使用相同的構建,但具有不同的產品配置。只有後者包括覆蓋。

定制

OEM 可以通過以下位置的資源疊加來自定義焦點查找邏輯、焦點突出顯示和一些附加項:

  • 汽車的UI庫位於packages/apps/Car/libs/car-ui-lib
  • RotaryService位於packages/apps/Car/RotaryController
  • Core位於frameworks/base/core

輕推歷史

OEM 可以配置是否啟用兩種微移歷史記錄中的每一種,如果啟用,還可以配置緩存大小和過期策略。這一切都是通過覆蓋各種 car-ui-library 資源來完成的。

焦點歷史緩存

(11的Android QPR3,機器人11汽車,機器人12)
這per- FocusArea緩存存儲最近的內集中視圖, FocusArea ,以便它可以輕推回時集中FocusArea 。可以通過覆蓋以下 car-ui-library 資源來配置此緩存:

  • car_ui_focus_history_cache_type
    1. 緩存被禁用。
    2. 緩存將在一段時間後過期(見下文)。
    3. 緩存永遠不會過期。
  • car_ui_focus_history_expiration_period_ms :如果緩存類型設置為兩(2)緩存過期之前多少毫秒(見上文)。

FocusArea 歷史緩存

(11的Android QPR3,機器人11汽車,機器人12)
該高速緩存存儲的微移的歷史記錄,因此在相反的方向輕推可以將焦點移回到同一FocusArea 。可以通過覆蓋以下 car-ui-library 資源來配置此緩存:

  • car_ui_focus_area_history_cache_type
    1. 緩存被禁用。
    2. 緩存在一段時間後過期(見下文)。
    3. 緩存永不過期。
  • car_ui_focus_area_history_expiration_period_ms :如果緩存類型設置為2緩存到期之前多少毫秒(見上文)。
  • car_ui_clear_focus_area_history_when_rotating :是否當用戶旋轉控制器無效緩存。

迴轉

(11的Android QPR3,機器人11汽車,機器人12)
OEM可以在覆蓋兩個整資源RotaryService指定是否有加速度,諸如鼠標加速,旋轉:

  • rotation_acceleration_3x_ms :時間間隔(毫秒)用於決定谷歌是否應該加速旋轉的制動控制器旋轉。如果本次卡頓與上一次旋轉卡頓的間隔小於該值,則按三輪卡頓處理。將此設置為 2147483647 以禁用 3 倍加速。
  • rotation_acceleration_2x_ms :以類似rotation_acceleration_3x_ms 。用於 2 倍加速度。將其設置為2147483647至禁用2×加速度。

加速時效果最好有每個旋轉制動單個時間戳,因為需要由VHAL。如果這些都沒有用, RotaryService假設旋轉掣子間隔均勻。

/**
     * Property to feed H/W rotary events to android
     *
     * int32Values[0] : RotaryInputType identifying which rotary knob rotated
     * int32Values[1] : number of detents (clicks), positive for clockwise,
     *                  negative for counterclockwise
     * int32Values[2] : target display defined in VehicleDisplay. Events not
     *                  tied to specific display must be sent to
     *                  VehicleDisplay#MAIN.
     * int32values[3 .. 3 + abs(number of detents) - 2]:
     *                  nanosecond deltas between pairs of consecutive detents,
     *                  if the number of detents is > 1 or < -1
     *
     * VehiclePropValue.timestamp: when the rotation occurred. If the number of
     *                             detents is > 1 or < -1, this is when the
     *                             first detent of rotation occurred.
     *
     * @change_mode VehiclePropertyChangeMode:ON_CHANGE
     * @data_enum RotaryInputType
     * @access VehiclePropertyAccess:READ
     */
    HW_ROTARY_INPUT = (
        0x0A20
        | VehiclePropertyGroup:SYSTEM
        | VehiclePropertyType:INT32_VEC
        | VehicleArea:GLOBAL),

重點突出

OEM 可以覆蓋 Android 框架中的默認焦點突出顯示和 car-ui-library 中的幾個焦點突出顯示資源。

默認焦點突出顯示

Android的框架通過屬性的默認焦點亮點selectableItemBackground 。在Theme.DeviceDefault ,這個屬性是指item_background.xmlCore 。 OEM可以覆蓋item_background.xml更改默認的焦點亮點繪製。

這種可拉伸通常應該是StateListDrawable ,其調節基於狀態的不同組合,包括背景android:state_focusedandroid:state_pressed 。當用戶使用旋轉控制器集中的圖, android:state_focused將是true的,但android:state_pressed將是false 。如果用戶然後按壓旋轉式調節器上的中央按鈕,這兩個android:state_focusedandroid:state_pressed將是true ,而用戶持有的按鈕了。當用戶釋放按鈕時,只有android:state_focused仍將true

汽車的UI庫使用來源於一個主題Theme.DeviceDefault 。其結果是,這種疊加影響使用這個庫,並使用源自任何主題的應用程序的應用程序Theme.DeviceDefault 。這不會影響使用無關主題的應用程序,如Theme.Material

在car-ui-library中聚焦高亮資源

OEM可以覆蓋幾款車的UI庫資源來控制如何與非矩形的意見的焦點高亮外觀(如圓形或丸狀)重點突出和在使用一個主題的應用程序,不從派生Theme.DeviceDefault 。這些資源應該覆蓋這樣聚焦的亮點是一致的默認焦點亮點繪製。

(11的Android QPR3,機器人11汽車,機器人12)
下列資源是用來表示當一個視圖集中,但未按

  • car_ui_rotary_focus_fill_color :填充顏色。
  • car_ui_rotary_focus_stroke_color :輪廓顏色。
  • car_ui_rotary_focus_stroke_width :輪廓的厚度。

(11的Android QPR3,機器人11汽車,機器人12)
以下資源用於指示當一個視圖被聚焦壓:

  • car_ui_rotary_focus_pressed_fill_color :填充顏色。
  • car_ui_rotary_focus_pressed_stroke_color :輪廓顏色。
  • car_ui_rotary_focus_pressed_stroke_width :輪廓的厚度。

有時,按鈕會被賦予純色背景以引起用戶的注意,如示例所示。這可能會使焦點突出顯示難以看到。

具有純色背景的按鈕
圖2.按鈕用固體背景

在這種情況下,開發者可以指定一個自定義焦點採用二次顏色來顯示:
  • (11的Android QPR3,機器人11汽車,機器人12)
    car_ui_rotary_focus_fill_secondary_color
    car_ui_rotary_focus_stroke_secondary_color
  • 機器人12)
    car_ui_rotary_focus_pressed_fill_secondary_color
    car_ui_rotary_focus_pressed_stroke_secondary_color

任何顏色都可以是透明的,並且任何一個維度都可以為零,例如,如果您只需要填充或只需要輪廓。

焦點區域高亮

(11的Android QPR3,機器人11汽車,機器人12)
FocusArea可以得出兩種類型的亮點時,其後代的一個被聚焦。如果需要,兩者可以結合使用。此功能在 AOSP 中默認禁用,但可以通過覆蓋 car-ui-library 資源啟用:

  • car_ui_enable_focus_area_foreground_highlight :在上面畫一個亮點FocusArea及其後代。在AOSP,這是繪製圍繞大綱FocusArea 。 OEM廠商可以覆蓋car_ui_focus_area_foreground_highlight繪製。
  • car_ui_enable_focus_area_background_highlight :在上面畫一個亮點FocusArea但其後代後面。在 AOSP 中,此 drawable 是實心填充。 OEM廠商可以覆蓋car_ui_focus_area_background_highlight繪製。

輸入法編輯器

輸入法編輯器 (IME) 是輸入法。例如,屏幕鍵盤。

(11的Android QPR3,機器人11汽車,機器人12)
該OEM必須疊加default_touch_input_method的字符串資源RotaryService指定ComponentName的基於觸摸的輸入法。例如,如果使用OEM提供與Android汽車的IME,應指定com.google.android.apps.automotive.inputmethod/.InputMethodService

(11的Android QPR3,機器人11汽車,機器人12)
如果OEM已經建立了一個IME專門為旋轉式,應指定其ComponentNamerotary_input_method資源。如果此資源被覆蓋,則每當用戶通過旋轉控制器的輕推、旋轉和中心按鈕與主機交互時,將使用指定的 IME。當用戶觸摸屏幕時,將使用之前的 IME。 Back 按鈕(和旋轉控制器上的其他按鈕)對 IME 選擇沒有影響。如果此資源未覆蓋,則不會發生 IME 切換。 Carboard 不支持旋轉,因此如果 OEM 未提供旋轉 IME,用戶將無法通過旋轉控制器輸入文本。

RotaryIME是一個演示旋轉IME。雖然是基本的,但嘗試上述自動 IME 切換就足夠了。對於源代碼RotaryIME可以發現packages/apps/Car/tests/RotaryIME/

屏幕外輕推

默認情況下,當用戶嘗試移開屏幕邊緣時,什麼也不會發生。 OEM 可以通過指定以下任意組合來配置四個方向中的每個方向應該發生的情況:

  1. 通過定義的全球行動AccessibilityService 。例如, GLOBAL_ACTION_BACK
  2. 一個關鍵碼,如KEYCODE_BACK
  3. 啟動表示為 URL 的活動的意圖。

(11的Android QPR3,機器人11汽車,機器人12)
這些是通過重疊在以下數組資源指定RotaryService

  • off_screen_nudge_global_actions :全球行動的陣列當用戶輕推向上,向下,向左或向右關閉屏幕的邊緣進行。如果此數組的相關元素為 -1,則不執行全局操作。
  • off_screen_nudge_key_codes :在單擊事件的鍵碼陣列當用戶輕推向上,向下,向左或向右關閉屏幕的邊緣注入。如果該數組的相關元件是0(無事件被注入KEYCODE_UNKNOWN )。
  • off_screen_nudge_intents :意圖當用戶輕推向上,向下推出一個活動的陣列,左,或右關閉屏幕的邊緣。如果此數組的相關元素為空,則不會啟動任何活動。

其他配置

您應覆蓋以下RotaryService資源:

  • (11的Android QPR3,機器人11汽車,機器人12)
    config_showHeadsUpNotificationOnBottom :布爾值來表示是否抬頭通知應該在底部被顯示,而不是頂部。這必須有相同的值config_showHeadsUpNotificationOnBottom布爾資源frameworks/base/packages/CarSystemUI/res/values/config.xml
  • (11的Android QPR3,機器人11汽車,機器人12)
    notification_headsup_card_margin_horizontal :左,右頁邊距為抬頭通知窗口。這必須有相同的值notification_headsup_card_margin_horizontal在捫資源packages/apps/Car/Notification/res/values/dimens.xml
  • 機器人12)
    excluded_application_overlay_window_titles :這不應該被視為窗口重疊的窗口標題的數組。這應該包括應用程序窗口標題代表TaskViewsTaskDisplayAreas 。默認情況下,此列表僅包含“地圖”。

您可以覆蓋以下RotaryService資源:

  • (11的Android QPR3,機器人11汽車,機器人12)
    long_press_ms :整數值來表示中心按鈕多少毫秒必須按住觸發長按。零表示應使用系統默認的長按超時。這是默認值。