diff --git a/editor/editor_node.cpp b/editor/editor_node.cpp index eca8fb7566b..1c916aca17e 100644 --- a/editor/editor_node.cpp +++ b/editor/editor_node.cpp @@ -2223,6 +2223,10 @@ void EditorNode::_run(bool p_current, const String &p_custom) { _playing_edited = p_current; } +void EditorNode::_android_build_source_selected(const String &p_file) { + export_template_manager->install_android_template_from_file(p_file); +} + void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) { if (!p_confirmed) { //this may be a hack.. current_option = (MenuOptions)p_option; @@ -2753,6 +2757,10 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) { export_template_manager->popup_manager(); } break; + case SETTINGS_INSTALL_ANDROID_BUILD_TEMPLATE: { + custom_build_manage_templates->hide(); + file_android_build_source->popup_centered_ratio(); + } break; case SETTINGS_MANAGE_FEATURE_PROFILES: { feature_profile_manager->popup_centered_clamped(Size2(900, 800) * EDSCALE, 0.8); } break; @@ -5513,6 +5521,7 @@ void EditorNode::_bind_methods() { ClassDB::bind_method("_unhandled_input", &EditorNode::_unhandled_input); ClassDB::bind_method("_update_file_menu_opened", &EditorNode::_update_file_menu_opened); ClassDB::bind_method("_update_file_menu_closed", &EditorNode::_update_file_menu_closed); + ClassDB::bind_method("_android_build_source_selected", &EditorNode::_android_build_source_selected); ClassDB::bind_method(D_METHOD("push_item", "object", "property", "inspector_only"), &EditorNode::push_item, DEFVAL(""), DEFVAL(false)); @@ -6660,9 +6669,18 @@ EditorNode::EditorNode() { custom_build_manage_templates = memnew(ConfirmationDialog); custom_build_manage_templates->set_text(TTR("Android build template is missing, please install relevant templates.")); custom_build_manage_templates->get_ok()->set_text(TTR("Manage Templates")); + custom_build_manage_templates->add_button(TTR("Install from file"))->connect("pressed", this, "_menu_option", varray(SETTINGS_INSTALL_ANDROID_BUILD_TEMPLATE)); custom_build_manage_templates->connect("confirmed", this, "_menu_option", varray(SETTINGS_MANAGE_EXPORT_TEMPLATES)); gui_base->add_child(custom_build_manage_templates); + file_android_build_source = memnew(EditorFileDialog); + file_android_build_source->set_title(TTR("Select android sources file")); + file_android_build_source->set_access(EditorFileDialog::ACCESS_FILESYSTEM); + file_android_build_source->set_mode(EditorFileDialog::MODE_OPEN_FILE); + file_android_build_source->add_filter("*.zip"); + file_android_build_source->connect("file_selected", this, "_android_build_source_selected"); + gui_base->add_child(file_android_build_source); + install_android_build_template = memnew(ConfirmationDialog); install_android_build_template->set_text(TTR("This will set up your project for custom Android builds by installing the source template to \"res://android/build\".\nYou can then apply modifications and build your own custom APK on export (adding modules, changing the AndroidManifest.xml, etc.).\nNote that in order to make custom builds instead of using pre-built APKs, the \"Use Custom Build\" option should be enabled in the Android export preset.")); install_android_build_template->get_ok()->set_text(TTR("Install")); diff --git a/editor/editor_node.h b/editor/editor_node.h index 4b9f32ea08a..70809015ee2 100644 --- a/editor/editor_node.h +++ b/editor/editor_node.h @@ -187,6 +187,7 @@ private: SETTINGS_EDITOR_CONFIG_FOLDER, SETTINGS_MANAGE_EXPORT_TEMPLATES, SETTINGS_MANAGE_FEATURE_PROFILES, + SETTINGS_INSTALL_ANDROID_BUILD_TEMPLATE, SETTINGS_PICK_MAIN_SCENE, SETTINGS_TOGGLE_CONSOLE, SETTINGS_TOGGLE_FULLSCREEN, @@ -332,6 +333,7 @@ private: EditorFileDialog *file_templates; EditorFileDialog *file_export_lib; EditorFileDialog *file_script; + EditorFileDialog *file_android_build_source; CheckBox *file_export_lib_merge; String current_path; MenuButton *update_spinner; @@ -456,6 +458,8 @@ private: void _menu_confirm_current(); void _menu_option_confirm(int p_option, bool p_confirmed); + void _android_build_source_selected(const String &p_file); + void _request_screenshot(); void _screenshot(bool p_use_utc = false); void _save_screenshot(NodePath p_path); diff --git a/editor/export_template_manager.cpp b/editor/export_template_manager.cpp index 18d122d7ce9..d3521ca6adc 100644 --- a/editor/export_template_manager.cpp +++ b/editor/export_template_manager.cpp @@ -643,6 +643,12 @@ bool ExportTemplateManager::can_install_android_template() { } Error ExportTemplateManager::install_android_template() { + const String &templates_path = EditorSettings::get_singleton()->get_templates_dir().plus_file(VERSION_FULL_CONFIG); + const String &source_zip = templates_path.plus_file("android_source.zip"); + ERR_FAIL_COND_V(!FileAccess::exists(source_zip), ERR_CANT_OPEN); + return install_android_template_from_file(source_zip); +} +Error ExportTemplateManager::install_android_template_from_file(const String &p_file) { // To support custom Android builds, we install the Java source code and buildsystem // from android_source.zip to the project's res://android folder. @@ -675,14 +681,10 @@ Error ExportTemplateManager::install_android_template() { // Uncompress source template. - const String &templates_path = EditorSettings::get_singleton()->get_templates_dir().plus_file(VERSION_FULL_CONFIG); - const String &source_zip = templates_path.plus_file("android_source.zip"); - ERR_FAIL_COND_V(!FileAccess::exists(source_zip), ERR_CANT_OPEN); - FileAccess *src_f = nullptr; zlib_filefunc_def io = zipio_create_io_from_file(&src_f); - unzFile pkg = unzOpen2(source_zip.utf8().get_data(), &io); + unzFile pkg = unzOpen2(p_file.utf8().get_data(), &io); ERR_FAIL_COND_V_MSG(!pkg, ERR_CANT_OPEN, "Android sources not in ZIP format."); int ret = unzGoToFirstFile(pkg); diff --git a/editor/export_template_manager.h b/editor/export_template_manager.h index 78082a46b5f..afbe9cbe2ba 100644 --- a/editor/export_template_manager.h +++ b/editor/export_template_manager.h @@ -125,6 +125,8 @@ public: bool can_install_android_template(); Error install_android_template(); + Error install_android_template_from_file(const String &p_file); + void popup_manager(); ExportTemplateManager(); diff --git a/platform/android/export/export.cpp b/platform/android/export/export.cpp index d94974eb0c3..99f132f12cf 100644 --- a/platform/android/export/export.cpp +++ b/platform/android/export/export.cpp @@ -2125,10 +2125,9 @@ public: err += template_err; } } else { - r_missing_templates = !exists_export_template("android_source.zip", &err); - bool installed_android_build_template = FileAccess::exists("res://android/build/build.gradle"); if (!installed_android_build_template) { + r_missing_templates = !exists_export_template("android_source.zip", &err); err += TTR("Android build template not installed in the project. Install it from the Project menu.") + "\n"; }