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: Conversation MLS verification status updating (WPB-3872) #2224

Merged
Merged
Show file tree
Hide file tree
Changes from 15 commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
b27bcdd
feat: Conversation MLS verification status updating
borichellow Sep 8, 2023
8606294
Merge branch 'develop' into feat/conversation_mls_verification_status…
borichellow Sep 8, 2023
a56c30f
feat: Conversation MLS verification status updating: need to test mig…
borichellow Sep 12, 2023
f76bb8b
fixed some tests
borichellow Sep 12, 2023
10ce0de
Merge branch 'develop' into feat/conversation_mls_verification_status…
borichellow Sep 12, 2023
d7eacfd
Updated kalium
borichellow Sep 12, 2023
4fb3a1a
fixed code style
borichellow Sep 12, 2023
6db8629
Merge branch 'develop' into feat/conversation_mls_verification_status…
borichellow Sep 13, 2023
0be508c
Updated kalium
borichellow Sep 13, 2023
d4317e1
Updated kalium
borichellow Sep 13, 2023
95fdecf
Updated kalium
borichellow Sep 14, 2023
1a47073
Merge branch 'develop' into feat/conversation_mls_verification_status…
borichellow Sep 14, 2023
c8f4db6
Fix build
borichellow Sep 14, 2023
6329e35
Merge develop into feat/conversation_mls_verification_status_updating
borichellow Sep 14, 2023
97fb5bb
Merge branch 'develop' into feat/conversation_mls_verification_status…
borichellow Sep 15, 2023
6e2a91c
feat: Conversation MLS verification status updating: update kalium an…
borichellow Sep 22, 2023
3d1befa
Merge develop into feat/conversation_mls_verification_status_updating
borichellow Sep 22, 2023
82c931f
Fixed code-style
borichellow Sep 25, 2023
26fcbd6
Merge branch 'develop' into feat/conversation_mls_verification_status…
borichellow Sep 25, 2023
1390713
Updated kalium and adopted AR to it
borichellow Sep 26, 2023
a15381d
Merge develop into feat/conversation_mls_verification_status_updating
borichellow Sep 26, 2023
4f05cd8
Update kalium
borichellow Sep 27, 2023
bff674e
Merge branch 'develop' into feat/conversation_mls_verification_status…
borichellow Sep 27, 2023
8ec6599
Update kalium
borichellow Sep 28, 2023
3a75450
Merge branch 'develop' into feat/conversation_mls_verification_status…
borichellow Sep 28, 2023
1fb8030
Update kalium to develop
borichellow Sep 28, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
7 changes: 1 addition & 6 deletions app/src/main/kotlin/com/wire/android/di/CoreLogicModule.kt
Original file line number Diff line number Diff line change
Expand Up @@ -65,8 +65,8 @@ import com.wire.kalium.logic.feature.conversation.CreateGroupConversationUseCase
import com.wire.kalium.logic.feature.conversation.GetAllContactsNotInConversationUseCase
import com.wire.kalium.logic.feature.conversation.GetConversationUnreadEventsCountUseCase
import com.wire.kalium.logic.feature.conversation.GetOrCreateOneToOneConversationUseCase
import com.wire.kalium.logic.feature.conversation.ObserveOtherUserSecurityClassificationLabelUseCase
import com.wire.kalium.logic.feature.conversation.LeaveConversationUseCase
import com.wire.kalium.logic.feature.conversation.ObserveOtherUserSecurityClassificationLabelUseCase
import com.wire.kalium.logic.feature.conversation.ObserveSecurityClassificationLabelUseCase
import com.wire.kalium.logic.feature.conversation.ObserveUserListByIdUseCase
import com.wire.kalium.logic.feature.conversation.RefreshConversationsWithoutMetadataUseCase
Expand Down Expand Up @@ -1231,11 +1231,6 @@ class UseCaseModule {
@CurrentAccount currentAccount: UserId
): ObserveScreenshotCensoringConfigUseCase = coreLogic.getSessionScope(currentAccount).observeScreenshotCensoringConfig

