Google se compromete a impulsar la igualdad racial para las comunidades afrodescendientes. Obtén información al respecto.

Guía de integración para OEM

Este artículo describe cómo procesar entradas rotativas en el VHAL, configurar su construcción para incluir el servicio rotativo y cómo personalizar la experiencia rotativa en todas las aplicaciones. Para aplicaciones OEM preinstaladas, como un lanzador proporcionado por el OEM, ver la interfaz de usuario Biblioteca de coches (coche-ui-biblioteca) .

VHAL

Un controlador giratorio admite las siguientes acciones:

  • Empuje hacia arriba, abajo, izquierda y derecha.
  • Gire en sentido horario y antihorario.
  • Presione el botón central.
  • Presiona el botón de atrás.
  • Presiona el botón de inicio.
  • Presione otros botones, como Teléfono y Medios.

Ver hardware/interfaces/automotive/vehicle/2.0/types.hal para la documentación sobre las propiedades del sistema y correspondiente int32Values .

El VHAL debe manejar estas acciones:

Empujar

Cuando el usuario pulsa el derecho regulador giratorio, el Vhal debe utilizar el HW_KEY_INPUT propiedad con las siguientes int32Values para enviar un evento para Android:

  1. ACTION_DOWN
  2. KEYCODE_SYSTEM_NAVIGATION_RIGHT
  3. Pantalla de destino.

Cuando el usuario suelta el regulador giratorio, la Vhal debe utilizar la misma propiedad y código clave con ACTION_UP . Los empujones en otras direcciones deben utilizar los códigos de tecla correspondientes.

No hay códigos clave para diagonales, pero el VHAL puede combinar un evento horizontal y vertical para producir una diagonal si el hardware admite diagonales. Por ejemplo, empujar hacia arriba y hacia la izquierda debería producir:

  • HW_KEY_INPUT KEYCODE_SYSTEM_NAVIGATION_LEFT ACTION_DOWN
  • HW_KEY_INPUT KEYCODE_SYSTEM_NAVIGATION_UP ACTION_DOWN

En cualquier orden (y posteriormente), al soltar el controlador giratorio debería producirse:

  • HW_KEY_INPUT KEYCODE_SYSTEM_NAVIGATION_LEFT ACTION_UP
  • HW_KEY_INPUT KEYCODE_SYSTEM_NAVIGATION_UP ACTION_UP

El usuario puede empujar el controlador giratorio en una dirección perpendicular antes de soltarlo. Por ejemplo, el siguiente escenario:

Dirección perpendicular
Dirección Figura 1. Perpendicular

Esto debería generar la siguiente secuencia de eventos:

  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

No hay eventos de repetición deben generarse mientras que el regulador giratorio se lleva a cabo en una dirección.

Girar

Cuando gira el usuario escribe el regulador giratorio en sentido horario por un retén (clic), el Vhal debe utilizar el HW_ROTARY_INPUT propiedad con las siguientes int32Values para enviar un evento para Android:

  1. ROTARY_INPUT_TYPE_SYSTEM_NAVIGATION
  2. Un (1) retén.
  3. Pantalla de destino.

La marca de tiempo del evento debe establecerse en el tiempo transcurrido en nanosegundos.

Una rotación de un (1) tope en sentido antihorario debería generar el mismo evento pero con -1 para el número de topes.

Si se producen múltiples retenes de rotación en la misma dirección en rápida sucesión, el VHAL debe combinar los retenes en un solo evento para no sobrecargar el sistema con eventos. En este caso, la marca de tiempo del evento debe ser cuando ocurrió el primer tope de rotación. Los int32Values deben incluir el número de nanosegundos entre retenes consecutivos de rotación.

Por ejemplo, la siguiente secuencia de rotaciones:

  • En el momento t0, el usuario giró un retén en sentido antihorario.
  • En el tiempo t0 + 5 ns, el usuario giró un retén en sentido antihorario.
  • En el tiempo t0 + 8 ns, el usuario giró un retén en sentido antihorario.

debería generar este evento:

  • Propiedad: HW_ROTARY_INPUT
  • Marca de tiempo: t0
  • int32Values :
    1. ROTARY_INPUT_TYPE_SYSTEM_NAVIGATION
    2. -3 (tres retenes en sentido antihorario).
    3. Pantalla de destino.
    4. 5 ns entre el primer y el segundo tope.
    5. 3 ns entre el segundo y el tercer tope.

Botón central

Cuando el usuario pulsa el botón central, el Vhal debe utilizar el HW_KEY_INPUT propiedad con las siguientes int32Values para enviar un evento para Android:

  1. ACTION_DOWN
  2. KEYCODE_DPAD_CENTER
  3. Pantalla de destino.

