Android Car Input HAL

# Android Car Input HAL

Android Car在代码路径"packages/services/Car/service/src/com/android/car/hal/"下有很多的HAL 类,比如PropertyHalService, PowerHalService等,InputHalService也是其中的一员。

1. Key event

下面的图展示了key event从HAL层传到CarInputService的流程:

IVehicle HalClient VehicleHal InputHalService CarInputService onPropertyEvent(...) HalClent register VehicleCallback in IVehicle onPropertyEvent(...) MSG_ON_PROPERTY_EVENT onHalEvents(...) Property: HW_KEY_INPUT dispatchKeyInput(**, **) dispatchKeyInput(**, **, **, **) dispatchKeyInput(**, **, **, **, **) onKeyEvent(...) IVehicle HalClient VehicleHal InputHalService CarInputService

CarInputService对key event的处理逻辑都在onKeyEvent方法里面,优先级如下:
  • 交给Listener处理,这个是OEM可以定制的地方。
  • 如果Listener没有consume掉,对于KeyEvent.KEYCODE_VOICE_ASSIST,KeyEvent.KEYCODE_CALL,CarInputService要分别做处理
  • 如果是针对InputHalService.DISPLAY_INSTRUMENT_CLUSTER,CarInputService也会做处理
  • 交给InputCaptureClientController处理
  • Inject 到InpuManager

InputCaptureClientController 支持的display type预置在SUPPORTED_DISPLAY_TYPES中;支持的key code预置在KEY_EVENT_TO_INPUT_TYPE中。不在支持范围内的不处理,在支持范围内的会dispatch到注册的callback中,比如RotaryService。

2. Rotary event

IVehicle HalClient VehicleHal InputHalService CarInputService InputCaptureClientController InputCaptureController RotaryService InputManager onPropertyEvent(...) HalClent register VehicleCallback in IVehicle onPropertyEvent(...) MSG_ON_PROPERTY_EVENT onHalEvents(...) Property: HW_ROTARY_INPUT dispatchRotaryInput(**, **) onRotaryEvent(...) onRotaryEvent(...) dispatchRotaryEvent(...) onRotaryEvents(...) handleRotaryEvent(rotaryEvent) handleRotateEvent(boolean clockwise, int count, long eventTime) injectMotionEvent(...) Conditions required. injectInputEvent(...) IVehicle HalClient VehicleHal InputHalService CarInputService InputCaptureClientController InputCaptureController RotaryService InputManager

CarInputService对Rotary event的处理逻辑比较简单:
  • 首先交给InputCaptureClientController 处理
  • 如果InputCaptureClientController没有consume 掉,那么对于CarInputManager.INPUT_TYPE_ROTARY_NAVIGATION和CarInputManager.INPUT_TYPE_ROTARY_VOLUME(只支持这两种)的event,转化为key event进行dispatch

InputCaptureClientController 支持的display type预置在SUPPORTED_DISPLAY_TYPES中;支持的rotary type预置在VALID_ROTARY_TYPES中。不在支持范围内的不处理,在支持范围内的会dispatch到注册的callback中,比如RotaryService。

对于RotaryService的实现,将放到另外一个章节中总结。

RotaryService

主要功能:

  • 根据Accessibility拿到的Window和View信息对rotary event进行派发;如果View不需要特殊的操作,可以依赖这里的实现来响应rotary event,同时提供了辅助类和相应DM 模式来让view有机会自己处理rotary event。
  • 通过查找FocusParkingView,并借助于FocusParkingView的实现,控制UI的focus highlight效果。

rotary event从HAL上来之后,经过了CarInputService和RotaryService的预先处理,此时Android Framework的InputManager系统并未介入,RotaryService在处理一些event的时候会根据逻辑需要将相应的event inject到InputManager中。

正是由于rotary event不从input module 上传,所以也不会使用input module的FOCUS event,即不会触发View hierarchy中的onWindowFocusChanged(boolean);那么View hierarchy中的focus处理就不起作用,由RotaryService和FocusParkingView搭配来处理focus。

FocusParkingView: 是透明的,当window失去焦点时,FocusParkingView请求焦点,UI上可以看到焦点的highlight效果没有了。
FocusArea: Focus 区域,可以用MFC 上下左右移动切换到不同的FocusArea。点击Enter可以进入当前FocusArea。

实现:
RotaryService继承自AccessibilityService,当AccessibilityManagerService成功bind到该service之后,它会创建Car对象,并在callback中调用CarInputManager的requestInputEventCapture(...)方法来捕获以下event(最终会注册到InputCaptureClientController中):

  • CarInputManager.INPUT_TYPE_ROTARY_NAVIGATION,
    // Capture controller rotation.
  • CarInputManager.INPUT_TYPE_DPAD_KEYS
    // Capture controller center button clicks.
  • CarInputManager.INPUT_TYPE_SYSTEM_NAVIGATE_KEYS
    // Capture controller nudges.
  • CarInputManager.INPUT_TYPE_NAVIGATE_KEYS
    // Capture back button clicks.

资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值