feat: Update keyboard height handling and enhance reply logging in ChatViewModel
This commit is contained in:
@@ -927,7 +927,8 @@ fun ChatDetailScreen(
|
|||||||
Row(
|
Row(
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.fillMaxWidth()
|
.fillMaxWidth()
|
||||||
.padding(horizontal = 16.dp, vertical = 12.dp)
|
.padding(horizontal = 16.dp, vertical = 16.dp)
|
||||||
|
.padding(bottom = 12.dp)
|
||||||
.navigationBarsPadding(),
|
.navigationBarsPadding(),
|
||||||
horizontalArrangement = Arrangement.spacedBy(12.dp),
|
horizontalArrangement = Arrangement.spacedBy(12.dp),
|
||||||
verticalAlignment = Alignment.CenterVertically
|
verticalAlignment = Alignment.CenterVertically
|
||||||
@@ -945,7 +946,7 @@ fun ChatDetailScreen(
|
|||||||
viewModel.setReplyMessages(selectedMsgs)
|
viewModel.setReplyMessages(selectedMsgs)
|
||||||
selectedMessages = emptySet()
|
selectedMessages = emptySet()
|
||||||
}
|
}
|
||||||
.padding(vertical = 14.dp),
|
.padding(vertical = 16.dp),
|
||||||
contentAlignment = Alignment.Center
|
contentAlignment = Alignment.Center
|
||||||
) {
|
) {
|
||||||
Row(
|
Row(
|
||||||
@@ -981,7 +982,7 @@ fun ChatDetailScreen(
|
|||||||
viewModel.setForwardMessages(selectedMsgs)
|
viewModel.setForwardMessages(selectedMsgs)
|
||||||
selectedMessages = emptySet()
|
selectedMessages = emptySet()
|
||||||
}
|
}
|
||||||
.padding(vertical = 14.dp),
|
.padding(vertical = 16.dp),
|
||||||
contentAlignment = Alignment.Center
|
contentAlignment = Alignment.Center
|
||||||
) {
|
) {
|
||||||
Row(
|
Row(
|
||||||
@@ -1100,11 +1101,12 @@ fun ChatDetailScreen(
|
|||||||
}
|
}
|
||||||
),
|
),
|
||||||
// padding для контента списка - минимальные отступы
|
// padding для контента списка - минимальные отступы
|
||||||
|
// 🔥 Увеличиваем bottom padding когда активен selection mode (Reply/Forward панель)
|
||||||
contentPadding = PaddingValues(
|
contentPadding = PaddingValues(
|
||||||
start = 8.dp,
|
start = 8.dp,
|
||||||
end = 8.dp,
|
end = 8.dp,
|
||||||
top = 8.dp,
|
top = 8.dp,
|
||||||
bottom = 80.dp // 🔥 Отступ снизу для инпута (увеличен)
|
bottom = if (isSelectionMode) 140.dp else 80.dp
|
||||||
),
|
),
|
||||||
reverseLayout = true
|
reverseLayout = true
|
||||||
) {
|
) {
|
||||||
@@ -1944,15 +1946,16 @@ private fun MessageInputBar(
|
|||||||
val isKeyboardVisible = imeHeight > 0.dp
|
val isKeyboardVisible = imeHeight > 0.dp
|
||||||
|
|
||||||
// 🔥 Запоминаем высоту клавиатуры когда она открыта
|
// 🔥 Запоминаем высоту клавиатуры когда она открыта
|
||||||
var savedKeyboardHeight by remember { mutableStateOf(280.dp) }
|
// Дефолт 320.dp - хорошая высота для большинства устройств
|
||||||
|
var savedKeyboardHeight by remember { mutableStateOf(320.dp) }
|
||||||
LaunchedEffect(imeHeight) {
|
LaunchedEffect(imeHeight) {
|
||||||
if (imeHeight > 50.dp) {
|
if (imeHeight > 100.dp) {
|
||||||
savedKeyboardHeight = imeHeight
|
savedKeyboardHeight = imeHeight
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Высота панели эмодзи = сохранённая высота клавиатуры
|
// Высота панели эмодзи = сохранённая высота клавиатуры (минимум 280.dp)
|
||||||
val emojiPanelHeight = savedKeyboardHeight
|
val emojiPanelHeight = maxOf(savedKeyboardHeight, 280.dp)
|
||||||
|
|
||||||
// Состояние отправки - можно отправить если есть текст ИЛИ есть reply
|
// Состояние отправки - можно отправить если есть текст ИЛИ есть reply
|
||||||
val canSend = remember(value, hasReply) { value.isNotBlank() || hasReply }
|
val canSend = remember(value, hasReply) { value.isNotBlank() || hasReply }
|
||||||
|
|||||||
@@ -932,7 +932,9 @@ class ChatViewModel(application: Application) : AndroidViewModel(application) {
|
|||||||
var replyBlobPlaintext = "" // Сохраняем plaintext для БД
|
var replyBlobPlaintext = "" // Сохраняем plaintext для БД
|
||||||
|
|
||||||
if (replyMsgsToSend.isNotEmpty()) {
|
if (replyMsgsToSend.isNotEmpty()) {
|
||||||
// Формируем JSON массив с цитируемыми сообщениями
|
android.util.Log.e("REPLY_DEBUG", "🔥 FORMING REPLY ATTACHMENT, count=${replyMsgsToSend.size}")
|
||||||
|
|
||||||
|
// Формируем JSON массив с цитируемыми сообщениями (как в RN)
|
||||||
val replyJsonArray = JSONArray()
|
val replyJsonArray = JSONArray()
|
||||||
replyMsgsToSend.forEach { msg ->
|
replyMsgsToSend.forEach { msg ->
|
||||||
val replyJson = JSONObject().apply {
|
val replyJson = JSONObject().apply {
|
||||||
@@ -943,20 +945,26 @@ class ChatViewModel(application: Application) : AndroidViewModel(application) {
|
|||||||
put("attachments", JSONArray()) // Пустой массив вложений
|
put("attachments", JSONArray()) // Пустой массив вложений
|
||||||
}
|
}
|
||||||
replyJsonArray.put(replyJson)
|
replyJsonArray.put(replyJson)
|
||||||
|
android.util.Log.e("REPLY_DEBUG", " - Reply msg: id=${msg.messageId}, text='${msg.text.take(30)}'")
|
||||||
}
|
}
|
||||||
|
|
||||||
replyBlobPlaintext = replyJsonArray.toString() // 🔥 Сохраняем plaintext
|
replyBlobPlaintext = replyJsonArray.toString() // 🔥 Сохраняем plaintext
|
||||||
|
android.util.Log.e("REPLY_DEBUG", " - Reply blob plaintext length: ${replyBlobPlaintext.length}")
|
||||||
|
android.util.Log.e("REPLY_DEBUG", " - Reply blob plaintext: ${replyBlobPlaintext.take(100)}")
|
||||||
|
|
||||||
// 🔥 Шифруем reply blob plainKeyAndNonce (как в React Native)
|
// 🔥 Шифруем reply blob plainKeyAndNonce (как в React Native)
|
||||||
val encryptedReplyBlob = MessageCrypto.encryptReplyBlob(replyBlobPlaintext, plainKeyAndNonce)
|
val encryptedReplyBlob = MessageCrypto.encryptReplyBlob(replyBlobPlaintext, plainKeyAndNonce)
|
||||||
|
android.util.Log.e("REPLY_DEBUG", " - Encrypted reply blob length: ${encryptedReplyBlob.length}")
|
||||||
|
android.util.Log.e("REPLY_DEBUG", " - Encrypted reply blob: ${encryptedReplyBlob.take(60)}")
|
||||||
|
|
||||||
|
val replyAttachmentId = "reply_${timestamp}"
|
||||||
messageAttachments.add(MessageAttachment(
|
messageAttachments.add(MessageAttachment(
|
||||||
id = UUID.randomUUID().toString().replace("-", "").take(8),
|
id = replyAttachmentId,
|
||||||
blob = encryptedReplyBlob,
|
blob = encryptedReplyBlob,
|
||||||
type = AttachmentType.MESSAGES,
|
type = AttachmentType.MESSAGES,
|
||||||
preview = ""
|
preview = ""
|
||||||
))
|
))
|
||||||
|
android.util.Log.e("REPLY_DEBUG", " ✅ Reply attachment added, id=$replyAttachmentId")
|
||||||
}
|
}
|
||||||
|
|
||||||
val packet = PacketMessage().apply {
|
val packet = PacketMessage().apply {
|
||||||
@@ -973,14 +981,21 @@ class ChatViewModel(application: Application) : AndroidViewModel(application) {
|
|||||||
// 🔥 Log packet details before sending
|
// 🔥 Log packet details before sending
|
||||||
Log.d(TAG, "📦 PACKET READY TO SEND:")
|
Log.d(TAG, "📦 PACKET READY TO SEND:")
|
||||||
Log.d(TAG, " - messageId: $messageId")
|
Log.d(TAG, " - messageId: $messageId")
|
||||||
|
Log.d(TAG, " - text: '$text'")
|
||||||
Log.d(TAG, " - attachments count: ${packet.attachments.size}")
|
Log.d(TAG, " - attachments count: ${packet.attachments.size}")
|
||||||
|
android.util.Log.e("REPLY_DEBUG", "📦 PACKET READY TO SEND:")
|
||||||
|
android.util.Log.e("REPLY_DEBUG", " - messageId: $messageId")
|
||||||
|
android.util.Log.e("REPLY_DEBUG", " - text: '$text'")
|
||||||
|
android.util.Log.e("REPLY_DEBUG", " - attachments count: ${packet.attachments.size}")
|
||||||
packet.attachments.forEach { att ->
|
packet.attachments.forEach { att ->
|
||||||
Log.d(TAG, " - attachment: type=${att.type}, id=${att.id}, blob.length=${att.blob.length}")
|
Log.d(TAG, " - attachment: type=${att.type}, id=${att.id}, blob.length=${att.blob.length}")
|
||||||
|
android.util.Log.e("REPLY_DEBUG", " - attachment: type=${att.type}, id=${att.id}, blob.length=${att.blob.length}")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Отправляем пакет
|
// Отправляем пакет
|
||||||
ProtocolManager.send(packet)
|
ProtocolManager.send(packet)
|
||||||
Log.d(TAG, "✅ PACKET SENT via ProtocolManager.send()")
|
Log.d(TAG, "✅ PACKET SENT via ProtocolManager.send()")
|
||||||
|
android.util.Log.e("REPLY_DEBUG", "✅ PACKET SENT via ProtocolManager.send()")
|
||||||
|
|
||||||
// 3. 🎯 UI обновление в Main потоке
|
// 3. 🎯 UI обновление в Main потоке
|
||||||
withContext(Dispatchers.Main) {
|
withContext(Dispatchers.Main) {
|
||||||
|
|||||||
Reference in New Issue
Block a user