From a3fd49499b7ebcdfbc1a7c9c645a64ac03100d99 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 4 Jun 2020 08:59:01 +0200 Subject: [PATCH 1/2] Hide left rooms in breadcrumbs (#766) --- CHANGES.md | 1 + .../main/java/im/vector/matrix/rx/RxSession.kt | 8 ++++---- .../android/api/session/room/RoomService.kt | 6 ++++-- .../internal/session/room/DefaultRoomService.kt | 16 +++++++++++----- .../room/breadcrumbs/BreadcrumbsViewModel.kt | 2 +- 5 files changed, 21 insertions(+), 12 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index cd6ffe9995..344f884908 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -8,6 +8,7 @@ Features ✨: Improvements 🙌: - New wording for notice when current user is the sender - Hide "X made no changes" event by default in timeline (#1430) + - Hide left rooms in breadcrumbs (#766) Bugfix 🐛: - Switch theme is not fully taken into account without restarting the app diff --git a/matrix-sdk-android-rx/src/main/java/im/vector/matrix/rx/RxSession.kt b/matrix-sdk-android-rx/src/main/java/im/vector/matrix/rx/RxSession.kt index d2d9eb4d5a..0e198e9679 100644 --- a/matrix-sdk-android-rx/src/main/java/im/vector/matrix/rx/RxSession.kt +++ b/matrix-sdk-android-rx/src/main/java/im/vector/matrix/rx/RxSession.kt @@ -29,6 +29,7 @@ import im.vector.matrix.android.api.session.room.model.RoomSummary import im.vector.matrix.android.api.session.room.model.create.CreateRoomParams import im.vector.matrix.android.api.session.sync.SyncState import im.vector.matrix.android.api.session.user.model.User +import im.vector.matrix.android.api.session.widgets.model.Widget import im.vector.matrix.android.api.util.JsonDict import im.vector.matrix.android.api.util.Optional import im.vector.matrix.android.api.util.toOptional @@ -36,7 +37,6 @@ import im.vector.matrix.android.internal.crypto.model.CryptoDeviceInfo import im.vector.matrix.android.internal.crypto.model.rest.DeviceInfo import im.vector.matrix.android.internal.crypto.store.PrivateKeysInfo import im.vector.matrix.android.internal.session.sync.model.accountdata.UserAccountDataEvent -import im.vector.matrix.android.api.session.widgets.model.Widget import io.reactivex.Observable import io.reactivex.Single @@ -56,10 +56,10 @@ class RxSession(private val session: Session) { } } - fun liveBreadcrumbs(): Observable> { - return session.getBreadcrumbsLive().asObservable() + fun liveBreadcrumbs(onlyJoinedRooms: Boolean): Observable> { + return session.getBreadcrumbsLive(onlyJoinedRooms).asObservable() .startWithCallable { - session.getBreadcrumbs() + session.getBreadcrumbs(onlyJoinedRooms) } } diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/RoomService.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/RoomService.kt index 93761dfd26..c4aeb1da9e 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/RoomService.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/RoomService.kt @@ -73,15 +73,17 @@ interface RoomService { /** * Get a snapshot list of Breadcrumbs + * @param onlyJoinedRooms set to true to keep only joined rooms, and filter out left rooms * @return the immutable list of [RoomSummary] */ - fun getBreadcrumbs(): List + fun getBreadcrumbs(onlyJoinedRooms: Boolean): List /** * Get a live list of Breadcrumbs + * @param onlyJoinedRooms set to true to keep only joined rooms, and filter out left rooms * @return the [LiveData] of [RoomSummary] */ - fun getBreadcrumbsLive(): LiveData> + fun getBreadcrumbsLive(onlyJoinedRooms: Boolean): LiveData> /** * Inform the Matrix SDK that a room is displayed. diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/DefaultRoomService.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/DefaultRoomService.kt index 84fc357160..dfcf6fae41 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/DefaultRoomService.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/DefaultRoomService.kt @@ -22,6 +22,7 @@ import im.vector.matrix.android.api.MatrixCallback import im.vector.matrix.android.api.session.room.Room import im.vector.matrix.android.api.session.room.RoomService import im.vector.matrix.android.api.session.room.RoomSummaryQueryParams +import im.vector.matrix.android.api.session.room.model.Membership import im.vector.matrix.android.api.session.room.model.RoomSummary import im.vector.matrix.android.api.session.room.model.VersioningState import im.vector.matrix.android.api.session.room.model.create.CreateRoomParams @@ -111,24 +112,29 @@ internal class DefaultRoomService @Inject constructor( return query } - override fun getBreadcrumbs(): List { + override fun getBreadcrumbs(onlyJoinedRooms: Boolean): List { return monarchy.fetchAllMappedSync( - { breadcrumbsQuery(it) }, + { breadcrumbsQuery(it, onlyJoinedRooms) }, { roomSummaryMapper.map(it) } ) } - override fun getBreadcrumbsLive(): LiveData> { + override fun getBreadcrumbsLive(onlyJoinedRooms: Boolean): LiveData> { return monarchy.findAllMappedWithChanges( - { breadcrumbsQuery(it) }, + { breadcrumbsQuery(it, onlyJoinedRooms) }, { roomSummaryMapper.map(it) } ) } - private fun breadcrumbsQuery(realm: Realm): RealmQuery { + private fun breadcrumbsQuery(realm: Realm, onlyJoinedRooms: Boolean): RealmQuery { return RoomSummaryEntity.where(realm) .isNotEmpty(RoomSummaryEntityFields.DISPLAY_NAME) .notEqualTo(RoomSummaryEntityFields.VERSIONING_STATE_STR, VersioningState.UPGRADED_ROOM_JOINED.name) + .apply { + if (onlyJoinedRooms) { + equalTo(RoomSummaryEntityFields.MEMBERSHIP_STR, Membership.JOIN.name) + } + } .greaterThan(RoomSummaryEntityFields.BREADCRUMBS_INDEX, RoomSummary.NOT_IN_BREADCRUMBS) .sort(RoomSummaryEntityFields.BREADCRUMBS_INDEX) } diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/breadcrumbs/BreadcrumbsViewModel.kt b/vector/src/main/java/im/vector/riotx/features/home/room/breadcrumbs/BreadcrumbsViewModel.kt index f8a1e302af..d0e51c5171 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/breadcrumbs/BreadcrumbsViewModel.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/breadcrumbs/BreadcrumbsViewModel.kt @@ -58,7 +58,7 @@ class BreadcrumbsViewModel @AssistedInject constructor(@Assisted initialState: B private fun observeBreadcrumbs() { session.rx() - .liveBreadcrumbs() + .liveBreadcrumbs(true) .observeOn(Schedulers.computation()) .execute { asyncBreadcrumbs -> copy(asyncBreadcrumbs = asyncBreadcrumbs) From 1ad77530aaf17a325d6bbae08197bfe6922d1b5f Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 4 Jun 2020 14:36:51 +0200 Subject: [PATCH 2/2] Use RoomSummaryQueryParams as per Ganfra's excellent suggestion --- .../java/im/vector/matrix/rx/RxSession.kt | 6 +++--- .../android/api/session/room/RoomService.kt | 8 ++++---- .../session/room/DefaultRoomService.kt | 20 ++++++------------- .../room/breadcrumbs/BreadcrumbsViewModel.kt | 8 +++++++- 4 files changed, 20 insertions(+), 22 deletions(-) diff --git a/matrix-sdk-android-rx/src/main/java/im/vector/matrix/rx/RxSession.kt b/matrix-sdk-android-rx/src/main/java/im/vector/matrix/rx/RxSession.kt index 0e198e9679..e8fef1361d 100644 --- a/matrix-sdk-android-rx/src/main/java/im/vector/matrix/rx/RxSession.kt +++ b/matrix-sdk-android-rx/src/main/java/im/vector/matrix/rx/RxSession.kt @@ -56,10 +56,10 @@ class RxSession(private val session: Session) { } } - fun liveBreadcrumbs(onlyJoinedRooms: Boolean): Observable> { - return session.getBreadcrumbsLive(onlyJoinedRooms).asObservable() + fun liveBreadcrumbs(queryParams: RoomSummaryQueryParams): Observable> { + return session.getBreadcrumbsLive(queryParams).asObservable() .startWithCallable { - session.getBreadcrumbs(onlyJoinedRooms) + session.getBreadcrumbs(queryParams) } } diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/RoomService.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/RoomService.kt index c4aeb1da9e..bc6c17a130 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/RoomService.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/session/room/RoomService.kt @@ -73,17 +73,17 @@ interface RoomService { /** * Get a snapshot list of Breadcrumbs - * @param onlyJoinedRooms set to true to keep only joined rooms, and filter out left rooms + * @param queryParams parameters to query the room summaries. It can be use to keep only joined rooms, for instance. * @return the immutable list of [RoomSummary] */ - fun getBreadcrumbs(onlyJoinedRooms: Boolean): List + fun getBreadcrumbs(queryParams: RoomSummaryQueryParams): List /** * Get a live list of Breadcrumbs - * @param onlyJoinedRooms set to true to keep only joined rooms, and filter out left rooms + * @param queryParams parameters to query the room summaries. It can be use to keep only joined rooms, for instance. * @return the [LiveData] of [RoomSummary] */ - fun getBreadcrumbsLive(onlyJoinedRooms: Boolean): LiveData> + fun getBreadcrumbsLive(queryParams: RoomSummaryQueryParams): LiveData> /** * Inform the Matrix SDK that a room is displayed. diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/DefaultRoomService.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/DefaultRoomService.kt index dfcf6fae41..8868ab4fe1 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/DefaultRoomService.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/room/DefaultRoomService.kt @@ -22,7 +22,6 @@ import im.vector.matrix.android.api.MatrixCallback import im.vector.matrix.android.api.session.room.Room import im.vector.matrix.android.api.session.room.RoomService import im.vector.matrix.android.api.session.room.RoomSummaryQueryParams -import im.vector.matrix.android.api.session.room.model.Membership import im.vector.matrix.android.api.session.room.model.RoomSummary import im.vector.matrix.android.api.session.room.model.VersioningState import im.vector.matrix.android.api.session.room.model.create.CreateRoomParams @@ -112,29 +111,22 @@ internal class DefaultRoomService @Inject constructor( return query } - override fun getBreadcrumbs(onlyJoinedRooms: Boolean): List { + override fun getBreadcrumbs(queryParams: RoomSummaryQueryParams): List { return monarchy.fetchAllMappedSync( - { breadcrumbsQuery(it, onlyJoinedRooms) }, + { breadcrumbsQuery(it, queryParams) }, { roomSummaryMapper.map(it) } ) } - override fun getBreadcrumbsLive(onlyJoinedRooms: Boolean): LiveData> { + override fun getBreadcrumbsLive(queryParams: RoomSummaryQueryParams): LiveData> { return monarchy.findAllMappedWithChanges( - { breadcrumbsQuery(it, onlyJoinedRooms) }, + { breadcrumbsQuery(it, queryParams) }, { roomSummaryMapper.map(it) } ) } - private fun breadcrumbsQuery(realm: Realm, onlyJoinedRooms: Boolean): RealmQuery { - return RoomSummaryEntity.where(realm) - .isNotEmpty(RoomSummaryEntityFields.DISPLAY_NAME) - .notEqualTo(RoomSummaryEntityFields.VERSIONING_STATE_STR, VersioningState.UPGRADED_ROOM_JOINED.name) - .apply { - if (onlyJoinedRooms) { - equalTo(RoomSummaryEntityFields.MEMBERSHIP_STR, Membership.JOIN.name) - } - } + private fun breadcrumbsQuery(realm: Realm, queryParams: RoomSummaryQueryParams): RealmQuery { + return roomSummariesQuery(realm, queryParams) .greaterThan(RoomSummaryEntityFields.BREADCRUMBS_INDEX, RoomSummary.NOT_IN_BREADCRUMBS) .sort(RoomSummaryEntityFields.BREADCRUMBS_INDEX) } diff --git a/vector/src/main/java/im/vector/riotx/features/home/room/breadcrumbs/BreadcrumbsViewModel.kt b/vector/src/main/java/im/vector/riotx/features/home/room/breadcrumbs/BreadcrumbsViewModel.kt index d0e51c5171..2e847176ff 100644 --- a/vector/src/main/java/im/vector/riotx/features/home/room/breadcrumbs/BreadcrumbsViewModel.kt +++ b/vector/src/main/java/im/vector/riotx/features/home/room/breadcrumbs/BreadcrumbsViewModel.kt @@ -21,7 +21,10 @@ import com.airbnb.mvrx.MvRxViewModelFactory import com.airbnb.mvrx.ViewModelContext import com.squareup.inject.assisted.Assisted import com.squareup.inject.assisted.AssistedInject +import im.vector.matrix.android.api.query.QueryStringValue import im.vector.matrix.android.api.session.Session +import im.vector.matrix.android.api.session.room.model.Membership +import im.vector.matrix.android.api.session.room.roomSummaryQueryParams import im.vector.matrix.rx.rx import im.vector.riotx.core.platform.EmptyAction import im.vector.riotx.core.platform.EmptyViewEvents @@ -58,7 +61,10 @@ class BreadcrumbsViewModel @AssistedInject constructor(@Assisted initialState: B private fun observeBreadcrumbs() { session.rx() - .liveBreadcrumbs(true) + .liveBreadcrumbs(roomSummaryQueryParams { + displayName = QueryStringValue.NoCondition + memberships = listOf(Membership.JOIN) + }) .observeOn(Schedulers.computation()) .execute { asyncBreadcrumbs -> copy(asyncBreadcrumbs = asyncBreadcrumbs)