Cuando el usuario suelta el regulador giratorio, la Vhal debe utilizar la misma propiedad y código clave con ACTION_UP .

No generar eventos de repetición cuando el botón central se mantiene pulsado.

Botón de retroceso

Cuando el usuario pulsa el botón Atrás, el Vhal debe utilizar el HW_KEY_INPUT propiedad con las siguientes int32Values para enviar un evento para Android:

  1. ACTION_DOWN
  2. KEYCODE_BACK
  3. Pantalla de destino.

Cuando el usuario suelta el regulador giratorio, la Vhal debe utilizar la misma propiedad y código clave con ACTION_UP .

No hay eventos repetidos deben generarse mientras que el botón central se mantiene pulsado.

Botón de inicio

Manejar el botón de Inicio como lo haría con el botón Atrás pero con KEYCODE_HOME en lugar de KEYCODE_BACK .

Otros botones

Si el controlador giratorio incluye botones adicionales, el VHAL puede manejarlos como quiera que le guste al OEM, ya que no se consideran parte del control giratorio desde la perspectiva de Android. Por lo general, se manejan como los botones Atrás e Inicio, pero con diferentes códigos de teclas. Por ejemplo, KEYCODE_CALL o KEYCODE_MUSIC .

Construir configuración

Navegación rotatorio es proporcionado por un servicio de accesibilidad llamada RotaryService . Para incluir este servicio en la imagen del sistema de su dispositivo, agregue la siguiente línea a su archivo MAKE:

PRODUCT_PACKAGES += CarRotaryController

También puede incluir los siguientes paquetes en las compilaciones de depuración:

El servicio rotativo se habilita automáticamente cuando se inicia el dispositivo y cuando se produce un cambio de usuario. Esto asegura que el usuario pueda utilizar el controlador giratorio durante la configuración.

Si se utiliza la misma estructura para los coches con y sin un regulador giratorio, añadir CarRotaryController como se muestra arriba de manera que el código necesario se incluirá en la compilación. Para evitar que el servicio rotatorio de ser permitido en los coches que no rotan, crear una RRO estática para superponer la rotaryService recurso de cadena en packages/services/Car/service con una cadena vacía. Utilizará la misma construcción, pero tendrá configuraciones de producto separadas, para dispositivos rotativos y no rotativos. Solo este último incluye la superposición.

Personalización

Los OEM pueden personalizar la lógica de búsqueda de enfoque, el resaltado de enfoque y algunos elementos adicionales a través de superposiciones de recursos en las siguientes ubicaciones:

  • auto-ui-biblioteca se encuentra en packages/apps/Car/libs/car-ui-lib
  • RotaryService se encuentra en packages/apps/Car/RotaryController
  • Core se encuentra en frameworks/base/core

Empujar la historia

El OEM puede configurar si cada uno de los dos tipos de historial de empujones está habilitado y, de ser así, el tamaño de la caché y la política de vencimiento. Todo esto se hace anulando varios recursos de car-ui-library.

Caché del historial de enfoque

(Android 11 QPR3, Android 11 coches, Android 12)
Este per- FocusArea caché almacena centran la vista más recientemente en el FocusArea de manera que se pueda enfocar cuando empujando de nuevo a la FocusArea . Este caché se puede configurar superponiendo los siguientes recursos de car-ui-library:

  • car_ui_focus_history_cache_type :
    1. La caché está deshabilitada.
    2. La caché caducará después de un tiempo (ver más abajo).
    3. La caché nunca caducará.
  • car_ui_focus_history_expiration_period_ms : ¿cuántos milisegundos antes de que expire el caché si el tipo de caché se establece en dos (2) (véase más arriba).

Caché del historial de FocusArea

(Android 11 QPR3, Android 11 coches, Android 12)
Esta caché almacena un historial de empujones para que empujando en la dirección opuesta pueden volver el foco a la misma FocusArea . Este caché se puede configurar superponiendo los siguientes recursos de car-ui-library:

  • car_ui_focus_area_history_cache_type :
    1. La caché está deshabilitada.
    2. La caché caduca después de un tiempo (ver más abajo).
    3. La caché nunca caduca.
  • car_ui_focus_area_history_expiration_period_ms : ¿Cuántos milisegundos antes de que expire el caché si el tipo de caché se establece en 2 (véase más arriba).
  • car_ui_clear_focus_area_history_when_rotating : Ya sea para anular la caché cuando el usuario gira el controlador.

Rotación

