Introduce RoomListRoomSummaryFactory and remove RoomListRoomSummaryPlaceholders.
This commit is contained in:
parent
5bcef21154
commit
2acd00bcd8
5 changed files with 99 additions and 89 deletions
|
|
@ -19,7 +19,6 @@ package io.element.android.features.roomlist.impl
|
||||||
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
|
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
|
||||||
import io.element.android.features.leaveroom.api.aLeaveRoomState
|
import io.element.android.features.leaveroom.api.aLeaveRoomState
|
||||||
import io.element.android.features.roomlist.impl.model.RoomListRoomSummary
|
import io.element.android.features.roomlist.impl.model.RoomListRoomSummary
|
||||||
import io.element.android.features.roomlist.impl.model.RoomListRoomSummaryPlaceholders
|
|
||||||
import io.element.android.features.roomlist.impl.model.aRoomListRoomSummary
|
import io.element.android.features.roomlist.impl.model.aRoomListRoomSummary
|
||||||
import io.element.android.libraries.designsystem.components.avatar.AvatarData
|
import io.element.android.libraries.designsystem.components.avatar.AvatarData
|
||||||
import io.element.android.libraries.designsystem.components.avatar.AvatarSize
|
import io.element.android.libraries.designsystem.components.avatar.AvatarSize
|
||||||
|
|
@ -88,7 +87,13 @@ internal fun aRoomListRoomSummaryList(): ImmutableList<RoomListRoomSummary> {
|
||||||
avatarData = AvatarData("!id", "Z", size = AvatarSize.RoomListItem),
|
avatarData = AvatarData("!id", "Z", size = AvatarSize.RoomListItem),
|
||||||
id = "!roomId2:domain",
|
id = "!roomId2:domain",
|
||||||
),
|
),
|
||||||
RoomListRoomSummaryPlaceholders.create("!roomId3:domain"),
|
aRoomListRoomSummary(
|
||||||
RoomListRoomSummaryPlaceholders.create("!roomId4:domain"),
|
id = "!roomId3:domain",
|
||||||
|
isPlaceholder = true,
|
||||||
|
),
|
||||||
|
aRoomListRoomSummary(
|
||||||
|
id = "!roomId4:domain",
|
||||||
|
isPlaceholder = true,
|
||||||
|
),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -17,16 +17,9 @@
|
||||||
package io.element.android.features.roomlist.impl.datasource
|
package io.element.android.features.roomlist.impl.datasource
|
||||||
|
|
||||||
import io.element.android.features.roomlist.impl.model.RoomListRoomSummary
|
import io.element.android.features.roomlist.impl.model.RoomListRoomSummary
|
||||||
import io.element.android.features.roomlist.impl.model.RoomListRoomSummaryPlaceholders
|
|
||||||
import io.element.android.libraries.androidutils.diff.DiffCacheUpdater
|
import io.element.android.libraries.androidutils.diff.DiffCacheUpdater
|
||||||
import io.element.android.libraries.androidutils.diff.MutableListDiffCache
|
import io.element.android.libraries.androidutils.diff.MutableListDiffCache
|
||||||
import io.element.android.libraries.core.coroutine.CoroutineDispatchers
|
import io.element.android.libraries.core.coroutine.CoroutineDispatchers
|
||||||
import io.element.android.libraries.core.extensions.orEmpty
|
|
||||||
import io.element.android.libraries.dateformatter.api.LastMessageTimestampFormatter
|
|
||||||
import io.element.android.libraries.designsystem.components.avatar.AvatarData
|
|
||||||
import io.element.android.libraries.designsystem.components.avatar.AvatarSize
|
|
||||||
import io.element.android.libraries.eventformatter.api.RoomLastMessageFormatter
|
|
||||||
import io.element.android.libraries.matrix.api.core.RoomId
|
|
||||||
import io.element.android.libraries.matrix.api.notificationsettings.NotificationSettingsService
|
import io.element.android.libraries.matrix.api.notificationsettings.NotificationSettingsService
|
||||||
import io.element.android.libraries.matrix.api.roomlist.RoomListService
|
import io.element.android.libraries.matrix.api.roomlist.RoomListService
|
||||||
import io.element.android.libraries.matrix.api.roomlist.RoomSummary
|
import io.element.android.libraries.matrix.api.roomlist.RoomSummary
|
||||||
|
|
@ -49,8 +42,7 @@ import kotlin.time.Duration.Companion.seconds
|
||||||
|
|
||||||
class RoomListDataSource @Inject constructor(
|
class RoomListDataSource @Inject constructor(
|
||||||
private val roomListService: RoomListService,
|
private val roomListService: RoomListService,
|
||||||
private val lastMessageTimestampFormatter: LastMessageTimestampFormatter,
|
private val roomListRoomSummaryFactory: RoomListRoomSummaryFactory,
|
||||||
private val roomLastMessageFormatter: RoomLastMessageFormatter,
|
|
||||||
private val coroutineDispatchers: CoroutineDispatchers,
|
private val coroutineDispatchers: CoroutineDispatchers,
|
||||||
private val notificationSettingsService: NotificationSettingsService,
|
private val notificationSettingsService: NotificationSettingsService,
|
||||||
private val appScope: CoroutineScope,
|
private val appScope: CoroutineScope,
|
||||||
|
|
@ -121,7 +113,7 @@ class RoomListDataSource @Inject constructor(
|
||||||
private suspend fun buildAndEmitAllRooms(roomSummaries: List<RoomSummary>) {
|
private suspend fun buildAndEmitAllRooms(roomSummaries: List<RoomSummary>) {
|
||||||
if (diffCache.isEmpty()) {
|
if (diffCache.isEmpty()) {
|
||||||
_allRooms.emit(
|
_allRooms.emit(
|
||||||
RoomListRoomSummaryPlaceholders.createFakeList(16).toImmutableList()
|
roomListRoomSummaryFactory.createFakeList()
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
val roomListRoomSummaries = ArrayList<RoomListRoomSummary>()
|
val roomListRoomSummaries = ArrayList<RoomListRoomSummary>()
|
||||||
|
|
@ -141,34 +133,10 @@ class RoomListDataSource @Inject constructor(
|
||||||
|
|
||||||
private fun buildAndCacheItem(roomSummaries: List<RoomSummary>, index: Int): RoomListRoomSummary? {
|
private fun buildAndCacheItem(roomSummaries: List<RoomSummary>, index: Int): RoomListRoomSummary? {
|
||||||
val roomListRoomSummary = when (val roomSummary = roomSummaries.getOrNull(index)) {
|
val roomListRoomSummary = when (val roomSummary = roomSummaries.getOrNull(index)) {
|
||||||
is RoomSummary.Empty -> RoomListRoomSummaryPlaceholders.create(roomSummary.identifier)
|
is RoomSummary.Empty -> roomListRoomSummaryFactory.createPlaceholder(roomSummary.identifier)
|
||||||
is RoomSummary.Filled -> {
|
is RoomSummary.Filled -> roomListRoomSummaryFactory.create(roomSummary)
|
||||||
val avatarData = AvatarData(
|
|
||||||
id = roomSummary.identifier(),
|
|
||||||
name = roomSummary.details.name,
|
|
||||||
url = roomSummary.details.avatarUrl,
|
|
||||||
size = AvatarSize.RoomListItem,
|
|
||||||
)
|
|
||||||
val roomIdentifier = roomSummary.identifier()
|
|
||||||
RoomListRoomSummary(
|
|
||||||
id = roomSummary.identifier(),
|
|
||||||
roomId = RoomId(roomIdentifier),
|
|
||||||
name = roomSummary.details.name,
|
|
||||||
hasUnread = roomSummary.details.unreadNotificationCount > 0,
|
|
||||||
timestamp = lastMessageTimestampFormatter.format(roomSummary.details.lastMessageTimestamp),
|
|
||||||
lastMessage = roomSummary.details.lastMessage?.let { message ->
|
|
||||||
roomLastMessageFormatter.format(message.event, roomSummary.details.isDirect)
|
|
||||||
}.orEmpty(),
|
|
||||||
avatarData = avatarData,
|
|
||||||
isPlaceholder = false,
|
|
||||||
userDefinedNotificationMode = roomSummary.details.userDefinedNotificationMode,
|
|
||||||
hasRoomCall = roomSummary.details.hasRoomCall,
|
|
||||||
isDm = roomSummary.details.isDm,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
null -> null
|
null -> null
|
||||||
}
|
}
|
||||||
|
|
||||||
diffCache[index] = roomListRoomSummary
|
diffCache[index] = roomListRoomSummary
|
||||||
return roomListRoomSummary
|
return roomListRoomSummary
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,81 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2024 New Vector Ltd
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.element.android.features.roomlist.impl.datasource
|
||||||
|
|
||||||
|
import io.element.android.features.roomlist.impl.model.RoomListRoomSummary
|
||||||
|
import io.element.android.libraries.core.extensions.orEmpty
|
||||||
|
import io.element.android.libraries.dateformatter.api.LastMessageTimestampFormatter
|
||||||
|
import io.element.android.libraries.designsystem.components.avatar.AvatarData
|
||||||
|
import io.element.android.libraries.designsystem.components.avatar.AvatarSize
|
||||||
|
import io.element.android.libraries.eventformatter.api.RoomLastMessageFormatter
|
||||||
|
import io.element.android.libraries.matrix.api.core.RoomId
|
||||||
|
import io.element.android.libraries.matrix.api.roomlist.RoomSummary
|
||||||
|
import kotlinx.collections.immutable.ImmutableList
|
||||||
|
import kotlinx.collections.immutable.toImmutableList
|
||||||
|
import javax.inject.Inject
|
||||||
|
|
||||||
|
class RoomListRoomSummaryFactory @Inject constructor(
|
||||||
|
private val lastMessageTimestampFormatter: LastMessageTimestampFormatter,
|
||||||
|
private val roomLastMessageFormatter: RoomLastMessageFormatter,
|
||||||
|
) {
|
||||||
|
fun createPlaceholder(id: String): RoomListRoomSummary {
|
||||||
|
return RoomListRoomSummary(
|
||||||
|
id = id,
|
||||||
|
roomId = RoomId("!aRoom:domain"),
|
||||||
|
isPlaceholder = true,
|
||||||
|
name = "Short name",
|
||||||
|
timestamp = "hh:mm",
|
||||||
|
lastMessage = "Last message for placeholder",
|
||||||
|
avatarData = AvatarData(id, "S", size = AvatarSize.RoomListItem),
|
||||||
|
hasUnread = false,
|
||||||
|
userDefinedNotificationMode = null,
|
||||||
|
hasRoomCall = false,
|
||||||
|
isDm = false,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun createFakeList(): ImmutableList<RoomListRoomSummary> {
|
||||||
|
return List(16) {
|
||||||
|
createPlaceholder("!fakeRoom$it:domain")
|
||||||
|
}.toImmutableList()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun create(roomSummary: RoomSummary.Filled): RoomListRoomSummary {
|
||||||
|
val roomIdentifier = roomSummary.identifier()
|
||||||
|
val avatarData = AvatarData(
|
||||||
|
id = roomIdentifier,
|
||||||
|
name = roomSummary.details.name,
|
||||||
|
url = roomSummary.details.avatarUrl,
|
||||||
|
size = AvatarSize.RoomListItem,
|
||||||
|
)
|
||||||
|
return RoomListRoomSummary(
|
||||||
|
id = roomIdentifier,
|
||||||
|
roomId = RoomId(roomIdentifier),
|
||||||
|
name = roomSummary.details.name,
|
||||||
|
hasUnread = roomSummary.details.unreadNotificationCount > 0,
|
||||||
|
timestamp = lastMessageTimestampFormatter.format(roomSummary.details.lastMessageTimestamp),
|
||||||
|
lastMessage = roomSummary.details.lastMessage?.let { message ->
|
||||||
|
roomLastMessageFormatter.format(message.event, roomSummary.details.isDirect)
|
||||||
|
}.orEmpty(),
|
||||||
|
avatarData = avatarData,
|
||||||
|
isPlaceholder = false,
|
||||||
|
userDefinedNotificationMode = roomSummary.details.userDefinedNotificationMode,
|
||||||
|
hasRoomCall = roomSummary.details.hasRoomCall,
|
||||||
|
isDm = roomSummary.details.isDm,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,47 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2023 New Vector Ltd
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package io.element.android.features.roomlist.impl.model
|
|
||||||
|
|
||||||
import io.element.android.libraries.designsystem.components.avatar.AvatarData
|
|
||||||
import io.element.android.libraries.designsystem.components.avatar.AvatarSize
|
|
||||||
import io.element.android.libraries.matrix.api.core.RoomId
|
|
||||||
|
|
||||||
object RoomListRoomSummaryPlaceholders {
|
|
||||||
fun create(id: String): RoomListRoomSummary {
|
|
||||||
return RoomListRoomSummary(
|
|
||||||
id = id,
|
|
||||||
roomId = RoomId("!aRoom:domain"),
|
|
||||||
isPlaceholder = true,
|
|
||||||
name = "Short name",
|
|
||||||
timestamp = "hh:mm",
|
|
||||||
lastMessage = "Last message for placeholder",
|
|
||||||
avatarData = AvatarData(id, "S", size = AvatarSize.RoomListItem),
|
|
||||||
hasUnread = false,
|
|
||||||
userDefinedNotificationMode = null,
|
|
||||||
hasRoomCall = false,
|
|
||||||
isDm = false,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun createFakeList(size: Int): List<RoomListRoomSummary> {
|
|
||||||
return mutableListOf<RoomListRoomSummary>().apply {
|
|
||||||
repeat(size) {
|
|
||||||
add(create("!fakeRoom$it:domain"))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -28,6 +28,7 @@ import io.element.android.features.networkmonitor.test.FakeNetworkMonitor
|
||||||
import io.element.android.features.roomlist.impl.datasource.FakeInviteDataSource
|
import io.element.android.features.roomlist.impl.datasource.FakeInviteDataSource
|
||||||
import io.element.android.features.roomlist.impl.datasource.InviteStateDataSource
|
import io.element.android.features.roomlist.impl.datasource.InviteStateDataSource
|
||||||
import io.element.android.features.roomlist.impl.datasource.RoomListDataSource
|
import io.element.android.features.roomlist.impl.datasource.RoomListDataSource
|
||||||
|
import io.element.android.features.roomlist.impl.datasource.RoomListRoomSummaryFactory
|
||||||
import io.element.android.features.roomlist.impl.model.RoomListRoomSummary
|
import io.element.android.features.roomlist.impl.model.RoomListRoomSummary
|
||||||
import io.element.android.libraries.dateformatter.api.LastMessageTimestampFormatter
|
import io.element.android.libraries.dateformatter.api.LastMessageTimestampFormatter
|
||||||
import io.element.android.libraries.dateformatter.test.FakeLastMessageTimestampFormatter
|
import io.element.android.libraries.dateformatter.test.FakeLastMessageTimestampFormatter
|
||||||
|
|
@ -414,9 +415,11 @@ class RoomListPresenterTests {
|
||||||
inviteStateDataSource = inviteStateDataSource,
|
inviteStateDataSource = inviteStateDataSource,
|
||||||
leaveRoomPresenter = leaveRoomPresenter,
|
leaveRoomPresenter = leaveRoomPresenter,
|
||||||
roomListDataSource = RoomListDataSource(
|
roomListDataSource = RoomListDataSource(
|
||||||
client.roomListService,
|
roomListService = client.roomListService,
|
||||||
lastMessageTimestampFormatter,
|
roomListRoomSummaryFactory = RoomListRoomSummaryFactory(
|
||||||
roomLastMessageFormatter,
|
lastMessageTimestampFormatter = lastMessageTimestampFormatter,
|
||||||
|
roomLastMessageFormatter = roomLastMessageFormatter,
|
||||||
|
),
|
||||||
coroutineDispatchers = testCoroutineDispatchers(),
|
coroutineDispatchers = testCoroutineDispatchers(),
|
||||||
notificationSettingsService = client.notificationSettingsService(),
|
notificationSettingsService = client.notificationSettingsService(),
|
||||||
appScope = coroutineScope
|
appScope = coroutineScope
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue