adapt avatar size to box size

..by using a BoxWithConstraints

Signed-off-by: Marcel Hibbe <dev@mhibbe.de>
This commit is contained in:
Marcel Hibbe 2025-05-13 17:15:58 +02:00
parent 6a048fde08
commit 31433f8ed9
No known key found for this signature in database
GPG Key ID: C793F8B59F43CE7B
2 changed files with 54 additions and 52 deletions

View File

@ -99,7 +99,6 @@ fun ParticipantGrid(
.height(itemHeight) .height(itemHeight)
.fillMaxWidth(), .fillMaxWidth(),
eglBase = eglBase, eglBase = eglBase,
isInPipMode = isInPipMode,
isVoiceOnlyCall = isVoiceOnlyCall isVoiceOnlyCall = isVoiceOnlyCall
) )
} }
@ -278,9 +277,9 @@ fun getTestParticipants(numberOfParticipants: Int): List<ParticipantUiState> {
for (i: Int in 1..numberOfParticipants) { for (i: Int in 1..numberOfParticipants) {
val participant = ParticipantUiState( val participant = ParticipantUiState(
sessionKey = i.toString(), sessionKey = i.toString(),
nick = "testuser$i Test", nick = "test$i user",
isConnected = true, isConnected = true,
isAudioEnabled = true, isAudioEnabled = false,
isStreamEnabled = true, isStreamEnabled = true,
raisedHand = true, raisedHand = true,
avatarUrl = "", avatarUrl = "",

View File

@ -9,6 +9,8 @@ package com.nextcloud.talk.call.components
import androidx.compose.foundation.background import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.BoxWithConstraints
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
@ -28,6 +30,7 @@ import androidx.compose.ui.graphics.Shadow
import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.painterResource
import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.min
import com.nextcloud.talk.R import com.nextcloud.talk.R
import com.nextcloud.talk.adapters.ParticipantUiState import com.nextcloud.talk.adapters.ParticipantUiState
import com.nextcloud.talk.utils.ColorGenerator import com.nextcloud.talk.utils.ColorGenerator
@ -35,40 +38,41 @@ import org.webrtc.EglBase
const val NICK_OFFSET = 4f const val NICK_OFFSET = 4f
const val NICK_BLUR_RADIUS = 4f const val NICK_BLUR_RADIUS = 4f
const val AVATAR_SIZE_FACTOR = 0.6f
@Suppress("Detekt.LongMethod") @Suppress("Detekt.LongMethod")
@Composable @Composable
fun ParticipantTile( fun ParticipantTile(
participantUiState: ParticipantUiState, participantUiState: ParticipantUiState,
eglBase: EglBase?, eglBase: EglBase?,
isInPipMode: Boolean,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
isVoiceOnlyCall: Boolean isVoiceOnlyCall: Boolean
) { ) {
val colorInt = ColorGenerator.shared.usernameToColor(participantUiState.nick) val colorInt = ColorGenerator.shared.usernameToColor(participantUiState.nick)
Box( BoxWithConstraints(
modifier = modifier modifier = modifier
.clip(RoundedCornerShape(12.dp)) .clip(RoundedCornerShape(12.dp))
.background(Color(colorInt)) .background(Color(colorInt))
) { ) {
val avatarSize = min(maxWidth, maxHeight) * AVATAR_SIZE_FACTOR
if (!isVoiceOnlyCall && participantUiState.isStreamEnabled && participantUiState.mediaStream != null) { if (!isVoiceOnlyCall && participantUiState.isStreamEnabled && participantUiState.mediaStream != null) {
WebRTCVideoView(participantUiState, eglBase) WebRTCVideoView(participantUiState, eglBase)
} else { } else {
val avatarSize = if (isInPipMode) {
100.dp
} else {
150.dp
}
AvatarWithFallback( AvatarWithFallback(
participant = participantUiState, participant = participantUiState,
modifier = Modifier modifier = Modifier
.align(Alignment.Center)
.size(avatarSize) .size(avatarSize)
.align(Alignment.Center)
) )
} }
Box(
modifier = Modifier
.fillMaxSize()
.padding(8.dp)
) {
if (participantUiState.raisedHand) { if (participantUiState.raisedHand) {
Icon( Icon(
painter = painterResource(id = R.drawable.ic_hand_back_left), painter = painterResource(id = R.drawable.ic_hand_back_left),
@ -97,8 +101,7 @@ fun ParticipantTile(
text = participantUiState.nick, text = participantUiState.nick,
color = Color.White, color = Color.White,
modifier = Modifier modifier = Modifier
.align(Alignment.BottomStart) .align(Alignment.BottomStart),
.padding(10.dp),
style = MaterialTheme.typography.bodyMedium.copy( style = MaterialTheme.typography.bodyMedium.copy(
shadow = Shadow( shadow = Shadow(
color = Color.Black, color = Color.Black,
@ -114,6 +117,7 @@ fun ParticipantTile(
) )
} }
} }
}
} }
@Preview(showBackground = false) @Preview(showBackground = false)
@ -135,7 +139,6 @@ fun ParticipantTilePreview() {
.fillMaxWidth() .fillMaxWidth()
.height(300.dp), .height(300.dp),
eglBase = null, eglBase = null,
isInPipMode = false,
isVoiceOnlyCall = false isVoiceOnlyCall = false
) )
} }