Make use of activity-alias as the launcher mechanism for the Godot editor and the Godot app template
This commit is contained in:
@ -2561,7 +2561,7 @@ Error EditorExportPlatformAndroid::run(const Ref<EditorExportPreset> &p_preset,
|
||||
print_verbose(output);
|
||||
if (err || rv != 0 || output.contains("Error: Activity not started")) {
|
||||
// The implicit launch failed, let's try an explicit launch by specifying the component name before giving up.
|
||||
const String component_name = get_package_name(p_preset, package_name) + "/com.godot.game.GodotApp";
|
||||
const String component_name = get_package_name(p_preset, package_name) + "/com.godot.game.GodotAppLauncher";
|
||||
print_line("Implicit launch failed... Trying explicit launch using", component_name);
|
||||
args.erase(get_package_name(p_preset, package_name));
|
||||
args.push_back("-n");
|
||||
|
||||
@ -31,6 +31,7 @@
|
||||
#include "gradle_export_util.h"
|
||||
|
||||
#include "core/string/translation_server.h"
|
||||
#include "modules/regex/regex.h"
|
||||
|
||||
int _get_android_orientation_value(DisplayServer::ScreenOrientation screen_orientation) {
|
||||
switch (screen_orientation) {
|
||||
@ -284,6 +285,19 @@ String _get_screen_sizes_tag(const Ref<EditorExportPreset> &p_preset) {
|
||||
}
|
||||
|
||||
String _get_activity_tag(const Ref<EditorExportPlatform> &p_export_platform, const Ref<EditorExportPreset> &p_preset, bool p_debug) {
|
||||
String export_plugins_activity_element_contents;
|
||||
Vector<Ref<EditorExportPlugin>> export_plugins = EditorExport::get_singleton()->get_export_plugins();
|
||||
for (int i = 0; i < export_plugins.size(); i++) {
|
||||
if (export_plugins[i]->supports_platform(p_export_platform)) {
|
||||
const String contents = export_plugins[i]->get_android_manifest_activity_element_contents(p_export_platform, p_debug);
|
||||
if (!contents.is_empty()) {
|
||||
export_plugins_activity_element_contents += contents;
|
||||
export_plugins_activity_element_contents += "\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Update the GodotApp activity tag.
|
||||
String orientation = _get_android_orientation_label(DisplayServer::ScreenOrientation(int(p_export_platform->get_project_setting(p_preset, "display/window/handheld/orientation"))));
|
||||
String manifest_activity_text = vformat(
|
||||
" <activity android:name=\".GodotApp\" "
|
||||
@ -296,6 +310,20 @@ String _get_activity_tag(const Ref<EditorExportPlatform> &p_export_platform, con
|
||||
orientation,
|
||||
bool_to_string(bool(p_export_platform->get_project_setting(p_preset, "display/window/size/resizable"))));
|
||||
|
||||
// *LAUNCHER and *HOME categories should only go to the activity-alias.
|
||||
Ref<RegEx> activity_content_to_remove_regex = RegEx::create_from_string(R"delim(<category\s+android:name\s*=\s*"\S+(LAUNCHER|HOME)"\s*\/>)delim");
|
||||
String updated_export_plugins_activity_element_contents = activity_content_to_remove_regex->sub(export_plugins_activity_element_contents, "", true);
|
||||
manifest_activity_text += updated_export_plugins_activity_element_contents;
|
||||
|
||||
manifest_activity_text += " </activity>\n";
|
||||
|
||||
// Update the GodotAppLauncher activity tag.
|
||||
manifest_activity_text += " <activity-alias\n"
|
||||
" tools:node=\"mergeOnlyAttributes\"\n"
|
||||
" android:name=\".GodotAppLauncher\"\n"
|
||||
" android:targetActivity=\".GodotApp\"\n"
|
||||
" android:exported=\"true\">\n";
|
||||
|
||||
manifest_activity_text += " <intent-filter>\n"
|
||||
" <action android:name=\"android.intent.action.MAIN\" />\n"
|
||||
" <category android:name=\"android.intent.category.DEFAULT\" />\n";
|
||||
@ -317,18 +345,12 @@ String _get_activity_tag(const Ref<EditorExportPlatform> &p_export_platform, con
|
||||
|
||||
manifest_activity_text += " </intent-filter>\n";
|
||||
|
||||
Vector<Ref<EditorExportPlugin>> export_plugins = EditorExport::get_singleton()->get_export_plugins();
|
||||
for (int i = 0; i < export_plugins.size(); i++) {
|
||||
if (export_plugins[i]->supports_platform(p_export_platform)) {
|
||||
const String contents = export_plugins[i]->get_android_manifest_activity_element_contents(p_export_platform, p_debug);
|
||||
if (!contents.is_empty()) {
|
||||
manifest_activity_text += contents;
|
||||
manifest_activity_text += "\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
// Hybrid categories should only go to the actual 'GodotApp' activity.
|
||||
Ref<RegEx> activity_alias_content_to_remove_regex = RegEx::create_from_string(R"delim(<category\s+android:name\s*=\s*"org.godotengine.xr.hybrid.(IMMERSIVE|PANEL)"\s*\/>)delim");
|
||||
String updated_export_plugins_activity_alias_element_contents = activity_alias_content_to_remove_regex->sub(export_plugins_activity_element_contents, "", true);
|
||||
manifest_activity_text += updated_export_plugins_activity_alias_element_contents;
|
||||
|
||||
manifest_activity_text += " </activity>\n";
|
||||
manifest_activity_text += " </activity-alias>\n";
|
||||
return manifest_activity_text;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user