From 8720d027018a9593f8811443af02eaeff0ae266b Mon Sep 17 00:00:00 2001 From: k1ngsterr1 Date: Tue, 13 Jan 2026 01:48:57 +0500 Subject: [PATCH] feat: Limit emoji loading to 500 for performance and optimize image request size for faster loading --- .../ui/components/AppleEmojiPicker.kt | 34 +++++++++---------- 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/com/rosetta/messenger/ui/components/AppleEmojiPicker.kt b/app/src/main/java/com/rosetta/messenger/ui/components/AppleEmojiPicker.kt index 5840c71..78de1a1 100644 --- a/app/src/main/java/com/rosetta/messenger/ui/components/AppleEmojiPicker.kt +++ b/app/src/main/java/com/rosetta/messenger/ui/components/AppleEmojiPicker.kt @@ -52,10 +52,8 @@ data class EmojiCategory( val ranges: List> ) -// Порядок категорий: "All" первая, затем стандартные +// Порядок категорий val EMOJI_CATEGORIES = listOf( - // 🔥 ALL - все эмодзи (первая категория) - EmojiCategory("All", "Все", Icons.Default.Apps, emptyList()), // 😀 Smileys & Emotion EmojiCategory("Smileys", "Смайлы", Icons.Default.SentimentSatisfied, listOf( 0x1F600 to 0x1F64F, @@ -177,18 +175,14 @@ object EmojiCache { } fun getEmojisForCategory(categoryKey: String): List { - return if (categoryKey == "All") { - allEmojis ?: emptyList() - } else { - emojisByCategory?.get(categoryKey) ?: emptyList() - } + return emojisByCategory?.get(categoryKey) ?: emptyList() } private fun groupEmojis(allEmojis: List): Map> { val result = mutableMapOf>() val usedEmojis = mutableSetOf() - EMOJI_CATEGORIES.filter { it.key != "All" }.forEach { category -> + EMOJI_CATEGORIES.forEach { category -> result[category.key] = mutableListOf() } @@ -251,13 +245,14 @@ fun EmojiButton( label = "emojiScale" ) - val imageRequest = remember(unified, context) { + val imageRequest = remember(unified) { ImageRequest.Builder(context) .data("file:///android_asset/emoji/${unified.lowercase()}.png") .crossfade(false) - .size(64) + .size(48) // Меньше размер = быстрее загрузка .memoryCachePolicy(CachePolicy.ENABLED) .diskCachePolicy(CachePolicy.ENABLED) + .allowHardware(true) // Аппаратное ускорение .memoryCacheKey("emoji_$unified") .diskCacheKey("emoji_$unified") .build() @@ -348,15 +343,18 @@ fun AppleEmojiPickerPanel( val context = LocalContext.current var selectedCategory by remember { mutableStateOf(EMOJI_CATEGORIES[0]) } // "All" по умолчанию val gridState = rememberLazyGridState() + var shouldLoad by remember { mutableStateOf(false) } - // Загружаем эмодзи в фоне + // Отложенная загрузка эмодзи (чтобы не блокировать UI при открытии) LaunchedEffect(Unit) { + kotlinx.coroutines.delay(100) // Задержка 100ms для плавности + shouldLoad = true EmojiCache.loadEmojis(context) } // Текущие эмодзи для выбранной категории - val currentEmojis = remember(selectedCategory.key, EmojiCache.isLoaded) { - if (EmojiCache.isLoaded) { + val currentEmojis = remember(selectedCategory.key, EmojiCache.isLoaded, shouldLoad) { + if (shouldLoad && EmojiCache.isLoaded) { EmojiCache.getEmojisForCategory(selectedCategory.key) } else { emptyList() @@ -405,7 +403,7 @@ fun AppleEmojiPickerPanel( ) // Сетка эмодзи - if (!EmojiCache.isLoaded) { + if (!shouldLoad || !EmojiCache.isLoaded) { Box( modifier = Modifier .fillMaxWidth() @@ -439,9 +437,9 @@ fun AppleEmojiPickerPanel( .fillMaxWidth() .weight(1f) .padding(horizontal = 4.dp), - horizontalArrangement = Arrangement.spacedBy(2.dp), - verticalArrangement = Arrangement.spacedBy(2.dp), - contentPadding = PaddingValues(vertical = 8.dp) + horizontalArrangement = Arrangement.spacedBy(1.dp), + verticalArrangement = Arrangement.spacedBy(1.dp), + contentPadding = PaddingValues(vertical = 4.dp) ) { items( items = currentEmojis,