From eec197c32cfc809a82fa88a524fdc317807d8ddc Mon Sep 17 00:00:00 2001 From: Helium314 Date: Mon, 17 Feb 2025 19:32:02 +0100 Subject: [PATCH] cache subtype display names for improved performance --- .../keyboard/keyboard/KeyboardLayoutSet.java | 2 ++ .../keyboard/latin/utils/SubtypeLocaleUtils.java | 16 +++++++++++++++- .../keyboard/settings/screens/LanguageScreen.kt | 3 +-- 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/helium314/keyboard/keyboard/KeyboardLayoutSet.java b/app/src/main/java/helium314/keyboard/keyboard/KeyboardLayoutSet.java index 0a834fe76..dc609724a 100644 --- a/app/src/main/java/helium314/keyboard/keyboard/KeyboardLayoutSet.java +++ b/app/src/main/java/helium314/keyboard/keyboard/KeyboardLayoutSet.java @@ -26,6 +26,7 @@ import helium314.keyboard.latin.utils.InputTypeUtils; import helium314.keyboard.latin.utils.Log; import helium314.keyboard.latin.utils.ResourceUtils; import helium314.keyboard.latin.utils.ScriptUtils; +import helium314.keyboard.latin.utils.SubtypeLocaleUtils; import java.lang.ref.SoftReference; import java.util.HashMap; @@ -95,6 +96,7 @@ public final class KeyboardLayoutSet { public static void onSystemLocaleChanged() { clearKeyboardCache(); LocaleKeyboardInfosKt.clearCache(); + SubtypeLocaleUtils.clearDisplayNameCache(); } public static void onKeyboardThemeChanged() { diff --git a/app/src/main/java/helium314/keyboard/latin/utils/SubtypeLocaleUtils.java b/app/src/main/java/helium314/keyboard/latin/utils/SubtypeLocaleUtils.java index 65fe4d017..bb99355b6 100644 --- a/app/src/main/java/helium314/keyboard/latin/utils/SubtypeLocaleUtils.java +++ b/app/src/main/java/helium314/keyboard/latin/utils/SubtypeLocaleUtils.java @@ -12,6 +12,7 @@ import android.view.inputmethod.InputMethodSubtype; import helium314.keyboard.compat.ConfigurationCompatKt; import helium314.keyboard.latin.R; +import helium314.keyboard.latin.common.Constants; import helium314.keyboard.latin.common.LocaleUtils; import helium314.keyboard.latin.common.StringUtils; @@ -56,6 +57,7 @@ public final class SubtypeLocaleUtils { private static final HashMap sExceptionalLocaleToNameIdsMap = new HashMap<>(); // Exceptional locale to subtype name with layout resource id map. private static final HashMap sExceptionalLocaleToWithLayoutNameIdsMap = new HashMap<>(); + private static final HashMap sResourceSubtypeDisplayNames = new HashMap<>(); private static final String SUBTYPE_NAME_RESOURCE_PREFIX = "string/subtype_"; private static final String SUBTYPE_NAME_RESOURCE_GENERIC_PREFIX = "string/subtype_generic_"; private static final String SUBTYPE_NAME_RESOURCE_WITH_LAYOUT_PREFIX = "string/subtype_with_layout_"; @@ -239,8 +241,20 @@ public final class SubtypeLocaleUtils { @NonNull public static String getSubtypeDisplayNameInSystemLocale(@NonNull final InputMethodSubtype subtype) { + final String cached = sResourceSubtypeDisplayNames.get(subtype.hashCode()); + if (cached != null) return cached; + final Locale displayLocale = ConfigurationCompatKt.locale(sResources.getConfiguration()); - return getSubtypeDisplayNameInternal(subtype, displayLocale); + final String displayName = getSubtypeDisplayNameInternal(subtype, displayLocale); + + if (!subtype.containsExtraValueKey(Constants.Subtype.ExtraValue.IS_ADDITIONAL_SUBTYPE)) { + sResourceSubtypeDisplayNames.put(subtype.hashCode(), displayName); + } + return displayName; + } + + public static void clearDisplayNameCache() { + sResourceSubtypeDisplayNames.clear(); } @NonNull diff --git a/app/src/main/java/helium314/keyboard/settings/screens/LanguageScreen.kt b/app/src/main/java/helium314/keyboard/settings/screens/LanguageScreen.kt index f19fde7df..16a6630ac 100644 --- a/app/src/main/java/helium314/keyboard/settings/screens/LanguageScreen.kt +++ b/app/src/main/java/helium314/keyboard/settings/screens/LanguageScreen.kt @@ -67,7 +67,6 @@ fun LanguageScreen( } }, filteredItems = { term -> - // todo: maybe better performance with display name cache? sortedSubtypes.filter { it.displayName(ctx).replace("(", "") .splitOnWhitespace().any { it.startsWith(term, true) } @@ -116,7 +115,7 @@ fun LanguageScreen( } } -// todo: sorting is slow, need to cache displayName (overall or just in getSortedSubtypes), and then it should be fine +// sorting by display name is still slow, even with the cache... but probably good enough private fun getSortedSubtypes(context: Context): List { val systemLocales = SubtypeSettings.getSystemLocales() val enabledSubtypes = SubtypeSettings.getEnabledSubtypes(context.prefs(), true)