OEM'ler için entegrasyon kılavuzu

Bu sayfada, VHAL'de döner girişlerin nasıl işleneceği, yapınızın döner hizmetini içerecek şekilde nasıl yapılandırılacağı ve tüm uygulamalarda döner deneyiminin nasıl özelleştirileceği açıklanmaktadır. OEM tarafından sağlanan başlatıcı gibi önceden yüklenmiş OEM uygulamaları için bkz . Araç Kullanıcı Arayüzü Kitaplığı (araç kullanıcı arayüzü kitaplığı) .

VHAL

Döner denetleyici aşağıdaki eylemleri destekler:

  • Yukarı, aşağı, sola ve sağa itin.
  • Saat yönünde ve saat yönünün tersine döndürün.
  • Orta 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 karşılık gelen int32Values ​​ile ilgili belgeler için hardware/interfaces/automotive/vehicle/2.0/types.hal bakın.

VHAL şu eylemleri gerçekleştirmelidir:

Dürtmek

Kullanıcı döner denetleyiciye sağa 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_SYSTEM_NAVIGATION_RIGHT
  3. Hedef gösterimi.

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

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

  • HW_KEY_INPUT KEYCODE_SYSTEM_NAVIGATION_LEFT ACTION_DOWN
  • HW_KEY_INPUT KEYCODE_SYSTEM_NAVIGATION_UP ACTION_DOWN

Her iki sırada (ve sonrasında) 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ı dik yönde itebilir. Örneğin aşağıdaki senaryo:

Dik yön
Şekil 1. Dik 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 cihazı bir yönde tutulduğunda hiçbir tekrar olayı oluşturulmamalıdır.

Döndür

Kullanıcı döner denetleyiciyi saat yönünde bir kilit kadar döndürdüğünde (tıkladığında), 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) gözaltı.
  3. Hedef gösterimi.

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

Bir (1) mandalın saat yönünün tersine dönmesi aynı olayı oluşturmalıdır ancak mandal sayısı -1 olmalıdır.

Aynı yönde birden fazla dönüş tetiklemesi hızlı bir şekilde art arda meydana gelirse, VHAL, sistemi olaylarla aşırı yüklememek için tetiklemeleri tek bir olayda birleştirmelidir. Bu durumda olayın zaman damgası, rotasyonun ilk engellenmesinin gerçekleştiği zaman olmalıdır. int32Values , ardışık dönüş tetiklemeleri arasındaki nanosaniye sayısını içermelidir.

Örneğin aşağıdaki rotasyon sırası:

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

bu olayı oluşturmalıdır:

  • Özellik: 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 tetikleme arasında 5 ns.
    5. İkinci ve üçüncü tetikleme arasında 3 ns.

Orta düğme

Kullanıcı Center 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_DPAD_CENTER
  3. Hedef gösterimi.

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

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

Geri butonu

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 kodu kullanmalıdır.

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

Ana menü tuşu

Ana Sayfa düğmesini Geri düğmesinde yaptığınız gibi kullanın, ancak KEYCODE_BACK yerine KEYCODE_HOME kullanın.

Diğer düğmeler

Döner denetleyici herhangi bir ek düğme içeriyorsa, VHAL bunları, Android açısından bakıldığında rotary'in bir parçası olarak kabul edilmedikleri için OEM'in hoşuna gidecek şekilde yönetebilir. Bunlar genellikle Geri ve Ana Sayfa düğmeleri gibi kullanılır ancak farklı tuş kodlarıyla kullanılır. Örneğin, KEYCODE_CALL veya KEYCODE_MUSIC .

Yapı yapılandırması

Döner navigasyon, RotaryService adı verilen 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'ınıza aşağıdaki satırı ekleyin:

PRODUCT_PACKAGES += CarRotaryController

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

Cihaz önyüklendiğinde ve kullanıcı değişikliği gerçekleştiğinde döner hizmet otomatik olarak etkinleştirilir. Bu, kullanıcının kurulum sırasında döner denetleyiciyi kullanabilmesini sağlar.

Döner kumandalı ve kumandasız 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 dize kaynağını boş bir dizeyle kaplamak için statik bir RRO oluşturun. Döner ve dönmeyen cihazlar için aynı yapıyı kullanacak 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-kütüphanesi packages/apps/Car/libs/car-ui-lib bulunur
  • RotaryService packages/apps/Car/RotaryController bulunur
  • Core frameworks/base/core bulunur

Dürtme geçmişi

OEM, iki tür itme geçmişinin her birinin etkinleştirilip etkinleştirilmeyeceğini ve eğer öyleyse, önbellek boyutunu ve süre sonu ilkesini yapılandırabilir. Bunların hepsi çeşitli araç kullanıcı arayüzü kitaplığı kaynaklarının geçersiz kılınmasıyla yapılır.

