You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-05 12:10:55 +00:00
Android: enable support for volume button events
- Enable events KEY_VOLUMEUP and KEY_VOLUMEDOWN on Android. - Adds a project setting to override volume buttons. It would disable system volume changes when the buttons are used within the project.
This commit is contained in:
@@ -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_long_press_as_right_click", false);
|
||||||
GLOBAL_DEF_BASIC("input_devices/pointing/android/enable_pan_and_scale_gestures", 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_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().
|
// 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());
|
GLOBAL_DEF_INTERNAL("application/config/features", PackedStringArray());
|
||||||
|
|||||||
@@ -1444,6 +1444,9 @@
|
|||||||
<member name="input_devices/pointing/android/enable_pan_and_scale_gestures" type="bool" setter="" getter="" default="false">
|
<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.
|
If [code]true[/code], multi-touch pan and scale gestures are enabled on Android devices.
|
||||||
</member>
|
</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">
|
<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.
|
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>
|
</member>
|
||||||
|
|||||||
@@ -258,12 +258,14 @@ abstract class BaseGodotEditor : GodotActivity(), GameMenuFragment.GameMenuListe
|
|||||||
super.onGodotSetupCompleted()
|
super.onGodotSetupCompleted()
|
||||||
val longPressEnabled = enableLongPressGestures()
|
val longPressEnabled = enableLongPressGestures()
|
||||||
val panScaleEnabled = enablePanAndScaleGestures()
|
val panScaleEnabled = enablePanAndScaleGestures()
|
||||||
|
val overrideVolumeButtonsEnabled = overrideVolumeButtons()
|
||||||
|
|
||||||
runOnUiThread {
|
runOnUiThread {
|
||||||
// Enable long press, panning and scaling gestures
|
// Enable long press, panning and scaling gestures
|
||||||
godotFragment?.godot?.renderView?.inputHandler?.apply {
|
godotFragment?.godot?.renderView?.inputHandler?.apply {
|
||||||
enableLongPress(longPressEnabled)
|
enableLongPress(longPressEnabled)
|
||||||
enablePanningAndScalingGestures(panScaleEnabled)
|
enablePanningAndScalingGestures(panScaleEnabled)
|
||||||
|
setOverrideVolumeButtons(overrideVolumeButtonsEnabled)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -482,6 +484,8 @@ abstract class BaseGodotEditor : GodotActivity(), GameMenuFragment.GameMenuListe
|
|||||||
*/
|
*/
|
||||||
protected open fun overrideOrientationRequest() = true
|
protected open fun overrideOrientationRequest() = true
|
||||||
|
|
||||||
|
protected open fun overrideVolumeButtons() = false
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Enable long press gestures for the Godot Android editor.
|
* Enable long press gestures for the Godot Android editor.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -46,6 +46,8 @@ abstract class BaseGodotGame: GodotEditor() {
|
|||||||
private val TAG = BaseGodotGame::class.java.simpleName
|
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 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"))
|
override fun enablePanAndScaleGestures() = java.lang.Boolean.parseBoolean(GodotLib.getGlobal("input_devices/pointing/android/enable_pan_and_scale_gestures"))
|
||||||
|
|||||||
@@ -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 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 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 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 {
|
runOnUiThread {
|
||||||
renderView?.inputHandler?.apply {
|
renderView?.inputHandler?.apply {
|
||||||
enableLongPress(longPressEnabled)
|
enableLongPress(longPressEnabled)
|
||||||
enablePanningAndScalingGestures(panScaleEnabled)
|
enablePanningAndScalingGestures(panScaleEnabled)
|
||||||
|
setOverrideVolumeButtons(overrideVolumeButtons)
|
||||||
try {
|
try {
|
||||||
setRotaryInputAxis(Integer.parseInt(rotaryInputAxisValue))
|
setRotaryInputAxis(Integer.parseInt(rotaryInputAxisValue))
|
||||||
} catch (e: NumberFormatException) {
|
} catch (e: NumberFormatException) {
|
||||||
|
|||||||
@@ -88,6 +88,7 @@ public class GodotInputHandler implements InputManager.InputDeviceListener, Sens
|
|||||||
private int rotaryInputAxis = ROTARY_INPUT_VERTICAL_AXIS;
|
private int rotaryInputAxis = ROTARY_INPUT_VERTICAL_AXIS;
|
||||||
|
|
||||||
private int cachedRotation = -1;
|
private int cachedRotation = -1;
|
||||||
|
private boolean overrideVolumeButtons = false;
|
||||||
|
|
||||||
public GodotInputHandler(Context context, Godot godot) {
|
public GodotInputHandler(Context context, Godot godot) {
|
||||||
this.godot = godot;
|
this.godot = godot;
|
||||||
@@ -136,6 +137,10 @@ public class GodotInputHandler implements InputManager.InputDeviceListener, Sens
|
|||||||
rotaryInputAxis = axis;
|
rotaryInputAxis = axis;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setOverrideVolumeButtons(boolean value) {
|
||||||
|
overrideVolumeButtons = value;
|
||||||
|
}
|
||||||
|
|
||||||
boolean hasHardwareKeyboard() {
|
boolean hasHardwareKeyboard() {
|
||||||
return !mHardwareKeyboardIds.isEmpty();
|
return !mHardwareKeyboardIds.isEmpty();
|
||||||
}
|
}
|
||||||
@@ -157,10 +162,6 @@ public class GodotInputHandler implements InputManager.InputDeviceListener, Sens
|
|||||||
}
|
}
|
||||||
|
|
||||||
public boolean onKeyUp(final int keyCode, KeyEvent event) {
|
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();
|
int source = event.getSource();
|
||||||
if (isKeyEventGameDevice(source)) {
|
if (isKeyEventGameDevice(source)) {
|
||||||
// Check if the device exists
|
// 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);
|
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;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean onKeyDown(final int keyCode, KeyEvent event) {
|
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();
|
int source = event.getSource();
|
||||||
|
|
||||||
final int deviceId = event.getDeviceId();
|
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);
|
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;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user