(Android 11 QPR3, Android 11 coches, Android 12)
El OEM puede anular dos recursos enteros en el RotaryService para especificar si hay aceleración, tal como la aceleración del ratón, para la rotación:

  • rotation_acceleration_3x_ms : Intervalo de tiempo (en milisegundos) que se utilizan para decidir si Google debe acelerar la rotación controlador para un retén de rotación. Si el intervalo entre este retén y el retén de rotación anterior es menor que este valor, se tratará como tres retén de rotación. Establezca esto en 2147483647 para deshabilitar la aceleración 3 ×.
  • rotation_acceleration_2x_ms : Similar a rotation_acceleration_3x_ms . Se utiliza para una aceleración 2 ×. Ponga esto en 2147483647 para desactivar 2 × aceleración.

Aceleración funciona mejor cuando hay marcas de tiempo individuales para cada retén de rotación, como requerido por el Vhal. Si estos no están disponibles, el RotaryService asume que los retenes de rotación están espaciados uniformemente.

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

Enfoque destacado

El OEM puede anular el resaltado de enfoque predeterminado en el marco de Android y varios recursos de resaltado de enfoque en car-ui-library.

Resaltado de enfoque predeterminado

El marco de Android proporciona un punto culminante de enfoque predeterminado a través del atributo selectableItemBackground . En Theme.DeviceDefault , este atributo se refiere a item_background.xml en Core . El OEM puede superponer item_background.xml para cambiar el enfoque dibujable destacado por defecto.

Este dibujable normalmente debe ser un StateListDrawable , que ajusta el fondo basado en diferentes combinaciones de estados, incluyendo android:state_focused y android:state_pressed . Cuando el usuario utiliza el regulador giratorio para enfocar una vista, android:state_focused será true , pero android:state_pressed será false . Si el usuario pulsa entonces el botón central en el regulador giratorio, tanto android:state_focused y android:state_pressed será true mientras el usuario mantiene presionado el botón. Cuando el usuario suelta el botón, sólo el android:state_focused seguirá siendo true .

auto-ui-biblioteca utiliza un tema derivado de Theme.DeviceDefault . Como resultado, esta superposición afecta a aplicaciones que utilizan esta biblioteca y aplicaciones que utilizan cualquier tema derivado de Theme.DeviceDefault . No afectará a las aplicaciones que utilizan un tema relacionado, como Theme.Material .

Enfocar los recursos destacados en car-ui-library

El OEM puede anular varios recursos de coche-ui-biblioteca para controlar cómo las miradas se centran en resaltar puntos de vista con un no rectangular (como redondos o en forma de pastillas) destacan el enfoque y en aplicaciones que utilizan un tema que no se derivan de Theme.DeviceDefault . Estos recursos deben ser superpuestos de manera que el punto culminante enfoque es coherente con el enfoque destacado por defecto estirable.

(Android 11 QPR3, Android 11 coches, Android 12)
Los siguientes recursos se utilizan para indicar cuando un punto de vista se centró pero no presionado:

  • car_ui_rotary_focus_fill_color : Color de relleno.
  • car_ui_rotary_focus_stroke_color : Color del contorno.
  • car_ui_rotary_focus_stroke_width : Grosor del contorno.

(Android 11 QPR3, Android 11 coches, Android 12)
Los siguientes recursos se utilizan para indicar cuando un punto de vista se centra y se presiona:

  • car_ui_rotary_focus_pressed_fill_color : Color de relleno.
  • car_ui_rotary_focus_pressed_stroke_color : Color del contorno.
  • car_ui_rotary_focus_pressed_stroke_width : Grosor del contorno.

A veces, un botón recibe un color de fondo sólido para llamar la atención del usuario, como en el ejemplo que se muestra. Esto puede dificultar la visualización del resaltado de enfoque.

Botón con fondo sólido
Figura 2. Botón con fondo sólido

En esta situación, el desarrollador puede especificar una selección personalizado resaltar el uso de los colores secundarios:
  • (Android 11 QPR3, Android 11 coches, Android 12)
    car_ui_rotary_focus_fill_secondary_color
    car_ui_rotary_focus_stroke_secondary_color
  • (Androide 12)
    car_ui_rotary_focus_pressed_fill_secondary_color
    car_ui_rotary_focus_pressed_stroke_secondary_color

Cualquiera de los colores puede ser transparente y cualquier dimensión puede ser cero si, por ejemplo, solo desea un relleno o solo un contorno.

FocusArea destacado

(Android 11 QPR3, Android 11 coches, Android 12)
FocusArea puede dibujar dos tipos de luces Cuando uno de sus descendientes se centra. Ambos se pueden usar en conjunto, si se desea. Esta función está deshabilitada de forma predeterminada en AOSP, pero se puede habilitar anulando los recursos de car-ui-library:

  • car_ui_enable_focus_area_foreground_highlight : Dibujar un punto culminante en la parte superior de la FocusArea y sus descendientes. En AOSP, este estirable es un contorno alrededor de la FocusArea . OEM pueden anular el car_ui_focus_area_foreground_highlight estirable.
  • car_ui_enable_focus_area_background_highlight : Dibujar un punto culminante en la parte superior de la FocusArea pero detrás de sus descendientes. En AOSP, este dibujable es un relleno sólido. OEM pueden anular el car_ui_focus_area_background_highlight estirable.

