From 17279cdf45b6000134821e374bb76afd1d9e0f9d Mon Sep 17 00:00:00 2001 From: Fredia Huya-Kouadio Date: Mon, 13 Jan 2025 08:52:17 -0800 Subject: [PATCH] Use implicit launch when running a Godot Android project from the editor This allows developers to override the default launching activity (`com.godot.game.GodotApp`) with a custom one if desired. Logic is added to fallback to the default launching activity if the implicit launch fails. --- platform/android/export/export_plugin.cpp | 41 ++++++++++++++++--- .../android/export/gradle_export_util.cpp | 2 +- 2 files changed, 37 insertions(+), 6 deletions(-) diff --git a/platform/android/export/export_plugin.cpp b/platform/android/export/export_plugin.cpp index 898d7bbe1642..232d7cf278f7 100644 --- a/platform/android/export/export_plugin.cpp +++ b/platform/android/export/export_plugin.cpp @@ -1917,6 +1917,21 @@ String EditorExportPlatformAndroid::get_export_option_warning(const EditorExport } } } + } else if (p_name == "package/show_in_android_tv") { + bool gradle_build_enabled = p_preset->get("gradle_build/use_gradle_build"); + if (bool(p_preset->get("package/show_in_android_tv")) && !gradle_build_enabled) { + return TTR("\"Use Gradle Build\" must be enabled to enable \"Show In Android Tv\"."); + } + } else if (p_name == "package/show_as_launcher_app") { + bool gradle_build_enabled = p_preset->get("gradle_build/use_gradle_build"); + if (bool(p_preset->get("package/show_as_launcher_app")) && !gradle_build_enabled) { + return TTR("\"Use Gradle Build\" must be enabled to enable \"Show As Launcher App\"."); + } + } else if (p_name == "package/show_in_app_library") { + bool gradle_build_enabled = p_preset->get("gradle_build/use_gradle_build"); + if (!bool(p_preset->get("package/show_in_app_library")) && !gradle_build_enabled) { + return TTR("\"Use Gradle Build\" must be enabled to disable \"Show In App Library\"."); + } } } return String(); @@ -2283,15 +2298,31 @@ Error EditorExportPlatformAndroid::run(const Ref &p_preset, } args.push_back("-a"); args.push_back("android.intent.action.MAIN"); - args.push_back("-n"); - args.push_back(get_package_name(package_name) + "/com.godot.game.GodotApp"); + + // Going with implicit launch first based on the LAUNCHER category and the app's package. + args.push_back("-c"); + args.push_back("android.intent.category.LAUNCHER"); + args.push_back(get_package_name(package_name)); output.clear(); err = OS::get_singleton()->execute(adb, args, &output, &rv, true); print_verbose(output); - if (err || rv != 0) { - add_message(EXPORT_MESSAGE_ERROR, TTR("Run"), TTR("Could not execute on device.")); - CLEANUP_AND_RETURN(ERR_CANT_CREATE); + 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(package_name) + "/com.godot.game.GodotApp"; + print_line("Implicit launch failed.. Trying explicit launch using", component_name); + args.erase(get_package_name(package_name)); + args.push_back("-n"); + args.push_back(component_name); + + output.clear(); + err = OS::get_singleton()->execute(adb, args, &output, &rv, true); + print_verbose(output); + + if (err || rv != 0 || output.begins_with("Error: Activity not started")) { + add_message(EXPORT_MESSAGE_ERROR, TTR("Run"), TTR("Could not execute on device.")); + CLEANUP_AND_RETURN(ERR_CANT_CREATE); + } } CLEANUP_AND_RETURN(OK); diff --git a/platform/android/export/gradle_export_util.cpp b/platform/android/export/gradle_export_util.cpp index 1fdbe1a32fd4..54d0e0916b9c 100644 --- a/platform/android/export/gradle_export_util.cpp +++ b/platform/android/export/gradle_export_util.cpp @@ -260,7 +260,7 @@ String _get_screen_sizes_tag(const Ref &p_preset) { String _get_activity_tag(const Ref &p_export_platform, const Ref &p_preset, bool p_debug) { String orientation = _get_android_orientation_label(DisplayServer::ScreenOrientation(int(GLOBAL_GET("display/window/handheld/orientation")))); String manifest_activity_text = vformat( - "