mirror of
https://github.com/SchildiChat/SchildiChat-android.git
synced 2025-03-23 14:29:02 +03:00
Fixes on unread badges
This commit is contained in:
parent
14144dc99d
commit
f9820cde58
5 changed files with 70 additions and 30 deletions
matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/summary
vector/src/main/java/im/vector/app/features
|
@ -364,6 +364,8 @@ internal class RoomSummaryUpdater @Inject constructor(
|
||||||
realm.where(RoomSummaryEntity::class.java)
|
realm.where(RoomSummaryEntity::class.java)
|
||||||
.process(RoomSummaryEntityFields.MEMBERSHIP_STR, listOf(Membership.JOIN))
|
.process(RoomSummaryEntityFields.MEMBERSHIP_STR, listOf(Membership.JOIN))
|
||||||
.notEqualTo(RoomSummaryEntityFields.ROOM_TYPE, RoomType.SPACE)
|
.notEqualTo(RoomSummaryEntityFields.ROOM_TYPE, RoomType.SPACE)
|
||||||
|
// also we do not count DM in here, because home space will already show them
|
||||||
|
.equalTo(RoomSummaryEntityFields.IS_DIRECT, false)
|
||||||
.contains(RoomSummaryEntityFields.FLATTEN_PARENT_IDS, space.roomId)
|
.contains(RoomSummaryEntityFields.FLATTEN_PARENT_IDS, space.roomId)
|
||||||
.findAll().forEach {
|
.findAll().forEach {
|
||||||
highlightCount += it.highlightCount
|
highlightCount += it.highlightCount
|
||||||
|
|
|
@ -202,7 +202,7 @@ class HomeDetailViewModel @AssistedInject constructor(@Assisted initialState: Ho
|
||||||
setState {
|
setState {
|
||||||
copy(
|
copy(
|
||||||
notificationCountCatchup = dmRooms.totalCount + otherRooms.totalCount + roomsInvite + dmInvites,
|
notificationCountCatchup = dmRooms.totalCount + otherRooms.totalCount + roomsInvite + dmInvites,
|
||||||
notificationHighlightCatchup = dmRooms.isHighlight || otherRooms.isHighlight,
|
notificationHighlightCatchup = dmRooms.isHighlight || otherRooms.isHighlight || (dmInvites + roomsInvite) > 0,
|
||||||
notificationCountPeople = dmRooms.totalCount + dmInvites,
|
notificationCountPeople = dmRooms.totalCount + dmInvites,
|
||||||
notificationHighlightPeople = dmRooms.isHighlight || dmInvites > 0,
|
notificationHighlightPeople = dmRooms.isHighlight || dmInvites > 0,
|
||||||
notificationCountRooms = otherRooms.totalCount + roomsInvite,
|
notificationCountRooms = otherRooms.totalCount + roomsInvite,
|
||||||
|
|
|
@ -29,6 +29,7 @@ import im.vector.app.RoomGroupingMethod
|
||||||
import im.vector.app.core.platform.EmptyAction
|
import im.vector.app.core.platform.EmptyAction
|
||||||
import im.vector.app.core.platform.EmptyViewEvents
|
import im.vector.app.core.platform.EmptyViewEvents
|
||||||
import im.vector.app.core.platform.VectorViewModel
|
import im.vector.app.core.platform.VectorViewModel
|
||||||
|
import im.vector.app.features.settings.VectorPreferences
|
||||||
import io.reactivex.Observable
|
import io.reactivex.Observable
|
||||||
import io.reactivex.schedulers.Schedulers
|
import io.reactivex.schedulers.Schedulers
|
||||||
import org.matrix.android.sdk.api.query.ActiveSpaceFilter
|
import org.matrix.android.sdk.api.query.ActiveSpaceFilter
|
||||||
|
@ -52,6 +53,7 @@ data class CountInfo(
|
||||||
|
|
||||||
class UnreadMessagesSharedViewModel @AssistedInject constructor(@Assisted initialState: UnreadMessagesState,
|
class UnreadMessagesSharedViewModel @AssistedInject constructor(@Assisted initialState: UnreadMessagesState,
|
||||||
session: Session,
|
session: Session,
|
||||||
|
private val vectorPreferences: VectorPreferences,
|
||||||
appStateHandler: AppStateHandler)
|
appStateHandler: AppStateHandler)
|
||||||
: VectorViewModel<UnreadMessagesState, EmptyAction, EmptyViewEvents>(initialState) {
|
: VectorViewModel<UnreadMessagesState, EmptyAction, EmptyViewEvents>(initialState) {
|
||||||
|
|
||||||
|
@ -126,12 +128,24 @@ class UnreadMessagesSharedViewModel @AssistedInject constructor(@Assisted initia
|
||||||
}
|
}
|
||||||
is RoomGroupingMethod.BySpace -> {
|
is RoomGroupingMethod.BySpace -> {
|
||||||
val selectedSpace = appStateHandler.safeActiveSpaceId()
|
val selectedSpace = appStateHandler.safeActiveSpaceId()
|
||||||
val counts = session.getNotificationCountForRooms(
|
|
||||||
|
val inviteCount = session.getRoomSummaries(roomSummaryQueryParams {
|
||||||
|
this.memberships = listOf(Membership.INVITE)
|
||||||
|
}).size
|
||||||
|
|
||||||
|
val totalCount = session.getNotificationCountForRooms(
|
||||||
roomSummaryQueryParams {
|
roomSummaryQueryParams {
|
||||||
this.memberships = listOf(Membership.JOIN)
|
this.memberships = listOf(Membership.JOIN)
|
||||||
this.activeSpaceFilter = ActiveSpaceFilter.ActiveSpace(null)
|
this.activeSpaceFilter = ActiveSpaceFilter.ActiveSpace(null).takeIf {
|
||||||
|
vectorPreferences.labsSpacesOnlyOrphansInHome()
|
||||||
|
} ?: ActiveSpaceFilter.None
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
val counts = RoomAggregateNotificationCount(
|
||||||
|
totalCount.notificationCount + inviteCount,
|
||||||
|
totalCount.highlightCount + inviteCount
|
||||||
|
)
|
||||||
val rootCounts = session.spaceService().getRootSpaceSummaries()
|
val rootCounts = session.spaceService().getRootSpaceSummaries()
|
||||||
.filter {
|
.filter {
|
||||||
// filter out current selection
|
// filter out current selection
|
||||||
|
|
|
@ -41,6 +41,7 @@ import org.matrix.android.sdk.api.session.Session
|
||||||
import org.matrix.android.sdk.api.session.room.RoomSummaryQueryParams
|
import org.matrix.android.sdk.api.session.room.RoomSummaryQueryParams
|
||||||
import org.matrix.android.sdk.api.session.room.UpdatableLivePageResult
|
import org.matrix.android.sdk.api.session.room.UpdatableLivePageResult
|
||||||
import org.matrix.android.sdk.api.session.room.model.Membership
|
import org.matrix.android.sdk.api.session.room.model.Membership
|
||||||
|
import org.matrix.android.sdk.api.session.room.summary.RoomAggregateNotificationCount
|
||||||
import org.matrix.android.sdk.rx.asObservable
|
import org.matrix.android.sdk.rx.asObservable
|
||||||
|
|
||||||
class SpaceRoomListSectionBuilder(
|
class SpaceRoomListSectionBuilder(
|
||||||
|
@ -88,12 +89,13 @@ class SpaceRoomListSectionBuilder(
|
||||||
}
|
}
|
||||||
RoomListDisplayMode.NOTIFICATIONS -> {
|
RoomListDisplayMode.NOTIFICATIONS -> {
|
||||||
addSection(
|
addSection(
|
||||||
sections,
|
sections = sections,
|
||||||
activeSpaceAwareQueries,
|
activeSpaceUpdaters = activeSpaceAwareQueries,
|
||||||
R.string.invitations_header,
|
nameRes = R.string.invitations_header,
|
||||||
true,
|
notifyOfLocalEcho = true,
|
||||||
RoomListViewModel.SpaceFilterStrategy.ORPHANS_IF_SPACE_NULL.takeIf { onlyOrphansInHome }
|
spaceFilterStrategy = RoomListViewModel.SpaceFilterStrategy.ORPHANS_IF_SPACE_NULL.takeIf { onlyOrphansInHome }
|
||||||
?: RoomListViewModel.SpaceFilterStrategy.ALL_IF_SPACE_NULL
|
?: RoomListViewModel.SpaceFilterStrategy.ALL_IF_SPACE_NULL,
|
||||||
|
countRoomAsNotif = true
|
||||||
) {
|
) {
|
||||||
it.memberships = listOf(Membership.INVITE)
|
it.memberships = listOf(Membership.INVITE)
|
||||||
it.roomCategoryFilter = RoomCategoryFilter.ALL
|
it.roomCategoryFilter = RoomCategoryFilter.ALL
|
||||||
|
@ -129,10 +131,12 @@ class SpaceRoomListSectionBuilder(
|
||||||
|
|
||||||
private fun buildRoomsSections(sections: MutableList<RoomsSection>, activeSpaceAwareQueries: MutableList<RoomListViewModel.ActiveSpaceQueryUpdater>) {
|
private fun buildRoomsSections(sections: MutableList<RoomsSection>, activeSpaceAwareQueries: MutableList<RoomListViewModel.ActiveSpaceQueryUpdater>) {
|
||||||
addSection(
|
addSection(
|
||||||
sections, activeSpaceAwareQueries,
|
sections = sections,
|
||||||
R.string.invitations_header,
|
activeSpaceUpdaters = activeSpaceAwareQueries,
|
||||||
true,
|
nameRes = R.string.invitations_header,
|
||||||
RoomListViewModel.SpaceFilterStrategy.ALL_IF_SPACE_NULL
|
notifyOfLocalEcho = true,
|
||||||
|
spaceFilterStrategy = RoomListViewModel.SpaceFilterStrategy.ALL_IF_SPACE_NULL,
|
||||||
|
countRoomAsNotif = true
|
||||||
) {
|
) {
|
||||||
it.memberships = listOf(Membership.INVITE)
|
it.memberships = listOf(Membership.INVITE)
|
||||||
it.roomCategoryFilter = RoomCategoryFilter.ONLY_ROOMS
|
it.roomCategoryFilter = RoomCategoryFilter.ONLY_ROOMS
|
||||||
|
@ -234,11 +238,12 @@ class SpaceRoomListSectionBuilder(
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun buildDmSections(sections: MutableList<RoomsSection>, activeSpaceAwareQueries: MutableList<RoomListViewModel.ActiveSpaceQueryUpdater>) {
|
private fun buildDmSections(sections: MutableList<RoomsSection>, activeSpaceAwareQueries: MutableList<RoomListViewModel.ActiveSpaceQueryUpdater>) {
|
||||||
addSection(sections,
|
addSection(sections = sections,
|
||||||
activeSpaceAwareQueries,
|
activeSpaceUpdaters = activeSpaceAwareQueries,
|
||||||
R.string.invitations_header,
|
nameRes = R.string.invitations_header,
|
||||||
true,
|
notifyOfLocalEcho = true,
|
||||||
RoomListViewModel.SpaceFilterStrategy.ALL_IF_SPACE_NULL
|
spaceFilterStrategy = RoomListViewModel.SpaceFilterStrategy.ALL_IF_SPACE_NULL,
|
||||||
|
countRoomAsNotif = true
|
||||||
) {
|
) {
|
||||||
it.memberships = listOf(Membership.INVITE)
|
it.memberships = listOf(Membership.INVITE)
|
||||||
it.roomCategoryFilter = RoomCategoryFilter.ONLY_DM
|
it.roomCategoryFilter = RoomCategoryFilter.ONLY_DM
|
||||||
|
@ -272,6 +277,7 @@ class SpaceRoomListSectionBuilder(
|
||||||
@StringRes nameRes: Int,
|
@StringRes nameRes: Int,
|
||||||
notifyOfLocalEcho: Boolean = false,
|
notifyOfLocalEcho: Boolean = false,
|
||||||
spaceFilterStrategy: RoomListViewModel.SpaceFilterStrategy = RoomListViewModel.SpaceFilterStrategy.NONE,
|
spaceFilterStrategy: RoomListViewModel.SpaceFilterStrategy = RoomListViewModel.SpaceFilterStrategy.NONE,
|
||||||
|
countRoomAsNotif: Boolean = false,
|
||||||
query: (RoomSummaryQueryParams.Builder) -> Unit) {
|
query: (RoomSummaryQueryParams.Builder) -> Unit) {
|
||||||
withQueryParams(
|
withQueryParams(
|
||||||
{ query.invoke(it) },
|
{ query.invoke(it) },
|
||||||
|
@ -313,7 +319,7 @@ class SpaceRoomListSectionBuilder(
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
RoomListViewModel.SpaceFilterStrategy.NONE -> {
|
RoomListViewModel.SpaceFilterStrategy.NONE -> {
|
||||||
// we ignore current space for this one
|
// we ignore current space for this one
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -326,9 +332,15 @@ class SpaceRoomListSectionBuilder(
|
||||||
.subscribe {
|
.subscribe {
|
||||||
sections.find { it.sectionName == name }
|
sections.find { it.sectionName == name }
|
||||||
?.notificationCount
|
?.notificationCount
|
||||||
?.postValue(session.getNotificationCountForRooms(
|
?.postValue(
|
||||||
roomQueryParams.process(spaceFilterStrategy, appStateHandler.safeActiveSpaceId())
|
if (countRoomAsNotif) {
|
||||||
))
|
RoomAggregateNotificationCount(it.size, it.size)
|
||||||
|
} else {
|
||||||
|
session.getNotificationCountForRooms(
|
||||||
|
roomQueryParams.process(spaceFilterStrategy, appStateHandler.safeActiveSpaceId())
|
||||||
|
)
|
||||||
|
}
|
||||||
|
)
|
||||||
}.also {
|
}.also {
|
||||||
onDisposable.invoke(it)
|
onDisposable.invoke(it)
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,8 +28,7 @@ import dagger.assisted.AssistedInject
|
||||||
import im.vector.app.AppStateHandler
|
import im.vector.app.AppStateHandler
|
||||||
import im.vector.app.RoomGroupingMethod
|
import im.vector.app.RoomGroupingMethod
|
||||||
import im.vector.app.core.platform.VectorViewModel
|
import im.vector.app.core.platform.VectorViewModel
|
||||||
import im.vector.app.core.resources.StringProvider
|
import im.vector.app.features.settings.VectorPreferences
|
||||||
import im.vector.app.features.ui.UiStateRepository
|
|
||||||
import im.vector.app.group
|
import im.vector.app.group
|
||||||
import im.vector.app.space
|
import im.vector.app.space
|
||||||
import io.reactivex.Observable
|
import io.reactivex.Observable
|
||||||
|
@ -45,6 +44,7 @@ import org.matrix.android.sdk.api.session.room.RoomSortOrder
|
||||||
import org.matrix.android.sdk.api.session.room.model.Membership
|
import org.matrix.android.sdk.api.session.room.model.Membership
|
||||||
import org.matrix.android.sdk.api.session.room.model.RoomSummary
|
import org.matrix.android.sdk.api.session.room.model.RoomSummary
|
||||||
import org.matrix.android.sdk.api.session.room.roomSummaryQueryParams
|
import org.matrix.android.sdk.api.session.room.roomSummaryQueryParams
|
||||||
|
import org.matrix.android.sdk.api.session.room.summary.RoomAggregateNotificationCount
|
||||||
import org.matrix.android.sdk.api.session.user.model.User
|
import org.matrix.android.sdk.api.session.user.model.User
|
||||||
import org.matrix.android.sdk.api.util.toMatrixItem
|
import org.matrix.android.sdk.api.util.toMatrixItem
|
||||||
import org.matrix.android.sdk.rx.asObservable
|
import org.matrix.android.sdk.rx.asObservable
|
||||||
|
@ -54,8 +54,7 @@ import java.util.concurrent.TimeUnit
|
||||||
class SpacesListViewModel @AssistedInject constructor(@Assisted initialState: SpaceListViewState,
|
class SpacesListViewModel @AssistedInject constructor(@Assisted initialState: SpaceListViewState,
|
||||||
private val appStateHandler: AppStateHandler,
|
private val appStateHandler: AppStateHandler,
|
||||||
private val session: Session,
|
private val session: Session,
|
||||||
private val stringProvider: StringProvider,
|
private val vectorPreferences: VectorPreferences
|
||||||
private val uiStateRepository: UiStateRepository
|
|
||||||
) : VectorViewModel<SpaceListViewState, SpaceListAction, SpaceListViewEvents>(initialState) {
|
) : VectorViewModel<SpaceListViewState, SpaceListAction, SpaceListViewEvents>(initialState) {
|
||||||
|
|
||||||
@AssistedFactory
|
@AssistedFactory
|
||||||
|
@ -108,21 +107,34 @@ class SpacesListViewModel @AssistedInject constructor(@Assisted initialState: Sp
|
||||||
}
|
}
|
||||||
}.disposeOnClear()
|
}.disposeOnClear()
|
||||||
|
|
||||||
|
// XXX there should be a way to refactor this and share it
|
||||||
session.getPagedRoomSummariesLive(
|
session.getPagedRoomSummariesLive(
|
||||||
roomSummaryQueryParams {
|
roomSummaryQueryParams {
|
||||||
this.memberships = listOf(Membership.JOIN)
|
this.memberships = listOf(Membership.JOIN)
|
||||||
this.activeSpaceFilter = ActiveSpaceFilter.ActiveSpace(null)
|
this.activeSpaceFilter = ActiveSpaceFilter.ActiveSpace(null).takeIf {
|
||||||
|
vectorPreferences.labsSpacesOnlyOrphansInHome()
|
||||||
|
} ?: ActiveSpaceFilter.None
|
||||||
}, sortOrder = RoomSortOrder.NONE
|
}, sortOrder = RoomSortOrder.NONE
|
||||||
).asObservable()
|
).asObservable()
|
||||||
.throttleFirst(300, TimeUnit.MILLISECONDS)
|
.throttleFirst(300, TimeUnit.MILLISECONDS)
|
||||||
.observeOn(Schedulers.computation())
|
.observeOn(Schedulers.computation())
|
||||||
.subscribe {
|
.subscribe {
|
||||||
val counts = session.getNotificationCountForRooms(
|
val inviteCount = session.getRoomSummaries(roomSummaryQueryParams {
|
||||||
|
this.memberships = listOf(Membership.INVITE)
|
||||||
|
}).size
|
||||||
|
|
||||||
|
val totalCount = session.getNotificationCountForRooms(
|
||||||
roomSummaryQueryParams {
|
roomSummaryQueryParams {
|
||||||
this.memberships = listOf(Membership.JOIN)
|
this.memberships = listOf(Membership.JOIN)
|
||||||
this.activeSpaceFilter = ActiveSpaceFilter.ActiveSpace(null)
|
this.activeSpaceFilter = ActiveSpaceFilter.ActiveSpace(null).takeIf {
|
||||||
|
vectorPreferences.labsSpacesOnlyOrphansInHome()
|
||||||
|
} ?: ActiveSpaceFilter.None
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
val counts = RoomAggregateNotificationCount(
|
||||||
|
totalCount.notificationCount + inviteCount,
|
||||||
|
totalCount.highlightCount + inviteCount
|
||||||
|
)
|
||||||
setState {
|
setState {
|
||||||
copy(
|
copy(
|
||||||
homeAggregateCount = counts
|
homeAggregateCount = counts
|
||||||
|
@ -217,7 +229,7 @@ class SpacesListViewModel @AssistedInject constructor(@Assisted initialState: Sp
|
||||||
.rx()
|
.rx()
|
||||||
.liveUser(session.myUserId)
|
.liveUser(session.myUserId)
|
||||||
.map {
|
.map {
|
||||||
it.getOrNull()
|
it.getOrNull()
|
||||||
},
|
},
|
||||||
session
|
session
|
||||||
.rx()
|
.rx()
|
||||||
|
|
Loading…
Add table
Reference in a new issue