Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -172,11 +172,13 @@ class RoomListPresenter(
val showUnreadCount by produceState(false) {
value = featureFlagService.isFeatureEnabled(FeatureFlags.UnreadIndicatorCount)
}
val isSpaceSelected = spaceFiltersState.selectedFilter() != null

val contentState = roomListContentState(
securityBannerDismissed,
showNewNotificationSoundBanner,
showUnreadCount,
hasSelectedSpace = isSpaceSelected,
)

return RoomListState(
Expand Down Expand Up @@ -234,10 +236,19 @@ class RoomListPresenter(
securityBannerDismissed: Boolean,
showNewNotificationSoundBanner: Boolean,
showUnreadCount: Boolean,
hasSelectedSpace: Boolean,
): RoomListContentState {
val roomSummaries by produceState(initialValue = AsyncData.Loading()) {
roomListDataSource.roomSummariesFlow.collect { value = AsyncData.Success(it) }
}
val spaceMemberRoomIds by produceState<Set<RoomId>>(initialValue = emptySet()) {
client.spaceService.spaceFiltersFlow.collect { filters ->
value = filters.flatMap { it.descendants }.toSet()
}
}
val hideSpaceRooms by remember {
sessionPreferencesStore.isHideSpaceRoomMembersEnabled()
}.collectAsState(initial = false)
val loadingState by roomListDataSource.loadingState.collectAsState()
val showEmpty by remember {
derivedStateOf {
Expand All @@ -259,13 +270,19 @@ class RoomListPresenter(
else -> {
coldStartWatcher.onRoomListVisible()

val filteredSummaries = if (hideSpaceRooms && !hasSelectedSpace) {
roomSummaries.dataOrNull().orEmpty().filter { it.roomId !in spaceMemberRoomIds }
} else {
roomSummaries.dataOrNull().orEmpty()
}

RoomListContentState.Rooms(
securityBannerState = securityBannerState,
showNewNotificationSoundBanner = showNewNotificationSoundBanner,
showUnreadCount = showUnreadCount,
fullScreenIntentPermissionsState = fullScreenIntentPermissionsPresenter.present(),
batteryOptimizationState = batteryOptimizationPresenter.present(),
summaries = roomSummaries.dataOrNull().orEmpty().toImmutableList(),
summaries = filteredSummaries.toImmutableList(),
seenRoomInvites = seenRoomInvites.toImmutableSet(),
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,4 +21,5 @@ sealed interface AdvancedSettingsEvents {
data class SetTimelineMediaPreviewValue(val value: MediaPreviewValue) : AdvancedSettingsEvents
data class SetHideInviteAvatars(val value: Boolean) : AdvancedSettingsEvents
data class SetLiveLocationMinimumDistanceUpdate(val value: Int) : AdvancedSettingsEvents
data class SetHideSpaceRoomMembers(val enabled: Boolean) : AdvancedSettingsEvents
}
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,10 @@ class AdvancedSettingsPresenter(
appPreferencesStore.getLiveLocationMinimumDistanceInMetersUpdateFlow().collect { value = it }
}

val isHideSpaceRoomMembersEnabled by remember {
sessionPreferencesStore.isHideSpaceRoomMembersEnabled()
}.collectAsState(initial = false)

val mediaPreviewConfigState = mediaPreviewConfigStateStore.state()

val themeOption by remember {
Expand Down Expand Up @@ -130,6 +134,9 @@ class AdvancedSettingsPresenter(
is AdvancedSettingsEvents.SetVideoUploadQuality -> sessionCoroutineScope.launch {
sessionPreferencesStore.setVideoCompressionPreset(event.videoPreset)
}
is AdvancedSettingsEvents.SetHideSpaceRoomMembers -> sessionCoroutineScope.launch {
sessionPreferencesStore.setHideSpaceRoomMembers(event.enabled)
}
}
}

Expand All @@ -141,6 +148,7 @@ class AdvancedSettingsPresenter(
availableThemeOptions = availableThemeOptions,
mediaPreviewConfigState = mediaPreviewConfigState,
liveLocationMinimumDistanceUpdate = liveLocationMinimumDistanceUpdate,
isHideSpaceRoomMembersEnabled = isHideSpaceRoomMembersEnabled,
eventSink = ::handleEvent,
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ data class AdvancedSettingsState(
val availableThemeOptions: ImmutableList<ThemeOption>,
val mediaPreviewConfigState: MediaPreviewConfigState,
val liveLocationMinimumDistanceUpdate: Int?,
val isHideSpaceRoomMembersEnabled: Boolean,
val eventSink: (AdvancedSettingsEvents) -> Unit
)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ fun aAdvancedSettingsState(
hideInviteAvatars: Boolean = false,
timelineMediaPreviewValue: MediaPreviewValue = MediaPreviewValue.On,
liveLocationMinimumDistanceUpdate: Int? = 50,
isHideSpaceRoomMembersEnabled: Boolean = false,
setTimelineMediaPreviewAction: AsyncAction<Unit> = AsyncAction.Uninitialized,
setHideInviteAvatarsAction: AsyncAction<Unit> = AsyncAction.Uninitialized,
eventSink: (AdvancedSettingsEvents) -> Unit = {},
Expand All @@ -58,5 +59,6 @@ fun aAdvancedSettingsState(
setHideInviteAvatarsAction = setHideInviteAvatarsAction
),
liveLocationMinimumDistanceUpdate = liveLocationMinimumDistanceUpdate,
isHideSpaceRoomMembersEnabled = isHideSpaceRoomMembersEnabled,
eventSink = eventSink
)
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,19 @@ fun AdvancedSettingsView(
),
onClick = { state.eventSink(AdvancedSettingsEvents.SetSharePresenceEnabled(!state.isSharePresenceEnabled)) }
)
ListItem(
headlineContent = {
Text(text = stringResource(id = R.string.screen_advanced_settings_hide_space_rooms_toggle_title))
},
supportingContent = {
Text(text = stringResource(id = R.string.screen_advanced_settings_hide_space_rooms_toggle_description))
},
trailingContent = ListItemContent.Switch(
checked = state.isHideSpaceRoomMembersEnabled,
),
onClick = { state.eventSink(AdvancedSettingsEvents.SetHideSpaceRoomMembers(!state.isHideSpaceRoomMembersEnabled)) }
)

val compressImages = state.mediaOptimizationState?.shouldCompressImages

when (state.mediaOptimizationState) {
Expand Down
10 changes: 10 additions & 0 deletions features/preferences/impl/src/main/res/values/temporary.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?><!--
~ Copyright (c) 2026 Element Creations Ltd.
~
~ SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial.
~ Please see LICENSE files in the repository root for full details.
-->
<resources>
<string name="screen_advanced_settings_hide_space_rooms_toggle_title">Hide rooms from spaces</string>
<string name="screen_advanced_settings_hide_space_rooms_toggle_description">When enabled, rooms that are part of a space will be hidden from the main room list.</string>
</resources>
Original file line number Diff line number Diff line change
Expand Up @@ -35,5 +35,8 @@ interface SessionPreferencesStore {
suspend fun setVideoCompressionPreset(preset: VideoCompressionPreset)
fun getVideoCompressionPreset(): Flow<VideoCompressionPreset>

suspend fun setHideSpaceRoomMembers(enabled: Boolean)
fun isHideSpaceRoomMembersEnabled(): Flow<Boolean>

suspend fun clear()
}
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ class DefaultSessionPreferencesStore(
private val skipSessionVerification = booleanPreferencesKey("skipSessionVerification")
private val compressImages = booleanPreferencesKey("compressMedia")
private val compressMediaPreset = stringPreferencesKey("compressMediaPreset")
private val hideSpaceRoomMembers = booleanPreferencesKey("hideSpaceRoomMembers")

private val dataStoreFile = storeFile(context, sessionId)
private val store = PreferenceDataStoreFactory.create(
Expand Down Expand Up @@ -94,6 +95,9 @@ class DefaultSessionPreferencesStore(
override fun getVideoCompressionPreset(): Flow<VideoCompressionPreset> = get(compressMediaPreset) { VideoCompressionPreset.STANDARD.name }
.map { tryOrNull { VideoCompressionPreset.valueOf(it) } ?: VideoCompressionPreset.STANDARD }

override suspend fun setHideSpaceRoomMembers(enabled: Boolean) = update(hideSpaceRoomMembers, enabled)
override fun isHideSpaceRoomMembersEnabled(): Flow<Boolean> = get(hideSpaceRoomMembers) { false }

override suspend fun clear() {
dataStoreFile.safeDelete()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ class InMemorySessionPreferencesStore(
private val isSessionVerificationSkipped = MutableStateFlow(isSessionVerificationSkipped)
private val doesCompressMedia = MutableStateFlow(doesCompressMedia)
private val videoCompressionPreset = MutableStateFlow(videoCompressionPreset)
private val hideSpaceRoomMembers = MutableStateFlow(false)
var clearCallCount = 0
private set

Expand Down Expand Up @@ -84,6 +85,14 @@ class InMemorySessionPreferencesStore(
return videoCompressionPreset
}

override suspend fun setHideSpaceRoomMembers(enabled: Boolean) {
hideSpaceRoomMembers.value = enabled
}

override fun isHideSpaceRoomMembersEnabled(): Flow<Boolean> {
return hideSpaceRoomMembers
}

override suspend fun clear() {
clearCallCount++
isSendPublicReadReceiptsEnabled.tryEmit(true)
Expand Down