OEM'ler için Entegrasyon Kılavuzu

Bu makale, VHAL'daki döner girişlerin nasıl işleneceğini, yapınızı döner hizmeti içerecek şekilde nasıl yapılandıracağınızı ve tüm uygulamalarda döner deneyimi nasıl özelleştireceğinizi açıklar. OEM tarafından sağlanan başlatıcı gibi önceden yüklenmiş OEM uygulamaları için bkz.

VHAL

Döner bir kontrolör aşağıdaki eylemleri destekler:

  • Yukarı, aşağı, sola ve sağa sürükleyin.
  • Saat yönünde ve saat yönünün tersine döndürün.
  • Ortadaki düğmeye basın.
  • Geri tuşuna basınız.
  • Ana Sayfa düğmesine basın.
  • Telefon ve Medya gibi diğer düğmelere basın.

Sistem özellikleri ve ilgili int32Values ​​ile ilgili belgeler için hardware/interfaces/automotive/vehicle/2.0/types.hal adresine bakın.

VHAL şu eylemleri gerçekleştirmelidir:

Dürtmek

Kullanıcı döner denetleyiciyi sağa ittiğinde, VHAL, Android'e bir olay göndermek için aşağıdaki int32Values ​​ile HW_KEY_INPUT özelliğini kullanmalıdır:

  1. ACTION_DOWN
  2. KEYCODE_SYSTEM_NAVIGATION_RIGHT
  3. Hedef gösterimi.

Kullanıcı döner denetleyiciyi bıraktığında, VHAL, ACTION_UP ile aynı özelliği ve anahtar kodunu kullanmalıdır. Diğer yönlerdeki dürtmeler, karşılık gelen anahtar kodlarını kullanmalıdır.

Köşegenler için anahtar kodlar yoktur, ancak donanım köşegenleri destekliyorsa VHAL yatay ve dikey bir olayı bir köşegen oluşturmak için birleştirebilir. Örneğin, yukarı ve sola doğru dürtmek şunları üretmelidir:

  • HW_KEY_INPUT KEYCODE_SYSTEM_NAVIGATION_LEFT ACTION_DOWN
  • HW_KEY_INPUT KEYCODE_SYSTEM_NAVIGATION_UP ACTION_DOWN

Her iki sırada da (ve ardından) döner kontrolörün serbest bırakılması şunları üretmelidir:

  • HW_KEY_INPUT KEYCODE_SYSTEM_NAVIGATION_LEFT ACTION_UP
  • HW_KEY_INPUT KEYCODE_SYSTEM_NAVIGATION_UP ACTION_UP

Kullanıcı, serbest bırakmadan önce döner kumandayı dikey yönde itebilir. Örneğin, aşağıdaki senaryo:

dik yön
Şekil 1. Dikey yön

Bu, aşağıdaki olay dizisini oluşturmalıdır:

  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

Döner kontrolör bir yönde tutulurken hiçbir tekrar olayı oluşturulmamalıdır.

Döndür

Kullanıcı döner kontrol cihazını saat yönünde bir kademe (klik) kadar döndürdüğünde, VHAL, Android'e bir olay göndermek için aşağıdaki int32Values ​​ile HW_ROTARY_INPUT özelliğini kullanmalıdır:

  1. ROTARY_INPUT_TYPE_SYSTEM_NAVIGATION
  2. Bir (1) tetik.
  3. Hedef gösterimi.

Olayın zaman damgası, nanosaniye cinsinden geçen süreye ayarlanmalıdır.

Saat yönünün tersine bir (1) kademeli dönüş aynı olayı oluşturmalıdır, ancak tetik sayısı için -1 olmalıdır.

Hızlı bir şekilde aynı yönde birden fazla dönüş tetiklemesi meydana gelirse, VHAL, sistemi olaylarla aşırı yüklememek için kilitleri tek bir olayda birleştirmelidir. Bu durumda, olayın zaman damgası, ilk döndürme hareketinin gerçekleştiği zaman olmalıdır. int32Values , ardışık dönme süreleri arasındaki nanosaniye sayısını içermelidir.

Örneğin, aşağıdaki döndürme sırası:

  • t0 anında, kullanıcı saat yönünün tersine bir mandal döndürdü.
  • t0 + 5 ns zamanında, kullanıcı saat yönünün tersine bir mandal döndürdü.
  • t0 + 8 ns zamanında, kullanıcı saat yönünün tersine bir mandal döndürdü.

