| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | /*************************************************************************/ | 
					
						
							|  |  |  | /*  os_android.cpp                                                       */ | 
					
						
							|  |  |  | /*************************************************************************/ | 
					
						
							|  |  |  | /*                       This file is part of:                           */ | 
					
						
							|  |  |  | /*                           GODOT ENGINE                                */ | 
					
						
							| 
									
										
										
										
											2017-08-27 14:16:55 +02:00
										 |  |  | /*                      https://godotengine.org                          */ | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | /*************************************************************************/ | 
					
						
							| 
									
										
										
										
											2019-01-01 12:53:14 +01:00
										 |  |  | /* Copyright (c) 2007-2019 Juan Linietsky, Ariel Manzur.                 */ | 
					
						
							|  |  |  | /* Copyright (c) 2014-2019 Godot Engine contributors (cf. AUTHORS.md)    */ | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | /*                                                                       */ | 
					
						
							|  |  |  | /* Permission is hereby granted, free of charge, to any person obtaining */ | 
					
						
							|  |  |  | /* a copy of this software and associated documentation files (the       */ | 
					
						
							|  |  |  | /* "Software"), to deal in the Software without restriction, including   */ | 
					
						
							|  |  |  | /* without limitation the rights to use, copy, modify, merge, publish,   */ | 
					
						
							|  |  |  | /* distribute, sublicense, and/or sell copies of the Software, and to    */ | 
					
						
							|  |  |  | /* permit persons to whom the Software is furnished to do so, subject to */ | 
					
						
							|  |  |  | /* the following conditions:                                             */ | 
					
						
							|  |  |  | /*                                                                       */ | 
					
						
							|  |  |  | /* The above copyright notice and this permission notice shall be        */ | 
					
						
							|  |  |  | /* included in all copies or substantial portions of the Software.       */ | 
					
						
							|  |  |  | /*                                                                       */ | 
					
						
							|  |  |  | /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,       */ | 
					
						
							|  |  |  | /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF    */ | 
					
						
							|  |  |  | /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ | 
					
						
							|  |  |  | /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY  */ | 
					
						
							|  |  |  | /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,  */ | 
					
						
							|  |  |  | /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE     */ | 
					
						
							|  |  |  | /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */ | 
					
						
							|  |  |  | /*************************************************************************/ | 
					
						
							| 
									
										
										
										
											2018-01-05 00:50:27 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | #include "os_android.h"
 | 
					
						
							| 
									
										
										
										
											2015-01-10 17:35:26 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | #include "core/io/file_access_buffered_fa.h"
 | 
					
						
							| 
									
										
										
										
											2017-07-19 17:00:46 -03:00
										 |  |  | #include "core/project_settings.h"
 | 
					
						
							| 
									
										
										
										
											2018-06-25 22:43:46 +08:00
										 |  |  | #include "drivers/gles2/rasterizer_gles2.h"
 | 
					
						
							| 
									
										
										
										
											2017-03-20 23:31:41 -03:00
										 |  |  | #include "drivers/gles3/rasterizer_gles3.h"
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | #include "drivers/unix/dir_access_unix.h"
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | #include "drivers/unix/file_access_unix.h"
 | 
					
						
							|  |  |  | #include "file_access_android.h"
 | 
					
						
							|  |  |  | #include "main/main.h"
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | #include "servers/visual/visual_server_raster.h"
 | 
					
						
							| 
									
										
										
										
											2018-11-01 10:27:04 -03:00
										 |  |  | #include "servers/visual/visual_server_wrap_mt.h"
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include "dir_access_jandroid.h"
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | #include "file_access_jandroid.h"
 | 
					
						
							| 
									
										
										
										
											2019-11-25 15:01:44 +01:00
										 |  |  | #include "net_socket_android.h"
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-13 20:40:20 +07:00
										 |  |  | #include <dlfcn.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-13 23:51:55 +11:00
										 |  |  | #include "java_godot_io_wrapper.h"
 | 
					
						
							|  |  |  | #include "java_godot_wrapper.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-22 12:56:02 +07:00
										 |  |  | class AndroidLogger : public Logger { | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  | 	virtual void logv(const char *p_format, va_list p_list, bool p_err) { | 
					
						
							|  |  |  | 		__android_log_vprint(p_err ? ANDROID_LOG_ERROR : ANDROID_LOG_INFO, "godot", p_format, p_list); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	virtual ~AndroidLogger() {} | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | int OS_Android::get_video_driver_count() const { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-25 00:04:25 +02:00
										 |  |  | 	return 2; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2016-07-21 12:07:01 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | const char *OS_Android::get_video_driver_name(int p_driver) const { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-25 00:04:25 +02:00
										 |  |  | 	switch (p_driver) { | 
					
						
							|  |  |  | 		case VIDEO_DRIVER_GLES3: | 
					
						
							|  |  |  | 			return "GLES3"; | 
					
						
							|  |  |  | 		case VIDEO_DRIVER_GLES2: | 
					
						
							|  |  |  | 			return "GLES2"; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2019-08-09 06:49:33 +02:00
										 |  |  | 	ERR_FAIL_V_MSG(NULL, "Invalid video driver index: " + itos(p_driver) + "."); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } | 
					
						
							|  |  |  | int OS_Android::get_audio_driver_count() const { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return 1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | const char *OS_Android::get_audio_driver_name(int p_driver) const { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return "Android"; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void OS_Android::initialize_core() { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	OS_Unix::initialize_core(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-27 23:21:45 -03:00
										 |  |  | 	if (use_apk_expansion) | 
					
						
							|  |  |  | 		FileAccess::make_default<FileAccessUnix>(FileAccess::ACCESS_RESOURCES); | 
					
						
							| 
									
										
										
										
											2015-09-03 23:24:55 -03:00
										 |  |  | 	else { | 
					
						
							|  |  |  | #ifdef USE_JAVA_FILE_ACCESS
 | 
					
						
							| 
									
										
										
										
											2014-06-27 23:21:45 -03:00
										 |  |  | 		FileAccess::make_default<FileAccessBufferedFA<FileAccessJAndroid> >(FileAccess::ACCESS_RESOURCES); | 
					
						
							| 
									
										
										
										
											2015-09-03 23:24:55 -03:00
										 |  |  | #else
 | 
					
						
							|  |  |  | 		//FileAccess::make_default<FileAccessBufferedFA<FileAccessAndroid> >(FileAccess::ACCESS_RESOURCES);
 | 
					
						
							|  |  |  | 		FileAccess::make_default<FileAccessAndroid>(FileAccess::ACCESS_RESOURCES); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	FileAccess::make_default<FileAccessUnix>(FileAccess::ACCESS_USERDATA); | 
					
						
							|  |  |  | 	FileAccess::make_default<FileAccessUnix>(FileAccess::ACCESS_FILESYSTEM); | 
					
						
							|  |  |  | 	//FileAccessBufferedFA<FileAccessUnix>::make_default();
 | 
					
						
							| 
									
										
										
										
											2014-06-27 23:21:45 -03:00
										 |  |  | 	if (use_apk_expansion) | 
					
						
							|  |  |  | 		DirAccess::make_default<DirAccessUnix>(DirAccess::ACCESS_RESOURCES); | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 		DirAccess::make_default<DirAccessJAndroid>(DirAccess::ACCESS_RESOURCES); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	DirAccess::make_default<DirAccessUnix>(DirAccess::ACCESS_USERDATA); | 
					
						
							|  |  |  | 	DirAccess::make_default<DirAccessUnix>(DirAccess::ACCESS_FILESYSTEM); | 
					
						
							| 
									
										
										
										
											2019-11-25 15:01:44 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	NetSocketAndroid::make_default(); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | void OS_Android::set_opengl_extensions(const char *p_gl_extensions) { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	ERR_FAIL_COND(!p_gl_extensions); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	gl_extensions = p_gl_extensions; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2018-07-20 08:37:10 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-19 18:58:15 -03:00
										 |  |  | int OS_Android::get_current_video_driver() const { | 
					
						
							|  |  |  | 	return video_driver_index; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-03 18:26:44 +01:00
										 |  |  | Error OS_Android::initialize(const VideoMode &p_desired, int p_video_driver, int p_audio_driver) { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-13 23:51:55 +11:00
										 |  |  | 	bool use_gl3 = godot_java->get_gles_version_code() >= 0x00030000; | 
					
						
							| 
									
										
										
										
											2018-06-25 22:43:46 +08:00
										 |  |  | 	use_gl3 = use_gl3 && (GLOBAL_GET("rendering/quality/driver/driver_name") == "GLES3"); | 
					
						
							| 
									
										
										
										
											2018-08-25 00:04:25 +02:00
										 |  |  | 	bool gl_initialization_error = false; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	while (true) { | 
					
						
							|  |  |  | 		if (use_gl3) { | 
					
						
							|  |  |  | 			if (RasterizerGLES3::is_viable() == OK) { | 
					
						
							| 
									
										
										
										
											2019-03-13 23:51:55 +11:00
										 |  |  | 				godot_java->gfx_init(false); | 
					
						
							| 
									
										
										
										
											2018-08-25 00:04:25 +02:00
										 |  |  | 				RasterizerGLES3::register_config(); | 
					
						
							|  |  |  | 				RasterizerGLES3::make_current(); | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 			} else { | 
					
						
							| 
									
										
										
										
											2019-03-05 13:46:51 +01:00
										 |  |  | 				if (GLOBAL_GET("rendering/quality/driver/fallback_to_gles2")) { | 
					
						
							| 
									
										
										
										
											2018-08-25 00:04:25 +02:00
										 |  |  | 					p_video_driver = VIDEO_DRIVER_GLES2; | 
					
						
							|  |  |  | 					use_gl3 = false; | 
					
						
							|  |  |  | 					continue; | 
					
						
							|  |  |  | 				} else { | 
					
						
							|  |  |  | 					gl_initialization_error = true; | 
					
						
							|  |  |  | 					break; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			if (RasterizerGLES2::is_viable() == OK) { | 
					
						
							| 
									
										
										
										
											2019-03-13 23:51:55 +11:00
										 |  |  | 				godot_java->gfx_init(true); | 
					
						
							| 
									
										
										
										
											2018-08-25 00:04:25 +02:00
										 |  |  | 				RasterizerGLES2::register_config(); | 
					
						
							|  |  |  | 				RasterizerGLES2::make_current(); | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 			} else { | 
					
						
							|  |  |  | 				gl_initialization_error = true; | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (gl_initialization_error) { | 
					
						
							|  |  |  | 		OS::get_singleton()->alert("Your device does not support any of the supported OpenGL versions.\n" | 
					
						
							|  |  |  | 								   "Please try updating your Android version.", | 
					
						
							|  |  |  | 				"Unable to initialize Video driver"); | 
					
						
							|  |  |  | 		return ERR_UNAVAILABLE; | 
					
						
							| 
									
										
										
										
											2018-06-25 22:43:46 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-25 00:04:25 +02:00
										 |  |  | 	video_driver_index = p_video_driver; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-01 19:22:15 +01:00
										 |  |  | 	visual_server = memnew(VisualServerRaster); | 
					
						
							| 
									
										
										
										
											2018-11-01 10:27:04 -03:00
										 |  |  | 	if (get_render_thread_mode() != RENDER_THREAD_UNSAFE) { | 
					
						
							| 
									
										
										
										
											2014-03-13 22:57:24 -03:00
										 |  |  | 		visual_server = memnew(VisualServerWrapMT(visual_server, false)); | 
					
						
							| 
									
										
										
										
											2018-11-01 10:27:04 -03:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2018-08-25 00:04:25 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	visual_server->init(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-13 13:34:22 -03:00
										 |  |  | 	AudioDriverManager::initialize(p_audio_driver); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	input = memnew(InputDefault); | 
					
						
							| 
									
										
										
										
											2019-08-26 17:47:13 -07:00
										 |  |  | 	input->set_fallback_mapping(godot_java->get_input_fallback_mapping()); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-12 15:43:54 +01:00
										 |  |  | 	//power_manager = memnew(PowerAndroid);
 | 
					
						
							| 
									
										
										
										
											2018-01-03 18:26:44 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return OK; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | void OS_Android::set_main_loop(MainLoop *p_main_loop) { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	main_loop = p_main_loop; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	input->set_main_loop(p_main_loop); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void OS_Android::delete_main_loop() { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	memdelete(main_loop); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void OS_Android::finalize() { | 
					
						
							| 
									
										
										
										
											2017-08-21 00:17:24 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	memdelete(input); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-13 23:51:55 +11:00
										 |  |  | GodotJavaWrapper *OS_Android::get_godot_java() { | 
					
						
							|  |  |  | 	return godot_java; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | GodotIOJavaWrapper *OS_Android::get_godot_io_java() { | 
					
						
							|  |  |  | 	return godot_io_java; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | void OS_Android::alert(const String &p_alert, const String &p_title) { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-20 23:31:41 -03:00
										 |  |  | 	//print("ALERT: %s\n", p_alert.utf8().get_data());
 | 
					
						
							| 
									
										
										
										
											2019-03-13 23:51:55 +11:00
										 |  |  | 	godot_java->alert(p_alert, p_title); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-04 23:06:37 -03:00
										 |  |  | bool OS_Android::request_permission(const String &p_name) { | 
					
						
							| 
									
										
										
										
											2019-03-13 23:51:55 +11:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return godot_java->request_permission(p_name); | 
					
						
							| 
									
										
										
										
											2019-03-04 23:06:37 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-06 21:17:44 +03:00
										 |  |  | bool OS_Android::request_permissions() { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return godot_java->request_permissions(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Vector<String> OS_Android::get_granted_permissions() const { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return godot_java->get_granted_permissions(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-13 20:40:20 +07:00
										 |  |  | Error OS_Android::open_dynamic_library(const String p_path, void *&p_library_handle, bool p_also_set_library_path) { | 
					
						
							|  |  |  | 	p_library_handle = dlopen(p_path.utf8().get_data(), RTLD_NOW); | 
					
						
							| 
									
										
										
										
											2019-08-09 06:49:33 +02:00
										 |  |  | 	ERR_FAIL_COND_V_MSG(!p_library_handle, ERR_CANT_OPEN, "Can't open dynamic library: " + p_path + ", error: " + dlerror() + "."); | 
					
						
							| 
									
										
										
										
											2018-01-13 20:40:20 +07:00
										 |  |  | 	return OK; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | void OS_Android::set_mouse_show(bool p_show) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	//android has no mouse...
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void OS_Android::set_mouse_grab(bool p_grab) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	//it really has no mouse...!
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | bool OS_Android::is_mouse_grab_enabled() const { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	//*sigh* technology has evolved so much since i was a kid..
 | 
					
						
							|  |  |  | 	return false; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2016-07-21 12:07:01 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-29 11:29:38 -04:00
										 |  |  | Point2 OS_Android::get_mouse_position() const { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return Point2(); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2016-07-21 12:07:01 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | int OS_Android::get_mouse_button_state() const { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return 0; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2018-04-03 11:58:17 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | void OS_Android::set_window_title(const String &p_title) { | 
					
						
							| 
									
										
										
										
											2019-05-03 15:56:44 +02:00
										 |  |  | 	//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(); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | void OS_Android::set_video_mode(const VideoMode &p_video_mode, int p_screen) { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | OS::VideoMode OS_Android::get_video_mode(int p_screen) const { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return default_videomode; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2016-07-21 12:07:01 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | void OS_Android::get_fullscreen_mode_list(List<VideoMode> *p_list, int p_screen) const { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	p_list->push_back(default_videomode); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-27 23:40:04 +09:00
										 |  |  | void OS_Android::set_keep_screen_on(bool p_enabled) { | 
					
						
							|  |  |  | 	OS::set_keep_screen_on(p_enabled); | 
					
						
							| 
									
										
										
										
											2016-03-09 00:00:52 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-13 23:51:55 +11:00
										 |  |  | 	godot_java->set_keep_screen_on(p_enabled); | 
					
						
							| 
									
										
										
										
											2015-11-27 23:40:04 +09:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-23 11:31:03 -03:00
										 |  |  | Size2 OS_Android::get_window_size() const { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	return Vector2(default_videomode.width, default_videomode.height); | 
					
						
							| 
									
										
										
										
											2015-03-23 11:31:03 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-20 13:36:24 -04:00
										 |  |  | String OS_Android::get_name() const { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return "Android"; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | MainLoop *OS_Android::get_main_loop() const { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return main_loop; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | bool OS_Android::can_draw() const { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return true; //always?
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void OS_Android::main_loop_begin() { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (main_loop) | 
					
						
							|  |  |  | 		main_loop->init(); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2016-07-21 12:07:01 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | bool OS_Android::main_loop_iterate() { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (!main_loop) | 
					
						
							|  |  |  | 		return false; | 
					
						
							|  |  |  | 	return Main::iteration(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void OS_Android::main_loop_end() { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (main_loop) | 
					
						
							|  |  |  | 		main_loop->finish(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void OS_Android::main_loop_focusout() { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (main_loop) | 
					
						
							|  |  |  | 		main_loop->notification(MainLoop::NOTIFICATION_WM_FOCUS_OUT); | 
					
						
							|  |  |  | 	audio_driver_android.set_pause(true); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | void OS_Android::main_loop_focusin() { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	if (main_loop) | 
					
						
							|  |  |  | 		main_loop->notification(MainLoop::NOTIFICATION_WM_FOCUS_IN); | 
					
						
							|  |  |  | 	audio_driver_android.set_pause(false); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-08 17:05:51 -03:00
										 |  |  | void OS_Android::process_joy_event(OS_Android::JoypadEvent p_event) { | 
					
						
							| 
									
										
										
										
											2016-01-24 05:11:59 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	switch (p_event.type) { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		case JOY_EVENT_BUTTON: | 
					
						
							| 
									
										
										
										
											2017-06-06 22:29:19 -05:00
										 |  |  | 			input->joy_button(p_event.device, p_event.index, p_event.pressed); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 			break; | 
					
						
							|  |  |  | 		case JOY_EVENT_AXIS: | 
					
						
							|  |  |  | 			InputDefault::JoyAxis value; | 
					
						
							|  |  |  | 			value.min = -1; | 
					
						
							|  |  |  | 			value.value = p_event.value; | 
					
						
							| 
									
										
										
										
											2017-03-26 15:59:13 +02:00
										 |  |  | 			input->joy_axis(p_event.device, p_event.index, value); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 			break; | 
					
						
							|  |  |  | 		case JOY_EVENT_HAT: | 
					
						
							| 
									
										
										
										
											2017-03-26 15:59:13 +02:00
										 |  |  | 			input->joy_hat(p_event.device, p_event.hat); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 			break; | 
					
						
							|  |  |  | 		default: | 
					
						
							|  |  |  | 			return; | 
					
						
							| 
									
										
										
										
											2016-01-24 05:11:59 +01:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-20 12:38:03 -03:00
										 |  |  | void OS_Android::process_event(Ref<InputEvent> p_event) { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	input->parse_input_event(p_event); | 
					
						
							| 
									
										
										
										
											2016-07-21 12:07:01 +02:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | void OS_Android::process_touch(int p_what, int p_pointer, const Vector<TouchPos> &p_points) { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	switch (p_what) { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 		case 0: { //gesture begin
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			if (touch.size()) { | 
					
						
							|  |  |  | 				//end all if exist
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 				for (int i = 0; i < touch.size(); i++) { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-20 12:38:03 -03:00
										 |  |  | 					Ref<InputEventScreenTouch> ev; | 
					
						
							|  |  |  | 					ev.instance(); | 
					
						
							|  |  |  | 					ev->set_index(touch[i].id); | 
					
						
							|  |  |  | 					ev->set_pressed(false); | 
					
						
							| 
									
										
										
										
											2017-06-03 10:54:24 +02:00
										 |  |  | 					ev->set_position(touch[i].pos); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 					input->parse_input_event(ev); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			touch.resize(p_points.size()); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 			for (int i = 0; i < p_points.size(); i++) { | 
					
						
							| 
									
										
										
										
											2018-07-25 03:11:03 +02:00
										 |  |  | 				touch.write[i].id = p_points[i].id; | 
					
						
							|  |  |  | 				touch.write[i].pos = p_points[i].pos; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			//send touch
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 			for (int i = 0; i < touch.size(); i++) { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-20 12:38:03 -03:00
										 |  |  | 				Ref<InputEventScreenTouch> ev; | 
					
						
							|  |  |  | 				ev.instance(); | 
					
						
							|  |  |  | 				ev->set_index(touch[i].id); | 
					
						
							|  |  |  | 				ev->set_pressed(true); | 
					
						
							| 
									
										
										
										
											2017-06-06 22:29:19 -05:00
										 |  |  | 				ev->set_position(touch[i].pos); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 				input->parse_input_event(ev); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		} break; | 
					
						
							|  |  |  | 		case 1: { //motion
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 			ERR_FAIL_COND(touch.size() != p_points.size()); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 			for (int i = 0; i < touch.size(); i++) { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 				int idx = -1; | 
					
						
							|  |  |  | 				for (int j = 0; j < p_points.size(); j++) { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 					if (touch[i].id == p_points[j].id) { | 
					
						
							|  |  |  | 						idx = j; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 						break; | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 				ERR_CONTINUE(idx == -1); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 				if (touch[i].pos == p_points[idx].pos) | 
					
						
							| 
									
										
										
										
											2019-11-11 08:29:12 +01:00
										 |  |  | 					continue; //no move unncesearily
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-20 12:38:03 -03:00
										 |  |  | 				Ref<InputEventScreenDrag> ev; | 
					
						
							|  |  |  | 				ev.instance(); | 
					
						
							|  |  |  | 				ev->set_index(touch[i].id); | 
					
						
							| 
									
										
										
										
											2017-06-06 22:29:19 -05:00
										 |  |  | 				ev->set_position(p_points[idx].pos); | 
					
						
							| 
									
										
										
										
											2017-05-20 12:38:03 -03:00
										 |  |  | 				ev->set_relative(p_points[idx].pos - touch[i].pos); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 				input->parse_input_event(ev); | 
					
						
							| 
									
										
										
										
											2018-07-25 03:11:03 +02:00
										 |  |  | 				touch.write[i].pos = p_points[idx].pos; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		} break; | 
					
						
							|  |  |  | 		case 2: { //release
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			if (touch.size()) { | 
					
						
							|  |  |  | 				//end all if exist
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 				for (int i = 0; i < touch.size(); i++) { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-20 12:38:03 -03:00
										 |  |  | 					Ref<InputEventScreenTouch> ev; | 
					
						
							|  |  |  | 					ev.instance(); | 
					
						
							|  |  |  | 					ev->set_index(touch[i].id); | 
					
						
							|  |  |  | 					ev->set_pressed(false); | 
					
						
							| 
									
										
										
										
											2017-06-03 10:54:24 +02:00
										 |  |  | 					ev->set_position(touch[i].pos); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 					input->parse_input_event(ev); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				touch.clear(); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} break; | 
					
						
							| 
									
										
										
										
											2018-01-07 23:11:58 +09:00
										 |  |  | 		case 3: { // add touch
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-07 23:11:58 +09:00
										 |  |  | 			for (int i = 0; i < p_points.size(); i++) { | 
					
						
							|  |  |  | 				if (p_points[i].id == p_pointer) { | 
					
						
							|  |  |  | 					TouchPos tp = p_points[i]; | 
					
						
							|  |  |  | 					touch.push_back(tp); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-07 23:11:58 +09:00
										 |  |  | 					Ref<InputEventScreenTouch> ev; | 
					
						
							|  |  |  | 					ev.instance(); | 
					
						
							| 
									
										
										
										
											2017-05-20 12:38:03 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-07 23:11:58 +09:00
										 |  |  | 					ev->set_index(tp.id); | 
					
						
							|  |  |  | 					ev->set_pressed(true); | 
					
						
							|  |  |  | 					ev->set_position(tp.pos); | 
					
						
							|  |  |  | 					input->parse_input_event(ev); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-07 23:11:58 +09:00
										 |  |  | 					break; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 		} break; | 
					
						
							| 
									
										
										
										
											2018-01-07 23:11:58 +09:00
										 |  |  | 		case 4: { // remove touch
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 			for (int i = 0; i < touch.size(); i++) { | 
					
						
							|  |  |  | 				if (touch[i].id == p_pointer) { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-20 12:38:03 -03:00
										 |  |  | 					Ref<InputEventScreenTouch> ev; | 
					
						
							|  |  |  | 					ev.instance(); | 
					
						
							|  |  |  | 					ev->set_index(touch[i].id); | 
					
						
							|  |  |  | 					ev->set_pressed(false); | 
					
						
							| 
									
										
										
										
											2017-06-03 10:54:24 +02:00
										 |  |  | 					ev->set_position(touch[i].pos); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 					input->parse_input_event(ev); | 
					
						
							|  |  |  | 					touch.remove(i); | 
					
						
							| 
									
										
										
										
											2018-01-07 23:11:58 +09:00
										 |  |  | 
 | 
					
						
							|  |  |  | 					break; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} break; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-29 17:06:48 +02:00
										 |  |  | void OS_Android::process_hover(int p_type, Point2 p_pos) { | 
					
						
							|  |  |  | 	// https://developer.android.com/reference/android/view/MotionEvent.html#ACTION_HOVER_ENTER
 | 
					
						
							|  |  |  | 	switch (p_type) { | 
					
						
							|  |  |  | 		case 7: // hover move
 | 
					
						
							|  |  |  | 		case 9: // hover enter
 | 
					
						
							|  |  |  | 		case 10: { // hover exit
 | 
					
						
							|  |  |  | 			Ref<InputEventMouseMotion> ev; | 
					
						
							|  |  |  | 			ev.instance(); | 
					
						
							|  |  |  | 			ev->set_position(p_pos); | 
					
						
							|  |  |  | 			ev->set_global_position(p_pos); | 
					
						
							|  |  |  | 			ev->set_relative(p_pos - hover_prev_pos); | 
					
						
							|  |  |  | 			input->parse_input_event(ev); | 
					
						
							|  |  |  | 			hover_prev_pos = p_pos; | 
					
						
							|  |  |  | 		} break; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | void OS_Android::process_accelerometer(const Vector3 &p_accelerometer) { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	input->set_accelerometer(p_accelerometer); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-11 09:42:23 +11:00
										 |  |  | void OS_Android::process_gravity(const Vector3 &p_gravity) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	input->set_gravity(p_gravity); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | void OS_Android::process_magnetometer(const Vector3 &p_magnetometer) { | 
					
						
							| 
									
										
										
										
											2016-05-27 14:29:37 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	input->set_magnetometer(p_magnetometer); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | void OS_Android::process_gyroscope(const Vector3 &p_gyroscope) { | 
					
						
							| 
									
										
										
										
											2016-07-15 15:31:34 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	input->set_gyroscope(p_gyroscope); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | bool OS_Android::has_touchscreen_ui_hint() const { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return true; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | bool OS_Android::has_virtual_keyboard() const { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return true; | 
					
						
							| 
									
										
										
										
											2016-07-21 12:07:01 +02:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-04 15:39:31 +07:00
										 |  |  | int OS_Android::get_virtual_keyboard_height() const { | 
					
						
							| 
									
										
										
										
											2019-03-13 23:51:55 +11:00
										 |  |  | 	return godot_io_java->get_vk_height(); | 
					
						
							| 
									
										
										
										
											2017-10-04 15:39:31 +07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-13 23:51:55 +11:00
										 |  |  | 	// ERR_PRINT("Cannot obtain virtual keyboard height.");
 | 
					
						
							|  |  |  | 	// return 0;
 | 
					
						
							| 
									
										
										
										
											2017-10-04 15:39:31 +07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | void OS_Android::show_virtual_keyboard(const String &p_existing_text, const Rect2 &p_screen_rect) { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-13 23:51:55 +11:00
										 |  |  | 	if (godot_io_java->has_vk()) { | 
					
						
							|  |  |  | 		godot_io_java->show_vk(p_existing_text); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	} else { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		ERR_PRINT("Virtual keyboard not available"); | 
					
						
							|  |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2016-07-21 12:07:01 +02:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | void OS_Android::hide_virtual_keyboard() { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-13 23:51:55 +11:00
										 |  |  | 	if (godot_io_java->has_vk()) { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-13 23:51:55 +11:00
										 |  |  | 		godot_io_java->hide_vk(); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	} else { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		ERR_PRINT("Virtual keyboard not available"); | 
					
						
							|  |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2016-07-21 12:07:01 +02:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | void OS_Android::init_video_mode(int p_video_width, int p_video_height) { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	default_videomode.width = p_video_width; | 
					
						
							|  |  |  | 	default_videomode.height = p_video_height; | 
					
						
							|  |  |  | 	default_videomode.fullscreen = true; | 
					
						
							|  |  |  | 	default_videomode.resizable = false; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-11 16:34:32 -03:00
										 |  |  | void OS_Android::main_loop_request_go_back() { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	if (main_loop) | 
					
						
							| 
									
										
										
										
											2017-01-11 16:34:32 -03:00
										 |  |  | 		main_loop->notification(MainLoop::NOTIFICATION_WM_GO_BACK_REQUEST); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void OS_Android::set_display_size(Size2 p_size) { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	default_videomode.width = p_size.x; | 
					
						
							|  |  |  | 	default_videomode.height = p_size.y; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Error OS_Android::shell_open(String p_uri) { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-13 23:51:55 +11:00
										 |  |  | 	return godot_io_java->open_uri(p_uri); | 
					
						
							| 
									
										
										
										
											2016-07-21 12:07:01 +02:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | String OS_Android::get_resource_dir() const { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-25 07:19:21 +07:00
										 |  |  | 	return "/"; //android has its own filesystem for resources inside the APK
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | String OS_Android::get_locale() const { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-13 23:51:55 +11:00
										 |  |  | 	String locale = godot_io_java->get_locale(); | 
					
						
							|  |  |  | 	if (locale != "") { | 
					
						
							|  |  |  | 		return locale; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	return OS_Unix::get_locale(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-03 11:58:17 -04:00
										 |  |  | void OS_Android::set_clipboard(const String &p_text) { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-13 23:51:55 +11:00
										 |  |  | 	// DO we really need the fallback to OS_Unix here?!
 | 
					
						
							|  |  |  | 	if (godot_java->has_set_clipboard()) { | 
					
						
							|  |  |  | 		godot_java->set_clipboard(p_text); | 
					
						
							| 
									
										
										
										
											2018-04-03 11:58:17 -04:00
										 |  |  | 	} else { | 
					
						
							|  |  |  | 		OS_Unix::set_clipboard(p_text); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | String OS_Android::get_clipboard() const { | 
					
						
							| 
									
										
										
										
											2019-03-13 23:51:55 +11:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// DO we really need the fallback to OS_Unix here?!
 | 
					
						
							|  |  |  | 	if (godot_java->has_get_clipboard()) { | 
					
						
							|  |  |  | 		return godot_java->get_clipboard(); | 
					
						
							| 
									
										
										
										
											2018-04-03 11:58:17 -04:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return OS_Unix::get_clipboard(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | String OS_Android::get_model_name() const { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-13 23:51:55 +11:00
										 |  |  | 	String model = godot_io_java->get_model(); | 
					
						
							|  |  |  | 	if (model != "") | 
					
						
							|  |  |  | 		return model; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	return OS_Unix::get_model_name(); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-20 14:54:48 +02:00
										 |  |  | int OS_Android::get_screen_dpi(int p_screen) const { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-13 23:51:55 +11:00
										 |  |  | 	return godot_io_java->get_screen_dpi(); | 
					
						
							| 
									
										
										
										
											2016-07-20 14:54:48 +02:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-17 15:25:22 +01:00
										 |  |  | String OS_Android::get_user_data_dir() const { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	if (data_dir_cache != String()) | 
					
						
							| 
									
										
										
										
											2016-07-02 11:48:02 -03:00
										 |  |  | 		return data_dir_cache; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-13 23:51:55 +11:00
										 |  |  | 	String data_dir = godot_io_java->get_user_data_dir(); | 
					
						
							|  |  |  | 	if (data_dir != "") { | 
					
						
							| 
									
										
										
										
											2016-07-02 11:48:02 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		//store current dir
 | 
					
						
							|  |  |  | 		char real_current_dir_name[2048]; | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		getcwd(real_current_dir_name, 2048); | 
					
						
							| 
									
										
										
										
											2016-07-02 11:48:02 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		//go to data dir
 | 
					
						
							|  |  |  | 		chdir(data_dir.utf8().get_data()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		//get actual data dir, so we resolve potential symlink (Android 6.0+ seems to use symlink)
 | 
					
						
							|  |  |  | 		char data_current_dir_name[2048]; | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 		getcwd(data_current_dir_name, 2048); | 
					
						
							| 
									
										
										
										
											2016-07-02 11:48:02 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		//cache by parsing utf8
 | 
					
						
							|  |  |  | 		data_dir_cache.parse_utf8(data_current_dir_name); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		//restore original dir so we don't mess things up
 | 
					
						
							|  |  |  | 		chdir(real_current_dir_name); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-02 16:04:00 -03:00
										 |  |  | 		return data_dir_cache; | 
					
						
							| 
									
										
										
										
											2016-07-02 11:48:02 -03:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	return "."; | 
					
						
							| 
									
										
										
										
											2016-07-21 12:07:01 +02:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | void OS_Android::set_screen_orientation(ScreenOrientation p_orientation) { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-13 23:51:55 +11:00
										 |  |  | 	godot_io_java->set_screen_orientation(p_orientation); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-07 17:17:31 +07:00
										 |  |  | String OS_Android::get_unique_id() const { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-13 23:51:55 +11:00
										 |  |  | 	String unique_id = godot_io_java->get_unique_id(); | 
					
						
							|  |  |  | 	if (unique_id != "") | 
					
						
							|  |  |  | 		return unique_id; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-07 17:17:31 +07:00
										 |  |  | 	return OS::get_unique_id(); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-03 15:14:54 +02:00
										 |  |  | Error OS_Android::native_video_play(String p_path, float p_volume, String p_audio_track, String p_subtitle_track) { | 
					
						
							|  |  |  | 	// FIXME: Add support for volume, audio and subtitle tracks
 | 
					
						
							| 
									
										
										
										
											2019-03-13 23:51:55 +11:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	godot_io_java->play_video(p_path); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	return OK; | 
					
						
							| 
									
										
										
										
											2014-03-13 22:57:24 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-03 15:14:54 +02:00
										 |  |  | bool OS_Android::native_video_is_playing() const { | 
					
						
							| 
									
										
										
										
											2019-03-13 23:51:55 +11:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return godot_io_java->is_video_playing(); | 
					
						
							| 
									
										
										
										
											2014-03-13 22:57:24 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void OS_Android::native_video_pause() { | 
					
						
							| 
									
										
										
										
											2019-03-13 23:51:55 +11:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	godot_io_java->pause_video(); | 
					
						
							| 
									
										
										
										
											2014-03-13 22:57:24 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-02 14:02:41 -03:00
										 |  |  | String OS_Android::get_system_dir(SystemDir p_dir) const { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-13 23:51:55 +11:00
										 |  |  | 	return godot_io_java->get_system_dir(p_dir); | 
					
						
							| 
									
										
										
										
											2014-12-02 14:02:41 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-13 22:57:24 -03:00
										 |  |  | void OS_Android::native_video_stop() { | 
					
						
							| 
									
										
										
										
											2019-03-13 23:51:55 +11:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	godot_io_java->stop_video(); | 
					
						
							| 
									
										
										
										
											2014-03-13 22:57:24 -03:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-02 11:15:48 -03:00
										 |  |  | void OS_Android::set_context_is_16_bits(bool p_is_16) { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-26 15:59:13 +02:00
										 |  |  | 	//use_16bits_fbo = p_is_16;
 | 
					
						
							|  |  |  | 	//if (rasterizer)
 | 
					
						
							|  |  |  | 	//	rasterizer->set_force_16_bits_fbo(p_is_16);
 | 
					
						
							| 
									
										
										
										
											2015-12-02 11:15:48 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-24 05:11:59 +01:00
										 |  |  | void OS_Android::joy_connection_changed(int p_device, bool p_connected, String p_name) { | 
					
						
							|  |  |  | 	return input->joy_connection_changed(p_device, p_connected, p_name, ""); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | bool OS_Android::is_joy_known(int p_device) { | 
					
						
							|  |  |  | 	return input->is_joy_mapped(p_device); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | String OS_Android::get_joy_guid(int p_device) const { | 
					
						
							|  |  |  | 	return input->get_joy_guid_remapped(p_device); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-18 00:27:29 +09:00
										 |  |  | void OS_Android::vibrate_handheld(int p_duration_ms) { | 
					
						
							|  |  |  | 	godot_java->vibrate(p_duration_ms); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-19 17:00:46 -03:00
										 |  |  | bool OS_Android::_check_internal_feature_support(const String &p_feature) { | 
					
						
							| 
									
										
										
										
											2019-02-26 11:58:47 -03:00
										 |  |  | 	if (p_feature == "mobile") { | 
					
						
							| 
									
										
										
										
											2017-10-02 22:01:43 +07:00
										 |  |  | 		//TODO support etc2 only if GLES3 driver is selected
 | 
					
						
							|  |  |  | 		return true; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | #if defined(__aarch64__)
 | 
					
						
							|  |  |  | 	if (p_feature == "arm64-v8a") { | 
					
						
							|  |  |  | 		return true; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | #elif defined(__ARM_ARCH_7A__)
 | 
					
						
							|  |  |  | 	if (p_feature == "armeabi-v7a" || p_feature == "armeabi") { | 
					
						
							|  |  |  | 		return true; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | #elif defined(__arm__)
 | 
					
						
							|  |  |  | 	if (p_feature == "armeabi") { | 
					
						
							|  |  |  | 		return true; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 	return false; | 
					
						
							| 
									
										
										
										
											2017-07-19 17:00:46 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-13 23:51:55 +11:00
										 |  |  | OS_Android::OS_Android(GodotJavaWrapper *p_godot_java, GodotIOJavaWrapper *p_godot_io_java, bool p_use_apk_expansion) { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	use_apk_expansion = p_use_apk_expansion; | 
					
						
							|  |  |  | 	default_videomode.width = 800; | 
					
						
							|  |  |  | 	default_videomode.height = 600; | 
					
						
							|  |  |  | 	default_videomode.fullscreen = true; | 
					
						
							|  |  |  | 	default_videomode.resizable = false; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	main_loop = NULL; | 
					
						
							|  |  |  | 	gl_extensions = NULL; | 
					
						
							| 
									
										
										
										
											2017-03-26 15:59:13 +02:00
										 |  |  | 	//rasterizer = NULL;
 | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	use_gl2 = false; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-13 23:51:55 +11:00
										 |  |  | 	godot_java = p_godot_java; | 
					
						
							|  |  |  | 	godot_io_java = p_godot_io_java; | 
					
						
							| 
									
										
										
										
											2017-09-22 12:56:02 +07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-21 16:35:01 +07:00
										 |  |  | 	Vector<Logger *> loggers; | 
					
						
							|  |  |  | 	loggers.push_back(memnew(AndroidLogger)); | 
					
						
							|  |  |  | 	_set_logger(memnew(CompositeLogger(loggers))); | 
					
						
							| 
									
										
										
										
											2018-03-04 14:18:05 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	AudioDriverManager::add_driver(&audio_driver_android); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | OS_Android::~OS_Android() { | 
					
						
							|  |  |  | } |