当前位置: 首页 > news >正文

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中。

实现:
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

相关文章:

  • MCP学习
  • C++初阶 —— 类和对象
  • 如何使用UGUI的EventTrigger
  • 南京大学OpenHarmony技术俱乐部正式揭牌 仓颉编程语言引领生态创新
  • 汽车免拆诊断案例|车辆行驶中急加速车身抖动故障排除 2 例
  • 台州智惠自动化签约智橙PLM,让创新持续发生
  • 挑战用豆包教我学Java01天
  • 软件测试需求之测试类型分析
  • Xilinx XCKU11P-2FFVA1156I 赛灵思 FPGA AMD Kintex UltraScale+
  • linux下MySql的安装与配置
  • java实现一个操作日志模块功能,怎么设计
  • 黄金分割法(0.618 法)
  • 机器学习实操 第二部分 神经网路和深度学习 第14章 使用卷积神经网络进行深度计算机视觉
  • 【LLM+Code】Devin PromptTools详细解读
  • AI与Web3.0:去中心化智能合约的未来
  • PostgreSQL中“参数默认值实现伪重载“详解
  • neo4j多跳查询,未只获取到收尾两个节点,待继续
  • ROS第十三梯:RViz+Marker——自定义几何形状可视化
  • vue-qr生成的二维码增加下载功能
  • 跨境电商生死局:动态IP如何重塑数据生态与运营效率
  • 网站开发哪家强/百度爱采购官网
  • 做兼职网上哪个网站好/一般的电脑培训班要多少钱
  • 大学生做家教网站/网络销售真恶心
  • 做免费的网站教程/什么软件可以发布推广信息
  • 枣庄公司做网站/百度网盘账号登录入口
  • 一台vps可以做几个网站/站长之家ip地址查询