Skip to content

Commit

Permalink
feat: add extra info for users without avatars in missing places (WPB…
Browse files Browse the repository at this point in the history
…-1750) (#3403)
  • Loading branch information
yamilmedina authored Aug 30, 2024
1 parent 74c545c commit 1e6d17c
Show file tree
Hide file tree
Showing 38 changed files with 435 additions and 185 deletions.
10 changes: 7 additions & 3 deletions app/src/main/kotlin/com/wire/android/mapper/ContactMapper.kt
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
package com.wire.android.mapper

import com.wire.android.model.ImageAsset
import com.wire.android.model.NameBasedAvatar
import com.wire.android.model.UserAvatarData
import com.wire.android.ui.home.conversationslist.model.Membership
import com.wire.android.ui.home.newconversation.model.Contact
Expand Down Expand Up @@ -47,7 +48,8 @@ class ContactMapper
label = UsernameMapper.fromOtherUser(otherUser),
avatarData = UserAvatarData(
asset = previewPicture?.let { ImageAsset.UserAvatarAsset(wireSessionImageLoader, it) },
connectionState = connectionStatus
connectionState = connectionStatus,
nameBasedAvatar = NameBasedAvatar(fullName = name, accentColor = otherUser.accentId)
),
membership = userTypeMapper.toMembership(userType),
connectionState = otherUser.connectionStatus
Expand All @@ -63,7 +65,8 @@ class ContactMapper
name = name,
label = String.EMPTY,
avatarData = UserAvatarData(
asset = previewAssetId?.let { ImageAsset.UserAvatarAsset(wireSessionImageLoader, it) }
asset = previewAssetId?.let { ImageAsset.UserAvatarAsset(wireSessionImageLoader, it) },
membership = Membership.Service
),
membership = Membership.Service,
connectionState = ConnectionState.ACCEPTED
Expand All @@ -79,7 +82,8 @@ class ContactMapper
name = name ?: String.EMPTY,
label = mapUserHandle(user),
avatarData = UserAvatarData(
asset = previewAssetId?.let { ImageAsset.UserAvatarAsset(wireSessionImageLoader, it) }
asset = previewAssetId?.let { ImageAsset.UserAvatarAsset(wireSessionImageLoader, it) },
nameBasedAvatar = NameBasedAvatar(fullName = name, accentColor = -1)
),
membership = userTypeMapper.toMembership(type),
connectionState = connectionStatus
Expand Down
5 changes: 4 additions & 1 deletion app/src/main/kotlin/com/wire/android/mapper/MessageMapper.kt
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
package com.wire.android.mapper

import com.wire.android.R
import com.wire.android.model.NameBasedAvatar
import com.wire.android.model.UserAvatarData
import com.wire.android.ui.home.conversations.findUser
import com.wire.android.ui.home.conversations.model.ExpirationStatus
Expand Down Expand Up @@ -201,7 +202,9 @@ class MessageMapper @Inject constructor(
private fun getUserAvatarData(sender: User?) = UserAvatarData(
asset = sender?.previewAsset(wireSessionImageLoader),
availabilityStatus = sender?.availabilityStatus ?: UserAvailabilityStatus.NONE,
connectionState = getConnectionState(sender)
membership = sender?.userType?.let { userTypeMapper.toMembership(it) } ?: Membership.None,
connectionState = getConnectionState(sender),
nameBasedAvatar = NameBasedAvatar(sender?.name, sender?.accentId ?: -1)
)

private fun getConnectionState(sender: User?) =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ class UICallParticipantMapper @Inject constructor(
isSharingScreen = participant.isSharingScreen,
avatar = participant.avatarAssetId?.let { ImageAsset.UserAvatarAsset(wireSessionImageLoader, it) },
membership = userTypeMapper.toMembership(participant.userType),
hasEstablishedAudio = participant.hasEstablishedAudio
hasEstablishedAudio = participant.hasEstablishedAudio,
accentId = participant.accentId
)
}
31 changes: 29 additions & 2 deletions app/src/main/kotlin/com/wire/android/model/UserAvatarData.kt
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ package com.wire.android.model

import androidx.compose.runtime.Stable
import com.wire.android.ui.home.conversationslist.model.Membership
import com.wire.android.util.EMPTY
import com.wire.kalium.logic.data.user.ConnectionState
import com.wire.kalium.logic.data.user.UserAvailabilityStatus

Expand All @@ -28,5 +29,31 @@ data class UserAvatarData(
val asset: ImageAsset.UserAvatarAsset? = null,
val availabilityStatus: UserAvailabilityStatus = UserAvailabilityStatus.NONE,
val connectionState: ConnectionState? = null,
val membership: Membership = Membership.None
)
val membership: Membership = Membership.None,
val nameBasedAvatar: NameBasedAvatar? = null
) {

fun shouldPreferNameBasedAvatar(): Boolean {
return asset == null && nameBasedAvatar != null &&
nameBasedAvatar.initials.isEmpty().not() && membership != Membership.Service
}
}

