diff --git a/core/config/project_settings.cpp b/core/config/project_settings.cpp index e4cc0f9c03b..07e00b099a8 100644 --- a/core/config/project_settings.cpp +++ b/core/config/project_settings.cpp @@ -1612,6 +1612,7 @@ ProjectSettings::ProjectSettings() { GLOBAL_DEF_BASIC("input_devices/pointing/android/enable_long_press_as_right_click", false); GLOBAL_DEF_BASIC("input_devices/pointing/android/enable_pan_and_scale_gestures", false); GLOBAL_DEF_BASIC(PropertyInfo(Variant::INT, "input_devices/pointing/android/rotary_input_scroll_axis", PROPERTY_HINT_ENUM, "Horizontal,Vertical"), 1); + GLOBAL_DEF("input_devices/pointing/android/override_volume_buttons", false); // These properties will not show up in the dialog. If you want to exclude whole groups, use add_hidden_prefix(). GLOBAL_DEF_INTERNAL("application/config/features", PackedStringArray()); diff --git a/doc/classes/ProjectSettings.xml b/doc/classes/ProjectSettings.xml index 1a29e2003e9..f182d873aa2 100644 --- a/doc/classes/ProjectSettings.xml +++ b/doc/classes/ProjectSettings.xml @@ -1444,6 +1444,9 @@ If [code]true[/code], multi-touch pan and scale gestures are enabled on Android devices. + + If [code]true[/code], system volume changes are disabled when the buttons are used within the app. + On Wear OS devices, defines which axis of the mouse wheel rotary input is mapped to. This rotary input is usually performed by rotating the physical or virtual (touch-based) bezel on a smartwatch. diff --git a/platform/android/java/editor/src/main/java/org/godotengine/editor/BaseGodotEditor.kt b/platform/android/java/editor/src/main/java/org/godotengine/editor/BaseGodotEditor.kt index 4a7612c28fa..c9f717ec810 100644 --- a/platform/android/java/editor/src/main/java/org/godotengine/editor/BaseGodotEditor.kt +++ b/platform/android/java/editor/src/main/java/org/godotengine/editor/BaseGodotEditor.kt @@ -258,12 +258,14 @@ abstract class BaseGodotEditor : GodotActivity(), GameMenuFragment.GameMenuListe super.onGodotSetupCompleted() val longPressEnabled = enableLongPressGestures() val panScaleEnabled = enablePanAndScaleGestures() + val overrideVolumeButtonsEnabled = overrideVolumeButtons() runOnUiThread { // Enable long press, panning and scaling gestures godotFragment?.godot?.renderView?.inputHandler?.apply { enableLongPress(longPressEnabled) enablePanningAndScalingGestures(panScaleEnabled) + setOverrideVolumeButtons(overrideVolumeButtonsEnabled) } } } @@ -482,6 +484,8 @@ abstract class BaseGodotEditor : GodotActivity(), GameMenuFragment.GameMenuListe */ protected open fun overrideOrientationRequest() = true + protected open fun overrideVolumeButtons() = false + /** * Enable long press gestures for the Godot Android editor. */ diff --git a/platform/android/java/editor/src/main/java/org/godotengine/editor/BaseGodotGame.kt b/platform/android/java/editor/src/main/java/org/godotengine/editor/BaseGodotGame.kt index ed1ecb855cc..7290f746271 100644 --- a/platform/android/java/editor/src/main/java/org/godotengine/editor/BaseGodotGame.kt +++ b/platform/android/java/editor/src/main/java/org/godotengine/editor/BaseGodotGame.kt @@ -46,6 +46,8 @@ abstract class BaseGodotGame: GodotEditor() { private val TAG = BaseGodotGame::class.java.simpleName } + override fun overrideVolumeButtons() = java.lang.Boolean.parseBoolean(GodotLib.getGlobal("input_devices/pointing/android/override_volume_buttons")) + override fun enableLongPressGestures() = java.lang.Boolean.parseBoolean(GodotLib.getGlobal("input_devices/pointing/android/enable_long_press_as_right_click")) override fun enablePanAndScaleGestures() = java.lang.Boolean.parseBoolean(GodotLib.getGlobal("input_devices/pointing/android/enable_pan_and_scale_gestures")) diff --git a/platform/android/java/lib/src/org/godotengine/godot/Godot.kt b/platform/android/java/lib/src/org/godotengine/godot/Godot.kt index 550fbe94de7..9ab30e5f5b6 100644 --- a/platform/android/java/lib/src/org/godotengine/godot/Godot.kt +++ b/platform/android/java/lib/src/org/godotengine/godot/Godot.kt @@ -714,11 +714,13 @@ class Godot(private val context: Context) { val longPressEnabled = java.lang.Boolean.parseBoolean(GodotLib.getGlobal("input_devices/pointing/android/enable_long_press_as_right_click")) val panScaleEnabled = java.lang.Boolean.parseBoolean(GodotLib.getGlobal("input_devices/pointing/android/enable_pan_and_scale_gestures")) val rotaryInputAxisValue = GodotLib.getGlobal("input_devices/pointing/android/rotary_input_scroll_axis") + val overrideVolumeButtons = java.lang.Boolean.parseBoolean(GodotLib.getGlobal("input_devices/pointing/android/override_volume_buttons")) runOnUiThread { renderView?.inputHandler?.apply { enableLongPress(longPressEnabled) enablePanningAndScalingGestures(panScaleEnabled) + setOverrideVolumeButtons(overrideVolumeButtons) try { setRotaryInputAxis(Integer.parseInt(rotaryInputAxisValue)) } catch (e: NumberFormatException) { diff --git a/platform/android/java/lib/src/org/godotengine/godot/input/GodotInputHandler.java b/platform/android/java/lib/src/org/godotengine/godot/input/GodotInputHandler.java index 6f036c15a32..da3ad6e831c 100644 --- a/platform/android/java/lib/src/org/godotengine/godot/input/GodotInputHandler.java +++ b/platform/android/java/lib/src/org/godotengine/godot/input/GodotInputHandler.java @@ -88,6 +88,7 @@ public class GodotInputHandler implements InputManager.InputDeviceListener, Sens private int rotaryInputAxis = ROTARY_INPUT_VERTICAL_AXIS; private int cachedRotation = -1; + private boolean overrideVolumeButtons = false; public GodotInputHandler(Context context, Godot godot) { this.godot = godot; @@ -136,6 +137,10 @@ public class GodotInputHandler implements InputManager.InputDeviceListener, Sens rotaryInputAxis = axis; } + public void setOverrideVolumeButtons(boolean value) { + overrideVolumeButtons = value; + } + boolean hasHardwareKeyboard() { return !mHardwareKeyboardIds.isEmpty(); } @@ -157,10 +162,6 @@ public class GodotInputHandler implements InputManager.InputDeviceListener, Sens } public boolean onKeyUp(final int keyCode, KeyEvent event) { - if (keyCode == KeyEvent.KEYCODE_VOLUME_UP || keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) { - return false; - } - int source = event.getSource(); if (isKeyEventGameDevice(source)) { // Check if the device exists @@ -178,14 +179,14 @@ public class GodotInputHandler implements InputManager.InputDeviceListener, Sens handleKeyEvent(physical_keycode, unicode, key_label, false, event.getRepeatCount() > 0); }; + if (keyCode == KeyEvent.KEYCODE_VOLUME_UP || keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) { + return overrideVolumeButtons; + } + return true; } public boolean onKeyDown(final int keyCode, KeyEvent event) { - if (keyCode == KeyEvent.KEYCODE_VOLUME_UP || keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) { - return false; - } - int source = event.getSource(); final int deviceId = event.getDeviceId(); @@ -206,6 +207,10 @@ public class GodotInputHandler implements InputManager.InputDeviceListener, Sens handleKeyEvent(physical_keycode, unicode, key_label, true, event.getRepeatCount() > 0); } + if (keyCode == KeyEvent.KEYCODE_VOLUME_UP || keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) { + return overrideVolumeButtons; + } + return true; }