From cd06ba656aa53cc1a4bab7284d6db4563904a528 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 25 Apr 2022 16:07:19 +0200 Subject: [PATCH 1/9] Ensure `getRootSpaceSummaries()` is not called on the main thread. --- .../android/sdk/session/space/SpaceHierarchyTest.kt | 4 +++- .../android/sdk/api/session/space/SpaceService.kt | 5 ++++- .../sdk/internal/session/space/DefaultSpaceService.kt | 11 ++++++++--- .../vector/app/features/spaces/SpaceListViewModel.kt | 2 +- 4 files changed, 16 insertions(+), 6 deletions(-) diff --git a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/session/space/SpaceHierarchyTest.kt b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/session/space/SpaceHierarchyTest.kt index 20faa81bb6..50e4a6feb6 100644 --- a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/session/space/SpaceHierarchyTest.kt +++ b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/session/space/SpaceHierarchyTest.kt @@ -475,7 +475,9 @@ class SpaceHierarchyTest : InstrumentedTest { // + C // + c1, c2 - val rootSpaces = session.spaceService().getRootSpaceSummaries() + val rootSpaces = commonTestHelper.runBlockingTest { + session.spaceService().getRootSpaceSummaries() + } assertEquals("Unexpected number of root spaces ${rootSpaces.map { it.name }}", 2, rootSpaces.size) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/space/SpaceService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/space/SpaceService.kt index f4460b7659..7826764067 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/space/SpaceService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/space/SpaceService.kt @@ -106,5 +106,8 @@ interface SpaceService { suspend fun removeSpaceParent(childRoomId: String, parentSpaceId: String) - fun getRootSpaceSummaries(): List + /** + * Get the root spaces, i.e. all the spaces which do not have a parent space. + */ + suspend fun getRootSpaceSummaries(): List } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/space/DefaultSpaceService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/space/DefaultSpaceService.kt index 05cff7dd89..355039b22c 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/space/DefaultSpaceService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/space/DefaultSpaceService.kt @@ -18,6 +18,8 @@ package org.matrix.android.sdk.internal.session.space import android.net.Uri import androidx.lifecycle.LiveData +import kotlinx.coroutines.withContext +import org.matrix.android.sdk.api.MatrixCoroutineDispatchers import org.matrix.android.sdk.api.query.QueryStringValue import org.matrix.android.sdk.api.session.events.model.Event import org.matrix.android.sdk.api.session.events.model.EventType @@ -64,7 +66,8 @@ internal class DefaultSpaceService @Inject constructor( private val stateEventDataSource: StateEventDataSource, private val peekSpaceTask: PeekSpaceTask, private val resolveSpaceInfoTask: ResolveSpaceInfoTask, - private val leaveRoomTask: LeaveRoomTask + private val leaveRoomTask: LeaveRoomTask, + private val coroutineDispatchers: MatrixCoroutineDispatchers, ) : SpaceService { override suspend fun createSpace(params: CreateSpaceParams): String { @@ -105,8 +108,10 @@ internal class DefaultSpaceService @Inject constructor( return roomSummaryDataSource.getSpaceSummaries(spaceSummaryQueryParams, sortOrder) } - override fun getRootSpaceSummaries(): List { - return roomSummaryDataSource.getRootSpaceSummaries() + override suspend fun getRootSpaceSummaries(): List { + return withContext(coroutineDispatchers.io) { + roomSummaryDataSource.getRootSpaceSummaries() + } } override suspend fun peekSpace(spaceId: String): SpacePeekResult { diff --git a/vector/src/main/java/im/vector/app/features/spaces/SpaceListViewModel.kt b/vector/src/main/java/im/vector/app/features/spaces/SpaceListViewModel.kt index a239e939ea..add9fb8213 100644 --- a/vector/src/main/java/im/vector/app/features/spaces/SpaceListViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/spaces/SpaceListViewModel.kt @@ -296,7 +296,7 @@ class SpaceListViewModel @AssistedInject constructor(@Assisted initialState: Spa communityGroups } .execute { async -> - val rootSpaces = session.spaceService().getRootSpaceSummaries() + val rootSpaces = async.invoke().orEmpty().filter { it.flattenParentIds.isEmpty() } val orders = rootSpaces.map { it.roomId to session.getRoom(it.roomId) ?.getAccountDataEvent(RoomAccountDataTypes.EVENT_TYPE_SPACE_ORDER) From fb736281f0c65085d61d6aaa66ce1132948e93b2 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 25 Apr 2022 17:49:50 +0200 Subject: [PATCH 2/9] Rename val --- .../java/im/vector/app/features/spaces/SpaceListViewModel.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/vector/src/main/java/im/vector/app/features/spaces/SpaceListViewModel.kt b/vector/src/main/java/im/vector/app/features/spaces/SpaceListViewModel.kt index add9fb8213..376128d993 100644 --- a/vector/src/main/java/im/vector/app/features/spaces/SpaceListViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/spaces/SpaceListViewModel.kt @@ -292,8 +292,8 @@ class SpaceListViewModel @AssistedInject constructor(@Assisted initialState: Spa .accountDataService() .getLiveRoomAccountDataEvents(setOf(RoomAccountDataTypes.EVENT_TYPE_SPACE_ORDER)) .asFlow() - ) { _, communityGroups, _ -> - communityGroups + ) { _, spaces, _ -> + spaces } .execute { async -> val rootSpaces = async.invoke().orEmpty().filter { it.flattenParentIds.isEmpty() } From d2eca739f47ae4333b6ff063a8d94ab106555827 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 25 Apr 2022 17:55:31 +0200 Subject: [PATCH 3/9] Apply suggestion --- .../java/im/vector/app/features/spaces/SpaceListViewModel.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/vector/src/main/java/im/vector/app/features/spaces/SpaceListViewModel.kt b/vector/src/main/java/im/vector/app/features/spaces/SpaceListViewModel.kt index 376128d993..709e8e62b5 100644 --- a/vector/src/main/java/im/vector/app/features/spaces/SpaceListViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/spaces/SpaceListViewModel.kt @@ -297,12 +297,12 @@ class SpaceListViewModel @AssistedInject constructor(@Assisted initialState: Spa } .execute { async -> val rootSpaces = async.invoke().orEmpty().filter { it.flattenParentIds.isEmpty() } - val orders = rootSpaces.map { + val orders = rootSpaces.associate { it.roomId to session.getRoom(it.roomId) ?.getAccountDataEvent(RoomAccountDataTypes.EVENT_TYPE_SPACE_ORDER) ?.content.toModel() ?.safeOrder() - }.toMap() + } copy( asyncSpaces = async, rootSpacesOrdered = rootSpaces.sortedWith(TopLevelSpaceComparator(orders)), From abdfd9deee876bb6d751d662795630dd88c5ea34 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 25 Apr 2022 18:29:49 +0200 Subject: [PATCH 4/9] Format --- .../java/im/vector/app/features/spaces/SpaceListViewModel.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/vector/src/main/java/im/vector/app/features/spaces/SpaceListViewModel.kt b/vector/src/main/java/im/vector/app/features/spaces/SpaceListViewModel.kt index 709e8e62b5..25bf399c4b 100644 --- a/vector/src/main/java/im/vector/app/features/spaces/SpaceListViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/spaces/SpaceListViewModel.kt @@ -212,7 +212,8 @@ class SpaceListViewModel @AssistedInject constructor(@Assisted initialState: Spa } session.coroutineScope.launch { orderCommands.forEach { - session.getRoom(it.spaceId)?.updateAccountData(RoomAccountDataTypes.EVENT_TYPE_SPACE_ORDER, + session.getRoom(it.spaceId)?.updateAccountData( + RoomAccountDataTypes.EVENT_TYPE_SPACE_ORDER, SpaceOrderContent(order = it.order).toContent() ) } From c54261952533beccf8a6134eda305f3b05f2eec3 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 25 Apr 2022 18:31:30 +0200 Subject: [PATCH 5/9] We do not need to observe the user here --- .../app/features/spaces/SpaceListViewModel.kt | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/vector/src/main/java/im/vector/app/features/spaces/SpaceListViewModel.kt b/vector/src/main/java/im/vector/app/features/spaces/SpaceListViewModel.kt index 25bf399c4b..4bf62644c2 100644 --- a/vector/src/main/java/im/vector/app/features/spaces/SpaceListViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/spaces/SpaceListViewModel.kt @@ -40,7 +40,6 @@ import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.launchIn -import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.sample import kotlinx.coroutines.launch @@ -279,21 +278,13 @@ class SpaceListViewModel @AssistedInject constructor(@Assisted initialState: Spa displayName = QueryStringValue.IsNotEmpty } - val flowSession = session.flow() - combine( - flowSession - .liveUser(session.myUserId) - .map { - it.getOrNull() - }, - flowSession + session.flow() .liveSpaceSummaries(params), - session - .accountDataService() + session.accountDataService() .getLiveRoomAccountDataEvents(setOf(RoomAccountDataTypes.EVENT_TYPE_SPACE_ORDER)) .asFlow() - ) { _, spaces, _ -> + ) { spaces, _ -> spaces } .execute { async -> From b2f9d6778a617d7c1cea3f6260a911aea11dde35 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 26 Apr 2022 11:29:40 +0200 Subject: [PATCH 6/9] Version hotfix 1.4.13 --- matrix-sdk-android/build.gradle | 2 +- vector/build.gradle | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/matrix-sdk-android/build.gradle b/matrix-sdk-android/build.gradle index 0cffa4148e..816b9716bd 100644 --- a/matrix-sdk-android/build.gradle +++ b/matrix-sdk-android/build.gradle @@ -32,7 +32,7 @@ android { // that the app's state is completely cleared between tests. testInstrumentationRunnerArguments clearPackageData: 'true' - buildConfigField "String", "SDK_VERSION", "\"1.4.12\"" + buildConfigField "String", "SDK_VERSION", "\"1.4.13\"" buildConfigField "String", "GIT_SDK_REVISION", "\"${gitRevision()}\"" buildConfigField "String", "GIT_SDK_REVISION_UNIX_DATE", "\"${gitRevisionUnixDate()}\"" diff --git a/vector/build.gradle b/vector/build.gradle index c7950da28e..0104f71f3b 100644 --- a/vector/build.gradle +++ b/vector/build.gradle @@ -18,7 +18,7 @@ ext.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. -ext.versionPatch = 12 +ext.versionPatch = 13 static def getGitTimestamp() { def cmd = 'git show -s --format=%ct' From da656ac47001faf65047b619578de60031f894db Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 26 Apr 2022 11:30:53 +0200 Subject: [PATCH 7/9] Changelog --- changelog.d/5835.bugfix | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/5835.bugfix diff --git a/changelog.d/5835.bugfix b/changelog.d/5835.bugfix new file mode 100644 index 0000000000..9c450fb496 --- /dev/null +++ b/changelog.d/5835.bugfix @@ -0,0 +1 @@ +Fix UI freeze observed after each incremental sync From ebcab189f26aa9ff70c7ca8825be926f4586f45b Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 26 Apr 2022 11:31:51 +0200 Subject: [PATCH 8/9] towncrier --- CHANGES.md | 8 ++++++++ changelog.d/5835.bugfix | 1 - 2 files changed, 8 insertions(+), 1 deletion(-) delete mode 100644 changelog.d/5835.bugfix diff --git a/CHANGES.md b/CHANGES.md index 4728994d77..f952ec952a 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,3 +1,11 @@ +Changes in Element 1.4.13 (2022-04-26) +====================================== + +Bugfixes 🐛 +---------- + - Fix UI freeze observed after each incremental sync ([#5835](https://github.com/vector-im/element-android/issues/5835)) + + Changes in Element v1.4.12 (2022-04-20) ======================================= diff --git a/changelog.d/5835.bugfix b/changelog.d/5835.bugfix deleted file mode 100644 index 9c450fb496..0000000000 --- a/changelog.d/5835.bugfix +++ /dev/null @@ -1 +0,0 @@ -Fix UI freeze observed after each incremental sync From 6b5822e3d5abe643a7e42798e47bfd829e5341a1 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 26 Apr 2022 11:35:43 +0200 Subject: [PATCH 9/9] fastlane (same content than for 1.4.12) --- fastlane/metadata/android/en-US/changelogs/40104130.txt | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 fastlane/metadata/android/en-US/changelogs/40104130.txt diff --git a/fastlane/metadata/android/en-US/changelogs/40104130.txt b/fastlane/metadata/android/en-US/changelogs/40104130.txt new file mode 100644 index 0000000000..ea188c101c --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/40104130.txt @@ -0,0 +1,2 @@ +Main changes in this version: Allows users to appear offline and adds an audio player for audio attachments +Full changelog: https://github.com/vector-im/element-android/releases