From 63f24f0ae147cc42e27d5da02c07cd389a0e7d7f Mon Sep 17 00:00:00 2001 From: Jorge Martin Espinosa Date: Fri, 30 Jan 2026 10:10:00 +0100 Subject: [PATCH] Add special flow for leaving a space as the last owner (#6112) * When the user is in a v12 room, use different UI to select the last owner when leaving - Add `LeaveSpaceRoom.areCreatorsPrivileged` to detect when this is happening. - Import new strings. - Build the new UI. - Attach it to a change member roles screen navigation. * Don't display the `isLastOwner` UI if the user is the only joined one in the room * Rename `LeaveSpaceState.isLastOwner` to `.needsOwnerChange`. This way, it's easier to understand the difference with the passed `LeaveSpaceRoom.isLastOwner` value * Add a test for the new check of user not being the last joined member * Fix paddings in `LeaveSpaceView` * Update screenshots --------- Co-authored-by: ElementBot --- .../impl/src/main/res/values/localazy.xml | 2 - features/space/impl/build.gradle.kts | 1 + .../features/space/impl/SpaceFlowNode.kt | 42 ++++++- .../space/impl/leave/LeaveSpaceNode.kt | 2 + .../space/impl/leave/LeaveSpacePresenter.kt | 7 +- .../space/impl/leave/LeaveSpaceState.kt | 9 +- .../impl/leave/LeaveSpaceStateProvider.kt | 10 +- .../space/impl/leave/LeaveSpaceView.kt | 113 ++++++++++-------- .../space/impl/leave/SelectableSpaceRoom.kt | 1 + .../impl/src/main/res/values/localazy.xml | 3 + .../space/impl/DefaultSpaceEntryPointTest.kt | 6 +- .../impl/leave/LeaveSpacePresenterTest.kt | 42 ++++--- .../matrix/api/spaces/LeaveSpaceRoom.kt | 1 + .../impl/spaces/RustLeaveSpaceHandle.kt | 1 + ...ace.impl.leave_LeaveSpaceView_Day_0_en.png | 4 +- ...ce.impl.leave_LeaveSpaceView_Day_10_en.png | 3 + ...ace.impl.leave_LeaveSpaceView_Day_1_en.png | 4 +- ...ace.impl.leave_LeaveSpaceView_Day_2_en.png | 4 +- ...ace.impl.leave_LeaveSpaceView_Day_3_en.png | 4 +- ...ace.impl.leave_LeaveSpaceView_Day_4_en.png | 4 +- ...ace.impl.leave_LeaveSpaceView_Day_5_en.png | 4 +- ...ace.impl.leave_LeaveSpaceView_Day_6_en.png | 4 +- ...ace.impl.leave_LeaveSpaceView_Day_7_en.png | 4 +- ...ace.impl.leave_LeaveSpaceView_Day_8_en.png | 4 +- ...ace.impl.leave_LeaveSpaceView_Day_9_en.png | 4 +- ...e.impl.leave_LeaveSpaceView_Night_0_en.png | 4 +- ....impl.leave_LeaveSpaceView_Night_10_en.png | 3 + ...e.impl.leave_LeaveSpaceView_Night_1_en.png | 4 +- ...e.impl.leave_LeaveSpaceView_Night_2_en.png | 4 +- ...e.impl.leave_LeaveSpaceView_Night_3_en.png | 4 +- ...e.impl.leave_LeaveSpaceView_Night_4_en.png | 4 +- ...e.impl.leave_LeaveSpaceView_Night_5_en.png | 4 +- ...e.impl.leave_LeaveSpaceView_Night_6_en.png | 4 +- ...e.impl.leave_LeaveSpaceView_Night_7_en.png | 4 +- ...e.impl.leave_LeaveSpaceView_Night_8_en.png | 4 +- ...e.impl.leave_LeaveSpaceView_Night_9_en.png | 4 +- 36 files changed, 212 insertions(+), 114 deletions(-) create mode 100644 tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Day_10_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Night_10_en.png diff --git a/features/createroom/impl/src/main/res/values/localazy.xml b/features/createroom/impl/src/main/res/values/localazy.xml index b2a0f1d5be..95134845e0 100644 --- a/features/createroom/impl/src/main/res/values/localazy.xml +++ b/features/createroom/impl/src/main/res/values/localazy.xml @@ -7,8 +7,6 @@ "Add name…" "New room" "New space" - "(no space)" - "Home" "Only people invited can join." "Private" "Anyone can find this room. diff --git a/features/space/impl/build.gradle.kts b/features/space/impl/build.gradle.kts index a29d388587..deec862fa3 100644 --- a/features/space/impl/build.gradle.kts +++ b/features/space/impl/build.gradle.kts @@ -52,4 +52,5 @@ dependencies { testImplementation(projects.libraries.featureflag.test) testImplementation(projects.features.createroom.test) testImplementation(projects.features.invite.test) + testImplementation(projects.features.rolesandpermissions.test) } diff --git a/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/SpaceFlowNode.kt b/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/SpaceFlowNode.kt index 2b29a895a6..62cefaeaf2 100644 --- a/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/SpaceFlowNode.kt +++ b/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/SpaceFlowNode.kt @@ -22,10 +22,13 @@ import com.bumble.appyx.core.plugin.Plugin import com.bumble.appyx.navmodel.backstack.BackStack import com.bumble.appyx.navmodel.backstack.operation.pop import com.bumble.appyx.navmodel.backstack.operation.push +import com.bumble.appyx.navmodel.backstack.operation.replace import dev.zacsweers.metro.Assisted import dev.zacsweers.metro.AssistedInject import io.element.android.annotations.ContributesNode import io.element.android.features.createroom.api.CreateRoomEntryPoint +import io.element.android.features.rolesandpermissions.api.ChangeRoomMemberRolesEntryPoint +import io.element.android.features.rolesandpermissions.api.ChangeRoomMemberRolesListType import io.element.android.features.space.api.SpaceEntryPoint import io.element.android.features.space.impl.addroom.AddRoomToSpaceNode import io.element.android.features.space.impl.di.SpaceFlowGraph @@ -38,10 +41,15 @@ import io.element.android.libraries.architecture.callback import io.element.android.libraries.architecture.createNode import io.element.android.libraries.di.DependencyInjectionGraphOwner import io.element.android.libraries.di.RoomScope +import io.element.android.libraries.di.annotations.SessionCoroutineScope import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.api.room.JoinedRoom import io.element.android.libraries.matrix.api.spaces.SpaceService import io.element.android.libraries.matrix.api.spaces.loadAllIncrementally +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.NonCancellable +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext import kotlinx.parcelize.Parcelize @ContributesNode(RoomScope::class) @@ -49,10 +57,12 @@ import kotlinx.parcelize.Parcelize class SpaceFlowNode( @Assisted val buildContext: BuildContext, @Assisted plugins: List, - room: JoinedRoom, + private val room: JoinedRoom, spaceService: SpaceService, graphFactory: SpaceFlowGraph.Factory, private val createRoomEntryPoint: CreateRoomEntryPoint, + private val changeRoomMemberRolesEntryPoint: ChangeRoomMemberRolesEntryPoint, + @SessionCoroutineScope private val sessionCoroutineScope: CoroutineScope, ) : BaseFlowNode( backstack = BackStack( initialElement = NavTarget.Root, @@ -80,6 +90,9 @@ class SpaceFlowNode( @Parcelize data object AddRoom : NavTarget + + @Parcelize + data object ChangeOwners : NavTarget } override fun onBuilt() { @@ -105,6 +118,10 @@ class SpaceFlowNode( override fun navigateToRolesAndPermissions() { backstack.push(NavTarget.Settings(SpaceSettingsFlowNode.NavTarget.RolesAndPermissions)) } + + override fun navigateToChooseOwners() { + backstack.replace(NavTarget.ChangeOwners) + } } createNode(buildContext, listOf(callback)) } @@ -177,6 +194,29 @@ class SpaceFlowNode( } createNode(buildContext, listOf(callback)) } + NavTarget.ChangeOwners -> { + val node = changeRoomMemberRolesEntryPoint.createNode( + parentNode = this, + buildContext = buildContext, + room = room, + listType = ChangeRoomMemberRolesListType.SelectNewOwnersWhenLeaving, + ) + + val completionProxy = node as ChangeRoomMemberRolesEntryPoint.NodeProxy + sessionCoroutineScope.launch { + val changedOwners = withContext(NonCancellable) { + completionProxy.waitForCompletion() + } + + if (changedOwners) { + backstack.replace(NavTarget.Leave) + } else { + backstack.pop() + } + } + + node + } } } diff --git a/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/leave/LeaveSpaceNode.kt b/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/leave/LeaveSpaceNode.kt index c41acc0c05..6f7ef89e5a 100644 --- a/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/leave/LeaveSpaceNode.kt +++ b/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/leave/LeaveSpaceNode.kt @@ -34,6 +34,7 @@ class LeaveSpaceNode( interface Callback : Plugin { fun closeLeaveSpaceFlow() fun navigateToRolesAndPermissions() + fun navigateToChooseOwners() } private val leaveSpaceHandle = matrixClient.spaceService.getLeaveSpaceHandle(room.roomId) @@ -57,6 +58,7 @@ class LeaveSpaceNode( state = state, onCancel = callback::closeLeaveSpaceFlow, onRolesAndPermissionsClick = callback::navigateToRolesAndPermissions, + onChooseOwnersClick = callback::navigateToChooseOwners, modifier = modifier ) } diff --git a/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/leave/LeaveSpacePresenter.kt b/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/leave/LeaveSpacePresenter.kt index 2d30bc8617..4e1fd34673 100644 --- a/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/leave/LeaveSpacePresenter.kt +++ b/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/leave/LeaveSpacePresenter.kt @@ -92,6 +92,7 @@ class LeaveSpacePresenter( SelectableSpaceRoom( spaceRoom = room.spaceRoom, isLastOwner = room.isLastOwner, + joinedMembersCount = room.spaceRoom.numJoinedMembers, isSelected = selectedRoomIds.contains(room.spaceRoom.roomId), ) }.toImmutableList() @@ -130,9 +131,11 @@ class LeaveSpacePresenter( } } + val currentSpaceToLeave = leaveSpaceRooms.dataOrNull()?.current return LeaveSpaceState( - spaceName = leaveSpaceRooms.dataOrNull()?.current?.spaceRoom?.displayName, - isLastOwner = leaveSpaceRooms.dataOrNull()?.current?.isLastOwner == true, + spaceName = currentSpaceToLeave?.spaceRoom?.displayName, + needsOwnerChange = currentSpaceToLeave?.let { it.spaceRoom.numJoinedMembers > 1 && it.isLastOwner } == true, + areCreatorsPrivileged = currentSpaceToLeave?.areCreatorsPrivileged == true, selectableSpaceRooms = selectableSpaceRooms, leaveSpaceAction = leaveSpaceAction.value, eventSink = ::handleEvent, diff --git a/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/leave/LeaveSpaceState.kt b/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/leave/LeaveSpaceState.kt index 2ff98ea583..9bf029cb15 100644 --- a/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/leave/LeaveSpaceState.kt +++ b/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/leave/LeaveSpaceState.kt @@ -15,7 +15,8 @@ import kotlinx.collections.immutable.toImmutableList data class LeaveSpaceState( val spaceName: String?, - val isLastOwner: Boolean, + val needsOwnerChange: Boolean, + val areCreatorsPrivileged: Boolean, val selectableSpaceRooms: AsyncData>, val leaveSpaceAction: AsyncAction, val eventSink: (LeaveSpaceEvents) -> Unit, @@ -25,7 +26,7 @@ data class LeaveSpaceState( private val selectableRooms: ImmutableList init { - val partition = rooms.partition { it.isLastOwner } + val partition = rooms.partition { it.isLastOwner && it.joinedMembersCount > 1 } lastAdminRooms = partition.first.toImmutableList() selectableRooms = partition.second.toImmutableList() } @@ -33,12 +34,12 @@ data class LeaveSpaceState( /** * True if we should show the quick action to select/deselect all rooms. */ - val showQuickAction = isLastOwner.not() && selectableRooms.isNotEmpty() + val showQuickAction = needsOwnerChange.not() && selectableRooms.isNotEmpty() /** * True if we should show the leave button. */ - val showLeaveButton = isLastOwner.not() && selectableSpaceRooms is AsyncData.Success + val showLeaveButton = needsOwnerChange.not() && selectableSpaceRooms is AsyncData.Success /** * True if there all the selectable rooms are selected. diff --git a/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/leave/LeaveSpaceStateProvider.kt b/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/leave/LeaveSpaceStateProvider.kt index 362e987fc4..44e5ce7cd7 100644 --- a/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/leave/LeaveSpaceStateProvider.kt +++ b/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/leave/LeaveSpaceStateProvider.kt @@ -109,17 +109,23 @@ class LeaveSpaceStateProvider : PreviewParameterProvider { aLeaveSpaceState( isLastOwner = true, ), + aLeaveSpaceState( + isLastOwner = true, + areCreatorsPrivileged = true, + ), ) } fun aLeaveSpaceState( spaceName: String? = "Space name", isLastOwner: Boolean = false, + areCreatorsPrivileged: Boolean = false, selectableSpaceRooms: AsyncData> = AsyncData.Uninitialized, leaveSpaceAction: AsyncAction = AsyncAction.Uninitialized, ) = LeaveSpaceState( spaceName = spaceName, - isLastOwner = isLastOwner, + needsOwnerChange = isLastOwner, + areCreatorsPrivileged = areCreatorsPrivileged, selectableSpaceRooms = selectableSpaceRooms, leaveSpaceAction = leaveSpaceAction, eventSink = { } @@ -128,9 +134,11 @@ fun aLeaveSpaceState( fun aSelectableSpaceRoom( spaceRoom: SpaceRoom = aSpaceRoom(), isLastOwner: Boolean = false, + joinedMembersCount: Int = 2, isSelected: Boolean = false, ) = SelectableSpaceRoom( spaceRoom = spaceRoom, isLastOwner = isLastOwner, + joinedMembersCount = joinedMembersCount, isSelected = isSelected, ) diff --git a/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/leave/LeaveSpaceView.kt b/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/leave/LeaveSpaceView.kt index 52d52a103e..f0be5e1f2f 100644 --- a/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/leave/LeaveSpaceView.kt +++ b/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/leave/LeaveSpaceView.kt @@ -12,14 +12,13 @@ package io.element.android.features.space.impl.leave import androidx.annotation.StringRes import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.ColumnScope +import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.consumeWindowInsets -import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.heightIn -import androidx.compose.foundation.layout.imePadding import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.lazy.LazyColumn @@ -40,6 +39,7 @@ import io.element.android.features.space.impl.R import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.designsystem.atomic.molecules.ButtonColumnMolecule import io.element.android.libraries.designsystem.atomic.molecules.IconTitleSubtitleMolecule +import io.element.android.libraries.designsystem.atomic.pages.HeaderFooterPage import io.element.android.libraries.designsystem.components.BigIcon import io.element.android.libraries.designsystem.components.async.AsyncActionView import io.element.android.libraries.designsystem.components.async.AsyncFailure @@ -54,7 +54,6 @@ import io.element.android.libraries.designsystem.theme.components.Button import io.element.android.libraries.designsystem.theme.components.Checkbox import io.element.android.libraries.designsystem.theme.components.Icon import io.element.android.libraries.designsystem.theme.components.IconSource -import io.element.android.libraries.designsystem.theme.components.Scaffold import io.element.android.libraries.designsystem.theme.components.Text import io.element.android.libraries.designsystem.theme.components.TextButton import io.element.android.libraries.designsystem.theme.components.TopAppBar @@ -71,30 +70,42 @@ fun LeaveSpaceView( state: LeaveSpaceState, onCancel: () -> Unit, onRolesAndPermissionsClick: () -> Unit, + onChooseOwnersClick: () -> Unit, modifier: Modifier = Modifier, ) { - Scaffold( + HeaderFooterPage( modifier = modifier, + contentPadding = PaddingValues(bottom = 14.dp), topBar = { - LeaveSpaceHeader( - state = state, - onBackClick = onCancel, + TopAppBar( + navigationIcon = { + BackButton(onClick = onCancel) + }, + title = {}, ) }, - containerColor = ElementTheme.colors.bgCanvasDefault, - ) { padding -> - Column( - modifier = Modifier - .padding(padding) - .imePadding() - .consumeWindowInsets(padding) - .fillMaxSize() - ) { - LazyColumn( - modifier = Modifier - .weight(1f), - ) { - if (state.isLastOwner.not()) { + header = { + LeaveSpaceHeader(state = state) + }, + footer = { + LeaveSpaceButtons( + showLeaveButton = state.showLeaveButton, + selectedRoomsCount = state.selectedRoomsCount, + onLeaveSpace = { + state.eventSink(LeaveSpaceEvents.LeaveSpace) + }, + onCancel = onCancel, + showRolesAndPermissionsButton = state.needsOwnerChange && !state.areCreatorsPrivileged, + showChooseOwnersButton = state.needsOwnerChange && state.areCreatorsPrivileged, + onChooseOwnersButtonClick = onChooseOwnersClick, + onRolesAndPermissionsClick = onRolesAndPermissionsClick, + ) + }, + content = { + if (state.needsOwnerChange.not()) { + LazyColumn( + modifier = Modifier.padding(top = 20.dp), + ) { when (state.selectableSpaceRooms) { is AsyncData.Success -> { // List rooms where the user is the only admin @@ -125,18 +136,8 @@ fun LeaveSpaceView( } } } - LeaveSpaceButtons( - showLeaveButton = state.showLeaveButton, - selectedRoomsCount = state.selectedRoomsCount, - onLeaveSpace = { - state.eventSink(LeaveSpaceEvents.LeaveSpace) - }, - onCancel = onCancel, - showRolesAndPermissionsButton = state.isLastOwner, - onRolesAndPermissionsClick = onRolesAndPermissionsClick, - ) } - } + ) AsyncActionView( async = state.leaveSpaceAction, @@ -149,25 +150,27 @@ fun LeaveSpaceView( @Composable private fun LeaveSpaceHeader( state: LeaveSpaceState, - onBackClick: () -> Unit, ) { Column { - TopAppBar( - navigationIcon = { - BackButton(onClick = onBackClick) - }, - title = {}, - ) IconTitleSubtitleMolecule( - modifier = Modifier.padding(top = 0.dp, bottom = 8.dp, start = 24.dp, end = 24.dp), + modifier = Modifier.padding(top = 24.dp, bottom = 8.dp, start = 24.dp, end = 24.dp), iconStyle = BigIcon.Style.AlertSolid, - title = stringResource( - if (state.isLastOwner) R.string.screen_leave_space_title_last_admin else R.string.screen_leave_space_title, - state.spaceName ?: stringResource(CommonStrings.common_space) - ), + title = if (state.needsOwnerChange) { + if (state.areCreatorsPrivileged) { + stringResource(R.string.screen_leave_space_title_last_owner) + } else { + stringResource(R.string.screen_leave_space_title_last_admin, state.spaceName ?: stringResource(CommonStrings.common_space)) + } + } else { + stringResource(R.string.screen_leave_space_title, state.spaceName ?: stringResource(CommonStrings.common_space)) + }, subTitle = - if (state.isLastOwner) { - stringResource(R.string.screen_leave_space_subtitle_last_admin) + if (state.needsOwnerChange) { + if (state.areCreatorsPrivileged) { + stringResource(R.string.screen_leave_space_subtitle_last_owner, state.spaceName ?: stringResource(CommonStrings.common_space)) + } else { + stringResource(R.string.screen_leave_space_subtitle_last_admin) + } } else if (state.selectableSpaceRooms is AsyncData.Success && state.selectableSpaceRooms.data.isNotEmpty()) { if (state.hasOnlyLastAdminRoom) { stringResource(R.string.screen_leave_space_subtitle_only_last_admin) @@ -216,10 +219,12 @@ private fun LeaveSpaceButtons( onLeaveSpace: () -> Unit, showRolesAndPermissionsButton: Boolean, onRolesAndPermissionsClick: () -> Unit, + showChooseOwnersButton: Boolean, + onChooseOwnersButtonClick: () -> Unit, onCancel: () -> Unit, ) { ButtonColumnMolecule( - modifier = Modifier.padding(16.dp) + modifier = Modifier.padding(top = 16.dp) ) { if (showLeaveButton) { val text = if (selectedRoomsCount > 0) { @@ -243,6 +248,14 @@ private fun LeaveSpaceButtons( leadingIcon = IconSource.Vector(CompoundIcons.Settings()), ) } + if (showChooseOwnersButton) { + Button( + text = stringResource(R.string.screen_leave_space_choose_owners_action), + onClick = onChooseOwnersButtonClick, + modifier = Modifier.fillMaxWidth(), + destructive = true, + ) + } TextButton( modifier = Modifier.fillMaxWidth(), text = stringResource(CommonStrings.action_cancel), @@ -262,6 +275,7 @@ private fun SpaceItem( modifier = Modifier .fillMaxWidth() .heightIn(min = 66.dp) + .padding(horizontal = 16.dp) .toggleable( value = selectableSpaceRoom.isSelected, role = Role.Checkbox, @@ -276,9 +290,9 @@ private fun SpaceItem( onClick = onClick, ), verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(16.dp), ) { Avatar( - modifier = Modifier.padding(horizontal = 16.dp), avatarData = room.getAvatarData(AvatarSize.LeaveSpaceRoom), avatarType = if (room.isSpace) AvatarType.Space() else AvatarType.Room(), ) @@ -358,5 +372,6 @@ internal fun LeaveSpaceViewPreview( state = state, onCancel = {}, onRolesAndPermissionsClick = {}, + onChooseOwnersClick = {}, ) } diff --git a/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/leave/SelectableSpaceRoom.kt b/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/leave/SelectableSpaceRoom.kt index a6c42e16dc..a5dae34f15 100644 --- a/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/leave/SelectableSpaceRoom.kt +++ b/features/space/impl/src/main/kotlin/io/element/android/features/space/impl/leave/SelectableSpaceRoom.kt @@ -13,5 +13,6 @@ import io.element.android.libraries.matrix.api.spaces.SpaceRoom data class SelectableSpaceRoom( val spaceRoom: SpaceRoom, val isLastOwner: Boolean, + val joinedMembersCount: Int, val isSelected: Boolean, ) diff --git a/features/space/impl/src/main/res/values/localazy.xml b/features/space/impl/src/main/res/values/localazy.xml index b5495b721a..414f6c5ccf 100644 --- a/features/space/impl/src/main/res/values/localazy.xml +++ b/features/space/impl/src/main/res/values/localazy.xml @@ -1,5 +1,6 @@ + "Choose owners" "%1$s (Admin)" "Leave %1$d room and space" @@ -7,9 +8,11 @@ "Select the rooms you’d like to leave which you\'re not the only administrator for:" "You need to assign another admin for this space before you can leave." + "You are the only owner of %1$s. You need to transfer ownership to someone else before you leave." "You will not be removed from the following room(s) because you\'re the only administrator:" "Leave %1$s?" "You are the only admin for %1$s" + "Transfer ownership" "Room" "Adding a room will not affect the room access. To change the access go to Room settings > Security & privacy." "Add your first room" diff --git a/features/space/impl/src/test/kotlin/io/element/android/features/space/impl/DefaultSpaceEntryPointTest.kt b/features/space/impl/src/test/kotlin/io/element/android/features/space/impl/DefaultSpaceEntryPointTest.kt index 0c3ae1b888..c0ec58d267 100644 --- a/features/space/impl/src/test/kotlin/io/element/android/features/space/impl/DefaultSpaceEntryPointTest.kt +++ b/features/space/impl/src/test/kotlin/io/element/android/features/space/impl/DefaultSpaceEntryPointTest.kt @@ -12,6 +12,7 @@ import androidx.arch.core.executor.testing.InstantTaskExecutorRule import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.testing.junit4.util.MainDispatcherRule import com.google.common.truth.Truth.assertThat +import io.element.android.features.changeroommemberroles.test.FakeChangeRoomMemberRolesEntryPoint import io.element.android.features.createroom.api.FakeCreateRoomEntryPoint import io.element.android.features.space.api.SpaceEntryPoint import io.element.android.features.space.impl.di.FakeSpaceFlowGraph @@ -22,6 +23,7 @@ import io.element.android.libraries.matrix.test.spaces.FakeSpaceRoomList import io.element.android.libraries.matrix.test.spaces.FakeSpaceService import io.element.android.tests.testutils.lambda.lambdaError import io.element.android.tests.testutils.node.TestParentNode +import kotlinx.coroutines.test.runTest import org.junit.Rule import org.junit.Test @@ -33,7 +35,7 @@ class DefaultSpaceEntryPointTest { val mainDispatcherRule = MainDispatcherRule() @Test - fun `test node builder`() { + fun `test node builder`() = runTest { val entryPoint = DefaultSpaceEntryPoint() val nodeInputs = SpaceEntryPoint.Inputs(A_ROOM_ID) val parentNode = TestParentNode.create { buildContext, plugins -> @@ -46,6 +48,8 @@ class DefaultSpaceEntryPointTest { room = FakeJoinedRoom(), graphFactory = FakeSpaceFlowGraph.Factory, createRoomEntryPoint = FakeCreateRoomEntryPoint(), + changeRoomMemberRolesEntryPoint = FakeChangeRoomMemberRolesEntryPoint(), + sessionCoroutineScope = backgroundScope, ) } val callback = object : SpaceEntryPoint.Callback { diff --git a/features/space/impl/src/test/kotlin/io/element/android/features/space/impl/leave/LeaveSpacePresenterTest.kt b/features/space/impl/src/test/kotlin/io/element/android/features/space/impl/leave/LeaveSpacePresenterTest.kt index e78a338bb7..b3b6fc7976 100644 --- a/features/space/impl/src/test/kotlin/io/element/android/features/space/impl/leave/LeaveSpacePresenterTest.kt +++ b/features/space/impl/src/test/kotlin/io/element/android/features/space/impl/leave/LeaveSpacePresenterTest.kt @@ -29,11 +29,6 @@ import kotlinx.coroutines.test.runTest import org.junit.Test class LeaveSpacePresenterTest { - private val aSpace = aSpaceRoom( - roomId = A_SPACE_ID, - displayName = A_SPACE_NAME, - ) - @Test fun `present - initial state`() = runTest { val presenter = createLeaveSpacePresenter( @@ -44,7 +39,7 @@ class LeaveSpacePresenterTest { presenter.test { val state = awaitItem() assertThat(state.spaceName).isNull() - assertThat(state.isLastOwner).isFalse() + assertThat(state.needsOwnerChange).isFalse() assertThat(state.selectableSpaceRooms.isLoading()).isTrue() assertThat(state.leaveSpaceAction).isEqualTo(AsyncAction.Uninitialized) cancelAndIgnoreRemainingEvents() @@ -87,7 +82,7 @@ class LeaveSpacePresenterTest { skipItems(2) val finalState = awaitItem() assertThat(finalState.spaceName).isEqualTo(A_SPACE_NAME) - assertThat(finalState.isLastOwner).isTrue() + assertThat(finalState.needsOwnerChange).isTrue() // The current state is not in the sub room list assertThat(finalState.selectableSpaceRooms.dataOrNull()!!).isEmpty() } @@ -145,8 +140,8 @@ class LeaveSpacePresenterTest { roomsResult = { Result.success( listOf( - LeaveSpaceRoom(aSpaceRoom(roomId = A_ROOM_ID), isLastOwner = false), - LeaveSpaceRoom(aSpaceRoom(roomId = A_ROOM_ID_2), isLastOwner = true), + LeaveSpaceRoom(aSpaceRoom(roomId = A_ROOM_ID), isLastOwner = false, areCreatorsPrivileged = false), + LeaveSpaceRoom(aSpaceRoom(roomId = A_ROOM_ID_2), isLastOwner = true, areCreatorsPrivileged = false), ) ) }, @@ -157,7 +152,7 @@ class LeaveSpacePresenterTest { skipItems(3) val state = awaitItem() assertThat(state.spaceName).isNull() - assertThat(state.isLastOwner).isFalse() + assertThat(state.needsOwnerChange).isFalse() val data = state.selectableSpaceRooms.dataOrNull()!! assertThat(data.size).isEqualTo(2) // Only one room is selectable as the user is the last admin in the other one @@ -232,6 +227,20 @@ class LeaveSpacePresenterTest { } } + @Test + fun `present - needsOwnerChange is false if user is the last joined member`() = runTest { + val presenter = createLeaveSpacePresenter( + leaveSpaceHandle = FakeLeaveSpaceHandle( + roomsResult = { Result.success(listOf(aLeaveSpaceRoom(spaceRoom = aSpaceRoom(numJoinedMembers = 1), isLastOwner = true))) }, + ) + ) + presenter.test { + skipItems(3) + val state = awaitItem() + assertThat(state.needsOwnerChange).isFalse() + } + } + private fun createLeaveSpacePresenter( leaveSpaceHandle: LeaveSpaceHandle = FakeLeaveSpaceHandle(), ): LeaveSpacePresenter { @@ -241,13 +250,18 @@ class LeaveSpacePresenterTest { } } +private val aSpace = aSpaceRoom( + roomId = A_SPACE_ID, + displayName = A_SPACE_NAME, + numJoinedMembers = 2, +) + private fun aLeaveSpaceRoom( - spaceRoom: SpaceRoom = aSpaceRoom( - roomId = A_SPACE_ID, - displayName = A_SPACE_NAME, - ), + spaceRoom: SpaceRoom = aSpace, isLastOwner: Boolean = false, + areCreatorsPrivileged: Boolean = false, ) = LeaveSpaceRoom( spaceRoom = spaceRoom, isLastOwner = isLastOwner, + areCreatorsPrivileged = areCreatorsPrivileged, ) diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/spaces/LeaveSpaceRoom.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/spaces/LeaveSpaceRoom.kt index 2b1389ea6e..dc098dc20d 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/spaces/LeaveSpaceRoom.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/spaces/LeaveSpaceRoom.kt @@ -11,4 +11,5 @@ package io.element.android.libraries.matrix.api.spaces data class LeaveSpaceRoom( val spaceRoom: SpaceRoom, val isLastOwner: Boolean, + val areCreatorsPrivileged: Boolean, ) diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/spaces/RustLeaveSpaceHandle.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/spaces/RustLeaveSpaceHandle.kt index 16b5186c92..9411aa0bf9 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/spaces/RustLeaveSpaceHandle.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/spaces/RustLeaveSpaceHandle.kt @@ -41,6 +41,7 @@ class RustLeaveSpaceHandle( LeaveSpaceRoom( spaceRoom = spaceRoomMapper.map(leaveSpaceRoom.spaceRoom), isLastOwner = leaveSpaceRoom.isLastOwner, + areCreatorsPrivileged = leaveSpaceRoom.areCreatorsPrivileged, ) } } diff --git a/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Day_0_en.png b/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Day_0_en.png index 2c1b9ca8e0..cb07763549 100644 --- a/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Day_0_en.png +++ b/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Day_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:51d8d0648c4fb58b7dc75ecc60d59a0a7abb5d79aee5f711f163b05f8188af87 -size 13970 +oid sha256:6a02edc97a1019920c4efa226b3f328ce12c9eb51c7ad29b524354a40d65c0ca +size 14066 diff --git a/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Day_10_en.png b/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Day_10_en.png new file mode 100644 index 0000000000..56c4cf82cb --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Day_10_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:420a0602c83e35fc352b2357ac113b61b9c2ea6e4752b1ac75ac5c9f470466d6 +size 31569 diff --git a/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Day_1_en.png b/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Day_1_en.png index e5cee223db..68952b5ea8 100644 --- a/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Day_1_en.png +++ b/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Day_1_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8f39bbc5e4ca32400555a3c934e18ca195f7d0c3d5d1e69753956a921e9ab017 -size 15873 +oid sha256:a65ebc58159ab95a2e8b9e7aedb1ce1113b26117c335e6a79c5944d78012d594 +size 15857 diff --git a/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Day_2_en.png b/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Day_2_en.png index 205ad9ef22..2da962c349 100644 --- a/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Day_2_en.png +++ b/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Day_2_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:890519f50978232445ad53ff654ae53ee06a9811c4f93903c9b28edf4b922c04 -size 44357 +oid sha256:33f4f4c25d57bd0b71fbeb7f983c206c27932a3fdd0a2f8baac4a5d05ae7cd0e +size 44267 diff --git a/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Day_3_en.png b/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Day_3_en.png index c1e295cab1..cd6a5f5723 100644 --- a/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Day_3_en.png +++ b/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Day_3_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6e494e7ad96ca581fc24109d30eb45dc94ffc8f00a65e5c437958a723f50a5b3 -size 44247 +oid sha256:67ce94b2bbe6394230480a65cd57cfa8025052525ec0a477c49714a5b95b046e +size 44688 diff --git a/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Day_4_en.png b/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Day_4_en.png index 0e2b81065a..b34ea22f97 100644 --- a/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Day_4_en.png +++ b/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Day_4_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:def5cf57cdc01aecc58da2dc78a693d328db67ad1c67a80fcedcdad00ee658be -size 35911 +oid sha256:f6fb03a992094eec5a88ec201f64e7773eebdea831c6eb75aa35e7b543386443 +size 36262 diff --git a/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Day_5_en.png b/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Day_5_en.png index 76a111f70b..a614eb4b01 100644 --- a/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Day_5_en.png +++ b/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Day_5_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:be2282d9efed268e05ec6ab9f54b1f24260b4adc5ebc95ffd942bc30aeb075c7 -size 42642 +oid sha256:7b4967b0a0dc144e43a9a22d62affe132f5000d0fc312537445c90d32a3e6146 +size 42936 diff --git a/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Day_6_en.png b/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Day_6_en.png index 9ad785a01d..d98190351f 100644 --- a/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Day_6_en.png +++ b/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Day_6_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:27d182389507043106053e120a8fb9f6dff6dd525bbb1da0043b74de84cd8309 -size 42196 +oid sha256:faffcd04f9cac0d4c3ce035c22851066c4d8ea90a547ab3014106256dde95bf1 +size 39677 diff --git a/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Day_7_en.png b/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Day_7_en.png index a0ac90c2a5..494a2f53bb 100644 --- a/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Day_7_en.png +++ b/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Day_7_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:db70500bf818299ebe264a9ce3e600107b0b0d3ad4588c7ddb384b308b0a3f0e -size 40173 +oid sha256:031c8b3ceef13ebbadbcd11a31e122e3862b105c3f9f2707664b4cd84b113644 +size 37240 diff --git a/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Day_8_en.png b/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Day_8_en.png index a32a6ae2bc..10c9a12938 100644 --- a/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Day_8_en.png +++ b/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Day_8_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:969272a4544df5be09e42dadc3ae18b2526ec203947a74b5505c194a8c545351 -size 16560 +oid sha256:4deec322ce73460029b43e7f76d5ae1b2e1b9b038192367648b5e6dfb8bf9cd9 +size 16761 diff --git a/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Day_9_en.png b/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Day_9_en.png index 930061aba1..c00978df3b 100644 --- a/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Day_9_en.png +++ b/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Day_9_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:08e629078ddc8fe761305d7e3b1ce22344187a9b6bf4e729b85cfc6c59d2fde2 -size 33271 +oid sha256:a5eb3f2d8e7a508ed1a6ea894915181180db2442cf6460c8a5a325bd5190ddf9 +size 33648 diff --git a/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Night_0_en.png b/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Night_0_en.png index 29fc6aebdf..ef0b50ab0c 100644 --- a/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Night_0_en.png +++ b/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Night_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c3f33575c7ad3ba99f4e571b6e9810b48c79a23d462b7a2cb0a305f7f7f32307 -size 13919 +oid sha256:6fd460c22bc9822d0c85b3826753f5eb39670c98688d77890131be97b3b55229 +size 13942 diff --git a/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Night_10_en.png b/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Night_10_en.png new file mode 100644 index 0000000000..61651c16ab --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Night_10_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6e9f06efd39f5e4ea6934bb9509fee07efe7ff77f83e993bfc31aeee8641a55a +size 30894 diff --git a/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Night_1_en.png b/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Night_1_en.png index 93b3edb129..6738d18a7e 100644 --- a/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Night_1_en.png +++ b/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Night_1_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b27e0253ee16c90b0ff9447366702b72b1abb4d19aa01cc521ff35206888c948 -size 15386 +oid sha256:c7c2812171bf4a27491aa677235ad4d56d6027a919001ebd8b44832d7c811482 +size 15430 diff --git a/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Night_2_en.png b/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Night_2_en.png index 3a4f89b5b5..7ae3036512 100644 --- a/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Night_2_en.png +++ b/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Night_2_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5a3d199d941e84e0d70e18de23375629dedc9b74bc4bfed2d7353fc85f9fc496 -size 43143 +oid sha256:ceca65b246352957ec37506af8ac82022bfca136bde7f53db89c5756a8cdff21 +size 43211 diff --git a/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Night_3_en.png b/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Night_3_en.png index 6328d868e0..cb056dfa80 100644 --- a/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Night_3_en.png +++ b/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Night_3_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f7e276ca863450e76ddbbc10ff6f22fc17c35bd6414a47a1ce33285a3f46b3c8 -size 42957 +oid sha256:f76d06da0abb8e63a2ab3d16acfbdb28653505e41e710712151918d888d72c2c +size 43435 diff --git a/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Night_4_en.png b/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Night_4_en.png index f48ae7b759..fff856de16 100644 --- a/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Night_4_en.png +++ b/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Night_4_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8cc5d0edd3dc205c3af67390a15697c020160294548ee96fb3d89c2a1e8706e0 -size 34940 +oid sha256:970ec46da6ab6358315bcea7ff7bd611811750c7e4edb437b804cf62bde9a55c +size 35267 diff --git a/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Night_5_en.png b/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Night_5_en.png index 53a1d062df..b25adc281d 100644 --- a/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Night_5_en.png +++ b/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Night_5_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c66c9ce57c7679b1f2b32c11789fc6050ee5d7ec251d77f35aefe988fd7d850f -size 41627 +oid sha256:0a76a195966879b08238d4882de54aaf998d65e689b304cc586fbb0700408bac +size 42020 diff --git a/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Night_6_en.png b/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Night_6_en.png index 3b3686d1b6..5dde62fc1b 100644 --- a/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Night_6_en.png +++ b/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Night_6_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0648f116f14434da9708075d4a225d4d2b9fb8cdb55a61c217a2200ea5c3eb33 -size 40640 +oid sha256:fd1f1f8e203bcf4e9c3cd4a4c309fe70d94c67f8017188caa6ecc6e4a4ca5e0f +size 38019 diff --git a/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Night_7_en.png b/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Night_7_en.png index 4384cbfe3c..a9dfa26518 100644 --- a/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Night_7_en.png +++ b/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Night_7_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3cd90931fcccd226921e51efa78c026dfe5ca230b6ee56cf2236c2f4c5e1f7b5 -size 38134 +oid sha256:3e00026924d002f0838b172f098d7e44f6462f182c32f4b59a1282834ffe020a +size 35018 diff --git a/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Night_8_en.png b/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Night_8_en.png index bfc370319f..48db20c14c 100644 --- a/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Night_8_en.png +++ b/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Night_8_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ae93fc35355b1d16fb7be977bc49d2937da7b60f2ed76e2a184756b900afca17 -size 16435 +oid sha256:95db09b4af9f4dd225d5410d2a67fd9e2e8736c3ba9c803d6433093d0487b30a +size 16502 diff --git a/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Night_9_en.png b/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Night_9_en.png index e4293e23a2..bc5f3dccc2 100644 --- a/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Night_9_en.png +++ b/tests/uitests/src/test/snapshots/images/features.space.impl.leave_LeaveSpaceView_Night_9_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5fc7f07a583f9dedb887ca83c67543e904d7bab092ebf70e06bc5292bf1e95b3 -size 32414 +oid sha256:dbc6e69ee6acf4ba8c2753ae731fe2114076c530f9a0572f44dee665e15f4096 +size 32901