From dd966f5680eac1b068d9492d6dbba572cff54936 Mon Sep 17 00:00:00 2001 From: Fredia Huya-Kouadio Date: Sun, 9 Jun 2024 09:22:45 -0700 Subject: [PATCH 1/2] Configure the splash screen for the Android editor --- platform/android/java/app/config.gradle | 3 +- platform/android/java/editor/build.gradle | 8 ++++ .../editor/src/debug/res/values/strings.xml | 4 -- .../editor/src/dev/res/values/strings.xml | 4 -- .../java/editor/src/main/AndroidManifest.xml | 48 +++++++++++-------- .../org/godotengine/editor/GodotEditor.kt | 15 ++++++ .../java/org/godotengine/editor/GodotGame.kt | 3 ++ .../main/res/layout/godot_editor_layout.xml | 25 ++++++++++ .../editor/src/main/res/values/strings.xml | 2 - .../editor/src/main/res/values/themes.xml | 6 +++ .../org/godotengine/godot/GodotActivity.kt | 6 ++- 11 files changed, 92 insertions(+), 32 deletions(-) delete mode 100644 platform/android/java/editor/src/debug/res/values/strings.xml delete mode 100644 platform/android/java/editor/src/dev/res/values/strings.xml create mode 100644 platform/android/java/editor/src/main/res/layout/godot_editor_layout.xml diff --git a/platform/android/java/app/config.gradle b/platform/android/java/app/config.gradle index c404af34d81..01759a1b2fd 100644 --- a/platform/android/java/app/config.gradle +++ b/platform/android/java/app/config.gradle @@ -11,7 +11,8 @@ ext.versions = [ nexusPublishVersion: '1.3.0', javaVersion : JavaVersion.VERSION_17, // Also update 'platform/android/detect.py#get_ndk_version()' when this is updated. - ndkVersion : '23.2.8568313' + ndkVersion : '23.2.8568313', + splashscreenVersion: '1.0.1' ] diff --git a/platform/android/java/editor/build.gradle b/platform/android/java/editor/build.gradle index c5ef0861520..55fe2a22fea 100644 --- a/platform/android/java/editor/build.gradle +++ b/platform/android/java/editor/build.gradle @@ -10,6 +10,8 @@ dependencies { implementation project(":lib") implementation "androidx.window:window:1.2.0" + implementation "androidx.core:core-splashscreen:$versions.splashscreenVersion" + implementation "androidx.constraintlayout:constraintlayout:2.1.4" } ext { @@ -92,6 +94,10 @@ android { targetSdkVersion versions.targetSdk missingDimensionStrategy 'products', 'editor' + manifestPlaceholders += [ + editorAppName: "Godot Editor 4", + editorBuildSuffix: "" + ] } base { @@ -124,11 +130,13 @@ android { dev { initWith debug applicationIdSuffix ".dev" + manifestPlaceholders += [editorBuildSuffix: " (dev)"] } debug { initWith release applicationIdSuffix ".debug" + manifestPlaceholders += [editorBuildSuffix: " (debug)"] signingConfig signingConfigs.debug } diff --git a/platform/android/java/editor/src/debug/res/values/strings.xml b/platform/android/java/editor/src/debug/res/values/strings.xml deleted file mode 100644 index 09ee2d77e19..00000000000 --- a/platform/android/java/editor/src/debug/res/values/strings.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - Godot Editor 4 (debug) - diff --git a/platform/android/java/editor/src/dev/res/values/strings.xml b/platform/android/java/editor/src/dev/res/values/strings.xml deleted file mode 100644 index 215f2c7d0ac..00000000000 --- a/platform/android/java/editor/src/dev/res/values/strings.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - Godot Editor 4 (dev) - diff --git a/platform/android/java/editor/src/main/AndroidManifest.xml b/platform/android/java/editor/src/main/AndroidManifest.xml index f646ef3f51b..c7d14a3f491 100644 --- a/platform/android/java/editor/src/main/AndroidManifest.xml +++ b/platform/android/java/editor/src/main/AndroidManifest.xml @@ -13,12 +13,15 @@ android:glEsVersion="0x00030000" android:required="true" /> - - - + + @@ -26,39 +29,44 @@ + android:label="${editorAppName}${editorBuildSuffix}" + android:requestLegacyExternalStorage="true" + android:theme="@style/GodotEditorSplashScreenTheme" + tools:ignore="GoogleAppIndexingWarning"> + - + android:screenOrientation="userLandscape"> + + - - + - diff --git a/platform/android/java/editor/src/main/java/org/godotengine/editor/GodotEditor.kt b/platform/android/java/editor/src/main/java/org/godotengine/editor/GodotEditor.kt index 52acd63674b..5515347bd61 100644 --- a/platform/android/java/editor/src/main/java/org/godotengine/editor/GodotEditor.kt +++ b/platform/android/java/editor/src/main/java/org/godotengine/editor/GodotEditor.kt @@ -38,8 +38,10 @@ import android.content.Intent import android.content.pm.PackageManager import android.os.* import android.util.Log +import android.view.View import android.widget.Toast import androidx.annotation.CallSuper +import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen import androidx.window.layout.WindowMetricsCalculator import org.godotengine.godot.GodotActivity import org.godotengine.godot.GodotLib @@ -88,8 +90,13 @@ open class GodotEditor : GodotActivity() { } private val commandLineParams = ArrayList() + private val editorLoadingIndicator: View? by lazy { findViewById(R.id.editor_loading_indicator) } + + override fun getGodotAppLayout() = R.layout.godot_editor_layout override fun onCreate(savedInstanceState: Bundle?) { + installSplashScreen() + // We exclude certain permissions from the set we request at startup, as they'll be // requested on demand based on use-cases. PermissionsUtil.requestManifestPermissions(this, setOf(Manifest.permission.RECORD_AUDIO)) @@ -121,6 +128,14 @@ open class GodotEditor : GodotActivity() { } } + override fun onGodotMainLoopStarted() { + super.onGodotMainLoopStarted() + runOnUiThread { + // Hide the loading indicator + editorLoadingIndicator?.visibility = View.GONE + } + } + /** * Check for project permissions to enable */ diff --git a/platform/android/java/editor/src/main/java/org/godotengine/editor/GodotGame.kt b/platform/android/java/editor/src/main/java/org/godotengine/editor/GodotGame.kt index aa4d02b5b25..8e4e0892119 100644 --- a/platform/android/java/editor/src/main/java/org/godotengine/editor/GodotGame.kt +++ b/platform/android/java/editor/src/main/java/org/godotengine/editor/GodotGame.kt @@ -34,6 +34,9 @@ package org.godotengine.editor * Drives the 'run project' window of the Godot Editor. */ class GodotGame : GodotEditor() { + + override fun getGodotAppLayout() = org.godotengine.godot.R.layout.godot_app_layout + override fun overrideOrientationRequest() = false override fun enableLongPressGestures() = false diff --git a/platform/android/java/editor/src/main/res/layout/godot_editor_layout.xml b/platform/android/java/editor/src/main/res/layout/godot_editor_layout.xml new file mode 100644 index 00000000000..431a468f290 --- /dev/null +++ b/platform/android/java/editor/src/main/res/layout/godot_editor_layout.xml @@ -0,0 +1,25 @@ + + + + + + + + diff --git a/platform/android/java/editor/src/main/res/values/strings.xml b/platform/android/java/editor/src/main/res/values/strings.xml index 216d02d9c74..909711ab180 100644 --- a/platform/android/java/editor/src/main/res/values/strings.xml +++ b/platform/android/java/editor/src/main/res/values/strings.xml @@ -1,6 +1,4 @@ - Godot Editor 4 - Missing storage access permission! diff --git a/platform/android/java/editor/src/main/res/values/themes.xml b/platform/android/java/editor/src/main/res/values/themes.xml index fda04d6dc7d..2b352247db4 100644 --- a/platform/android/java/editor/src/main/res/values/themes.xml +++ b/platform/android/java/editor/src/main/res/values/themes.xml @@ -2,4 +2,10 @@ + + diff --git a/platform/android/java/lib/src/org/godotengine/godot/GodotActivity.kt b/platform/android/java/lib/src/org/godotengine/godot/GodotActivity.kt index 7b8fad89529..4c5e857b7ac 100644 --- a/platform/android/java/lib/src/org/godotengine/godot/GodotActivity.kt +++ b/platform/android/java/lib/src/org/godotengine/godot/GodotActivity.kt @@ -36,6 +36,7 @@ import android.content.pm.PackageManager import android.os.Bundle import android.util.Log import androidx.annotation.CallSuper +import androidx.annotation.LayoutRes import androidx.fragment.app.FragmentActivity import org.godotengine.godot.utils.PermissionsUtil import org.godotengine.godot.utils.ProcessPhoenix @@ -65,7 +66,7 @@ abstract class GodotActivity : FragmentActivity(), GodotHost { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setContentView(R.layout.godot_app_layout) + setContentView(getGodotAppLayout()) handleStartIntent(intent, true) @@ -80,6 +81,9 @@ abstract class GodotActivity : FragmentActivity(), GodotHost { } } + @LayoutRes + protected open fun getGodotAppLayout() = R.layout.godot_app_layout + override fun onDestroy() { Log.v(TAG, "Destroying Godot app...") super.onDestroy() From f20e21a6d6b91fee2106be2fea5f794cfed7578f Mon Sep 17 00:00:00 2001 From: Fredia Huya-Kouadio Date: Sun, 9 Jun 2024 17:02:03 -0700 Subject: [PATCH 2/2] Update the splash screen logic for the Godot app template Due to limitations to the splash screen introduced in Android 12, the splash screen logic is updated to the same logic as used on other platforms, i.e: the splash screen is rendered by the Godot engine instead of the Android runtime. --- main/main.cpp | 2 +- platform/android/export/export_plugin.cpp | 131 ++---------------- platform/android/export/export_plugin.h | 23 +-- platform/android/java/app/build.gradle | 1 + .../java/app/res/drawable-nodpi/splash.png | Bin 14766 -> 0 bytes .../res/drawable-nodpi/splash_bg_color.png | Bin 1360 -> 0 bytes .../java/app/res/drawable/splash_drawable.xml | 12 -- .../android/java/app/res/values/themes.xml | 15 +- .../java/app/src/com/godot/game/GodotApp.java | 4 +- 9 files changed, 32 insertions(+), 156 deletions(-) delete mode 100644 platform/android/java/app/res/drawable-nodpi/splash.png delete mode 100644 platform/android/java/app/res/drawable-nodpi/splash_bg_color.png delete mode 100644 platform/android/java/app/res/drawable/splash_drawable.xml diff --git a/main/main.cpp b/main/main.cpp index 44201522af1..1cbd732747b 100644 --- a/main/main.cpp +++ b/main/main.cpp @@ -2896,7 +2896,7 @@ Error Main::setup2() { MAIN_PRINT("Main: Setup Logo"); -#if !defined(TOOLS_ENABLED) && (defined(WEB_ENABLED) || defined(ANDROID_ENABLED)) +#if !defined(TOOLS_ENABLED) && defined(WEB_ENABLED) bool show_logo = false; #else bool show_logo = true; diff --git a/platform/android/export/export_plugin.cpp b/platform/android/export/export_plugin.cpp index eebef3f9691..ad00659257d 100644 --- a/platform/android/export/export_plugin.cpp +++ b/platform/android/export/export_plugin.cpp @@ -212,11 +212,6 @@ static const char *android_perms[] = { static const char *MISMATCHED_VERSIONS_MESSAGE = "Android build version mismatch:\n| Template installed: %s\n| Requested version: %s\nPlease reinstall Android build template from 'Project' menu."; -static const char *SPLASH_IMAGE_EXPORT_PATH = "res/drawable-nodpi/splash.png"; -static const char *LEGACY_BUILD_SPLASH_IMAGE_EXPORT_PATH = "res/drawable-nodpi-v4/splash.png"; -static const char *SPLASH_BG_COLOR_PATH = "res/drawable-nodpi/splash_bg_color.png"; -static const char *LEGACY_BUILD_SPLASH_BG_COLOR_PATH = "res/drawable-nodpi-v4/splash_bg_color.png"; -static const char *SPLASH_CONFIG_PATH = "res/drawable/splash_drawable.xml"; static const char *GDEXTENSION_LIBS_PATH = "libs/gdextensionlibs.json"; static const int icon_densities_count = 6; @@ -1642,67 +1637,6 @@ void EditorExportPlatformAndroid::_process_launcher_icons(const String &p_file_n } } -String EditorExportPlatformAndroid::load_splash_refs(Ref &splash_image, Ref &splash_bg_color_image) { - bool scale_splash = GLOBAL_GET("application/boot_splash/fullsize"); - bool apply_filter = GLOBAL_GET("application/boot_splash/use_filter"); - bool show_splash_image = GLOBAL_GET("application/boot_splash/show_image"); - String project_splash_path = GLOBAL_GET("application/boot_splash/image"); - - // Setup the splash bg color. - bool bg_color_valid = false; - Color bg_color = ProjectSettings::get_singleton()->get("application/boot_splash/bg_color", &bg_color_valid); - if (!bg_color_valid) { - bg_color = boot_splash_bg_color; - } - - if (show_splash_image) { - if (!project_splash_path.is_empty()) { - splash_image.instantiate(); - print_verbose("Loading splash image: " + project_splash_path); - const Error err = ImageLoader::load_image(project_splash_path, splash_image); - if (err) { - if (OS::get_singleton()->is_stdout_verbose()) { - print_error("- unable to load splash image from " + project_splash_path + " (" + itos(err) + ")"); - } - splash_image.unref(); - } - } - } else { - splash_image.instantiate(); - splash_image->initialize_data(1, 1, false, Image::FORMAT_RGBA8); - splash_image->set_pixel(0, 0, bg_color); - } - - if (splash_image.is_null()) { - // Use the default - print_verbose("Using default splash image."); - splash_image = Ref(memnew(Image(boot_splash_png))); - } - - if (scale_splash) { - Size2 screen_size = Size2(GLOBAL_GET("display/window/size/viewport_width"), GLOBAL_GET("display/window/size/viewport_height")); - int width, height; - if (screen_size.width > screen_size.height) { - // scale horizontally - height = screen_size.height; - width = splash_image->get_width() * screen_size.height / splash_image->get_height(); - } else { - // scale vertically - width = screen_size.width; - height = splash_image->get_height() * screen_size.width / splash_image->get_width(); - } - splash_image->resize(width, height); - } - - print_verbose("Creating splash background color image."); - splash_bg_color_image.instantiate(); - splash_bg_color_image->initialize_data(splash_image->get_width(), splash_image->get_height(), false, splash_image->get_format()); - splash_bg_color_image->fill(bg_color); - - String processed_splash_config_xml = vformat(SPLASH_CONFIG_XML_CONTENT, bool_to_string(apply_filter)); - return processed_splash_config_xml; -} - void EditorExportPlatformAndroid::load_icon_refs(const Ref &p_preset, Ref &icon, Ref &foreground, Ref &background) { String project_icon_path = GLOBAL_GET("application/config/icon"); @@ -1739,61 +1673,34 @@ void EditorExportPlatformAndroid::load_icon_refs(const Ref & } void EditorExportPlatformAndroid::_copy_icons_to_gradle_project(const Ref &p_preset, - const String &processed_splash_config_xml, - const Ref &splash_image, - const Ref &splash_bg_color_image, - const Ref &main_image, - const Ref &foreground, - const Ref &background) { + const Ref &p_main_image, + const Ref &p_foreground, + const Ref &p_background) { String gradle_build_dir = ExportTemplateManager::get_android_build_directory(p_preset); - // Store the splash configuration - if (!processed_splash_config_xml.is_empty()) { - print_verbose("Storing processed splash configuration: " + String("\n") + processed_splash_config_xml); - store_string_at_path(gradle_build_dir.path_join(SPLASH_CONFIG_PATH), processed_splash_config_xml); - } - - // Store the splash image - if (splash_image.is_valid() && !splash_image->is_empty()) { - String splash_export_path = gradle_build_dir.path_join(SPLASH_IMAGE_EXPORT_PATH); - print_verbose("Storing splash image in " + splash_export_path); - Vector data; - _load_image_data(splash_image, data); - store_file_at_path(splash_export_path, data); - } - - // Store the splash bg color image - if (splash_bg_color_image.is_valid() && !splash_bg_color_image->is_empty()) { - String splash_bg_color_path = gradle_build_dir.path_join(SPLASH_BG_COLOR_PATH); - print_verbose("Storing splash background image in " + splash_bg_color_path); - Vector data; - _load_image_data(splash_bg_color_image, data); - store_file_at_path(splash_bg_color_path, data); - } - // Prepare images to be resized for the icons. If some image ends up being uninitialized, // the default image from the export template will be used. for (int i = 0; i < icon_densities_count; ++i) { - if (main_image.is_valid() && !main_image->is_empty()) { + if (p_main_image.is_valid() && !p_main_image->is_empty()) { print_verbose("Processing launcher icon for dimension " + itos(launcher_icons[i].dimensions) + " into " + launcher_icons[i].export_path); Vector data; - _process_launcher_icons(launcher_icons[i].export_path, main_image, launcher_icons[i].dimensions, data); + _process_launcher_icons(launcher_icons[i].export_path, p_main_image, launcher_icons[i].dimensions, data); store_file_at_path(gradle_build_dir.path_join(launcher_icons[i].export_path), data); } - if (foreground.is_valid() && !foreground->is_empty()) { - print_verbose("Processing launcher adaptive icon foreground for dimension " + itos(launcher_adaptive_icon_foregrounds[i].dimensions) + " into " + launcher_adaptive_icon_foregrounds[i].export_path); + if (p_foreground.is_valid() && !p_foreground->is_empty()) { + print_verbose("Processing launcher adaptive icon p_foreground for dimension " + itos(launcher_adaptive_icon_foregrounds[i].dimensions) + " into " + launcher_adaptive_icon_foregrounds[i].export_path); Vector data; - _process_launcher_icons(launcher_adaptive_icon_foregrounds[i].export_path, foreground, + _process_launcher_icons(launcher_adaptive_icon_foregrounds[i].export_path, p_foreground, launcher_adaptive_icon_foregrounds[i].dimensions, data); store_file_at_path(gradle_build_dir.path_join(launcher_adaptive_icon_foregrounds[i].export_path), data); } - if (background.is_valid() && !background->is_empty()) { - print_verbose("Processing launcher adaptive icon background for dimension " + itos(launcher_adaptive_icon_backgrounds[i].dimensions) + " into " + launcher_adaptive_icon_backgrounds[i].export_path); + if (p_background.is_valid() && !p_background->is_empty()) { + print_verbose("Processing launcher adaptive icon p_background for dimension " + itos(launcher_adaptive_icon_backgrounds[i].dimensions) + " into " + launcher_adaptive_icon_backgrounds[i].export_path); Vector data; - _process_launcher_icons(launcher_adaptive_icon_backgrounds[i].export_path, background, + _process_launcher_icons(launcher_adaptive_icon_backgrounds[i].export_path, p_background, launcher_adaptive_icon_backgrounds[i].dimensions, data); store_file_at_path(gradle_build_dir.path_join(launcher_adaptive_icon_backgrounds[i].export_path), data); } @@ -3093,10 +3000,6 @@ Error EditorExportPlatformAndroid::export_project_helper(const Refget_include_filter()); print_verbose("- exclude filter: " + p_preset->get_exclude_filter()); - Ref splash_image; - Ref splash_bg_color_image; - String processed_splash_config_xml = load_splash_refs(splash_image, splash_bg_color_image); - Ref main_image; Ref foreground; Ref background; @@ -3172,7 +3075,7 @@ Error EditorExportPlatformAndroid::export_project_helper(const Refis_empty()) { - _load_image_data(splash_image, data); - } - - // Process the splash bg color image - if ((file == SPLASH_BG_COLOR_PATH || file == LEGACY_BUILD_SPLASH_BG_COLOR_PATH) && splash_bg_color_image.is_valid() && !splash_bg_color_image->is_empty()) { - _load_image_data(splash_bg_color_image, data); - } - if (file.ends_with(".png") && file.contains("mipmap")) { for (int i = 0; i < icon_densities_count; ++i) { if (main_image.is_valid() && !main_image->is_empty()) { diff --git a/platform/android/export/export_plugin.h b/platform/android/export/export_plugin.h index 679afdc50f7..97bbd0c7bcc 100644 --- a/platform/android/export/export_plugin.h +++ b/platform/android/export/export_plugin.h @@ -39,18 +39,6 @@ #include "core/os/os.h" #include "editor/export/editor_export_platform.h" -const String SPLASH_CONFIG_XML_CONTENT = R"SPLASH( - - - - - - -)SPLASH"; - // Optional environment variables for defining confidential information. If any // of these is set, they will override the values set in the credentials file. const String ENV_ANDROID_KEYSTORE_DEBUG_PATH = "GODOT_ANDROID_KEYSTORE_DEBUG_PATH"; @@ -179,17 +167,12 @@ class EditorExportPlatformAndroid : public EditorExportPlatform { void _process_launcher_icons(const String &p_file_name, const Ref &p_source_image, int dimension, Vector &p_data); - String load_splash_refs(Ref &splash_image, Ref &splash_bg_color_image); - void load_icon_refs(const Ref &p_preset, Ref &icon, Ref &foreground, Ref &background); void _copy_icons_to_gradle_project(const Ref &p_preset, - const String &processed_splash_config_xml, - const Ref &splash_image, - const Ref &splash_bg_color_image, - const Ref &main_image, - const Ref &foreground, - const Ref &background); + const Ref &p_main_image, + const Ref &p_foreground, + const Ref &p_background); static void _create_editor_debug_keystore_if_needed(); diff --git a/platform/android/java/app/build.gradle b/platform/android/java/app/build.gradle index bde6a93c860..01d5d9ef929 100644 --- a/platform/android/java/app/build.gradle +++ b/platform/android/java/app/build.gradle @@ -32,6 +32,7 @@ configurations { dependencies { implementation "androidx.fragment:fragment:$versions.fragmentVersion" + implementation "androidx.core:core-splashscreen:$versions.splashscreenVersion" if (rootProject.findProject(":lib")) { implementation project(":lib") diff --git a/platform/android/java/app/res/drawable-nodpi/splash.png b/platform/android/java/app/res/drawable-nodpi/splash.png deleted file mode 100644 index 7bddd4325a8e2f425a42715770971a7a855b4803..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14766 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 diff --git a/platform/android/java/app/res/drawable/splash_drawable.xml b/platform/android/java/app/res/drawable/splash_drawable.xml deleted file mode 100644 index 30627b998c2..00000000000 --- a/platform/android/java/app/res/drawable/splash_drawable.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - diff --git a/platform/android/java/app/res/values/themes.xml b/platform/android/java/app/res/values/themes.xml index d64b50ca456..3ab84019287 100644 --- a/platform/android/java/app/res/values/themes.xml +++ b/platform/android/java/app/res/values/themes.xml @@ -3,8 +3,17 @@ diff --git a/platform/android/java/app/src/com/godot/game/GodotApp.java b/platform/android/java/app/src/com/godot/game/GodotApp.java index 9142d767b4b..22e617f6e73 100644 --- a/platform/android/java/app/src/com/godot/game/GodotApp.java +++ b/platform/android/java/app/src/com/godot/game/GodotApp.java @@ -34,6 +34,8 @@ import org.godotengine.godot.GodotActivity; import android.os.Bundle; +import androidx.core.splashscreen.SplashScreen; + /** * Template activity for Godot Android builds. * Feel free to extend and modify this class for your custom logic. @@ -41,7 +43,7 @@ import android.os.Bundle; public class GodotApp extends GodotActivity { @Override public void onCreate(Bundle savedInstanceState) { - setTheme(R.style.GodotAppMainTheme); + SplashScreen.installSplashScreen(this); super.onCreate(savedInstanceState); } }