From dbcc7f3051f24663c7215daba1c6a725c5b66096 Mon Sep 17 00:00:00 2001 From: Anish Mishra Date: Fri, 27 Sep 2024 04:42:41 +0530 Subject: [PATCH] Add support for Android Themed Icons (monochrome) --- .../EditorExportPlatformAndroid.xml | 3 ++ platform/android/export/export_plugin.cpp | 42 ++++++++++++++++-- platform/android/export/export_plugin.h | 5 ++- .../java/lib/res/mipmap-anydpi-v26/icon.xml | 1 + .../java/lib/res/mipmap/icon_monochrome.png | Bin 0 -> 5617 bytes 5 files changed, 45 insertions(+), 6 deletions(-) create mode 100644 platform/android/java/lib/res/mipmap/icon_monochrome.png diff --git a/platform/android/doc_classes/EditorExportPlatformAndroid.xml b/platform/android/doc_classes/EditorExportPlatformAndroid.xml index 020e432155dd..2fe5539e56da 100644 --- a/platform/android/doc_classes/EditorExportPlatformAndroid.xml +++ b/platform/android/doc_classes/EditorExportPlatformAndroid.xml @@ -102,6 +102,9 @@ Foreground layer of the application adaptive icon file. See [url=https://developer.android.com/develop/ui/views/launch/icon_design_adaptive#design-adaptive-icons]Design adaptive icons[/url]. + + Monochrome layer of the application adaptive icon file. See [url=https://developer.android.com/develop/ui/views/launch/icon_design_adaptive#design-adaptive-icons]Design adaptive icons[/url]. + Application icon file. If left empty, it will fallback to [member ProjectSettings.application/config/icon]. diff --git a/platform/android/export/export_plugin.cpp b/platform/android/export/export_plugin.cpp index e3d9807af79d..cfd258cddc3d 100644 --- a/platform/android/export/export_plugin.cpp +++ b/platform/android/export/export_plugin.cpp @@ -222,6 +222,7 @@ static const int icon_densities_count = 6; static const char *launcher_icon_option = PNAME("launcher_icons/main_192x192"); static const char *launcher_adaptive_icon_foreground_option = PNAME("launcher_icons/adaptive_foreground_432x432"); static const char *launcher_adaptive_icon_background_option = PNAME("launcher_icons/adaptive_background_432x432"); +static const char *launcher_adaptive_icon_monochrome_option = PNAME("launcher_icons/adaptive_monochrome_432x432"); static const LauncherIcon launcher_icons[icon_densities_count] = { { "res/mipmap-xxxhdpi-v4/icon.png", 192 }, @@ -250,6 +251,15 @@ static const LauncherIcon launcher_adaptive_icon_backgrounds[icon_densities_coun { "res/mipmap/icon_background.png", 432 } }; +static const LauncherIcon launcher_adaptive_icon_monochromes[icon_densities_count] = { + { "res/mipmap-xxxhdpi-v4/icon_monochrome.png", 432 }, + { "res/mipmap-xxhdpi-v4/icon_monochrome.png", 324 }, + { "res/mipmap-xhdpi-v4/icon_monochrome.png", 216 }, + { "res/mipmap-hdpi-v4/icon_monochrome.png", 162 }, + { "res/mipmap-mdpi-v4/icon_monochrome.png", 108 }, + { "res/mipmap/icon_monochrome.png", 432 } +}; + static const int EXPORT_FORMAT_APK = 0; static const int EXPORT_FORMAT_AAB = 1; @@ -1644,12 +1654,13 @@ void EditorExportPlatformAndroid::_process_launcher_icons(const String &p_file_n } } -void EditorExportPlatformAndroid::load_icon_refs(const Ref &p_preset, Ref &icon, Ref &foreground, Ref &background) { +void EditorExportPlatformAndroid::load_icon_refs(const Ref &p_preset, Ref &icon, Ref &foreground, Ref &background, Ref &monochrome) { String project_icon_path = GLOBAL_GET("application/config/icon"); icon.instantiate(); foreground.instantiate(); background.instantiate(); + monochrome.instantiate(); // Regular icon: user selection -> project icon -> default. String path = static_cast(p_preset->get(launcher_icon_option)).strip_edges(); @@ -1677,12 +1688,20 @@ void EditorExportPlatformAndroid::load_icon_refs(const Ref & print_verbose("Loading adaptive background icon from " + path); ImageLoader::load_image(path, background); } + + // Adaptive monochrome: user selection -> default. + path = static_cast(p_preset->get(launcher_adaptive_icon_monochrome_option)).strip_edges(); + if (!path.is_empty()) { + print_verbose("Loading adaptive monochrome icon from " + path); + ImageLoader::load_image(path, background); + } } void EditorExportPlatformAndroid::_copy_icons_to_gradle_project(const Ref &p_preset, const Ref &p_main_image, const Ref &p_foreground, - const Ref &p_background) { + const Ref &p_background, + const Ref &p_monochrome) { String gradle_build_dir = ExportTemplateManager::get_android_build_directory(p_preset); // Prepare images to be resized for the icons. If some image ends up being uninitialized, @@ -1711,6 +1730,14 @@ void EditorExportPlatformAndroid::_copy_icons_to_gradle_project(const Refis_empty()) { + print_verbose("Processing launcher adaptive icon p_monochrome for dimension " + itos(launcher_adaptive_icon_monochromes[i].dimensions) + " into " + launcher_adaptive_icon_monochromes[i].export_path); + Vector data; + _process_launcher_icons(launcher_adaptive_icon_monochromes[i].export_path, p_monochrome, + launcher_adaptive_icon_monochromes[i].dimensions, data); + store_file_at_path(gradle_build_dir.path_join(launcher_adaptive_icon_monochromes[i].export_path), data); + } } } @@ -1875,6 +1902,7 @@ void EditorExportPlatformAndroid::get_export_options(List *r_optio r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, launcher_icon_option, PROPERTY_HINT_FILE, "*.png"), "")); r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, launcher_adaptive_icon_foreground_option, PROPERTY_HINT_FILE, "*.png"), "")); r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, launcher_adaptive_icon_background_option, PROPERTY_HINT_FILE, "*.png"), "")); + r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, launcher_adaptive_icon_monochrome_option, PROPERTY_HINT_FILE, "*.png"), "")); r_options->push_back(ExportOption(PropertyInfo(Variant::BOOL, "graphics/opengl_debug"), false)); @@ -3035,8 +3063,9 @@ Error EditorExportPlatformAndroid::export_project_helper(const Ref main_image; Ref foreground; Ref background; + Ref monochrome; - load_icon_refs(p_preset, main_image, foreground, background); + load_icon_refs(p_preset, main_image, foreground, background, monochrome); Vector command_line_flags; // Write command line flags into the command_line_flags variable. @@ -3107,7 +3136,7 @@ Error EditorExportPlatformAndroid::export_project_helper(const Refis_empty()) { + if (file == launcher_adaptive_icon_monochromes[i].export_path) { + _process_launcher_icons(file, monochrome, launcher_adaptive_icon_monochromes[i].dimensions, data); + } + } } } diff --git a/platform/android/export/export_plugin.h b/platform/android/export/export_plugin.h index 708288fbf4cc..7e1d626486b7 100644 --- a/platform/android/export/export_plugin.h +++ b/platform/android/export/export_plugin.h @@ -167,12 +167,13 @@ class EditorExportPlatformAndroid : public EditorExportPlatform { void _process_launcher_icons(const String &p_file_name, const Ref &p_source_image, int dimension, Vector &p_data); - void load_icon_refs(const Ref &p_preset, Ref &icon, Ref &foreground, Ref &background); + void load_icon_refs(const Ref &p_preset, Ref &icon, Ref &foreground, Ref &background, Ref &monochrome); void _copy_icons_to_gradle_project(const Ref &p_preset, const Ref &p_main_image, const Ref &p_foreground, - const Ref &p_background); + const Ref &p_background, + const Ref &p_monochrome); static void _create_editor_debug_keystore_if_needed(); diff --git a/platform/android/java/lib/res/mipmap-anydpi-v26/icon.xml b/platform/android/java/lib/res/mipmap-anydpi-v26/icon.xml index cfdcca2ab586..bb2ae6bee56a 100644 --- a/platform/android/java/lib/res/mipmap-anydpi-v26/icon.xml +++ b/platform/android/java/lib/res/mipmap-anydpi-v26/icon.xml @@ -2,4 +2,5 @@ + diff --git a/platform/android/java/lib/res/mipmap/icon_monochrome.png b/platform/android/java/lib/res/mipmap/icon_monochrome.png new file mode 100644 index 0000000000000000000000000000000000000000..28f59ea119f224d0b7c37d4095e8d664d43dea5a GIT binary patch literal 5617 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