@ViewModelScoped
@Provides
fun provideGetConversationVerificationStatusUseCase(@KaliumCoreLogic coreLogic: CoreLogic, @CurrentAccount currentAccount: UserId) =
coreLogic.getSessionScope(currentAccount).getConversationVerificationStatus

@ViewModelScoped
@Provides
fun providesJoinConversationViaCodeUseCase(@KaliumCoreLogic coreLogic: CoreLogic, @CurrentAccount currentAccount: UserId) =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@
name = name,
type = it,
teamId = scalaConversation.teamId?.let { teamId -> TeamId(teamId) },
protocol = ProtocolInfo.Proteus,
protocol = ProtocolInfo.Proteus(Conversation.VerificationStatus.NOT_VERIFIED),

Check warning on line 94 in app/src/main/kotlin/com/wire/android/migration/MigrationMapper.kt

View check run for this annotation

Codecov / codecov/patch

app/src/main/kotlin/com/wire/android/migration/MigrationMapper.kt#L94

Added line #L94 was not covered by tests
mutedStatus = mapMutedStatus(mutedStatus),
access = mapAccess(access),
accessRole = emptyList(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ import com.wire.kalium.logic.feature.call.usecase.TurnLoudSpeakerOffUseCase
import com.wire.kalium.logic.feature.call.usecase.TurnLoudSpeakerOnUseCase
import com.wire.kalium.logic.feature.call.usecase.UnMuteCallUseCase
import com.wire.kalium.logic.feature.call.usecase.UpdateVideoStateUseCase
import com.wire.kalium.logic.feature.conversation.ObserveConversationDetailsResult
import com.wire.kalium.logic.feature.conversation.ObserveConversationDetailsUseCase
import com.wire.kalium.logic.util.PlatformView
import dagger.hilt.android.lifecycle.HiltViewModel
Expand Down Expand Up @@ -137,7 +138,7 @@ class SharedCallingViewModel @Inject constructor(

private suspend fun observeConversationDetails(coroutineScope: CoroutineScope) {
conversationDetails(conversationId = conversationId)
.filterIsInstance<ObserveConversationDetailsUseCase.Result.Success>() // TODO handle StorageFailure
.filterIsInstance<ObserveConversationDetailsResult.Success>() // TODO handle StorageFailure
.map { it.conversationDetails }
.flowOn(dispatchers.default())
.shareIn(coroutineScope, SharingStarted.WhileSubscribed(1))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,11 +63,10 @@ import com.wire.android.ui.theme.wireDimensions
import com.wire.android.ui.theme.wireTypography
import com.wire.android.util.debug.LocalFeatureVisibilityFlags
import com.wire.android.util.ui.UIText
import com.wire.kalium.logic.data.conversation.ConversationVerificationStatus
import com.wire.kalium.logic.data.conversation.Conversation
import com.wire.kalium.logic.data.id.ConversationId
import com.wire.kalium.logic.data.id.QualifiedID
import com.wire.kalium.logic.data.user.UserAvailabilityStatus
import com.wire.kalium.logic.feature.conversation.ConversationProtocol

@Composable
fun ConversationScreenTopAppBar(
Expand Down Expand Up @@ -134,20 +133,7 @@ private fun ConversationScreenTopAppBarContent(
overflow = TextOverflow.Ellipsis,
modifier = Modifier.weight(weight = 1f, fill = false)
)
if (conversationInfoViewState.verificationStatus?.status == ConversationVerificationStatus.VERIFIED) {
val (iconId, contentDescriptionId) = when (conversationInfoViewState.verificationStatus.protocol) {
ConversationProtocol.MLS ->
R.drawable.ic_certificate_valid_mls to R.string.content_description_mls_certificate_valid

ConversationProtocol.PROTEUS ->
R.drawable.ic_certificate_valid_proteus to R.string.content_description_proteus_certificate_valid
}
Image(
modifier = Modifier.padding(start = dimensions().spacing4x),
painter = painterResource(id = iconId),
contentDescription = stringResource(contentDescriptionId)
)
}
VerificationIcon(conversationInfoViewState.protocolInfo)
if (isDropDownEnabled && isInteractionEnabled) {
Icon(
painter = painterResource(id = R.drawable.ic_dropdown_icon),
Expand Down Expand Up @@ -194,6 +180,24 @@ private fun ConversationScreenTopAppBarContent(
)
}

@Composable
private fun VerificationIcon(protocolInfo: Conversation.ProtocolInfo?) {
if (protocolInfo?.verificationStatus != Conversation.VerificationStatus.VERIFIED) return
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
if (protocolInfo?.verificationStatus != Conversation.VerificationStatus.VERIFIED) return
if (protocolInfo?.verificationStatus == Conversation.VerificationStatus.NOT_VERIFIED) return

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

do not agree. If the conversation status is Degraded we shouldn't display any icon just like it's not verified (design )


val (iconId, contentDescriptionId) = when (protocolInfo) {
is Conversation.ProtocolInfo.MLS ->
R.drawable.ic_certificate_valid_mls to R.string.content_description_mls_certificate_valid

is Conversation.ProtocolInfo.Proteus ->
R.drawable.ic_certificate_valid_proteus to R.string.content_description_proteus_certificate_valid
}
Image(
modifier = Modifier.padding(start = dimensions().spacing4x),
painter = painterResource(id = iconId),
contentDescription = stringResource(contentDescriptionId)
)
}

@Composable
private fun Avatar(
conversationAvatar: ConversationAvatar,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ import com.wire.android.util.ui.UIText
import com.wire.kalium.logic.data.conversation.ConversationDetails
import com.wire.kalium.logic.data.id.QualifiedID
import com.wire.kalium.logic.data.user.type.UserType
import com.wire.kalium.logic.feature.conversation.ObserveConversationDetailsResult
import com.wire.kalium.logic.feature.conversation.ObserveConversationDetailsUseCase
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.ExperimentalCoroutinesApi
Expand Down Expand Up @@ -61,8 +62,8 @@ class ConversationBannerViewModel @Inject constructor(
observeConversationDetails(conversationId)
.filter {
when (it) {
is ObserveConversationDetailsUseCase.Result.Failure -> false
is ObserveConversationDetailsUseCase.Result.Success -> it.conversationDetails is ConversationDetails.Group
is ObserveConversationDetailsResult.Failure -> false
is ObserveConversationDetailsResult.Success -> it.conversationDetails is ConversationDetails.Group
}
}
.flatMapLatest { observeConversationMembersByTypes(conversationId) }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
import com.wire.kalium.logic.feature.call.usecase.IsEligibleToStartCallUseCase
import com.wire.kalium.logic.feature.call.usecase.ObserveEstablishedCallsUseCase
import com.wire.kalium.logic.feature.call.usecase.ObserveOngoingCallsUseCase
import com.wire.kalium.logic.feature.conversation.ObserveConversationDetailsResult
import com.wire.kalium.logic.feature.conversation.ObserveConversationDetailsUseCase
import com.wire.kalium.logic.sync.ObserveSyncStateUseCase
import dagger.hilt.android.lifecycle.HiltViewModel
Expand Down Expand Up @@ -92,12 +93,12 @@
val hasOngoingCall = calls.any { call -> call.conversationId == conversationId }
// valid conversation is a conversation where the user is a member and it's not deleted
val validConversation = when (conversationDetailsResult) {
is ObserveConversationDetailsUseCase.Result.Success -> {
is ObserveConversationDetailsResult.Success -> {
!(conversationDetailsResult.conversationDetails is ConversationDetails.Group &&
!(conversationDetailsResult.conversationDetails as ConversationDetails.Group).isSelfUserMember)
}

is ObserveConversationDetailsUseCase.Result.Failure -> false
is ObserveConversationDetailsResult.Failure -> false

Check warning on line 101 in app/src/main/kotlin/com/wire/android/ui/home/conversations/call/ConversationCallViewModel.kt

View check run for this annotation

Codecov / codecov/patch

app/src/main/kotlin/com/wire/android/ui/home/conversations/call/ConversationCallViewModel.kt#L101

Added line #L101 was not covered by tests
}
hasOngoingCall && validConversation
}.collectLatest {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ import com.wire.kalium.logic.data.id.QualifiedID
import com.wire.kalium.logic.feature.conversation.ClearConversationContentUseCase
import com.wire.kalium.logic.feature.conversation.ConversationUpdateReceiptModeResult
import com.wire.kalium.logic.feature.conversation.ConversationUpdateStatusResult
import com.wire.kalium.logic.feature.conversation.ObserveConversationDetailsResult
import com.wire.kalium.logic.feature.conversation.ObserveConversationDetailsUseCase
import com.wire.kalium.logic.feature.conversation.RemoveMemberFromConversationUseCase
import com.wire.kalium.logic.feature.conversation.UpdateConversationAccessRoleUseCase
Expand Down Expand Up @@ -120,7 +121,7 @@ class GroupConversationDetailsViewModel @Inject constructor(
viewModelScope.launch {
val groupDetailsFlow =
observeConversationDetails(conversationId)
.filterIsInstance<ObserveConversationDetailsUseCase.Result.Success>()
.filterIsInstance<ObserveConversationDetailsResult.Success>()
.map { it.conversationDetails }
.filterIsInstance<ConversationDetails.Group>()
.distinctUntilChanged()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
import com.wire.android.util.dispatchers.DispatcherProvider
import com.wire.kalium.logic.data.conversation.Conversation
import com.wire.kalium.logic.data.id.QualifiedID
import com.wire.kalium.logic.feature.conversation.ObserveConversationDetailsResult
import com.wire.kalium.logic.feature.conversation.ObserveConversationDetailsUseCase
import com.wire.kalium.logic.feature.conversation.UpdateConversationAccessRoleUseCase
import com.wire.kalium.logic.feature.conversation.guestroomlink.CanCreatePasswordProtectedLinksUseCase
Expand Down Expand Up @@ -111,7 +112,7 @@
private fun observeConversationDetails() {
viewModelScope.launch {
val conversationDetailsFlow = observeConversationDetails(conversationId)
.filterIsInstance<ObserveConversationDetailsUseCase.Result.Success>()
.filterIsInstance<ObserveConversationDetailsResult.Success>()

Check warning on line 115 in app/src/main/kotlin/com/wire/android/ui/home/conversations/details/editguestaccess/EditGuestAccessViewModel.kt

View check run for this annotation

Codecov / codecov/patch

app/src/main/kotlin/com/wire/android/ui/home/conversations/details/editguestaccess/EditGuestAccessViewModel.kt#L115

Added line #L115 was not covered by tests
.map { it.conversationDetails }
.distinctUntilChanged()
.flowOn(dispatcher.io())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
import com.wire.android.ui.navArgs
import com.wire.android.util.dispatchers.DispatcherProvider
import com.wire.kalium.logic.data.id.QualifiedID
import com.wire.kalium.logic.feature.conversation.ObserveConversationDetailsResult
import com.wire.kalium.logic.feature.conversation.ObserveConversationDetailsUseCase
import com.wire.kalium.logic.feature.conversation.RenameConversationUseCase
import com.wire.kalium.logic.feature.conversation.RenamingResult
Expand Down Expand Up @@ -69,7 +70,7 @@
private fun observeConversationDetails() {
viewModelScope.launch {
observeConversationDetails(conversationId)
.filterIsInstance<ObserveConversationDetailsUseCase.Result.Success>()
.filterIsInstance<ObserveConversationDetailsResult.Success>()

Check warning on line 73 in app/src/main/kotlin/com/wire/android/ui/home/conversations/details/metadata/EditConversationMetadataViewModel.kt

View check run for this annotation

Codecov / codecov/patch

app/src/main/kotlin/com/wire/android/ui/home/conversations/details/metadata/EditConversationMetadataViewModel.kt#L73

Added line #L73 was not covered by tests
.map { it.conversationDetails }
.distinctUntilChanged()
.flowOn(dispatcher.io())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ import com.wire.kalium.logic.feature.selfDeletingMessages.SelfDeletionTimer
data class GroupConversationOptionsState(
val conversationId: ConversationId,
val groupName: String = "",
val protocolInfo: Conversation.ProtocolInfo = Conversation.ProtocolInfo.Proteus,
val protocolInfo: Conversation.ProtocolInfo = Conversation.ProtocolInfo.Proteus(Conversation.VerificationStatus.NOT_VERIFIED),
val areAccessOptionsAvailable: Boolean = false,
val isGuestAllowed: Boolean = false,
val isServicesAllowed: Boolean = false,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
import com.wire.kalium.logic.data.id.ConversationId
import com.wire.kalium.logic.data.user.SelfUser
import com.wire.kalium.logic.data.user.UserId
import com.wire.kalium.logic.feature.conversation.ObserveConversationDetailsResult
import com.wire.kalium.logic.feature.conversation.ObserveConversationDetailsUseCase
import com.wire.kalium.logic.feature.conversation.ObserveConversationMembersUseCase
import com.wire.kalium.logic.feature.user.GetSelfUserUseCase
Expand All @@ -44,7 +45,7 @@
combine(
getSelfUser(),
observeConversationDetails(conversationId)
.filterIsInstance<ObserveConversationDetailsUseCase.Result.Success>() // TODO handle StorageFailure
.filterIsInstance<ObserveConversationDetailsResult.Success>() // TODO handle StorageFailure

Check warning on line 48 in app/src/main/kotlin/com/wire/android/ui/home/conversations/details/participants/usecase/ObserveConversationRoleForUserUseCase.kt

View check run for this annotation

Codecov / codecov/patch

app/src/main/kotlin/com/wire/android/ui/home/conversations/details/participants/usecase/ObserveConversationRoleForUserUseCase.kt#L48

Added line #L48 was not covered by tests
.map { it.conversationDetails },
observeConversationMembers(conversationId)
) { selfUser: SelfUser, conversationDetails: ConversationDetails, memberDetailsList: List<MemberDetails> ->
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,7 @@ import com.wire.kalium.logic.data.id.QualifiedID
import com.wire.kalium.logic.data.id.QualifiedIdMapper
import com.wire.kalium.logic.data.user.ConnectionState
import com.wire.kalium.logic.data.user.UserId
import com.wire.kalium.logic.feature.conversation.ConversationVerificationStatusResult
import com.wire.kalium.logic.feature.conversation.GetConversationVerificationStatusUseCase
import com.wire.kalium.logic.feature.conversation.ObserveConversationDetailsResult
import com.wire.kalium.logic.feature.conversation.ObserveConversationDetailsUseCase
import com.wire.kalium.logic.feature.user.GetSelfUserUseCase
import dagger.hilt.android.lifecycle.HiltViewModel
Expand All @@ -57,7 +56,6 @@ class ConversationInfoViewModel @Inject constructor(
private val observeConversationDetails: ObserveConversationDetailsUseCase,
private val observerSelfUser: GetSelfUserUseCase,
private val wireSessionImageLoader: WireSessionImageLoader,
private val getConversationVerificationStatus: GetConversationVerificationStatusUseCase
) : SavedStateViewModel(savedStateHandle) {

private val conversationNavArgs: ConversationNavArgs = savedStateHandle.navArgs()
Expand All @@ -75,12 +73,6 @@ class ConversationInfoViewModel @Inject constructor(
viewModelScope.launch {
selfUserId = observerSelfUser().first().id
}
viewModelScope.launch {
val result = getConversationVerificationStatus(conversationId)
if (result is ConversationVerificationStatusResult.Success) {
conversationInfoViewState = conversationInfoViewState.copy(verificationStatus = result)
}
}
}

/*
Expand All @@ -94,9 +86,9 @@ class ConversationInfoViewModel @Inject constructor(
.collect { it.handleConversationDetailsResult(onNotFound) }
}

private fun ObserveConversationDetailsUseCase.Result.handleConversationDetailsResult(onNotFound: () -> Unit) {
private fun ObserveConversationDetailsResult.handleConversationDetailsResult(onNotFound: () -> Unit) {
when (this) {
is ObserveConversationDetailsUseCase.Result.Failure -> {
is ObserveConversationDetailsResult.Failure -> {
when (val failure = this.storageFailure) {
is StorageFailure.DataNotFound -> onNotFound()

Expand All @@ -105,7 +97,7 @@ class ConversationInfoViewModel @Inject constructor(
}
}

is ObserveConversationDetailsUseCase.Result.Success -> handleConversationDetails(
is ObserveConversationDetailsResult.Success -> handleConversationDetails(
this.conversationDetails
)
}
Expand All @@ -125,7 +117,8 @@ class ConversationInfoViewModel @Inject constructor(
conversationAvatar = getConversationAvatar(conversationDetails),
conversationDetailsData = detailsData,
hasUserPermissionToEdit = detailsData !is ConversationDetailsData.None,
conversationType = conversationDetails.conversation.type
conversationType = conversationDetails.conversation.type,
protocolInfo = conversationDetails.conversation.protocol
)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@ import com.wire.kalium.logic.data.id.QualifiedID
import com.wire.kalium.logic.data.user.ConnectionState
import com.wire.kalium.logic.data.user.UserAvailabilityStatus
import com.wire.kalium.logic.data.user.UserId
import com.wire.kalium.logic.feature.conversation.ConversationVerificationStatusResult

data class ConversationInfoViewState(
val conversationId: QualifiedID,
Expand All @@ -36,7 +35,7 @@ data class ConversationInfoViewState(
val conversationAvatar: ConversationAvatar = ConversationAvatar.None,
val hasUserPermissionToEdit: Boolean = false,
val conversationType: Conversation.Type = Conversation.Type.ONE_ON_ONE,
val verificationStatus: ConversationVerificationStatusResult.Success? = null,
val protocolInfo: Conversation.ProtocolInfo? = null,
)

sealed class ConversationDetailsData {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ import com.wire.kalium.logic.feature.asset.GetMessageAssetUseCase
import com.wire.kalium.logic.feature.asset.MessageAssetResult
import com.wire.kalium.logic.feature.asset.UpdateAssetMessageDownloadStatusUseCase
import com.wire.kalium.logic.feature.conversation.GetConversationUnreadEventsCountUseCase
import com.wire.kalium.logic.feature.conversation.ObserveConversationDetailsResult
import com.wire.kalium.logic.feature.conversation.ObserveConversationDetailsUseCase
import com.wire.kalium.logic.feature.message.GetMessageByIdUseCase
import com.wire.kalium.logic.feature.message.ToggleReactionUseCase
Expand Down Expand Up @@ -132,7 +133,7 @@ class ConversationMessagesViewModel @Inject constructor(
observeConversationDetails(conversationId)
.flowOn(dispatchers.io())
.collect { conversationDetailsResult ->
if (conversationDetailsResult is ObserveConversationDetailsUseCase.Result.Success) {
if (conversationDetailsResult is ObserveConversationDetailsResult.Success) {
val lastUnreadInstant = conversationDetailsResult.conversationDetails.conversation.lastReadDate.let {
Instant.parse(it)
}
Expand Down