Support incoming audio only calls

This commit is contained in:
Valere 2026-03-04 08:56:33 +01:00
parent 5491040ac5
commit 7ef43abd57
22 changed files with 156 additions and 53 deletions

View file

@ -18,6 +18,9 @@ import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import io.element.android.compound.tokens.generated.CompoundIcons
import io.element.android.libraries.designsystem.components.button.MainActionButton
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
import io.element.android.libraries.matrix.api.notification.CallIntent
import io.element.android.libraries.ui.strings.CommonStrings
@Composable
@ -26,11 +29,13 @@ fun UserProfileMainActionsSection(
canCall: Boolean,
onShareUser: () -> Unit,
onStartDM: () -> Unit,
onCall: () -> Unit,
onCall: (CallIntent) -> Unit,
modifier: Modifier = Modifier
) {
Row(
modifier.fillMaxWidth().padding(horizontal = 16.dp),
modifier
.fillMaxWidth()
.padding(horizontal = 16.dp),
horizontalArrangement = Arrangement.SpaceEvenly,
) {
if (!isCurrentUser) {
@ -43,8 +48,14 @@ fun UserProfileMainActionsSection(
if (canCall) {
MainActionButton(
title = stringResource(CommonStrings.action_call),
imageVector = CompoundIcons.VoiceCall(),
onClick = { onCall(CallIntent.AUDIO) },
)
MainActionButton(
title = stringResource(CommonStrings.common_video),
imageVector = CompoundIcons.VideoCall(),
onClick = onCall,
onClick = { onCall(CallIntent.VIDEO) },
)
}
MainActionButton(
@ -54,3 +65,15 @@ fun UserProfileMainActionsSection(
)
}
}
@PreviewsDayNight()
@Composable
internal fun UserProfileMainActionsSectionPreview() = ElementPreview {
UserProfileMainActionsSection(
isCurrentUser = false,
canCall = true,
onShareUser = { },
onStartDM = { },
onCall = { }
)
}

View file

@ -14,6 +14,7 @@ import io.element.android.libraries.androidutils.system.startSharePlainTextInten
import io.element.android.libraries.architecture.NodeInputs
import io.element.android.libraries.matrix.api.core.RoomId
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.permalink.PermalinkBuilder
import io.element.android.libraries.ui.strings.CommonStrings
import timber.log.Timber
@ -24,7 +25,7 @@ class UserProfileNodeHelper(
interface Callback : NodeInputs {
fun navigateToAvatarPreview(username: String, avatarUrl: String)
fun navigateToRoom(roomId: RoomId)
fun startCall(dmRoomId: RoomId)
fun startCall(dmRoomId: RoomId, callIntent: CallIntent)
fun startVerifyUserFlow(userId: UserId)
}

View file

@ -43,6 +43,7 @@ import io.element.android.libraries.designsystem.utils.snackbar.SnackbarHost
import io.element.android.libraries.designsystem.utils.snackbar.rememberSnackbarHostState
import io.element.android.libraries.matrix.api.core.RoomId
import io.element.android.libraries.matrix.api.core.UserId
import io.element.android.libraries.matrix.api.notification.CallIntent
import io.element.android.libraries.matrix.ui.components.CreateDmConfirmationBottomSheet
import io.element.android.libraries.ui.strings.CommonStrings
@ -52,7 +53,7 @@ fun UserProfileView(
state: UserProfileState,
onShareUser: () -> Unit,
onOpenDm: (RoomId) -> Unit,
onStartCall: (RoomId) -> Unit,
onStartCall: (RoomId, CallIntent) -> Unit,
goBack: () -> Unit,
openAvatarPreview: (username: String, url: String) -> Unit,
onVerifyClick: (UserId) -> Unit,
@ -90,7 +91,7 @@ fun UserProfileView(
canCall = state.canCall,
onShareUser = onShareUser,
onStartDM = { state.eventSink(UserProfileEvents.StartDM) },
onCall = { state.dmRoomId?.let { onStartCall(it) } }
onCall = { intent -> state.dmRoomId?.let { onStartCall(it, intent) } }
)
Spacer(modifier = Modifier.height(26.dp))
if (!state.isCurrentUser) {
@ -151,7 +152,7 @@ internal fun UserProfileViewPreview(
onShareUser = {},
goBack = {},
onOpenDm = {},
onStartCall = {},
onStartCall = { _, _ -> },
openAvatarPreview = { _, _ -> },
onVerifyClick = {},
)