Ver código fonte

Merge pull request #102984 from syntaxerror247/volume-buttons

Android: enable support for volume button events
Thaddeus Crews 6 meses atrás
pai
commit
56bc9bc2f4

+ 1 - 0
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());

+ 3 - 0
doc/classes/ProjectSettings.xml

@@ -1444,6 +1444,9 @@
 		<member name="input_devices/pointing/android/enable_pan_and_scale_gestures" type="bool" setter="" getter="" default="false">
 			If [code]true[/code], multi-touch pan and scale gestures are enabled on Android devices.
 		</member>
+		<member name="input_devices/pointing/android/override_volume_buttons" type="bool" setter="" getter="" default="false">
+			If [code]true[/code], system volume changes are disabled when the buttons are used within the app.
+		</member>
 		<member name="input_devices/pointing/android/rotary_input_scroll_axis" type="int" setter="" getter="" default="1">
 			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.
 		</member>

+ 4 - 0
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.
 	 */

+ 2 - 0
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"))

+ 2 - 0
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) {

+ 13 - 8
platform/android/java/lib/src/org/godotengine/godot/input/GodotInputHandler.java

@@ -89,6 +89,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;
@@ -137,6 +138,10 @@ public class GodotInputHandler implements InputManager.InputDeviceListener, Sens
 		rotaryInputAxis = axis;
 	}
 
+	public void setOverrideVolumeButtons(boolean value) {
+		overrideVolumeButtons = value;
+	}
+
 	boolean hasHardwareKeyboard() {
 		return !mHardwareKeyboardIds.isEmpty();
 	}
@@ -159,10 +164,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
@@ -180,14 +181,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();
@@ -208,6 +209,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;
 	}