Geçmiş önbelleğine odaklan

( Android 11 QPR3, Android 11 Araba, Android 12 )
Bu FocusArea başına önbellek, FocusArea içinde en son odaklanılan görünümü saklar, böylece FocusArea geri dönüldüğünde odaklanılabilir. Bu önbellek, aşağıdaki araç kullanıcı arayüzü kitaplığı kaynaklarının üst üste bindirilmesiyle yapılandırılabilir:

  • car_ui_focus_history_cache_type :
    1. Önbellek devre dışı bırakıldı.
    2. Önbelleğin süresi bir süre sonra dolacaktır (aşağıya bakın).
    3. Önbelleğin süresi hiçbir zaman dolmaz.
  • car_ui_focus_history_expiration_period_ms : Önbellek türü iki (2) olarak ayarlanırsa önbelleğin süresinin dolmasına kaç milisaniye kalır (yukarıya bakın).

FocusArea geçmiş önbelleği

( Android 11 QPR3, Android 11 Araba, Android 12 )
Bu önbellek, ters yönde dürtmelerin odağı aynı FocusArea döndürebilmesi için dürtmelerin geçmişini saklar. Bu önbellek, aşağıdaki araç kullanıcı arayüzü kitaplığı kaynaklarının üst üste bindirilmesiyle yapılandırılabilir:

  • car_ui_focus_area_history_cache_type :
    1. Önbellek devre dışı bırakıldı.
    2. Önbelleğin süresi bir süre sonra dolar (aşağıya bakın).
    3. Önbellek hiçbir zaman sona ermez.
  • car_ui_focus_area_history_expiration_period_ms : Önbellek türü 2 olarak ayarlanırsa önbelleğin süresinin dolmasına kaç milisaniye kaldı (yukarıya bakın).
  • car_ui_clear_focus_area_history_when_rotating : Kullanıcı denetleyiciyi döndürdüğünde önbelleğin iptal edilip edilmeyeceği.

Döndürme

( Android 11 QPR3, Android 11 Araba, Android 12 )
OEM, rotasyon için fare ivmesi gibi bir ivmenin olup olmadığını belirtmek için RotaryService iki tam sayı kaynağını geçersiz kılabilir:

  • rotation_acceleration_3x_ms : Google'ın belirli bir dönüş süresi için denetleyici dönüşünü hızlandırıp hızlandırmayacağına karar vermek için kullanılan zaman aralığı (milisaniye cinsinden). Bu tetikleme noktası ile önceki dönüş tetiklemesi arasındaki aralık bu değerden küçükse, üç dönme tetiklemesi olarak ele alınacaktır. 3× hızlandırmayı devre dışı bırakmak için bunu 2147483647 olarak ayarlayın.
  • rotation_acceleration_2x_ms : rotation_acceleration_3x_ms benzer. 2x hızlanma için kullanılır. 2× hızlandırmayı devre dışı bırakmak için bunu 2147483647 olarak ayarlayın.

Hızlanma, VHAL'in gerektirdiği şekilde, her dönüş tetikleyicisi için ayrı zaman damgaları olduğunda en iyi sonucu verir. Bunlar mevcut değilse, RotaryService dönme mandallarının eşit aralıklarla yerleştirildiğini 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),

Odaklanma vurgusu

OEM, Android çerçevesindeki varsayılan odak vurgusunu ve araç-ui-kitaplığındaki çeşitli odak vurgulama kaynaklarını geçersiz kılabilir.

Varsayılan odak vurgusu

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

Bu çekilebilir genellikle, android:state_focused ve android:state_pressed dahil olmak üzere farklı durum kombinasyonlarına göre arka planı 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 olacaktır, ancak android:state_pressed false olacaktır. Kullanıcı daha sonra döner denetleyici üzerindeki Orta düğmeye basarsa, kullanıcı düğmeyi basılı tuttuğu sürece hem android:state_focused hem de android:state_pressed true olacaktır. Kullanıcı düğmeyi bıraktığında yalnızca android:state_focused true kalacaktır.

car-ui-library, Theme.DeviceDefault öğesinden türetilen bir temayı kullanır. Sonuç olarak bu yer paylaşımı, bu kitaplığı kullanan uygulamaları ve Theme.DeviceDefault öğesinden türetilen herhangi bir temayı kullanan uygulamaları etkiler. Theme.Material gibi ilgisiz bir tema kullanan uygulamaları etkilemez.

Araç kullanıcı arayüzü kütüphanesindeki kaynakları vurgulamaya odaklanın

OEM, dikdörtgen olmayan (yuvarlak veya hap şeklinde) odak vurgusu olan görünümlerde ve Theme.DeviceDefault türetmeyen bir tema kullanan uygulamalarda odak vurgusunun nasıl görüneceğini kontrol etmek için çeşitli araç kullanıcı arayüzü kitaplığı kaynaklarını geçersiz kılabilir Theme.DeviceDefault . Bu kaynaklar, odak vurgusunun çizilebilir varsayılan odak vurgusu ile tutarlı olması için üst üste yerleştirilmelidir.

