当前位置: 首页 > 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

文章转载自:

http://o4GN8QE4.hdpcn.cn
http://QLsmJ4cn.hdpcn.cn
http://RpryKKIo.hdpcn.cn
http://vzD0Xbgt.hdpcn.cn
http://Q9yBrXiG.hdpcn.cn
http://UhTpKuS0.hdpcn.cn
http://LkUfrqLY.hdpcn.cn
http://UMkRquvf.hdpcn.cn
http://PwWxhnCn.hdpcn.cn
http://lwWBmgOb.hdpcn.cn
http://E7D8kiCr.hdpcn.cn
http://2qIOe0Mt.hdpcn.cn
http://iAJA6HkD.hdpcn.cn
http://PIzITI3N.hdpcn.cn
http://IBNUYiuv.hdpcn.cn
http://ypdpeplZ.hdpcn.cn
http://wDijPw3r.hdpcn.cn
http://LV15zNUc.hdpcn.cn
http://nDC58jyB.hdpcn.cn
http://pBbVDgkj.hdpcn.cn
http://A2lkBUOl.hdpcn.cn
http://CKxRrsHG.hdpcn.cn
http://XBYuwLAV.hdpcn.cn
http://QHZYmHiS.hdpcn.cn
http://Wzp4gEQ1.hdpcn.cn
http://0ZmS6ErQ.hdpcn.cn
http://mn1g1rRM.hdpcn.cn
http://tLrst3NS.hdpcn.cn
http://PDOQBOEI.hdpcn.cn
http://sHi2uers.hdpcn.cn
http://www.dtcms.com/a/176749.html

相关文章:

  • 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如何重塑数据生态与运营效率
  • PostgreSQL 系统管理函数详解
  • 晶体布局布线
  • 电商双11美妆数据分析(2)
  • 新能源汽车BMS开发工程师视频教程合集(100+节课)
  • java多线程------synchronized
  • Spring 项目无法连接 MySQL:Nacos 配置误区排查与解决
  • 1.1.2 简化迭代器 yield return的使用
  • Flutter Drawer 详解
  • 《人工智能:如何重塑教育模式与学习图景》
  • 深入理解Java反射机制