bu olayı oluşturmalıdır:

  • Mülk: HW_ROTARY_INPUT
  • Zaman damgası: t0
  • int32Values ​​:
    1. ROTARY_INPUT_TYPE_SYSTEM_NAVIGATION
    2. -3 (saat yönünün tersine üç tetik).
    3. Hedef gösterimi.
    4. Birinci ve ikinci kilit arasında 5 ns.
    5. İkinci ve üçüncü tetik arasında 3 ns.

orta düğme

Kullanıcı ortadaki düğmeye bastığında, VHAL, Android'e bir olay göndermek için aşağıdaki int32Values ​​ile HW_KEY_INPUT özelliğini kullanmalıdır:

  1. ACTION_DOWN
  2. KEYCODE_DPAD_CENTER
  3. Hedef gösterimi.

Kullanıcı döner denetleyiciyi bıraktığında, VHAL, ACTION_UP ile aynı özelliği ve anahtar kodunu kullanmalıdır.

Ortadaki düğme basılı tutulduğunda tekrarlanan olaylar oluşturmayın.

Geri düğmesi

Kullanıcı Geri düğmesine bastığında, VHAL, Android'e bir olay göndermek için aşağıdaki int32Values ​​ile HW_KEY_INPUT özelliğini kullanmalıdır:

  1. ACTION_DOWN
  2. KEYCODE_BACK
  3. Hedef gösterimi.

Kullanıcı döner denetleyiciyi bıraktığında, VHAL, ACTION_UP ile aynı özelliği ve anahtar kodunu kullanmalıdır.

Ortadaki düğme basılı tutulurken hiçbir tekrar olayı oluşturulmamalıdır.

Ana menü tuşu

Ana Sayfa düğmesini Geri düğmesi gibi kullanın, ancak KEYCODE_HOME yerine KEYCODE_BACK ile.

Diğer düğmeler

Döner kontrolör herhangi bir ek düğme içeriyorsa, VHAL bunları OEM'in istediği şekilde kullanabilir, çünkü bunlar Android açısından döndürmenin bir parçası olarak kabul edilmez. Bunlar tipik olarak Geri ve Ana Sayfa düğmeleri gibi işlenir, ancak farklı tuş kodları ile. Örneğin, KEYCODE_CALL veya KEYCODE_MUSIC .

Yapı yapılandırması

Rotary navigasyon, RotaryService adlı bir erişilebilirlik hizmeti tarafından sağlanır. Bu hizmeti cihazınızın sistem görüntüsüne dahil etmek için makefile dosyanıza aşağıdaki satırı ekleyin:

PRODUCT_PACKAGES += CarRotaryController

Hata ayıklama yapılarına aşağıdaki paketleri de dahil etmek isteyebilirsiniz:

Döner hizmet, cihaz önyüklendiğinde ve bir kullanıcı geçişi gerçekleştiğinde otomatik olarak etkinleştirilir. Bu, kullanıcının kurulum sırasında döner kontrol cihazını kullanabilmesini sağlar.

Döner kontrol cihazı olan ve olmayan araçlar için aynı yapıyı kullanıyorsanız, gerekli kodun yapıya dahil edilmesi için yukarıda gösterildiği gibi CarRotaryController ekleyin. Döner hizmetin döner olmayan araçlarda etkinleştirilmesini önlemek için, packages/services/Car/service içindeki rotaryService dizisi kaynağını boş bir dizeyle kaplamak için statik bir RRO oluşturun. Döner ve döner olmayan cihazlar için aynı yapıyı kullanacaksınız, ancak farklı ürün konfigürasyonlarına sahip olacaksınız. Yalnızca ikincisi kaplamayı içerir.

özelleştirme

OEM'ler, aşağıdaki konumlardaki kaynak katmanları aracılığıyla odak bulma mantığını, odak vurgusunu ve bazı ek öğeleri özelleştirebilir:

  • car-ui-library, packages/apps/Car/libs/car-ui-lib bulunur
  • RotaryService , packages/apps/Car/RotaryController
  • Core , frameworks/base/core içinde bulunur

dürtme geçmişi

OEM, iki tür dürtme geçmişinin etkinleştirilip etkinleştirilmeyeceğini ve etkinse önbellek boyutunu ve sona erme ilkesini yapılandırabilir. Tüm bunlar, çeşitli araç-ui-kütüphane kaynaklarını geçersiz kılarak yapılır.

Odak geçmişi önbelleği

