新增物理按键处理-kaios

最近新项目设备新增了一个物理按键,功能是quick dialer,快捷拨号功能,设置好一个手机号码通过快速点击三下实现拨打功能,我主要负责事件上报到上层js,并在三次点击之后发送event以通知dialer拨打电话,记录一下实现流程,因为做这个功能的时候新设备还没到因此用VolumeDown模拟quick dialer实现上报。

先将/system/usr/keylayout下的所有定义了VolumeDown按键的kl文件进行修改,改为Volume_Down_QD,这就是需要模拟的按键
在这里插入图片描述
定义Volume_Down_QD对应的keycode,这里不选择新增,而是选择一个系统不会用到的按键进行替换,我选择了F12按键,将F12改为VOLUME_DOWN_QD

KeycodeLabels.h

static const KeycodeLabel KEYCODES[] = {{ "SOFT_LEFT", 1 },{ "SOFT_RIGHT", 2 },{ "HOME", 3 },{ "BACK", 4 },{ "CALL", 5 },{ "ENDCALL", 6 },{ "0", 7 },{ "1", 8 },{ "2", 9 },......//{ "F12", 142 },{ "VOLUME_DOWN_QD", 142 },......
}

将F12改为VOLUME_DOWN_QD

android_keycodes.h

/** Key codes.*/
enum {......//AKEYCODE_F12 = 142,AKEYCODE_VOLUME_DOWN_QD  = 142,......
}

将F12改为VOLUME_DOWN_QD

GonkKeyMapping.h

static const unsigned long kKeyMapping[] = {......//NS_VK_F12,NS_VK_VOLUME_DOWN_QD,......
}

将F12改为VOLUME_DOWN_QD

VirtualKeyCodeList.h

	#define DEFINE_VK_INTERNAL(aKeyName) \NS_DEFINE_VK(VK##aKeyName, nsIDOMKeyEvent::DOM_VK##aKeyName)//DEFINE_VK_INTERNAL(_F12),DEFINE_VK_INTERNAL(_VOLUME_DOWN_QD),

将F12改为VOLUME_DOWN_QD

nsIDOMKeyEvent.idl

interface nsIDOMKeyEvent : nsIDOMUIEvent
{......//const unsigned long DOM_VK_F12 = 0x7B;const unsigned long DOM_VK_VOLUME_DOWN_QD = 0x7B;.....
}

将F12改为VOLUME_DOWN_QD

KeyNameList.h

	......//DEFINE_KEYNAME_WITH_SAME_NAME(F12)DEFINE_KEYNAME_WITH_SAME_NAME(VolumeDownQd)......

将F12改为VOLUME_DOWN_QD

PhysicalKeyCodeNameList.h

	//DEFINE_PHYSICAL_KEY_CODE_NAME_WITH_SAME_NAME(F12)DEFINE_PHYSICAL_KEY_CODE_NAME_WITH_SAME_NAME(VolumeDownQd)

将F12改为VOLUME_DOWN_QD

NativeKeyToDOMCodeName.h

	//CODE_MAP_ANDROID(F12,          0x0058)CODE_MAP_ANDROID(VolumeDownQd,          0x0058)

将F12改为VOLUME_DOWN_QD

NativeKeyToDOMKeyName.h

	//KEY_MAP_ANDROID (F12, AKEYCODE_VOLUME_DOWN_QD)KEY_MAP_ANDROID (VolumeDownQd, AKEYCODE_VOLUME_DOWN_QD)

WidgetEventImpl.cpp

WidgetKeyboardEvent::ComputeKeyCodeFromKeyNameIndex(KeyNameIndex aKeyNameIndex)
{......case KEY_NAME_INDEX_VolumeDownQd:return nsIDOMKeyEvent::DOM_VK_VOLUME_DOWN_QD;......
}

模拟按键上报比较简单只需要替换一个设备用不到的按键即可
以上完成之后js上层已经能够收到VolumeDownQd的事件,接着判断点击三次之后发送"QdCall"即可

将VolumeDownQd转换为上层易读的up,down事件,volumedownqd->volume-down-qd-button,根据按下还是释放拼接“press”,“release”

browser_key_event_manager.js

	APP_CANCELLED_KEYS: Object.freeze([......
+      'volumedownqd']),TRANSLATION_TABLE: Object.freeze({......
+      'volumedownqd': 'volume-down-qd-button',}),
getButtonEventType: function bkem_getButtonEventType(event) {......if (needTranslation) {suffix = (event.type.indexOf('keyup') > -1) ? '-release' : '-press';translatedType =this.TRANSLATION_TABLE[key] && this.TRANSLATION_TABLE[key] + suffix;}.....return translatedType;}};

hardware_buttons.js

(function(exports) {
+   HardwareButtons.prototype.qdCount = 0;
+   HardwareButtons.prototype.qdTimer = undefined;
HardwareButtons.prototype.handleEvent = function hb_handleEvent(evt) {......var buttonEventType = this.browserKeyEventManager.getButtonEventType(evt);
+    		this.qdProcess(evt,buttonEventType);......}......
+ HardwareButtons.prototype.qdProcess = function hb_qdProcess(evt,buttonEventType){
+    if(buttonEventType === "volume-down-qd-button-release" && ((evt.type === "mozbrowserbeforekeyup")||(evt.type === "keyup"))){
+   	clearTimeout(this.qdTimer);
+      	this.qdCount++
+     	this.publish('qd');
+        this.qdTimer = setTimeout(function() {
+        this.qdCount = 0;
+    }.bind(this), 600);
+      if(this.qdCount === 3){
+        this.publish('qdCall');
+      }
+   }
+  }
}

每点击一次发送"qd"事件,点击三次发送"qdCall"事件


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部