diff --git a/app/src/main/kotlin/com/wire/android/ui/common/dialogs/ArchiveConversationDialog.kt b/app/src/main/kotlin/com/wire/android/ui/common/dialogs/ArchiveConversationDialog.kt new file mode 100644 index 00000000000..c5b5255c213 --- /dev/null +++ b/app/src/main/kotlin/com/wire/android/ui/common/dialogs/ArchiveConversationDialog.kt @@ -0,0 +1,50 @@ +/* + * Wire + * Copyright (C) 2023 Wire Swiss GmbH + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see http://www.gnu.org/licenses/. + */ +package com.wire.android.ui.common.dialogs + +import androidx.compose.runtime.Composable +import androidx.compose.ui.res.stringResource +import com.wire.android.R +import com.wire.android.ui.common.VisibilityState +import com.wire.android.ui.common.WireDialog +import com.wire.android.ui.common.WireDialogButtonProperties +import com.wire.android.ui.common.WireDialogButtonType +import com.wire.android.ui.common.visbility.VisibilityState +import com.wire.android.ui.home.conversationslist.model.DialogState + +@Composable +fun ArchiveConversationDialog(onArchiveButtonClicked: (DialogState) -> Unit, dialogState: VisibilityState) { + VisibilityState(dialogState) { + WireDialog( + title = stringResource(R.string.dialog_archive_conversation_title), + text = stringResource(R.string.dialog_archive_conversation_description), + onDismiss = dialogState::dismiss, + optionButton1Properties = WireDialogButtonProperties( + onClick = { onArchiveButtonClicked(it) }, + text = stringResource(R.string.dialog_archive_conversation_option), + type = WireDialogButtonType.Primary, + ), + dismissButtonProperties = WireDialogButtonProperties( + onClick = dialogState::dismiss, + text = stringResource(R.string.label_cancel), + type = WireDialogButtonType.Secondary, + ), + buttonsHorizontalAlignment = true + ) + } +} diff --git a/app/src/main/kotlin/com/wire/android/ui/home/conversations/details/GroupConversationDetailsScreen.kt b/app/src/main/kotlin/com/wire/android/ui/home/conversations/details/GroupConversationDetailsScreen.kt index a9ed4949afa..1055c721e54 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/conversations/details/GroupConversationDetailsScreen.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/conversations/details/GroupConversationDetailsScreen.kt @@ -42,7 +42,6 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import androidx.compose.runtime.snapshotFlow -import androidx.compose.ui.ExperimentalComposeUiApi import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalFocusManager @@ -68,6 +67,7 @@ import com.wire.android.ui.common.bottomsheet.conversation.ConversationSheetCont import com.wire.android.ui.common.bottomsheet.conversation.rememberConversationSheetState import com.wire.android.ui.common.bottomsheet.rememberWireModalSheetState import com.wire.android.ui.common.calculateCurrentTab +import com.wire.android.ui.common.dialogs.ArchiveConversationDialog import com.wire.android.ui.common.scaffold.WireScaffold import com.wire.android.ui.common.topBarElevation import com.wire.android.ui.common.topappbar.NavigationIconType @@ -221,7 +221,6 @@ fun GroupConversationDetailsScreen( } @OptIn( - ExperimentalComposeUiApi::class, ExperimentalMaterial3Api::class, ExperimentalFoundationApi::class ) @@ -268,6 +267,7 @@ private fun GroupConversationDetailsContent( val deleteGroupDialogState = rememberVisibilityState() val leaveGroupDialogState = rememberVisibilityState() val clearConversationDialogState = rememberVisibilityState() + val archiveConversationDialogState = rememberVisibilityState() LaunchedEffect(conversationSheetState.conversationSheetContent) { // on each closing BottomSheet we revert BSContent to Home. @@ -282,6 +282,7 @@ private fun GroupConversationDetailsContent( deleteGroupDialogState.dismiss() leaveGroupDialogState.dismiss() clearConversationDialogState.dismiss() + archiveConversationDialogState.dismiss() } WireScaffold( topBar = { @@ -361,10 +362,12 @@ private fun GroupConversationDetailsContent( addConversationToFavourites = bottomSheetEventsHandler::onAddConversationToFavourites, moveConversationToFolder = bottomSheetEventsHandler::onMoveConversationToFolder, updateConversationArchiveStatus = { - conversationSheetContent?.let { + // Only show the confirmation dialog if the conversation is not archived + if (!it.isArchived) { + archiveConversationDialogState.show(it) + } else { bottomSheetEventsHandler.updateConversationArchiveStatus( - conversationId = it.conversationId, - shouldArchive = !it.isArchived, + dialogState = it, onMessage = closeBottomSheetAndShowSnackbarMessage ) } @@ -394,7 +397,14 @@ private fun GroupConversationDetailsContent( dialogState = clearConversationDialogState, isLoading = isLoading, onClearConversationContent = { - bottomSheetEventsHandler.onClearConversationContent(it, closeBottomSheetAndShowSnackbarMessage) + bottomSheetEventsHandler.onClearConversationContent(dialogState = it, onMessage = closeBottomSheetAndShowSnackbarMessage) + } + ) + + ArchiveConversationDialog( + dialogState = archiveConversationDialogState, + onArchiveButtonClicked = { + bottomSheetEventsHandler.updateConversationArchiveStatus(dialogState = it, onMessage = closeBottomSheetAndShowSnackbarMessage) } ) } diff --git a/app/src/main/kotlin/com/wire/android/ui/home/conversations/details/GroupConversationDetailsViewModel.kt b/app/src/main/kotlin/com/wire/android/ui/home/conversations/details/GroupConversationDetailsViewModel.kt index 16fa680ab01..b257ace5767 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/conversations/details/GroupConversationDetailsViewModel.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/conversations/details/GroupConversationDetailsViewModel.kt @@ -380,15 +380,14 @@ class GroupConversationDetailsViewModel @Inject constructor( } override fun updateConversationArchiveStatus( - conversationId: ConversationId, - shouldArchive: Boolean, + dialogState: DialogState, timestamp: Long, onMessage: (UIText) -> Unit ) { viewModelScope.launch { + val shouldArchive = dialogState.isArchived.not() requestInProgress = true - val result = - withContext(dispatcher.io()) { updateConversationArchivedStatus(conversationId, shouldArchive, timestamp) } + val result = withContext(dispatcher.io()) { updateConversationArchivedStatus(conversationId, shouldArchive, timestamp) } requestInProgress = false when (result) { ArchiveStatusUpdateResult.Failure -> onMessage( diff --git a/app/src/main/kotlin/com/wire/android/ui/home/conversations/details/menu/GroupConversationDetailsBottomSheetEventsHandler.kt b/app/src/main/kotlin/com/wire/android/ui/home/conversations/details/menu/GroupConversationDetailsBottomSheetEventsHandler.kt index c81fcabb27e..7a3950fe786 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/conversations/details/menu/GroupConversationDetailsBottomSheetEventsHandler.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/conversations/details/menu/GroupConversationDetailsBottomSheetEventsHandler.kt @@ -32,8 +32,7 @@ interface GroupConversationDetailsBottomSheetEventsHandler { fun onAddConversationToFavourites(conversationId: ConversationId? = null) fun onMoveConversationToFolder(conversationId: ConversationId? = null) fun updateConversationArchiveStatus( - conversationId: ConversationId, - shouldArchive: Boolean, + dialogState: DialogState, timestamp: Long = DateTimeUtil.currentInstant().toEpochMilliseconds(), onMessage: (UIText) -> Unit ) @@ -53,8 +52,7 @@ interface GroupConversationDetailsBottomSheetEventsHandler { override fun onAddConversationToFavourites(conversationId: ConversationId?) {} override fun onMoveConversationToFolder(conversationId: ConversationId?) {} override fun updateConversationArchiveStatus( - conversationId: ConversationId, - shouldArchive: Boolean, + dialogState: DialogState, timestamp: Long, onMessage: (UIText) -> Unit ) { diff --git a/app/src/main/kotlin/com/wire/android/ui/home/conversationslist/ConversationListViewModel.kt b/app/src/main/kotlin/com/wire/android/ui/home/conversationslist/ConversationListViewModel.kt index f8ec9dcb98d..4b511ff7522 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/conversationslist/ConversationListViewModel.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/conversationslist/ConversationListViewModel.kt @@ -93,7 +93,6 @@ import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.scan import kotlinx.coroutines.launch -import kotlinx.coroutines.withContext import java.util.Date import javax.inject.Inject @@ -323,7 +322,7 @@ class ConversationListViewModel @Inject constructor( } fun blockUser(blockUserState: BlockUserDialogState) { - viewModelScope.launch(dispatcher.io()) { + viewModelScope.launch { requestInProgress = true val state = when (val result = blockUserUseCase(blockUserState.userId)) { BlockUserResult.Success -> { @@ -342,7 +341,7 @@ class ConversationListViewModel @Inject constructor( } fun unblockUser(userId: UserId) { - viewModelScope.launch(dispatcher.io()) { + viewModelScope.launch { requestInProgress = true when (val result = unblockUserUseCase(userId)) { UnblockUserResult.Success -> { @@ -362,11 +361,7 @@ class ConversationListViewModel @Inject constructor( fun leaveGroup(leaveGroupState: GroupDialogState) { viewModelScope.launch { requestInProgress = true - val response = withContext(dispatcher.io()) { - leaveConversation( - leaveGroupState.conversationId - ) - } + val response = leaveConversation(leaveGroupState.conversationId) when (response) { is RemoveMemberFromConversationUseCase.Result.Failure -> homeSnackBarState.emit(HomeSnackbarState.LeaveConversationError) @@ -382,7 +377,7 @@ class ConversationListViewModel @Inject constructor( fun deleteGroup(groupDialogState: GroupDialogState) { viewModelScope.launch { requestInProgress = true - when (withContext(dispatcher.io()) { deleteTeamConversation(groupDialogState.conversationId) }) { + when (deleteTeamConversation(groupDialogState.conversationId)) { is Result.Failure.GenericFailure -> homeSnackBarState.emit(HomeSnackbarState.DeleteConversationGroupError) Result.Failure.NoTeamFailure -> homeSnackBarState.emit(HomeSnackbarState.DeleteConversationGroupError) Result.Success -> homeSnackBarState.emit( @@ -415,32 +410,30 @@ class ConversationListViewModel @Inject constructor( fun moveConversationToFolder(id: String = "") { } - fun moveConversationToArchive( - conversationId: ConversationId, - isArchiving: Boolean, - timestamp: Long = DateTimeUtil.currentInstant().toEpochMilliseconds() - ) { - viewModelScope.launch { - requestInProgress = true - val result = withContext(dispatcher.io()) { updateConversationArchivedStatus(conversationId, isArchiving, timestamp) } - requestInProgress = false - when (result) { - is ArchiveStatusUpdateResult.Failure -> { - homeSnackBarState.emit(HomeSnackbarState.UpdateArchivingStatusError(isArchiving)) - } + fun moveConversationToArchive(dialogState: DialogState, timestamp: Long = DateTimeUtil.currentInstant().toEpochMilliseconds()) = + with(dialogState) { + viewModelScope.launch { + val isArchiving = !isArchived + requestInProgress = true + val result = updateConversationArchivedStatus(conversationId, isArchiving, timestamp) + requestInProgress = false + when (result) { + is ArchiveStatusUpdateResult.Failure -> { + homeSnackBarState.emit(HomeSnackbarState.UpdateArchivingStatusError(isArchiving)) + } - is ArchiveStatusUpdateResult.Success -> { - homeSnackBarState.emit(HomeSnackbarState.UpdateArchivingStatusSuccess(isArchiving)) + is ArchiveStatusUpdateResult.Success -> { + homeSnackBarState.emit(HomeSnackbarState.UpdateArchivingStatusSuccess(isArchiving)) + } } } } - } fun clearConversationContent(dialogState: DialogState) { viewModelScope.launch { requestInProgress = true with(dialogState) { - val result = withContext(dispatcher.io()) { clearConversationContentUseCase(conversationId) } + val result = clearConversationContentUseCase(conversationId) requestInProgress = false clearContentSnackbarResult(result, conversationTypeDetail) } diff --git a/app/src/main/kotlin/com/wire/android/ui/home/conversationslist/ConversationRouter.kt b/app/src/main/kotlin/com/wire/android/ui/home/conversationslist/ConversationRouter.kt index 7709e7f7b17..49fa82ab500 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/conversationslist/ConversationRouter.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/conversationslist/ConversationRouter.kt @@ -36,6 +36,7 @@ import com.wire.android.ui.calling.common.MicrophoneBTPermissionsDeniedDialog import com.wire.android.ui.common.bottomsheet.conversation.ConversationOptionNavigation import com.wire.android.ui.common.bottomsheet.conversation.ConversationSheetContent import com.wire.android.ui.common.bottomsheet.conversation.rememberConversationSheetState +import com.wire.android.ui.common.dialogs.ArchiveConversationDialog import com.wire.android.ui.common.dialogs.BlockUserDialogContent import com.wire.android.ui.common.dialogs.BlockUserDialogState import com.wire.android.ui.common.dialogs.UnblockUserDialogContent @@ -155,13 +156,7 @@ fun ConversationRouterHomeBridge( }, addConversationToFavourites = viewModel::addConversationToFavourites, moveConversationToFolder = viewModel::moveConversationToFolder, - updateConversationArchiveStatus = { - viewModel.moveConversationToArchive( - conversationId = it.conversationId, - isArchiving = !it.isArchived - ) - onCloseBottomSheet() - }, + updateConversationArchiveStatus = archiveConversationDialogState::show, clearConversationContent = clearContentDialogState::show, blockUser = blockUserDialogState::show, unblockUser = unblockUserDialogState::show, @@ -281,6 +276,11 @@ fun ConversationRouterHomeBridge( onClearConversationContent = viewModel::clearConversationContent ) + ArchiveConversationDialog( + dialogState = archiveConversationDialogState, + onArchiveButtonClicked = viewModel::moveConversationToArchive + ) + BackHandler(conversationItemType == ConversationItemType.SEARCH) { closeSearch() } @@ -295,6 +295,7 @@ class ConversationRouterState( val blockUserDialogState: VisibilityState, val unblockUserDialogState: VisibilityState, val clearContentDialogState: VisibilityState, + val archiveConversationDialogState: VisibilityState, requestInProgress: Boolean ) { @@ -326,6 +327,7 @@ fun rememberConversationRouterState( val blockUserDialogState = rememberVisibilityState() val unblockUserDialogState = rememberVisibilityState() val clearContentDialogState = rememberVisibilityState() + val archiveConversationDialogState = rememberVisibilityState() LaunchedEffect(Unit) { homeSnackBarState.collect { onSnackBarStateChanged(it) } @@ -343,7 +345,8 @@ fun rememberConversationRouterState( blockUserDialogState, unblockUserDialogState, clearContentDialogState, - requestInProgress + archiveConversationDialogState, + requestInProgress, ) } @@ -354,6 +357,7 @@ fun rememberConversationRouterState( blockUserDialogState.dismiss() unblockUserDialogState.dismiss() clearContentDialogState.dismiss() + archiveConversationDialogState.dismiss() } conversationRouterState.requestInProgress = requestInProgress diff --git a/app/src/main/kotlin/com/wire/android/ui/userprofile/other/OtherUserProfileScreen.kt b/app/src/main/kotlin/com/wire/android/ui/userprofile/other/OtherUserProfileScreen.kt index 3ab61983037..db7eab12d80 100644 --- a/app/src/main/kotlin/com/wire/android/ui/userprofile/other/OtherUserProfileScreen.kt +++ b/app/src/main/kotlin/com/wire/android/ui/userprofile/other/OtherUserProfileScreen.kt @@ -181,6 +181,7 @@ fun OtherProfileScreenContent( val unblockUserDialogState = rememberVisibilityState() val removeMemberDialogState = rememberVisibilityState() val clearConversationDialogState = rememberVisibilityState() + val archivingConversationDialogState = rememberVisibilityState() val getBottomSheetVisibility: () -> Boolean = remember(sheetState) { { sheetState.isVisible } } val bottomSheetState = remember { OtherUserBottomSheetState() } bottomSheetState.setContents(state.conversationSheetContent, state.groupState) @@ -234,6 +235,7 @@ fun OtherProfileScreenContent( unblockUserDialogState.dismiss() removeMemberDialogState.dismiss() clearConversationDialogState.dismiss() + archivingConversationDialogState.dismiss() } CollapsingTopBarScaffold( @@ -283,6 +285,7 @@ fun OtherProfileScreenContent( blockUser = blockUserDialogState::show, unblockUser = unblockUserDialogState::show, clearContent = clearConversationDialogState::show, + archivingStatusState = archivingConversationDialogState::show, closeBottomSheet = closeBottomSheet, ) } diff --git a/app/src/main/kotlin/com/wire/android/ui/userprofile/other/bottomsheet/OtherUserProfileBottomSheet.kt b/app/src/main/kotlin/com/wire/android/ui/userprofile/other/bottomsheet/OtherUserProfileBottomSheet.kt index f1f2b94f81d..7c5725b1020 100644 --- a/app/src/main/kotlin/com/wire/android/ui/userprofile/other/bottomsheet/OtherUserProfileBottomSheet.kt +++ b/app/src/main/kotlin/com/wire/android/ui/userprofile/other/bottomsheet/OtherUserProfileBottomSheet.kt @@ -33,6 +33,7 @@ fun OtherUserProfileBottomSheetContent( bottomSheetState: OtherUserBottomSheetState, eventsHandler: OtherUserProfileBottomSheetEventsHandler, clearContent: (DialogState) -> Unit, + archivingStatusState: (DialogState) -> Unit, blockUser: (BlockUserDialogState) -> Unit, unblockUser: (UnblockUserDialogState) -> Unit, closeBottomSheet: () -> Unit, @@ -54,10 +55,11 @@ fun OtherUserProfileBottomSheetContent( addConversationToFavourites = eventsHandler::onAddConversationToFavourites, moveConversationToFolder = eventsHandler::onMoveConversationToFolder, updateConversationArchiveStatus = { - eventsHandler.onMoveConversationToArchive( - conversationId = it.conversationId, - isArchivingConversation = !it.isArchived - ) + if (!it.isArchived) { + archivingStatusState(it) + } else { + eventsHandler.onMoveConversationToArchive(it.conversationId, isArchivingConversation = false) + } }, clearConversationContent = clearContent, blockUser = blockUser, diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 275fdfa3e8c..df9a75d4d3c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -726,10 +726,14 @@ User could not be unblocked There was an error while deleting conversation You can only send up to 20 files at once + Conversation was archived Conversation was unarchived Conversation could not be archived Conversation could not be unarchived + Archive conversation? + The conversation will be moved to the archive section. You can still participate in the conversation and receive new activity, but the group will be muted. You can un-archive the conversation any time. + Archive MessageComposeInputState transition HorizontalBouncingWritingPen transition diff --git a/app/src/test/kotlin/com/wire/android/ui/home/conversations/details/GroupConversationDetailsViewModelTest.kt b/app/src/test/kotlin/com/wire/android/ui/home/conversations/details/GroupConversationDetailsViewModelTest.kt index 29bec253ee8..cdfb6dcc203 100644 --- a/app/src/test/kotlin/com/wire/android/ui/home/conversations/details/GroupConversationDetailsViewModelTest.kt +++ b/app/src/test/kotlin/com/wire/android/ui/home/conversations/details/GroupConversationDetailsViewModelTest.kt @@ -31,6 +31,7 @@ import com.wire.android.ui.common.bottomsheet.conversation.ConversationTypeDetai import com.wire.android.ui.home.conversations.details.participants.GroupConversationAllParticipantsNavArgs import com.wire.android.ui.home.conversations.details.participants.model.ConversationParticipantsData import com.wire.android.ui.home.conversations.details.participants.usecase.ObserveParticipantsForConversationUseCase +import com.wire.android.ui.home.conversationslist.model.DialogState import com.wire.android.ui.navArgs import com.wire.kalium.logic.data.conversation.Conversation import com.wire.kalium.logic.data.conversation.ConversationDetails @@ -138,8 +139,17 @@ class GroupConversationDetailsViewModelTest { participants = members.take(GroupConversationDetailsViewModel.MAX_NUMBER_OF_PARTICIPANTS), allParticipantsCount = members.size ) - val conversationDetails = testGroup.copy(conversation = testGroup.conversation.copy(name = "Group name 1")) + val dialogState = DialogState( + conversationId = conversationDetails.conversation.id, + conversationName = conversationDetails.conversation.name.orEmpty(), + conversationTypeDetail = ConversationTypeDetail.Group( + conversationId = conversationDetails.conversation.id, + isCreator = conversationDetails.isSelfUserCreator + ), + isArchived = conversationDetails.conversation.archived + ) + val (arrangement, viewModel) = GroupConversationDetailsViewModelArrangement() .withConversationDetailUpdate(conversationDetails) .withConversationMembersUpdate(conversationParticipantsData) @@ -148,16 +158,15 @@ class GroupConversationDetailsViewModelTest { // When viewModel.updateConversationArchiveStatus( - conversationId = viewModel.conversationId, - shouldArchive = true, + dialogState = dialogState, timestamp = archivingEventTimestamp - ) {} + ) { } // Then coVerify(exactly = 1) { arrangement.updateConversationArchivedStatus( conversationId = viewModel.conversationId, - shouldArchiveConversation = true, + shouldArchiveConversation = !conversationDetails.conversation.archived, archivedStatusTimestamp = archivingEventTimestamp ) } @@ -177,7 +186,17 @@ class GroupConversationDetailsViewModelTest { allParticipantsCount = members.size ) - val conversationDetails = testGroup.copy(conversation = testGroup.conversation.copy(name = "Group name 1")) + val conversationDetails = testGroup.copy(conversation = testGroup.conversation.copy(name = "Group name 1", archived = true)) + val dialogState = DialogState( + conversationId = conversationDetails.conversation.id, + conversationName = conversationDetails.conversation.name.orEmpty(), + conversationTypeDetail = ConversationTypeDetail.Group( + conversationId = conversationDetails.conversation.id, + isCreator = conversationDetails.isSelfUserCreator + ), + isArchived = conversationDetails.conversation.archived + ) + val (arrangement, viewModel) = GroupConversationDetailsViewModelArrangement() .withConversationDetailUpdate(conversationDetails) .withConversationMembersUpdate(conversationParticipantsData) @@ -185,7 +204,10 @@ class GroupConversationDetailsViewModelTest { .arrange() // When - viewModel.updateConversationArchiveStatus(viewModel.conversationId, false, archivingEventTimestamp) {} + viewModel.updateConversationArchiveStatus( + dialogState = dialogState, + timestamp = archivingEventTimestamp + ) {} // Then coVerify(exactly = 1) { diff --git a/app/src/test/kotlin/com/wire/android/ui/home/conversationslist/ConversationListViewModelTest.kt b/app/src/test/kotlin/com/wire/android/ui/home/conversationslist/ConversationListViewModelTest.kt index 6bf139efa3a..336156ca679 100644 --- a/app/src/test/kotlin/com/wire/android/ui/home/conversationslist/ConversationListViewModelTest.kt +++ b/app/src/test/kotlin/com/wire/android/ui/home/conversationslist/ConversationListViewModelTest.kt @@ -28,6 +28,7 @@ import com.wire.android.config.mockUri import com.wire.android.framework.TestConversationDetails import com.wire.android.mapper.UserTypeMapper import com.wire.android.model.UserAvatarData +import com.wire.android.ui.common.bottomsheet.conversation.ConversationTypeDetail import com.wire.android.ui.common.dialogs.BlockUserDialogState import com.wire.android.ui.home.HomeSnackbarState import com.wire.android.ui.home.conversations.model.UILastMessageContent @@ -37,6 +38,7 @@ import com.wire.android.ui.home.conversationslist.model.ConversationFolder import com.wire.android.ui.home.conversationslist.model.ConversationInfo import com.wire.android.ui.home.conversationslist.model.ConversationItem import com.wire.android.ui.home.conversationslist.model.ConversationsSource +import com.wire.android.ui.home.conversationslist.model.DialogState import com.wire.android.ui.home.conversationslist.model.Membership import com.wire.android.util.orDefault import com.wire.android.util.ui.WireSessionImageLoader @@ -331,27 +333,53 @@ class ConversationListViewModelTest { @Test fun `given a valid conversation state, when archiving it correctly, then the right success message is shown`() = runTest { val isArchiving = true + val dialogState = DialogState( + conversationItem.conversationId, + conversationItem.conversationInfo.name, + ConversationTypeDetail.Private(null, conversationItem.userId, BlockingState.NOT_BLOCKED), + !isArchiving + ) val archivingTimestamp = 123456789L coEvery { updateConversationArchivedStatus(any(), any(), any()) } returns ArchiveStatusUpdateResult.Success conversationListViewModel.homeSnackBarState.test { - conversationListViewModel.moveConversationToArchive(conversationId, isArchiving, archivingTimestamp) + conversationListViewModel.moveConversationToArchive(dialogState, archivingTimestamp) expectMostRecentItem() shouldBeEqualTo HomeSnackbarState.UpdateArchivingStatusSuccess(isArchiving = isArchiving) } + coVerify(exactly = 1) { + updateConversationArchivedStatus.invoke( + dialogState.conversationId, + !dialogState.isArchived, + archivingTimestamp + ) + } } @Test - fun `given a valid conversation state, when archiving it with an error, then the right failure message is shown`() = runTest { - val isArchiving = true + fun `given a valid conversation state, when un-archiving it with an error, then the right failure message is shown`() = runTest { + val isArchiving = false + val dialogState = DialogState( + conversationItem.conversationId, + conversationItem.conversationInfo.name, + ConversationTypeDetail.Private(null, conversationItem.userId, BlockingState.NOT_BLOCKED), + !isArchiving + ) val archivingTimestamp = 123456789L coEvery { updateConversationArchivedStatus(any(), any(), any()) } returns ArchiveStatusUpdateResult.Failure conversationListViewModel.homeSnackBarState.test { - conversationListViewModel.moveConversationToArchive(conversationId, isArchiving, archivingTimestamp) + conversationListViewModel.moveConversationToArchive(dialogState, archivingTimestamp) expectMostRecentItem() shouldBeEqualTo HomeSnackbarState.UpdateArchivingStatusError(isArchiving = isArchiving) } + coVerify(exactly = 1) { + updateConversationArchivedStatus.invoke( + dialogState.conversationId, + !dialogState.isArchived, + archivingTimestamp + ) + } } companion object { @@ -363,7 +391,7 @@ class ConversationListViewModelTest { private val conversationItem = ConversationItem.PrivateConversation( userAvatarData = UserAvatarData(), conversationInfo = ConversationInfo( - name = "", + name = "Some dummy name", membership = Membership.None ), conversationId = conversationId, diff --git a/kalium b/kalium index 751cd750a5e..1f49504c634 160000 --- a/kalium +++ b/kalium @@ -1 +1 @@ -Subproject commit 751cd750a5e0430a9556369336a5de1168065d9b +Subproject commit 1f49504c6341c017789630fc85c783390d8c1aa2