From 95c362d31af6ee0816167653e3629f3fce426ad1 Mon Sep 17 00:00:00 2001 From: Mauro Romito Date: Tue, 5 May 2026 18:31:41 +0200 Subject: [PATCH] Add the setting to change live location permissions to the change permissions screen. --- .../en-US.lproj/Localizable.strings | 1 + .../en.lproj/Localizable.strings | 1 + ElementX/Sources/Generated/Strings.swift | 2 ++ .../RoomChangePermissionsScreenModels.swift | 6 +++- ...RoomChangePermissionsScreenViewModel.swift | 4 ++- .../Services/Room/RoomPermissions.swift | 28 +++++++++++-------- UnitTests/Sources/RoomPermissionsTests.swift | 1 + 7 files changed, 29 insertions(+), 14 deletions(-) diff --git a/ElementX/Resources/Localizations/en-US.lproj/Localizable.strings b/ElementX/Resources/Localizations/en-US.lproj/Localizable.strings index dab5af1df..610581e92 100644 --- a/ElementX/Resources/Localizations/en-US.lproj/Localizable.strings +++ b/ElementX/Resources/Localizations/en-US.lproj/Localizable.strings @@ -1132,6 +1132,7 @@ "screen_room_change_permissions_delete_messages" = "Remove messages"; "screen_room_change_permissions_everyone" = "Member"; "screen_room_change_permissions_invite_people" = "Invite people"; +"screen_room_change_permissions_live_location" = "Share live location"; "screen_room_change_permissions_manage_space" = "Manage space"; "screen_room_change_permissions_manage_space_rooms" = "Manage rooms"; "screen_room_change_permissions_member_moderation" = "Manage members"; diff --git a/ElementX/Resources/Localizations/en.lproj/Localizable.strings b/ElementX/Resources/Localizations/en.lproj/Localizable.strings index 26adcd020..489ca96f3 100644 --- a/ElementX/Resources/Localizations/en.lproj/Localizable.strings +++ b/ElementX/Resources/Localizations/en.lproj/Localizable.strings @@ -1132,6 +1132,7 @@ "screen_room_change_permissions_delete_messages" = "Remove messages"; "screen_room_change_permissions_everyone" = "Member"; "screen_room_change_permissions_invite_people" = "Invite people"; +"screen_room_change_permissions_live_location" = "Share live location"; "screen_room_change_permissions_manage_space" = "Manage space"; "screen_room_change_permissions_manage_space_rooms" = "Manage rooms"; "screen_room_change_permissions_member_moderation" = "Manage members"; diff --git a/ElementX/Sources/Generated/Strings.swift b/ElementX/Sources/Generated/Strings.swift index b09a8d319..aa9238f95 100644 --- a/ElementX/Sources/Generated/Strings.swift +++ b/ElementX/Sources/Generated/Strings.swift @@ -2632,6 +2632,8 @@ internal enum L10n { internal static var screenRoomChangePermissionsEveryone: String { return L10n.tr("Localizable", "screen_room_change_permissions_everyone") } /// Invite people internal static var screenRoomChangePermissionsInvitePeople: String { return L10n.tr("Localizable", "screen_room_change_permissions_invite_people") } + /// Share live location + internal static var screenRoomChangePermissionsLiveLocation: String { return L10n.tr("Localizable", "screen_room_change_permissions_live_location") } /// Manage space internal static var screenRoomChangePermissionsManageSpace: String { return L10n.tr("Localizable", "screen_room_change_permissions_manage_space") } /// Manage rooms diff --git a/ElementX/Sources/Screens/RoomChangePermissionsScreen/RoomChangePermissionsScreenModels.swift b/ElementX/Sources/Screens/RoomChangePermissionsScreen/RoomChangePermissionsScreenModels.swift index 901784307..265447b77 100644 --- a/ElementX/Sources/Screens/RoomChangePermissionsScreen/RoomChangePermissionsScreenModels.swift +++ b/ElementX/Sources/Screens/RoomChangePermissionsScreen/RoomChangePermissionsScreenModels.swift @@ -114,7 +114,11 @@ extension RoomChangePermissionsScreenViewState { RoomPermissionsSetting(title: L10n.screenRoomChangePermissionsDeleteMessages, value: currentPermissions.redact, ownPowerLevel: ownPowerLevel, - keyPath: \.redact) + keyPath: \.redact), + RoomPermissionsSetting(title: L10n.screenRoomChangePermissionsLiveLocation, + value: currentPermissions.liveLocation, + ownPowerLevel: ownPowerLevel, + keyPath: \.liveLocation) ] } case .manageSpace: diff --git a/ElementX/Sources/Screens/RoomChangePermissionsScreen/RoomChangePermissionsScreenViewModel.swift b/ElementX/Sources/Screens/RoomChangePermissionsScreen/RoomChangePermissionsScreenViewModel.swift index a827442b0..5f5d1d6be 100644 --- a/ElementX/Sources/Screens/RoomChangePermissionsScreen/RoomChangePermissionsScreenViewModel.swift +++ b/ElementX/Sources/Screens/RoomChangePermissionsScreen/RoomChangePermissionsScreenViewModel.swift @@ -67,7 +67,9 @@ class RoomChangePermissionsScreenViewModel: RoomChangePermissionsScreenViewModel .flatMap { $0 } .filter { state.currentPermissions[keyPath: $0.keyPath] != $0.value } for setting in changedSettings { - changes[keyPath: setting.rustKeyPath] = setting.value + for keyPath in setting.rustKeyPaths { + changes[keyPath: keyPath] = setting.value + } } switch await roomProxy.applyPowerLevelChanges(changes) { diff --git a/ElementX/Sources/Services/Room/RoomPermissions.swift b/ElementX/Sources/Services/Room/RoomPermissions.swift index cbe060155..966e576e2 100644 --- a/ElementX/Sources/Services/Room/RoomPermissions.swift +++ b/ElementX/Sources/Services/Room/RoomPermissions.swift @@ -36,19 +36,20 @@ struct RoomPermissionsSetting: Identifiable { /// The `RoomPermissions` property that this setting is for. let keyPath: KeyPath /// The `RoomPowerLevelChanges` property that this setting is saved into. - var rustKeyPath: WritableKeyPath { + var rustKeyPaths: [WritableKeyPath] { switch keyPath { - case \.ban: \.ban - case \.invite: \.invite - case \.kick: \.kick - case \.redact: \.redact - case \.eventsDefault: \.eventsDefault - case \.stateDefault: \.stateDefault - case \.usersDefault: \.usersDefault - case \.roomName: \.roomName - case \.roomAvatar: \.roomAvatar - case \.roomTopic: \.roomTopic - case \.spaceChild: \.spaceChild + case \.ban: [\.ban] + case \.invite: [\.invite] + case \.kick: [\.kick] + case \.redact: [\.redact] + case \.eventsDefault: [\.eventsDefault] + case \.stateDefault: [\.stateDefault] + case \.usersDefault: [\.usersDefault] + case \.roomName: [\.roomName] + case \.roomAvatar: [\.roomAvatar] + case \.roomTopic: [\.roomTopic] + case \.spaceChild: [\.spaceChild] + case \.liveLocation: [\.beacon, \.beaconInfo] default: fatalError("Unexpected key path: \(keyPath)") } } @@ -96,6 +97,8 @@ struct RoomPermissions { var roomTopic: Int64 /// The level required to add/remove childrens from a space. var spaceChild: Int64 + /// The level required to send live location updates + var liveLocation: Int64 } extension RoomPermissions { @@ -112,5 +115,6 @@ extension RoomPermissions { roomAvatar = powerLevels.roomAvatar roomTopic = powerLevels.roomTopic spaceChild = powerLevels.spaceChild + liveLocation = max(powerLevels.beacon, powerLevels.beaconInfo) } } diff --git a/UnitTests/Sources/RoomPermissionsTests.swift b/UnitTests/Sources/RoomPermissionsTests.swift index 0a9b2b40b..47af97304 100644 --- a/UnitTests/Sources/RoomPermissionsTests.swift +++ b/UnitTests/Sources/RoomPermissionsTests.swift @@ -43,5 +43,6 @@ struct RoomPermissionsTests { #expect(permissions.roomAvatar == RoomRole.user.powerLevelValue) #expect(permissions.roomTopic == RoomRole.user.powerLevelValue) #expect(permissions.spaceChild == RoomRole.administrator.powerLevelValue) + #expect(permissions.liveLocation == RoomRole.moderator.powerLevelValue) } }