Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add extra info for users without avatars in missing places (WPB-1750) #3403

Merged
merged 30 commits into from
Aug 30, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
2468391
feat: wip useers without avatars
yamilmedina Aug 27, 2024
02a6fbf
wip progress for avatars and initials
yamilmedina Aug 27, 2024
a2830bc
chore: merge develop
yamilmedina Aug 27, 2024
92b6b15
wip, users initials handling on avatars
yamilmedina Aug 28, 2024
0a32218
merge develop
yamilmedina Aug 28, 2024
0c154a2
chore: update kalium ref
yamilmedina Aug 28, 2024
7f9d5ac
feat: add new parameters for avatar
yamilmedina Aug 28, 2024
513c6a5
feat: generate name with first letters
yamilmedina Aug 28, 2024
9a3b6ae
feat: generate name with first letters
yamilmedina Aug 28, 2024
1bdba27
feat: adjusting avatar and extract common logic
yamilmedina Aug 29, 2024
65f65e0
feat: detekt and docs
yamilmedina Aug 29, 2024
3da9c0c
feat: detekt and docs
yamilmedina Aug 29, 2024
447d190
feat: detekt and docs
yamilmedina Aug 29, 2024
8f028fa
feat: adjusts
yamilmedina Aug 29, 2024
5367e40
feat: adjusts
yamilmedina Aug 29, 2024
0f28abe
feat: fix tessts
yamilmedina Aug 29, 2024
ca167c1
feat: adjustment for selfprofile
yamilmedina Aug 29, 2024
75fd33d
feat: adjustment for other user profile
yamilmedina Aug 29, 2024
937c481
Merge branch 'develop' into feat/users-without-avatars
yamilmedina Aug 29, 2024
d6b8780
feat: missing parts in view
yamilmedina Aug 29, 2024
07e7577
chore: update kalium ref
yamilmedina Aug 29, 2024
f40b491
update kalium
yamilmedina Aug 29, 2024
e192760
chore: adjustments
yamilmedina Aug 30, 2024
83541cd
chore: final touches adjustments
yamilmedina Aug 30, 2024
d14e357
chore: final touches adjustments
yamilmedina Aug 30, 2024
0d4f448
chore: kalium ref
yamilmedina Aug 30, 2024
2b65ef7
feat: missing accent id for messages detail, reactions and receipts
yamilmedina Aug 30, 2024
d927380
feat: tests
yamilmedina Aug 30, 2024
421cc60
chore: adj temp users
yamilmedina Aug 30, 2024
3c5735b
chore: kalium ref
yamilmedina Aug 30, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading