Skip to content

Commit c6095bb

Browse files
authored
Merge pull request #5844 from element-hq/feature/fga/room_edit_details
Change : room details edit
2 parents 1fb08fd + 45bb8b6 commit c6095bb

File tree

106 files changed

+632
-171
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

106 files changed

+632
-171
lines changed

features/roomdetails/impl/build.gradle.kts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ dependencies {
5959
implementation(projects.features.roommembermoderation.api)
6060
implementation(projects.features.rolesandpermissions.api)
6161
implementation(projects.features.securityandprivacy.api)
62+
implementation(projects.features.roomdetailsedit.api)
6263
implementation(projects.features.invitepeople.api)
6364

6465
testCommonDependencies(libs, true)
@@ -73,6 +74,7 @@ dependencies {
7374
testImplementation(projects.features.call.test)
7475
testImplementation(projects.features.rolesandpermissions.test)
7576
testImplementation(projects.features.securityandprivacy.test)
77+
testImplementation(projects.features.roomdetailsedit.test)
7678
testImplementation(projects.features.knockrequests.test)
7779
testImplementation(projects.features.messages.test)
7880
testImplementation(projects.features.poll.test)

features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsFlowNode.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,11 @@ import io.element.android.features.rolesandpermissions.api.ChangeRoomMemberRoles
3535
import io.element.android.features.rolesandpermissions.api.ChangeRoomMemberRolesListType
3636
import io.element.android.features.rolesandpermissions.api.RolesAndPermissionsEntryPoint
3737
import io.element.android.features.roomdetails.api.RoomDetailsEntryPoint
38-
import io.element.android.features.roomdetails.impl.edit.RoomDetailsEditNode
3938
import io.element.android.features.roomdetails.impl.invite.RoomInviteMembersNode
4039
import io.element.android.features.roomdetails.impl.members.RoomMemberListNode
4140
import io.element.android.features.roomdetails.impl.members.details.RoomMemberDetailsNode
4241
import io.element.android.features.roomdetails.impl.notificationsettings.RoomNotificationSettingsNode
42+
import io.element.android.features.roomdetailsedit.api.RoomDetailsEditEntryPoint
4343
import io.element.android.features.securityandprivacy.api.SecurityAndPrivacyEntryPoint
4444
import io.element.android.features.userprofile.shared.UserProfileNodeHelper
4545
import io.element.android.features.verifysession.api.OutgoingVerificationEntryPoint
@@ -85,6 +85,7 @@ class RoomDetailsFlowNode(
8585
private val changeRoomMemberRolesEntryPoint: ChangeRoomMemberRolesEntryPoint,
8686
private val rolesAndPermissionsEntryPoint: RolesAndPermissionsEntryPoint,
8787
private val securityAndPrivacyEntryPoint: SecurityAndPrivacyEntryPoint,
88+
private val roomDetailsEditEntryPoint: RoomDetailsEditEntryPoint,
8889
) : BaseFlowNode<RoomDetailsFlowNode.NavTarget>(
8990
backstack = BackStack(
9091
initialElement = plugins.filterIsInstance<RoomDetailsEntryPoint.Params>().first().initialElement.toNavTarget(),
@@ -256,7 +257,7 @@ class RoomDetailsFlowNode(
256257
}
257258

258259
NavTarget.RoomDetailsEdit -> {
259-
createNode<RoomDetailsEditNode>(buildContext)
260+
roomDetailsEditEntryPoint.createNode(this, buildContext)
260261
}
261262

262263
NavTarget.InviteMembers -> {

features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/DefaultRoomDetailsEntryPointTest.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import io.element.android.features.messages.test.FakeMessagesEntryPoint
2020
import io.element.android.features.poll.test.history.FakePollHistoryEntryPoint
2121
import io.element.android.features.reportroom.test.FakeReportRoomEntryPoint
2222
import io.element.android.features.roomdetails.api.RoomDetailsEntryPoint
23+
import io.element.android.features.roomdetailsedit.test.FakeRoomDetailsEditEntryPoint
2324
import io.element.android.features.securityandprivacy.test.FakeSecurityAndPrivacyEntryPoint
2425
import io.element.android.features.verifysession.test.FakeOutgoingVerificationEntryPoint
2526
import io.element.android.libraries.matrix.api.core.EventId
@@ -63,6 +64,7 @@ class DefaultRoomDetailsEntryPointTest {
6364
changeRoomMemberRolesEntryPoint = FakeChangeRoomMemberRolesEntryPoint(),
6465
rolesAndPermissionsEntryPoint = FakeRolesAndPermissionsEntryPoint(),
6566
securityAndPrivacyEntryPoint = FakeSecurityAndPrivacyEntryPoint(),
67+
roomDetailsEditEntryPoint = FakeRoomDetailsEditEntryPoint(),
6668
)
6769
}
6870
val callback = object : RoomDetailsEntryPoint.Callback {
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
/*
2+
* Copyright (c) 2025 Element Creations Ltd.
3+
* Copyright 2022-2025 New Vector Ltd.
4+
*
5+
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial.
6+
* Please see LICENSE files in the repository root for full details.
7+
*/
8+
9+
plugins {
10+
id("io.element.android-library")
11+
id("kotlin-parcelize")
12+
}
13+
14+
android {
15+
namespace = "io.element.android.features.roomdetailsedit.api"
16+
}
17+
18+
dependencies {
19+
implementation(projects.libraries.architecture)
20+
implementation(projects.libraries.matrix.api)
21+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
/*
2+
* Copyright (c) 2025 Element Creations Ltd.
3+
* Copyright 2023-2025 New Vector Ltd.
4+
*
5+
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial.
6+
* Please see LICENSE files in the repository root for full details.
7+
*/
8+
9+
package io.element.android.features.roomdetailsedit.api
10+
11+
import io.element.android.libraries.architecture.SimpleFeatureEntryPoint
12+
13+
fun interface RoomDetailsEditEntryPoint : SimpleFeatureEntryPoint
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
import extension.setupDependencyInjection
2+
import extension.testCommonDependencies
3+
4+
/*
5+
* Copyright (c) 2025 Element Creations Ltd.
6+
* Copyright 2023, 2024 New Vector Ltd.
7+
*
8+
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial.
9+
* Please see LICENSE files in the repository root for full details.
10+
*/
11+
12+
plugins {
13+
id("io.element.android-compose-library")
14+
id("kotlin-parcelize")
15+
}
16+
17+
android {
18+
namespace = "io.element.android.features.roomdetailsedit.impl"
19+
testOptions {
20+
unitTests {
21+
isIncludeAndroidResources = true
22+
}
23+
}
24+
}
25+
26+
setupDependencyInjection()
27+
28+
dependencies {
29+
implementation(projects.libraries.core)
30+
implementation(projects.libraries.architecture)
31+
implementation(projects.libraries.matrix.api)
32+
implementation(projects.libraries.matrixui)
33+
implementation(projects.libraries.designsystem)
34+
implementation(projects.libraries.uiStrings)
35+
implementation(projects.libraries.androidutils)
36+
implementation(projects.libraries.mediapickers.api)
37+
implementation(projects.libraries.mediaupload.api)
38+
implementation(projects.libraries.mediaviewer.api)
39+
implementation(projects.libraries.featureflag.api)
40+
implementation(projects.libraries.permissions.api)
41+
implementation(projects.libraries.preferences.api)
42+
implementation(projects.services.analytics.api)
43+
implementation(projects.libraries.testtags)
44+
api(projects.features.roomdetailsedit.api)
45+
api(projects.services.apperror.api)
46+
implementation(libs.coil.compose)
47+
48+
testCommonDependencies(libs, true)
49+
testImplementation(projects.libraries.matrix.test)
50+
testImplementation(projects.libraries.mediaupload.test)
51+
testImplementation(projects.libraries.mediapickers.test)
52+
testImplementation(projects.libraries.mediaviewer.test)
53+
testImplementation(projects.libraries.permissions.test)
54+
testImplementation(projects.libraries.preferences.test)
55+
testImplementation(projects.libraries.featureflag.test)
56+
testImplementation(projects.services.analytics.test)
57+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
/*
2+
* Copyright (c) 2025 Element Creations Ltd.
3+
* Copyright 2023-2025 New Vector Ltd.
4+
*
5+
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial.
6+
* Please see LICENSE files in the repository root for full details.
7+
*/
8+
9+
package io.element.android.features.roomdetailsedit.impl
10+
11+
import com.bumble.appyx.core.modality.BuildContext
12+
import com.bumble.appyx.core.node.Node
13+
import dev.zacsweers.metro.AppScope
14+
import dev.zacsweers.metro.ContributesBinding
15+
import io.element.android.features.roomdetailsedit.api.RoomDetailsEditEntryPoint
16+
import io.element.android.libraries.architecture.createNode
17+
18+
@ContributesBinding(AppScope::class)
19+
class DefaultRoomDetailsEditEntryPoint : RoomDetailsEditEntryPoint {
20+
override fun createNode(parentNode: Node, buildContext: BuildContext): Node {
21+
return parentNode.createNode<RoomDetailsEditNode>(buildContext)
22+
}
23+
}

features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/edit/RoomDetailsEditEvents.kt renamed to features/roomdetailsedit/impl/src/main/kotlin/io/element/android/features/roomdetailsedit/impl/RoomDetailsEditEvents.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
* Please see LICENSE files in the repository root for full details.
77
*/
88

9-
package io.element.android.features.roomdetails.impl.edit
9+
package io.element.android.features.roomdetailsedit.impl
1010

1111
import io.element.android.libraries.matrix.ui.media.AvatarAction
1212

features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/edit/RoomDetailsEditNode.kt renamed to features/roomdetailsedit/impl/src/main/kotlin/io/element/android/features/roomdetailsedit/impl/RoomDetailsEditNode.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
* Please see LICENSE files in the repository root for full details.
77
*/
88

9-
package io.element.android.features.roomdetails.impl.edit
9+
package io.element.android.features.roomdetailsedit.impl
1010

1111
import androidx.compose.runtime.Composable
1212
import androidx.compose.ui.Modifier

features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/edit/RoomDetailsEditPresenter.kt renamed to features/roomdetailsedit/impl/src/main/kotlin/io/element/android/features/roomdetailsedit/impl/RoomDetailsEditPresenter.kt

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,9 @@
66
* Please see LICENSE files in the repository root for full details.
77
*/
88

9-
package io.element.android.features.roomdetails.impl.edit
9+
package io.element.android.features.roomdetailsedit.impl
1010

11+
import android.Manifest
1112
import android.net.Uri
1213
import androidx.compose.runtime.Composable
1314
import androidx.compose.runtime.LaunchedEffect
@@ -32,9 +33,6 @@ import io.element.android.libraries.matrix.api.room.JoinedRoom
3233
import io.element.android.libraries.matrix.api.room.StateEventType
3334
import io.element.android.libraries.matrix.api.room.powerlevels.canSendState
3435
import io.element.android.libraries.matrix.ui.media.AvatarAction
35-
import io.element.android.libraries.matrix.ui.room.avatarUrl
36-
import io.element.android.libraries.matrix.ui.room.rawName
37-
import io.element.android.libraries.matrix.ui.room.topic
3836
import io.element.android.libraries.mediapickers.api.PickerProvider
3937
import io.element.android.libraries.mediaupload.api.MediaOptimizationConfigProvider
4038
import io.element.android.libraries.mediaupload.api.MediaPreProcessor
@@ -54,29 +52,29 @@ class RoomDetailsEditPresenter(
5452
permissionsPresenterFactory: PermissionsPresenter.Factory,
5553
private val mediaOptimizationConfigProvider: MediaOptimizationConfigProvider,
5654
) : Presenter<RoomDetailsEditState> {
57-
private val cameraPermissionPresenter = permissionsPresenterFactory.create(android.Manifest.permission.CAMERA)
55+
private val cameraPermissionPresenter = permissionsPresenterFactory.create(Manifest.permission.CAMERA)
5856
private var pendingPermissionRequest = false
5957

6058
@Composable
6159
override fun present(): RoomDetailsEditState {
6260
val cameraPermissionState = cameraPermissionPresenter.present()
6361
val roomSyncUpdateFlow = room.syncUpdateFlow.collectAsState()
64-
65-
val roomAvatarUri = room.avatarUrl()
62+
val roomInfo by room.roomInfoFlow.collectAsState()
63+
val roomAvatarUri = roomInfo.avatarUrl
6664
var roomAvatarUriEdited by rememberSaveable { mutableStateOf<String?>(null) }
6765
LaunchedEffect(roomAvatarUri) {
6866
// Every time the roomAvatar change (from sync), we can set the new avatar.
6967
temporaryUriDeleter.delete(roomAvatarUriEdited?.toUri())
7068
roomAvatarUriEdited = roomAvatarUri
7169
}
7270

73-
val roomRawNameTrimmed = room.rawName().orEmpty().trim()
71+
val roomRawNameTrimmed = roomInfo.rawName.orEmpty().trim()
7472
var roomRawNameEdited by rememberSaveable { mutableStateOf("") }
7573
LaunchedEffect(roomRawNameTrimmed) {
7674
// Every time the rawName change (from sync), we can set the new name.
7775
roomRawNameEdited = roomRawNameTrimmed
7876
}
79-
val roomTopicTrimmed = room.topic().orEmpty().trim()
77+
val roomTopicTrimmed = roomInfo.topic.orEmpty().trim()
8078
var roomTopicEdited by rememberSaveable { mutableStateOf("") }
8179
LaunchedEffect(roomTopicTrimmed) {
8280
// Every time the topic change (from sync), we can set the new topic.
@@ -192,6 +190,7 @@ class RoomDetailsEditPresenter(
192190
saveButtonEnabled = saveButtonEnabled,
193191
saveAction = saveAction.value,
194192
cameraPermissionState = cameraPermissionState,
193+
isSpace = roomInfo.isSpace,
195194
eventSink = ::handleEvent,
196195
)
197196
}

0 commit comments

Comments
 (0)