Skip to content

Commit 8b4051d

Browse files
mahibiclaude
andcommitted
fix(chat): avoid ClassCastException when building FileParameters
ChatMessageUi.messageParameters is built via Kotlin's toMap(), which returns a Collections.SingletonMap for a single entry instead of a HashMap. Both call sites unsafely cast it to HashMap<String?, HashMap<String?, String?>>?, which crashes whenever a message has exactly one rich-object parameter (e.g. a plain file share) - the common case for FileParameters. Build real HashMap instances from messageParameters instead of casting it. Also removes a runCatching block in LazyListState.visibleItemsWithThreshold() that silently swallowed the same ClassCastException, which was hiding this bug and causing file id lookups to fail there. fixed crash: ❯ 2026-08-07 12:02:40.777 28629-28629 NextcloudT...pplication com.nextcloud.talk2 E Uncaught exception in thread "main" (Fix with AI) java.lang.ClassCastException: java.util.Collections$SingletonMap cannot be cast to java.util.HashMap at com.nextcloud.talk.ui.chat.MediaMessageKt.MediaMessage(MediaMessage.kt:71) at com.nextcloud.talk.ui.chat.ChatMessageViewKt.ChatMessageView$lambda$5$1(ChatMessageView.kt:151) at com.nextcloud.talk.ui.chat.ChatMessageViewKt.$r8$lambda$BiaHdWRFag7qJIfvY45CugWWbIY(ChatMessageView.kt:0) at com.nextcloud.talk.ui.chat.ChatMessageViewKt$$ExternalSyntheticLambda1.invoke(D8$$SyntheticClass:0) at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.kt:122) at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.kt:52) at com.nextcloud.talk.ui.chat.SwipeToReplyContainerKt.SwipeToReplyContainer(SwipeToReplyContainer.kt:57) at com.nextcloud.talk.ui.chat.ChatMessageViewKt.ChatMessageView$lambda$5(ChatMessageView.kt:114) at com.nextcloud.talk.ui.chat.ChatMessageViewKt$$ExternalSyntheticLambda4.invoke(D8$$SyntheticClass:0) at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.kt:122) at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.kt:52) at androidx.compose.runtime.CompositionLocalKt.CompositionLocalProvider(CompositionLocal.kt:408) at com.nextcloud.talk.ui.chat.ChatMessageViewKt.ChatMessageView(ChatMessageView.kt:105) Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
1 parent 812f400 commit 8b4051d

2 files changed

Lines changed: 12 additions & 11 deletions

File tree

app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1001,16 +1001,11 @@ class ChatActivity :
10011001
var result: String? = null
10021002
message?.let {
10031003
if (message.messageParameters.isNotEmpty()) {
1004-
runCatching {
1005-
message.messageParameters as HashMap<String?, HashMap<String?, String?>>?
1006-
val fileParameters = FileParameters(message.messageParameters)
1007-
result = fileParameters.id
1008-
}.onFailure { e ->
1009-
when (e) {
1010-
is ClassCastException -> {} // weird
1011-
else -> Log.e(TAG, "Error in LazyListState.visibleItemsWithThreshold $e")
1012-
}
1013-
}
1004+
val normalizedParameters = HashMap<String?, HashMap<String?, String?>>(
1005+
message.messageParameters.mapValues { (_, params) -> HashMap(params) }
1006+
)
1007+
val fileParameters = FileParameters(normalizedParameters)
1008+
result = fileParameters.id
10141009
}
10151010
}
10161011

app/src/main/java/com/nextcloud/talk/ui/chat/MediaMessage.kt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,13 @@ fun MediaMessage(
6868
onImageClick: (Int) -> Unit
6969
) {
7070
val fileParameters =
71-
remember { FileParameters(message.messageParameters as HashMap<String?, HashMap<String?, String?>>?) }
71+
remember {
72+
FileParameters(
73+
HashMap(
74+
message.messageParameters.mapValues { (_, params) -> HashMap(params) }
75+
)
76+
)
77+
}
7278

7379
val hasExplicitCaption = message.plainMessage != FILE_PLACEHOLDER_MESSAGE
7480
val hasPreview = !typeContent.previewUrl.isNullOrEmpty()

0 commit comments

Comments
 (0)