From 608e07a761d0bd4184ef224b294a0e2462cc8dbc Mon Sep 17 00:00:00 2001 From: sspanak Date: Thu, 1 May 2025 13:32:45 +0300 Subject: [PATCH] status icon cache now works, even with minified code --- app/build.gradle | 9 +++ app/constants.gradle | 1 + .../io/github/sspanak/tt9/ime/UiHandler.java | 2 +- .../io/github/sspanak/tt9/ui/StatusIcon.java | 78 +++++++++---------- app/status-icon-tools.gradle | 78 +++++++++++++++++++ 5 files changed, 128 insertions(+), 40 deletions(-) create mode 100644 app/status-icon-tools.gradle diff --git a/app/build.gradle b/app/build.gradle index 977af9bf..9234f86f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -7,6 +7,7 @@ apply from: 'build-definitions.gradle' apply from: 'build-dictionaries.gradle' apply from: 'validate-languages.gradle' apply from: 'help-tools.gradle' +apply from: 'status-icon-tools.gradle' apply from: 'version-tools.gradle' @@ -63,6 +64,12 @@ tasks.register('generateDocs') { } } +tasks.register('updateStatusIcons') { + doLast { + updateStatusIconCache(DEFINITIONS_INPUT_DIR, ICONS_DIR, ICONS_JAVA_FILE) + } +} + tasks.register('updateManifest') { doLast { updateManifestVersion(getVersionCode(), getVersionName()) @@ -141,6 +148,8 @@ android { applicationVariants.configureEach { variant -> def variantName = variant.name.capitalize() + tasks.named("javaPreCompile${variantName}")?.configure {dependsOn(updateStatusIcons) } + [ "merge${variantName}Assets", "lintAnalyze${variantName}", diff --git a/app/constants.gradle b/app/constants.gradle index ca0e8f06..40ebda33 100644 --- a/app/constants.gradle +++ b/app/constants.gradle @@ -9,6 +9,7 @@ ext.DICTIONARY_SIZES_DIR_NAME = 'dictionary-sizes' def APP_ROOT_DIR = "${project.rootDir}/app" ext.ICONS_DIR = "${APP_ROOT_DIR}/src/main/res/drawable" +ext.ICONS_JAVA_FILE = "${APP_ROOT_DIR}/src/main/java/${PACKAGE_NAME.replaceAll("\\.", "/")}/ui/StatusIcon.java" def MAIN_ASSETS_DIR = "${APP_ROOT_DIR}/src/main/assets" def FULL_VERSION_ASSETS_DIR = "${APP_ROOT_DIR}/src/full/assets" diff --git a/app/src/main/java/io/github/sspanak/tt9/ime/UiHandler.java b/app/src/main/java/io/github/sspanak/tt9/ime/UiHandler.java index 42aaba95..ffb07ee6 100644 --- a/app/src/main/java/io/github/sspanak/tt9/ime/UiHandler.java +++ b/app/src/main/java/io/github/sspanak/tt9/ime/UiHandler.java @@ -56,7 +56,7 @@ abstract class UiHandler extends AbstractHandler { protected void setStatusIcon(InputMode mode, Language language) { - int resId = StatusIcon.getResource(this, settings, mode, language); + int resId = new StatusIcon(this, settings, mode, language).resourceId; if (resId == 0) { hideStatusIcon(); } else { diff --git a/app/src/main/java/io/github/sspanak/tt9/ui/StatusIcon.java b/app/src/main/java/io/github/sspanak/tt9/ui/StatusIcon.java index 74051b91..948edca4 100644 --- a/app/src/main/java/io/github/sspanak/tt9/ui/StatusIcon.java +++ b/app/src/main/java/io/github/sspanak/tt9/ui/StatusIcon.java @@ -13,15 +13,26 @@ import io.github.sspanak.tt9.languages.Language; import io.github.sspanak.tt9.preferences.settings.SettingsStore; public class StatusIcon { - private static final HashMap cache = new HashMap<>(); - private final int resourceId; + private static final HashMap ICONS = new HashMap<>(); + public final int resourceId; - private StatusIcon(@Nullable Context ctx, @Nullable SettingsStore settings, @Nullable InputMode mode, @Nullable Language language) { + public StatusIcon(@Nullable Context ctx, @Nullable SettingsStore settings, @Nullable InputMode mode, @Nullable Language language) { + if (ICONS.isEmpty()) { + generateIconsCache(); + } resourceId = resolveResourcePerMode(ctx, settings, mode, language); } + /** + * Generates a cache of icons for different input modes and languages. + * WARNING: This method is auto-generated and should not be modified manually. + * To update the icons, run the `updateStatusIcons` gradle task. + */ + private void generateIconsCache() { ICONS.put("ic_lang_alefbet", R.drawable.ic_lang_alefbet);ICONS.put("ic_lang_alefbet", R.drawable.ic_lang_alefbet);ICONS.put("ic_lang_alfabeta_lo", R.drawable.ic_lang_alfabeta_lo);ICONS.put("ic_lang_alfabeta_up", R.drawable.ic_lang_alfabeta_up);ICONS.put("ic_lang_alifba", R.drawable.ic_lang_alifba);ICONS.put("ic_lang_alifba", R.drawable.ic_lang_alifba);ICONS.put("ic_lang_ar", R.drawable.ic_lang_ar);ICONS.put("ic_lang_bg_cp", R.drawable.ic_lang_bg_cp);ICONS.put("ic_lang_bg_lo", R.drawable.ic_lang_bg_lo);ICONS.put("ic_lang_bg_up", R.drawable.ic_lang_bg_up);ICONS.put("ic_lang_br_cp", R.drawable.ic_lang_br_cp);ICONS.put("ic_lang_br_lo", R.drawable.ic_lang_br_lo);ICONS.put("ic_lang_br_up", R.drawable.ic_lang_br_up);ICONS.put("ic_lang_ca_cp", R.drawable.ic_lang_ca_cp);ICONS.put("ic_lang_ca_lo", R.drawable.ic_lang_ca_lo);ICONS.put("ic_lang_ca_up", R.drawable.ic_lang_ca_up);ICONS.put("ic_lang_cyrillic_lo", R.drawable.ic_lang_cyrillic_lo);ICONS.put("ic_lang_cyrillic_lo", R.drawable.ic_lang_cyrillic_lo);ICONS.put("ic_lang_cyrillic_lo", R.drawable.ic_lang_cyrillic_lo);ICONS.put("ic_lang_cyrillic_up", R.drawable.ic_lang_cyrillic_up);ICONS.put("ic_lang_cyrillic_up", R.drawable.ic_lang_cyrillic_up);ICONS.put("ic_lang_cyrillic_up", R.drawable.ic_lang_cyrillic_up);ICONS.put("ic_lang_cz_cp", R.drawable.ic_lang_cz_cp);ICONS.put("ic_lang_cz_lo", R.drawable.ic_lang_cz_lo);ICONS.put("ic_lang_cz_up", R.drawable.ic_lang_cz_up);ICONS.put("ic_lang_da_cp", R.drawable.ic_lang_da_cp);ICONS.put("ic_lang_da_lo", R.drawable.ic_lang_da_lo);ICONS.put("ic_lang_da_up", R.drawable.ic_lang_da_up);ICONS.put("ic_lang_de_cp", R.drawable.ic_lang_de_cp);ICONS.put("ic_lang_de_lo", R.drawable.ic_lang_de_lo);ICONS.put("ic_lang_de_up", R.drawable.ic_lang_de_up);ICONS.put("ic_lang_el_cp", R.drawable.ic_lang_el_cp);ICONS.put("ic_lang_el_lo", R.drawable.ic_lang_el_lo);ICONS.put("ic_lang_el_up", R.drawable.ic_lang_el_up);ICONS.put("ic_lang_en_cp", R.drawable.ic_lang_en_cp);ICONS.put("ic_lang_en_lo", R.drawable.ic_lang_en_lo);ICONS.put("ic_lang_en_up", R.drawable.ic_lang_en_up);ICONS.put("ic_lang_es_cp", R.drawable.ic_lang_es_cp);ICONS.put("ic_lang_es_lo", R.drawable.ic_lang_es_lo);ICONS.put("ic_lang_es_up", R.drawable.ic_lang_es_up);ICONS.put("ic_lang_et_cp", R.drawable.ic_lang_et_cp);ICONS.put("ic_lang_et_lo", R.drawable.ic_lang_et_lo);ICONS.put("ic_lang_et_up", R.drawable.ic_lang_et_up);ICONS.put("ic_lang_fa", R.drawable.ic_lang_fa);ICONS.put("ic_lang_fr_cp", R.drawable.ic_lang_fr_cp);ICONS.put("ic_lang_fr_lo", R.drawable.ic_lang_fr_lo);ICONS.put("ic_lang_fr_up", R.drawable.ic_lang_fr_up);ICONS.put("ic_lang_ga_cp", R.drawable.ic_lang_ga_cp);ICONS.put("ic_lang_ga_lo", R.drawable.ic_lang_ga_lo);ICONS.put("ic_lang_ga_up", R.drawable.ic_lang_ga_up);ICONS.put("ic_lang_gu", R.drawable.ic_lang_gu);ICONS.put("ic_lang_gu_abc", R.drawable.ic_lang_gu_abc);ICONS.put("ic_lang_he", R.drawable.ic_lang_he);ICONS.put("ic_lang_hi", R.drawable.ic_lang_hi);ICONS.put("ic_lang_hi_abc", R.drawable.ic_lang_hi_abc);ICONS.put("ic_lang_hn_cp", R.drawable.ic_lang_hn_cp);ICONS.put("ic_lang_hn_lo", R.drawable.ic_lang_hn_lo);ICONS.put("ic_lang_hn_up", R.drawable.ic_lang_hn_up);ICONS.put("ic_lang_hr_cp", R.drawable.ic_lang_hr_cp);ICONS.put("ic_lang_hr_lo", R.drawable.ic_lang_hr_lo);ICONS.put("ic_lang_hr_up", R.drawable.ic_lang_hr_up);ICONS.put("ic_lang_id_cp", R.drawable.ic_lang_id_cp);ICONS.put("ic_lang_id_lo", R.drawable.ic_lang_id_lo);ICONS.put("ic_lang_id_up", R.drawable.ic_lang_id_up);ICONS.put("ic_lang_it_cp", R.drawable.ic_lang_it_cp);ICONS.put("ic_lang_it_lo", R.drawable.ic_lang_it_lo);ICONS.put("ic_lang_it_up", R.drawable.ic_lang_it_up);ICONS.put("ic_lang_ji", R.drawable.ic_lang_ji);ICONS.put("ic_lang_kanji", R.drawable.ic_lang_kanji);ICONS.put("ic_lang_ko", R.drawable.ic_lang_ko);ICONS.put("ic_lang_latin_lo", R.drawable.ic_lang_latin_lo);ICONS.put("ic_lang_latin_lo", R.drawable.ic_lang_latin_lo);ICONS.put("ic_lang_latin_lo", R.drawable.ic_lang_latin_lo);ICONS.put("ic_lang_latin_lo", R.drawable.ic_lang_latin_lo);ICONS.put("ic_lang_latin_lo", R.drawable.ic_lang_latin_lo);ICONS.put("ic_lang_latin_lo", R.drawable.ic_lang_latin_lo);ICONS.put("ic_lang_latin_lo", R.drawable.ic_lang_latin_lo);ICONS.put("ic_lang_latin_lo", R.drawable.ic_lang_latin_lo);ICONS.put("ic_lang_latin_lo", R.drawable.ic_lang_latin_lo);ICONS.put("ic_lang_latin_lo", R.drawable.ic_lang_latin_lo);ICONS.put("ic_lang_latin_lo", R.drawable.ic_lang_latin_lo);ICONS.put("ic_lang_latin_lo", R.drawable.ic_lang_latin_lo);ICONS.put("ic_lang_latin_lo", R.drawable.ic_lang_latin_lo);ICONS.put("ic_lang_latin_lo", R.drawable.ic_lang_latin_lo);ICONS.put("ic_lang_latin_lo", R.drawable.ic_lang_latin_lo);ICONS.put("ic_lang_latin_lo", R.drawable.ic_lang_latin_lo);ICONS.put("ic_lang_latin_lo", R.drawable.ic_lang_latin_lo);ICONS.put("ic_lang_latin_lo", R.drawable.ic_lang_latin_lo);ICONS.put("ic_lang_latin_lo", R.drawable.ic_lang_latin_lo);ICONS.put("ic_lang_latin_lo", R.drawable.ic_lang_latin_lo);ICONS.put("ic_lang_latin_lo", R.drawable.ic_lang_latin_lo);ICONS.put("ic_lang_latin_lo", R.drawable.ic_lang_latin_lo);ICONS.put("ic_lang_latin_lo", R.drawable.ic_lang_latin_lo);ICONS.put("ic_lang_latin_lo", R.drawable.ic_lang_latin_lo);ICONS.put("ic_lang_latin_lo", R.drawable.ic_lang_latin_lo);ICONS.put("ic_lang_latin_lo", R.drawable.ic_lang_latin_lo);ICONS.put("ic_lang_latin_lo", R.drawable.ic_lang_latin_lo);ICONS.put("ic_lang_latin_lo", R.drawable.ic_lang_latin_lo);ICONS.put("ic_lang_latin_lo", R.drawable.ic_lang_latin_lo);ICONS.put("ic_lang_latin_up", R.drawable.ic_lang_latin_up);ICONS.put("ic_lang_latin_up", R.drawable.ic_lang_latin_up);ICONS.put("ic_lang_latin_up", R.drawable.ic_lang_latin_up);ICONS.put("ic_lang_latin_up", R.drawable.ic_lang_latin_up);ICONS.put("ic_lang_latin_up", R.drawable.ic_lang_latin_up);ICONS.put("ic_lang_latin_up", R.drawable.ic_lang_latin_up);ICONS.put("ic_lang_latin_up", R.drawable.ic_lang_latin_up);ICONS.put("ic_lang_latin_up", R.drawable.ic_lang_latin_up);ICONS.put("ic_lang_latin_up", R.drawable.ic_lang_latin_up);ICONS.put("ic_lang_latin_up", R.drawable.ic_lang_latin_up);ICONS.put("ic_lang_latin_up", R.drawable.ic_lang_latin_up);ICONS.put("ic_lang_latin_up", R.drawable.ic_lang_latin_up);ICONS.put("ic_lang_latin_up", R.drawable.ic_lang_latin_up);ICONS.put("ic_lang_latin_up", R.drawable.ic_lang_latin_up);ICONS.put("ic_lang_latin_up", R.drawable.ic_lang_latin_up);ICONS.put("ic_lang_latin_up", R.drawable.ic_lang_latin_up);ICONS.put("ic_lang_latin_up", R.drawable.ic_lang_latin_up);ICONS.put("ic_lang_latin_up", R.drawable.ic_lang_latin_up);ICONS.put("ic_lang_latin_up", R.drawable.ic_lang_latin_up);ICONS.put("ic_lang_latin_up", R.drawable.ic_lang_latin_up);ICONS.put("ic_lang_latin_up", R.drawable.ic_lang_latin_up);ICONS.put("ic_lang_latin_up", R.drawable.ic_lang_latin_up);ICONS.put("ic_lang_latin_up", R.drawable.ic_lang_latin_up);ICONS.put("ic_lang_latin_up", R.drawable.ic_lang_latin_up);ICONS.put("ic_lang_latin_up", R.drawable.ic_lang_latin_up);ICONS.put("ic_lang_latin_up", R.drawable.ic_lang_latin_up);ICONS.put("ic_lang_latin_up", R.drawable.ic_lang_latin_up);ICONS.put("ic_lang_latin_up", R.drawable.ic_lang_latin_up);ICONS.put("ic_lang_latin_up", R.drawable.ic_lang_latin_up);ICONS.put("ic_lang_lt_cp", R.drawable.ic_lang_lt_cp);ICONS.put("ic_lang_lt_lo", R.drawable.ic_lang_lt_lo);ICONS.put("ic_lang_lt_up", R.drawable.ic_lang_lt_up);ICONS.put("ic_lang_lv_cp", R.drawable.ic_lang_lv_cp);ICONS.put("ic_lang_lv_lo", R.drawable.ic_lang_lv_lo);ICONS.put("ic_lang_lv_up", R.drawable.ic_lang_lv_up);ICONS.put("ic_lang_mg_cp", R.drawable.ic_lang_mg_cp);ICONS.put("ic_lang_mg_lo", R.drawable.ic_lang_mg_lo);ICONS.put("ic_lang_mg_up", R.drawable.ic_lang_mg_up);ICONS.put("ic_lang_nl_cp", R.drawable.ic_lang_nl_cp);ICONS.put("ic_lang_nl_lo", R.drawable.ic_lang_nl_lo);ICONS.put("ic_lang_nl_up", R.drawable.ic_lang_nl_up);ICONS.put("ic_lang_no_cp", R.drawable.ic_lang_no_cp);ICONS.put("ic_lang_no_lo", R.drawable.ic_lang_no_lo);ICONS.put("ic_lang_no_up", R.drawable.ic_lang_no_up);ICONS.put("ic_lang_pl_cp", R.drawable.ic_lang_pl_cp);ICONS.put("ic_lang_pl_lo", R.drawable.ic_lang_pl_lo);ICONS.put("ic_lang_pl_up", R.drawable.ic_lang_pl_up);ICONS.put("ic_lang_pt_cp", R.drawable.ic_lang_pt_cp);ICONS.put("ic_lang_pt_lo", R.drawable.ic_lang_pt_lo);ICONS.put("ic_lang_pt_up", R.drawable.ic_lang_pt_up);ICONS.put("ic_lang_ro_cp", R.drawable.ic_lang_ro_cp);ICONS.put("ic_lang_ro_lo", R.drawable.ic_lang_ro_lo);ICONS.put("ic_lang_ro_up", R.drawable.ic_lang_ro_up);ICONS.put("ic_lang_ru_cp", R.drawable.ic_lang_ru_cp);ICONS.put("ic_lang_ru_lo", R.drawable.ic_lang_ru_lo);ICONS.put("ic_lang_ru_up", R.drawable.ic_lang_ru_up);ICONS.put("ic_lang_sl_cp", R.drawable.ic_lang_sl_cp);ICONS.put("ic_lang_sl_lo", R.drawable.ic_lang_sl_lo);ICONS.put("ic_lang_sl_up", R.drawable.ic_lang_sl_up);ICONS.put("ic_lang_su_cp", R.drawable.ic_lang_su_cp);ICONS.put("ic_lang_su_lo", R.drawable.ic_lang_su_lo);ICONS.put("ic_lang_su_up", R.drawable.ic_lang_su_up);ICONS.put("ic_lang_sv_cp", R.drawable.ic_lang_sv_cp);ICONS.put("ic_lang_sv_lo", R.drawable.ic_lang_sv_lo);ICONS.put("ic_lang_sv_up", R.drawable.ic_lang_sv_up);ICONS.put("ic_lang_sw_cp", R.drawable.ic_lang_sw_cp);ICONS.put("ic_lang_sw_lo", R.drawable.ic_lang_sw_lo);ICONS.put("ic_lang_sw_up", R.drawable.ic_lang_sw_up);ICONS.put("ic_lang_th", R.drawable.ic_lang_th);ICONS.put("ic_lang_th_abc", R.drawable.ic_lang_th_abc);ICONS.put("ic_lang_tifinagh", R.drawable.ic_lang_tifinagh);ICONS.put("ic_lang_tm_cp", R.drawable.ic_lang_tm_cp);ICONS.put("ic_lang_tm_lo", R.drawable.ic_lang_tm_lo);ICONS.put("ic_lang_tm_tifinagh", R.drawable.ic_lang_tm_tifinagh);ICONS.put("ic_lang_tm_up", R.drawable.ic_lang_tm_up);ICONS.put("ic_lang_tr_cp", R.drawable.ic_lang_tr_cp);ICONS.put("ic_lang_tr_lo", R.drawable.ic_lang_tr_lo);ICONS.put("ic_lang_tr_up", R.drawable.ic_lang_tr_up);ICONS.put("ic_lang_uk_cp", R.drawable.ic_lang_uk_cp);ICONS.put("ic_lang_uk_lo", R.drawable.ic_lang_uk_lo);ICONS.put("ic_lang_uk_up", R.drawable.ic_lang_uk_up);ICONS.put("ic_lang_vi_cp", R.drawable.ic_lang_vi_cp);ICONS.put("ic_lang_vi_lo", R.drawable.ic_lang_vi_lo);ICONS.put("ic_lang_vi_up", R.drawable.ic_lang_vi_up);ICONS.put("ic_lang_zh_pinyin", R.drawable.ic_lang_zh_pinyin); } + + private int resolveResourcePerMode(@Nullable Context ctx, @Nullable SettingsStore settings, @Nullable InputMode mode, @Nullable Language language) { if (language == null || mode == null || settings == null || InputModeKind.isPassthrough(mode) || !settings.isStatusIconEnabled()) { return 0; @@ -34,58 +45,47 @@ public class StatusIcon { } else if (InputModeKind.is123(mode)) { return R.drawable.ic_lang_123; } else if (InputModeKind.isABC(mode)) { - return resolveResource(ctx, language.getIconABC(), language.hasUpperCase() ? mode.getTextCase() : InputMode.CASE_UNDEFINED); + return getResourceId(getResourceName(mode, language), R.drawable.ic_keyboard); } else if (InputModeKind.isPredictive(mode)) { - return resolveResource(ctx, language.getIconT9(), language.hasUpperCase() ? mode.getTextCase() : InputMode.CASE_UNDEFINED); + return getResourceId(getResourceName(mode, language), R.drawable.ic_keyboard); } return R.drawable.ic_keyboard; } - private int resolveResource(Context ctx, String name, int textCase) { - if (ctx == null || name == null) { - return 0; - } - - switch (textCase) { - case InputMode.CASE_UPPER: - name += "_up"; - break; - case InputMode.CASE_LOWER: - name += "_lo"; - break; - case InputMode.CASE_CAPITALIZE: - name += "_cp"; - break; - } - - return ctx.getResources().getIdentifier("drawable/" + name, null, ctx.getPackageName()); - } - - @Nullable - private static String getCacheKey(@Nullable InputMode mode, @Nullable Language language) { + private String getResourceName(@Nullable InputMode mode, @Nullable Language language) { if (mode == null || language == null) { return null; } - return mode.getId() + "_" + language.getId() + "_" + (language.hasUpperCase() ? mode.getTextCase() : InputMode.CASE_UNDEFINED); + final StringBuilder key = new StringBuilder(); + key.append(InputModeKind.isABC(mode) ? language.getIconABC() : language.getIconT9()); + + int textCase = language.hasUpperCase() ? mode.getTextCase() : InputMode.CASE_UNDEFINED; + switch (textCase) { + case InputMode.CASE_UPPER: + key.append("_up"); + break; + case InputMode.CASE_LOWER: + key.append("_lo"); + break; + case InputMode.CASE_CAPITALIZE: + key.append("_cp"); + break; + } + + return key.toString(); } - public static int getResource(@Nullable Context ctx, @Nullable SettingsStore settings, @Nullable InputMode mode, @Nullable Language language) { - final String cacheKey = getCacheKey(mode, language); - Integer resId = cache.containsKey(cacheKey) ? cache.get(cacheKey) : Integer.valueOf(0); - if (resId != null && resId != 0) { - return resId; + private int getResourceId(@Nullable String key, int defaultValue) { + Integer resId = null; + if (key != null && ICONS.containsKey(key)) { + resId = ICONS.get(key); } - resId = new StatusIcon(ctx, settings, mode, language).resourceId; - if (resId != 0) { - cache.put(cacheKey, resId); - } - - return resId; + return resId != null ? resId : defaultValue; } } diff --git a/app/status-icon-tools.gradle b/app/status-icon-tools.gradle new file mode 100644 index 00000000..e99d7512 --- /dev/null +++ b/app/status-icon-tools.gradle @@ -0,0 +1,78 @@ +ext.updateStatusIconCache = { String definitionsDir, String drawablesDir, String javaFile -> + def java = new File(javaFile) + if (!java.exists()) { + throw new GradleException("Cannot update the status icons. Java file not found: ${javaFile}") + } + + final METHOD_NAME = "generateIconsCache()" + + def javaText = java.getText() + if (!javaText.contains(METHOD_NAME)) { + throw new GradleException("Cannot update the status icons. Method not found: ${METHOD_NAME}") + } + + def hashMap = generateMap(definitionsDir, drawablesDir) + + def newJava = java.getText().replaceFirst(/$METHOD_NAME.+?}/, "$METHOD_NAME { $hashMap }") + java.write(newJava) +} + + +static def generateMap(String definitionsDirPath, String drawablesDirPath) { + def drawablesDir = new File(drawablesDirPath) + if (!drawablesDir.exists()) { + throw new GradleException("Cannot update the status icons. Icons directory not found: ${drawablesDir}") + } + + def definitionsDir = new File(definitionsDirPath) + if (!definitionsDir.exists()) { + throw new GradleException("Cannot update the status icons. Definitions directory not found: ${definitionsDir}") + } + + def icons = [] + + definitionsDir.listFiles().each{ file -> + file.readLines().each { line -> + if (!line.contains("icon")) { + return + } + + def parts = line.split(":") + if (parts.length != 2) { + return + } + + def iconName = parts[1].trim() + def iconFile = new File(drawablesDir, "${iconName}.xml") + if (iconFile.exists()) { + icons << iconName + } + + def iconUppercase = new File(drawablesDir, "${iconName}_up.xml") + if (iconUppercase.exists()) { + icons << iconName + "_up" + } + + def iconLowercase = new File(drawablesDir, "${iconName}_lo.xml") + if (iconLowercase.exists()) { + icons << iconName + "_lo" + } + + + def iconCapitalized = new File(drawablesDir, "${iconName}_cp.xml") + if (iconCapitalized.exists()) { + icons << iconName + "_cp" + } + } + } + + def javaHashMap = "" + icons = icons.sort() + + for (int i = 0; i < icons.size(); i++) { + def iconName = icons[i] + javaHashMap += "ICONS.put(\"${iconName}\", R.drawable.${iconName});" + } + + return javaHashMap +}