Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ import com.wire.android.di.CurrentAccount
import com.wire.android.di.KaliumCoreLogic
import com.wire.kalium.logic.CoreLogic
import com.wire.kalium.logic.data.user.UserId
import com.wire.kalium.logic.feature.team.GetUpdatedSelfTeamUseCase
import com.wire.kalium.logic.feature.team.SyncSelfTeamInfoUseCase
import com.wire.kalium.logic.feature.team.TeamScope
import com.wire.kalium.logic.feature.user.IsSelfATeamMemberUseCase
import dagger.Module
Expand All @@ -43,8 +43,8 @@ class TeamModule {

@ViewModelScoped
@Provides
fun provideGetUpdatedSelfTeamUseCase(teamScope: TeamScope): GetUpdatedSelfTeamUseCase =
teamScope.getUpdatedSelfTeamUseCase
fun provideSyncSelfTeamInfoUseCase(teamScope: TeamScope): SyncSelfTeamInfoUseCase =
teamScope.syncSelfTeamInfoUseCase

@ViewModelScoped
@Provides
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ import com.wire.kalium.logic.feature.user.GetUserInfoUseCase
import com.wire.kalium.logic.feature.user.IsPasswordRequiredUseCase
import com.wire.kalium.logic.feature.user.IsReadOnlyAccountUseCase
import com.wire.kalium.logic.feature.user.ObserveSelfUserUseCase
import com.wire.kalium.logic.feature.user.ObserveSelfUserWithTeamUseCase
import com.wire.kalium.logic.feature.user.ObserveUserInfoUseCase
import com.wire.kalium.logic.feature.user.SelfServerConfigUseCase
import com.wire.kalium.logic.feature.user.SetUserHandleUseCase
Expand Down Expand Up @@ -206,6 +207,11 @@ class UserModule {
fun provideObserveSelfUseCase(userScope: UserScope): ObserveSelfUserUseCase =
userScope.observeSelfUser

@ViewModelScoped
@Provides
fun provideObserveSelfUserWithTeamUseCase(userScope: UserScope): ObserveSelfUserWithTeamUseCase =
userScope.observeSelfUserWithTeam

@ViewModelScoped
@Provides
fun provideGetAvatarAssetUseCase(userScope: UserScope): GetAvatarAssetUseCase =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,7 @@ import com.wire.kalium.logic.feature.conversation.ObserveConversationDetailsUseC
import com.wire.kalium.logic.feature.conversation.UpdateConversationReceiptModeUseCase
import com.wire.kalium.logic.feature.publicuser.RefreshUsersWithoutMetadataUseCase
import com.wire.kalium.logic.feature.selfDeletingMessages.ObserveSelfDeletionTimerSettingsForConversationUseCase
import com.wire.kalium.logic.feature.team.GetUpdatedSelfTeamUseCase
import com.wire.kalium.logic.feature.user.GetSelfUserUseCase
import com.wire.kalium.logic.feature.user.ObserveSelfUserWithTeamUseCase
import com.wire.kalium.logic.feature.user.IsMLSEnabledUseCase
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.Flow
Expand All @@ -70,8 +69,7 @@ class GroupConversationDetailsViewModel @Inject constructor(
private val dispatcher: DispatcherProvider,
private val observeConversationDetails: ObserveConversationDetailsUseCase,
observeConversationMembers: ObserveParticipantsForConversationUseCase,
private val getSelfTeam: GetUpdatedSelfTeamUseCase,
private val getSelfUser: GetSelfUserUseCase,
private val observeSelfUserWithTeam: ObserveSelfUserWithTeamUseCase,
private val updateConversationReceiptMode: UpdateConversationReceiptModeUseCase,
private val observeSelfDeletionTimerSettingsForConversation: ObserveSelfDeletionTimerSettingsForConversationUseCase,
savedStateHandle: SavedStateHandle,
Expand Down Expand Up @@ -110,27 +108,28 @@ class GroupConversationDetailsViewModel @Inject constructor(
viewModelScope.launch {
val groupDetailsFlow = groupDetailsFlow()
.shareIn(this, SharingStarted.WhileSubscribed(), 1)

val selfTeam = getSelfTeam()
val selfUser = getSelfUser()
val selfWithTeamFlow = observeSelfUserWithTeam()
.flowOn(dispatcher.io())
.shareIn(this, SharingStarted.WhileSubscribed(), 1)

combine(
groupDetailsFlow,
selfWithTeamFlow,
observeSelfDeletionTimerSettingsForConversation(conversationId, considerSelfUserSettings = false),
) { groupDetails, selfDeletionTimer ->
val selfType = selfUser?.userType
) { groupDetails, (selfUser, selfTeam), selfDeletionTimer ->
val selfType = selfUser.userType
val isSelfInTeamThatOwnsConversation = selfTeam?.id != null && selfTeam.id == groupDetails.conversation.teamId?.value
val isSelfExternalMember = selfUser?.userType?.isExternal() == true
val isRegularTeamMember = selfType?.isRegularTeamMember() == true
val isSelfExternalMember = selfUser.userType.isExternal()
val isRegularTeamMember = selfType.isRegularTeamMember()
val isChannel = groupDetails is ConversationDetails.Group.Channel
val isSelfTeamAdmin = selfUser?.userType?.isTeamAdmin() == true
val isSelfTeamAdmin = selfUser.userType.isTeamAdmin()
val canPerformChannelAdminTasks = isChannel && isSelfInTeamThatOwnsConversation && isSelfTeamAdmin
val isRegularGroupAdmin = groupDetails.selfRole == Conversation.Member.Role.Admin
val canSelfPerformAdminTasks = (isRegularGroupAdmin) || (canPerformChannelAdminTasks)
val channelPermissionType = groupDetails.getChannelPermissionType()
val channelAccessType = groupDetails.getChannelAccessType()
val isExternalOrFederated =
selfType?.isExternal() == true || selfType?.isFederated() == true
selfType.isExternal() || selfType.isFederated()
val canSelfAddParticipants =
when {
!isChannel -> isRegularGroupAdmin && !isExternalOrFederated
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,16 +28,18 @@ import com.wire.android.BuildConfig
import com.wire.android.appLogger
import com.wire.android.ui.theme.Accent
import com.wire.android.util.dispatchers.DispatcherProvider
import com.wire.kalium.logic.feature.team.GetUpdatedSelfTeamUseCase
import com.wire.kalium.logic.feature.user.IsE2EIEnabledUseCase
import com.wire.kalium.logic.feature.user.IsPasswordRequiredUseCase
import com.wire.kalium.logic.feature.user.IsReadOnlyAccountUseCase
import com.wire.kalium.logic.feature.user.IsSelfATeamMemberUseCase
import com.wire.kalium.logic.feature.user.ObserveSelfUserUseCase
import com.wire.kalium.logic.feature.user.ObserveSelfUserWithTeamUseCase
import com.wire.kalium.logic.feature.user.SelfServerConfigUseCase
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.flowOn
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.shareIn
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
Expand All @@ -49,7 +51,7 @@ import kotlin.properties.Delegates
@HiltViewModel
class MyAccountViewModel @Inject constructor(
private val getSelf: ObserveSelfUserUseCase,
private val getSelfTeam: GetUpdatedSelfTeamUseCase,
private val observeSelfUserWithTeam: ObserveSelfUserWithTeamUseCase,
private val isSelfATeamMember: IsSelfATeamMemberUseCase,
private val serverConfig: SelfServerConfigUseCase,
private val isPasswordRequired: IsPasswordRequiredUseCase,
Expand Down Expand Up @@ -105,9 +107,7 @@ class MyAccountViewModel @Inject constructor(
viewModelScope.launch {
fetchSelfUser()
}
viewModelScope.launch {
fetchSelfUserTeam()
}
fetchSelfUserTeam()
}

private suspend fun loadChangePasswordUrl() {
Expand Down Expand Up @@ -143,11 +143,18 @@ class MyAccountViewModel @Inject constructor(
)
}

private suspend fun fetchSelfUserTeam() {
val selfTeam = getSelfTeam()
myAccountState = myAccountState.copy(
teamName = selfTeam?.name.orEmpty(),
)
private fun fetchSelfUserTeam() {
viewModelScope.launch {
observeSelfUserWithTeam()
.flowOn(dispatchers.io())
.map { (_, team) -> team?.name.orEmpty() }
.distinctUntilChanged()
.collect { teamName ->
myAccountState = myAccountState.copy(
teamName = teamName,
)
}
}
}

companion object {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,6 @@ import com.wire.kalium.logic.data.call.Call
import com.wire.kalium.logic.data.id.QualifiedIdMapper
import com.wire.kalium.logic.data.id.toQualifiedID
import com.wire.kalium.logic.data.logout.LogoutReason
import com.wire.kalium.logic.data.team.Team
import com.wire.kalium.logic.data.user.SelfUser
import com.wire.kalium.logic.data.user.UserAssetId
import com.wire.kalium.logic.data.user.UserAvailabilityStatus
import com.wire.kalium.logic.data.user.UserId
Expand All @@ -57,9 +55,10 @@ import com.wire.kalium.logic.feature.legalhold.LegalHoldStateForSelfUser
import com.wire.kalium.logic.feature.legalhold.ObserveLegalHoldStateForSelfUserUseCase
import com.wire.kalium.logic.feature.personaltoteamaccount.CanMigrateFromPersonalToTeamUseCase
import com.wire.kalium.logic.feature.server.GetTeamUrlUseCase
import com.wire.kalium.logic.feature.team.GetUpdatedSelfTeamUseCase
import com.wire.kalium.logic.feature.team.SyncSelfTeamInfoUseCase
import com.wire.kalium.logic.feature.user.IsReadOnlyAccountUseCase
import com.wire.kalium.logic.feature.user.ObserveSelfUserUseCase
import com.wire.kalium.logic.feature.user.ObserveSelfUserWithTeamUseCase
import com.wire.kalium.logic.feature.user.ObserveValidAccountsUseCase
import com.wire.kalium.logic.feature.user.UpdateSelfAvailabilityStatusUseCase
import dagger.hilt.android.lifecycle.HiltViewModel
Expand All @@ -85,7 +84,8 @@ class SelfUserProfileViewModel @Inject constructor(
@CurrentAccount private val selfUserId: UserId,
private val dataStore: UserDataStore,
private val observeSelf: ObserveSelfUserUseCase,
private val getSelfTeam: GetUpdatedSelfTeamUseCase,
private val observeSelfUserWithTeam: ObserveSelfUserWithTeamUseCase,
private val syncSelfTeamInfo: SyncSelfTeamInfoUseCase,
private val canMigrateFromPersonalToTeam: CanMigrateFromPersonalToTeamUseCase,
private val observeValidAccounts: ObserveValidAccountsUseCase,
private val updateStatus: UpdateSelfAvailabilityStatusUseCase,
Expand Down Expand Up @@ -161,20 +161,26 @@ class SelfUserProfileViewModel @Inject constructor(

private fun fetchSelfUser() {
viewModelScope.launch {
val self = observeSelf().flowOn(dispatchers.io()).shareIn(this, SharingStarted.WhileSubscribed(1))
val selfTeam = getSelfTeam()
viewModelScope.launch(dispatchers.io()) {
syncSelfTeamInfo()
}

val selfWithTeam = observeSelfUserWithTeam()
.flowOn(dispatchers.io())
.shareIn(this, SharingStarted.WhileSubscribed(1))
val validAccounts =
observeValidAccounts().flowOn(dispatchers.io()).shareIn(this, SharingStarted.WhileSubscribed(1))

combine(self, validAccounts) { selfUser: SelfUser, list: List<Pair<SelfUser, Team?>> ->
Pair(
combine(selfWithTeam, validAccounts) { (selfUser, selfTeam), list ->
Triple(
selfUser,
selfTeam,
list.filter { it.first.id != selfUser.id }
.map { (selfUser, _) -> otherAccountMapper.toOtherAccount(selfUser) }
)
}
.distinctUntilChanged()
.collect { (selfUser, otherAccounts) ->
.collect { (selfUser, selfTeam, otherAccounts) ->
with(selfUser) {
// Load user avatar raw image data
completePicture?.let { updateUserAvatar(it) }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import androidx.lifecycle.SavedStateHandle
import com.wire.android.config.CoroutineTestExtension
import com.wire.android.config.NavigationTestExtension
import com.wire.android.config.TestDispatcherProvider
import com.wire.android.framework.TestTeam
import com.wire.android.framework.TestUser
import com.wire.android.mapper.testUIParticipant
import com.wire.android.ui.home.conversations.details.options.GroupConversationOptionsState
Expand Down Expand Up @@ -56,8 +57,7 @@ import com.wire.kalium.logic.feature.conversation.UpdateConversationReceiptModeU
import com.wire.kalium.logic.feature.featureConfig.ObserveIsAppsAllowedForUsageUseCase
import com.wire.kalium.logic.feature.publicuser.RefreshUsersWithoutMetadataUseCase
import com.wire.kalium.logic.feature.selfDeletingMessages.ObserveSelfDeletionTimerSettingsForConversationUseCase
import com.wire.kalium.logic.feature.team.GetUpdatedSelfTeamUseCase
import com.wire.kalium.logic.feature.user.GetSelfUserUseCase
import com.wire.kalium.logic.feature.user.ObserveSelfUserWithTeamUseCase
import com.wire.kalium.logic.feature.user.IsMLSEnabledUseCase
import io.mockk.MockKAnnotations
import io.mockk.coEvery
Expand Down Expand Up @@ -703,14 +703,11 @@ internal class GroupConversationDetailsViewModelArrangement {
lateinit var observeConversationDetails: ObserveConversationDetailsUseCase

@MockK
lateinit var getSelfUser: GetSelfUserUseCase
lateinit var observeSelfUserWithTeam: ObserveSelfUserWithTeamUseCase

@MockK
lateinit var observeParticipantsForConversationUseCase: ObserveParticipantsForConversationUseCase

@MockK
lateinit var getSelfTeamUseCase: GetUpdatedSelfTeamUseCase

@MockK
lateinit var updateConversationMutedStatus: UpdateConversationMutedStatusUseCase

Expand Down Expand Up @@ -740,13 +737,15 @@ internal class GroupConversationDetailsViewModelArrangement {
@MockK
lateinit var isWireCellsEnabled: IsWireCellsEnabledUseCase

private var arrangedSelfUser: SelfUser = TestUser.SELF_USER
private var arrangedTeam: Team? = TestTeam.TEAM

private val viewModel by lazy {
GroupConversationDetailsViewModel(
dispatcher = TestDispatcherProvider(),
getSelfUser = getSelfUser,
observeConversationDetails = observeConversationDetails,
observeConversationMembers = observeParticipantsForConversationUseCase,
getSelfTeam = getSelfTeamUseCase,
observeSelfUserWithTeam = observeSelfUserWithTeam,
savedStateHandle = savedStateHandle,
updateConversationReceiptMode = updateConversationReceiptMode,
isMLSEnabled = isMLSEnabledUseCase,
Expand All @@ -773,9 +772,8 @@ internal class GroupConversationDetailsViewModelArrangement {

// Default empty values
coEvery { observeConversationDetails(any()) } returns flowOf()
coEvery { getSelfUser() } returns TestUser.SELF_USER
updateSelfUserWithTeamFlow()
coEvery { observeParticipantsForConversationUseCase(any(), any()) } returns flowOf()
coEvery { getSelfTeamUseCase() } returns null
coEvery { isMLSEnabledUseCase() } returns true
coEvery { updateConversationMutedStatus(any(), any(), any()) } returns ConversationUpdateStatusResult.Success
coEvery { observeSelfDeletionTimerSettingsForConversation(any(), any()) } returns flowOf(SelfDeletionTimer.Disabled)
Expand All @@ -789,7 +787,8 @@ internal class GroupConversationDetailsViewModelArrangement {
}

suspend fun withGetSelfUserReturns(user: SelfUser) = apply {
coEvery { getSelfUser() } returns user
arrangedSelfUser = user
updateSelfUserWithTeamFlow()
}

suspend fun withConversationDetailUpdate(conversationDetails: ConversationDetails) = apply {
Expand All @@ -804,7 +803,12 @@ internal class GroupConversationDetailsViewModelArrangement {
}

suspend fun withSelfTeamUseCaseReturns(result: Team?) = apply {
coEvery { getSelfTeamUseCase() } returns result
arrangedTeam = result
updateSelfUserWithTeamFlow()
}

private fun updateSelfUserWithTeamFlow() {
coEvery { observeSelfUserWithTeam() } returns flowOf(arrangedSelfUser to arrangedTeam)
}

suspend fun withUpdateConversationReceiptModeReturningSuccess() = apply {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,13 +25,13 @@ import com.wire.android.framework.TestUser
import com.wire.android.util.newServerConfig
import com.wire.kalium.common.error.StorageFailure
import com.wire.kalium.logic.data.id.TeamId
import com.wire.kalium.logic.feature.team.GetUpdatedSelfTeamUseCase
import com.wire.kalium.logic.feature.user.IsE2EIEnabledUseCase
import com.wire.kalium.logic.feature.user.IsPasswordRequiredUseCase
import com.wire.kalium.logic.feature.user.IsPasswordRequiredUseCase.Result.Success
import com.wire.kalium.logic.feature.user.IsReadOnlyAccountUseCase
import com.wire.kalium.logic.feature.user.IsSelfATeamMemberUseCase
import com.wire.kalium.logic.feature.user.ObserveSelfUserUseCase
import com.wire.kalium.logic.feature.user.ObserveSelfUserWithTeamUseCase
import com.wire.kalium.logic.feature.user.SelfServerConfigUseCase
import io.mockk.MockKAnnotations
import io.mockk.coEvery
Expand Down Expand Up @@ -204,7 +204,7 @@ class MyAccountViewModelTest {
lateinit var observeSelfUserUseCase: ObserveSelfUserUseCase

@MockK
lateinit var getSelfTeamUseCase: GetUpdatedSelfTeamUseCase
lateinit var observeSelfUserWithTeam: ObserveSelfUserWithTeamUseCase

@MockK
lateinit var selfServerConfigUseCase: SelfServerConfigUseCase
Expand All @@ -224,7 +224,7 @@ class MyAccountViewModelTest {
private val viewModel by lazy {
MyAccountViewModel(
observeSelfUserUseCase,
getSelfTeamUseCase,
observeSelfUserWithTeam,
isSelfATeamMember,
selfServerConfigUseCase,
isPasswordRequiredUseCase,
Expand All @@ -237,7 +237,7 @@ class MyAccountViewModelTest {
init {
MockKAnnotations.init(this, relaxUnitFun = true)
coEvery { observeSelfUserUseCase() } returns flowOf(TestUser.SELF_USER.copy(teamId = TeamId(TestTeam.TEAM.id)))
coEvery { getSelfTeamUseCase() } returns TestTeam.TEAM
coEvery { observeSelfUserWithTeam() } returns flowOf(TestUser.SELF_USER to TestTeam.TEAM)
coEvery { selfServerConfigUseCase() } returns SelfServerConfigUseCase.Result.Success(newServerConfig(1))
coEvery { isSelfATeamMember() } returns true
}
Expand Down
Loading