cleaning: Remove join button from call notify timelineItemView

This commit is contained in:
Valere 2026-04-16 16:35:28 +02:00
parent d8c540956a
commit 3f9b8b822e
13 changed files with 43 additions and 48 deletions

View file

@ -282,7 +282,6 @@ fun MessagesView(
state.eventSink(MessagesEvent.HandleAction(TimelineItemAction.Reply, targetEvent))
},
forceJumpToBottomVisibility = forceJumpToBottomVisibility,
onJoinCallClick = onJoinCallClick,
onViewAllPinnedMessagesClick = onViewAllPinnedMessagesClick,
knockRequestsBannerView = knockRequestsBannerView,
)
@ -460,7 +459,6 @@ private fun MessagesViewContent(
onMessageLongClick: (TimelineItem.Event) -> Unit,
onSendLocationClick: () -> Unit,
onCreatePollClick: () -> Unit,
onJoinCallClick: (isAudioCall: Boolean) -> Unit,
onViewAllPinnedMessagesClick: () -> Unit,
forceJumpToBottomVisibility: Boolean,
onSwipeToReply: (TimelineItem.Event) -> Unit,
@ -517,7 +515,6 @@ private fun MessagesViewContent(
onMoreReactionsClick = onMoreReactionsClick,
onReadReceiptClick = onReadReceiptClick,
forceJumpToBottomVisibility = forceJumpToBottomVisibility,
onJoinCallClick = onJoinCallClick,
nestedScrollConnection = scrollBehavior.nestedScrollConnection,
floatingDateTopOffset = pinnedBannerHeightDp,
)

View file

@ -235,7 +235,6 @@ private fun PinnedMessagesListLoaded(
onMoreReactionsClick = {},
onReadReceiptClick = {},
onSwipeToReply = {},
onJoinCallClick = {},
eventSink = { timelineItemEvent ->
when (timelineItemEvent) {
is TimelineEvent.OpenThread -> state.eventSink(PinnedMessagesListEvent.OpenThread(timelineItemEvent.threadRootEventId))

View file

@ -102,7 +102,6 @@ fun TimelineView(
onReactionLongClick: (emoji: String, TimelineItem.Event) -> Unit,
onMoreReactionsClick: (TimelineItem.Event) -> Unit,
onReadReceiptClick: (TimelineItem.Event) -> Unit,
onJoinCallClick: (isAudioCall: Boolean) -> Unit,
modifier: Modifier = Modifier,
lazyListState: LazyListState = rememberLazyListState(),
forceJumpToBottomVisibility: Boolean = false,
@ -186,7 +185,6 @@ fun TimelineView(
onMoreReactionsClick = onMoreReactionsClick,
onReadReceiptClick = onReadReceiptClick,
onSwipeToReply = onSwipeToReply,
onJoinCallClick = onJoinCallClick,
eventSink = state.eventSink,
)
}
@ -425,7 +423,6 @@ internal fun TimelineViewPreview(
onReactionLongClick = { _, _ -> },
onMoreReactionsClick = {},
onReadReceiptClick = {},
onJoinCallClick = {},
forceJumpToBottomVisibility = true,
)
}

View file

@ -49,7 +49,6 @@ internal fun TimelineViewMessageShieldPreview() = ElementPreview {
onReactionLongClick = { _, _ -> },
onMoreReactionsClick = {},
onReadReceiptClick = {},
onJoinCallClick = {},
forceJumpToBottomVisibility = true,
)
}

View file

@ -31,24 +31,22 @@ import io.element.android.compound.tokens.generated.CompoundIcons
import io.element.android.features.messages.impl.timeline.aTimelineItemEvent
import io.element.android.features.messages.impl.timeline.model.TimelineItem
import io.element.android.features.messages.impl.timeline.model.event.TimelineItemRtcNotificationContent
import io.element.android.features.roomcall.api.RoomCallState
import io.element.android.features.roomcall.api.RoomCallStateProvider
import io.element.android.libraries.designsystem.components.avatar.Avatar
import io.element.android.libraries.designsystem.components.avatar.AvatarType
import io.element.android.libraries.designsystem.modifiers.onKeyboardContextMenuAction
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
import io.element.android.libraries.designsystem.text.toDp
import io.element.android.libraries.matrix.api.notification.CallIntent
import io.element.android.libraries.ui.strings.CommonStrings
@Composable
internal fun TimelineItemCallNotifyView(
event: TimelineItem.Event,
roomCallState: RoomCallState,
onLongClick: (TimelineItem.Event) -> Unit,
onJoinCallClick: (isAudioCall: Boolean) -> Unit,
modifier: Modifier = Modifier
) {
val intent = (event.content as? TimelineItemRtcNotificationContent)?.callIntent
Row(
modifier = modifier
.fillMaxWidth()
@ -81,7 +79,8 @@ internal fun TimelineItemCallNotifyView(
) {
Icon(
modifier = Modifier.size(20.sp.toDp()),
imageVector = CompoundIcons.VideoCallSolid(),
imageVector =
if (intent == CallIntent.AUDIO) CompoundIcons.VoiceCallSolid() else CompoundIcons.VideoCallSolid(),
contentDescription = null,
tint = ElementTheme.colors.iconSecondary,
)
@ -94,20 +93,13 @@ internal fun TimelineItemCallNotifyView(
)
}
}
if (roomCallState is RoomCallState.OnGoing) {
CallMenuItem(
roomCallState = roomCallState,
onJoinCallClick = onJoinCallClick,
)
} else {
Text(
text = event.sentTime,
style = ElementTheme.typography.fontBodyMdRegular,
color = ElementTheme.colors.textSecondary,
maxLines = 1,
overflow = TextOverflow.Ellipsis,
)
}
Text(
text = event.sentTime,
style = ElementTheme.typography.fontBodyMdRegular,
color = ElementTheme.colors.textSecondary,
maxLines = 1,
overflow = TextOverflow.Ellipsis,
)
}
}
@ -115,16 +107,15 @@ internal fun TimelineItemCallNotifyView(
@Composable
internal fun TimelineItemCallNotifyViewPreview() = ElementPreview {
Column(modifier = Modifier.padding(16.dp), verticalArrangement = Arrangement.spacedBy(16.dp)) {
RoomCallStateProvider()
.values
.filter { it !is RoomCallState.Unavailable }
.forEach { roomCallState ->
TimelineItemCallNotifyView(
event = aTimelineItemEvent(content = TimelineItemRtcNotificationContent()),
roomCallState = roomCallState,
onLongClick = {},
onJoinCallClick = {},
)
}
listOf(
aTimelineItemEvent(content = TimelineItemRtcNotificationContent(null)),
aTimelineItemEvent(content = TimelineItemRtcNotificationContent(CallIntent.AUDIO)),
aTimelineItemEvent(content = TimelineItemRtcNotificationContent(CallIntent.VIDEO)),
).forEach { event ->
TimelineItemCallNotifyView(
event = event,
onLongClick = {},
)
}
}
}

View file

@ -188,7 +188,6 @@ private fun TimelineItemGroupedEventsRowContent(
onMoreReactionsClick = onMoreReactionsClick,
onReadReceiptClick = onReadReceiptClick,
onSwipeToReply = {},
onJoinCallClick = {},
eventSink = eventSink,
eventContentView = eventContentView,
)

View file

@ -72,7 +72,6 @@ internal fun TimelineItemRow(
onMoreReactionsClick: (TimelineItem.Event) -> Unit,
onReadReceiptClick: (TimelineItem.Event) -> Unit,
onSwipeToReply: (TimelineItem.Event) -> Unit,
onJoinCallClick: (isAudioCall: Boolean) -> Unit,
eventSink: (TimelineEvent.TimelineItemEvent) -> Unit,
modifier: Modifier = Modifier,
eventContentView: @Composable (TimelineItem.Event, Modifier, (ContentAvoidingLayoutData) -> Unit) -> Unit =
@ -127,9 +126,7 @@ internal fun TimelineItemRow(
TimelineItemCallNotifyView(
modifier = Modifier.padding(start = 16.dp, end = 16.dp, top = 16.dp),
event = timelineItem,
roomCallState = timelineRoomInfo.roomCallState,
onLongClick = onLongClick,
onJoinCallClick = onJoinCallClick,
)
}
else -> {

View file

@ -97,7 +97,9 @@ class TimelineItemContentFactory(
is StickerContent -> stickerFactory.create(itemContent)
is PollContent -> pollFactory.create(eventId, isEditable, isOutgoing, itemContent)
is UnableToDecryptContent -> utdFactory.create(itemContent)
is CallNotifyContent -> TimelineItemRtcNotificationContent()
is CallNotifyContent -> TimelineItemRtcNotificationContent(
itemContent.callIntent
)
is UnknownContent -> TimelineItemUnknownContent
is LiveLocationContent -> {
val lastKnownLocation = itemContent.locations.mapNotNull { beacon ->

View file

@ -90,7 +90,7 @@ internal fun MatrixTimelineItem.Event.canBeDisplayedInBubbleBlock(): Boolean {
is RoomMembershipContent,
UnknownContent,
is LegacyCallInviteContent,
CallNotifyContent,
is CallNotifyContent,
is StateContent -> false
}
}

View file

@ -8,6 +8,8 @@
package io.element.android.features.messages.impl.timeline.model.event
class TimelineItemRtcNotificationContent : TimelineItemEventContent {
import io.element.android.libraries.matrix.api.notification.CallIntent
class TimelineItemRtcNotificationContent(val callIntent: CallIntent?) : TimelineItemEventContent {
override val type: String = "org.matrix.msc4075.rtc.notification"
}

View file

@ -12,6 +12,7 @@ import androidx.compose.runtime.Immutable
import io.element.android.libraries.matrix.api.core.UserId
import io.element.android.libraries.matrix.api.media.ImageInfo
import io.element.android.libraries.matrix.api.media.MediaSource
import io.element.android.libraries.matrix.api.notification.CallIntent
import io.element.android.libraries.matrix.api.poll.PollAnswer
import io.element.android.libraries.matrix.api.poll.PollKind
import io.element.android.libraries.matrix.api.room.location.AssetType
@ -115,6 +116,8 @@ data class LiveLocationContent(
data object LegacyCallInviteContent : EventContent
data object CallNotifyContent : EventContent
data class CallNotifyContent(
val callIntent: CallIntent?
) : EventContent
data object UnknownContent : EventContent

View file

@ -11,6 +11,7 @@ package io.element.android.libraries.matrix.impl.timeline.item.event
import io.element.android.libraries.architecture.AsyncData
import io.element.android.libraries.matrix.api.core.ThreadId
import io.element.android.libraries.matrix.api.core.UserId
import io.element.android.libraries.matrix.api.notification.CallIntent
import io.element.android.libraries.matrix.api.timeline.item.EmbeddedEventInfo
import io.element.android.libraries.matrix.api.timeline.item.EventThreadInfo
import io.element.android.libraries.matrix.api.timeline.item.ThreadSummary
@ -137,7 +138,15 @@ class TimelineEventContentMapper(
)
}
is TimelineItemContent.CallInvite -> LegacyCallInviteContent
is TimelineItemContent.RtcNotification -> CallNotifyContent
is TimelineItemContent.RtcNotification -> CallNotifyContent(
it.callIntent?.let { intentString ->
if (intentString == "audio") {
CallIntent.AUDIO
} else {
CallIntent.VIDEO
}
}
)
}
}
}

View file

@ -65,7 +65,7 @@ class EventItemFactory(
mode = DateFormatterMode.Full,
)
return when (val content = event.content) {
CallNotifyContent,
is CallNotifyContent,
is FailedToParseMessageLikeContent,
is FailedToParseStateContent,
LegacyCallInviteContent,