Add Konsist test to check that toPersistentList() is not used.

Same for `toPersistentSet()` and `toPersistentMap()`.
Fix existing issues.
This commit is contained in:
Benoit Marty 2025-10-08 14:25:15 +02:00
parent 2fa1b9d448
commit 67c9daa0bf
85 changed files with 305 additions and 254 deletions

View file

@ -37,10 +37,8 @@ import io.element.android.libraries.matrix.ui.model.roleOf
import io.element.android.libraries.matrix.ui.room.PowerLevelRoomMemberComparator
import io.element.android.services.analytics.api.AnalyticsService
import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.PersistentList
import kotlinx.collections.immutable.persistentListOf
import kotlinx.collections.immutable.toImmutableList
import kotlinx.collections.immutable.toPersistentList
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.map
@ -73,11 +71,11 @@ class ChangeRolesPresenter(
}
val exitState: MutableState<AsyncAction<Unit>> = remember { mutableStateOf(AsyncAction.Uninitialized) }
val saveState: MutableState<AsyncAction<Unit>> = remember { mutableStateOf(AsyncAction.Uninitialized) }
val usersWithRole = produceState(initialValue = persistentListOf()) {
val usersWithRole = produceState<ImmutableList<MatrixUser>>(initialValue = persistentListOf()) {
room.usersWithRole(role).map { members -> members.map { it.toMatrixUser() } }
.onEach { users ->
val previous: PersistentList<MatrixUser> = value
value = users.toPersistentList()
val previous = value
value = users.toImmutableList()
// Users who were selected but didn't have the role, so their role change was pending
val toAdd = selectedUsers.value.filter { user -> users.none { it.userId == user.userId } && previous.none { it.userId == user.userId } }
// Users who no longer have the role

View file

@ -32,8 +32,8 @@ import io.element.android.libraries.previewutils.room.aRoomMemberList
import io.element.android.services.analytics.test.FakeAnalyticsService
import io.element.android.tests.testutils.testCoroutineDispatchers
import kotlinx.collections.immutable.persistentMapOf
import kotlinx.collections.immutable.toPersistentList
import kotlinx.collections.immutable.toPersistentMap
import kotlinx.collections.immutable.toImmutableList
import kotlinx.collections.immutable.toImmutableMap
import kotlinx.coroutines.test.TestScope
import kotlinx.coroutines.test.runTest
import org.junit.Test
@ -103,7 +103,7 @@ class ChangeRolesPresenterTest {
// Owner - creator
aRoomMember(userId = creatorUserId, role = RoomMember.Role.Owner(isCreator = true))
)
givenRoomMembersState(RoomMembersState.Ready(roomMemberList.toPersistentList()))
givenRoomMembersState(RoomMembersState.Ready(roomMemberList.toImmutableList()))
}
val presenter = createChangeRolesPresenter(room = room)
moleculeFlow(RecompositionMode.Immediate) {
@ -124,7 +124,7 @@ class ChangeRolesPresenterTest {
val creatorUserId = UserId("@creator:matrix.org")
val memberList = aRoomMemberList()
.plus(aRoomMember(displayName = "CREATOR", role = RoomMember.Role.Owner(isCreator = true), userId = creatorUserId))
.toPersistentList()
.toImmutableList()
givenRoomInfo(aRoomInfo(roomCreators = listOf(creatorUserId)))
givenRoomMembersState(RoomMembersState.Ready(memberList))
}
@ -203,7 +203,7 @@ class ChangeRolesPresenterTest {
assertThat(initialResults?.moderators).hasSize(1)
assertThat(initialResults?.admins).hasSize(1)
room.givenRoomMembersState(RoomMembersState.Ready(aRoomMemberList().take(1).toPersistentList()))
room.givenRoomMembersState(RoomMembersState.Ready(aRoomMemberList().take(1).toImmutableList()))
skipItems(1)
val searchResults = (awaitItem().searchResults as? SearchBarResultState.Results)?.results
@ -552,7 +552,7 @@ class ChangeRolesPresenterTest {
private fun roomPowerLevelsWithRoles(vararg pairs: Pair<UserId, RoomMember.Role>): RoomPowerLevels {
return RoomPowerLevels(
values = defaultRoomPowerLevelValues(),
users = pairs.associate { (userId, role) -> userId to role.powerLevel }.toPersistentMap()
users = pairs.associate { (userId, role) -> userId to role.powerLevel }.toImmutableMap()
)
}
}

View file

@ -11,7 +11,7 @@ import io.element.android.libraries.matrix.api.core.UserId
import io.element.android.libraries.matrix.api.user.MatrixUser
import io.element.android.libraries.sessionstorage.api.SessionData
import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.toPersistentList
import kotlinx.collections.immutable.toImmutableList
class CurrentUserWithNeighborsBuilder {
/**
@ -64,6 +64,6 @@ class CurrentUserWithNeighborsBuilder {
}
}
}
.toPersistentList()
.toImmutableList()
}
}

View file

@ -21,7 +21,7 @@ import io.element.android.libraries.designsystem.utils.snackbar.SnackbarMessage
import io.element.android.libraries.matrix.api.core.UserId
import io.element.android.libraries.matrix.api.user.MatrixUser
import io.element.android.libraries.ui.strings.CommonStrings
import kotlinx.collections.immutable.toPersistentList
import kotlinx.collections.immutable.toImmutableList
open class HomeStateProvider : PreviewParameterProvider<HomeState> {
override val values: Sequence<HomeState>
@ -63,7 +63,7 @@ internal fun aHomeState(
directLogoutState: DirectLogoutState = aDirectLogoutState(),
eventSink: (HomeEvents) -> Unit = {}
) = HomeState(
currentUserAndNeighbors = currentUserAndNeighbors.toPersistentList(),
currentUserAndNeighbors = currentUserAndNeighbors.toImmutableList(),
showAvatarIndicator = showAvatarIndicator,
hasNetworkConnection = hasNetworkConnection,
snackbarMessage = snackbarMessage,

View file

@ -72,7 +72,7 @@ import io.element.android.libraries.testtags.testTag
import io.element.android.libraries.ui.strings.CommonStrings
import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.persistentListOf
import kotlinx.collections.immutable.toPersistentList
import kotlinx.collections.immutable.toImmutableList
@OptIn(ExperimentalMaterial3Api::class)
@Composable
@ -374,7 +374,7 @@ internal fun DefaultRoomListTopBarWithIndicatorPreview() = ElementPreview {
internal fun DefaultRoomListTopBarMultiAccountPreview() = ElementPreview {
DefaultRoomListTopBar(
title = stringResource(R.string.screen_roomlist_main_space_title),
currentUserAndNeighbors = aMatrixUserList().take(3).toPersistentList(),
currentUserAndNeighbors = aMatrixUserList().take(3).toImmutableList(),
showAvatarIndicator = false,
areSearchResultsDisplayed = false,
scrollBehavior = TopAppBarDefaults.exitUntilCollapsedScrollBehavior(rememberTopAppBarState()),

View file

@ -14,7 +14,7 @@ import dev.zacsweers.metro.Inject
import io.element.android.features.home.impl.filters.selection.FilterSelectionStrategy
import io.element.android.libraries.architecture.Presenter
import io.element.android.libraries.matrix.api.roomlist.RoomListService
import kotlinx.collections.immutable.toPersistentList
import kotlinx.collections.immutable.toImmutableList
import kotlinx.coroutines.flow.map
import io.element.android.libraries.matrix.api.roomlist.RoomListFilter as MatrixRoomListFilter
@ -23,7 +23,7 @@ class RoomListFiltersPresenter(
private val roomListService: RoomListService,
private val filterSelectionStrategy: FilterSelectionStrategy,
) : Presenter<RoomListFiltersState> {
private val initialFilters = filterSelectionStrategy.filterSelectionStates.value.toPersistentList()
private val initialFilters = filterSelectionStrategy.filterSelectionStates.value.toImmutableList()
@Composable
override fun present(): RoomListFiltersState {
@ -41,7 +41,7 @@ class RoomListFiltersPresenter(
val filters by produceState(initialValue = initialFilters) {
filterSelectionStrategy.filterSelectionStates
.map { filters ->
value = filters.toPersistentList()
value = filters.toImmutableList()
filters.mapNotNull { filterState ->
if (!filterState.isSelected) {
return@mapNotNull null

View file

@ -9,7 +9,7 @@ package io.element.android.features.home.impl.filters
import io.element.android.features.home.impl.filters.selection.FilterSelectionState
import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.toPersistentList
import kotlinx.collections.immutable.toImmutableList
data class RoomListFiltersState(
val filterSelectionStates: ImmutableList<FilterSelectionState>,
@ -21,6 +21,6 @@ data class RoomListFiltersState(
return filterSelectionStates
.filter { it.isSelected }
.map { it.filter }
.toPersistentList()
.toImmutableList()
}
}

View file

@ -16,7 +16,7 @@ import io.element.android.libraries.push.api.battery.BatteryOptimizationState
import io.element.android.libraries.push.api.battery.aBatteryOptimizationState
import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.persistentListOf
import kotlinx.collections.immutable.toPersistentSet
import kotlinx.collections.immutable.toImmutableSet
open class RoomListContentStateProvider : PreviewParameterProvider<RoomListContentState> {
override val values: Sequence<RoomListContentState>
@ -45,7 +45,7 @@ internal fun aRoomsContentState(
fullScreenIntentPermissionsState = fullScreenIntentPermissionsState,
batteryOptimizationState = batteryOptimizationState,
summaries = summaries,
seenRoomInvites = seenRoomInvites.toPersistentSet(),
seenRoomInvites = seenRoomInvites.toImmutableSet(),
)
internal fun aSkeletonContentState() = RoomListContentState.Skeleton(16)

View file

@ -51,8 +51,8 @@ import io.element.android.libraries.push.api.battery.BatteryOptimizationState
import io.element.android.libraries.push.api.notifications.NotificationCleaner
import io.element.android.services.analytics.api.AnalyticsService
import io.element.android.services.analyticsproviders.api.trackers.captureInteraction
import kotlinx.collections.immutable.toPersistentList
import kotlinx.collections.immutable.toPersistentSet
import kotlinx.collections.immutable.toImmutableList
import kotlinx.collections.immutable.toImmutableSet
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.Job
@ -240,8 +240,8 @@ class RoomListPresenter(
showNewNotificationSoundBanner = showNewNotificationSoundBanner,
fullScreenIntentPermissionsState = fullScreenIntentPermissionsPresenter.present(),
batteryOptimizationState = batteryOptimizationPresenter.present(),
summaries = roomSummaries.dataOrNull().orEmpty().toPersistentList(),
seenRoomInvites = seenRoomInvites.toPersistentSet(),
summaries = roomSummaries.dataOrNull().orEmpty().toImmutableList(),
seenRoomInvites = seenRoomInvites.toImmutableSet(),
)
}
}

View file

@ -25,7 +25,7 @@ import io.element.android.libraries.designsystem.components.avatar.AvatarSize
import io.element.android.libraries.push.api.battery.aBatteryOptimizationState
import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.persistentListOf
import kotlinx.collections.immutable.toPersistentList
import kotlinx.collections.immutable.toImmutableList
open class RoomListStateProvider : PreviewParameterProvider<RoomListState> {
override val values: Sequence<RoomListState>
@ -122,5 +122,5 @@ internal fun generateRoomListRoomSummaryList(
avatarData = AvatarData("!id$index", "${(65 + index % 26).toChar()}", size = AvatarSize.RoomListItem),
id = "!roomId$index:domain",
)
}.toPersistentList()
}.toImmutableList()
}

View file

@ -15,8 +15,8 @@ import io.element.android.libraries.matrix.api.roomlist.RoomList
import io.element.android.libraries.matrix.api.roomlist.RoomListFilter
import io.element.android.libraries.matrix.api.roomlist.RoomListService
import io.element.android.libraries.matrix.api.roomlist.loadAllIncrementally
import kotlinx.collections.immutable.PersistentList
import kotlinx.collections.immutable.toPersistentList
import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.toImmutableList
import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flowOn
@ -36,11 +36,11 @@ class RoomListSearchDataSource(
source = RoomList.Source.All,
)
val roomSummaries: Flow<PersistentList<RoomListRoomSummary>> = roomList.filteredSummaries
val roomSummaries: Flow<ImmutableList<RoomListRoomSummary>> = roomList.filteredSummaries
.map { roomSummaries ->
roomSummaries
.map(roomSummaryFactory::create)
.toPersistentList()
.toImmutableList()
}
.flowOn(coroutineDispatchers.computation)

View file

@ -17,7 +17,7 @@ import io.element.android.libraries.architecture.Presenter
import io.element.android.libraries.matrix.api.MatrixClient
import io.element.android.libraries.matrix.ui.safety.rememberHideInvitesAvatar
import kotlinx.collections.immutable.persistentSetOf
import kotlinx.collections.immutable.toPersistentSet
import kotlinx.collections.immutable.toImmutableSet
import kotlinx.coroutines.flow.map
@Inject
@ -30,7 +30,7 @@ class HomeSpacesPresenter(
val hideInvitesAvatar by client.rememberHideInvitesAvatar()
val spaceRooms by client.spaceService.spaceRoomsFlow.collectAsState(emptyList())
val seenSpaceInvites by remember {
seenInvitesStore.seenRoomIds().map { it.toPersistentSet() }
seenInvitesStore.seenRoomIds().map { it.toImmutableSet() }
}.collectAsState(persistentSetOf())
fun handleEvents(event: HomeSpacesEvents) {

View file

@ -13,7 +13,7 @@ import io.element.android.libraries.designsystem.components.avatar.AvatarSize
import io.element.android.libraries.matrix.api.room.RoomNotificationMode
import io.element.android.libraries.matrix.test.A_ROOM_ID
import io.element.android.libraries.matrix.test.A_ROOM_NAME
import kotlinx.collections.immutable.toPersistentList
import kotlinx.collections.immutable.toImmutableList
import org.junit.Test
class RoomListBaseRoomSummaryTest {
@ -105,7 +105,7 @@ internal fun createRoomListRoomSummary(
canonicalAlias = null,
inviteSender = null,
isDm = false,
heroes = heroes.toPersistentList(),
heroes = heroes.toImmutableList(),
isTombstoned = isTombstoned,
isSpace = isSpace
)

View file

@ -53,7 +53,7 @@ import io.element.android.libraries.matrix.api.spaces.SpaceRoom
import io.element.android.libraries.matrix.ui.model.toInviteSender
import io.element.android.libraries.matrix.ui.safety.rememberHideInvitesAvatar
import kotlinx.collections.immutable.persistentListOf
import kotlinx.collections.immutable.toPersistentList
import kotlinx.collections.immutable.toImmutableList
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch
import java.util.Optional
@ -291,7 +291,7 @@ private fun SpaceRoom.toContentState(): ContentState {
joinRule = joinRule,
details = LoadedDetails.Space(
childrenCount = childrenCount,
heroes = heroes.toPersistentList(),
heroes = heroes.toImmutableList(),
)
)
}

View file

@ -24,7 +24,7 @@ import io.element.android.libraries.matrix.api.room.join.JoinRoom
import io.element.android.libraries.matrix.api.room.join.JoinRule
import io.element.android.libraries.matrix.api.user.MatrixUser
import io.element.android.libraries.matrix.ui.model.InviteSender
import kotlinx.collections.immutable.toPersistentList
import kotlinx.collections.immutable.toImmutableList
open class JoinRoomStateProvider : PreviewParameterProvider<JoinRoomState> {
override val values: Sequence<JoinRoomState>
@ -189,7 +189,7 @@ fun aLoadedDetailsSpace(
heroes: List<MatrixUser> = emptyList(),
) = LoadedDetails.Space(
childrenCount = childrenCount,
heroes = heroes.toPersistentList()
heroes = heroes.toImmutableList()
)
fun aJoinRoomState(

View file

@ -20,7 +20,7 @@ import io.element.android.libraries.architecture.AsyncData
import io.element.android.libraries.architecture.Presenter
import io.element.android.libraries.core.extensions.runCatchingExceptions
import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.toPersistentList
import kotlinx.collections.immutable.toImmutableList
@Inject
class DependencyLicensesListPresenter(
@ -37,7 +37,7 @@ class DependencyLicensesListPresenter(
var filter by remember { mutableStateOf("") }
LaunchedEffect(Unit) {
runCatchingExceptions {
licenses = AsyncData.Success(licensesProvider.provides().toPersistentList())
licenses = AsyncData.Success(licensesProvider.provides().toImmutableList())
}.onFailure {
licenses = AsyncData.Failure(it)
}
@ -50,7 +50,7 @@ class DependencyLicensesListPresenter(
it.safeName.contains(safeFilter, ignoreCase = true) ||
it.groupId.contains(safeFilter, ignoreCase = true) ||
it.artifactId.contains(safeFilter, ignoreCase = true)
}.toPersistentList())
}.toImmutableList())
} else {
filteredLicenses = licenses
}

View file

@ -8,7 +8,7 @@
package io.element.android.features.lockscreen.impl.pin.model
import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.toPersistentList
import kotlinx.collections.immutable.toImmutableList
data class PinEntry(
val digits: ImmutableList<PinDigit>,
@ -17,7 +17,7 @@ data class PinEntry(
fun createEmpty(size: Int): PinEntry {
val digits = List(size) { PinDigit.Empty }
return PinEntry(
digits = digits.toPersistentList()
digits = digits.toImmutableList()
)
}
}
@ -37,7 +37,7 @@ data class PinEntry(
newDigits[index] = PinDigit.Filled(char)
}
}
return copy(digits = newDigits.toPersistentList())
return copy(digits = newDigits.toImmutableList())
}
fun deleteLast(): PinEntry {
@ -46,7 +46,7 @@ data class PinEntry(
newDigits.indexOfLast { it is PinDigit.Filled }.also { lastFilled ->
newDigits[lastFilled] = PinDigit.Empty
}
return copy(digits = newDigits.toPersistentList())
return copy(digits = newDigits.toImmutableList())
}
fun addDigit(digit: Char): PinEntry {
@ -55,7 +55,7 @@ data class PinEntry(
newDigits.indexOfFirst { it is PinDigit.Empty }.also { firstEmpty ->
newDigits[firstEmpty] = PinDigit.Filled(digit)
}
return copy(digits = newDigits.toPersistentList())
return copy(digits = newDigits.toImmutableList())
}
fun clear(): PinEntry {

View file

@ -10,7 +10,7 @@ package io.element.android.features.messages.api.timeline.voicemessages.composer
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
import io.element.android.libraries.designsystem.components.media.createFakeWaveform
import io.element.android.libraries.textcomposer.model.VoiceMessageState
import kotlinx.collections.immutable.toPersistentList
import kotlinx.collections.immutable.toImmutableList
import kotlin.time.Duration.Companion.seconds
open class VoiceMessageComposerStateProvider : PreviewParameterProvider<VoiceMessageComposerState> {
@ -42,4 +42,4 @@ fun aVoiceMessagePreviewState() = VoiceMessageState.Preview(
waveform = createFakeWaveform(),
)
internal var aWaveformLevels = List(100) { it.toFloat() / 100 }.toPersistentList()
internal var aWaveformLevels = List(100) { it.toFloat() / 100 }.toImmutableList()

View file

@ -89,7 +89,7 @@ import io.element.android.libraries.matrix.ui.room.getDirectRoomMember
import io.element.android.libraries.textcomposer.model.MessageComposerMode
import io.element.android.libraries.ui.strings.CommonStrings
import io.element.android.services.analytics.api.AnalyticsService
import kotlinx.collections.immutable.toPersistentList
import kotlinx.collections.immutable.toImmutableList
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
@ -166,7 +166,7 @@ class MessagesPresenter(
derivedStateOf { roomInfo.avatarData() }
}
val heroes by remember {
derivedStateOf { roomInfo.heroes().toPersistentList() }
derivedStateOf { roomInfo.heroes().toImmutableList() }
}
var hasDismissedInviteDialog by rememberSaveable {

View file

@ -24,7 +24,7 @@ import io.element.android.features.messages.impl.timeline.model.event.aTimelineI
import io.element.android.libraries.matrix.api.timeline.item.event.MessageShield
import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.persistentListOf
import kotlinx.collections.immutable.toPersistentList
import kotlinx.collections.immutable.toImmutableList
open class ActionListStateProvider : PreviewParameterProvider<ActionListState> {
override val values: Sequence<ActionListState>
@ -209,7 +209,7 @@ fun aTimelineItemActionList(
TimelineItemAction.ViewSource,
)
.sortedWith(TimelineItemActionComparator())
.toPersistentList()
.toImmutableList()
}
fun aTimelineItemPollActionList(): ImmutableList<TimelineItemAction> {
@ -222,5 +222,5 @@ fun aTimelineItemPollActionList(): ImmutableList<TimelineItemAction> {
TimelineItemAction.Redact,
)
.sortedWith(TimelineItemActionComparator())
.toPersistentList()
.toImmutableList()
}

View file

@ -29,7 +29,7 @@ import io.element.android.libraries.mediaviewer.api.local.LocalMedia
import io.element.android.libraries.preferences.api.store.SessionPreferencesStore
import io.element.android.libraries.preferences.api.store.VideoCompressionPreset
import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.toPersistentList
import kotlinx.collections.immutable.toImmutableList
import kotlinx.coroutines.flow.first
import timber.log.Timber
import kotlin.math.roundToLong
@ -111,7 +111,7 @@ class DefaultMediaOptimizationSelectorPresenter(
canUpload = calculatedSize <= (maxUploadSize as AsyncData.Success).data
)
}
.toPersistentList()
.toImmutableList()
.also { sizes ->
Timber.d(sizes.joinToString("\n") { "Calculated size for ${it.preset}: ${it.sizeInBytes} MB. Max upload size: $maxUploadSize" })
}

View file

@ -22,7 +22,7 @@ import io.element.android.libraries.matrix.api.core.RoomId
import io.element.android.libraries.matrix.api.timeline.TimelineProvider
import io.element.android.libraries.matrix.api.timeline.getActiveTimeline
import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.toPersistentList
import kotlinx.collections.immutable.toImmutableList
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch
@ -43,7 +43,7 @@ class ForwardMessagesPresenter(
private val forwardingActionState: MutableState<AsyncAction<List<RoomId>>> = mutableStateOf(AsyncAction.Uninitialized)
fun onRoomSelected(roomIds: List<RoomId>) {
sessionCoroutineScope.forwardEvent(eventId, roomIds.toPersistentList(), forwardingActionState)
sessionCoroutineScope.forwardEvent(eventId, roomIds.toImmutableList(), forwardingActionState)
}
@Composable

View file

@ -79,7 +79,7 @@ import io.element.android.services.analyticsproviders.api.trackers.captureIntera
import io.element.android.wysiwyg.compose.RichTextEditorState
import io.element.android.wysiwyg.display.TextDisplay
import kotlinx.collections.immutable.persistentListOf
import kotlinx.collections.immutable.toPersistentList
import kotlinx.collections.immutable.toImmutableList
import kotlinx.coroutines.CancellationException
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.FlowPreview
@ -379,7 +379,7 @@ class MessageComposerPresenter(
showAttachmentSourcePicker = showAttachmentSourcePicker,
showTextFormatting = showTextFormatting,
canShareLocation = canShareLocation.value,
suggestions = suggestions.toPersistentList(),
suggestions = suggestions.toImmutableList(),
resolveMentionDisplay = resolveMentionDisplay,
resolveAtRoomMentionDisplay = resolveAtRoomMentionDisplay,
eventSink = { handleEvents(it) },

View file

@ -41,7 +41,6 @@ import io.element.android.libraries.matrix.ui.messages.reply.aProfileTimelineDet
import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.persistentListOf
import kotlinx.collections.immutable.toImmutableList
import kotlinx.collections.immutable.toPersistentList
import java.util.UUID
import kotlin.random.Random
@ -197,7 +196,7 @@ fun aTimelineItemReactions(
)
)
}
}.toPersistentList()
}.toImmutableList()
)
}

View file

@ -33,7 +33,7 @@ import io.element.android.features.messages.impl.timeline.model.event.aTimelineI
import io.element.android.features.messages.impl.timeline.util.defaultTimelineContentPadding
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
import kotlinx.collections.immutable.toPersistentList
import kotlinx.collections.immutable.persistentListOf
@Composable
fun TimelineItemStateEventRow(
@ -100,7 +100,7 @@ internal fun TimelineItemStateEventRowPreview() = ElementPreview {
content = aTimelineItemStateEventContent(),
groupPosition = TimelineItemGroupPosition.None,
readReceiptState = TimelineItemReadReceipts(
receipts = listOf(aReadReceiptData(0)).toPersistentList(),
receipts = persistentListOf(aReadReceiptData(0)),
)
),
renderReadReceipts = true,

View file

@ -21,7 +21,7 @@ import io.element.android.libraries.core.coroutine.CoroutineDispatchers
import io.element.android.libraries.matrix.api.room.RoomMember
import io.element.android.libraries.matrix.api.timeline.MatrixTimelineItem
import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.toPersistentList
import kotlinx.collections.immutable.toImmutableList
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.distinctUntilChanged
@ -94,7 +94,7 @@ class TimelineItemsFactory(
newTimelineItemStates.add(updatedItem)
}
}
val result = timelineItemGrouper.group(newTimelineItemStates).toPersistentList()
val result = timelineItemGrouper.group(newTimelineItemStates).toImmutableList()
this._timelineItems.emit(result)
}

View file

@ -8,7 +8,7 @@
package io.element.android.features.messages.impl.timeline.model
import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.toPersistentList
import kotlinx.collections.immutable.toImmutableList
data class TimelineItemReactions(
val reactions: ImmutableList<AggregatedReaction>
@ -17,5 +17,5 @@ data class TimelineItemReactions(
get() = reactions
.filter { it.isHighlighted }
.map { it.key }
.toPersistentList()
.toImmutableList()
}

View file

@ -7,9 +7,9 @@
package io.element.android.features.messages.impl.timeline.model
import kotlinx.collections.immutable.toPersistentList
import kotlinx.collections.immutable.toImmutableList
fun aTimelineItemReactions() = TimelineItemReactions(
// Use values from AggregatedReactionProvider
reactions = AggregatedReactionProvider().values.toPersistentList()
reactions = AggregatedReactionProvider().values.toImmutableList()
)

View file

@ -11,7 +11,7 @@ import androidx.compose.ui.tooling.preview.PreviewParameterProvider
import io.element.android.libraries.core.mimetype.MimeTypes
import io.element.android.libraries.matrix.api.core.EventId
import io.element.android.libraries.matrix.api.media.MediaSource
import kotlinx.collections.immutable.toPersistentList
import kotlinx.collections.immutable.toImmutableList
import kotlin.time.Duration
import kotlin.time.Duration.Companion.milliseconds
import kotlin.time.Duration.Companion.minutes
@ -53,7 +53,7 @@ fun aTimelineItemVoiceContent(
duration = duration,
mediaSource = mediaSource,
mimeType = mimeType,
waveform = waveform.toPersistentList(),
waveform = waveform.toImmutableList(),
formattedFileSize = "1.0 MB",
fileExtension = "ogg",
)

View file

@ -43,7 +43,6 @@ import io.element.android.libraries.voicerecorder.api.VoiceRecorderState
import io.element.android.services.analytics.api.AnalyticsService
import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.toImmutableList
import kotlinx.collections.immutable.toPersistentList
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch
import timber.log.Timber
@ -199,7 +198,7 @@ class DefaultVoiceMessageComposerPresenter(
voiceMessageState = when (val state = recorderState) {
is VoiceRecorderState.Recording -> VoiceMessageState.Recording(
duration = state.elapsedTime,
levels = state.levels.toPersistentList(),
levels = state.levels.toImmutableList(),
)
is VoiceRecorderState.Finished ->
previewState(

View file

@ -36,7 +36,7 @@ import io.element.android.tests.testutils.clickOn
import io.element.android.tests.testutils.setSafeContent
import io.element.android.wysiwyg.link.Link
import kotlinx.collections.immutable.persistentListOf
import kotlinx.collections.immutable.toPersistentList
import kotlinx.collections.immutable.toImmutableList
import org.junit.Rule
import org.junit.Test
import org.junit.rules.TestRule
@ -148,7 +148,7 @@ class TimelineViewTest {
eventId = EventId("\$event_$it"),
content = aTimelineItemUnknownContent(),
)
}.toPersistentList()
}.toImmutableList()
rule.setTimelineView(
state = aTimelineState(

View file

@ -26,7 +26,7 @@ import io.element.android.tests.testutils.WarmUpRule
import io.element.android.tests.testutils.testCoroutineDispatchers
import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.persistentListOf
import kotlinx.collections.immutable.toPersistentMap
import kotlinx.collections.immutable.toImmutableMap
import kotlinx.coroutines.test.TestScope
import kotlinx.coroutines.test.runTest
import org.junit.Rule
@ -92,7 +92,7 @@ class EmojiPickerPresenterTest {
categories: ImmutableList<Pair<EmojibaseCategory, ImmutableList<Emoji>>> = persistentListOf(emojiCategory()),
recentEmojis: ImmutableList<String> = persistentListOf(),
) = EmojiPickerPresenter(
emojibaseStore = EmojibaseStore(categories.toMap().toPersistentMap()),
emojibaseStore = EmojibaseStore(categories.toMap().toImmutableMap()),
recentEmojis = recentEmojis,
coroutineDispatchers = testCoroutineDispatchers(),
)

View file

@ -46,7 +46,6 @@ import io.element.android.services.analytics.test.FakeAnalyticsService
import io.element.android.tests.testutils.WarmUpRule
import io.element.android.tests.testutils.lambda.lambdaRecorder
import kotlinx.collections.immutable.toImmutableList
import kotlinx.collections.immutable.toPersistentList
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.TestScope
import kotlinx.coroutines.test.advanceUntilIdle
@ -85,7 +84,7 @@ class VoiceMessageComposerPresenterTest {
companion object {
private val RECORDING_DURATION = 1.seconds
private val RECORDING_STATE = VoiceMessageState.Recording(RECORDING_DURATION, listOf(0.1f, 0.2f).toPersistentList())
private val RECORDING_STATE = VoiceMessageState.Recording(RECORDING_DURATION, listOf(0.1f, 0.2f).toImmutableList())
}
@Test

View file

@ -33,7 +33,6 @@ import io.element.android.libraries.matrix.api.timeline.Timeline
import io.element.android.services.analytics.api.AnalyticsService
import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.toImmutableList
import kotlinx.collections.immutable.toPersistentList
import kotlinx.coroutines.launch
import timber.log.Timber
@ -79,7 +78,7 @@ class CreatePollPresenter(
repository.getPoll(mode.eventId).onSuccess {
val loadedPoll = PollFormState(
question = it.question,
answers = it.answers.map(PollAnswer::text).toPersistentList(),
answers = it.answers.map(PollAnswer::text).toImmutableList(),
isDisclosed = it.kind.isDisclosed,
)
initialPoll = loadedPoll

View file

@ -9,8 +9,7 @@ package io.element.android.features.poll.impl.create
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
import io.element.android.libraries.matrix.api.poll.PollKind
import kotlinx.collections.immutable.PersistentList
import kotlinx.collections.immutable.persistentListOf
import kotlinx.collections.immutable.toImmutableList
class CreatePollStateProvider : PreviewParameterProvider<CreatePollState> {
override val values: Sequence<CreatePollState>
@ -20,7 +19,7 @@ class CreatePollStateProvider : PreviewParameterProvider<CreatePollState> {
canCreate = false,
canAddAnswer = true,
question = "",
answers = persistentListOf(
answers = listOf(
Answer("", false),
Answer("", false)
),
@ -33,7 +32,7 @@ class CreatePollStateProvider : PreviewParameterProvider<CreatePollState> {
canCreate = true,
canAddAnswer = true,
question = "What type of food should we have?",
answers = persistentListOf(
answers = listOf(
Answer("Italian \uD83C\uDDEE\uD83C\uDDF9", false),
Answer("Chinese \uD83C\uDDE8\uD83C\uDDF3", false),
),
@ -46,7 +45,7 @@ class CreatePollStateProvider : PreviewParameterProvider<CreatePollState> {
canCreate = true,
canAddAnswer = true,
question = "What type of food should we have?",
answers = persistentListOf(
answers = listOf(
Answer("Italian \uD83C\uDDEE\uD83C\uDDF9", false),
Answer("Chinese \uD83C\uDDE8\uD83C\uDDF3", false),
),
@ -59,7 +58,7 @@ class CreatePollStateProvider : PreviewParameterProvider<CreatePollState> {
canCreate = true,
canAddAnswer = true,
question = "What type of food should we have?",
answers = persistentListOf(
answers = listOf(
Answer("Italian \uD83C\uDDEE\uD83C\uDDF9", true),
Answer("Chinese \uD83C\uDDE8\uD83C\uDDF3", true),
Answer("Brazilian \uD83C\uDDE7\uD83C\uDDF7", true),
@ -74,7 +73,7 @@ class CreatePollStateProvider : PreviewParameterProvider<CreatePollState> {
canCreate = true,
canAddAnswer = false,
question = "Should there be more than 20 answers?",
answers = persistentListOf(
answers = listOf(
Answer("1", true),
Answer("2", true),
Answer("3", true),
@ -108,7 +107,7 @@ class CreatePollStateProvider : PreviewParameterProvider<CreatePollState> {
" Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor" +
" in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt" +
" in culpa qui officia deserunt mollit anim id est laborum.",
answers = persistentListOf(
answers = listOf(
Answer(
"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua." +
" Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis a.",
@ -129,7 +128,7 @@ class CreatePollStateProvider : PreviewParameterProvider<CreatePollState> {
canCreate = false,
canAddAnswer = true,
question = "",
answers = persistentListOf(
answers = listOf(
Answer("", false),
Answer("", false)
),
@ -142,7 +141,7 @@ class CreatePollStateProvider : PreviewParameterProvider<CreatePollState> {
canCreate = false,
canAddAnswer = true,
question = "",
answers = persistentListOf(
answers = listOf(
Answer("", false),
Answer("", false)
),
@ -158,7 +157,7 @@ private fun aCreatePollState(
canCreate: Boolean,
canAddAnswer: Boolean,
question: String,
answers: PersistentList<Answer>,
answers: List<Answer>,
showBackConfirmation: Boolean,
showDeleteConfirmation: Boolean,
pollKind: PollKind
@ -168,7 +167,7 @@ private fun aCreatePollState(
canSave = canCreate,
canAddAnswer = canAddAnswer,
question = question,
answers = answers,
answers = answers.toImmutableList(),
showBackConfirmation = showBackConfirmation,
showDeleteConfirmation = showDeleteConfirmation,
pollKind = pollKind,

View file

@ -13,7 +13,7 @@ import io.element.android.features.poll.impl.PollConstants
import io.element.android.features.poll.impl.PollConstants.MIN_ANSWERS
import io.element.android.libraries.matrix.api.poll.PollKind
import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.toPersistentList
import kotlinx.collections.immutable.toImmutableList
/**
* Represents the state of the poll creation / edit form.
@ -28,7 +28,7 @@ data class PollFormState(
companion object {
val Empty = PollFormState(
question = "",
answers = MutableList(MIN_ANSWERS) { "" }.toPersistentList(),
answers = MutableList(MIN_ANSWERS) { "" }.toImmutableList(),
isDisclosed = true,
)
}
@ -49,7 +49,7 @@ data class PollFormState(
return this
}
return copy(answers = (answers + "").toPersistentList())
return copy(answers = (answers + "").toImmutableList())
}
/**
@ -66,7 +66,7 @@ data class PollFormState(
return this
}
return copy(answers = answers.filterIndexed { i, _ -> i != index }.toPersistentList())
return copy(answers = answers.filterIndexed { i, _ -> i != index }.toImmutableList())
}
/**
@ -82,7 +82,7 @@ data class PollFormState(
fun withAnswerChanged(index: Int, rawAnswer: String): PollFormState =
copy(answers = answers.toMutableList().apply {
this[index] = rawAnswer.take(PollConstants.MAX_ANSWER_LENGTH)
}.toPersistentList())
}.toImmutableList())
/**
* Whether a new answer can be added.
@ -114,7 +114,7 @@ internal val pollFormStateSaver = mapSaver(
restore = { saved ->
PollFormState(
question = saved["question"] as String,
answers = (saved["answers"] as Array<*>).map { it as String }.toPersistentList(),
answers = (saved["answers"] as Array<*>).map { it as String }.toImmutableList(),
isDisclosed = saved["isDisclosed"] as Boolean,
)
}

View file

@ -13,7 +13,7 @@ import io.element.android.features.poll.api.pollcontent.aPollContentState
import io.element.android.features.poll.impl.history.model.PollHistoryFilter
import io.element.android.features.poll.impl.history.model.PollHistoryItem
import io.element.android.features.poll.impl.history.model.PollHistoryItems
import kotlinx.collections.immutable.toPersistentList
import kotlinx.collections.immutable.toImmutableList
class PollHistoryStateProvider : PreviewParameterProvider<PollHistoryState> {
override val values: Sequence<PollHistoryState>
@ -53,8 +53,8 @@ internal fun aPollHistoryState(
hasMoreToLoad = hasMoreToLoad,
activeFilter = activeFilter,
pollHistoryItems = PollHistoryItems(
ongoing = currentItems.toPersistentList(),
past = currentItems.toPersistentList(),
ongoing = currentItems.toImmutableList(),
past = currentItems.toImmutableList(),
),
eventSink = eventSink,
)

View file

@ -14,7 +14,7 @@ import io.element.android.libraries.dateformatter.api.DateFormatter
import io.element.android.libraries.dateformatter.api.DateFormatterMode
import io.element.android.libraries.matrix.api.timeline.MatrixTimelineItem
import io.element.android.libraries.matrix.api.timeline.item.event.PollContent
import kotlinx.collections.immutable.toPersistentList
import kotlinx.collections.immutable.toImmutableList
import kotlinx.coroutines.withContext
@Inject
@ -36,8 +36,8 @@ class PollHistoryItemsFactory(
}
}
PollHistoryItems(
ongoing = ongoing.toPersistentList(),
past = past.toPersistentList()
ongoing = ongoing.toImmutableList(),
past = past.toImmutableList()
)
}

View file

@ -9,7 +9,7 @@ package io.element.android.features.poll.impl.create
import androidx.compose.runtime.saveable.SaverScope
import com.google.common.truth.Truth.assertThat
import kotlinx.collections.immutable.toPersistentList
import kotlinx.collections.immutable.persistentListOf
import org.junit.Test
class PollFormStateSaverTest {
@ -21,7 +21,7 @@ class PollFormStateSaverTest {
fun `test save and restore`() {
val state = PollFormState(
question = "question",
answers = listOf("answer1", "answer2").toPersistentList(),
answers = persistentListOf("answer1", "answer2"),
isDisclosed = true,
)

View file

@ -10,7 +10,7 @@ package io.element.android.features.poll.impl.create
import com.google.common.truth.Truth.assertThat
import io.element.android.features.poll.impl.PollConstants
import io.element.android.libraries.matrix.api.poll.PollKind
import kotlinx.collections.immutable.toPersistentList
import kotlinx.collections.immutable.toImmutableList
import org.junit.Test
class PollFormStateTest {
@ -47,7 +47,7 @@ class PollFormStateTest {
val state = PollFormState.Empty
val newState = state.withAnswerChanged(1, "New answer")
assertThat(newState).isEqualTo(PollFormState.Empty.copy(
answers = listOf("", "New answer").toPersistentList()
answers = listOf("", "New answer").toImmutableList()
))
}
@ -58,7 +58,7 @@ class PollFormStateTest {
val state = PollFormState.Empty
val newState = state.withAnswerChanged(1, tooLongAnswer)
assertThat(newState).isEqualTo(PollFormState.Empty.copy(
answers = listOf("", truncatedAnswer).toPersistentList()
answers = listOf("", truncatedAnswer).toImmutableList()
))
}
@ -101,7 +101,7 @@ class PollFormStateTest {
@Test
fun `is valid is false when not enough answers`() {
val state = aValidPollFormState().copy(answers = listOf("").toPersistentList())
val state = aValidPollFormState().copy(answers = listOf("").toImmutableList())
assertThat(state.isValid).isFalse()
}
@ -127,10 +127,10 @@ class PollFormStateTest {
private fun aValidPollFormState(): PollFormState {
return PollFormState.Empty.copy(
question = "question",
answers = listOf("answer1", "answer2").toPersistentList(),
answers = listOf("answer1", "answer2").toImmutableList(),
isDisclosed = true,
)
}
private fun PollFormState.withBlankAnswers(numAnswers: Int): PollFormState =
copy(answers = List(numAnswers) { "" }.toPersistentList())
copy(answers = List(numAnswers) { "" }.toImmutableList())

View file

@ -45,7 +45,7 @@ import io.element.android.libraries.preferences.api.store.VideoCompressionPreset
import io.element.android.libraries.ui.strings.CommonStrings
import io.element.android.services.analytics.compose.LocalAnalyticsService
import io.element.android.services.analyticsproviders.api.trackers.captureInteraction
import kotlinx.collections.immutable.toPersistentList
import kotlinx.collections.immutable.toImmutableList
@Composable
fun AdvancedSettingsView(
@ -73,7 +73,7 @@ fun AdvancedSettingsView(
PreferenceDropdown(
title = stringResource(id = CommonStrings.common_appearance),
selectedOption = state.theme,
options = ThemeOption.entries.toPersistentList(),
options = ThemeOption.entries.toImmutableList(),
onSelectOption = { themeOption ->
state.eventSink(AdvancedSettingsEvents.SetTheme(themeOption))
}

View file

@ -25,7 +25,7 @@ import io.element.android.libraries.featureflag.api.FeatureFlags
import io.element.android.libraries.matrix.api.MatrixClient
import io.element.android.libraries.matrix.api.core.UserId
import io.element.android.libraries.matrix.api.user.MatrixUser
import kotlinx.collections.immutable.toPersistentList
import kotlinx.collections.immutable.toImmutableList
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch
@ -83,7 +83,7 @@ class BlockedUsersPresenter(
}
}
return BlockedUsersState(
blockedUsers = ignoredMatrixUser.toPersistentList(),
blockedUsers = ignoredMatrixUser.toImmutableList(),
unblockUserAction = unblockUserAction.value,
eventSink = ::handleEvents
)

View file

@ -11,7 +11,7 @@ import androidx.compose.ui.tooling.preview.PreviewParameterProvider
import io.element.android.libraries.architecture.AsyncAction
import io.element.android.libraries.matrix.api.user.MatrixUser
import io.element.android.libraries.matrix.ui.components.aMatrixUserList
import kotlinx.collections.immutable.toPersistentList
import kotlinx.collections.immutable.toImmutableList
class BlockedUsersStateProvider : PreviewParameterProvider<BlockedUsersState> {
override val values: Sequence<BlockedUsersState>
@ -32,7 +32,7 @@ internal fun aBlockedUsersState(
eventSink: (BlockedUsersEvents) -> Unit = {},
): BlockedUsersState {
return BlockedUsersState(
blockedUsers = blockedUsers.toPersistentList(),
blockedUsers = blockedUsers.toImmutableList(),
unblockUserAction = unblockUserAction,
eventSink = eventSink,
)

View file

@ -37,11 +37,9 @@ import io.element.android.libraries.featureflag.api.Feature
import io.element.android.libraries.featureflag.api.FeatureFlagService
import io.element.android.libraries.featureflag.api.FeatureFlags
import io.element.android.libraries.featureflag.ui.model.FeatureUiModel
import io.element.android.libraries.matrix.api.tracing.TraceLogPack
import io.element.android.libraries.preferences.api.store.AppPreferencesStore
import kotlinx.collections.immutable.persistentListOf
import kotlinx.collections.immutable.toImmutableList
import kotlinx.collections.immutable.toPersistentList
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.flow.map
@ -82,11 +80,11 @@ class DeveloperSettingsPresenter(
appPreferencesStore.getTracingLogLevelFlow().map { AsyncData.Success(it.toLogLevelItem()) }
}
val tracingLogLevel by tracingLogLevelFlow.collectAsState(initial = AsyncData.Uninitialized)
val tracingLogPacks by produceState(persistentListOf<TraceLogPack>()) {
val tracingLogPacks by produceState(persistentListOf()) {
appPreferencesStore.getTracingLogPacksFlow()
// Sort the entries alphabetically by its title
.map { it.sortedBy { it.title }.toPersistentList() }
.collectLatest { value = it }
.map { it.sortedBy { it.title } }
.collectLatest { value = it.toImmutableList() }
}
LaunchedEffect(Unit) {

View file

@ -14,7 +14,7 @@ import io.element.android.libraries.architecture.AsyncAction
import io.element.android.libraries.architecture.AsyncData
import io.element.android.libraries.featureflag.ui.model.aFeatureUiModelList
import io.element.android.libraries.matrix.api.tracing.TraceLogPack
import kotlinx.collections.immutable.toPersistentList
import kotlinx.collections.immutable.toImmutableList
open class DeveloperSettingsStateProvider : PreviewParameterProvider<DeveloperSettingsState> {
override val values: Sequence<DeveloperSettingsState>
@ -43,7 +43,7 @@ fun aDeveloperSettingsState(
clearCacheAction = clearCacheAction,
customElementCallBaseUrlState = customElementCallBaseUrlState,
tracingLogLevel = AsyncData.Success(LogLevelItem.INFO),
tracingLogPacks = traceLogPacks.toPersistentList(),
tracingLogPacks = traceLogPacks.toImmutableList(),
eventSink = eventSink,
)

View file

@ -36,7 +36,7 @@ import io.element.android.libraries.featureflag.ui.FeatureListView
import io.element.android.libraries.featureflag.ui.model.FeatureUiModel
import io.element.android.libraries.matrix.api.tracing.TraceLogPack
import io.element.android.libraries.ui.strings.CommonStrings
import kotlinx.collections.immutable.toPersistentList
import kotlinx.collections.immutable.toImmutableList
@Composable
fun DeveloperSettingsView(
@ -66,7 +66,7 @@ fun DeveloperSettingsView(
title = "Tracing log level",
supportingText = "Requires app reboot",
selectedOption = state.tracingLogLevel.dataOrNull(),
options = LogLevelItem.entries.toPersistentList(),
options = LogLevelItem.entries.toImmutableList(),
onSelectOption = { logLevel ->
state.eventSink(DeveloperSettingsEvents.SetTracingLogLevel(logLevel))
}

View file

@ -35,7 +35,7 @@ import io.element.android.libraries.matrix.api.verification.SessionVerificationS
import io.element.android.libraries.sessionstorage.api.SessionStore
import io.element.android.services.analytics.api.AnalyticsService
import kotlinx.collections.immutable.persistentListOf
import kotlinx.collections.immutable.toPersistentList
import kotlinx.collections.immutable.toImmutableList
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.map
@ -80,7 +80,7 @@ class PreferencesRootPresenter(
avatarUrl = it.userAvatarUrl,
)
}
.toPersistentList()
.toImmutableList()
}
}.collectAsState(initial = persistentListOf())

View file

@ -13,7 +13,7 @@ import io.element.android.libraries.matrix.api.core.DeviceId
import io.element.android.libraries.matrix.api.user.MatrixUser
import io.element.android.libraries.matrix.ui.components.aMatrixUser
import io.element.android.libraries.ui.strings.CommonStrings
import kotlinx.collections.immutable.toPersistentList
import kotlinx.collections.immutable.toImmutableList
fun aPreferencesRootState(
myUser: MatrixUser = aMatrixUser(),
@ -24,7 +24,7 @@ fun aPreferencesRootState(
version = "Version 1.1 (1)",
deviceId = DeviceId("ILAKNDNASDLK"),
isMultiAccountEnabled = true,
otherSessions = otherSessions.toPersistentList(),
otherSessions = otherSessions.toImmutableList(),
showSecureBackup = true,
showSecureBackupBadge = true,
accountManagementUrl = "aUrl",

View file

@ -51,7 +51,7 @@ import io.element.android.libraries.preferences.api.store.AppPreferencesStore
import io.element.android.libraries.ui.strings.CommonStrings
import io.element.android.services.analytics.api.AnalyticsService
import io.element.android.services.analyticsproviders.api.trackers.captureInteraction
import kotlinx.collections.immutable.toPersistentList
import kotlinx.collections.immutable.toImmutableList
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
@ -194,7 +194,7 @@ class RoomDetailsPresenter(
isFavorite = isFavorite,
displayRolesAndPermissionsSettings = !isDm && isUserAdmin,
isPublic = joinRule == JoinRule.Public,
heroes = roomInfo.heroes.toPersistentList(),
heroes = roomInfo.heroes.toImmutableList(),
pinnedMessagesCount = pinnedMessagesCount,
snackbarMessage = snackbarMessage,
canShowKnockRequests = canShowKnockRequests,

View file

@ -18,7 +18,7 @@ import io.element.android.libraries.matrix.api.room.RoomMember
import io.element.android.libraries.matrix.api.room.RoomNotificationSettings
import io.element.android.libraries.matrix.api.user.MatrixUser
import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.toPersistentList
import kotlinx.collections.immutable.toImmutableList
data class RoomDetailsState(
val roomId: RoomId,
@ -59,7 +59,7 @@ data class RoomDetailsState(
if (isPublic) {
add(RoomBadge.PUBLIC)
}
}.toPersistentList()
}.toImmutableList()
}
@Immutable

View file

@ -27,7 +27,7 @@ import io.element.android.libraries.matrix.api.room.RoomNotificationMode
import io.element.android.libraries.matrix.api.room.RoomNotificationSettings
import io.element.android.libraries.matrix.api.user.MatrixUser
import io.element.android.libraries.matrix.ui.components.aMatrixUserList
import kotlinx.collections.immutable.toPersistentList
import kotlinx.collections.immutable.toImmutableList
open class RoomDetailsStateProvider : PreviewParameterProvider<RoomDetailsState> {
override val values: Sequence<RoomDetailsState>
@ -135,7 +135,7 @@ fun aRoomDetailsState(
isFavorite = isFavorite,
displayRolesAndPermissionsSettings = displayAdminSettings,
isPublic = isPublic,
heroes = heroes.toPersistentList(),
heroes = heroes.toImmutableList(),
pinnedMessagesCount = pinnedMessagesCount,
snackbarMessage = snackbarMessage,
canShowKnockRequests = canShowKnockRequests,

View file

@ -89,7 +89,6 @@ import io.element.android.services.analytics.compose.LocalAnalyticsService
import io.element.android.services.analyticsproviders.api.trackers.captureInteraction
import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.toImmutableList
import kotlinx.collections.immutable.toPersistentList
@Composable
fun RoomDetailsView(
@ -400,7 +399,7 @@ private fun RoomHeaderSection(
avatarType = AvatarType.Room(
heroes = heroes.map { user ->
user.getAvatarData(size = AvatarSize.RoomDetailsHeader)
}.toPersistentList(),
}.toImmutableList(),
isTombstoned = isTombstoned,
),
contentDescription = avatarUrl?.let { stringResource(CommonStrings.a11y_room_avatar) },

View file

@ -38,7 +38,7 @@ import io.element.android.libraries.matrix.ui.room.roomMemberIdentityStateChange
import kotlinx.collections.immutable.ImmutableMap
import kotlinx.collections.immutable.persistentMapOf
import kotlinx.collections.immutable.toImmutableList
import kotlinx.collections.immutable.toPersistentMap
import kotlinx.collections.immutable.toImmutableMap
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.first
@ -69,10 +69,10 @@ class RoomMemberListPresenter(
val canInvite by room.canInviteAsState(syncUpdateFlow.value)
val roomModerationState = roomMembersModerationPresenter.present()
val roomMemberIdentityStates by produceState(persistentMapOf<UserId, IdentityState>()) {
val roomMemberIdentityStates by produceState(persistentMapOf()) {
room.roomMemberIdentityStateChange(waitForEncryption = true)
.onEach { identities ->
value = identities.associateBy({ it.identityRoomMember.userId }, { it.identityState }).toPersistentMap()
value = identities.associateBy({ it.identityRoomMember.userId }, { it.identityState }).toImmutableMap()
}
.launchIn(this)
}

View file

@ -11,7 +11,7 @@ import androidx.compose.ui.tooling.preview.PreviewParameterProvider
import io.element.android.libraries.architecture.AsyncAction
import io.element.android.libraries.matrix.api.room.RoomMember
import io.element.android.libraries.matrix.api.room.powerlevels.RoomPowerLevelsValues
import kotlinx.collections.immutable.toPersistentList
import kotlinx.collections.immutable.toImmutableList
class ChangeRoomPermissionsStateProvider : PreviewParameterProvider<ChangeRoomPermissionsState> {
override val values: Sequence<ChangeRoomPermissionsState>
@ -45,7 +45,7 @@ internal fun aChangeRoomPermissionsState(
) = ChangeRoomPermissionsState(
section = section,
currentPermissions = currentPermissions,
items = items.toPersistentList(),
items = items.toImmutableList(),
hasChanges = hasChanges,
saveAction = saveAction,
confirmExitAction = confirmExitAction,

View file

@ -14,7 +14,7 @@ import io.element.android.features.roommembermoderation.api.RoomMemberModeration
import io.element.android.libraries.architecture.AsyncAction
import io.element.android.libraries.matrix.api.core.UserId
import io.element.android.libraries.matrix.api.user.MatrixUser
import kotlinx.collections.immutable.toPersistentList
import kotlinx.collections.immutable.toImmutableList
class InternalRoomMemberModerationStateProvider : PreviewParameterProvider<InternalRoomMemberModerationState> {
override val values: Sequence<InternalRoomMemberModerationState>
@ -86,7 +86,7 @@ fun aRoomMembersModerationState(
canKick = canKick,
canBan = canBan,
selectedUser = selectedUser,
actions = actions.toPersistentList(),
actions = actions.toImmutableList(),
kickUserAsyncAction = kickUserAsyncAction,
banUserAsyncAction = banUserAsyncAction,
unbanUserAsyncAction = unbanUserAsyncAction,

View file

@ -35,9 +35,9 @@ import io.element.android.libraries.matrix.ui.room.canBanAsState
import io.element.android.libraries.matrix.ui.room.canKickAsState
import io.element.android.libraries.matrix.ui.room.userPowerLevelAsState
import io.element.android.services.analytics.api.AnalyticsService
import kotlinx.collections.immutable.PersistentList
import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.persistentListOf
import kotlinx.collections.immutable.toPersistentList
import kotlinx.collections.immutable.toImmutableList
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.drop
@ -68,7 +68,7 @@ class RoomMemberModerationPresenter(
var selectedUser by remember {
mutableStateOf<MatrixUser?>(null)
}
val moderationActions = remember { mutableStateOf(persistentListOf<ModerationActionState>()) }
val moderationActions = remember { mutableStateOf<ImmutableList<ModerationActionState>>(persistentListOf()) }
fun handleEvent(event: RoomMemberModerationEvents) {
when (event) {
@ -149,7 +149,7 @@ class RoomMemberModerationPresenter(
canKick: Boolean,
canBan: Boolean,
currentUserMemberPowerLevel: Long,
): PersistentList<ModerationActionState> {
): ImmutableList<ModerationActionState> {
return buildList {
add(ModerationActionState(action = ModerationAction.DisplayProfile, isEnabled = true))
// Assume the member is a regular user when it's unknown
@ -168,7 +168,7 @@ class RoomMemberModerationPresenter(
add(ModerationActionState(action = ModerationAction.BanUser, isEnabled = canModerateThisUser))
}
}
}.toPersistentList()
}.toImmutableList()
}
private fun CoroutineScope.kickUser(

View file

@ -30,7 +30,7 @@ import io.element.android.tests.testutils.WarmUpRule
import io.element.android.tests.testutils.test
import io.element.android.tests.testutils.testCoroutineDispatchers
import kotlinx.collections.immutable.persistentListOf
import kotlinx.collections.immutable.toPersistentList
import kotlinx.collections.immutable.toImmutableList
import kotlinx.coroutines.test.TestScope
import kotlinx.coroutines.test.runTest
import org.junit.Rule
@ -360,7 +360,7 @@ class RoomMemberModerationPresenterTest {
updateMembersResult = { Result.success(Unit) }
),
).apply {
val roomMembers = listOfNotNull(targetRoomMember).toPersistentList()
val roomMembers = listOfNotNull(targetRoomMember).toImmutableList()
givenRoomMembersState(state = RoomMembersState.Ready(roomMembers))
}
}

View file

@ -15,7 +15,7 @@ import io.element.android.libraries.matrix.api.spaces.SpaceRoom
import io.element.android.libraries.previewutils.room.aSpaceRoom
import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.persistentListOf
import kotlinx.collections.immutable.toPersistentList
import kotlinx.collections.immutable.toImmutableList
class LeaveSpaceStateProvider : PreviewParameterProvider<LeaveSpaceState> {
override val values: Sequence<LeaveSpaceState>
@ -92,13 +92,13 @@ class LeaveSpaceStateProvider : PreviewParameterProvider<LeaveSpaceState> {
),
aLeaveSpaceState(
selectableSpaceRooms = AsyncData.Success(
List(10) { aSelectableSpaceRoom() }.toPersistentList()
List(10) { aSelectableSpaceRoom() }.toImmutableList()
),
leaveSpaceAction = AsyncAction.Loading,
),
aLeaveSpaceState(
selectableSpaceRooms = AsyncData.Success(
List(10) { aSelectableSpaceRoom() }.toPersistentList()
List(10) { aSelectableSpaceRoom() }.toImmutableList()
),
leaveSpaceAction = AsyncAction.Failure(Exception("An error")),
),

View file

@ -33,11 +33,12 @@ import io.element.android.libraries.matrix.api.room.join.JoinRoom
import io.element.android.libraries.matrix.api.spaces.SpaceRoom
import io.element.android.libraries.matrix.api.spaces.SpaceRoomList
import io.element.android.libraries.matrix.ui.safety.rememberHideInvitesAvatar
import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.persistentListOf
import kotlinx.collections.immutable.persistentSetOf
import kotlinx.collections.immutable.toPersistentList
import kotlinx.collections.immutable.toPersistentMap
import kotlinx.collections.immutable.toPersistentSet
import kotlinx.collections.immutable.toImmutableList
import kotlinx.collections.immutable.toImmutableMap
import kotlinx.collections.immutable.toImmutableSet
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.launch
@ -52,18 +53,18 @@ class SpacePresenter(
private val acceptDeclineInvitePresenter: Presenter<AcceptDeclineInviteState>,
@SessionCoroutineScope private val sessionCoroutineScope: CoroutineScope,
) : Presenter<SpaceState> {
private var children by mutableStateOf(persistentListOf<SpaceRoom>())
private var children by mutableStateOf<ImmutableList<SpaceRoom>>(persistentListOf())
@Composable
override fun present(): SpaceState {
LaunchedEffect(Unit) {
paginate()
spaceRoomList.spaceRoomsFlow.collect { children = it.toPersistentList() }
spaceRoomList.spaceRoomsFlow.collect { children = it.toImmutableList() }
}
val hideInvitesAvatar by client.rememberHideInvitesAvatar()
val seenSpaceInvites by remember {
seenInvitesStore.seenRoomIds().map { it.toPersistentSet() }
seenInvitesStore.seenRoomIds().map { it.toImmutableSet() }
}.collectAsState(persistentSetOf())
val localCoroutineScope = rememberCoroutineScope()
@ -120,7 +121,7 @@ class SpacePresenter(
seenSpaceInvites = seenSpaceInvites,
hideInvitesAvatar = hideInvitesAvatar,
hasMoreToLoad = hasMoreToLoad,
joinActions = joinActions.toPersistentMap(),
joinActions = joinActions.toImmutableMap(),
acceptDeclineInviteState = acceptDeclineInviteState,
eventSink = ::handleEvents,
)

View file

@ -10,7 +10,7 @@ package io.element.android.features.space.impl.leave
import com.google.common.truth.Truth.assertThat
import io.element.android.libraries.architecture.AsyncData
import kotlinx.collections.immutable.persistentListOf
import kotlinx.collections.immutable.toPersistentList
import kotlinx.collections.immutable.toImmutableList
import org.junit.Test
class LeaveSpaceStateTest {
@ -64,7 +64,7 @@ class LeaveSpaceStateTest {
listOf(
aSelectableSpaceRoom(isLastAdmin = false, isSelected = true),
aSelectableSpaceRoom(isLastAdmin = false, isSelected = false),
).toPersistentList()
).toImmutableList()
)
)
assertThat(sut.showQuickAction).isTrue()
@ -81,7 +81,7 @@ class LeaveSpaceStateTest {
listOf(
aSelectableSpaceRoom(isLastAdmin = false, isSelected = true),
aSelectableSpaceRoom(isLastAdmin = false, isSelected = true),
).toPersistentList()
).toImmutableList()
)
)
assertThat(sut.showQuickAction).isTrue()
@ -95,11 +95,11 @@ class LeaveSpaceStateTest {
fun `test 1 last admin, 2 selected`() {
val sut = aLeaveSpaceState(
selectableSpaceRooms = AsyncData.Success(
listOf(
persistentListOf(
aSelectableSpaceRoom(isLastAdmin = true, isSelected = false),
aSelectableSpaceRoom(isLastAdmin = false, isSelected = true),
aSelectableSpaceRoom(isLastAdmin = false, isSelected = true),
).toPersistentList()
)
)
)
assertThat(sut.showQuickAction).isTrue()
@ -116,7 +116,7 @@ class LeaveSpaceStateTest {
listOf(
aSelectableSpaceRoom(isLastAdmin = true, isSelected = false),
aSelectableSpaceRoom(isLastAdmin = true, isSelected = false),
).toPersistentList()
).toImmutableList()
)
)
assertThat(sut.showQuickAction).isFalse()

View file

@ -19,8 +19,9 @@ import dev.zacsweers.metro.AssistedInject
import io.element.android.features.viewfolder.impl.model.Item
import io.element.android.libraries.architecture.Presenter
import io.element.android.libraries.core.meta.BuildMeta
import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.persistentListOf
import kotlinx.collections.immutable.toPersistentList
import kotlinx.collections.immutable.toImmutableList
@AssistedInject
class ViewFolderPresenter(
@ -36,7 +37,7 @@ class ViewFolderPresenter(
@Composable
override fun present(): ViewFolderState {
var content by remember { mutableStateOf(persistentListOf<Item>()) }
var content by remember { mutableStateOf<ImmutableList<Item>>(persistentListOf()) }
val title = remember {
buildString {
if (path.contains(buildMeta.applicationId)) {
@ -49,7 +50,7 @@ class ViewFolderPresenter(
content = buildList {
if (canGoUp) add(Item.Parent)
addAll(folderExplorer.getItems(path))
}.toPersistentList()
}.toImmutableList()
}
return ViewFolderState(
title = title,