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的流程:
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
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中。
实现:
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.
资料
- 下面是Android提供的帮助应用开发rotary功能的文档:
https://source.android.com/docs/automotive/hmi/rotary_controller/app_developers?hl=zh-cn - 下面是相关的辅助类:
DirectManipulationHelper
FocusParkingView