From 9a775396648ac003ce612fed0fb782fb278ac143 Mon Sep 17 00:00:00 2001 From: Hyper_ <40342021+NotHyper-474@users.noreply.github.com> Date: Tue, 21 Oct 2025 17:51:59 -0300 Subject: [PATCH] Add hardware keyboard detection on Android --- .../funkin/external/android/KeyboardUtil.hx | 26 +++++++++++++++++++ .../java/funkin/util/KeyboardUtil.java | 14 ++++++++++ source/funkin/mobile/input/ControlsHandler.hx | 5 +++- 3 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 source/funkin/external/android/KeyboardUtil.hx create mode 100644 source/funkin/external/android/java/funkin/util/KeyboardUtil.java diff --git a/source/funkin/external/android/KeyboardUtil.hx b/source/funkin/external/android/KeyboardUtil.hx new file mode 100644 index 000000000..85ab8eb34 --- /dev/null +++ b/source/funkin/external/android/KeyboardUtil.hx @@ -0,0 +1,26 @@ +package funkin.external.android; + +#if android +import lime.system.JNI; + +/** + * Utility class for keyboard detection. + */ +class KeyboardUtil +{ + /** + * Returns `true` if a keyboard is currently connected to the device. + */ + public static var keyboardConnected(get, never):Bool; + + @:noCompletion + static function get_keyboardConnected():Bool + { + final method:Null = JNIUtil.createStaticMethod('funkin/util/KeyboardUtil', 'isKeyboardConnected', '()Z'); + + if (method == null) return false; + + return inline JNI.callStatic(method, []); + } +} +#end diff --git a/source/funkin/external/android/java/funkin/util/KeyboardUtil.java b/source/funkin/external/android/java/funkin/util/KeyboardUtil.java new file mode 100644 index 000000000..2bcd30436 --- /dev/null +++ b/source/funkin/external/android/java/funkin/util/KeyboardUtil.java @@ -0,0 +1,14 @@ +package funkin.util; + +import org.haxe.extension.Extension; + +public class KeyboardUtil +{ + public static boolean isKeyboardConnected() + { + if (Extension.mainContext == null) return false; + + // KEYBOARD_UNDEFINED = 0, KEYBOARD_NOKEYS = 1 + return Extension.mainContext.getResources().getConfiguration().keyboard > 1; + } +} diff --git a/source/funkin/mobile/input/ControlsHandler.hx b/source/funkin/mobile/input/ControlsHandler.hx index b5357fdb5..9628fa364 100644 --- a/source/funkin/mobile/input/ControlsHandler.hx +++ b/source/funkin/mobile/input/ControlsHandler.hx @@ -10,6 +10,9 @@ import funkin.mobile.ui.FunkinHitbox; import funkin.play.notes.NoteDirection; import openfl.events.KeyboardEvent; import openfl.events.TouchEvent; +#if android +import funkin.external.android.KeyboardUtil; +#end /** * Handles setting up and managing input controls for the game. @@ -125,7 +128,7 @@ class ControlsHandler @:noCompletion private static function get_hasExternalInputDevice():Bool { - return FlxG.gamepads.numActiveGamepads > 0 #if android || extension.androidtools.Tools.isChromebook() #end; + return FlxG.gamepads.numActiveGamepads > 0 #if android || KeyboardUtil.keyboardConnected || extension.androidtools.Tools.isChromebook() #end; } @:noCompletion