( Android 11 QPR3, Android 11 Araba, Android 12 )
Bu FocusArea önbelleği, FocusArea'ya geri dönerken odaklanabilmesi için FocusArea içinde en son odaklanılan görünümü FocusArea . Bu önbellek, aşağıdaki araç-ui-kütüphane kaynakları üst üste bindirilerek yapılandırılabilir:

  • car_ui_focus_history_cache_type :
    1. Önbellek devre dışı.
    2. Bir süre sonra önbelleğin süresi dolacak (aşağıya bakın).
    3. Önbelleğin süresi asla dolmaz.
  • car_ui_focus_history_expiration_period_ms : Önbellek türü iki (2) olarak ayarlandıysa önbelleğin süresinin dolmasına kaç milisaniye kaldı (yukarıya bakın).

FocusArea geçmiş önbelleği

( Android 11 QPR3, Android 11 Araba, Android 12 )
Bu önbellek, dürtmelerin geçmişini saklar, böylece ters yönde dürtme, odağı aynı FocusArea . Bu önbellek, aşağıdaki araç-ui-kütüphane kaynakları üst üste bindirilerek yapılandırılabilir:

  • car_ui_focus_area_history_cache_type :
    1. Önbellek devre dışı.
    2. Bir süre sonra önbelleğin süresi dolar (aşağıya bakın).
    3. Önbellek asla sona ermez.
  • car_ui_focus_area_history_expiration_period_ms : Önbellek türü 2 olarak ayarlanmışsa önbelleğin süresinin dolmasına kaç milisaniye var (yukarıya bakın).
  • car_ui_clear_focus_area_history_when_rotating : Kullanıcı denetleyiciyi döndürdüğünde önbelleğin geçersiz olup olmayacağı.

döndürme

( Android 11 QPR3, Android 11 Araba, Android 12 )
OEM, döndürme için fare hızlandırması gibi hızlandırma olup olmadığını belirtmek için RotaryService iki tamsayı kaynağını geçersiz kılabilir:

  • rotation_acceleration_3x_ms : Google'ın bir dönüş sabitliği için kontrolör dönüşünü hızlandırıp hızlandırmayacağına karar vermek için kullanılan zaman aralığı (milisaniye cinsinden). Bu kilit ile önceki dönme mesafesi arasındaki aralık bu değerden küçükse, üç dönme hareketi olarak kabul edilecektir. 3× hızlandırmayı devre dışı bırakmak için bunu 2147483647 olarak ayarlayın.
  • rotation_acceleration_2x_ms : rotation_acceleration_3x_ms ile benzer. 2× hızlanma için kullanılır. 2× hızlandırmayı devre dışı bırakmak için bunu 2147483647 olarak ayarlayın.

Hızlandırma, VHAL'ın gerektirdiği şekilde, her bir dönüş ayarı için ayrı zaman damgaları olduğunda en iyi sonucu verir. Bunlar mevcut değilse, RotaryService , dönme kilitlerinin eşit aralıklı olduğunu varsayar.