Editores de métodos de entrada

Los editores de métodos de entrada (IME) son métodos de entrada. Por ejemplo, un teclado en pantalla.

(Android 11 QPR3, Android 11 coches, Android 12)
El OEM debe superponer la default_touch_input_method recurso de cadena en el RotaryService para especificar el ComponentName del IME basada en el contacto. Por ejemplo, si el OEM utiliza el IME provisto con Android Automotive, deben especificar com.google.android.apps.automotive.inputmethod/.InputMethodService .

(Android 11 QPR3, Android 11 coches, Android 12)
Si el fabricante ha creado un IME específicamente para rotatoria, deben especificar su ComponentName en el rotary_input_method recursos. Si este recurso está superpuesto, el IME especificado se utiliza siempre que el usuario interactúe con la unidad principal a través del botón central, la rotación y el empuje del controlador giratorio. Cuando el usuario toca la pantalla, se utilizará el IME anterior. El botón Atrás (y otros botones del controlador giratorio) no tienen ningún efecto en la selección de IME. Si este recurso no se superpone, no se produce ningún cambio de IME. Carboard no admite la función de rotación, por lo que el usuario no puede ingresar texto a través del controlador de rotación si el OEM no ha proporcionado un IME de rotación.

RotaryIME es una demostración IME rotativo. Si bien es básico, es suficiente probar el cambio automático de IME descrito anteriormente. El código fuente de RotaryIME se puede encontrar en packages/apps/Car/tests/RotaryIME/ .

Empujes fuera de la pantalla

De forma predeterminada, cuando el usuario intenta salir del borde de la pantalla, no sucede nada. El OEM puede configurar lo que debe ocurrir para cada una de las cuatro direcciones especificando cualquier combinación de:

  1. Una acción global definida por AccessibilityService . Por ejemplo, GLOBAL_ACTION_BACK .
  2. Un código de clave, tales como KEYCODE_BACK .
  3. Intento de iniciar una actividad representada como una URL.

(Android 11 QPR3, Android 11 coches, Android 12)
Éstos se especifican mediante la superposición de los siguientes recursos de matriz en la RotaryService :

  • off_screen_nudge_global_actions : Arsenal de acciones globales para llevar a cabo cuando el usuario empuja hacia arriba, abajo, izquierda o derecha en el borde de la pantalla. No se realiza ninguna acción global si el elemento relevante de esta matriz es -1.
  • off_screen_nudge_key_codes : Arsenal de códigos de clave de eventos de clic para inyectar cuando el usuario empuja hacia arriba, abajo, izquierda o derecha en el borde de la pantalla. No hay eventos se inyectan si el elemento correspondiente de esta matriz es 0 ( KEYCODE_UNKNOWN ).
  • off_screen_nudge_intents : Arsenal de los intentos para poner en marcha una actividad cuando el usuario empuja hacia arriba, abajo, izquierda o derecha en el borde de la pantalla. No se inicia ninguna actividad si el elemento relevante de esta matriz está vacío.

Otras configuraciones

Usted debe superponer los siguientes RotaryService recursos:

  • (Android 11 QPR3, Android 11 coches, Android 12)
    config_showHeadsUpNotificationOnBottom : valor booleano que representa si las notificaciones de heads-up que desea mostrar en la parte inferior en lugar de la parte superior. Este debe tener el mismo valor que el config_showHeadsUpNotificationOnBottom recursos de Boole en frameworks/base/packages/CarSystemUI/res/values/config.xml
  • (Android 11 QPR3, Android 11 coches, Android 12)
    notification_headsup_card_margin_horizontal : izquierda y derecha margen de ventana de notificación de heads-up. Este debe tener el mismo valor que el notification_headsup_card_margin_horizontal recursos dimen en packages/apps/Car/Notification/res/values/dimens.xml
  • (Androide 12)
    excluded_application_overlay_window_titles : Una serie de títulos de ventanas que no deben ser considerados superposición de ventanas. Esto debe incluir los títulos de las ventanas de aplicación que representan TaskViews o TaskDisplayAreas . De forma predeterminada, esta lista solo contiene "Mapas".

Se puede superponer la siguiente RotaryService de recursos:

  • (Android 11 QPR3, Android 11 coches, Android 12)
    long_press_ms : Valor entero que representa el número de milisegundos que el botón central se debe mantener presionado para activar un largo prensa. Cero indica que se debe utilizar el tiempo de espera de pulsación prolongada predeterminado del sistema. Este es el valor predeterminado.