最近新项目设备新增了一个物理按键,功能是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"事件