mirror of
https://github.com/element-hq/element-android
synced 2024-11-27 20:06:51 +03:00
RoomList: more fixes on count
This commit is contained in:
parent
87438085c6
commit
04b136e3e4
6 changed files with 179 additions and 176 deletions
|
@ -18,7 +18,6 @@ package org.matrix.android.sdk.api.session.room
|
||||||
|
|
||||||
import androidx.lifecycle.LiveData
|
import androidx.lifecycle.LiveData
|
||||||
import androidx.paging.PagedList
|
import androidx.paging.PagedList
|
||||||
import kotlinx.coroutines.flow.Flow
|
|
||||||
import org.matrix.android.sdk.api.session.events.model.Event
|
import org.matrix.android.sdk.api.session.events.model.Event
|
||||||
import org.matrix.android.sdk.api.session.room.members.ChangeMembershipState
|
import org.matrix.android.sdk.api.session.room.members.ChangeMembershipState
|
||||||
import org.matrix.android.sdk.api.session.room.model.Membership
|
import org.matrix.android.sdk.api.session.room.model.Membership
|
||||||
|
@ -218,7 +217,8 @@ interface RoomService {
|
||||||
sortOrder: RoomSortOrder = RoomSortOrder.ACTIVITY): UpdatableLivePageResult
|
sortOrder: RoomSortOrder = RoomSortOrder.ACTIVITY): UpdatableLivePageResult
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieve a LiveData on the number of rooms.
|
* Return a LiveData on the number of rooms
|
||||||
|
* @param queryParams parameters to query the room summaries. It can be use to keep only joined rooms, for instance.
|
||||||
*/
|
*/
|
||||||
fun getRoomCountLive(queryParams: RoomSummaryQueryParams): LiveData<Int>
|
fun getRoomCountLive(queryParams: RoomSummaryQueryParams): LiveData<Int>
|
||||||
|
|
||||||
|
|
|
@ -20,7 +20,6 @@ import androidx.lifecycle.LiveData
|
||||||
import androidx.lifecycle.Transformations
|
import androidx.lifecycle.Transformations
|
||||||
import androidx.paging.PagedList
|
import androidx.paging.PagedList
|
||||||
import com.zhuinden.monarchy.Monarchy
|
import com.zhuinden.monarchy.Monarchy
|
||||||
import kotlinx.coroutines.flow.Flow
|
|
||||||
import org.matrix.android.sdk.api.session.events.model.Event
|
import org.matrix.android.sdk.api.session.events.model.Event
|
||||||
import org.matrix.android.sdk.api.session.room.Room
|
import org.matrix.android.sdk.api.session.room.Room
|
||||||
import org.matrix.android.sdk.api.session.room.RoomService
|
import org.matrix.android.sdk.api.session.room.RoomService
|
||||||
|
|
|
@ -241,7 +241,7 @@ internal class RoomSummaryDataSource @Inject constructor(
|
||||||
roomSummariesQuery(it, queryParams)
|
roomSummariesQuery(it, queryParams)
|
||||||
}
|
}
|
||||||
return Transformations.map(liveRooms) {
|
return Transformations.map(liveRooms) {
|
||||||
it.realmResults.count()
|
it.realmResults.where().count().toInt()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -53,6 +53,7 @@ import im.vector.app.features.home.room.list.actions.RoomListQuickActionsSharedA
|
||||||
import im.vector.app.features.home.room.list.widget.NotifsFabMenuView
|
import im.vector.app.features.home.room.list.widget.NotifsFabMenuView
|
||||||
import im.vector.app.features.notifications.NotificationDrawerManager
|
import im.vector.app.features.notifications.NotificationDrawerManager
|
||||||
import kotlinx.coroutines.flow.collect
|
import kotlinx.coroutines.flow.collect
|
||||||
|
import kotlinx.coroutines.flow.filter
|
||||||
import kotlinx.coroutines.flow.launchIn
|
import kotlinx.coroutines.flow.launchIn
|
||||||
import kotlinx.coroutines.flow.onEach
|
import kotlinx.coroutines.flow.onEach
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
|
@ -405,6 +406,7 @@ class RoomListFragment @Inject constructor(
|
||||||
lifecycleScope.launch {
|
lifecycleScope.launch {
|
||||||
section.itemCount
|
section.itemCount
|
||||||
.flowWithLifecycle(lifecycle, Lifecycle.State.STARTED)
|
.flowWithLifecycle(lifecycle, Lifecycle.State.STARTED)
|
||||||
|
.filter { it > 0 }
|
||||||
.collect { count ->
|
.collect { count ->
|
||||||
sectionAdapter.updateSection {
|
sectionAdapter.updateSection {
|
||||||
it.copy(itemCount = count)
|
it.copy(itemCount = count)
|
||||||
|
|
|
@ -70,8 +70,7 @@ class RoomListSectionBuilderGroup(
|
||||||
},
|
},
|
||||||
{ qpm ->
|
{ qpm ->
|
||||||
val name = stringProvider.getString(R.string.bottom_action_rooms)
|
val name = stringProvider.getString(R.string.bottom_action_rooms)
|
||||||
session.getFilteredPagedRoomSummariesLive(qpm)
|
val updatableFilterLivePageResult = session.getFilteredPagedRoomSummariesLive(qpm)
|
||||||
.let { updatableFilterLivePageResult ->
|
|
||||||
onUpdatable(updatableFilterLivePageResult)
|
onUpdatable(updatableFilterLivePageResult)
|
||||||
|
|
||||||
val itemCountFlow = updatableFilterLivePageResult.livePagedList.asFlow()
|
val itemCountFlow = updatableFilterLivePageResult.livePagedList.asFlow()
|
||||||
|
@ -86,7 +85,6 @@ class RoomListSectionBuilderGroup(
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
RoomListDisplayMode.NOTIFICATIONS -> {
|
RoomListDisplayMode.NOTIFICATIONS -> {
|
||||||
|
@ -252,9 +250,7 @@ class RoomListSectionBuilderGroup(
|
||||||
@StringRes nameRes: Int,
|
@StringRes nameRes: Int,
|
||||||
notifyOfLocalEcho: Boolean = false,
|
notifyOfLocalEcho: Boolean = false,
|
||||||
query: (RoomSummaryQueryParams.Builder) -> Unit) {
|
query: (RoomSummaryQueryParams.Builder) -> Unit) {
|
||||||
withQueryParams(
|
withQueryParams(query) { roomQueryParams ->
|
||||||
{ query.invoke(it) },
|
|
||||||
{ roomQueryParams ->
|
|
||||||
val name = stringProvider.getString(nameRes)
|
val name = stringProvider.getString(nameRes)
|
||||||
session.getFilteredPagedRoomSummariesLive(roomQueryParams)
|
session.getFilteredPagedRoomSummariesLive(roomQueryParams)
|
||||||
.also {
|
.also {
|
||||||
|
@ -281,8 +277,6 @@ class RoomListSectionBuilderGroup(
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun withQueryParams(builder: (RoomSummaryQueryParams.Builder) -> Unit, block: (RoomSummaryQueryParams) -> Unit) {
|
private fun withQueryParams(builder: (RoomSummaryQueryParams.Builder) -> Unit, block: (RoomSummaryQueryParams) -> Unit) {
|
||||||
|
|
|
@ -32,6 +32,7 @@ import im.vector.app.features.invite.showInvites
|
||||||
import im.vector.app.space
|
import im.vector.app.space
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
|
import kotlinx.coroutines.flow.MutableStateFlow
|
||||||
import kotlinx.coroutines.flow.combine
|
import kotlinx.coroutines.flow.combine
|
||||||
import kotlinx.coroutines.flow.distinctUntilChanged
|
import kotlinx.coroutines.flow.distinctUntilChanged
|
||||||
import kotlinx.coroutines.flow.flatMapLatest
|
import kotlinx.coroutines.flow.flatMapLatest
|
||||||
|
@ -40,6 +41,7 @@ import kotlinx.coroutines.flow.flowOn
|
||||||
import kotlinx.coroutines.flow.launchIn
|
import kotlinx.coroutines.flow.launchIn
|
||||||
import kotlinx.coroutines.flow.map
|
import kotlinx.coroutines.flow.map
|
||||||
import kotlinx.coroutines.flow.onEach
|
import kotlinx.coroutines.flow.onEach
|
||||||
|
import kotlinx.coroutines.flow.update
|
||||||
import org.matrix.android.sdk.api.extensions.tryOrNull
|
import org.matrix.android.sdk.api.extensions.tryOrNull
|
||||||
import org.matrix.android.sdk.api.query.ActiveSpaceFilter
|
import org.matrix.android.sdk.api.query.ActiveSpaceFilter
|
||||||
import org.matrix.android.sdk.api.query.RoomCategoryFilter
|
import org.matrix.android.sdk.api.query.RoomCategoryFilter
|
||||||
|
@ -83,64 +85,10 @@ class RoomListSectionBuilderSpace(
|
||||||
}
|
}
|
||||||
RoomListDisplayMode.FILTERED -> {
|
RoomListDisplayMode.FILTERED -> {
|
||||||
// Used when searching for rooms
|
// Used when searching for rooms
|
||||||
withQueryParams(
|
buildFilteredSection(sections)
|
||||||
{
|
|
||||||
it.memberships = Membership.activeMemberships()
|
|
||||||
},
|
|
||||||
{ qpm ->
|
|
||||||
val name = stringProvider.getString(R.string.bottom_action_rooms)
|
|
||||||
session.getFilteredPagedRoomSummariesLive(qpm)
|
|
||||||
.let { updatableFilterLivePageResult ->
|
|
||||||
onUpdatable(updatableFilterLivePageResult)
|
|
||||||
|
|
||||||
val itemCountFlow = updatableFilterLivePageResult.livePagedList.asFlow()
|
|
||||||
.flatMapLatest { session.getRoomCountLive(updatableFilterLivePageResult.queryParams).asFlow() }
|
|
||||||
.distinctUntilChanged()
|
|
||||||
|
|
||||||
sections.add(
|
|
||||||
RoomsSection(
|
|
||||||
sectionName = name,
|
|
||||||
livePages = updatableFilterLivePageResult.livePagedList,
|
|
||||||
itemCount = itemCountFlow
|
|
||||||
)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
RoomListDisplayMode.NOTIFICATIONS -> {
|
RoomListDisplayMode.NOTIFICATIONS -> {
|
||||||
if (autoAcceptInvites.showInvites()) {
|
buildNotificationsSection(sections, activeSpaceAwareQueries)
|
||||||
addSection(
|
|
||||||
sections = sections,
|
|
||||||
activeSpaceUpdaters = activeSpaceAwareQueries,
|
|
||||||
nameRes = R.string.invitations_header,
|
|
||||||
notifyOfLocalEcho = true,
|
|
||||||
spaceFilterStrategy = if (onlyOrphansInHome) {
|
|
||||||
RoomListViewModel.SpaceFilterStrategy.ORPHANS_IF_SPACE_NULL
|
|
||||||
} else {
|
|
||||||
RoomListViewModel.SpaceFilterStrategy.ALL_IF_SPACE_NULL
|
|
||||||
},
|
|
||||||
countRoomAsNotif = true
|
|
||||||
) {
|
|
||||||
it.memberships = listOf(Membership.INVITE)
|
|
||||||
it.roomCategoryFilter = RoomCategoryFilter.ALL
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
addSection(
|
|
||||||
sections = sections,
|
|
||||||
activeSpaceUpdaters = activeSpaceAwareQueries,
|
|
||||||
nameRes = R.string.bottom_action_rooms,
|
|
||||||
notifyOfLocalEcho = false,
|
|
||||||
spaceFilterStrategy = if (onlyOrphansInHome) {
|
|
||||||
RoomListViewModel.SpaceFilterStrategy.ORPHANS_IF_SPACE_NULL
|
|
||||||
} else {
|
|
||||||
RoomListViewModel.SpaceFilterStrategy.ALL_IF_SPACE_NULL
|
|
||||||
}
|
|
||||||
) {
|
|
||||||
it.memberships = listOf(Membership.JOIN)
|
|
||||||
it.roomCategoryFilter = RoomCategoryFilter.ONLY_WITH_NOTIFICATIONS
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -332,6 +280,67 @@ class RoomListSectionBuilderSpace(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun buildNotificationsSection(sections: MutableList<RoomsSection>, activeSpaceAwareQueries: MutableList<RoomListViewModel.ActiveSpaceQueryUpdater>) {
|
||||||
|
if (autoAcceptInvites.showInvites()) {
|
||||||
|
addSection(
|
||||||
|
sections = sections,
|
||||||
|
activeSpaceUpdaters = activeSpaceAwareQueries,
|
||||||
|
nameRes = R.string.invitations_header,
|
||||||
|
notifyOfLocalEcho = true,
|
||||||
|
spaceFilterStrategy = if (onlyOrphansInHome) {
|
||||||
|
RoomListViewModel.SpaceFilterStrategy.ORPHANS_IF_SPACE_NULL
|
||||||
|
} else {
|
||||||
|
RoomListViewModel.SpaceFilterStrategy.ALL_IF_SPACE_NULL
|
||||||
|
},
|
||||||
|
countRoomAsNotif = true
|
||||||
|
) {
|
||||||
|
it.memberships = listOf(Membership.INVITE)
|
||||||
|
it.roomCategoryFilter = RoomCategoryFilter.ALL
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
addSection(
|
||||||
|
sections = sections,
|
||||||
|
activeSpaceUpdaters = activeSpaceAwareQueries,
|
||||||
|
nameRes = R.string.bottom_action_rooms,
|
||||||
|
notifyOfLocalEcho = false,
|
||||||
|
spaceFilterStrategy = if (onlyOrphansInHome) {
|
||||||
|
RoomListViewModel.SpaceFilterStrategy.ORPHANS_IF_SPACE_NULL
|
||||||
|
} else {
|
||||||
|
RoomListViewModel.SpaceFilterStrategy.ALL_IF_SPACE_NULL
|
||||||
|
}
|
||||||
|
) {
|
||||||
|
it.memberships = listOf(Membership.JOIN)
|
||||||
|
it.roomCategoryFilter = RoomCategoryFilter.ONLY_WITH_NOTIFICATIONS
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun buildFilteredSection(sections: MutableList<RoomsSection>) {
|
||||||
|
// Used when searching for rooms
|
||||||
|
withQueryParams(
|
||||||
|
{
|
||||||
|
it.memberships = Membership.activeMemberships()
|
||||||
|
},
|
||||||
|
{ qpm ->
|
||||||
|
val name = stringProvider.getString(R.string.bottom_action_rooms)
|
||||||
|
val updatableFilterLivePageResult = session.getFilteredPagedRoomSummariesLive(qpm)
|
||||||
|
onUpdatable(updatableFilterLivePageResult)
|
||||||
|
|
||||||
|
val itemCountFlow = updatableFilterLivePageResult.livePagedList.asFlow()
|
||||||
|
.flatMapLatest { session.getRoomCountLive(updatableFilterLivePageResult.queryParams).asFlow() }
|
||||||
|
.distinctUntilChanged()
|
||||||
|
|
||||||
|
sections.add(
|
||||||
|
RoomsSection(
|
||||||
|
sectionName = name,
|
||||||
|
livePages = updatableFilterLivePageResult.livePagedList,
|
||||||
|
itemCount = itemCountFlow
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
private fun addSection(sections: MutableList<RoomsSection>,
|
private fun addSection(sections: MutableList<RoomsSection>,
|
||||||
activeSpaceUpdaters: MutableList<RoomListViewModel.ActiveSpaceQueryUpdater>,
|
activeSpaceUpdaters: MutableList<RoomListViewModel.ActiveSpaceQueryUpdater>,
|
||||||
@StringRes nameRes: Int,
|
@StringRes nameRes: Int,
|
||||||
|
@ -339,21 +348,29 @@ class RoomListSectionBuilderSpace(
|
||||||
spaceFilterStrategy: RoomListViewModel.SpaceFilterStrategy = RoomListViewModel.SpaceFilterStrategy.NONE,
|
spaceFilterStrategy: RoomListViewModel.SpaceFilterStrategy = RoomListViewModel.SpaceFilterStrategy.NONE,
|
||||||
countRoomAsNotif: Boolean = false,
|
countRoomAsNotif: Boolean = false,
|
||||||
query: (RoomSummaryQueryParams.Builder) -> Unit) {
|
query: (RoomSummaryQueryParams.Builder) -> Unit) {
|
||||||
withQueryParams(
|
withQueryParams(query) { roomQueryParams ->
|
||||||
{ query.invoke(it) },
|
val updatedQueryParams = roomQueryParams.process(spaceFilterStrategy, appStateHandler.safeActiveSpaceId())
|
||||||
{ roomQueryParams ->
|
val liveQueryParams = MutableStateFlow(updatedQueryParams)
|
||||||
|
val itemCountFlow = liveQueryParams
|
||||||
|
.flatMapLatest {
|
||||||
|
session.getRoomCountLive(it).asFlow()
|
||||||
|
}
|
||||||
|
.flowOn(Dispatchers.Main)
|
||||||
|
.distinctUntilChanged()
|
||||||
|
|
||||||
val name = stringProvider.getString(nameRes)
|
val name = stringProvider.getString(nameRes)
|
||||||
session.getFilteredPagedRoomSummariesLive(
|
val filteredPagedRoomSummariesLive = session.getFilteredPagedRoomSummariesLive(
|
||||||
roomQueryParams.process(spaceFilterStrategy, appStateHandler.safeActiveSpaceId()),
|
roomQueryParams.process(spaceFilterStrategy, appStateHandler.safeActiveSpaceId()),
|
||||||
pagedListConfig
|
pagedListConfig
|
||||||
).also {
|
)
|
||||||
when (spaceFilterStrategy) {
|
when (spaceFilterStrategy) {
|
||||||
RoomListViewModel.SpaceFilterStrategy.ORPHANS_IF_SPACE_NULL -> {
|
RoomListViewModel.SpaceFilterStrategy.ORPHANS_IF_SPACE_NULL -> {
|
||||||
activeSpaceUpdaters.add(object : RoomListViewModel.ActiveSpaceQueryUpdater {
|
activeSpaceUpdaters.add(object : RoomListViewModel.ActiveSpaceQueryUpdater {
|
||||||
override fun updateForSpaceId(roomId: String?) {
|
override fun updateForSpaceId(roomId: String?) {
|
||||||
it.queryParams = roomQueryParams.copy(
|
filteredPagedRoomSummariesLive.queryParams = roomQueryParams.copy(
|
||||||
activeSpaceFilter = ActiveSpaceFilter.ActiveSpace(roomId)
|
activeSpaceFilter = ActiveSpaceFilter.ActiveSpace(roomId)
|
||||||
)
|
)
|
||||||
|
liveQueryParams.update { filteredPagedRoomSummariesLive.queryParams }
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -361,14 +378,15 @@ class RoomListSectionBuilderSpace(
|
||||||
activeSpaceUpdaters.add(object : RoomListViewModel.ActiveSpaceQueryUpdater {
|
activeSpaceUpdaters.add(object : RoomListViewModel.ActiveSpaceQueryUpdater {
|
||||||
override fun updateForSpaceId(roomId: String?) {
|
override fun updateForSpaceId(roomId: String?) {
|
||||||
if (roomId != null) {
|
if (roomId != null) {
|
||||||
it.queryParams = roomQueryParams.copy(
|
filteredPagedRoomSummariesLive.queryParams = roomQueryParams.copy(
|
||||||
activeSpaceFilter = ActiveSpaceFilter.ActiveSpace(roomId)
|
activeSpaceFilter = ActiveSpaceFilter.ActiveSpace(roomId)
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
it.queryParams = roomQueryParams.copy(
|
filteredPagedRoomSummariesLive.queryParams = roomQueryParams.copy(
|
||||||
activeSpaceFilter = ActiveSpaceFilter.None
|
activeSpaceFilter = ActiveSpaceFilter.None
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
liveQueryParams.update { filteredPagedRoomSummariesLive.queryParams }
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -376,8 +394,8 @@ class RoomListSectionBuilderSpace(
|
||||||
// we ignore current space for this one
|
// we ignore current space for this one
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}.livePagedList
|
|
||||||
.let { livePagedList ->
|
val livePagedList = filteredPagedRoomSummariesLive.livePagedList
|
||||||
// use it also as a source to update count
|
// use it also as a source to update count
|
||||||
livePagedList.asFlow()
|
livePagedList.asFlow()
|
||||||
.onEach {
|
.onEach {
|
||||||
|
@ -397,13 +415,6 @@ class RoomListSectionBuilderSpace(
|
||||||
.flowOn(Dispatchers.Default)
|
.flowOn(Dispatchers.Default)
|
||||||
.launchIn(viewModelScope)
|
.launchIn(viewModelScope)
|
||||||
|
|
||||||
val itemCountFlow = livePagedList.asFlow()
|
|
||||||
.flatMapLatest {
|
|
||||||
val queryParams = roomQueryParams.process(spaceFilterStrategy, appStateHandler.safeActiveSpaceId())
|
|
||||||
session.getRoomCountLive(queryParams).asFlow()
|
|
||||||
}
|
|
||||||
.distinctUntilChanged()
|
|
||||||
|
|
||||||
sections.add(
|
sections.add(
|
||||||
RoomsSection(
|
RoomsSection(
|
||||||
sectionName = name,
|
sectionName = name,
|
||||||
|
@ -415,9 +426,6 @@ class RoomListSectionBuilderSpace(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun withQueryParams(builder: (RoomSummaryQueryParams.Builder) -> Unit, block: (RoomSummaryQueryParams) -> Unit) {
|
private fun withQueryParams(builder: (RoomSummaryQueryParams.Builder) -> Unit, block: (RoomSummaryQueryParams) -> Unit) {
|
||||||
RoomSummaryQueryParams.Builder()
|
RoomSummaryQueryParams.Builder()
|
||||||
.apply { builder.invoke(this) }
|
.apply { builder.invoke(this) }
|
||||||
|
|
Loading…
Reference in a new issue