Browse Source

Render one-line Android invitations and retain full links for copy

master
evgeny 5 days ago
parent
commit
12e09cb0ed
  1. 17
      tools/chatgui-android/app/src/main/java/com/utun/chat/ui/components/MessageBubble.kt
  2. 1
      tools/chatgui/src/messagedelegate.h

17
tools/chatgui-android/app/src/main/java/com/utun/chat/ui/components/MessageBubble.kt

@ -15,6 +15,8 @@ import androidx.compose.foundation.Canvas
import androidx.compose.foundation.Image
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.combinedClickable
import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.foundation.shape.RoundedCornerShape
@ -41,11 +43,13 @@ import androidx.compose.foundation.gestures.awaitFirstDown
import androidx.compose.foundation.gestures.detectTapGestures
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.platform.LocalConfiguration
import androidx.compose.ui.platform.LocalClipboardManager
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.platform.LocalFocusManager
import androidx.compose.ui.platform.LocalSoftwareKeyboardController
import androidx.compose.ui.text.TextRange
import androidx.compose.ui.text.AnnotatedString
import androidx.compose.ui.text.input.TextFieldValue
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextOverflow
@ -95,6 +99,7 @@ private fun detectEmojiOnly(text: String): Int {
private fun deliveryLabel(message: Message): String =
if (message.deliveryStatusRes == 0) "" else stringResource(message.deliveryStatusRes)
@OptIn(ExperimentalFoundationApi::class)
@Composable
fun MessageBubble(message: Message, playbackState: ChatViewModel.PlaybackState = ChatViewModel.PlaybackState(),
onPlayVoice: (String, Int) -> Unit = { _, _ -> },
@ -154,6 +159,18 @@ fun MessageBubble(message: Message, playbackState: ChatViewModel.PlaybackState =
Spacer(Modifier.height(2.dp))
when {
message.inviteGroupName != null -> {
val clipboard = LocalClipboardManager.current
Text(stringResource(R.string.group_invitation, message.inviteGroupName), fontSize = 17.sp, color = textColor)
Text(message.text, fontSize = 17.sp, color = Color(0xFF3390EC), maxLines = 1, overflow = TextOverflow.Ellipsis,
modifier = Modifier.fillMaxWidth().combinedClickable(
onClick = { onInviteLink(message.text) },
onLongClickLabel = stringResource(R.string.copy_link),
onLongClick = {
clipboard.setText(AnnotatedString(message.text))
LogManager.addLog("DEBUG", "PM", "invitation link copied: seq=${message.id} bytes=${message.text.length}")
}))
}
isVoice -> VoiceBubble(message, textColor, isActive, playbackState, onPlayVoice, onSeekVoice, onDownloadFile)
isVideo -> VideoBubble(message, textColor, onDownloadFile, onPlayVideo)
isImage -> ImageBubble(message, textColor, onDownloadFile, onOpenImage)

1
tools/chatgui/src/messagedelegate.h

@ -43,6 +43,7 @@ enum MessageDataRole {
MsgVideoHeightRole = Qt::UserRole + 34,
MsgVideoDurationMsRole = Qt::UserRole + 35,
MsgDeliveryStateRole = Qt::UserRole + 36,
MsgInviteLinkRole = Qt::UserRole + 37, /* полная ссылка; MsgTextRole содержит локализованный заголовок и ссылку */
};
class MessageDelegate : public QStyledItemDelegate {

Loading…
Cancel
Save