前段时间有做一个客户修改了遥控器的按键排布,需要修改键值按键的功能,主要是修改framework层的按键上层处理,此篇做一个记录。
总共需要修改下列文件
一、确定按键键值是否有上报:
使用串口输入getevent 命令:
/dev/input/event1: 0004 0000 0000029f
/dev/input/event1: 0004 0001 0000007a
/dev/input/event1: 0004 0002 fff0fc86
/dev/input/event1: 0004 0004 000001ac
/dev/input/event1: 0004 0007 f71c02a7
/dev/input/event1: 0000 0000 00000000
/dev/input/event1: 0004 0000 00002307
/dev/input/event1: 0004 0001 fffffc6d
/dev/input/event1: 0004 0002 fff12e53
/dev/input/event1: 0004 0004 000001ac
/dev/input/event1: 0004 0007 fc7a5385
/dev/input/event1: 0000 0000 00000000
/dev/input/event7: 0004 0004 00000035
/dev/input/event7: 0000 0000 00000000
/dev/input/event1: 0004 0000 00002a2d
当我们按下按键的时候会上报event7事件,接着输入:getevent dev/input/event7
测试我们需要修改的遥控器按键,按下按键,出现如下类似的内容说明有按键上报,说明底层驱动是已经适配好了,只需要修改上层就好了。
0004 0004 00000035
0000 0000 00000000
0004 0004 000000fc
0000 0000 00000000
0004 0004 00000018
二、确定KL键值映射文件
android kl(key layout)文件是一个映射文件,是标准linux与anroid的键值映射文件,kl文件可以有很多个,但是它有一个使用优先级,一般代码中的kl文件都是在device下面,我们需要找到代码中使用的kl文件是哪个
输入:cat /proc/bus/input/devices
130|root@H90:/ # cat /proc/bus/input/devices
I: Bus=0018 Vendor=3697 Product=0001 Version=0001
N: Name="MStar Smart TV IR Receiver"
P: Phys=/dev/ir
S: Sysfs=/devices/virtual/rc/rc0/input0
U: Uniq=
H: Handlers=kbd event0
B: PROP=0
B: EV=13
B: KEY=7e00000000000000 40000800 1e16c000008000 10000000
B: MSC=10
I: Bus=0000 Vendor=0000 Product=0000 Version=0000
N: Name="MCE IR Keyboard/Mouse (ir)"
P: Phys=/input0
S: Sysfs=/devices/virtual/input/input1
U: Uniq=
H: Handlers=kbd mouse0 event1
B: PROP=0
B: EV=100017
B: KEY=30000 7 ff87207ac14057ff febeffdfffefffff fffffffffffffffe
B: REL=3
B: MSC=10
I: Bus=0003 Vendor=058f Product=3841 Version=0001
N: Name="USB 2.0 PC Camera"
P: Phys=usb-mstar-1.2/button
S: Sysfs=/devices/Mstar-ehci-3.12/usb3/3-1/3-1.2/3-1.2:1.0/input/input2
U: Uniq=
H: Handlers=kbd event2
B: PROP=0
B: EV=3
B: KEY=100000 0 0 0
I: Bus=0018 Vendor=0000 Product=0000 Version=0000
N: Name="Accelerometer Sensor"
P: Phys=
S: Sysfs=/devices/lsm6ds3.29/input/input3
U: Uniq=
H: Handlers=event3
B: PROP=0
B: EV=11
B: MSC=97
I: Bus=0018 Vendor=0000 Product=0000 Version=0000
N: Name="ST LSM6DS3 Gyroscope Sensor"
P: Phys=
S: Sysfs=/devices/lsm6ds3.29/input/input4
U: Uniq=
H: Handlers=event4
B: PROP=0
B: EV=11
B: MSC=97
I: Bus=0018 Vendor=0000 Product=0000 Version=0000
N: Name="ST LSM6DS3 Significant Motion Sensor"
P: Phys=
S: Sysfs=/devices/lsm6ds3.29/input/input5
U: Uniq=
H: Handlers=event5
B: PROP=0
B: EV=11
B: MSC=91
I: Bus=0018 Vendor=0000 Product=0000 Version=0000
N: Name="ST LSM6DS3 Step Counter Sensor"
P: Phys=
S: Sysfs=/devices/lsm6ds3.29/input/input6
U: Uniq=
H: Handlers=event6
B: PROP=0
B: EV=11
B: MSC=91
I: Bus=0018 Vendor=0000 Product=0000 Version=0000
N: Name="ST LSM6DS3 Step Detector Sensor"
P: Phys=
S: Sysfs=/devices/lsm6ds3.29/input/input7
U: Uniq=
H: Handlers=event7
B: PROP=0
B: EV=11
B: MSC=91
I: Bus=0018 Vendor=0000 Product=0000 Version=0000
N: Name="ST LSM6DS3 Tilt Sensor"
P: Phys=
S: Sysfs=/devices/lsm6ds3.29/input/input8
U: Uniq=
H: Handlers=event8
B: PROP=0
B: EV=11
B: MSC=91
I: Bus=0006 Vendor=3697 Product=0002 Version=0000
N: Name="MStar Smart TV Keypad"
P: Phys=
S: Sysfs=/devices/virtual/input/input9
U: Uniq=
H: Handlers=kbd event9
B: PROP=0
B: EV=3
B: KEY=7fffffffffffffff ffffffffffffffff ffffffffffffffff fffffffffffffffe
根据前面得到的input时间,比如前面得到的是input7事件,那么我们要找的kl文件就是Vendor_0000_Product_0000.kl
@@ -27,6 +27,9 @@ key 7 6
key 8 7
key 9 8
key 10 9
+key 237 BLUETOOTH
+key 193 SETTINGS_KEY
+key 187 AUTO_FOUCS
key 398 PROG_RED
key 399 PROG_GREEN
key 400 PROG_YELLOW
三、如果遥控器按键没有按键事件上报,说明驱动层没有适配,这里需要做适配
修改文件如下
--- a/3.1.10_Madison_TVOS/3.1.10/drivers/media/rc/keymaps/rc-mstar-tv.c
+++ b/3.1.10_Madison_TVOS/3.1.10/drivers/media/rc/keymaps/rc-mstar-tv.c
@@ -38,7 +38,15 @@ static struct rc_map_table mstar_tv[] = {
{ 0x001d, KEY_FAST_MENU },
{ 0x005A, KEY_FAST_3D },
{ 0x0015, KEY_FAST_SETTINGS },
- { 0x0049, KEY_CUSTOM_KEY },
+ { 0x0049, KEY_CUSTOM_KEY },
+
+ { 0x0031, KEY_AUTO_FOUCS },
+ { 0x0036, KEY_SETTINGS_KEY },
+ { 0x0037, KEY_BLUETOOTH },
+ { 0x0032, KEY_PROG_RED },
+ { 0x0033, KEY_PROG_GREEN },
+ { 0x0034, KEY_PROG_YELLOW },
+ { 0x0035, KEY_PROG_BLUE },
/*
{ 0x0046, KEY_POWER },
{ 0x0050, KEY_0 },
-----------------------------------------------------------------------------------------
--- a/3.1.10_Madison_TVOS/3.1.10/include/linux/input.h
+++ b/3.1.10_Madison_TVOS/3.1.10/include/linux/input.h
@@ -426,7 +426,6 @@ struct input_keymap_entry {
#define KEY_BATTERY 236
-#define KEY_BLUETOOTH 237
#define KEY_WLAN 238
#define KEY_UWB 239
@@ -451,6 +450,15 @@ struct input_keymap_entry {
#define KEY_FAST_SETTINGS 251 /* DLP foucs positive */
#define KEY_FAST_MENU 253 /* HOLA fast menu */
#define KEY_FAST_3D 254 /* HOLA fast menu */
+
+#define KEY_BLUETOOTH 237 /*hola buletooth */
+#define KEY_AUTO_FOUCS 187 /*hola auto focus */
+#define KEY_SETTINGS_KEY 193 /*hola setting */
+#define KEY_PROG_RED 0x18e /*hola red */
+#define KEY_PROG_GREEN 0x18f /*hola green */
+#define KEY_PROG_YELLOW 0x190 /*hola yellow */
+#define KEY_PROG_BLUE 0x191 /*hola blue */
关于驱动层的按键上报主要是一个input 子系统,关于Android的input 子系统,各位读者可以看
1、Android Framework------之Input子系统,写的非常详细
四、framework层的修改
1、kitkat-mstar-master/frameworks/base/api/current.txt
--- a/kitkat-mstar-master/frameworks/base/api/current.txt
+++ b/kitkat-mstar-master/frameworks/base/api/current.txt
@@ -27443,12 +27443,15 @@ package android.view {
field public static final int KEYCODE_H = 36; // 0x24
field public static final int KEYCODE_HEADSETHOOK = 79; // 0x4f
field public static final int KEYCODE_HENKAN = 214; // 0xd6
+ field public static final int KEYCODE_HOLA_AUTO_FOUCS = 611; // 0x263
+ field public static final int KEYCODE_HOLA_BLUETOOTH = 609; // 0x261
field public static final int KEYCODE_HOLA_CUSTOMIZABLE_KEY = 608; // 0x260
field public static final int KEYCODE_HOLA_FAST_MENU = 605; // 0x25d
field public static final int KEYCODE_HOLA_FAST_SETTINGS = 607; // 0x25f
field public static final int KEYCODE_HOLA_FOUCS_POSITIVE = 601; // 0x259
field public static final int KEYCODE_HOLA_FOUCS_REVERSE = 602; // 0x25a
field public static final int KEYCODE_HOLA_ONEKEY_THREED = 606; // 0x25e
+ field public static final int KEYCODE_HOLA_SETTINGS_KEY = 610; // 0x262
field public static final int KEYCODE_HOLA_VOICE_OFF = 604; // 0x25c
field public static final int KEYCODE_HOLA_VOICE_ON = 603; // 0x25b
field public static final int KEYCODE_HOME = 3; // 0x3
2、kitkat-mstar-master/frameworks/base/core/res/res/values/attrs.xml
--- a/kitkat-mstar-master/frameworks/base/core/res/res/values/attrs.xml
+++ b/kitkat-mstar-master/frameworks/base/core/res/res/values/attrs.xml
@@ -1644,6 +1644,12 @@
<enum name="KEYCODE_KONKA_ENTER_FACTORY" value="519" />
<enum name="KEYCODE_KONKA_FACTORY_BAKE_TV" value="520" />
<!-- Skyworth section, range 601-700 -->
+
+ <!-- Philp, range 609-703 -->
+ <enum name="KEYCODE_BLUETOOTH" value="609" />
+ <enum name="KEYCODE_SETTINGS_KEY" value="610" />
+ <enum name="KEYCODE_AUTO_FOCUS" value="611" />
+
<!-- Tcl section, range 4001-4100 -->
<enum name="KEYCODE_TCL_MITV" value="4001" />
3、kitkat-mstar-master/frameworks/native/include/android/keycodes.h
--- a/kitkat-mstar-master/frameworks/native/include/android/keycodes.h
+++ b/kitkat-mstar-master/frameworks/native/include/android/keycodes.h
@@ -336,6 +336,13 @@ enum {
AKEYCODE_HAIER_CLEANSEARCH = 406,
// Skyworth section, range 601-700
+ //Holatek patch add by szh 20190214 for add keycode begin
+ AKEYCODE_BLUETOOTH = 609,
+ AKEYCODE_SETTINGS_KEY = 610,
+ AKEYCODE_AUTO_FOCUS = 611,
+
+ //Holatek patch add by szh 20190214 for add keycode end
+
// Tcl section, range 4001-4100
AKEYCODE_TCL_MITV = 4001,
AKEYCODE_TCL_USB_MENU = 4002,
@@ -475,6 +482,7 @@ enum {
AKEYCODE_HISENSE_TEST_BOARD_FAC_OK = 4276,
// MStar Android Patch End
+
// NOTE: If you add a new keycode here you must also add it to several other files.
// Refer to frameworks/base/core/java/android/view/KeyEvent.java for the full list.
};
4、kitkat-mstar-master/frameworks/native/include/android/keycodes.h
--- a/kitkat-mstar-master/frameworks/native/include/input/KeycodeLabels.h
+++ b/kitkat-mstar-master/frameworks/native/include/input/KeycodeLabels.h
@@ -466,7 +466,9 @@ static const KeycodeLabel KEYCODES[] = {
{ "FAST_3D", 606},
{ "FAST_SETTINGS",607},
{ "CUSTOM_KEY",608},
-
+ {"BLUETOOTH",609},
+ {"SETTINGS_KEY",610},
+ {"AUTO_FOUCS",611},
//holatek keyevent start
// NOTE: If you add a new keycode here you must also add it to several other files.
(END)
5、kitkat-mstar-master/frameworks/base/core/java/android/view/KeyEvent.java
--- a/kitkat-mstar-master/frameworks/base/core/java/android/view/KeyEvent.java
+++ b/kitkat-mstar-master/frameworks/base/core/java/android/view/KeyEvent.java
@@ -641,6 +641,12 @@ public class KeyEvent extends InputEvent implements Parcelable {
public static final int KEYCODE_HOLA_ONEKEY_THREED = 606;
public static final int KEYCODE_HOLA_FAST_SETTINGS = 607;
public static final int KEYCODE_HOLA_CUSTOMIZABLE_KEY = 608;
+ /**Holatek patch add by szh for flp keycode 20190214 begin**/
+ public static final int KEYCODE_HOLA_BLUETOOTH = 609;
+ public static final int KEYCODE_HOLA_SETTINGS_KEY = 610;
+ public static final int KEYCODE_HOLA_AUTO_FOUCS = 611;
+
+ /**Holatek patch add by szh for flp keycode 20190214 end**/
private static final int LAST_KEYCODE = KEYCODE_HOLA_CUSTOMIZABLE_KEY;
6、kitkat-mstar-master/frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
在PhoneWindowManager中处理按键事件
@Override
public long interceptKeyBeforeDispatching(WindowState win, KeyEvent event, int policyFlags) {
final boolean keyguardOn = keyguardOn();
final int keyCode = event.getKeyCode();
final int repeatCount = event.getRepeatCount();
final int metaState = event.getMetaState();
final int flags = event.getFlags();
final boolean down = event.getAction() == KeyEvent.ACTION_DOWN;
final boolean canceled = event.isCanceled();
if (true) {
Log.d(TAG, "interceptKeyTi keyCode=" + keyCode + " down=" + down + " repeatCount="
+ repeatCount + " keyguardOn=" + keyguardOn + " mHomePressed=" + mHomePressed
+ " canceled=" + canceled);
}
String threeDswitching = SystemProperties.get("sys.jmgo.enable3d");
if ("1".equals(threeDswitching)) {
Log.d(TAG, "Three D switching, not response to ir");
return -1;
}
// If we think we might have a volume down & power key chord on the way
// but we're not sure, then tell the dispatcher to wait a little while and
// try again later before dispatching.
if (mScreenshotChordEnabled && (flags & KeyEvent.FLAG_FALLBACK) == 0) {
if (mVolumeDownKeyTriggered && !mPowerKeyTriggered) {
final long now = SystemClock.uptimeMillis();
final long timeoutTime = mVolumeDownKeyTime + SCREENSHOT_CHORD_DEBOUNCE_DELAY_MILLIS;
if (now < timeoutTime) {
return timeoutTime - now;
}
}
if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN
&& mVolumeDownKeyConsumedByScreenshotChord) {
if (!down) {
mVolumeDownKeyConsumedByScreenshotChord = false;
}
return -1;
}
}
// First we always handle the home key here, so applications
// can never break it, although if keyguard is on, we do let
// it handle it, because that gives us the correct 5 second
// timeout.
if (keyCode == KeyEvent.KEYCODE_HOME) {
// If we have released the home key, and didn't do anything else
// while it was pressed, then it is time to go home!
if (!down) {
cancelPreloadRecentApps();
mHomePressed = false;
if (mHomeConsumed) {
mHomeConsumed = false;
return -1;
}
if (canceled) {
Log.i(TAG, "Ignoring HOME; event canceled.");
return -1;
}
// If an incoming call is ringing, HOME is totally disabled.
// (The user is already on the InCallScreen at this point,
// and his ONLY options are to answer or reject the call.)
try {
ITelephony telephonyService = getTelephonyService();
if (telephonyService != null && telephonyService.isRinging()) {
Log.i(TAG, "Ignoring HOME; there's a ringing incoming call.");
return -1;
}
} catch (RemoteException ex) {
Log.w(TAG, "RemoteException from getPhoneInterface()", ex);
}
// Delay handling home if a double-tap is possible.
if (mDoubleTapOnHomeBehavior != DOUBLE_TAP_HOME_NOTHING) {
mHandler.removeCallbacks(mHomeDoubleTapTimeoutRunnable); // just in case
mHomeDoubleTapPending = true;
mHandler.postDelayed(mHomeDoubleTapTimeoutRunnable,
ViewConfiguration.getDoubleTapTimeout());
return -1;
}
// Go home!
if(mPowerManager.isDlpShutDown() == 0) {
launchHomeFromHotKey();
} else if(mPowerManager.isDlpShutDown() == 1) {
Intent dlpPowerOn = new Intent();
dlpPowerOn.setAction("android.intent.action.HOLATEK_DLP_POWER_ON");
mContext.sendBroadcast(dlpPowerOn);
}
return -1;
}
// If a system window has focus, then it doesn't make sense
// right now to interact with applications.
WindowManager.LayoutParams attrs = win != null ? win.getAttrs() : null;
if (attrs != null) {
final int type = attrs.type;
if (type == WindowManager.LayoutParams.TYPE_KEYGUARD
|| type == WindowManager.LayoutParams.TYPE_KEYGUARD_SCRIM
|| type == WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG) {
// the "app" is keyguard, so give it the key
return 0;
}
final int typeCount = WINDOW_TYPES_WHERE_HOME_DOESNT_WORK.length;
for (int i=0; i<typeCount; i++) {
if (type == WINDOW_TYPES_WHERE_HOME_DOESNT_WORK[i]) {
// don't do anything, but also don't pass it to the app
return -1;
}
}
}
// Remember that home is pressed and handle special actions.
if (repeatCount == 0) {
mHomePressed = true;
if (mHomeDoubleTapPending) {
mHomeDoubleTapPending = false;
mHandler.removeCallbacks(mHomeDoubleTapTimeoutRunnable);
handleDoubleTapOnHome();
} else if (mLongPressOnHomeBehavior == LONG_PRESS_HOME_RECENT_SYSTEM_UI
|| mDoubleTapOnHomeBehavior == DOUBLE_TAP_HOME_RECENT_SYSTEM_UI) {
preloadRecentApps();
}
} else if ((event.getFlags() & KeyEvent.FLAG_LONG_PRESS) != 0) {
if (!keyguardOn) {
handleLongPressOnHome();
}
}
return -1;
//Holatek patch begin
}
/*else if (keyCode == KeyEvent.KEYCODE_HOLA_FAST_MENU) {
if(down && repeatCount ==0) {
Intent menuLongPress = new Intent();
menuLongPress.setAction("android.intent.action.LONG_PRESS_MENU_KEY");
mContext.sendBroadcast(menuLongPress);
}
} else if (keyCode == KeyEvent.KEYCODE_HOLA_ONEKEY_THREED) {
if (down && repeatCount ==0) {
Intent oneKeyTD = new Intent();
oneKeyTD.setAction("android.intent.action.HOLATEK_ONE_KEY_THREED");
mContext.sendBroadcastAsUser(oneKeyTD, UserHandle.ALL);
}
} else if (keyCode == KeyEvent.KEYCODE_HOLA_CUSTOMIZABLE_KEY) {
if (down && repeatCount ==0) {
Intent custKeyIntent = new Intent();
custKeyIntent.setAction("android.intent.jmgo.action.customizable.key");
mContext.sendBroadcast(custKeyIntent);
}
}
*/
else if (keyCode == KeyEvent.KEYCODE_HOLA_FOUCS_POSITIVE) {
if (down) {
Intent intent = new Intent();
intent.setAction("android.jmgo.action.foucs");
intent.putExtra("foucs_direct", 1);
mContext.sendBroadcastAsUser(intent, UserHandle.ALL);
HolatekOSManager holatekManager = (HolatekOSManager)mContext.getSystemService("holatekos_mananger");
if (holatekManager != null) {
holatekManager.set(HolatekOSConfig.Service.DLP, HolatekOSConfig.Command.DLP_CMD_FOUCS_POSITIVE, 1);
}
}
} else if (keyCode == KeyEvent.KEYCODE_HOLA_FOUCS_REVERSE) {
if (down) {
Intent intent = new Intent();
intent.setAction("android.jmgo.action.foucs");
intent.putExtra("foucs_direct", 2);
mContext.sendBroadcastAsUser(intent, UserHandle.ALL);
HolatekOSManager holatekManager = (HolatekOSManager)mContext.getSystemService("holatekos_mananger");
if (holatekManager != null) {
holatekManager.set(HolatekOSConfig.Service.DLP, HolatekOSConfig.Command.DLP_CMD_FOUCS_REVERSE, 1);
}
}
} else if(keyCode == KeyEvent.KEYCODE_HOLA_FAST_SETTINGS) {
if(down && repeatCount ==0) {
try {
Intent fastSetting = new Intent();
fastSetting.setAction("android.settings.SETTINGS");
fastSetting.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mContext.startActivity(fastSetting);
} catch(Exception e) {
e.printStackTrace();
}
}
//Holatek patch end
} else if (keyCode == KeyEvent.KEYCODE_MENU) {
// Hijack modified menu keys for debugging features
final int chordBug = KeyEvent.META_SHIFT_ON;
if (down && repeatCount == 0) {
if (mEnableShiftMenuBugReports && (metaState & chordBug) == chordBug) {
Intent intent = new Intent(Intent.ACTION_BUG_REPORT);
mContext.sendOrderedBroadcastAsUser(intent, UserHandle.CURRENT,
null, null, null, 0, null, null);
return -1;
} else if (SHOW_PROCESSES_ON_ALT_MENU &&
(metaState & KeyEvent.META_ALT_ON) == KeyEvent.META_ALT_ON) {
Intent service = new Intent();
service.setClassName(mContext, "com.android.server.LoadAverageService");
ContentResolver res = mContext.getContentResolver();
boolean shown = Settings.Global.getInt(
res, Settings.Global.SHOW_PROCESSES, 0) != 0;
if (!shown) {
mContext.startService(service);
} else {
mContext.stopService(service);
}
Settings.Global.putInt(
res, Settings.Global.SHOW_PROCESSES, shown ? 0 : 1);
return -1;
}
}
} else if (keyCode == KeyEvent.KEYCODE_SEARCH) {
if (down) {
if (repeatCount == 0) {
mSearchKeyShortcutPending = true;
mConsumeSearchKeyUp = false;
}
} else {
mSearchKeyShortcutPending = false;
if (mConsumeSearchKeyUp) {
mConsumeSearchKeyUp = false;
return -1;
}
}
return 0;
} else if (keyCode == KeyEvent.KEYCODE_APP_SWITCH) {
if (!keyguardOn) {
if (down && repeatCount == 0) {
preloadRecentApps();
} else if (!down) {
toggleRecentApps();
}
}
return -1;
} else if (keyCode == KeyEvent.KEYCODE_ASSIST) {
if (down) {
if (repeatCount == 0) {
mAssistKeyLongPressed = false;
} else if (repeatCount == 1) {
mAssistKeyLongPressed = true;
if (!keyguardOn) {
launchAssistLongPressAction();
}
}
} else {
if (mAssistKeyLongPressed) {
mAssistKeyLongPressed = false;
} else {
if (!keyguardOn) {
launchAssistAction();
}
}
}
return -1;
} else if (keyCode == KeyEvent.KEYCODE_SYSRQ) {
if (down && repeatCount == 0) {
mHandler.post(mScreenshotRunnable);
}
return -1;
} else if (keyCode == KeyEvent.KEYCODE_BRIGHTNESS_UP
|| keyCode == KeyEvent.KEYCODE_BRIGHTNESS_DOWN) {
if (down) {
int direction = keyCode == KeyEvent.KEYCODE_BRIGHTNESS_UP ? 1 : -1;
// Disable autobrightness if it's on
int auto = Settings.System.getIntForUser(
mContext.getContentResolver(),
Settings.System.SCREEN_BRIGHTNESS_MODE,
Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL,
UserHandle.USER_CURRENT_OR_SELF);
if (auto != 0) {
Settings.System.putIntForUser(mContext.getContentResolver(),
Settings.System.SCREEN_BRIGHTNESS_MODE,
Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL,
UserHandle.USER_CURRENT_OR_SELF);
}
int min = mPowerManager.getMinimumScreenBrightnessSetting();
int max = mPowerManager.getMaximumScreenBrightnessSetting();
int step = (max - min + BRIGHTNESS_STEPS - 1) / BRIGHTNESS_STEPS * direction;
int brightness = Settings.System.getIntForUser(mContext.getContentResolver(),
Settings.System.SCREEN_BRIGHTNESS,
mPowerManager.getDefaultScreenBrightnessSetting(),
UserHandle.USER_CURRENT_OR_SELF);
brightness += step;
// Make sure we don't go beyond the limits.
brightness = Math.min(max, brightness);
brightness = Math.max(min, brightness);
Settings.System.putIntForUser(mContext.getContentResolver(),
Settings.System.SCREEN_BRIGHTNESS, brightness,
UserHandle.USER_CURRENT_OR_SELF);
Intent intent = new Intent(Intent.ACTION_SHOW_BRIGHTNESS_DIALOG);
mContext.sendBroadcastAsUser(intent, UserHandle.CURRENT_OR_SELF);
}
return -1;
// MStar Android Patch Begin
// Hotkey intent.
} else if (keyCode == MKeyEvent.KEYCODE_SCREENSHOT) {
if (down) {
mHandler.postDelayed(mScreenshotRunnable,
ViewConfiguration.getGlobalActionKeyTimeout());
return -1;
}
} else if (keyCode == KeyEvent.KEYCODE_NOTIFICATION) {
if (down) {
Intent intent = new Intent(MIntent.ACTION_NOTIFICATION_BUTTON);
mContext.sendBroadcast(intent);
return -1;
}
}
//Holatek patch add by szh 20190214 for add keycode begin
else if (keyCode == KeyEvent.KEYCODE_HOLA_AUTO_FOUCS) {
if(Build.DEVICE.contains("H72P")||Build.DEVICE.contains("S4")||Build.DEVICE.contains("S2")){
if (down && getHolatekManager(mContext)){
mHolatekManager.set(HolatekOSConfig.Service.DLP, HolatekOSConfig.DEV_INDEX_AUTOMOTOR_ALINE,1);
}
}
}else if(keyCode == KeyEvent.KEYCODE_HOLA_SETTINGS_KEY){
if(Build.DEVICE.contains("H72P")||Build.DEVICE.contains("S4")||Build.DEVICE.contains("S2")){
if (down){
Intent intent = new Intent();
intent.setAction("android.settings.SETTINGS");
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mContext.startActivity(intent);
}
}
}else if(keyCode == KeyEvent.KEYCODE_HOLA_BLUETOOTH){
if(Build.DEVICE.contains("H72P")||Build.DEVICE.contains("S4")||Build.DEVICE.contains("S2")){
if (down){
Intent intent = new Intent();
intent.setAction("android.settings.BLUETOOTH_SETTINGS");
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mContext.startActivity(intent);
}
}
}
//Holatek patch add by szh 20190214 for add keycode end
// MStar Android Patch End
// Shortcuts are invoked through Search+key, so intercept those here
// Any printing key that is chorded with Search should be consumed
// even if no shortcut was invoked. This prevents text from being
// inadvertently inserted when using a keyboard that has built-in macro
// shortcut keys (that emit Search+x) and some of them are not registered.
if (mSearchKeyShortcutPending) {
final KeyCharacterMap kcm = event.getKeyCharacterMap();
if (kcm.isPrintingKey(keyCode)) {
mConsumeSearchKeyUp = true;
mSearchKeyShortcutPending = false;
if (down && repeatCount == 0 && !keyguardOn) {
Intent shortcutIntent = mShortcutManager.getIntent(kcm, keyCode, metaState);
if (shortcutIntent != null) {
shortcutIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
try {
mContext.startActivityAsUser(shortcutIntent, UserHandle.CURRENT);
} catch (ActivityNotFoundException ex) {
Slog.w(TAG, "Dropping shortcut key combination because "
+ "the activity to which it is registered was not found: "
+ "SEARCH+" + KeyEvent.keyCodeToString(keyCode), ex);
}
} else {
Slog.i(TAG, "Dropping unregistered shortcut key combination: "
+ "SEARCH+" + KeyEvent.keyCodeToString(keyCode));
}
}
return -1;
}
}
// Invoke shortcuts using Meta.
if (down && repeatCount == 0 && !keyguardOn
&& (metaState & KeyEvent.META_META_ON) != 0) {
final KeyCharacterMap kcm = event.getKeyCharacterMap();
if (kcm.isPrintingKey(keyCode)) {
Intent shortcutIntent = mShortcutManager.getIntent(kcm, keyCode,
metaState & ~(KeyEvent.META_META_ON
| KeyEvent.META_META_LEFT_ON | KeyEvent.META_META_RIGHT_ON));
if (shortcutIntent != null) {
shortcutIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
try {
mContext.startActivityAsUser(shortcutIntent, UserHandle.CURRENT);
} catch (ActivityNotFoundException ex) {
Slog.w(TAG, "Dropping shortcut key combination because "
+ "the activity to which it is registered was not found: "
+ "META+" + KeyEvent.keyCodeToString(keyCode), ex);
}
return -1;
}
}
}
// Handle application launch keys.
if (down && repeatCount == 0 && !keyguardOn) {
String category = sApplicationLaunchKeyCategories.get(keyCode);
if (category != null) {
Intent intent = Intent.makeMainSelectorActivity(Intent.ACTION_MAIN, category);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
try {
mContext.startActivityAsUser(intent, UserHandle.CURRENT);
} catch (ActivityNotFoundException ex) {
Slog.w(TAG, "Dropping application launch key because "
+ "the activity to which it is registered was not found: "
+ "keyCode=" + keyCode + ", category=" + category, ex);
}
return -1;
}
}
// Display task switcher for ALT-TAB or Meta-TAB.
if (down && repeatCount == 0 && keyCode == KeyEvent.KEYCODE_TAB) {
if (mRecentAppsDialogHeldModifiers == 0 && !keyguardOn) {
final int shiftlessModifiers = event.getModifiers() & ~KeyEvent.META_SHIFT_MASK;
if (KeyEvent.metaStateHasModifiers(shiftlessModifiers, KeyEvent.META_ALT_ON)
|| KeyEvent.metaStateHasModifiers(
shiftlessModifiers, KeyEvent.META_META_ON)) {
mRecentAppsDialogHeldModifiers = shiftlessModifiers;
showOrHideRecentAppsDialog(RECENT_APPS_BEHAVIOR_EXIT_TOUCH_MODE_AND_SHOW);
return -1;
}
}
} else if (!down && mRecentAppsDialogHeldModifiers != 0
&& (metaState & mRecentAppsDialogHeldModifiers) == 0) {
mRecentAppsDialogHeldModifiers = 0;
showOrHideRecentAppsDialog(keyguardOn ? RECENT_APPS_BEHAVIOR_DISMISS :
RECENT_APPS_BEHAVIOR_DISMISS_AND_SWITCH);
}
// Handle keyboard language switching.
if (down && repeatCount == 0
&& (keyCode == KeyEvent.KEYCODE_LANGUAGE_SWITCH
|| (keyCode == KeyEvent.KEYCODE_SPACE
&& (metaState & KeyEvent.META_CTRL_MASK) != 0))) {
int direction = (metaState & KeyEvent.META_SHIFT_MASK) != 0 ? -1 : 1;
mWindowManagerFuncs.switchKeyboardLayout(event.getDeviceId(), direction);
return -1;
}
if (mLanguageSwitchKeyPressed && !down
&& (keyCode == KeyEvent.KEYCODE_LANGUAGE_SWITCH
|| keyCode == KeyEvent.KEYCODE_SPACE)) {
mLanguageSwitchKeyPressed = false;
return -1;
}
if (mGlobalKeyManager.handleGlobalKey(mContext, keyCode, event)) {
return -1;
}
// Let the application handle the key.
return 0;
}
最后我们编译framework 的service.jar包验证修改就好了。
1、Android Framework------之Input子系统
2、Android下添加新的自定义键值和按键处理流程