feat: Adjust navigation bar padding based on emoji box and keyboard visibility
This commit is contained in:
@@ -7,14 +7,16 @@ import androidx.compose.foundation.layout.Box
|
|||||||
import androidx.compose.foundation.layout.fillMaxWidth
|
import androidx.compose.foundation.layout.fillMaxWidth
|
||||||
import androidx.compose.foundation.layout.height
|
import androidx.compose.foundation.layout.height
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.getValue
|
|
||||||
import androidx.compose.runtime.LaunchedEffect
|
import androidx.compose.runtime.LaunchedEffect
|
||||||
|
import androidx.compose.runtime.getValue
|
||||||
import androidx.compose.runtime.mutableStateOf
|
import androidx.compose.runtime.mutableStateOf
|
||||||
import androidx.compose.runtime.remember
|
import androidx.compose.runtime.remember
|
||||||
|
import androidx.compose.runtime.setValue
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.graphics.graphicsLayer
|
import androidx.compose.ui.graphics.graphicsLayer
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
|
import kotlinx.coroutines.delay
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 🚀 Telegram-style: Fixed Height Box + Fade In/Out
|
* 🚀 Telegram-style: Fixed Height Box + Fade In/Out
|
||||||
@@ -36,25 +38,30 @@ fun AnimatedKeyboardTransition(
|
|||||||
val tag = "AnimatedTransition"
|
val tag = "AnimatedTransition"
|
||||||
|
|
||||||
// 🔥 Отслеживаем был ли emoji открыт (для определения перехода emoji→keyboard)
|
// 🔥 Отслеживаем был ли emoji открыт (для определения перехода emoji→keyboard)
|
||||||
val wasEmojiShown = remember { mutableStateOf(false) }
|
var wasEmojiShown by remember { mutableStateOf(false) }
|
||||||
val isTransitioningToKeyboard = remember { mutableStateOf(false) }
|
var isTransitioningToKeyboard by remember { mutableStateOf(false) }
|
||||||
|
|
||||||
// Когда emoji открывается - запоминаем
|
// 🔥 Клавиатура достигла ПОЛНОЙ высоты (разница не более 3dp)
|
||||||
LaunchedEffect(showEmojiPicker) {
|
val isKeyboardFullHeight = coordinator.emojiHeight > 0.dp &&
|
||||||
if (showEmojiPicker) {
|
coordinator.keyboardHeight >= coordinator.emojiHeight - 3.dp
|
||||||
wasEmojiShown.value = true
|
|
||||||
} else if (wasEmojiShown.value) {
|
// Логика перехода
|
||||||
|
if (showEmojiPicker && !wasEmojiShown) {
|
||||||
|
wasEmojiShown = true
|
||||||
|
}
|
||||||
|
if (!showEmojiPicker && wasEmojiShown && !isTransitioningToKeyboard) {
|
||||||
// Emoji закрылся после того как был открыт = переход emoji→keyboard
|
// Emoji закрылся после того как был открыт = переход emoji→keyboard
|
||||||
isTransitioningToKeyboard.value = true
|
isTransitioningToKeyboard = true
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Сбрасываем флаг перехода когда клавиатура достигла полной высоты
|
// 🔥 КЛЮЧЕВОЕ: Сбрасываем флаг ПОСЛЕ небольшой задержки когда клавиатура полностью открылась
|
||||||
val isKeyboardFullHeight = coordinator.keyboardHeight >= coordinator.emojiHeight * 0.95f && coordinator.emojiHeight > 0.dp
|
// Это гарантирует что Box останется виден пока система не отрисует клавиатуру
|
||||||
LaunchedEffect(isKeyboardFullHeight) {
|
LaunchedEffect(isKeyboardFullHeight, isTransitioningToKeyboard) {
|
||||||
if (isKeyboardFullHeight && isTransitioningToKeyboard.value) {
|
if (isKeyboardFullHeight && isTransitioningToKeyboard) {
|
||||||
isTransitioningToKeyboard.value = false
|
delay(50) // Небольшая задержка для завершения отрисовки
|
||||||
wasEmojiShown.value = false
|
isTransitioningToKeyboard = false
|
||||||
|
wasEmojiShown = false
|
||||||
|
Log.d("AnimatedTransition", "✅ Transition complete, keyboard at full height")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -73,15 +80,13 @@ fun AnimatedKeyboardTransition(
|
|||||||
|
|
||||||
// 🔥 Box показан когда:
|
// 🔥 Box показан когда:
|
||||||
// 1. showEmojiPicker=true (emoji открыт), ИЛИ
|
// 1. showEmojiPicker=true (emoji открыт), ИЛИ
|
||||||
// 2. анимация fade-out ещё идёт (alpha > 0.01), ИЛИ
|
// 2. переход emoji→keyboard активен (ждём пока клавиатура полностью откроется)
|
||||||
// 3. переход emoji→keyboard И клавиатура ещё не достигла полной высоты
|
val shouldShowBox = showEmojiPicker || isTransitioningToKeyboard
|
||||||
val isFadingOut = !showEmojiPicker && animatedAlpha > 0.01f
|
|
||||||
val shouldShowBox = showEmojiPicker || isFadingOut || isTransitioningToKeyboard.value
|
|
||||||
|
|
||||||
// 🔥 ВАЖНО: Обновляем состояние в координаторе для отключения imePadding
|
// 🔥 ВАЖНО: Обновляем состояние в координаторе для отключения imePadding
|
||||||
coordinator.isEmojiBoxVisible = shouldShowBox
|
coordinator.isEmojiBoxVisible = shouldShowBox
|
||||||
|
|
||||||
Log.d(tag, "🎨 Emoji panel: show=$showEmojiPicker, alpha=$animatedAlpha, shouldShow=$shouldShowBox, transitioning=${isTransitioningToKeyboard.value}, kbHeight=${coordinator.keyboardHeight}")
|
Log.d(tag, "🎨 Emoji panel: show=$showEmojiPicker, alpha=$animatedAlpha, shouldShow=$shouldShowBox, transitioning=$isTransitioningToKeyboard, kbHeight=${coordinator.keyboardHeight}, emojiH=${coordinator.emojiHeight}")
|
||||||
|
|
||||||
if (shouldShowBox) {
|
if (shouldShowBox) {
|
||||||
Box(
|
Box(
|
||||||
|
|||||||
@@ -2233,14 +2233,17 @@ private fun MessageInputBar(
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// 🔥 Когда emoji Box виден ИЛИ клавиатура открыта - НЕ добавляем navigation bar padding
|
||||||
|
val shouldAddNavBarPadding = !isKeyboardVisible && !coordinator.isEmojiBoxVisible
|
||||||
|
|
||||||
Column(
|
Column(
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.fillMaxWidth()
|
.fillMaxWidth()
|
||||||
.background(
|
.background(
|
||||||
color = backgroundColor // Тот же цвет что и фон чата
|
color = backgroundColor // Тот же цвет что и фон чата
|
||||||
)
|
)
|
||||||
.padding(bottom = if (isKeyboardVisible) 0.dp else 16.dp)
|
.padding(bottom = if (isKeyboardVisible || coordinator.isEmojiBoxVisible) 0.dp else 16.dp)
|
||||||
.navigationBarsPadding() // 🔥 Учитываем navigation bar когда клавиатура закрыта
|
.then(if (shouldAddNavBarPadding) Modifier.navigationBarsPadding() else Modifier)
|
||||||
) {
|
) {
|
||||||
// REPLY PANEL
|
// REPLY PANEL
|
||||||
AnimatedVisibility(
|
AnimatedVisibility(
|
||||||
|
|||||||
Reference in New Issue
Block a user