diff options
| -rw-r--r-- | platform/android/java/src/org/godotengine/godot/Godot.java | 3 | ||||
| -rw-r--r-- | platform/android/java/src/org/godotengine/godot/GodotView.java | 72 | ||||
| -rw-r--r-- | platform/android/java_godot_wrapper.cpp | 8 | ||||
| -rw-r--r-- | platform/android/java_godot_wrapper.h | 2 | ||||
| -rw-r--r-- | platform/android/os_android.cpp | 4 | 
5 files changed, 63 insertions, 26 deletions
diff --git a/platform/android/java/src/org/godotengine/godot/Godot.java b/platform/android/java/src/org/godotengine/godot/Godot.java index 374d40463a..0eeaf0701c 100644 --- a/platform/android/java/src/org/godotengine/godot/Godot.java +++ b/platform/android/java/src/org/godotengine/godot/Godot.java @@ -1059,4 +1059,7 @@ public class Godot extends Activity implements SensorEventListener, IDownloaderC  		mProgressFraction.setText(Helpers.getDownloadProgressString(progress.mOverallProgress,  				progress.mOverallTotal));  	} +	public void initInputDevices() { +		mView.initInputDevices(); +	}  } diff --git a/platform/android/java/src/org/godotengine/godot/GodotView.java b/platform/android/java/src/org/godotengine/godot/GodotView.java index d7cd5b4360..ab28d9ec33 100644 --- a/platform/android/java/src/org/godotengine/godot/GodotView.java +++ b/platform/android/java/src/org/godotengine/godot/GodotView.java @@ -111,6 +111,18 @@ public class GodotView extends GLSurfaceView implements InputDeviceListener {  		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")  	@Override  	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  		if (id < 0) {  			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(); + +					joystick joy = new joystick(); +					joy.device_id = deviceId; +					joy.name = device.getName(); +					joy.axes = new ArrayList<InputDevice.MotionRange>(); +					joy.hats = new ArrayList<InputDevice.MotionRange>(); + +					List<InputDevice.MotionRange> ranges = device.getMotionRanges(); +					Collections.sort(ranges, new RangeComparator()); + +					for (InputDevice.MotionRange range : ranges) { +						if (range.getAxis() == MotionEvent.AXIS_HAT_X || range.getAxis() == MotionEvent.AXIS_HAT_Y) { +							joy.hats.add(range); +						} else { +							joy.axes.add(range); +						} +					} -			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>(); - -			List<InputDevice.MotionRange> ranges = device.getMotionRanges(); -			Collections.sort(ranges, new RangeComparator()); +					joy_devices.add(joy); -			for (InputDevice.MotionRange range : ranges) { -				if (range.getAxis() == MotionEvent.AXIS_HAT_X || range.getAxis() == MotionEvent.AXIS_HAT_Y) { -					joy.hats.add(range); -				} else { -					joy.axes.add(range); +					final int device_id = id; +					final String name = joy.name; +					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  	public void onInputDeviceChanged(int deviceId) { +		onInputDeviceRemoved(deviceId); +		onInputDeviceAdded(deviceId);  	}  	@Override  	public boolean onKeyUp(final int keyCode, KeyEvent event) { diff --git a/platform/android/java_godot_wrapper.cpp b/platform/android/java_godot_wrapper.cpp index 101a1d76c6..e92d4437b1 100644 --- a/platform/android/java_godot_wrapper.cpp +++ b/platform/android/java_godot_wrapper.cpp @@ -59,6 +59,7 @@ GodotJavaWrapper::GodotJavaWrapper(JNIEnv *p_env, jobject p_godot_instance) {  	_get_clipboard = p_env->GetMethodID(cls, "getClipboard", "()Ljava/lang/String;");  	_set_clipboard = p_env->GetMethodID(cls, "setClipboard", "(Ljava/lang/String;)V");  	_request_permission = p_env->GetMethodID(cls, "requestPermission", "(Ljava/lang/String;)Z"); +	_init_input_devices = p_env->GetMethodID(cls, "initInputDevices", "()V");  }  GodotJavaWrapper::~GodotJavaWrapper() { @@ -183,3 +184,10 @@ bool GodotJavaWrapper::request_permission(const String &p_name) {  		return false;  	}  } + +void GodotJavaWrapper::init_input_devices() { +	if (_init_input_devices) { +		JNIEnv *env = ThreadAndroid::get_env(); +		env->CallVoidMethod(godot_instance, _init_input_devices); +	} +} diff --git a/platform/android/java_godot_wrapper.h b/platform/android/java_godot_wrapper.h index 438aee019b..be4f109d8c 100644 --- a/platform/android/java_godot_wrapper.h +++ b/platform/android/java_godot_wrapper.h @@ -54,6 +54,7 @@ private:  	jmethodID _get_clipboard = 0;  	jmethodID _set_clipboard = 0;  	jmethodID _request_permission = 0; +	jmethodID _init_input_devices = 0;  public:  	GodotJavaWrapper(JNIEnv *p_env, jobject p_godot_instance); @@ -76,6 +77,7 @@ public:  	bool has_set_clipboard();  	void set_clipboard(const String &p_text);  	bool request_permission(const String &p_name); +	void init_input_devices();  };  #endif /* !JAVA_GODOT_WRAPPER_H */ diff --git a/platform/android/os_android.cpp b/platform/android/os_android.cpp index ff1632cba8..f8076dfd2d 100644 --- a/platform/android/os_android.cpp +++ b/platform/android/os_android.cpp @@ -251,6 +251,10 @@ int OS_Android::get_mouse_button_state() const {  }  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) {  |