( 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 : Ana hattın kalınlığı.

( Android 11 QPR3, Android 11 Araba, Android 12 )
Bir görünüme ne zaman odaklanıldığını ve basıldığını 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 : Ana hattın kalınlığı.

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

Sağlam arka plana sahip düğme
Şekil 2. Düz arkaplanlı düğme

Bu durumda geliştirici, ikincil renkleri kullanarak özel bir odak vurgusu belirtebilir:
  • ( 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

Örneğin yalnızca dolgu veya yalnızca dış hat istiyorsanız, renklerden herhangi biri şeffaf olabilir ve her iki boyut da sıfır olabilir.

Odak Alanı vurgusu

( Android 11 QPR3, Android 11 Araba, Android 12 )
FocusArea alt öğelerinden birine odaklanıldığında iki tür vurgu çizebilir. İstenildiği takdirde her ikisi bir arada kullanılabilir. Bu özellik AOSP'de varsayılan olarak devre dışıdır ancak araç kullanıcı arayüzü kitaplığı kaynakları geçersiz kılınarak etkinleştirilebilir:

  • car_ui_enable_focus_area_foreground_highlight : FocusArea ve alt öğelerinin üstüne bir vurgu çizin. AOSP'de bu çizilebilir, FocusArea etrafındaki bir taslaktır. OEM'ler car_ui_focus_area_foreground_highlight çizilebilirliğini geçersiz kılabilir.
  • car_ui_enable_focus_area_background_highlight : FocusArea üstüne ancak alt öğelerinin arkasına bir vurgu çizin. AOSP'de bu çekilebilir, katı bir dolgudur. OEM'ler car_ui_focus_area_background_highlight çizilebilirliğini 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 rotary için bir IME oluşturduysa, bunun ComponentName rotary_input_method kaynağında belirtmesi gerekir. Bu kaynak yer paylaşımlıysa belirtilen IME, kullanıcı döner denetleyicinin itme, döndürme ve Orta düğmesi aracılığıyla ana üniteyle etkileşimde bulunduğunda kullanılır. Kullanıcı ekrana dokunduğunda önceki IME kullanılacaktır. Geri düğmesinin (ve döner denetleyicideki diğer düğmelerin) IME seçimi üzerinde hiçbir etkisi yoktur. Bu kaynak yer paylaşımlı değilse IME geçişi gerçekleşmez. Carboard döneri desteklemediğinden, OEM döner IME sağlamadıysa kullanıcı döner denetleyici aracılığıyla metin giremez.

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

Ekran dışı dürtüklemeler

Varsayılan olarak, kullanıcı ekranın kenarından çıkmaya ç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 tarafından tanımlanan genel 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ının üst üste bindirilmesiyle belirtilir:

  • off_screen_nudge_global_actions : Kullanıcı ekranın kenarından yukarı, aşağı, sola veya sağa doğru ittiğinde gerçekleştirilecek genel eylemler dizisi. Bu dizinin ilgili elemanı -1 ise hiçbir global eylem gerçekleştirilmez.
  • off_screen_nudge_key_codes : Kullanıcı ekranın kenarından yukarı, aşağı, sola veya sağa doğru ittiğinde eklenecek tıklama etkinliklerinin anahtar kodlarının 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 ittiğinde bir etkinliği başlatacak niyet dizisi. Bu dizinin ilgili elemanı boşsa hiçbir aktivite başlatılmaz.

Diğer konfigürasyonlar

Aşağıdaki RotaryService kaynaklarını eklemelisiniz:

  • ( Android 11 QPR3, Android 11 Araba, Android 12 )
    config_showHeadsUpNotificationOnBottom : Uyarı bildirimlerinin üstte değil altta gösterilmesi gerekip gerekmediğini temsil eden Boolean değeri. Bu frameworks/base/packages/CarSystemUI/res/values/config.xml dosyasındaki config_showHeadsUpNotificationOnBottom Boolean kaynağıyla aynı değere sahip olmalıdır.
  • ( Android 11 QPR3, Android 11 Araba, Android 12 )
    notification_headsup_card_margin_horizontal : Uyarı bildirim penceresinin sol ve sağ kenar boşluğu. Bu packages/apps/Car/Notification/res/values/dimens.xml notification_headsup_card_margin_horizontal dimen kaynağıyla aynı değere sahip olmalıdır.
  • ( Android 12 )
    excluded_application_overlay_window_titles : Yer paylaşımlı pencere olarak kabul edilmemesi gereken pencerelerin başlıklarından oluşan bir dizi. 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 temsil eden 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.