Show full history if key backup is enabled.

This commit is contained in:
Benoit Marty 2023-11-08 12:41:15 +01:00
parent 5bb8efb728
commit cf0e92f7f6
5 changed files with 19 additions and 1 deletions

View file

@ -72,6 +72,7 @@ import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import kotlinx.coroutines.withTimeout import kotlinx.coroutines.withTimeout
import org.matrix.rustcomponents.sdk.BackupState
import org.matrix.rustcomponents.sdk.Client import org.matrix.rustcomponents.sdk.Client
import org.matrix.rustcomponents.sdk.ClientDelegate import org.matrix.rustcomponents.sdk.ClientDelegate
import org.matrix.rustcomponents.sdk.NotificationProcessSetup import org.matrix.rustcomponents.sdk.NotificationProcessSetup
@ -200,6 +201,7 @@ class RustMatrixClient constructor(
cachedPairOfRoom?.let { (roomListItem, fullRoom) -> cachedPairOfRoom?.let { (roomListItem, fullRoom) ->
RustMatrixRoom( RustMatrixRoom(
sessionId = sessionId, sessionId = sessionId,
isKeyBackupEnabled = client.encryption().backupState() == BackupState.ENABLED,
roomListItem = roomListItem, roomListItem = roomListItem,
innerRoom = fullRoom, innerRoom = fullRoom,
roomNotificationSettingsService = notificationSettingsService, roomNotificationSettingsService = notificationSettingsService,

View file

@ -86,6 +86,7 @@ import java.io.File
@OptIn(ExperimentalCoroutinesApi::class) @OptIn(ExperimentalCoroutinesApi::class)
class RustMatrixRoom( class RustMatrixRoom(
override val sessionId: SessionId, override val sessionId: SessionId,
isKeyBackupEnabled: Boolean,
private val roomListItem: RoomListItem, private val roomListItem: RoomListItem,
private val innerRoom: Room, private val innerRoom: Room,
private val roomNotificationSettingsService: RustNotificationSettingsService, private val roomNotificationSettingsService: RustNotificationSettingsService,
@ -126,6 +127,7 @@ class RustMatrixRoom(
override val roomNotificationSettingsStateFlow: StateFlow<MatrixRoomNotificationSettingsState> = _roomNotificationSettingsStateFlow override val roomNotificationSettingsStateFlow: StateFlow<MatrixRoomNotificationSettingsState> = _roomNotificationSettingsStateFlow
override val timeline = RustMatrixTimeline( override val timeline = RustMatrixTimeline(
isKeyBackupEnabled = isKeyBackupEnabled,
matrixRoom = this, matrixRoom = this,
innerRoom = innerRoom, innerRoom = innerRoom,
roomCoroutineScope = roomCoroutineScope, roomCoroutineScope = roomCoroutineScope,

View file

@ -57,6 +57,7 @@ private const val INITIAL_MAX_SIZE = 50
class RustMatrixTimeline( class RustMatrixTimeline(
roomCoroutineScope: CoroutineScope, roomCoroutineScope: CoroutineScope,
isKeyBackupEnabled: Boolean,
private val matrixRoom: MatrixRoom, private val matrixRoom: MatrixRoom,
private val innerRoom: Room, private val innerRoom: Room,
private val dispatcher: CoroutineDispatcher, private val dispatcher: CoroutineDispatcher,
@ -77,6 +78,7 @@ class RustMatrixTimeline(
private val encryptedHistoryPostProcessor = TimelineEncryptedHistoryPostProcessor( private val encryptedHistoryPostProcessor = TimelineEncryptedHistoryPostProcessor(
lastLoginTimestamp = lastLoginTimestamp, lastLoginTimestamp = lastLoginTimestamp,
isRoomEncrypted = matrixRoom.isEncrypted, isRoomEncrypted = matrixRoom.isEncrypted,
isKeyBackupEnabled = isKeyBackupEnabled,
paginationStateFlow = _paginationState, paginationStateFlow = _paginationState,
dispatcher = dispatcher, dispatcher = dispatcher,
) )

View file

@ -30,12 +30,13 @@ class TimelineEncryptedHistoryPostProcessor(
private val dispatcher: CoroutineDispatcher, private val dispatcher: CoroutineDispatcher,
private val lastLoginTimestamp: Date?, private val lastLoginTimestamp: Date?,
private val isRoomEncrypted: Boolean, private val isRoomEncrypted: Boolean,
private val isKeyBackupEnabled: Boolean,
private val paginationStateFlow: MutableStateFlow<MatrixTimeline.PaginationState>, private val paginationStateFlow: MutableStateFlow<MatrixTimeline.PaginationState>,
) { ) {
suspend fun process(items: List<MatrixTimelineItem>): List<MatrixTimelineItem> = withContext(dispatcher) { suspend fun process(items: List<MatrixTimelineItem>): List<MatrixTimelineItem> = withContext(dispatcher) {
Timber.d("Process on Thread=${Thread.currentThread()}") Timber.d("Process on Thread=${Thread.currentThread()}")
if (!isRoomEncrypted || lastLoginTimestamp == null) return@withContext items if (!isRoomEncrypted || isKeyBackupEnabled || lastLoginTimestamp == null) return@withContext items
val filteredItems = replaceWithEncryptionHistoryBannerIfNeeded(items) val filteredItems = replaceWithEncryptionHistoryBannerIfNeeded(items)
// Disable back pagination // Disable back pagination

View file

@ -41,6 +41,15 @@ class TimelineEncryptedHistoryPostProcessorTest {
assertThat(processor.process(items)).isSameInstanceAs(items) assertThat(processor.process(items)).isSameInstanceAs(items)
} }
@Test
fun `given an encrypted room, and key backup enabled, nothing is done`() = runTest {
val processor = createPostProcessor(isKeyBackupEnabled = true)
val items = listOf(
MatrixTimelineItem.Event(0L, anEventTimelineItem())
)
assertThat(processor.process(items)).isSameInstanceAs(items)
}
@Test @Test
fun `given a null lastLoginTimestamp, nothing is done`() = runTest { fun `given a null lastLoginTimestamp, nothing is done`() = runTest {
val processor = createPostProcessor(lastLoginTimestamp = null) val processor = createPostProcessor(lastLoginTimestamp = null)
@ -108,11 +117,13 @@ class TimelineEncryptedHistoryPostProcessorTest {
private fun TestScope.createPostProcessor( private fun TestScope.createPostProcessor(
lastLoginTimestamp: Date? = defaultLastLoginTimestamp, lastLoginTimestamp: Date? = defaultLastLoginTimestamp,
isRoomEncrypted: Boolean = true, isRoomEncrypted: Boolean = true,
isKeyBackupEnabled: Boolean = false,
paginationStateFlow: MutableStateFlow<MatrixTimeline.PaginationState> = paginationStateFlow: MutableStateFlow<MatrixTimeline.PaginationState> =
MutableStateFlow(MatrixTimeline.PaginationState(hasMoreToLoadBackwards = true, isBackPaginating = false)) MutableStateFlow(MatrixTimeline.PaginationState(hasMoreToLoadBackwards = true, isBackPaginating = false))
) = TimelineEncryptedHistoryPostProcessor( ) = TimelineEncryptedHistoryPostProcessor(
lastLoginTimestamp = lastLoginTimestamp, lastLoginTimestamp = lastLoginTimestamp,
isRoomEncrypted = isRoomEncrypted, isRoomEncrypted = isRoomEncrypted,
isKeyBackupEnabled = isKeyBackupEnabled,
paginationStateFlow = paginationStateFlow, paginationStateFlow = paginationStateFlow,
dispatcher = StandardTestDispatcher(testScheduler) dispatcher = StandardTestDispatcher(testScheduler)
) )