From 5a1d78af98dd553b2bb7394ec9c8a27e1878d61b Mon Sep 17 00:00:00 2001 From: yamilmedina Date: Mon, 30 Jun 2025 15:39:43 +0200 Subject: [PATCH 01/11] feat: add team management access from main navigation --- .../android/navigation/HomeDestination.kt | 12 +++++- .../android/navigation/OtherDestinations.kt | 2 + .../wire/android/ui/home/drawer/HomeDrawer.kt | 39 ++++++++++++++++++- .../android/ui/home/drawer/HomeDrawerState.kt | 3 ++ .../ui/home/drawer/HomeDrawerViewModel.kt | 28 +++++++++++++ .../userprofile/self/SelfUserProfileScreen.kt | 1 + .../main/res/drawable/ic_team_management.xml | 10 +++++ app/src/main/res/values/strings.xml | 1 + 8 files changed, 93 insertions(+), 3 deletions(-) create mode 100644 app/src/main/res/drawable/ic_team_management.xml diff --git a/app/src/main/kotlin/com/wire/android/navigation/HomeDestination.kt b/app/src/main/kotlin/com/wire/android/navigation/HomeDestination.kt index ab739bdc84a..807c4295be2 100644 --- a/app/src/main/kotlin/com/wire/android/navigation/HomeDestination.kt +++ b/app/src/main/kotlin/com/wire/android/navigation/HomeDestination.kt @@ -20,6 +20,7 @@ package com.wire.android.navigation import androidx.annotation.DrawableRes import androidx.annotation.StringRes +import androidx.core.net.toUri import com.ramcosta.composedestinations.spec.Direction import com.wire.android.R import com.wire.android.ui.destinations.AllConversationsScreenDestination @@ -38,6 +39,7 @@ sealed class HomeDestination( val withUserAvatar: Boolean = true, val direction: Direction, val searchBar: SearchBarOptions? = null, + val isExternalDestination: Boolean = false ) { data object Conversations : HomeDestination( title = UIText.StringResource(R.string.conversations_screen_title), @@ -70,7 +72,8 @@ sealed class HomeDestination( data object Support : HomeDestination( title = UIText.StringResource(R.string.support_screen_title), icon = R.drawable.ic_support, - direction = SupportScreenDestination + direction = SupportScreenDestination, + isExternalDestination = true ) data object WhatsNew : HomeDestination( @@ -79,6 +82,13 @@ sealed class HomeDestination( direction = WhatsNewScreenDestination ) + data class TeamManagement(val teamUrl: String) : HomeDestination( + title = UIText.StringResource(R.string.team_management_screen_title), + icon = R.drawable.ic_team_management, + direction = TeamManagementScreenDestination(uri = teamUrl.toUri()), + isExternalDestination = true + ) + data object Cells : HomeDestination( title = UIText.StringResource(R.string.cells_screen_title), icon = R.drawable.ic_files, diff --git a/app/src/main/kotlin/com/wire/android/navigation/OtherDestinations.kt b/app/src/main/kotlin/com/wire/android/navigation/OtherDestinations.kt index 1ed00dd158e..e347b9eac0d 100644 --- a/app/src/main/kotlin/com/wire/android/navigation/OtherDestinations.kt +++ b/app/src/main/kotlin/com/wire/android/navigation/OtherDestinations.kt @@ -57,6 +57,8 @@ object SupportScreenDestination : ExternalUriStringResDirection { get() = R.string.url_support } +data class TeamManagementScreenDestination(override val uri: Uri) : ExternalUriDirection + object PrivacyPolicyScreenDestination : ExternalUriStringResDirection { override val uriStringRes: Int get() = R.string.url_privacy_policy diff --git a/app/src/main/kotlin/com/wire/android/ui/home/drawer/HomeDrawer.kt b/app/src/main/kotlin/com/wire/android/ui/home/drawer/HomeDrawer.kt index a88d34ee64f..8a805be86b0 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/drawer/HomeDrawer.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/drawer/HomeDrawer.kt @@ -27,8 +27,12 @@ import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.filled.OpenInNew +import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable @@ -46,6 +50,7 @@ import androidx.compose.ui.unit.dp import com.wire.android.R import com.wire.android.navigation.HomeDestination import com.wire.android.ui.common.Logo +import com.wire.android.ui.common.colorsScheme import com.wire.android.ui.common.dimensions import com.wire.android.ui.common.selectableBackground import com.wire.android.ui.common.spacers.HorizontalSpace @@ -109,12 +114,19 @@ fun HomeDrawer( Spacer(modifier = Modifier.weight(1f)) - val bottomItems = listOf(HomeDestination.WhatsNew, HomeDestination.Settings, HomeDestination.Support) + val bottomItems = buildList { + add(HomeDestination.WhatsNew) + add(HomeDestination.Settings) + if (homeDrawerState.teamManagementUrl.isNotBlank()) add(HomeDestination.TeamManagement(homeDrawerState.teamManagementUrl)) + add(HomeDestination.Support) + } + bottomItems.forEach { item -> DrawerItem( destination = item, selected = currentRoute == item.direction.route, - onItemClick = remember { { navigateAndCloseDrawer(item) } } + onItemClick = remember { { navigateAndCloseDrawer(item) } }, + isExternalDestination = item.isExternalDestination ) } } @@ -127,6 +139,7 @@ fun DrawerItem( onItemClick: () -> Unit, modifier: Modifier = Modifier, unreadCount: Int = 0, + isExternalDestination: Boolean = false ) { val backgroundColor = if (selected) MaterialTheme.colorScheme.primary else Color.Transparent val contentColor = if (selected) MaterialTheme.colorScheme.onPrimary else MaterialTheme.colorScheme.onBackground @@ -157,6 +170,15 @@ fun DrawerItem( .weight(1F) ) UnreadMessageEventBadge(unreadMessageCount = unreadCount) + if (isExternalDestination) { + HorizontalSpace.x8() + Icon( + imageVector = Icons.AutoMirrored.Filled.OpenInNew, + contentDescription = null, + tint = colorsScheme().secondaryText, + modifier = Modifier.size(dimensions().spacing16x) + ) + } HorizontalSpace.x12() } } @@ -186,3 +208,16 @@ fun PreviewUnSelectedArchivedItemWithUnreadCount() { ) } } + +@PreviewMultipleThemes +@Composable +fun PreviewItemWithExternalDestination() { + Box(modifier = Modifier.background(color = MaterialTheme.colorScheme.surface)) { + DrawerItem( + destination = HomeDestination.Archive, + selected = false, + onItemClick = {}, + isExternalDestination = true + ) + } +} diff --git a/app/src/main/kotlin/com/wire/android/ui/home/drawer/HomeDrawerState.kt b/app/src/main/kotlin/com/wire/android/ui/home/drawer/HomeDrawerState.kt index 56d17e9b60d..da9194999ca 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/drawer/HomeDrawerState.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/drawer/HomeDrawerState.kt @@ -18,7 +18,10 @@ package com.wire.android.ui.home.drawer +import com.wire.android.util.EMPTY + data class HomeDrawerState( val unreadArchiveConversationsCount: Int, val showFilesOption: Boolean, + val teamManagementUrl: String = String.EMPTY ) diff --git a/app/src/main/kotlin/com/wire/android/ui/home/drawer/HomeDrawerViewModel.kt b/app/src/main/kotlin/com/wire/android/ui/home/drawer/HomeDrawerViewModel.kt index d5639686f96..b7af4e1eb64 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/drawer/HomeDrawerViewModel.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/drawer/HomeDrawerViewModel.kt @@ -25,7 +25,11 @@ import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.wire.android.datastore.GlobalDataStore +import com.wire.android.util.EMPTY +import com.wire.kalium.logic.data.user.type.UserType import com.wire.kalium.logic.feature.conversation.ObserveArchivedUnreadConversationsCountUseCase +import com.wire.kalium.logic.feature.server.GetTeamUrlUseCase +import com.wire.kalium.logic.feature.user.ObserveSelfUserUseCase import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.launch import javax.inject.Inject @@ -35,6 +39,8 @@ import javax.inject.Inject class HomeDrawerViewModel @Inject constructor( val savedStateHandle: SavedStateHandle, private val observeArchivedUnreadConversationsCountUseCase: ObserveArchivedUnreadConversationsCountUseCase, + private val observeSelfUser: ObserveSelfUserUseCase, + private val getTeamUrl: GetTeamUrlUseCase, private val globalDataStore: GlobalDataStore, ) : ViewModel() { @@ -49,6 +55,28 @@ class HomeDrawerViewModel @Inject constructor( init { observeUnreadArchiveConversationsCount() observeWireCellsFeatureState() + observeTeamManagementUrlForUser() + } + + private fun observeTeamManagementUrlForUser() = viewModelScope.launch { + observeSelfUser().collect { + when (it.userType) { + UserType.ADMIN, + UserType.OWNER -> { + val teamManagementUrl = getTeamUrl() + drawerState = drawerState.copy(teamManagementUrl = teamManagementUrl) + } + + UserType.INTERNAL, + UserType.EXTERNAL, + UserType.FEDERATED, + UserType.GUEST, + UserType.SERVICE, + UserType.NONE -> { + drawerState = drawerState.copy(teamManagementUrl = String.EMPTY) + } + } + } } private fun observeWireCellsFeatureState() = viewModelScope.launch { diff --git a/app/src/main/kotlin/com/wire/android/ui/userprofile/self/SelfUserProfileScreen.kt b/app/src/main/kotlin/com/wire/android/ui/userprofile/self/SelfUserProfileScreen.kt index 03ad9063f5a..be5b5ba7288 100644 --- a/app/src/main/kotlin/com/wire/android/ui/userprofile/self/SelfUserProfileScreen.kt +++ b/app/src/main/kotlin/com/wire/android/ui/userprofile/self/SelfUserProfileScreen.kt @@ -578,6 +578,7 @@ fun PersonalSelfUserProfileScreenPreview() { fullName = "Some User", userName = "some-user", teamName = null, + teamUrl = "some-url", otherAccounts = listOf( OtherAccount( id = UserId("id1", "domain"), diff --git a/app/src/main/res/drawable/ic_team_management.xml b/app/src/main/res/drawable/ic_team_management.xml new file mode 100644 index 00000000000..db7a8c027af --- /dev/null +++ b/app/src/main/res/drawable/ic_team_management.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 3a7e88dc95c..86a9fbebd21 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -318,6 +318,7 @@ Back up & Restore Conversations Search conversations No matches found + Team Management What\'s new 👋 Welcome to Wire\'s New Android App! From 32980ae8ce4e493c07b8ea70094537c1fe376980 Mon Sep 17 00:00:00 2001 From: yamilmedina Date: Mon, 30 Jun 2025 15:54:25 +0200 Subject: [PATCH 02/11] feat: add team management access from main navigation, remove param --- .../android/navigation/HomeDestination.kt | 7 ++--- .../wire/android/ui/home/drawer/HomeDrawer.kt | 27 ++++++++++--------- 2 files changed, 16 insertions(+), 18 deletions(-) diff --git a/app/src/main/kotlin/com/wire/android/navigation/HomeDestination.kt b/app/src/main/kotlin/com/wire/android/navigation/HomeDestination.kt index 807c4295be2..76804c39aa2 100644 --- a/app/src/main/kotlin/com/wire/android/navigation/HomeDestination.kt +++ b/app/src/main/kotlin/com/wire/android/navigation/HomeDestination.kt @@ -39,7 +39,6 @@ sealed class HomeDestination( val withUserAvatar: Boolean = true, val direction: Direction, val searchBar: SearchBarOptions? = null, - val isExternalDestination: Boolean = false ) { data object Conversations : HomeDestination( title = UIText.StringResource(R.string.conversations_screen_title), @@ -72,8 +71,7 @@ sealed class HomeDestination( data object Support : HomeDestination( title = UIText.StringResource(R.string.support_screen_title), icon = R.drawable.ic_support, - direction = SupportScreenDestination, - isExternalDestination = true + direction = SupportScreenDestination ) data object WhatsNew : HomeDestination( @@ -85,8 +83,7 @@ sealed class HomeDestination( data class TeamManagement(val teamUrl: String) : HomeDestination( title = UIText.StringResource(R.string.team_management_screen_title), icon = R.drawable.ic_team_management, - direction = TeamManagementScreenDestination(uri = teamUrl.toUri()), - isExternalDestination = true + direction = TeamManagementScreenDestination(uri = teamUrl.toUri()) ) data object Cells : HomeDestination( diff --git a/app/src/main/kotlin/com/wire/android/ui/home/drawer/HomeDrawer.kt b/app/src/main/kotlin/com/wire/android/ui/home/drawer/HomeDrawer.kt index 8a805be86b0..8292a66763c 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/drawer/HomeDrawer.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/drawer/HomeDrawer.kt @@ -48,6 +48,8 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import com.wire.android.R +import com.wire.android.navigation.ExternalUriDirection +import com.wire.android.navigation.ExternalUriStringResDirection import com.wire.android.navigation.HomeDestination import com.wire.android.ui.common.Logo import com.wire.android.ui.common.colorsScheme @@ -125,8 +127,7 @@ fun HomeDrawer( DrawerItem( destination = item, selected = currentRoute == item.direction.route, - onItemClick = remember { { navigateAndCloseDrawer(item) } }, - isExternalDestination = item.isExternalDestination + onItemClick = remember { { navigateAndCloseDrawer(item) } } ) } } @@ -139,7 +140,6 @@ fun DrawerItem( onItemClick: () -> Unit, modifier: Modifier = Modifier, unreadCount: Int = 0, - isExternalDestination: Boolean = false ) { val backgroundColor = if (selected) MaterialTheme.colorScheme.primary else Color.Transparent val contentColor = if (selected) MaterialTheme.colorScheme.onPrimary else MaterialTheme.colorScheme.onBackground @@ -170,14 +170,16 @@ fun DrawerItem( .weight(1F) ) UnreadMessageEventBadge(unreadMessageCount = unreadCount) - if (isExternalDestination) { - HorizontalSpace.x8() - Icon( - imageVector = Icons.AutoMirrored.Filled.OpenInNew, - contentDescription = null, - tint = colorsScheme().secondaryText, - modifier = Modifier.size(dimensions().spacing16x) - ) + with(destination) { + if (direction is ExternalUriDirection || direction is ExternalUriStringResDirection) { + HorizontalSpace.x8() + Icon( + imageVector = Icons.AutoMirrored.Filled.OpenInNew, + contentDescription = null, + tint = colorsScheme().secondaryText, + modifier = Modifier.size(dimensions().spacing16x) + ) + } } HorizontalSpace.x12() } @@ -214,10 +216,9 @@ fun PreviewUnSelectedArchivedItemWithUnreadCount() { fun PreviewItemWithExternalDestination() { Box(modifier = Modifier.background(color = MaterialTheme.colorScheme.surface)) { DrawerItem( - destination = HomeDestination.Archive, + destination = HomeDestination.Support, selected = false, onItemClick = {}, - isExternalDestination = true ) } } From 815d1dee9b3d5cc5f113fa3869280c3815356b78 Mon Sep 17 00:00:00 2001 From: yamilmedina Date: Mon, 30 Jun 2025 16:30:07 +0200 Subject: [PATCH 03/11] feat: add team management access from main navigation, test cov --- .../ui/home/drawer/HomeDrawerViewModelTest.kt | 41 ++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/app/src/test/kotlin/com/wire/android/ui/home/drawer/HomeDrawerViewModelTest.kt b/app/src/test/kotlin/com/wire/android/ui/home/drawer/HomeDrawerViewModelTest.kt index 7c7e084c3a2..a93d6e37a9e 100644 --- a/app/src/test/kotlin/com/wire/android/ui/home/drawer/HomeDrawerViewModelTest.kt +++ b/app/src/test/kotlin/com/wire/android/ui/home/drawer/HomeDrawerViewModelTest.kt @@ -21,7 +21,12 @@ import androidx.lifecycle.SavedStateHandle import com.wire.android.config.CoroutineTestExtension import com.wire.android.config.NavigationTestExtension import com.wire.android.datastore.GlobalDataStore +import com.wire.android.framework.TestUser +import com.wire.android.util.EMPTY +import com.wire.kalium.logic.data.user.type.UserType import com.wire.kalium.logic.feature.conversation.ObserveArchivedUnreadConversationsCountUseCase +import com.wire.kalium.logic.feature.server.GetTeamUrlUseCase +import com.wire.kalium.logic.feature.user.ObserveSelfUserUseCase import io.mockk.MockKAnnotations import io.mockk.coEvery import io.mockk.every @@ -55,6 +60,21 @@ class HomeDrawerViewModelTest { // Then assertEquals(unreadCount.toInt(), viewModel.drawerState.unreadArchiveConversationsCount) + assertEquals(String.EMPTY, viewModel.drawerState.teamManagementUrl) + } + + @Test + fun `given userIsAdmin, when starts observing, then set team url`() = runTest { + // Given + val (_, viewModel) = Arrangement() + .withSelfUserType(UserType.ADMIN) + .arrange() + + // When + advanceUntilIdle() + + // Then + assertEquals(Arrangement.TEAM_URL, viewModel.drawerState.teamManagementUrl) } private class Arrangement { @@ -68,18 +88,37 @@ class HomeDrawerViewModelTest { @MockK lateinit var globalDataStore: GlobalDataStore + @MockK + lateinit var observeSelfUserUseCase: ObserveSelfUserUseCase + + @MockK + lateinit var getTeamUrlUseCase: GetTeamUrlUseCase + val unreadArchivedConversationsCountChannel = Channel(capacity = Channel.UNLIMITED) init { MockKAnnotations.init(this, relaxUnitFun = true) coEvery { observeArchivedUnreadConversationsCount() } returns unreadArchivedConversationsCountChannel.consumeAsFlow() every { globalDataStore.wireCellsEnabled() } returns flowOf(false) + every { globalDataStore.wireCellsEnabled() } returns flowOf(false) + withSelfUserType() + coEvery { getTeamUrlUseCase() } returns TEAM_URL + } + + fun withSelfUserType(type: UserType = UserType.INTERNAL) = apply { + coEvery { observeSelfUserUseCase() } returns flowOf(TestUser.SELF_USER.copy(userType = type)) } fun arrange() = this to HomeDrawerViewModel( savedStateHandle = savedStateHandle, observeArchivedUnreadConversationsCountUseCase = observeArchivedUnreadConversationsCount, - globalDataStore = globalDataStore + globalDataStore = globalDataStore, + observeSelfUser = observeSelfUserUseCase, + getTeamUrl = getTeamUrlUseCase ) + + companion object { + const val TEAM_URL = "some-url" + } } } From 0a81b68c1c28e1c5d3664c365f5d0b7b2a27ce69 Mon Sep 17 00:00:00 2001 From: yamilmedina Date: Tue, 1 Jul 2025 14:44:17 +0200 Subject: [PATCH 04/11] feat: overriding the action --- .../android/navigation/HomeDestination.kt | 6 +++--- .../android/navigation/OtherDestinations.kt | 10 ++++++++- .../wire/android/ui/home/drawer/HomeDrawer.kt | 21 ++++++++++++++++--- .../android/ui/home/drawer/HomeDrawerState.kt | 4 +--- .../ui/home/drawer/HomeDrawerViewModel.kt | 1 + 5 files changed, 32 insertions(+), 10 deletions(-) diff --git a/app/src/main/kotlin/com/wire/android/navigation/HomeDestination.kt b/app/src/main/kotlin/com/wire/android/navigation/HomeDestination.kt index 76804c39aa2..9240b3dce1a 100644 --- a/app/src/main/kotlin/com/wire/android/navigation/HomeDestination.kt +++ b/app/src/main/kotlin/com/wire/android/navigation/HomeDestination.kt @@ -80,10 +80,10 @@ sealed class HomeDestination( direction = WhatsNewScreenDestination ) - data class TeamManagement(val teamUrl: String) : HomeDestination( + data object TeamManagement : HomeDestination( title = UIText.StringResource(R.string.team_management_screen_title), icon = R.drawable.ic_team_management, - direction = TeamManagementScreenDestination(uri = teamUrl.toUri()) + direction = TeamManagementScreenDestination ) data object Cells : HomeDestination( @@ -107,6 +107,6 @@ sealed class HomeDestination( values().find { it.direction.route.getBaseRoute() == fullRoute.getBaseRoute() } fun values(): Array = - arrayOf(Conversations, Settings, Vault, Archive, Support, WhatsNew, Cells) + arrayOf(Conversations, Settings, Vault, Archive, Support, TeamManagement, WhatsNew, Cells) } } diff --git a/app/src/main/kotlin/com/wire/android/navigation/OtherDestinations.kt b/app/src/main/kotlin/com/wire/android/navigation/OtherDestinations.kt index e347b9eac0d..657e189a8fe 100644 --- a/app/src/main/kotlin/com/wire/android/navigation/OtherDestinations.kt +++ b/app/src/main/kotlin/com/wire/android/navigation/OtherDestinations.kt @@ -33,6 +33,14 @@ import com.wire.android.util.getUrisOfFilesInDirectory import com.wire.android.util.multipleFileSharingIntent import com.wire.android.util.sha256 +/** + * The route is not relevant as an action is triggered by the navigation + */ +interface ExternalDirectionLess : Direction { + override val route: String + get() = this::class.qualifiedName.orEmpty() +} + interface ExternalUriDirection : Direction { val uri: Uri override val route: String @@ -57,7 +65,7 @@ object SupportScreenDestination : ExternalUriStringResDirection { get() = R.string.url_support } -data class TeamManagementScreenDestination(override val uri: Uri) : ExternalUriDirection +data object TeamManagementScreenDestination : ExternalDirectionLess object PrivacyPolicyScreenDestination : ExternalUriStringResDirection { override val uriStringRes: Int diff --git a/app/src/main/kotlin/com/wire/android/ui/home/drawer/HomeDrawer.kt b/app/src/main/kotlin/com/wire/android/ui/home/drawer/HomeDrawer.kt index 8292a66763c..7ccac1b5293 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/drawer/HomeDrawer.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/drawer/HomeDrawer.kt @@ -43,11 +43,13 @@ import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.ColorFilter import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import com.wire.android.R +import com.wire.android.navigation.ExternalDirectionLess import com.wire.android.navigation.ExternalUriDirection import com.wire.android.navigation.ExternalUriStringResDirection import com.wire.android.navigation.HomeDestination @@ -59,6 +61,7 @@ import com.wire.android.ui.common.spacers.HorizontalSpace import com.wire.android.ui.home.conversationslist.common.UnreadMessageEventBadge import com.wire.android.ui.theme.wireDimensions import com.wire.android.ui.theme.wireTypography +import com.wire.android.util.CustomTabsHelper import com.wire.android.util.ui.PreviewMultipleThemes @Composable @@ -69,6 +72,7 @@ fun HomeDrawer( onCloseDrawer: () -> Unit, modifier: Modifier = Modifier ) { + val context = LocalContext.current Column( modifier = modifier .padding( @@ -119,7 +123,7 @@ fun HomeDrawer( val bottomItems = buildList { add(HomeDestination.WhatsNew) add(HomeDestination.Settings) - if (homeDrawerState.teamManagementUrl.isNotBlank()) add(HomeDestination.TeamManagement(homeDrawerState.teamManagementUrl)) + if (homeDrawerState.teamManagementUrl.isNotBlank()) add(HomeDestination.TeamManagement) add(HomeDestination.Support) } @@ -127,7 +131,18 @@ fun HomeDrawer( DrawerItem( destination = item, selected = currentRoute == item.direction.route, - onItemClick = remember { { navigateAndCloseDrawer(item) } } + onItemClick = when (item) { + is HomeDestination.TeamManagement -> remember { + { + CustomTabsHelper.launchUrl(context, homeDrawerState.teamManagementUrl) + onCloseDrawer() + } + } + + else -> { + remember { { navigateAndCloseDrawer(item) } } + } + } ) } } @@ -171,7 +186,7 @@ fun DrawerItem( ) UnreadMessageEventBadge(unreadMessageCount = unreadCount) with(destination) { - if (direction is ExternalUriDirection || direction is ExternalUriStringResDirection) { + if (direction is ExternalUriDirection || direction is ExternalUriStringResDirection || direction is ExternalDirectionLess) { HorizontalSpace.x8() Icon( imageVector = Icons.AutoMirrored.Filled.OpenInNew, diff --git a/app/src/main/kotlin/com/wire/android/ui/home/drawer/HomeDrawerState.kt b/app/src/main/kotlin/com/wire/android/ui/home/drawer/HomeDrawerState.kt index da9194999ca..0d02d912b5b 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/drawer/HomeDrawerState.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/drawer/HomeDrawerState.kt @@ -18,10 +18,8 @@ package com.wire.android.ui.home.drawer -import com.wire.android.util.EMPTY - data class HomeDrawerState( val unreadArchiveConversationsCount: Int, val showFilesOption: Boolean, - val teamManagementUrl: String = String.EMPTY + val teamManagementUrl: String ) diff --git a/app/src/main/kotlin/com/wire/android/ui/home/drawer/HomeDrawerViewModel.kt b/app/src/main/kotlin/com/wire/android/ui/home/drawer/HomeDrawerViewModel.kt index b7af4e1eb64..dbf4a9bd5fd 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/drawer/HomeDrawerViewModel.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/drawer/HomeDrawerViewModel.kt @@ -48,6 +48,7 @@ class HomeDrawerViewModel @Inject constructor( HomeDrawerState( unreadArchiveConversationsCount = 0, showFilesOption = false, + teamManagementUrl = "" ) ) private set From 410a3e1d5de6f029d839735b0d96309e856d66d8 Mon Sep 17 00:00:00 2001 From: yamilmedina Date: Tue, 1 Jul 2025 14:47:37 +0200 Subject: [PATCH 05/11] feat: overriding the action --- .../main/kotlin/com/wire/android/navigation/HomeDestination.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/main/kotlin/com/wire/android/navigation/HomeDestination.kt b/app/src/main/kotlin/com/wire/android/navigation/HomeDestination.kt index 9240b3dce1a..495c23514ec 100644 --- a/app/src/main/kotlin/com/wire/android/navigation/HomeDestination.kt +++ b/app/src/main/kotlin/com/wire/android/navigation/HomeDestination.kt @@ -20,7 +20,6 @@ package com.wire.android.navigation import androidx.annotation.DrawableRes import androidx.annotation.StringRes -import androidx.core.net.toUri import com.ramcosta.composedestinations.spec.Direction import com.wire.android.R import com.wire.android.ui.destinations.AllConversationsScreenDestination From 80bd5c2426a80f7238297bbe146591253ae3ccb9 Mon Sep 17 00:00:00 2001 From: yamilmedina Date: Tue, 1 Jul 2025 14:52:19 +0200 Subject: [PATCH 06/11] feat: overriding the action --- .../kotlin/com/wire/android/navigation/OtherDestinations.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/kotlin/com/wire/android/navigation/OtherDestinations.kt b/app/src/main/kotlin/com/wire/android/navigation/OtherDestinations.kt index 657e189a8fe..914ef5b9cb1 100644 --- a/app/src/main/kotlin/com/wire/android/navigation/OtherDestinations.kt +++ b/app/src/main/kotlin/com/wire/android/navigation/OtherDestinations.kt @@ -34,7 +34,7 @@ import com.wire.android.util.multipleFileSharingIntent import com.wire.android.util.sha256 /** - * The route is not relevant as an action is triggered by the navigation + * The route is not that relevant the route will not be used for navigation, it will be overridden by a direct custom tab launch. */ interface ExternalDirectionLess : Direction { override val route: String From b42df5b95a8f58d2164f45f3db8fd90cd9519256 Mon Sep 17 00:00:00 2001 From: yamilmedina Date: Tue, 1 Jul 2025 14:52:44 +0200 Subject: [PATCH 07/11] feat: overriding the action --- .../kotlin/com/wire/android/navigation/OtherDestinations.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/kotlin/com/wire/android/navigation/OtherDestinations.kt b/app/src/main/kotlin/com/wire/android/navigation/OtherDestinations.kt index 914ef5b9cb1..d34644513a8 100644 --- a/app/src/main/kotlin/com/wire/android/navigation/OtherDestinations.kt +++ b/app/src/main/kotlin/com/wire/android/navigation/OtherDestinations.kt @@ -34,7 +34,7 @@ import com.wire.android.util.multipleFileSharingIntent import com.wire.android.util.sha256 /** - * The route is not that relevant the route will not be used for navigation, it will be overridden by a direct custom tab launch. + * The route is not that relevant as won't be used for navigation, it will be overridden by a direct custom tab launch. */ interface ExternalDirectionLess : Direction { override val route: String From 00771ab29558581f3856dd7444b28288a7160baf Mon Sep 17 00:00:00 2001 From: yamilmedina Date: Wed, 2 Jul 2025 17:59:30 +0200 Subject: [PATCH 08/11] feat: pr comments, move item build to viewmodel --- .../wire/android/ui/home/drawer/HomeDrawer.kt | 92 +++++++++---------- .../android/ui/home/drawer/HomeDrawerState.kt | 7 +- .../ui/home/drawer/HomeDrawerViewModel.kt | 77 +++++++++++----- 3 files changed, 100 insertions(+), 76 deletions(-) diff --git a/app/src/main/kotlin/com/wire/android/ui/home/drawer/HomeDrawer.kt b/app/src/main/kotlin/com/wire/android/ui/home/drawer/HomeDrawer.kt index 7ccac1b5293..48f5ebd7f2e 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/drawer/HomeDrawer.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/drawer/HomeDrawer.kt @@ -47,7 +47,6 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign -import androidx.compose.ui.unit.dp import com.wire.android.R import com.wire.android.navigation.ExternalDirectionLess import com.wire.android.navigation.ExternalUriDirection @@ -61,7 +60,6 @@ import com.wire.android.ui.common.spacers.HorizontalSpace import com.wire.android.ui.home.conversationslist.common.UnreadMessageEventBadge import com.wire.android.ui.theme.wireDimensions import com.wire.android.ui.theme.wireTypography -import com.wire.android.util.CustomTabsHelper import com.wire.android.util.ui.PreviewMultipleThemes @Composable @@ -72,7 +70,6 @@ fun HomeDrawer( onCloseDrawer: () -> Unit, modifier: Modifier = Modifier ) { - val context = LocalContext.current Column( modifier = modifier .padding( @@ -92,58 +89,57 @@ fun HomeDrawer( .height(MaterialTheme.wireDimensions.homeDrawerLogoHeight) ) - fun navigateAndCloseDrawer(item: HomeDestination) { - navigateToHomeItem(item) - onCloseDrawer() - } - - DrawerItem( - destination = HomeDestination.Conversations, - selected = currentRoute == HomeDestination.Conversations.direction.route, - onItemClick = remember { { navigateAndCloseDrawer(HomeDestination.Conversations) } } - ) - - if (homeDrawerState.showFilesOption) { - DrawerItem( - destination = HomeDestination.Cells, - selected = currentRoute == HomeDestination.Cells.direction.route, - onItemClick = remember { { navigateAndCloseDrawer(HomeDestination.Cells) } } - ) + val (topItems, bottomItems) = homeDrawerState.items + topItems.forEach { item -> + MapToDrawerItem(navigateToHomeItem, onCloseDrawer, currentRoute, item) } - DrawerItem( - destination = HomeDestination.Archive, - unreadCount = homeDrawerState.unreadArchiveConversationsCount, - selected = currentRoute == HomeDestination.Archive.direction.route, - onItemClick = remember { { navigateAndCloseDrawer(HomeDestination.Archive) } } - ) - Spacer(modifier = Modifier.weight(1f)) - val bottomItems = buildList { - add(HomeDestination.WhatsNew) - add(HomeDestination.Settings) - if (homeDrawerState.teamManagementUrl.isNotBlank()) add(HomeDestination.TeamManagement) - add(HomeDestination.Support) + bottomItems.forEach { item -> + MapToDrawerItem(navigateToHomeItem, onCloseDrawer, currentRoute, item) } + } +} - bottomItems.forEach { item -> - DrawerItem( - destination = item, - selected = currentRoute == item.direction.route, - onItemClick = when (item) { - is HomeDestination.TeamManagement -> remember { - { - CustomTabsHelper.launchUrl(context, homeDrawerState.teamManagementUrl) - onCloseDrawer() - } - } +@Composable +fun MapToDrawerItem( + navigateToHomeItem: (HomeDestination) -> Unit, + onCloseDrawer: () -> Unit, + currentRoute: String?, + drawerUiItem: DrawerUiItem +) { + val context = LocalContext.current + fun navigateAndCloseDrawer(item: HomeDestination) { + navigateToHomeItem(item) + onCloseDrawer() + } - else -> { - remember { { navigateAndCloseDrawer(item) } } + with(drawerUiItem) { + when (this) { + is DrawerUiItem.DynamicExternalNavigationItem -> DrawerItem( + destination = destination, + selected = currentRoute == destination.direction.route, + onItemClick = remember { + { + com.wire.android.util.CustomTabsHelper.launchUrl(context, url) + onCloseDrawer() } } ) + + is DrawerUiItem.RegularItem -> DrawerItem( + destination = destination, + selected = currentRoute == destination.direction.route, + onItemClick = remember { { navigateAndCloseDrawer(destination) } } + ) + + is DrawerUiItem.UnreadCounterItem -> DrawerItem( + destination = destination, + unreadCount = this.unreadCount.toInt(), + selected = currentRoute == destination.direction.route, + onItemClick = remember { { navigateAndCloseDrawer(destination) } } + ) } } } @@ -161,10 +157,10 @@ fun DrawerItem( Row( verticalAlignment = Alignment.CenterVertically, modifier = modifier - .padding(bottom = 8.dp) - .clip(RoundedCornerShape(12.dp)) + .padding(bottom = dimensions().spacing8x) + .clip(RoundedCornerShape(dimensions().spacing12x)) .fillMaxWidth() - .height(40.dp) + .height(dimensions().spacing40x) .background(backgroundColor) .selectableBackground(selected, stringResource(R.string.content_description_open_label), onItemClick), ) { diff --git a/app/src/main/kotlin/com/wire/android/ui/home/drawer/HomeDrawerState.kt b/app/src/main/kotlin/com/wire/android/ui/home/drawer/HomeDrawerState.kt index 0d02d912b5b..60b8c977fd1 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/drawer/HomeDrawerState.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/drawer/HomeDrawerState.kt @@ -19,7 +19,8 @@ package com.wire.android.ui.home.drawer data class HomeDrawerState( - val unreadArchiveConversationsCount: Int, - val showFilesOption: Boolean, - val teamManagementUrl: String + /** + * The items to be displayed in the drawer [Pair] of "top" and "bottom" items. + */ + val items: Pair, List> = emptyList() to emptyList() ) diff --git a/app/src/main/kotlin/com/wire/android/ui/home/drawer/HomeDrawerViewModel.kt b/app/src/main/kotlin/com/wire/android/ui/home/drawer/HomeDrawerViewModel.kt index dbf4a9bd5fd..7a317189cb7 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/drawer/HomeDrawerViewModel.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/drawer/HomeDrawerViewModel.kt @@ -25,12 +25,16 @@ import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.wire.android.datastore.GlobalDataStore +import com.wire.android.navigation.HomeDestination import com.wire.android.util.EMPTY import com.wire.kalium.logic.data.user.type.UserType import com.wire.kalium.logic.feature.conversation.ObserveArchivedUnreadConversationsCountUseCase import com.wire.kalium.logic.feature.server.GetTeamUrlUseCase import com.wire.kalium.logic.feature.user.ObserveSelfUserUseCase import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.combine +import kotlinx.coroutines.flow.map import kotlinx.coroutines.launch import javax.inject.Inject @@ -38,34 +42,25 @@ import javax.inject.Inject @HiltViewModel class HomeDrawerViewModel @Inject constructor( val savedStateHandle: SavedStateHandle, - private val observeArchivedUnreadConversationsCountUseCase: ObserveArchivedUnreadConversationsCountUseCase, + private val observeArchivedUnreadConversationsCount: ObserveArchivedUnreadConversationsCountUseCase, private val observeSelfUser: ObserveSelfUserUseCase, private val getTeamUrl: GetTeamUrlUseCase, private val globalDataStore: GlobalDataStore, ) : ViewModel() { - var drawerState by mutableStateOf( - HomeDrawerState( - unreadArchiveConversationsCount = 0, - showFilesOption = false, - teamManagementUrl = "" - ) - ) + var drawerState by mutableStateOf(HomeDrawerState()) private set init { - observeUnreadArchiveConversationsCount() - observeWireCellsFeatureState() - observeTeamManagementUrlForUser() + buildDrawerItems() } - private fun observeTeamManagementUrlForUser() = viewModelScope.launch { - observeSelfUser().collect { + private suspend fun observeTeamManagementUrlForUser(): Flow { + return observeSelfUser().map { when (it.userType) { UserType.ADMIN, UserType.OWNER -> { - val teamManagementUrl = getTeamUrl() - drawerState = drawerState.copy(teamManagementUrl = teamManagementUrl) + getTeamUrl() } UserType.INTERNAL, @@ -74,22 +69,54 @@ class HomeDrawerViewModel @Inject constructor( UserType.GUEST, UserType.SERVICE, UserType.NONE -> { - drawerState = drawerState.copy(teamManagementUrl = String.EMPTY) + String.EMPTY } } } } - private fun observeWireCellsFeatureState() = viewModelScope.launch { - globalDataStore.wireCellsEnabled().collect { - drawerState = drawerState.copy(showFilesOption = it) - } - } - - private fun observeUnreadArchiveConversationsCount() { + private fun buildDrawerItems() { viewModelScope.launch { - observeArchivedUnreadConversationsCountUseCase() - .collect { drawerState = drawerState.copy(unreadArchiveConversationsCount = it.toInt()) } + combine( + globalDataStore.wireCellsEnabled(), + observeArchivedUnreadConversationsCount(), + observeTeamManagementUrlForUser() + ) { wireCellsEnabled, unreadArchiveConversationsCount, teamManagementUrl -> + buildList { + add(DrawerUiItem.RegularItem(destination = HomeDestination.Conversations)) + if (wireCellsEnabled) { + add(DrawerUiItem.RegularItem(destination = HomeDestination.Cells)) + } + add( + DrawerUiItem.UnreadCounterItem( + destination = HomeDestination.Archive, + unreadCount = unreadArchiveConversationsCount + ) + ) + } to buildList { + add(DrawerUiItem.RegularItem(destination = HomeDestination.WhatsNew)) + add(DrawerUiItem.RegularItem(destination = HomeDestination.Settings)) + if (teamManagementUrl.isNotBlank()) add( + DrawerUiItem.DynamicExternalNavigationItem( + destination = HomeDestination.TeamManagement, + url = teamManagementUrl + ) + ) + add(DrawerUiItem.RegularItem(destination = HomeDestination.Support)) + } + }.collect { + drawerState = drawerState.copy(items = it) + } } } } + +/** + * The type of the main navigation item. + * Regular, with counter or with external navigation. + */ +sealed class DrawerUiItem(open val destination: HomeDestination) { + data class RegularItem(override val destination: HomeDestination) : DrawerUiItem(destination) + data class UnreadCounterItem(override val destination: HomeDestination, val unreadCount: Long) : DrawerUiItem(destination) + data class DynamicExternalNavigationItem(override val destination: HomeDestination, val url: String) : DrawerUiItem(destination) +} From 87dfc01632c126c060b0f6827b3ae24e43f5b962 Mon Sep 17 00:00:00 2001 From: yamilmedina Date: Wed, 2 Jul 2025 18:05:38 +0200 Subject: [PATCH 09/11] feat: pr comments, test coverage --- .../ui/home/drawer/HomeDrawerViewModel.kt | 12 +++++----- .../ui/home/drawer/HomeDrawerViewModelTest.kt | 22 ++++++++++++++----- 2 files changed, 24 insertions(+), 10 deletions(-) diff --git a/app/src/main/kotlin/com/wire/android/ui/home/drawer/HomeDrawerViewModel.kt b/app/src/main/kotlin/com/wire/android/ui/home/drawer/HomeDrawerViewModel.kt index 7a317189cb7..b2ada2a8ced 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/drawer/HomeDrawerViewModel.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/drawer/HomeDrawerViewModel.kt @@ -96,12 +96,14 @@ class HomeDrawerViewModel @Inject constructor( } to buildList { add(DrawerUiItem.RegularItem(destination = HomeDestination.WhatsNew)) add(DrawerUiItem.RegularItem(destination = HomeDestination.Settings)) - if (teamManagementUrl.isNotBlank()) add( - DrawerUiItem.DynamicExternalNavigationItem( - destination = HomeDestination.TeamManagement, - url = teamManagementUrl + if (teamManagementUrl.isNotBlank()) { + add( + DrawerUiItem.DynamicExternalNavigationItem( + destination = HomeDestination.TeamManagement, + url = teamManagementUrl + ) ) - ) + } add(DrawerUiItem.RegularItem(destination = HomeDestination.Support)) } }.collect { diff --git a/app/src/test/kotlin/com/wire/android/ui/home/drawer/HomeDrawerViewModelTest.kt b/app/src/test/kotlin/com/wire/android/ui/home/drawer/HomeDrawerViewModelTest.kt index a93d6e37a9e..920cf7274fd 100644 --- a/app/src/test/kotlin/com/wire/android/ui/home/drawer/HomeDrawerViewModelTest.kt +++ b/app/src/test/kotlin/com/wire/android/ui/home/drawer/HomeDrawerViewModelTest.kt @@ -22,7 +22,6 @@ import com.wire.android.config.CoroutineTestExtension import com.wire.android.config.NavigationTestExtension import com.wire.android.datastore.GlobalDataStore import com.wire.android.framework.TestUser -import com.wire.android.util.EMPTY import com.wire.kalium.logic.data.user.type.UserType import com.wire.kalium.logic.feature.conversation.ObserveArchivedUnreadConversationsCountUseCase import com.wire.kalium.logic.feature.server.GetTeamUrlUseCase @@ -59,8 +58,14 @@ class HomeDrawerViewModelTest { advanceUntilIdle() // Then - assertEquals(unreadCount.toInt(), viewModel.drawerState.unreadArchiveConversationsCount) - assertEquals(String.EMPTY, viewModel.drawerState.teamManagementUrl) + assertEquals( + unreadCount.toInt(), + listOf( + viewModel.drawerState.items.first, + viewModel.drawerState.items.second + ).filterIsInstance() + .first().unreadCount + ) } @Test @@ -74,7 +79,14 @@ class HomeDrawerViewModelTest { advanceUntilIdle() // Then - assertEquals(Arrangement.TEAM_URL, viewModel.drawerState.teamManagementUrl) + assertEquals( + Arrangement.TEAM_URL, + listOf( + viewModel.drawerState.items.first, + viewModel.drawerState.items.second + ).filterIsInstance() + .first().url + ) } private class Arrangement { @@ -111,7 +123,7 @@ class HomeDrawerViewModelTest { fun arrange() = this to HomeDrawerViewModel( savedStateHandle = savedStateHandle, - observeArchivedUnreadConversationsCountUseCase = observeArchivedUnreadConversationsCount, + observeArchivedUnreadConversationsCount = observeArchivedUnreadConversationsCount, globalDataStore = globalDataStore, observeSelfUser = observeSelfUserUseCase, getTeamUrl = getTeamUrlUseCase From accf7578f8476554af9527f5b376cf552e293d0c Mon Sep 17 00:00:00 2001 From: yamilmedina Date: Wed, 2 Jul 2025 18:11:37 +0200 Subject: [PATCH 10/11] feat: pr comments, test coverage --- .../wire/android/ui/home/drawer/HomeDrawerViewModelTest.kt | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/app/src/test/kotlin/com/wire/android/ui/home/drawer/HomeDrawerViewModelTest.kt b/app/src/test/kotlin/com/wire/android/ui/home/drawer/HomeDrawerViewModelTest.kt index 920cf7274fd..43b42e7bfcf 100644 --- a/app/src/test/kotlin/com/wire/android/ui/home/drawer/HomeDrawerViewModelTest.kt +++ b/app/src/test/kotlin/com/wire/android/ui/home/drawer/HomeDrawerViewModelTest.kt @@ -63,7 +63,8 @@ class HomeDrawerViewModelTest { listOf( viewModel.drawerState.items.first, viewModel.drawerState.items.second - ).filterIsInstance() + ).flatten() + .filterIsInstance() .first().unreadCount ) } @@ -84,7 +85,8 @@ class HomeDrawerViewModelTest { listOf( viewModel.drawerState.items.first, viewModel.drawerState.items.second - ).filterIsInstance() + ).flatten() + .filterIsInstance() .first().url ) } @@ -112,7 +114,6 @@ class HomeDrawerViewModelTest { MockKAnnotations.init(this, relaxUnitFun = true) coEvery { observeArchivedUnreadConversationsCount() } returns unreadArchivedConversationsCountChannel.consumeAsFlow() every { globalDataStore.wireCellsEnabled() } returns flowOf(false) - every { globalDataStore.wireCellsEnabled() } returns flowOf(false) withSelfUserType() coEvery { getTeamUrlUseCase() } returns TEAM_URL } From 1eae9c9e2d53a00f57a8fd1392b3931c26f39211 Mon Sep 17 00:00:00 2001 From: yamilmedina Date: Wed, 2 Jul 2025 18:18:47 +0200 Subject: [PATCH 11/11] feat: pr comments, test coverage --- .../wire/android/ui/home/drawer/HomeDrawerViewModelTest.kt | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/app/src/test/kotlin/com/wire/android/ui/home/drawer/HomeDrawerViewModelTest.kt b/app/src/test/kotlin/com/wire/android/ui/home/drawer/HomeDrawerViewModelTest.kt index 43b42e7bfcf..c4295d29c82 100644 --- a/app/src/test/kotlin/com/wire/android/ui/home/drawer/HomeDrawerViewModelTest.kt +++ b/app/src/test/kotlin/com/wire/android/ui/home/drawer/HomeDrawerViewModelTest.kt @@ -36,7 +36,7 @@ import kotlinx.coroutines.flow.consumeAsFlow import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.test.advanceUntilIdle import kotlinx.coroutines.test.runTest -import org.amshove.kluent.internal.assertEquals +import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Test import org.junit.jupiter.api.extension.ExtendWith @@ -59,7 +59,7 @@ class HomeDrawerViewModelTest { // Then assertEquals( - unreadCount.toInt(), + unreadCount, listOf( viewModel.drawerState.items.first, viewModel.drawerState.items.second @@ -72,11 +72,12 @@ class HomeDrawerViewModelTest { @Test fun `given userIsAdmin, when starts observing, then set team url`() = runTest { // Given - val (_, viewModel) = Arrangement() + val (arrangement, viewModel) = Arrangement() .withSelfUserType(UserType.ADMIN) .arrange() // When + arrangement.unreadArchivedConversationsCountChannel.send(0L) advanceUntilIdle() // Then