/**
     * 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),

Odak vurgusu

OEM, Android çerçevesindeki varsayılan odak vurgusunu ve araç kullanıcı arabirimi kitaplığındaki birkaç odak vurgusu kaynağını geçersiz kılabilir.

Varsayılan odak vurgusu

Android çerçevesi, selectableItemBackground özniteliği aracılığıyla varsayılan bir odak vurgusu sağlar. Theme.DeviceDefault bu öznitelik, item_background.xml Core OEM, çizilebilir varsayılan odak vurgusunu değiştirmek için item_background.xml .

Bu çizilebilir, tipik olarak, arka planı android:state_focused ve android:state_pressed dahil olmak üzere farklı durum kombinasyonlarına göre ayarlayan bir StateListDrawable olmalıdır. Kullanıcı bir görünüme odaklanmak için döner denetleyiciyi kullandığında, android:state_focused true olur, ancak android:state_pressed false olur. Kullanıcı daha sonra döner kumanda üzerindeki orta düğmeye basarsa, kullanıcı düğmeyi basılı tutarken hem android:state_focused hem de android: android:state_pressed true olacaktır. Kullanıcı düğmeyi bıraktığında, yalnızca android:state_focused true olarak kalacaktır.

car-ui-library, Theme.DeviceDefault türetilen bir tema kullanır. Sonuç olarak, bu kaplama, bu kitaplığı kullanan uygulamaları ve Theme.DeviceDefault türetilen herhangi bir temayı kullanan uygulamaları etkiler. Theme.Material gibi alakasız bir tema kullanan uygulamaları etkilemez.

Araç kullanıcı arabirimi kitaplığında vurgulanan kaynaklara odaklanın

OEM, odak vurgusunun dikdörtgen olmayan (yuvarlak veya hap şeklinde) bir odak vurgusu olan görünümlerde ve Theme.DeviceDefault türetilmeyen bir temayı kullanan uygulamalarda nasıl görüneceğini kontrol etmek için birkaç araç-ui kitaplığı kaynağını geçersiz kılabilir Theme.DeviceDefault . Bu kaynaklar, odak vurgusunun çizilebilir varsayılan odak vurgusu ile tutarlı olması için üst üste bindirilmelidir.

( Android 11 QPR3, Android 11 Araba, Android 12 )
Bir görünüme odaklanıldığını ancak basılmadığını belirtmek için aşağıdaki kaynaklar kullanılır:

  • car_ui_rotary_focus_fill_color : Dolgu rengi.
  • car_ui_rotary_focus_stroke_color : Anahat rengi.
  • car_ui_rotary_focus_stroke_width : Anahatın kalınlığı.

( Android 11 QPR3, Android 11 Araba, Android 12 )
Bir görünüme odaklanıldığında ve basıldığında bunu belirtmek için aşağıdaki kaynaklar kullanılır:

  • car_ui_rotary_focus_pressed_fill_color : Dolgu rengi.
  • car_ui_rotary_focus_pressed_stroke_color : Anahat rengi.
  • car_ui_rotary_focus_pressed_stroke_width : Anahatın kalınlığı.

Bazen, gösterilen örnekte olduğu gibi, kullanıcının dikkatine sunmak için bir düğmeye düz bir arka plan rengi verilir. Bu, odak vurgusunun görülmesini zorlaştırabilir.

Düz arka plana sahip düğme
Şekil 2. Düz arka plana sahip düğme

Bu durumda geliştirici, ikincil renkleri kullanarak özel bir odak vurgusu belirleyebilir:
  • ( Android 11 QPR3, Android 11 Araba, Android 12 )
    car_ui_rotary_focus_fill_secondary_color
    car_ui_rotary_focus_stroke_secondary_color
  • ( Android 12 )
    car_ui_rotary_focus_pressed_fill_secondary_color
    car_ui_rotary_focus_pressed_stroke_secondary_color

Renklerden herhangi biri saydam olabilir ve örneğin yalnızca bir dolgu veya yalnızca bir anahat istiyorsanız, boyutlardan herhangi biri sıfır olabilir.

FocusArea vurgusu

( Android 11 QPR3, Android 11 Araba, Android 12 )
FocusArea , torunlarından biri odaklandığında iki tür vurgu çizebilir. İstenirse ikisi birlikte kullanılabilir. Bu özellik AOSP'de varsayılan olarak devre dışıdır, ancak araç kullanıcı arabirimi kitaplığı kaynakları geçersiz kılınarak etkinleştirilebilir:

  • car_ui_enable_focus_area_foreground_highlight : FocusArea ve alt öğelerinin üzerine bir vurgu çizin. AOSP'de bu çizim, FocusArea çevresinde bir taslaktır. OEM'ler car_ui_focus_area_foreground_highlight geçersiz kılabilir.
  • car_ui_enable_focus_area_background_highlight : FocusArea üstüne ama onun soyundan gelenlerin arkasına bir vurgu çizin. AOSP'de bu çizilebilirlik katı bir dolgudur. OEM'ler car_ui_focus_area_background_highlight geçersiz kılabilir.

Giriş Yöntemi Düzenleyicileri

Giriş Yöntemi Düzenleyicileri (IME), giriş yöntemleridir. Örneğin, bir ekran klavyesi.

( Android 11 QPR3, Android 11 Araba, Android 12 )
OEM, dokunmatik tabanlı IME'nin ComponentName belirtmek için RotaryService default_touch_input_method dize kaynağını kaplamalıdır. Örneğin, OEM, Android Automotive ile sağlanan IME'yi kullanıyorsa, com.google.android.apps.automotive.inputmethod/.InputMethodService belirtmelidir.

( Android 11 QPR3, Android 11 Araba, Android 12 )
OEM, özellikle döndürme için bir IME oluşturduysa, rotary_input_method ComponentName belirtmelidir. Bu kaynak üst üste bindirilirse, belirtilen IME, kullanıcı döner kontrolörün dürtme, döndürme ve Merkez düğmesi aracılığıyla ana ünite ile etkileşim kurduğunda kullanılır. Kullanıcı ekrana dokunduğunda önceki IME kullanılacaktır. Geri düğmesinin (ve döner kumanda üzerindeki diğer düğmelerin) IME seçimi üzerinde hiçbir etkisi yoktur. Bu kaynak kaplanmamışsa, IME geçişi gerçekleşmez. Carboard, döndürmeyi desteklemediğinden, OEM döner bir IME sağlamadıysa, kullanıcı döner denetleyici aracılığıyla metin giremez.

RotaryIME , bir demo döner IME'dir. Temel olmakla birlikte, yukarıda açıklanan otomatik IME değiştirmeyi denemek yeterlidir. RotaryIME için kaynak kodu package packages/apps/Car/tests/RotaryIME/ içinde bulunabilir.

Ekran dışı dürtmeler

Varsayılan olarak, kullanıcı ekranın kenarından uzaklaşmaya çalıştığında hiçbir şey olmuyor. OEM, aşağıdakilerin herhangi bir kombinasyonunu belirterek dört yönün her biri için ne olması gerektiğini yapılandırabilir:

  1. AccessibilityService Hizmeti tarafından tanımlanan küresel bir eylem. Örneğin, GLOBAL_ACTION_BACK .
  2. KEYCODE_BACK gibi bir anahtar kodu.
  3. URL olarak temsil edilen bir etkinliği başlatma niyeti.

( Android 11 QPR3, Android 11 Araba, Android 12 )
Bunlar, RotaryService aşağıdaki dizi kaynakları üst üste bindirilerek belirtilir:

  • off_screen_nudge_global_actions : Kullanıcı ekranın kenarından yukarı, aşağı, sola veya sağa dürttüğünde gerçekleştirilecek genel eylemler dizisi. Bu dizinin ilgili elemanı -1 ise global bir işlem yapılmaz.
  • off_screen_nudge_key_codes : Kullanıcı ekranın kenarında yukarı, aşağı, sola veya sağa doğru dürttüğünde enjekte edilecek tıklama olaylarının anahtar kodları dizisi. Bu dizinin ilgili öğesi 0 ( KEYCODE_UNKNOWN ) ise hiçbir olay enjekte edilmez.
  • off_screen_nudge_intents : Kullanıcı ekranın kenarından yukarı, aşağı, sola veya sağa doğru dürttüğünde bir etkinlik başlatma niyeti dizisi. Bu dizinin ilgili elemanı boşsa hiçbir aktivite başlatılmaz.

Diğer konfigürasyonlar

Aşağıdaki RotaryService kaynaklarını üst üste bindirmelisiniz:

  • ( Android 11 QPR3, Android 11 Araba, Android 12 )
    config_showHeadsUpNotificationOnBottom : Uyarı bildirimlerinin üstte değil altta gösterilip gösterilmeyeceğini gösteren Boole değeri. Bu, frameworks/base/packages/CarSystemUI/res/values/config.xml içindeki config_showHeadsUpNotificationOnBottom Boole kaynağı ile aynı değere sahip olmalıdır
  • ( Android 11 QPR3, Android 11 Araba, Android 12 )
    notification_headsup_card_margin_horizontal : Head-up bildirim penceresi için sol ve sağ kenar boşluğu. Bu, packages/apps/Car/Notification/res/values/dimens.xml notification_headsup_card_margin_horizontal ile aynı değere sahip olmalıdır
  • ( Android 12 )
    excluded_application_overlay_window_titles : Bindirmeli pencereler olarak kabul edilmemesi gereken bir dizi pencere başlığı. Bu, TaskViews veya TaskDisplayAreas temsil eden uygulama pencerelerinin başlıklarını içermelidir. Varsayılan olarak, bu liste yalnızca "Haritalar" içerir.

Aşağıdaki RotaryService kaynağını kaplayabilirsiniz:

  • ( Android 11 QPR3, Android 11 Araba, Android 12 )
    long_press_ms : Uzun basmayı tetiklemek için ortadaki düğmenin kaç milisaniye basılı tutulması gerektiğini gösteren tamsayı değeri. Sıfır, sistem varsayılan uzun basma zaman aşımının kullanılması gerektiğini belirtir. Bu varsayılan değerdir.