From 2613cc3f9cd9c7e4a082bc693ea207fd902b5329 Mon Sep 17 00:00:00 2001 From: Henrique Silva Date: Mon, 30 Jul 2018 20:06:19 -0300 Subject: [PATCH] violet: Implement keyhandler for fingerprint shutter * Prevents fp from triggering other events such as vibrate on long press Fixes: 7b74e3d8fef912c35f6d48f69c951af290414d73 ("keylayout: Redirect keycode 96 to CAMERA") Co-authored-by: Adithya R Signed-off-by: Adithya R Signed-off-by: Joker-V2 --- device.mk | 4 + keyhandler/Android.bp | 19 +++++ keyhandler/AndroidManifest.xml | 9 +++ keyhandler/proguard.flags | 4 + .../me/superioros/keyhandler/KeyHandler.java | 77 +++++++++++++++++++ .../base/core/res/res/values/config.xml | 10 +++ 6 files changed, 123 insertions(+) create mode 100644 keyhandler/Android.bp create mode 100644 keyhandler/AndroidManifest.xml create mode 100644 keyhandler/proguard.flags create mode 100644 keyhandler/src/me/superioros/keyhandler/KeyHandler.java 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 +