feat: Implement smart logging for keyboard and emoji height transitions

This commit is contained in:
k1ngsterr1
2026-01-15 15:49:05 +05:00
parent 959e56461a
commit 64acf515d2
4 changed files with 77 additions and 26 deletions

View File

@@ -41,6 +41,9 @@ fun AnimatedKeyboardTransition(
var wasEmojiShown by remember { mutableStateOf(false) }
var isTransitioningToKeyboard by remember { mutableStateOf(false) }
// 📊 Последнее залогированное значение alpha (для фильтрации)
val lastLoggedAlpha = remember { mutableStateOf(-1f) }
// 🔥 Клавиатура достигла ПОЛНОЙ высоты (разница не более 3dp)
val isKeyboardFullHeight = coordinator.emojiHeight > 0.dp &&
coordinator.keyboardHeight >= coordinator.emojiHeight - 3.dp
@@ -54,15 +57,11 @@ fun AnimatedKeyboardTransition(
isTransitioningToKeyboard = true
}
// 🔥 КЛЮЧЕВОЕ: Сбрасываем флаг ПОСЛЕ небольшой задержки когда клавиатура полностью открылась
// Это гарантирует что Box останется виден пока система не отрисует клавиатуру
LaunchedEffect(isKeyboardFullHeight, isTransitioningToKeyboard) {
if (isKeyboardFullHeight && isTransitioningToKeyboard) {
delay(50) // Небольшая задержка для завершения отрисовки
isTransitioningToKeyboard = false
wasEmojiShown = false
Log.d("AnimatedTransition", "✅ Transition complete, keyboard at full height")
}
// 🔥 КЛЮЧЕВОЕ: Сбрасываем флаг БЕЗ задержки когда клавиатура полностью открылась
// Проверяем прямо в composition для мгновенной реакции
if (isKeyboardFullHeight && isTransitioningToKeyboard) {
isTransitioningToKeyboard = false
wasEmojiShown = false
}
// 🎯 Целевая прозрачность
@@ -86,7 +85,17 @@ fun AnimatedKeyboardTransition(
// 🔥 ВАЖНО: Обновляем состояние в координаторе для отключения imePadding
coordinator.isEmojiBoxVisible = shouldShowBox
Log.d(tag, "🎨 Emoji panel: show=$showEmojiPicker, alpha=$animatedAlpha, shouldShow=$shouldShowBox, transitioning=$isTransitioningToKeyboard, kbHeight=${coordinator.keyboardHeight}, emojiH=${coordinator.emojiHeight}")
// 📊 Умное логирование: только ключевые моменты (0%, 25%, 50%, 75%, 100%)
val alphaPercent = (animatedAlpha * 100).toInt()
val lastPercent = (lastLoggedAlpha.value * 100).toInt()
val shouldLog = alphaPercent == 0 || alphaPercent == 25 || alphaPercent == 50 ||
alphaPercent == 75 || alphaPercent == 100 ||
(lastPercent != alphaPercent && (alphaPercent % 10 == 0))
if (shouldLog && lastLoggedAlpha.value != animatedAlpha) {
lastLoggedAlpha.value = animatedAlpha
Log.d(tag, "🎬 Alpha: ${alphaPercent}%, show=$showEmojiPicker, shouldShow=$shouldShowBox, transitioning=$isTransitioningToKeyboard, kb=${coordinator.keyboardHeight.value.toInt()}dp")
}
if (shouldShowBox) {
Box(

View File

@@ -71,6 +71,10 @@ class KeyboardTransitionCoordinator {
// 🔥 Коллбэк для показа emoji (сохраняем для вызова после закрытия клавиатуры)
private var pendingShowEmojiCallback: (() -> Unit)? = null
// 📊 Для умного логирования (не каждый фрейм)
private var lastLogTime = 0L
private var lastLoggedHeight = -1f
/**
* Переход от системной клавиатуры к emoji панели.
*
@@ -253,40 +257,38 @@ class KeyboardTransitionCoordinator {
* Обновить высоту клавиатуры из IME.
*/
fun updateKeyboardHeight(height: Dp) {
Log.d(TAG, "════════════════════════════════════════════════════════")
Log.d(TAG, "📏 updateKeyboardHeight called: $keyboardHeight$height")
Log.d(TAG, " isKeyboardVisible=$isKeyboardVisible, emojiHeight=$emojiHeight, maxHeight=$maxKeyboardHeight")
val now = System.currentTimeMillis()
val heightChanged = kotlin.math.abs(height.value - lastLoggedHeight) > 5f
// Логируем раз в 50ms ИЛИ при значительном изменении высоты (>5dp)
if (heightChanged && (now - lastLogTime > 50 || lastLoggedHeight < 0)) {
Log.d(TAG, "⌨️ KB: ${height.value.toInt()}dp, emoji: ${emojiHeight.value.toInt()}dp, visible=$isKeyboardVisible")
lastLogTime = now
lastLoggedHeight = height.value
}
if (height > 100.dp && height != keyboardHeight) {
Log.d(TAG, "✅ Keyboard height updated: $keyboardHeight$height")
keyboardHeight = height
// 🔥 Сохраняем максимальную высоту
if (height > maxKeyboardHeight) {
Log.d(TAG, "📊 Updating max height: $maxKeyboardHeight$height")
maxKeyboardHeight = height
}
// Если emoji высота не установлена, синхронизировать
if (emojiHeight == 0.dp) {
Log.d(TAG, "🔄 Syncing emoji height (was 0): $emojiHeight$height")
emojiHeight = height
}
} else if (height == 0.dp && keyboardHeight != 0.dp) {
// 🔥 Клавиатура закрывается - восстанавливаем emojiHeight до МАКСИМАЛЬНОЙ высоты
Log.d(TAG, "⌨️ Keyboard closing, restoring emoji height to max")
Log.d(TAG, " Before: keyboardHeight=$keyboardHeight, emojiHeight=$emojiHeight, maxHeight=$maxKeyboardHeight")
// Восстанавливаем emojiHeight до максимальной высоты
if (maxKeyboardHeight > 0.dp) {
emojiHeight = maxKeyboardHeight
Log.d(TAG, " After: emojiHeight restored to $maxKeyboardHeight")
}
// Обнуляем keyboardHeight
keyboardHeight = 0.dp
} else {
Log.d(TAG, "⏭️ No update needed (height too small or unchanged)")
}
// 🔥 УБРАН pending callback - теперь emoji показывается сразу в requestShowEmoji()
@@ -297,7 +299,6 @@ class KeyboardTransitionCoordinator {
*/
fun updateEmojiHeight(height: Dp) {
if (height > 0.dp && height != emojiHeight) {
Log.d(TAG, "📏 Emoji height updated: $emojiHeight$height")
emojiHeight = height
}
}
@@ -311,10 +312,7 @@ class KeyboardTransitionCoordinator {
fun syncHeights() {
// 🔥 Синхронизируем ТОЛЬКО если клавиатура ОТКРЫТА и высота больше текущей emoji
if (keyboardHeight > 100.dp && keyboardHeight > emojiHeight) {
Log.d(TAG, "🔄 syncHeights: updating emoji $emojiHeight$keyboardHeight")
emojiHeight = keyboardHeight
} else {
Log.d(TAG, "⏭️ syncHeights: skipped (keyboard=$keyboardHeight, emoji=$emojiHeight)")
}
}
@@ -324,7 +322,6 @@ class KeyboardTransitionCoordinator {
*/
fun initializeEmojiHeight(height: Dp) {
if (emojiHeight == 0.dp && height > 0.dp) {
Log.d(TAG, "🚀 Initializing emoji height: $height")
emojiHeight = height
maxKeyboardHeight = height
}