mirror of
https://github.com/godotengine/godot.git
synced 2025-11-01 14:11:15 +00:00
Android: Make monochrome icon optional
This commit is contained in:
parent
5e09d747e8
commit
f767cf00fd
3 changed files with 74 additions and 2 deletions
|
|
@ -223,6 +223,18 @@ static const char *MISMATCHED_VERSIONS_MESSAGE = "Android build version mismatch
|
||||||
|
|
||||||
static const char *GDEXTENSION_LIBS_PATH = "libs/gdextensionlibs.json";
|
static const char *GDEXTENSION_LIBS_PATH = "libs/gdextensionlibs.json";
|
||||||
|
|
||||||
|
// This template string must always match the content of 'platform/android/java/lib/res/mipmap-anydpi-v26/icon.xml'.
|
||||||
|
static const String ICON_XML_TEMPLATE =
|
||||||
|
"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"
|
||||||
|
"<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n"
|
||||||
|
" <background android:drawable=\"@mipmap/icon_background\"/>\n"
|
||||||
|
" <foreground android:drawable=\"@mipmap/icon_foreground\"/>\n"
|
||||||
|
"%s" // Placeholder for the optional monochrome tag.
|
||||||
|
"</adaptive-icon>";
|
||||||
|
|
||||||
|
static const String ICON_XML_PATH = "res/mipmap-anydpi-v26/icon.xml";
|
||||||
|
static const String THEMED_ICON_XML_PATH = "res/mipmap-anydpi-v26/themed_icon.xml";
|
||||||
|
|
||||||
static const int icon_densities_count = 6;
|
static const int icon_densities_count = 6;
|
||||||
static const char *launcher_icon_option = PNAME("launcher_icons/main_192x192");
|
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_foreground_option = PNAME("launcher_icons/adaptive_foreground_432x432");
|
||||||
|
|
@ -1698,7 +1710,7 @@ void EditorExportPlatformAndroid::load_icon_refs(const Ref<EditorExportPreset> &
|
||||||
path = static_cast<String>(p_preset->get(launcher_adaptive_icon_monochrome_option)).strip_edges();
|
path = static_cast<String>(p_preset->get(launcher_adaptive_icon_monochrome_option)).strip_edges();
|
||||||
if (!path.is_empty()) {
|
if (!path.is_empty()) {
|
||||||
print_verbose("Loading adaptive monochrome icon from " + path);
|
print_verbose("Loading adaptive monochrome icon from " + path);
|
||||||
ImageLoader::load_image(path, background);
|
ImageLoader::load_image(path, monochrome);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1709,6 +1721,8 @@ void EditorExportPlatformAndroid::_copy_icons_to_gradle_project(const Ref<Editor
|
||||||
const Ref<Image> &p_monochrome) {
|
const Ref<Image> &p_monochrome) {
|
||||||
String gradle_build_dir = ExportTemplateManager::get_android_build_directory(p_preset);
|
String gradle_build_dir = ExportTemplateManager::get_android_build_directory(p_preset);
|
||||||
|
|
||||||
|
String monochrome_tag = "";
|
||||||
|
|
||||||
// Prepare images to be resized for the icons. If some image ends up being uninitialized,
|
// 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.
|
// the default image from the export template will be used.
|
||||||
|
|
||||||
|
|
@ -1742,8 +1756,12 @@ void EditorExportPlatformAndroid::_copy_icons_to_gradle_project(const Ref<Editor
|
||||||
_process_launcher_icons(launcher_adaptive_icon_monochromes[i].export_path, p_monochrome,
|
_process_launcher_icons(launcher_adaptive_icon_monochromes[i].export_path, p_monochrome,
|
||||||
launcher_adaptive_icon_monochromes[i].dimensions, data);
|
launcher_adaptive_icon_monochromes[i].dimensions, data);
|
||||||
store_file_at_path(gradle_build_dir.path_join(launcher_adaptive_icon_monochromes[i].export_path), data);
|
store_file_at_path(gradle_build_dir.path_join(launcher_adaptive_icon_monochromes[i].export_path), data);
|
||||||
|
monochrome_tag = " <monochrome android:drawable=\"@mipmap/icon_monochrome\"/>\n";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Finalize the icon.xml by formatting the template with the optional monochrome tag.
|
||||||
|
store_string_at_path(gradle_build_dir.path_join(ICON_XML_PATH), vformat(ICON_XML_TEMPLATE, monochrome_tag));
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector<EditorExportPlatformAndroid::ABI> EditorExportPlatformAndroid::get_enabled_abis(const Ref<EditorExportPreset> &p_preset) {
|
Vector<EditorExportPlatformAndroid::ABI> EditorExportPlatformAndroid::get_enabled_abis(const Ref<EditorExportPreset> &p_preset) {
|
||||||
|
|
@ -3445,6 +3463,11 @@ Error EditorExportPlatformAndroid::export_project_helper(const Ref<EditorExportP
|
||||||
String apk_expansion_pkey = p_preset->get("apk_expansion/public_key");
|
String apk_expansion_pkey = p_preset->get("apk_expansion/public_key");
|
||||||
|
|
||||||
Vector<ABI> invalid_abis(enabled_abis);
|
Vector<ABI> invalid_abis(enabled_abis);
|
||||||
|
|
||||||
|
//To temporarily store icon xml data.
|
||||||
|
Vector<uint8_t> themed_icon_xml_data;
|
||||||
|
int icon_xml_compression_method = -1;
|
||||||
|
|
||||||
while (ret == UNZ_OK) {
|
while (ret == UNZ_OK) {
|
||||||
//get filename
|
//get filename
|
||||||
unz_file_info info;
|
unz_file_info info;
|
||||||
|
|
@ -3474,6 +3497,20 @@ Error EditorExportPlatformAndroid::export_project_helper(const Ref<EditorExportP
|
||||||
_fix_resources(p_preset, data);
|
_fix_resources(p_preset, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (file == THEMED_ICON_XML_PATH) {
|
||||||
|
// Store themed_icon.xml data.
|
||||||
|
themed_icon_xml_data = data;
|
||||||
|
skip = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (file == ICON_XML_PATH) {
|
||||||
|
if (monochrome.is_valid() && !monochrome->is_empty()) {
|
||||||
|
// Defer processing of icon.xml until after themed_icon.xml is read.
|
||||||
|
icon_xml_compression_method = info.compression_method;
|
||||||
|
skip = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (file.ends_with(".png") && file.contains("mipmap")) {
|
if (file.ends_with(".png") && file.contains("mipmap")) {
|
||||||
for (int i = 0; i < icon_densities_count; ++i) {
|
for (int i = 0; i < icon_densities_count; ++i) {
|
||||||
if (main_image.is_valid() && !main_image->is_empty()) {
|
if (main_image.is_valid() && !main_image->is_empty()) {
|
||||||
|
|
@ -3543,6 +3580,28 @@ Error EditorExportPlatformAndroid::export_project_helper(const Ref<EditorExportP
|
||||||
ret = unzGoToNextFile(pkg);
|
ret = unzGoToNextFile(pkg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Process deferred icon.xml and replace it's data with themed_icon.xml.
|
||||||
|
if (monochrome.is_valid() && !monochrome->is_empty()) {
|
||||||
|
print_line("ADDING: " + ICON_XML_PATH + " (replacing with themed_icon.xml data)");
|
||||||
|
|
||||||
|
const bool uncompressed = icon_xml_compression_method == 0;
|
||||||
|
zip_fileinfo zipfi = get_zip_fileinfo();
|
||||||
|
|
||||||
|
zipOpenNewFileInZip(unaligned_apk,
|
||||||
|
ICON_XML_PATH.utf8().get_data(),
|
||||||
|
&zipfi,
|
||||||
|
nullptr,
|
||||||
|
0,
|
||||||
|
nullptr,
|
||||||
|
0,
|
||||||
|
nullptr,
|
||||||
|
uncompressed ? 0 : Z_DEFLATED,
|
||||||
|
Z_DEFAULT_COMPRESSION);
|
||||||
|
|
||||||
|
zipWriteInFileInZip(unaligned_apk, themed_icon_xml_data.ptr(), themed_icon_xml_data.size());
|
||||||
|
zipCloseFileInZip(unaligned_apk);
|
||||||
|
}
|
||||||
|
|
||||||
if (!invalid_abis.is_empty()) {
|
if (!invalid_abis.is_empty()) {
|
||||||
add_message(EXPORT_MESSAGE_ERROR, TTR("Export"), vformat(TTR("Missing libraries in the export template for the selected architectures: %s. Please build a template with all required libraries, or uncheck the missing architectures in the export preset."), join_abis(invalid_abis, ", ", false)));
|
add_message(EXPORT_MESSAGE_ERROR, TTR("Export"), vformat(TTR("Missing libraries in the export template for the selected architectures: %s. Please build a template with all required libraries, or uncheck the missing architectures in the export preset."), join_abis(invalid_abis, ", ", false)));
|
||||||
CLEANUP_AND_RETURN(ERR_FILE_NOT_FOUND);
|
CLEANUP_AND_RETURN(ERR_FILE_NOT_FOUND);
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,8 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
WARNING: The content of this file must always match the constant 'platform/android/export/export_plugin.cpp#ICON_XML_TEMPLATE'.
|
||||||
|
-->
|
||||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
<background android:drawable="@mipmap/icon_background"/>
|
<background android:drawable="@mipmap/icon_background"/>
|
||||||
<foreground android:drawable="@mipmap/icon_foreground"/>
|
<foreground android:drawable="@mipmap/icon_foreground"/>
|
||||||
<monochrome android:drawable="@mipmap/icon_monochrome"/>
|
|
||||||
</adaptive-icon>
|
</adaptive-icon>
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
This file is created to work alongside the icon.xml file.
|
||||||
|
If the user provides a Monochrome icon in the export settings, its data will be used to overwrite the icon.xml file.
|
||||||
|
We needed to create this file to get a reference for icon_monochrome.
|
||||||
|
-->
|
||||||
|
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<background android:drawable="@mipmap/icon_background"/>
|
||||||
|
<foreground android:drawable="@mipmap/icon_foreground"/>
|
||||||
|
<monochrome android:drawable="@mipmap/icon_monochrome"/>
|
||||||
|
</adaptive-icon>
|
||||||
Loading…
Add table
Add a link
Reference in a new issue