1
0
mirror of https://github.com/godotengine/godot.git synced 2025-11-11 13:10:58 +00:00

Android: Include Joysticks/Gamepads which are available on app start.

This commit is contained in:
wombatstampede
2019-05-03 15:56:44 +02:00
parent b71254a861
commit 6e46701e64
5 changed files with 61 additions and 24 deletions

View File

@@ -1059,4 +1059,7 @@ public class Godot extends Activity implements SensorEventListener, IDownloaderC
mProgressFraction.setText(Helpers.getDownloadProgressString(progress.mOverallProgress, mProgressFraction.setText(Helpers.getDownloadProgressString(progress.mOverallProgress,
progress.mOverallTotal)); progress.mOverallTotal));
} }
public void initInputDevices() {
mView.initInputDevices();
}
} }

View File

@@ -111,6 +111,18 @@ public class GodotView extends GLSurfaceView implements InputDeviceListener {
init(translucent, depth, stencil); init(translucent, depth, stencil);
} }
public void initInputDevices() {
/* initially add input devices*/
int[] deviceIds = mInputManager.getInputDeviceIds();
for (int deviceId : deviceIds) {
InputDevice device = mInputManager.getInputDevice(deviceId);
if (DEBUG) {
Log.v("GodotView", String.format("init() deviceId:%d, Name:%s\n", deviceId, device.getName()));
}
onInputDeviceAdded(deviceId);
}
}
@SuppressLint("ClickableViewAccessibility") @SuppressLint("ClickableViewAccessibility")
@Override @Override
public boolean onTouchEvent(MotionEvent event) { public boolean onTouchEvent(MotionEvent event) {
@@ -217,36 +229,42 @@ public class GodotView extends GLSurfaceView implements InputDeviceListener {
// Check if the device has not been already added // Check if the device has not been already added
if (id < 0) { if (id < 0) {
InputDevice device = mInputManager.getInputDevice(deviceId); InputDevice device = mInputManager.getInputDevice(deviceId);
//device can be null if deviceId is not found
if (device != null) {
int sources = device.getSources();
if (((sources & InputDevice.SOURCE_GAMEPAD) == InputDevice.SOURCE_GAMEPAD) ||
((sources & InputDevice.SOURCE_JOYSTICK) == InputDevice.SOURCE_JOYSTICK)) {
id = joy_devices.size();
id = joy_devices.size(); joystick joy = new joystick();
joy.device_id = deviceId;
joy.name = device.getName();
joy.axes = new ArrayList<InputDevice.MotionRange>();
joy.hats = new ArrayList<InputDevice.MotionRange>();
joystick joy = new joystick(); List<InputDevice.MotionRange> ranges = device.getMotionRanges();
joy.device_id = deviceId; Collections.sort(ranges, new RangeComparator());
joy.name = device.getName();
joy.axes = new ArrayList<InputDevice.MotionRange>();
joy.hats = new ArrayList<InputDevice.MotionRange>();
List<InputDevice.MotionRange> ranges = device.getMotionRanges(); for (InputDevice.MotionRange range : ranges) {
Collections.sort(ranges, new RangeComparator()); if (range.getAxis() == MotionEvent.AXIS_HAT_X || range.getAxis() == MotionEvent.AXIS_HAT_Y) {
joy.hats.add(range);
} else {
joy.axes.add(range);
}
}
for (InputDevice.MotionRange range : ranges) { joy_devices.add(joy);
if (range.getAxis() == MotionEvent.AXIS_HAT_X || range.getAxis() == MotionEvent.AXIS_HAT_Y) {
joy.hats.add(range); final int device_id = id;
} else { final String name = joy.name;
joy.axes.add(range); queueEvent(new Runnable() {
@Override
public void run() {
GodotLib.joyconnectionchanged(device_id, true, name);
}
});
} }
} }
joy_devices.add(joy);
final int device_id = id;
final String name = joy.name;
queueEvent(new Runnable() {
@Override
public void run() {
GodotLib.joyconnectionchanged(device_id, true, name);
}
});
} }
} }
@@ -269,6 +287,8 @@ public class GodotView extends GLSurfaceView implements InputDeviceListener {
@Override @Override
public void onInputDeviceChanged(int deviceId) { public void onInputDeviceChanged(int deviceId) {
onInputDeviceRemoved(deviceId);
onInputDeviceAdded(deviceId);
} }
@Override @Override
public boolean onKeyUp(final int keyCode, KeyEvent event) { public boolean onKeyUp(final int keyCode, KeyEvent event) {

View File

@@ -59,6 +59,7 @@ GodotJavaWrapper::GodotJavaWrapper(JNIEnv *p_env, jobject p_godot_instance) {
_get_clipboard = p_env->GetMethodID(cls, "getClipboard", "()Ljava/lang/String;"); _get_clipboard = p_env->GetMethodID(cls, "getClipboard", "()Ljava/lang/String;");
_set_clipboard = p_env->GetMethodID(cls, "setClipboard", "(Ljava/lang/String;)V"); _set_clipboard = p_env->GetMethodID(cls, "setClipboard", "(Ljava/lang/String;)V");
_request_permission = p_env->GetMethodID(cls, "requestPermission", "(Ljava/lang/String;)Z"); _request_permission = p_env->GetMethodID(cls, "requestPermission", "(Ljava/lang/String;)Z");
_init_input_devices = p_env->GetMethodID(cls, "initInputDevices", "()V");
} }
GodotJavaWrapper::~GodotJavaWrapper() { GodotJavaWrapper::~GodotJavaWrapper() {
@@ -183,3 +184,10 @@ bool GodotJavaWrapper::request_permission(const String &p_name) {
return false; return false;
} }
} }
void GodotJavaWrapper::init_input_devices() {
if (_init_input_devices) {
JNIEnv *env = ThreadAndroid::get_env();
env->CallVoidMethod(godot_instance, _init_input_devices);
}
}

View File

@@ -54,6 +54,7 @@ private:
jmethodID _get_clipboard = 0; jmethodID _get_clipboard = 0;
jmethodID _set_clipboard = 0; jmethodID _set_clipboard = 0;
jmethodID _request_permission = 0; jmethodID _request_permission = 0;
jmethodID _init_input_devices = 0;
public: public:
GodotJavaWrapper(JNIEnv *p_env, jobject p_godot_instance); GodotJavaWrapper(JNIEnv *p_env, jobject p_godot_instance);
@@ -76,6 +77,7 @@ public:
bool has_set_clipboard(); bool has_set_clipboard();
void set_clipboard(const String &p_text); void set_clipboard(const String &p_text);
bool request_permission(const String &p_name); bool request_permission(const String &p_name);
void init_input_devices();
}; };
#endif /* !JAVA_GODOT_WRAPPER_H */ #endif /* !JAVA_GODOT_WRAPPER_H */

View File

@@ -251,6 +251,10 @@ int OS_Android::get_mouse_button_state() const {
} }
void OS_Android::set_window_title(const String &p_title) { void OS_Android::set_window_title(const String &p_title) {
//This queries/updates the currently connected devices/joypads
//Set_window_title is called when initializing the main loop (main.cpp)
//therefore this place is found to be suitable (I found no better).
godot_java->init_input_devices();
} }
void OS_Android::set_video_mode(const VideoMode &p_video_mode, int p_screen) { void OS_Android::set_video_mode(const VideoMode &p_video_mode, int p_screen) {