diff --git a/device.mk b/device.mk
index 4da18267..bc004b38 100644
--- a/device.mk
+++ b/device.mk
@@ -286,6 +286,10 @@ PRODUCT_PACKAGES += \
PRODUCT_COPY_FILES += \
$(LOCAL_PATH)/configs/sec_config:$(TARGET_COPY_OUT_VENDOR)/etc/sec_config
+# Keyhandler
+PRODUCT_PACKAGES += \
+ KeyHandler
+
# Keylayouts
PRODUCT_COPY_FILES += \
$(LOCAL_PATH)/configs/keylayout/sm6150-idp-snd-card_Button_Jack.kl:$(TARGET_COPY_OUT_SYSTEM)/usr/keylayout/sm6150-idp-snd-card_Button_Jack.kl \
diff --git a/keyhandler/Android.bp b/keyhandler/Android.bp
new file mode 100644
index 00000000..4db183a4
--- /dev/null
+++ b/keyhandler/Android.bp
@@ -0,0 +1,19 @@
+//
+// Copyright (C) 2021 WaveOS
+//
+// SPDX-License-Identifier: Apache-2.0
+//
+
+android_app {
+ name: "KeyHandler",
+
+ srcs: ["src/**/*.java"],
+
+ certificate: "platform",
+ platform_apis: true,
+ privileged: true,
+
+ optimize: {
+ proguard_flags_files: ["proguard.flags"],
+ },
+}
diff --git a/keyhandler/AndroidManifest.xml b/keyhandler/AndroidManifest.xml
new file mode 100644
index 00000000..c1615cb1
--- /dev/null
+++ b/keyhandler/AndroidManifest.xml
@@ -0,0 +1,9 @@
+
+
+
+
diff --git a/keyhandler/proguard.flags b/keyhandler/proguard.flags
new file mode 100644
index 00000000..f3aa10be
--- /dev/null
+++ b/keyhandler/proguard.flags
@@ -0,0 +1,4 @@
+# Keep keyhandler constructor
+-keep public class * implements com.android.internal.os.DeviceKeyHandler {
+ public (android.content.Context);
+}
diff --git a/keyhandler/src/me/superioros/keyhandler/KeyHandler.java b/keyhandler/src/me/superioros/keyhandler/KeyHandler.java
new file mode 100644
index 00000000..6e3094f1
--- /dev/null
+++ b/keyhandler/src/me/superioros/keyhandler/KeyHandler.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 2021 WaveOS
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package me.superioros.keyhandler;
+
+import android.app.ActivityManager;
+import android.content.Context;
+import android.content.pm.ActivityInfo;
+import android.content.pm.PackageManager;
+import android.view.KeyEvent;
+import android.util.Log;
+
+import com.android.internal.os.DeviceKeyHandler;
+
+import java.util.List;
+
+public class KeyHandler implements DeviceKeyHandler {
+
+ private static final int FP_SCANCODE = 96;
+ private static final int FP_KEYCODE = KeyEvent.KEYCODE_CAMERA;
+ private static final String MIUI_CAMERA_PACKAGE_NAME = "com.android.camera";
+
+ private static final String TAG = "KeyHandler";
+ private static final boolean DEBUG = false;
+
+ private static ActivityManager am;
+ private static PackageManager pm;
+
+ public KeyHandler(Context context) {
+ am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
+ pm = context.getPackageManager();
+ }
+
+ public KeyEvent handleKeyEvent(KeyEvent event) {
+ int keyCode = event.getKeyCode();
+ int scanCode = event.getScanCode();
+ int action = event.getAction();
+
+ if (DEBUG)
+ Log.i(TAG, String.format("Received event keyCode=%d scanCode=%d action=%d", keyCode, scanCode, action));
+
+ if (keyCode == FP_KEYCODE && scanCode == FP_SCANCODE) {
+ if (action != KeyEvent.ACTION_DOWN) {
+ return null;
+ }
+ ActivityInfo runningActivity = getRunningActivityInfo();
+ if (runningActivity != null && runningActivity.packageName.equals(MIUI_CAMERA_PACKAGE_NAME)) {
+ if (DEBUG) Log.i(TAG, "Miui camera running, returning event");
+ return event;
+ } else {
+ if (DEBUG) Log.i(TAG, "Miui camera not running, returning null");
+ return null;
+ }
+ }
+
+ return event;
+ }
+
+ private static ActivityInfo getRunningActivityInfo() {
+ List tasks = am.getRunningTasks(1);
+
+ if (tasks != null && !tasks.isEmpty()) {
+ ActivityManager.RunningTaskInfo top = tasks.get(0);
+ try {
+ return pm.getActivityInfo(top.topActivity, 0);
+ } catch (PackageManager.NameNotFoundException e) {
+ // Do nothing
+ }
+ }
+
+ return null;
+ }
+
+}
diff --git a/overlay/frameworks/base/core/res/res/values/config.xml b/overlay/frameworks/base/core/res/res/values/config.xml
index ee7fdfda..6f9c7929 100644
--- a/overlay/frameworks/base/core/res/res/values/config.xml
+++ b/overlay/frameworks/base/core/res/res/values/config.xml
@@ -519,4 +519,14 @@
true
+
+
+
+ - /system/priv-app/KeyHandler/KeyHandler.apk
+
+
+
+
+ - me.superioros.keyhandler.KeyHandler
+