新增物理按键处理-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"即可

扫描二维码关注公众号,回复: 8510558 查看本文章

将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"事件

发布了28 篇原创文章 · 获赞 40 · 访问量 4812

猜你喜欢

转载自blog.csdn.net/qq_34211365/article/details/103510579
今日推荐