/**
* Holder that can be used to generate an avatar based on the user's full name initials and accent color.
*/
data class NameBasedAvatar(val fullName: String?, val accentColor: Int) {
val initials: String
get() {
if (fullName.isNullOrEmpty()) return String.EMPTY
val names = fullName.split(" ").map { it.uppercase() }
return when {
names.size > 1 -> {
val initials = names.map { it.first() }
initials.first().toString() + initials.last()
}

else -> names.first().take(2)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ data class CallState(
val conversationId: ConversationId,
val conversationName: ConversationName? = null,
val callerName: String? = null,
val accentId: Int = -1,
val callStatus: CallStatus = CallStatus.CLOSED,
val avatarAssetId: UserAvatarAsset? = null,
val participants: List<UICallParticipant> = listOf(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -145,7 +145,8 @@ class SharedCallingViewModel @AssistedInject constructor(
membership = userTypeMapper.toMembership(details.otherUser.userType),
protocolInfo = details.conversation.protocol,
mlsVerificationStatus = details.conversation.mlsVerificationStatus,
proteusVerificationStatus = details.conversation.proteusVerificationStatus
proteusVerificationStatus = details.conversation.proteusVerificationStatus,
accentId = details.otherUser.accentId
)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,9 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.rotate
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import com.wire.android.R
import com.wire.android.model.ImageAsset
import com.wire.android.model.NameBasedAvatar
import com.wire.android.model.UserAvatarData
import com.wire.android.ui.calling.ConversationName
import com.wire.android.ui.common.ConversationVerificationIcons
Expand All @@ -47,8 +47,10 @@ import com.wire.android.ui.common.dimensions
import com.wire.android.ui.common.spacers.VerticalSpace
import com.wire.android.ui.home.conversationslist.model.Membership
import com.wire.android.ui.home.conversationslist.model.hasLabel
import com.wire.android.ui.theme.WireTheme
import com.wire.android.ui.theme.wireTypography
import com.wire.android.util.EMPTY
import com.wire.android.util.ui.PreviewMultipleThemes
import com.wire.kalium.logic.data.call.ConversationTypeForCall
import com.wire.kalium.logic.data.conversation.Conversation
import com.wire.kalium.logic.data.id.ConversationId
Expand All @@ -58,6 +60,7 @@ import java.util.Locale
fun CallerDetails(
conversationId: ConversationId,
conversationName: ConversationName?,
accentId: Int,
isCameraOn: Boolean,
isCbrEnabled: Boolean,
avatarAssetId: ImageAsset.UserAvatarAsset?,
Expand All @@ -70,7 +73,9 @@ fun CallerDetails(
onMinimiseScreen: () -> Unit
) {
Column(
modifier = Modifier.fillMaxSize().padding(top = dimensions().spacing32x),
modifier = Modifier
.fillMaxSize()
.padding(top = dimensions().spacing32x),
verticalArrangement = Arrangement.Top,
horizontalAlignment = Alignment.CenterHorizontally
) {
Expand Down Expand Up @@ -132,29 +137,35 @@ fun CallerDetails(

if (!isCameraOn && conversationTypeForCall == ConversationTypeForCall.OneOnOne) {
UserProfileAvatar(
avatarData = UserAvatarData(avatarAssetId),
avatarData = UserAvatarData(
asset = avatarAssetId,
nameBasedAvatar = NameBasedAvatar((conversationName as? ConversationName.Known)?.name, accentId)
),
size = dimensions().outgoingCallUserAvatarSize,
modifier = Modifier.padding(top = dimensions().spacing16x)
)
}
}
}

@Preview(showBackground = true)
@PreviewMultipleThemes
@Composable
fun PreviewCallerDetails() {
CallerDetails(
conversationId = ConversationId("value", "domain"),
conversationName = ConversationName.Known("User"),
isCameraOn = false,
isCbrEnabled = false,
avatarAssetId = null,
conversationTypeForCall = ConversationTypeForCall.OneOnOne,
membership = Membership.Guest,
callingLabel = String.EMPTY,
protocolInfo = null,
mlsVerificationStatus = null,
proteusVerificationStatus = Conversation.VerificationStatus.VERIFIED,
onMinimiseScreen = { }
)
WireTheme {
CallerDetails(
conversationId = ConversationId("value", "domain"),
conversationName = ConversationName.Known("Jon Doe"),
isCameraOn = false,
isCbrEnabled = false,
avatarAssetId = null,
conversationTypeForCall = ConversationTypeForCall.OneOnOne,
membership = Membership.Guest,
callingLabel = String.EMPTY,
protocolInfo = null,
mlsVerificationStatus = null,
proteusVerificationStatus = Conversation.VerificationStatus.VERIFIED,
onMinimiseScreen = { },
accentId = -1
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -262,7 +262,8 @@ private fun IncomingCallContent(
protocolInfo = callState.protocolInfo,
mlsVerificationStatus = callState.mlsVerificationStatus,
proteusVerificationStatus = callState.proteusVerificationStatus,
onMinimiseScreen = onMinimiseScreen
onMinimiseScreen = onMinimiseScreen,
accentId = callState.accentId
)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,5 +32,6 @@ data class UICallParticipant(
val isSharingScreen: Boolean,
val avatar: ImageAsset.UserAvatarAsset? = null,
val membership: Membership,
val hasEstablishedAudio: Boolean
val hasEstablishedAudio: Boolean,
val accentId: Int
)
Original file line number Diff line number Diff line change
Expand Up @@ -521,6 +521,7 @@ fun buildPreviewParticipantsList(count: Int = 10) = buildList {
isSharingScreen = false,
avatar = null,
membership = Membership.Admin,
accentId = -1
)
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ import androidx.lifecycle.LifecycleOwner
import com.waz.avs.CameraPreviewBuilder
import com.waz.avs.VideoRenderer
import com.wire.android.R
import com.wire.android.model.NameBasedAvatar
import com.wire.android.model.UserAvatarData
import com.wire.android.ui.calling.model.UICallParticipant
import com.wire.android.ui.common.UserProfileAvatar
Expand Down Expand Up @@ -119,7 +120,10 @@ fun ParticipantTile(
width = Dimension.fillToConstraints.atMost(maxAvatarSize)
height = Dimension.fillToConstraints.atMost(maxAvatarSize + activeSpeakerBorderPadding)
},
avatar = UserAvatarData(participantTitleState.avatar),
avatar = UserAvatarData(
asset = participantTitleState.avatar,
nameBasedAvatar = NameBasedAvatar(participantTitleState.name, participantTitleState.accentId)
),
)

if (isSelfUser) {
Expand All @@ -144,7 +148,8 @@ fun ParticipantTile(
isSelfUser = isSelfUser,
isSelfUserMuted = isSelfUserMuted,
modifier = Modifier
.padding( // move by the size of the active speaker border
.padding(
// move by the size of the active speaker border
start = dimensions().spacing6x,
end = dimensions().spacing6x,
bottom = dimensions().spacing6x,
Expand Down Expand Up @@ -452,6 +457,7 @@ private fun PreviewParticipantTile(
avatar = null,
membership = Membership.Admin,
hasEstablishedAudio = hasEstablishedAudio,
accentId = -1
),
onClearSelfUserVideoPreview = {},
onSelfUserVideoPreviewCreated = {},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -181,7 +181,8 @@ private fun OutgoingCallContent(
protocolInfo = callState.protocolInfo,
mlsVerificationStatus = callState.mlsVerificationStatus,
proteusVerificationStatus = callState.proteusVerificationStatus,
onMinimiseScreen = onMinimiseScreen
onMinimiseScreen = onMinimiseScreen,
accentId = callState.accentId
)
}
}
Expand Down
Loading

0 comments on commit 1e6d17c

Please sign in to comment.