From 173f3290c8b9eb81a48252fbab09e88c94fe9165 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20Mart=C3=ADn?= Date: Mon, 6 May 2024 14:47:35 +0200 Subject: [PATCH 1/7] Adapt to changes in SDK --- .../android/libraries/matrix/impl/RustMatrixClient.kt | 8 ++------ .../libraries/matrix/impl/room/MatrixRoomInfoMapper.kt | 2 +- .../android/libraries/matrix/impl/room/RustMatrixRoom.kt | 3 ++- .../libraries/matrix/impl/roomlist/RoomListExtensions.kt | 2 +- .../matrix/impl/roomlist/RoomSummaryDetailsFactory.kt | 2 +- .../libraries/matrix/impl/timeline/RustTimeline.kt | 2 +- 6 files changed, 8 insertions(+), 11 deletions(-) diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClient.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClient.kt index 91036df1cc4..10afcf94a0f 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClient.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClient.kt @@ -96,6 +96,7 @@ import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.launch +import kotlinx.coroutines.runBlocking import kotlinx.coroutines.withContext import kotlinx.coroutines.withTimeout import org.matrix.rustcomponents.sdk.BackupState @@ -145,12 +146,7 @@ class RustMatrixClient( dispatchers = dispatchers, ) private val notificationProcessSetup = NotificationProcessSetup.SingleProcess(syncService) - private val notificationClient = client.notificationClient(notificationProcessSetup) - .use { builder -> - builder - .filterByPushRules() - .finish() - } + private val notificationClient = runBlocking { client.notificationClient(notificationProcessSetup) } private val notificationService = RustNotificationService(sessionId, notificationClient, dispatchers, clock) private val notificationSettingsService = RustNotificationSettingsService(client, dispatchers) .apply { start() } diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/MatrixRoomInfoMapper.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/MatrixRoomInfoMapper.kt index d3ef3283bd6..3fe4dcf1b77 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/MatrixRoomInfoMapper.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/MatrixRoomInfoMapper.kt @@ -38,7 +38,7 @@ class MatrixRoomInfoMapper( fun map(rustRoomInfo: RustRoomInfo): MatrixRoomInfo = rustRoomInfo.use { return MatrixRoomInfo( id = RoomId(it.id), - name = it.name, + name = it.displayName, topic = it.topic, avatarUrl = it.avatarUrl, isDirect = it.isDirect, diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RustMatrixRoom.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RustMatrixRoom.kt index 1fe5d786277..8156d44f716 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RustMatrixRoom.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RustMatrixRoom.kt @@ -191,8 +191,9 @@ class RustMatrixRoom( roomListItem.destroy() } + // TODO: delete this one, replace it with displayName override val name: String? - get() = runCatching { roomListItem.name() }.getOrDefault(null) + get() = runCatching { roomListItem.displayName() }.getOrDefault(null) override val displayName: String get() = runCatching { innerRoom.displayName() }.getOrDefault("") diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/roomlist/RoomListExtensions.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/roomlist/RoomListExtensions.kt index 79ea6b17e0c..8094f0bee7e 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/roomlist/RoomListExtensions.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/roomlist/RoomListExtensions.kt @@ -126,7 +126,7 @@ internal fun RoomListServiceInterface.syncIndicator(): Flow { + private suspend fun fetchDetailsForEvent(eventId: EventId): Result { return runCatching { inner.fetchDetailsForEvent(eventId.value) } From d11473af0e477dcd4c8590d54e0167265836e9ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20Mart=C3=ADn?= Date: Fri, 10 May 2024 12:33:16 +0200 Subject: [PATCH 2/7] Add logs removal migration again --- .../impl/migrations/AppMigration01.kt | 5 ++- .../impl/migrations/AppMigration02.kt | 4 +++ .../impl/migrations/AppMigration03.kt | 32 +++++++++++++++++++ 3 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/migrations/AppMigration03.kt diff --git a/features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/migrations/AppMigration01.kt b/features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/migrations/AppMigration01.kt index 91a89d7aa47..6dcecaca06b 100644 --- a/features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/migrations/AppMigration01.kt +++ b/features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/migrations/AppMigration01.kt @@ -21,8 +21,11 @@ import io.element.android.features.rageshake.api.logs.LogFilesRemover import io.element.android.libraries.di.AppScope import javax.inject.Inject +/** + * Remove existing logs from the device to remove any leaks of sensitive data. + */ @ContributesMultibinding(AppScope::class) -class AppMigration01 @Inject constructor( +open class AppMigration01 @Inject constructor( private val logFilesRemover: LogFilesRemover, ) : AppMigration { override val order: Int = 1 diff --git a/features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/migrations/AppMigration02.kt b/features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/migrations/AppMigration02.kt index 410a382ff39..c354300aa3f 100644 --- a/features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/migrations/AppMigration02.kt +++ b/features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/migrations/AppMigration02.kt @@ -24,6 +24,10 @@ import io.element.android.libraries.sessionstorage.api.SessionStore import kotlinx.coroutines.coroutineScope import javax.inject.Inject +/** + * This migration sets the skip session verification preference to true for all existing sessions. + * This way we don't force existing users to verify their session again. + */ @ContributesMultibinding(AppScope::class) class AppMigration02 @Inject constructor( private val sessionStore: SessionStore, diff --git a/features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/migrations/AppMigration03.kt b/features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/migrations/AppMigration03.kt new file mode 100644 index 00000000000..7314b35ded7 --- /dev/null +++ b/features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/migrations/AppMigration03.kt @@ -0,0 +1,32 @@ +/* + * 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.migration.impl.migrations + +import com.squareup.anvil.annotations.ContributesMultibinding +import io.element.android.features.rageshake.api.logs.LogFilesRemover +import io.element.android.libraries.di.AppScope +import javax.inject.Inject + +/** + * This performs the same operation as [AppMigration01], since we need to clear the local logs again. + */ +@ContributesMultibinding(AppScope::class) +class AppMigration03 @Inject constructor( + private val logFilesRemover: LogFilesRemover, +) : AppMigration01(logFilesRemover) { + override val order: Int = 3 +} From 678cbdf23f6a08cca87345fb394f649f06cf9b70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20Mart=C3=ADn?= Date: Fri, 10 May 2024 12:33:37 +0200 Subject: [PATCH 3/7] Bump version to `0.4.12` --- plugins/src/main/kotlin/Versions.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/src/main/kotlin/Versions.kt b/plugins/src/main/kotlin/Versions.kt index ad430d9a441..a44140f9b2a 100644 --- a/plugins/src/main/kotlin/Versions.kt +++ b/plugins/src/main/kotlin/Versions.kt @@ -56,7 +56,7 @@ private const val versionMinor = 4 // Note: even values are reserved for regular release, odd values for hotfix release. // When creating a hotfix, you should decrease the value, since the current value // is the value for the next regular release. -private const val versionPatch = 11 +private const val versionPatch = 12 object Versions { val versionCode = 4_000_000 + versionMajor * 1_00_00 + versionMinor * 1_00 + versionPatch From 5bcac5cd46bff8922aa44d32248740b919c75be1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20Mart=C3=ADn?= Date: Fri, 10 May 2024 13:03:37 +0200 Subject: [PATCH 4/7] Fix API break from Rust SDK --- .../element/android/libraries/matrix/impl/RustMatrixClient.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClient.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClient.kt index 10afcf94a0f..7b6ec132681 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClient.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClient.kt @@ -461,7 +461,7 @@ class RustMatrixClient( override suspend fun resolveRoomAlias(roomAlias: RoomAlias): Result = withContext(sessionDispatcher) { runCatching { - client.resolveRoomAlias(roomAlias.value).let(::RoomId) + client.resolveRoomAlias(roomAlias.value).roomId.let(::RoomId) } } From 59d9069de336af49b719a662d3afc6e86789b9f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20Mart=C3=ADn?= Date: Mon, 13 May 2024 15:28:37 +0200 Subject: [PATCH 5/7] Fix Rust SDK upgrade issues. - Remove `name` from `MatrixRoom`, we should use `displayName` instead. - Remove separate `invites` room list. --- .../roomdetails/impl/RoomDetailsPresenter.kt | 2 +- .../impl/edit/RoomDetailsEditPresenter.kt | 6 ++-- .../roomdetails/RoomDetailsPresenterTests.kt | 8 ++--- .../edit/RoomDetailsEditPresenterTest.kt | 34 +++++++++---------- gradle/libs.versions.toml | 2 +- .../libraries/matrix/api/room/MatrixRoom.kt | 1 - .../libraries/matrix/api/roomlist/RoomList.kt | 6 ++-- .../matrix/api/roomlist/RoomListService.kt | 5 --- .../matrix/impl/RustMatrixClientFactory.kt | 1 - .../matrix/impl/room/RustMatrixRoom.kt | 4 --- .../impl/roomlist/RustRoomListService.kt | 8 ----- .../roomlist/RoomSummaryListProcessorTests.kt | 6 +--- .../matrix/test/room/FakeMatrixRoom.kt | 1 - .../test/roomlist/FakeRoomListService.kt | 12 ------- 14 files changed, 28 insertions(+), 68 deletions(-) diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsPresenter.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsPresenter.kt index 848b9edc433..966dade2c3a 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsPresenter.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsPresenter.kt @@ -75,7 +75,7 @@ class RoomDetailsPresenter @Inject constructor( val roomAvatar by remember { derivedStateOf { roomInfo?.avatarUrl ?: room.avatarUrl } } - val roomName by remember { derivedStateOf { (roomInfo?.name ?: room.name ?: room.displayName).trim() } } + val roomName by remember { derivedStateOf { (roomInfo?.name ?: room.displayName).trim() } } val roomTopic by remember { derivedStateOf { roomInfo?.topic ?: room.topic } } val isFavorite by remember { derivedStateOf { roomInfo?.isFavorite.orFalse() } } val isPublic by remember { derivedStateOf { roomInfo?.isPublic.orFalse() } } diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/edit/RoomDetailsEditPresenter.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/edit/RoomDetailsEditPresenter.kt index 32f36a891bd..6213f2cf1a8 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/edit/RoomDetailsEditPresenter.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/edit/RoomDetailsEditPresenter.kt @@ -65,7 +65,7 @@ class RoomDetailsEditPresenter @Inject constructor( // just erase the local value when the room field has changed var roomAvatarUri by rememberSaveable(room.avatarUrl) { mutableStateOf(room.avatarUrl?.toUri()) } - var roomName by rememberSaveable { mutableStateOf((room.name ?: room.displayName).trim()) } + var roomName by rememberSaveable { mutableStateOf(room.displayName.trim()) } var roomTopic by rememberSaveable { mutableStateOf(room.topic?.trim()) } val saveButtonEnabled by remember( @@ -76,7 +76,7 @@ class RoomDetailsEditPresenter @Inject constructor( ) { derivedStateOf { roomAvatarUri?.toString()?.trim() != room.avatarUrl?.toUri()?.toString()?.trim() || - roomName.trim() != (room.name ?: room.displayName).trim() || + roomName.trim() != room.displayName.trim() || roomTopic.orEmpty().trim() != room.topic.orEmpty().trim() } } @@ -168,7 +168,7 @@ class RoomDetailsEditPresenter @Inject constructor( Timber.e(it, "Failed to set room topic") }) } - if (name.isNotEmpty() && name.trim() != room.name.orEmpty().trim()) { + if (name.isNotEmpty() && name.trim() != room.displayName.trim()) { results.add(room.setName(name).onFailure { Timber.e(it, "Failed to set room name") }) diff --git a/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/RoomDetailsPresenterTests.kt b/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/RoomDetailsPresenterTests.kt index 8ce06e38357..998193690ed 100644 --- a/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/RoomDetailsPresenterTests.kt +++ b/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/RoomDetailsPresenterTests.kt @@ -118,7 +118,7 @@ class RoomDetailsPresenterTests { presenter.test { val initialState = awaitItem() assertThat(initialState.roomId).isEqualTo(room.roomId) - assertThat(initialState.roomName).isEqualTo(room.name) + assertThat(initialState.roomName).isEqualTo(room.displayName) assertThat(initialState.roomAvatarUrl).isEqualTo(room.avatarUrl) assertThat(initialState.roomTopic).isEqualTo(RoomTopicState.ExistingTopic(room.topic!!)) assertThat(initialState.memberCount).isEqualTo(room.joinedMemberCount) @@ -148,7 +148,7 @@ class RoomDetailsPresenterTests { @Test fun `present - initial state with no room name`() = runTest { - val room = aMatrixRoom(name = null) + val room = aMatrixRoom(displayName = "") val presenter = createRoomDetailsPresenter(room) presenter.test { val initialState = awaitItem() @@ -476,8 +476,7 @@ class RoomDetailsPresenterTests { fun aMatrixRoom( roomId: RoomId = A_ROOM_ID, - name: String? = A_ROOM_NAME, - displayName: String = "A fallback display name", + displayName: String = A_ROOM_NAME, topic: String? = "A topic", avatarUrl: String? = "https://matrix.org/avatar.jpg", isEncrypted: Boolean = true, @@ -486,7 +485,6 @@ fun aMatrixRoom( notificationSettingsService: FakeNotificationSettingsService = FakeNotificationSettingsService() ) = FakeMatrixRoom( roomId = roomId, - name = name, displayName = displayName, topic = topic, avatarUrl = avatarUrl, diff --git a/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/edit/RoomDetailsEditPresenterTest.kt b/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/edit/RoomDetailsEditPresenterTest.kt index f2f6f9b1b49..8b0dcd5b0aa 100644 --- a/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/edit/RoomDetailsEditPresenterTest.kt +++ b/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/edit/RoomDetailsEditPresenterTest.kt @@ -98,7 +98,7 @@ class RoomDetailsEditPresenterTest { }.test { val initialState = awaitItem() assertThat(initialState.roomId).isEqualTo(room.roomId.value) - assertThat(initialState.roomName).isEqualTo(room.name) + assertThat(initialState.roomName).isEqualTo(room.displayName) assertThat(initialState.roomAvatarUrl).isEqualTo(roomAvatarUri) assertThat(initialState.roomTopic).isEqualTo(room.topic.orEmpty()) assertThat(initialState.avatarActions).containsExactly( @@ -191,7 +191,7 @@ class RoomDetailsEditPresenterTest { @Test fun `present - updates state in response to changes`() = runTest { - val room = aMatrixRoom(topic = "My topic", name = "Name", avatarUrl = AN_AVATAR_URL) + val room = aMatrixRoom(topic = "My topic", displayName = "Name", avatarUrl = AN_AVATAR_URL) val presenter = createRoomDetailsEditPresenter(room) moleculeFlow(RecompositionMode.Immediate) { @@ -234,7 +234,7 @@ class RoomDetailsEditPresenterTest { @Test fun `present - obtains avatar uris from gallery`() = runTest { - val room = aMatrixRoom(topic = "My topic", name = "Name", avatarUrl = AN_AVATAR_URL) + val room = aMatrixRoom(topic = "My topic", displayName = "Name", avatarUrl = AN_AVATAR_URL) fakePickerProvider.givenResult(anotherAvatarUri) @@ -255,7 +255,7 @@ class RoomDetailsEditPresenterTest { @Test fun `present - obtains avatar uris from camera`() = runTest { - val room = aMatrixRoom(topic = "My topic", name = "Name", avatarUrl = AN_AVATAR_URL) + val room = aMatrixRoom(topic = "My topic", displayName = "Name", avatarUrl = AN_AVATAR_URL) fakePickerProvider.givenResult(anotherAvatarUri) val fakePermissionsPresenter = FakePermissionsPresenter() @@ -288,7 +288,7 @@ class RoomDetailsEditPresenterTest { @Test fun `present - updates save button state`() = runTest { - val room = aMatrixRoom(topic = "My topic", name = "Name", avatarUrl = AN_AVATAR_URL) + val room = aMatrixRoom(topic = "My topic", displayName = "Name", avatarUrl = AN_AVATAR_URL) fakePickerProvider.givenResult(roomAvatarUri) @@ -340,7 +340,7 @@ class RoomDetailsEditPresenterTest { @Test fun `present - updates save button state when initial values are null`() = runTest { - val room = aMatrixRoom(topic = null, name = null, displayName = "fallback", avatarUrl = null) + val room = aMatrixRoom(topic = null, displayName = "fallback", avatarUrl = null) fakePickerProvider.givenResult(roomAvatarUri) @@ -392,7 +392,7 @@ class RoomDetailsEditPresenterTest { @Test fun `present - save changes room details if different`() = runTest { - val room = aMatrixRoom(topic = "My topic", name = "Name", avatarUrl = AN_AVATAR_URL) + val room = aMatrixRoom(topic = "My topic", displayName = "Name", avatarUrl = AN_AVATAR_URL) val presenter = createRoomDetailsEditPresenter(room) @@ -417,7 +417,7 @@ class RoomDetailsEditPresenterTest { @Test fun `present - save doesn't change room details if they're the same trimmed`() = runTest { - val room = aMatrixRoom(topic = "My topic", name = "Name", avatarUrl = AN_AVATAR_URL) + val room = aMatrixRoom(topic = "My topic", displayName = "Name", avatarUrl = AN_AVATAR_URL) val presenter = createRoomDetailsEditPresenter(room) @@ -441,7 +441,7 @@ class RoomDetailsEditPresenterTest { @Test fun `present - save doesn't change topic if it was unset and is now blank`() = runTest { - val room = aMatrixRoom(topic = null, name = "Name", avatarUrl = AN_AVATAR_URL) + val room = aMatrixRoom(topic = null, displayName = "Name", avatarUrl = AN_AVATAR_URL) val presenter = createRoomDetailsEditPresenter(room) @@ -464,7 +464,7 @@ class RoomDetailsEditPresenterTest { @Test fun `present - save doesn't change name if it's now empty`() = runTest { - val room = aMatrixRoom(topic = "My topic", name = "Name", avatarUrl = AN_AVATAR_URL) + val room = aMatrixRoom(topic = "My topic", displayName = "Name", avatarUrl = AN_AVATAR_URL) val presenter = createRoomDetailsEditPresenter(room) @@ -487,7 +487,7 @@ class RoomDetailsEditPresenterTest { @Test fun `present - save processes and sets avatar when processor returns successfully`() = runTest { - val room = aMatrixRoom(topic = "My topic", name = "Name", avatarUrl = AN_AVATAR_URL) + val room = aMatrixRoom(topic = "My topic", displayName = "Name", avatarUrl = AN_AVATAR_URL) givenPickerReturnsFile() @@ -511,7 +511,7 @@ class RoomDetailsEditPresenterTest { @Test fun `present - save does not set avatar data if processor fails`() = runTest { - val room = aMatrixRoom(topic = "My topic", name = "Name", avatarUrl = AN_AVATAR_URL) + val room = aMatrixRoom(topic = "My topic", displayName = "Name", avatarUrl = AN_AVATAR_URL) fakePickerProvider.givenResult(anotherAvatarUri) fakeMediaPreProcessor.givenResult(Result.failure(Throwable("Oh no"))) @@ -538,7 +538,7 @@ class RoomDetailsEditPresenterTest { @Test fun `present - sets save action to failure if name update fails`() = runTest { - val room = aMatrixRoom(topic = "My topic", name = "Name", avatarUrl = AN_AVATAR_URL).apply { + val room = aMatrixRoom(topic = "My topic", displayName = "Name", avatarUrl = AN_AVATAR_URL).apply { givenSetNameResult(Result.failure(Throwable("!"))) } @@ -547,7 +547,7 @@ class RoomDetailsEditPresenterTest { @Test fun `present - sets save action to failure if topic update fails`() = runTest { - val room = aMatrixRoom(topic = "My topic", name = "Name", avatarUrl = AN_AVATAR_URL).apply { + val room = aMatrixRoom(topic = "My topic", displayName = "Name", avatarUrl = AN_AVATAR_URL).apply { givenSetTopicResult(Result.failure(Throwable("!"))) } @@ -556,7 +556,7 @@ class RoomDetailsEditPresenterTest { @Test fun `present - sets save action to failure if removing avatar fails`() = runTest { - val room = aMatrixRoom(topic = "My topic", name = "Name", avatarUrl = AN_AVATAR_URL).apply { + val room = aMatrixRoom(topic = "My topic", displayName = "Name", avatarUrl = AN_AVATAR_URL).apply { givenRemoveAvatarResult(Result.failure(Throwable("!"))) } @@ -567,7 +567,7 @@ class RoomDetailsEditPresenterTest { fun `present - sets save action to failure if setting avatar fails`() = runTest { givenPickerReturnsFile() - val room = aMatrixRoom(topic = "My topic", name = "Name", avatarUrl = AN_AVATAR_URL).apply { + val room = aMatrixRoom(topic = "My topic", displayName = "Name", avatarUrl = AN_AVATAR_URL).apply { givenUpdateAvatarResult(Result.failure(Throwable("!"))) } @@ -578,7 +578,7 @@ class RoomDetailsEditPresenterTest { fun `present - CancelSaveChanges resets save action state`() = runTest { givenPickerReturnsFile() - val room = aMatrixRoom(topic = "My topic", name = "Name", avatarUrl = AN_AVATAR_URL).apply { + val room = aMatrixRoom(topic = "My topic", displayName = "Name", avatarUrl = AN_AVATAR_URL).apply { givenSetTopicResult(Result.failure(Throwable("!"))) } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index b7edb0421df..aabf5cebfa6 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -159,7 +159,7 @@ jsoup = "org.jsoup:jsoup:1.17.2" appyx_core = { module = "com.bumble.appyx:core", version.ref = "appyx" } molecule-runtime = "app.cash.molecule:molecule-runtime:1.4.2" timber = "com.jakewharton.timber:timber:5.0.1" -matrix_sdk = "org.matrix.rustcomponents:sdk-android:0.2.16" +matrix_sdk = "org.matrix.rustcomponents:sdk-android:0.2.18" matrix_richtexteditor = { module = "io.element.android:wysiwyg", version.ref = "wysiwyg" } matrix_richtexteditor_compose = { module = "io.element.android:wysiwyg-compose", version.ref = "wysiwyg" } sqldelight-driver-android = { module = "app.cash.sqldelight:android-driver", version.ref = "sqldelight" } diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/MatrixRoom.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/MatrixRoom.kt index 33cd86c005b..a4619635c66 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/MatrixRoom.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/MatrixRoom.kt @@ -44,7 +44,6 @@ import java.io.File interface MatrixRoom : Closeable { val sessionId: SessionId val roomId: RoomId - val name: String? val displayName: String val alias: RoomAlias? val alternativeAliases: List diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/roomlist/RoomList.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/roomlist/RoomList.kt index 1af22cd4c8e..85e33510897 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/roomlist/RoomList.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/roomlist/RoomList.kt @@ -39,14 +39,12 @@ interface RoomList { /** * The source of the room list data. - * All: all rooms except invites. - * Invites: only invites. + * All: all rooms. * * To apply some dynamic filtering on top of that, use [DynamicRoomList]. */ enum class Source { - All, - Invites, + All } /** diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/roomlist/RoomListService.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/roomlist/RoomListService.kt index 95992b965e2..dc8e0988e46 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/roomlist/RoomListService.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/roomlist/RoomListService.kt @@ -59,11 +59,6 @@ interface RoomListService { */ val allRooms: DynamicRoomList - /** - * returns a [RoomList] object of all invites. - */ - val invites: RoomList - /** * Will set the visible range of all rooms. * This is useful to load more data when the user scrolls down. diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClientFactory.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClientFactory.kt index fefec384dd1..80302933d53 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClientFactory.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClientFactory.kt @@ -71,7 +71,6 @@ class RustMatrixClientFactory @Inject constructor( val syncService = client.syncService() .withUtdHook(utdTracker) - .withUnifiedInvitesInRoomList(true) .finish() RustMatrixClient( diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RustMatrixRoom.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RustMatrixRoom.kt index 8156d44f716..93720df55cd 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RustMatrixRoom.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RustMatrixRoom.kt @@ -191,10 +191,6 @@ class RustMatrixRoom( roomListItem.destroy() } - // TODO: delete this one, replace it with displayName - override val name: String? - get() = runCatching { roomListItem.displayName() }.getOrDefault(null) - override val displayName: String get() = runCatching { innerRoom.displayName() }.getOrDefault("") diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/roomlist/RustRoomListService.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/roomlist/RustRoomListService.kt index 70310e472e6..8b8ccc3926b 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/roomlist/RustRoomListService.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/roomlist/RustRoomListService.kt @@ -58,7 +58,6 @@ internal class RustRoomListService( ) { when (source) { RoomList.Source.All -> innerRoomListService.allRooms() - RoomList.Source.Invites -> innerRoomListService.invites() } } } @@ -70,13 +69,6 @@ internal class RustRoomListService( innerRoomListService.allRooms() } - override val invites: RoomList = roomListFactory.createRoomList( - pageSize = Int.MAX_VALUE, - coroutineContext = sessionDispatcher, - ) { - innerRoomListService.invites() - } - init { allRooms.loadAllIncrementally(sessionCoroutineScope) } diff --git a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/roomlist/RoomSummaryListProcessorTests.kt b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/roomlist/RoomSummaryListProcessorTests.kt index 38126055465..6442987770e 100644 --- a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/roomlist/RoomSummaryListProcessorTests.kt +++ b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/roomlist/RoomSummaryListProcessorTests.kt @@ -170,11 +170,7 @@ class RoomSummaryListProcessorTests { override suspend fun applyInput(input: RoomListInput) = Unit - override suspend fun invites(): RoomList { - return RoomList(Pointer.NULL) - } - - override fun room(roomId: String): RoomListItem { + override suspend fun room(roomId: String): RoomListItem { return RoomListItem(Pointer.NULL) } diff --git a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/FakeMatrixRoom.kt b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/FakeMatrixRoom.kt index a435a7a4ca4..fff0ce82477 100644 --- a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/FakeMatrixRoom.kt +++ b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/FakeMatrixRoom.kt @@ -70,7 +70,6 @@ import java.io.File class FakeMatrixRoom( override val sessionId: SessionId = A_SESSION_ID, override val roomId: RoomId = A_ROOM_ID, - override val name: String? = null, override val displayName: String = "", override val topic: String? = null, override val avatarUrl: String? = null, diff --git a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/roomlist/FakeRoomListService.kt b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/roomlist/FakeRoomListService.kt index 5de62272d35..4b8da511d04 100644 --- a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/roomlist/FakeRoomListService.kt +++ b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/roomlist/FakeRoomListService.kt @@ -28,7 +28,6 @@ class FakeRoomListService : RoomListService { private val allRoomSummariesFlow = MutableStateFlow>(emptyList()) private val inviteRoomSummariesFlow = MutableStateFlow>(emptyList()) private val allRoomsLoadingStateFlow = MutableStateFlow(RoomList.LoadingState.NotLoaded) - private val inviteRoomsLoadingStateFlow = MutableStateFlow(RoomList.LoadingState.NotLoaded) private val roomListStateFlow = MutableStateFlow(RoomListService.State.Idle) private val syncIndicatorStateFlow = MutableStateFlow(RoomListService.SyncIndicator.Hide) @@ -44,10 +43,6 @@ class FakeRoomListService : RoomListService { allRoomsLoadingStateFlow.emit(loadingState) } - suspend fun postInviteRoomsLoadingState(loadingState: RoomList.LoadingState) { - inviteRoomsLoadingStateFlow.emit(loadingState) - } - suspend fun postState(state: RoomListService.State) { roomListStateFlow.emit(state) } @@ -66,7 +61,6 @@ class FakeRoomListService : RoomListService { ): DynamicRoomList { return when (source) { RoomList.Source.All -> allRooms - RoomList.Source.Invites -> invites } } @@ -76,12 +70,6 @@ class FakeRoomListService : RoomListService { MutableStateFlow(RoomListFilter.all()) ) - override val invites = SimplePagedRoomList( - inviteRoomSummariesFlow, - inviteRoomsLoadingStateFlow, - MutableStateFlow(RoomListFilter.all()) - ) - override fun updateAllRoomsVisibleRange(range: IntRange) { latestSlidingSyncRange = range } From 68de2b9894d34bae144ad775aa8ebb62790f89da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20Mart=C3=ADn?= Date: Mon, 13 May 2024 16:04:38 +0200 Subject: [PATCH 6/7] Add test for `AppMigration03` Technically it's the same as `AppMigration01`. --- .../impl/migrations/AppMigration03Test.kt | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 features/migration/impl/src/test/kotlin/io/element/android/features/migration/impl/migrations/AppMigration03Test.kt diff --git a/features/migration/impl/src/test/kotlin/io/element/android/features/migration/impl/migrations/AppMigration03Test.kt b/features/migration/impl/src/test/kotlin/io/element/android/features/migration/impl/migrations/AppMigration03Test.kt new file mode 100644 index 00000000000..ee64658fc63 --- /dev/null +++ b/features/migration/impl/src/test/kotlin/io/element/android/features/migration/impl/migrations/AppMigration03Test.kt @@ -0,0 +1,33 @@ +/* + * 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.migration.impl.migrations + +import io.element.android.features.rageshake.test.logs.FakeLogFilesRemover +import kotlinx.coroutines.test.runTest +import org.junit.Test + +class AppMigration03Test { + @Test + fun `test migration`() = runTest { + val logsFileRemover = FakeLogFilesRemover() + val migration = AppMigration03(logsFileRemover) + + migration.migrate() + + logsFileRemover.performLambda.assertions().isCalledOnce() + } +} From 43321595a6c0bc0461900e59e3a7e1ae5ec4bd48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20Mart=C3=ADn?= Date: Mon, 13 May 2024 16:22:47 +0200 Subject: [PATCH 7/7] Make `AppMigration03` use `AppMigration01` in a composite way --- .../features/migration/impl/migrations/AppMigration01.kt | 2 +- .../features/migration/impl/migrations/AppMigration03.kt | 9 ++++++--- .../migration/impl/migrations/AppMigration03Test.kt | 2 +- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/migrations/AppMigration01.kt b/features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/migrations/AppMigration01.kt index 6dcecaca06b..01514c530e7 100644 --- a/features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/migrations/AppMigration01.kt +++ b/features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/migrations/AppMigration01.kt @@ -25,7 +25,7 @@ import javax.inject.Inject * Remove existing logs from the device to remove any leaks of sensitive data. */ @ContributesMultibinding(AppScope::class) -open class AppMigration01 @Inject constructor( +class AppMigration01 @Inject constructor( private val logFilesRemover: LogFilesRemover, ) : AppMigration { override val order: Int = 1 diff --git a/features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/migrations/AppMigration03.kt b/features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/migrations/AppMigration03.kt index 7314b35ded7..37eb59874ec 100644 --- a/features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/migrations/AppMigration03.kt +++ b/features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/migrations/AppMigration03.kt @@ -17,7 +17,6 @@ package io.element.android.features.migration.impl.migrations import com.squareup.anvil.annotations.ContributesMultibinding -import io.element.android.features.rageshake.api.logs.LogFilesRemover import io.element.android.libraries.di.AppScope import javax.inject.Inject @@ -26,7 +25,11 @@ import javax.inject.Inject */ @ContributesMultibinding(AppScope::class) class AppMigration03 @Inject constructor( - private val logFilesRemover: LogFilesRemover, -) : AppMigration01(logFilesRemover) { + private val migration01: AppMigration01, +) : AppMigration { override val order: Int = 3 + + override suspend fun migrate() { + migration01.migrate() + } } diff --git a/features/migration/impl/src/test/kotlin/io/element/android/features/migration/impl/migrations/AppMigration03Test.kt b/features/migration/impl/src/test/kotlin/io/element/android/features/migration/impl/migrations/AppMigration03Test.kt index ee64658fc63..c9251bfe767 100644 --- a/features/migration/impl/src/test/kotlin/io/element/android/features/migration/impl/migrations/AppMigration03Test.kt +++ b/features/migration/impl/src/test/kotlin/io/element/android/features/migration/impl/migrations/AppMigration03Test.kt @@ -24,7 +24,7 @@ class AppMigration03Test { @Test fun `test migration`() = runTest { val logsFileRemover = FakeLogFilesRemover() - val migration = AppMigration03(logsFileRemover) + val migration = AppMigration03(migration01 = AppMigration01(logsFileRemover)) migration.migrate()