From 261ee6379aabb6974a5a2b716d78216a87994b71 Mon Sep 17 00:00:00 2001 From: M57 <41645758+Hy4ri@users.noreply.github.com> Date: Sat, 20 Jun 2026 02:37:55 +0300 Subject: [PATCH] feat(#132): dynamic session title with ellipsis truncation (#139) Co-authored-by: ronia --- .../java/com/m57/hermescontrol/ui/chat/ChatScreen.kt | 7 +++++-- .../com/m57/hermescontrol/ui/chat/ChatViewModel.kt | 10 +++++++++- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/m57/hermescontrol/ui/chat/ChatScreen.kt b/app/src/main/java/com/m57/hermescontrol/ui/chat/ChatScreen.kt index 587d2478..04e22d10 100644 --- a/app/src/main/java/com/m57/hermescontrol/ui/chat/ChatScreen.kt +++ b/app/src/main/java/com/m57/hermescontrol/ui/chat/ChatScreen.kt @@ -86,6 +86,7 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.testTag import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.input.ImeAction +import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.core.content.ContextCompat @@ -212,11 +213,13 @@ fun ChatScreen( title = { Row(verticalAlignment = Alignment.CenterVertically) { Text( - text = "Hermes", + text = state.chatTitle, style = - MaterialTheme.typography.titleLarge.copy( + MaterialTheme.typography.titleMedium.copy( fontWeight = FontWeight.Bold, ), + maxLines = 1, + overflow = TextOverflow.Ellipsis, ) // Connection status dot — red when offline, hidden when connected if (!state.isConnected) { diff --git a/app/src/main/java/com/m57/hermescontrol/ui/chat/ChatViewModel.kt b/app/src/main/java/com/m57/hermescontrol/ui/chat/ChatViewModel.kt index 5b896d26..27279562 100644 --- a/app/src/main/java/com/m57/hermescontrol/ui/chat/ChatViewModel.kt +++ b/app/src/main/java/com/m57/hermescontrol/ui/chat/ChatViewModel.kt @@ -27,6 +27,7 @@ data class ChatUiState( val messages: List = emptyList(), val currentSessionId: String? = null, val sessions: List = emptyList(), + val chatTitle: String = "Hermes", val isConnected: Boolean = false, val isAgentTyping: Boolean = false, val isThinking: Boolean = false, @@ -316,7 +317,10 @@ class ChatViewModel( messageCount = (s["message_count"] as? Double)?.toInt() ?: 0, ) } - _uiState.update { it.copy(sessions = sessions) } + _uiState.update { state -> + val title = sessions.find { s -> s.id == state.currentSessionId }?.title ?: "Hermes" + state.copy(sessions = sessions, chatTitle = title) + } } WsMethods.SESSION_RESUME -> { @@ -331,9 +335,11 @@ class ChatViewModel( // overwrite any message the user sent between switchSession() and // the server ack, making the chat appear to go blank. _uiState.update { + val title = it.sessions.find { s -> s.id == sessionId }?.title ?: "Hermes" it.copy( isLoading = false, currentSessionId = sessionId, + chatTitle = title, ) } addSystemMessage("Session resumed") @@ -574,10 +580,12 @@ class ChatViewModel( fun switchSession(sessionId: String) { if (sessionId == _uiState.value.currentSessionId) return _uiState.update { + val title = it.sessions.find { s -> s.id == sessionId }?.title ?: "Hermes" it.copy( isLoading = true, messages = emptyList(), currentSessionId = sessionId, + chatTitle = title, showSessionPicker = false, isAgentTyping = false, isThinking = false,