Setting for unread badge / room summary event visibility
- All previewable like in Element - Exclude member state changes - Exclude member state changes and reactions Replaces commit 72d2b1c9f1e5bb642c72e9c8e5ef73b0aa88ab7f. Also fix marking rooms as unread when no previewable event is available compared to above commit. Related issue: https://github.com/vector-im/element-android/issues/588 Change-Id: Id76b73829a719de88f9c07c492e78736e1f3d7db
This commit is contained in:
parent
5b5cfa5bf1
commit
b1d96ebba9
@ -40,10 +40,14 @@ data class RoomSummary constructor(
|
|||||||
val joinedMembersCount: Int? = 0,
|
val joinedMembersCount: Int? = 0,
|
||||||
val invitedMembersCount: Int? = 0,
|
val invitedMembersCount: Int? = 0,
|
||||||
val latestPreviewableEvent: TimelineEvent? = null,
|
val latestPreviewableEvent: TimelineEvent? = null,
|
||||||
|
val latestPreviewableContentEvent: TimelineEvent? = null,
|
||||||
|
val latestPreviewableOriginalContentEvent: TimelineEvent? = null,
|
||||||
val otherMemberIds: List<String> = emptyList(),
|
val otherMemberIds: List<String> = emptyList(),
|
||||||
val notificationCount: Int = 0,
|
val notificationCount: Int = 0,
|
||||||
val highlightCount: Int = 0,
|
val highlightCount: Int = 0,
|
||||||
val hasUnreadMessages: Boolean = false,
|
val hasUnreadMessages: Boolean = false,
|
||||||
|
val hasUnreadContentMessages: Boolean = false,
|
||||||
|
val hasUnreadOriginalContentMessages: Boolean = false,
|
||||||
val tags: List<RoomTag> = emptyList(),
|
val tags: List<RoomTag> = emptyList(),
|
||||||
val membership: Membership = Membership.NONE,
|
val membership: Membership = Membership.NONE,
|
||||||
val versioningState: VersioningState = VersioningState.NONE,
|
val versioningState: VersioningState = VersioningState.NONE,
|
||||||
@ -70,7 +74,42 @@ data class RoomSummary constructor(
|
|||||||
val canStartCall: Boolean
|
val canStartCall: Boolean
|
||||||
get() = joinedMembersCount == 2
|
get() = joinedMembersCount == 2
|
||||||
|
|
||||||
|
fun scHasUnreadMessages(preferenceProvider: RoomSummaryPreferenceProvider?): Boolean {
|
||||||
|
if (preferenceProvider == null) {
|
||||||
|
// Fallback to default
|
||||||
|
return hasUnreadMessages
|
||||||
|
}
|
||||||
|
return when(preferenceProvider.getUnreadKind()) {
|
||||||
|
UNREAD_KIND_ORIGINAL_CONTENT -> hasUnreadOriginalContentMessages
|
||||||
|
UNREAD_KIND_CONTENT -> hasUnreadContentMessages
|
||||||
|
// UNREAD_KIND_DEFAULT
|
||||||
|
else -> hasUnreadMessages
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun scLatestPreviewableEvent(preferenceProvider: RoomSummaryPreferenceProvider?): TimelineEvent? {
|
||||||
|
if (preferenceProvider == null) {
|
||||||
|
// Fallback to default
|
||||||
|
return latestPreviewableEvent
|
||||||
|
}
|
||||||
|
return when(preferenceProvider.getUnreadKind()) {
|
||||||
|
UNREAD_KIND_ORIGINAL_CONTENT -> latestPreviewableOriginalContentEvent
|
||||||
|
UNREAD_KIND_CONTENT -> latestPreviewableContentEvent
|
||||||
|
// UNREAD_KIND_DEFAULT
|
||||||
|
else -> latestPreviewableEvent
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
const val NOT_IN_BREADCRUMBS = -1
|
const val NOT_IN_BREADCRUMBS = -1
|
||||||
|
// SC addition
|
||||||
|
const val UNREAD_KIND_DEFAULT = 0
|
||||||
|
const val UNREAD_KIND_CONTENT = 1
|
||||||
|
const val UNREAD_KIND_ORIGINAL_CONTENT = 2
|
||||||
|
}
|
||||||
|
|
||||||
|
// SC addition
|
||||||
|
interface RoomSummaryPreferenceProvider {
|
||||||
|
fun getUnreadKind(): Int
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -34,6 +34,12 @@ internal class RoomSummaryMapper @Inject constructor(private val timelineEventMa
|
|||||||
val latestEvent = roomSummaryEntity.latestPreviewableEvent?.let {
|
val latestEvent = roomSummaryEntity.latestPreviewableEvent?.let {
|
||||||
timelineEventMapper.map(it, buildReadReceipts = false)
|
timelineEventMapper.map(it, buildReadReceipts = false)
|
||||||
}
|
}
|
||||||
|
val latestContentEvent = roomSummaryEntity.latestPreviewableContentEvent?.let {
|
||||||
|
timelineEventMapper.map(it, buildReadReceipts = false)
|
||||||
|
}
|
||||||
|
val latestOriginalContentEvent = roomSummaryEntity.latestPreviewableOriginalContentEvent?.let {
|
||||||
|
timelineEventMapper.map(it, buildReadReceipts = false)
|
||||||
|
}
|
||||||
// typings are updated through the sync where room summary entity gets updated no matter what, so it's ok get there
|
// typings are updated through the sync where room summary entity gets updated no matter what, so it's ok get there
|
||||||
val typingUsers = typingUsersTracker.getTypingUsers(roomSummaryEntity.roomId)
|
val typingUsers = typingUsersTracker.getTypingUsers(roomSummaryEntity.roomId)
|
||||||
|
|
||||||
@ -45,12 +51,16 @@ internal class RoomSummaryMapper @Inject constructor(private val timelineEventMa
|
|||||||
avatarUrl = roomSummaryEntity.avatarUrl ?: "",
|
avatarUrl = roomSummaryEntity.avatarUrl ?: "",
|
||||||
isDirect = roomSummaryEntity.isDirect,
|
isDirect = roomSummaryEntity.isDirect,
|
||||||
latestPreviewableEvent = latestEvent,
|
latestPreviewableEvent = latestEvent,
|
||||||
|
latestPreviewableContentEvent = latestContentEvent,
|
||||||
|
latestPreviewableOriginalContentEvent = latestOriginalContentEvent,
|
||||||
joinedMembersCount = roomSummaryEntity.joinedMembersCount,
|
joinedMembersCount = roomSummaryEntity.joinedMembersCount,
|
||||||
invitedMembersCount = roomSummaryEntity.invitedMembersCount,
|
invitedMembersCount = roomSummaryEntity.invitedMembersCount,
|
||||||
otherMemberIds = roomSummaryEntity.otherMemberIds.toList(),
|
otherMemberIds = roomSummaryEntity.otherMemberIds.toList(),
|
||||||
highlightCount = roomSummaryEntity.highlightCount,
|
highlightCount = roomSummaryEntity.highlightCount,
|
||||||
notificationCount = roomSummaryEntity.notificationCount,
|
notificationCount = roomSummaryEntity.notificationCount,
|
||||||
hasUnreadMessages = roomSummaryEntity.hasUnreadMessages,
|
hasUnreadMessages = roomSummaryEntity.hasUnreadMessages,
|
||||||
|
hasUnreadContentMessages = roomSummaryEntity.hasUnreadContentMessages,
|
||||||
|
hasUnreadOriginalContentMessages = roomSummaryEntity.hasUnreadOriginalContentMessages,
|
||||||
tags = tags,
|
tags = tags,
|
||||||
typingUsers = typingUsers,
|
typingUsers = typingUsers,
|
||||||
membership = roomSummaryEntity.membership,
|
membership = roomSummaryEntity.membership,
|
||||||
|
@ -32,6 +32,8 @@ internal open class RoomSummaryEntity(
|
|||||||
var name: String? = "",
|
var name: String? = "",
|
||||||
var topic: String? = "",
|
var topic: String? = "",
|
||||||
var latestPreviewableEvent: TimelineEventEntity? = null,
|
var latestPreviewableEvent: TimelineEventEntity? = null,
|
||||||
|
var latestPreviewableContentEvent: TimelineEventEntity? = null,
|
||||||
|
var latestPreviewableOriginalContentEvent: TimelineEventEntity? = null,
|
||||||
var heroes: RealmList<String> = RealmList(),
|
var heroes: RealmList<String> = RealmList(),
|
||||||
var joinedMembersCount: Int? = 0,
|
var joinedMembersCount: Int? = 0,
|
||||||
var invitedMembersCount: Int? = 0,
|
var invitedMembersCount: Int? = 0,
|
||||||
@ -42,6 +44,8 @@ internal open class RoomSummaryEntity(
|
|||||||
var highlightCount: Int = 0,
|
var highlightCount: Int = 0,
|
||||||
var readMarkerId: String? = null,
|
var readMarkerId: String? = null,
|
||||||
var hasUnreadMessages: Boolean = false,
|
var hasUnreadMessages: Boolean = false,
|
||||||
|
var hasUnreadContentMessages: Boolean = false,
|
||||||
|
var hasUnreadOriginalContentMessages: Boolean = false,
|
||||||
var tags: RealmList<RoomTagEntity> = RealmList(),
|
var tags: RealmList<RoomTagEntity> = RealmList(),
|
||||||
var userDrafts: UserDraftsEntity? = null,
|
var userDrafts: UserDraftsEntity? = null,
|
||||||
var breadcrumbsIndex: Int = RoomSummary.NOT_IN_BREADCRUMBS,
|
var breadcrumbsIndex: Int = RoomSummary.NOT_IN_BREADCRUMBS,
|
||||||
|
@ -126,6 +126,8 @@ internal class DefaultSetReadMarkersTask @Inject constructor(
|
|||||||
roomSummary.notificationCount = 0
|
roomSummary.notificationCount = 0
|
||||||
roomSummary.highlightCount = 0
|
roomSummary.highlightCount = 0
|
||||||
roomSummary.hasUnreadMessages = false
|
roomSummary.hasUnreadMessages = false
|
||||||
|
roomSummary.hasUnreadContentMessages = false
|
||||||
|
roomSummary.hasUnreadOriginalContentMessages = false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -64,6 +64,25 @@ internal class RoomSummaryUpdater @Inject constructor(
|
|||||||
companion object {
|
companion object {
|
||||||
// TODO: maybe allow user of SDK to give that list
|
// TODO: maybe allow user of SDK to give that list
|
||||||
val PREVIEWABLE_TYPES = listOf(
|
val PREVIEWABLE_TYPES = listOf(
|
||||||
|
// TODO filter message type (KEY_VERIFICATION_READY, etc.)
|
||||||
|
EventType.MESSAGE,
|
||||||
|
EventType.STATE_ROOM_NAME,
|
||||||
|
EventType.STATE_ROOM_TOPIC,
|
||||||
|
EventType.STATE_ROOM_AVATAR,
|
||||||
|
EventType.STATE_ROOM_MEMBER,
|
||||||
|
EventType.STATE_ROOM_HISTORY_VISIBILITY,
|
||||||
|
EventType.CALL_INVITE,
|
||||||
|
EventType.CALL_HANGUP,
|
||||||
|
EventType.CALL_ANSWER,
|
||||||
|
EventType.ENCRYPTED,
|
||||||
|
EventType.STATE_ROOM_ENCRYPTION,
|
||||||
|
EventType.STATE_ROOM_THIRD_PARTY_INVITE,
|
||||||
|
EventType.STICKER,
|
||||||
|
EventType.REACTION,
|
||||||
|
EventType.STATE_ROOM_CREATE
|
||||||
|
)
|
||||||
|
// Same as PREVIEWABLE_CONTENT_TYPES without member state changes // SC feature
|
||||||
|
val PREVIEWABLE_CONTENT_TYPES = listOf(
|
||||||
// TODO filter message type (KEY_VERIFICATION_READY, etc.)
|
// TODO filter message type (KEY_VERIFICATION_READY, etc.)
|
||||||
EventType.MESSAGE,
|
EventType.MESSAGE,
|
||||||
/*
|
/*
|
||||||
@ -85,6 +104,31 @@ internal class RoomSummaryUpdater @Inject constructor(
|
|||||||
EventType.REACTION,
|
EventType.REACTION,
|
||||||
EventType.STATE_ROOM_CREATE
|
EventType.STATE_ROOM_CREATE
|
||||||
)
|
)
|
||||||
|
// Same as PREVIEWABLE_ORIGINAL_CONTENT_TYPES without reactions // SC feature
|
||||||
|
val PREVIEWABLE_ORIGINAL_CONTENT_TYPES = listOf(
|
||||||
|
// TODO filter message type (KEY_VERIFICATION_READY, etc.)
|
||||||
|
EventType.MESSAGE,
|
||||||
|
/*
|
||||||
|
EventType.STATE_ROOM_NAME,
|
||||||
|
EventType.STATE_ROOM_TOPIC,
|
||||||
|
EventType.STATE_ROOM_AVATAR,
|
||||||
|
EventType.STATE_ROOM_MEMBER,
|
||||||
|
EventType.STATE_ROOM_HISTORY_VISIBILITY,
|
||||||
|
*/
|
||||||
|
EventType.CALL_INVITE,
|
||||||
|
EventType.CALL_HANGUP,
|
||||||
|
EventType.CALL_ANSWER,
|
||||||
|
EventType.ENCRYPTED,
|
||||||
|
/*
|
||||||
|
EventType.STATE_ROOM_ENCRYPTION,
|
||||||
|
EventType.STATE_ROOM_THIRD_PARTY_INVITE,
|
||||||
|
*/
|
||||||
|
EventType.STICKER,
|
||||||
|
/*
|
||||||
|
EventType.REACTION,
|
||||||
|
*/
|
||||||
|
EventType.STATE_ROOM_CREATE
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun update(realm: Realm,
|
fun update(realm: Realm,
|
||||||
@ -116,6 +160,10 @@ internal class RoomSummaryUpdater @Inject constructor(
|
|||||||
|
|
||||||
val latestPreviewableEvent = TimelineEventEntity.latestEvent(realm, roomId, includesSending = true,
|
val latestPreviewableEvent = TimelineEventEntity.latestEvent(realm, roomId, includesSending = true,
|
||||||
filterTypes = PREVIEWABLE_TYPES, filterContentRelation = true)
|
filterTypes = PREVIEWABLE_TYPES, filterContentRelation = true)
|
||||||
|
val latestPreviewableContentEvent = TimelineEventEntity.latestEvent(realm, roomId, includesSending = true,
|
||||||
|
filterTypes = PREVIEWABLE_CONTENT_TYPES, filterContentRelation = true)
|
||||||
|
val latestPreviewableOriginalContentEvent = TimelineEventEntity.latestEvent(realm, roomId, includesSending = true,
|
||||||
|
filterTypes = PREVIEWABLE_ORIGINAL_CONTENT_TYPES, filterContentRelation = true)
|
||||||
|
|
||||||
val lastNameEvent = CurrentStateEventEntity.getOrNull(realm, roomId, type = EventType.STATE_ROOM_NAME, stateKey = "")?.root
|
val lastNameEvent = CurrentStateEventEntity.getOrNull(realm, roomId, type = EventType.STATE_ROOM_NAME, stateKey = "")?.root
|
||||||
val lastTopicEvent = CurrentStateEventEntity.getOrNull(realm, roomId, type = EventType.STATE_ROOM_TOPIC, stateKey = "")?.root
|
val lastTopicEvent = CurrentStateEventEntity.getOrNull(realm, roomId, type = EventType.STATE_ROOM_TOPIC, stateKey = "")?.root
|
||||||
@ -130,12 +178,22 @@ internal class RoomSummaryUpdater @Inject constructor(
|
|||||||
roomSummaryEntity.hasUnreadMessages = roomSummaryEntity.notificationCount > 0
|
roomSummaryEntity.hasUnreadMessages = roomSummaryEntity.notificationCount > 0
|
||||||
// avoid this call if we are sure there are unread events
|
// avoid this call if we are sure there are unread events
|
||||||
|| !isEventRead(realm.configuration, userId, roomId, latestPreviewableEvent?.eventId)
|
|| !isEventRead(realm.configuration, userId, roomId, latestPreviewableEvent?.eventId)
|
||||||
|
roomSummaryEntity.hasUnreadContentMessages = roomSummaryEntity.notificationCount > 0
|
||||||
|
// avoid this call if we are sure there are unread events
|
||||||
|
|| (latestPreviewableContentEvent != null
|
||||||
|
&& !isEventRead(realm.configuration, userId, roomId, latestPreviewableContentEvent.eventId))
|
||||||
|
roomSummaryEntity.hasUnreadOriginalContentMessages = roomSummaryEntity.notificationCount > 0
|
||||||
|
// avoid this call if we are sure there are unread events
|
||||||
|
|| (latestPreviewableOriginalContentEvent != null
|
||||||
|
&& !isEventRead(realm.configuration, userId, roomId, latestPreviewableOriginalContentEvent.eventId))
|
||||||
|
|
||||||
roomSummaryEntity.displayName = roomDisplayNameResolver.resolve(realm, roomId).toString()
|
roomSummaryEntity.displayName = roomDisplayNameResolver.resolve(realm, roomId).toString()
|
||||||
roomSummaryEntity.avatarUrl = roomAvatarResolver.resolve(realm, roomId)
|
roomSummaryEntity.avatarUrl = roomAvatarResolver.resolve(realm, roomId)
|
||||||
roomSummaryEntity.name = ContentMapper.map(lastNameEvent?.content).toModel<RoomNameContent>()?.name
|
roomSummaryEntity.name = ContentMapper.map(lastNameEvent?.content).toModel<RoomNameContent>()?.name
|
||||||
roomSummaryEntity.topic = ContentMapper.map(lastTopicEvent?.content).toModel<RoomTopicContent>()?.topic
|
roomSummaryEntity.topic = ContentMapper.map(lastTopicEvent?.content).toModel<RoomTopicContent>()?.topic
|
||||||
roomSummaryEntity.latestPreviewableEvent = latestPreviewableEvent
|
roomSummaryEntity.latestPreviewableEvent = latestPreviewableEvent
|
||||||
|
roomSummaryEntity.latestPreviewableContentEvent = latestPreviewableContentEvent
|
||||||
|
roomSummaryEntity.latestPreviewableOriginalContentEvent = latestPreviewableOriginalContentEvent
|
||||||
roomSummaryEntity.canonicalAlias = ContentMapper.map(lastCanonicalAliasEvent?.content).toModel<RoomCanonicalAliasContent>()
|
roomSummaryEntity.canonicalAlias = ContentMapper.map(lastCanonicalAliasEvent?.content).toModel<RoomCanonicalAliasContent>()
|
||||||
?.canonicalAlias
|
?.canonicalAlias
|
||||||
|
|
||||||
|
@ -0,0 +1,15 @@
|
|||||||
|
package im.vector.app.features.home.room
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import im.vector.app.features.settings.VectorPreferences
|
||||||
|
import org.matrix.android.sdk.api.session.room.model.RoomSummary
|
||||||
|
import javax.inject.Inject
|
||||||
|
|
||||||
|
class ScSdkPreferences @Inject constructor(private val vectorPreferences: VectorPreferences?): RoomSummary.RoomSummaryPreferenceProvider {
|
||||||
|
|
||||||
|
constructor(context: Context?) : this(vectorPreferences = context?.let { VectorPreferences(it) })
|
||||||
|
|
||||||
|
override fun getUnreadKind(): Int {
|
||||||
|
return vectorPreferences?.roomUnreadKind() ?: RoomSummary.UNREAD_KIND_DEFAULT
|
||||||
|
}
|
||||||
|
}
|
@ -21,11 +21,13 @@ import com.airbnb.epoxy.EpoxyController
|
|||||||
import im.vector.app.core.epoxy.zeroItem
|
import im.vector.app.core.epoxy.zeroItem
|
||||||
import im.vector.app.core.utils.DebouncedClickListener
|
import im.vector.app.core.utils.DebouncedClickListener
|
||||||
import im.vector.app.features.home.AvatarRenderer
|
import im.vector.app.features.home.AvatarRenderer
|
||||||
|
import im.vector.app.features.home.room.ScSdkPreferences
|
||||||
import org.matrix.android.sdk.api.util.toMatrixItem
|
import org.matrix.android.sdk.api.util.toMatrixItem
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
class BreadcrumbsController @Inject constructor(
|
class BreadcrumbsController @Inject constructor(
|
||||||
private val avatarRenderer: AvatarRenderer
|
private val avatarRenderer: AvatarRenderer,
|
||||||
|
private val scSdkPreferences: ScSdkPreferences
|
||||||
) : EpoxyController() {
|
) : EpoxyController() {
|
||||||
|
|
||||||
var listener: Listener? = null
|
var listener: Listener? = null
|
||||||
@ -62,7 +64,7 @@ class BreadcrumbsController @Inject constructor(
|
|||||||
matrixItem(it.toMatrixItem())
|
matrixItem(it.toMatrixItem())
|
||||||
unreadNotificationCount(it.notificationCount)
|
unreadNotificationCount(it.notificationCount)
|
||||||
showHighlighted(it.highlightCount > 0)
|
showHighlighted(it.highlightCount > 0)
|
||||||
hasUnreadMessage(it.hasUnreadMessages)
|
hasUnreadMessage(it.scHasUnreadMessages(scSdkPreferences))
|
||||||
hasDraft(it.userDrafts.isNotEmpty())
|
hasDraft(it.userDrafts.isNotEmpty())
|
||||||
itemClickListener(
|
itemClickListener(
|
||||||
DebouncedClickListener(View.OnClickListener { _ ->
|
DebouncedClickListener(View.OnClickListener { _ ->
|
||||||
|
@ -120,6 +120,7 @@ import im.vector.app.features.crypto.keysbackup.restore.KeysBackupRestoreActivit
|
|||||||
import im.vector.app.features.crypto.util.toImageRes
|
import im.vector.app.features.crypto.util.toImageRes
|
||||||
import im.vector.app.features.crypto.verification.VerificationBottomSheet
|
import im.vector.app.features.crypto.verification.VerificationBottomSheet
|
||||||
import im.vector.app.features.home.AvatarRenderer
|
import im.vector.app.features.home.AvatarRenderer
|
||||||
|
import im.vector.app.features.home.room.ScSdkPreferences
|
||||||
import im.vector.app.features.home.room.detail.composer.TextComposerView
|
import im.vector.app.features.home.room.detail.composer.TextComposerView
|
||||||
import im.vector.app.features.home.room.detail.readreceipts.DisplayReadReceiptsBottomSheet
|
import im.vector.app.features.home.room.detail.readreceipts.DisplayReadReceiptsBottomSheet
|
||||||
import im.vector.app.features.home.room.detail.timeline.TimelineEventController
|
import im.vector.app.features.home.room.detail.timeline.TimelineEventController
|
||||||
@ -1022,7 +1023,7 @@ class RoomDetailFragment @Inject constructor(
|
|||||||
val inviter = state.asyncInviter()
|
val inviter = state.asyncInviter()
|
||||||
if (summary?.membership == Membership.JOIN) {
|
if (summary?.membership == Membership.JOIN) {
|
||||||
jumpToBottomView.count = summary.notificationCount
|
jumpToBottomView.count = summary.notificationCount
|
||||||
jumpToBottomView.drawBadge = summary.hasUnreadMessages
|
jumpToBottomView.drawBadge = summary.scHasUnreadMessages(ScSdkPreferences(context))
|
||||||
scrollOnHighlightedEventCallback.timeline = roomDetailViewModel.timeline
|
scrollOnHighlightedEventCallback.timeline = roomDetailViewModel.timeline
|
||||||
timelineEventController.update(state)
|
timelineEventController.update(state)
|
||||||
inviteView.visibility = View.GONE
|
inviteView.visibility = View.GONE
|
||||||
|
@ -25,6 +25,7 @@ import com.airbnb.mvrx.MvRxState
|
|||||||
import com.airbnb.mvrx.Uninitialized
|
import com.airbnb.mvrx.Uninitialized
|
||||||
import im.vector.app.R
|
import im.vector.app.R
|
||||||
import im.vector.app.features.home.RoomListDisplayMode
|
import im.vector.app.features.home.RoomListDisplayMode
|
||||||
|
import im.vector.app.features.home.room.ScSdkPreferences
|
||||||
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
|
||||||
import org.matrix.android.sdk.api.session.room.model.RoomSummary
|
import org.matrix.android.sdk.api.session.room.model.RoomSummary
|
||||||
@ -41,7 +42,8 @@ data class RoomListViewState(
|
|||||||
val isGroupRoomsExpanded: Boolean = true,
|
val isGroupRoomsExpanded: Boolean = true,
|
||||||
val isCombinedRoomsExpanded: Boolean = true,
|
val isCombinedRoomsExpanded: Boolean = true,
|
||||||
val isLowPriorityRoomsExpanded: Boolean = true,
|
val isLowPriorityRoomsExpanded: Boolean = true,
|
||||||
val isServerNoticeRoomsExpanded: Boolean = true
|
val isServerNoticeRoomsExpanded: Boolean = true,
|
||||||
|
val scSdkPreferences: ScSdkPreferences? = null
|
||||||
) : MvRxState {
|
) : MvRxState {
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
@ -57,12 +59,15 @@ data class RoomListViewState(
|
|||||||
return ROOM_LIST_ROOM_EXPANDED_LOW_PRIORITY_PREFIX + displayMode.toString()
|
return ROOM_LIST_ROOM_EXPANDED_LOW_PRIORITY_PREFIX + displayMode.toString()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SC addition
|
||||||
fun initWithContext(context: Context, displayMode: RoomListDisplayMode): RoomListViewState {
|
fun initWithContext(context: Context, displayMode: RoomListDisplayMode): RoomListViewState {
|
||||||
val sp = getSharedPreferences(context)
|
val sp = getSharedPreferences(context)
|
||||||
val pref = getRoomListExpandedLowPriorityPref(displayMode)
|
val pref = getRoomListExpandedLowPriorityPref(displayMode)
|
||||||
return copy(isLowPriorityRoomsExpanded = sp.getBoolean(pref, isLowPriorityRoomsExpanded))
|
val scSdkPreferences = ScSdkPreferences(context)
|
||||||
|
return copy(isLowPriorityRoomsExpanded = sp.getBoolean(pref, isLowPriorityRoomsExpanded), scSdkPreferences = scSdkPreferences)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SC addition
|
||||||
fun persistWithContext(context: Context, displayMode: RoomListDisplayMode) {
|
fun persistWithContext(context: Context, displayMode: RoomListDisplayMode) {
|
||||||
val sp = getSharedPreferences(context)
|
val sp = getSharedPreferences(context)
|
||||||
val pref = getRoomListExpandedLowPriorityPref(displayMode)
|
val pref = getRoomListExpandedLowPriorityPref(displayMode)
|
||||||
@ -97,7 +102,7 @@ data class RoomListViewState(
|
|||||||
get() = asyncFilteredRooms.invoke()
|
get() = asyncFilteredRooms.invoke()
|
||||||
?.flatMap { it.value }
|
?.flatMap { it.value }
|
||||||
?.filter { it.membership == Membership.JOIN }
|
?.filter { it.membership == Membership.JOIN }
|
||||||
?.any { it.hasUnreadMessages }
|
?.any { it.scHasUnreadMessages(scSdkPreferences) }
|
||||||
?: false
|
?: false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -25,6 +25,7 @@ import im.vector.app.core.resources.DateProvider
|
|||||||
import im.vector.app.core.resources.StringProvider
|
import im.vector.app.core.resources.StringProvider
|
||||||
import im.vector.app.core.utils.DebouncedClickListener
|
import im.vector.app.core.utils.DebouncedClickListener
|
||||||
import im.vector.app.features.home.AvatarRenderer
|
import im.vector.app.features.home.AvatarRenderer
|
||||||
|
import im.vector.app.features.home.room.ScSdkPreferences
|
||||||
import im.vector.app.features.home.room.detail.timeline.format.DisplayableEventFormatter
|
import im.vector.app.features.home.room.detail.timeline.format.DisplayableEventFormatter
|
||||||
import im.vector.app.features.home.room.typing.TypingHelper
|
import im.vector.app.features.home.room.typing.TypingHelper
|
||||||
import org.matrix.android.sdk.api.session.room.members.ChangeMembershipState
|
import org.matrix.android.sdk.api.session.room.members.ChangeMembershipState
|
||||||
@ -37,7 +38,8 @@ class RoomSummaryItemFactory @Inject constructor(private val displayableEventFor
|
|||||||
private val dateFormatter: VectorDateFormatter,
|
private val dateFormatter: VectorDateFormatter,
|
||||||
private val stringProvider: StringProvider,
|
private val stringProvider: StringProvider,
|
||||||
private val typingHelper: TypingHelper,
|
private val typingHelper: TypingHelper,
|
||||||
private val avatarRenderer: AvatarRenderer) {
|
private val avatarRenderer: AvatarRenderer,
|
||||||
|
private val scSdkPreferences: ScSdkPreferences) {
|
||||||
|
|
||||||
fun create(roomSummary: RoomSummary,
|
fun create(roomSummary: RoomSummary,
|
||||||
roomChangeMembershipStates: Map<String, ChangeMembershipState>,
|
roomChangeMembershipStates: Map<String, ChangeMembershipState>,
|
||||||
@ -85,7 +87,7 @@ class RoomSummaryItemFactory @Inject constructor(private val displayableEventFor
|
|||||||
val showSelected = selectedRoomIds.contains(roomSummary.roomId)
|
val showSelected = selectedRoomIds.contains(roomSummary.roomId)
|
||||||
var latestFormattedEvent: CharSequence = ""
|
var latestFormattedEvent: CharSequence = ""
|
||||||
var latestEventTime: CharSequence = ""
|
var latestEventTime: CharSequence = ""
|
||||||
val latestEvent = roomSummary.latestPreviewableEvent
|
val latestEvent = roomSummary.scLatestPreviewableEvent(scSdkPreferences)
|
||||||
if (latestEvent != null) {
|
if (latestEvent != null) {
|
||||||
val date = latestEvent.root.localDateTime()
|
val date = latestEvent.root.localDateTime()
|
||||||
val currentDate = DateProvider.currentLocalDateTime()
|
val currentDate = DateProvider.currentLocalDateTime()
|
||||||
@ -111,7 +113,7 @@ class RoomSummaryItemFactory @Inject constructor(private val displayableEventFor
|
|||||||
.showSelected(showSelected)
|
.showSelected(showSelected)
|
||||||
.hasFailedSending(roomSummary.hasFailedSending)
|
.hasFailedSending(roomSummary.hasFailedSending)
|
||||||
.unreadNotificationCount(unreadCount)
|
.unreadNotificationCount(unreadCount)
|
||||||
.hasUnreadMessage(roomSummary.hasUnreadMessages)
|
.hasUnreadMessage(roomSummary.scHasUnreadMessages(scSdkPreferences))
|
||||||
.hasDraft(roomSummary.userDrafts.isNotEmpty())
|
.hasDraft(roomSummary.userDrafts.isNotEmpty())
|
||||||
.itemLongClickListener { _ ->
|
.itemLongClickListener { _ ->
|
||||||
onLongClick?.invoke(roomSummary) ?: false
|
onLongClick?.invoke(roomSummary) ?: false
|
||||||
|
@ -29,6 +29,7 @@ import im.vector.app.R
|
|||||||
import im.vector.app.features.homeserver.ServerUrlsRepository
|
import im.vector.app.features.homeserver.ServerUrlsRepository
|
||||||
import im.vector.app.features.themes.ThemeUtils
|
import im.vector.app.features.themes.ThemeUtils
|
||||||
import org.matrix.android.sdk.api.extensions.tryThis
|
import org.matrix.android.sdk.api.extensions.tryThis
|
||||||
|
import org.matrix.android.sdk.api.session.room.model.RoomSummary
|
||||||
import timber.log.Timber
|
import timber.log.Timber
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
@ -96,7 +97,6 @@ class VectorPreferences @Inject constructor(private val context: Context) {
|
|||||||
private const val SETTINGS_SHOW_AVATAR_DISPLAY_NAME_CHANGES_MESSAGES_KEY = "SETTINGS_SHOW_AVATAR_DISPLAY_NAME_CHANGES_MESSAGES_KEY"
|
private const val SETTINGS_SHOW_AVATAR_DISPLAY_NAME_CHANGES_MESSAGES_KEY = "SETTINGS_SHOW_AVATAR_DISPLAY_NAME_CHANGES_MESSAGES_KEY"
|
||||||
private const val SETTINGS_VIBRATE_ON_MENTION_KEY = "SETTINGS_VIBRATE_ON_MENTION_KEY"
|
private const val SETTINGS_VIBRATE_ON_MENTION_KEY = "SETTINGS_VIBRATE_ON_MENTION_KEY"
|
||||||
private const val SETTINGS_SEND_MESSAGE_WITH_ENTER = "SETTINGS_SEND_MESSAGE_WITH_ENTER"
|
private const val SETTINGS_SEND_MESSAGE_WITH_ENTER = "SETTINGS_SEND_MESSAGE_WITH_ENTER"
|
||||||
const val SETTINGS_SINGLE_OVERVIEW = "SETTINGS_SINGLE_OVERVIEW"
|
|
||||||
|
|
||||||
// Help
|
// Help
|
||||||
private const val SETTINGS_SHOULD_SHOW_HELP_ON_ROOM_LIST_KEY = "SETTINGS_SHOULD_SHOW_HELP_ON_ROOM_LIST_KEY"
|
private const val SETTINGS_SHOULD_SHOW_HELP_ON_ROOM_LIST_KEY = "SETTINGS_SHOULD_SHOW_HELP_ON_ROOM_LIST_KEY"
|
||||||
@ -174,6 +174,10 @@ class VectorPreferences @Inject constructor(private val context: Context) {
|
|||||||
private const val DID_ASK_TO_USE_ANALYTICS_TRACKING_KEY = "DID_ASK_TO_USE_ANALYTICS_TRACKING_KEY"
|
private const val DID_ASK_TO_USE_ANALYTICS_TRACKING_KEY = "DID_ASK_TO_USE_ANALYTICS_TRACKING_KEY"
|
||||||
private const val SETTINGS_DISPLAY_ALL_EVENTS_KEY = "SETTINGS_DISPLAY_ALL_EVENTS_KEY"
|
private const val SETTINGS_DISPLAY_ALL_EVENTS_KEY = "SETTINGS_DISPLAY_ALL_EVENTS_KEY"
|
||||||
|
|
||||||
|
// SC additions
|
||||||
|
private const val SETTINGS_SINGLE_OVERVIEW = "SETTINGS_SINGLE_OVERVIEW"
|
||||||
|
private const val SETTINGS_ROOM_UNREAD_KIND = "SETTINGS_ROOM_UNREAD_KIND"
|
||||||
|
|
||||||
private const val DID_ASK_TO_ENABLE_SESSION_PUSH = "DID_ASK_TO_ENABLE_SESSION_PUSH"
|
private const val DID_ASK_TO_ENABLE_SESSION_PUSH = "DID_ASK_TO_ENABLE_SESSION_PUSH"
|
||||||
|
|
||||||
private const val MEDIA_SAVING_3_DAYS = 0
|
private const val MEDIA_SAVING_3_DAYS = 0
|
||||||
@ -825,10 +829,21 @@ class VectorPreferences @Inject constructor(private val context: Context) {
|
|||||||
return defaultPrefs.getBoolean(SETTINGS_SECURITY_USE_FLAG_SECURE, false)
|
return defaultPrefs.getBoolean(SETTINGS_SECURITY_USE_FLAG_SECURE, false)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SC addition
|
||||||
fun singleOverview(): Boolean {
|
fun singleOverview(): Boolean {
|
||||||
return defaultPrefs.getBoolean(SETTINGS_SINGLE_OVERVIEW, true)
|
return defaultPrefs.getBoolean(SETTINGS_SINGLE_OVERVIEW, true)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SC addition
|
||||||
|
fun roomUnreadKind(): Int {
|
||||||
|
val kind = defaultPrefs.getString(SETTINGS_ROOM_UNREAD_KIND, RoomSummary.UNREAD_KIND_CONTENT.toString())
|
||||||
|
return try {
|
||||||
|
Integer.parseInt(kind!!)
|
||||||
|
} catch (e: Exception) {
|
||||||
|
RoomSummary.UNREAD_KIND_CONTENT
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The user enable protecting app access with pin code
|
* The user enable protecting app access with pin code
|
||||||
*/
|
*/
|
||||||
|
@ -4,6 +4,11 @@
|
|||||||
<string name="settings_single_overview">Vereinte Chat-Übersicht</string>
|
<string name="settings_single_overview">Vereinte Chat-Übersicht</string>
|
||||||
<string name="settings_single_overview_summary">Zeige sowohl Direktnachrichten als auch Gruppenchats in einer gemeinsamen Übersicht</string>
|
<string name="settings_single_overview_summary">Zeige sowohl Direktnachrichten als auch Gruppenchats in einer gemeinsamen Übersicht</string>
|
||||||
|
|
||||||
|
<string name="settings_room_unread_kind">Chat-Vorschau</string>
|
||||||
|
<string name="settings_room_unread_kind_default">All Ereignisse</string>
|
||||||
|
<string name="settings_room_unread_kind_content">Verstecke Teilnehmerveränderungen</string>
|
||||||
|
<string name="settings_room_unread_kind_original_content">Verstecke Teilnehmerveränderungen und Reaktionen</string>
|
||||||
|
|
||||||
<string name="settings_dark_theme">Nacht-Design</string>
|
<string name="settings_dark_theme">Nacht-Design</string>
|
||||||
<string name="sc_light_theme">SC Hell</string>
|
<string name="sc_light_theme">SC Hell</string>
|
||||||
<string name="sc_theme">SC Schwarz</string>
|
<string name="sc_theme">SC Schwarz</string>
|
||||||
|
@ -12,4 +12,15 @@
|
|||||||
<item>both</item>
|
<item>both</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
|
|
||||||
|
<string-array name="room_unread_kind_entries" translatable="false">
|
||||||
|
<item>@string/settings_room_unread_kind_default</item>
|
||||||
|
<item>@string/settings_room_unread_kind_content</item>
|
||||||
|
<item>@string/settings_room_unread_kind_original_content</item>
|
||||||
|
</string-array>
|
||||||
|
<string-array name="room_unread_kind_values" translatable="false">
|
||||||
|
<item>0</item>
|
||||||
|
<item>1</item>
|
||||||
|
<item>2</item>
|
||||||
|
</string-array>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
|
@ -4,6 +4,11 @@
|
|||||||
<string name="settings_single_overview">Combined chat overview</string>
|
<string name="settings_single_overview">Combined chat overview</string>
|
||||||
<string name="settings_single_overview_summary">View both direct messages and rooms on one page</string>
|
<string name="settings_single_overview_summary">View both direct messages and rooms on one page</string>
|
||||||
|
|
||||||
|
<string name="settings_room_unread_kind">Chat preview content</string>
|
||||||
|
<string name="settings_room_unread_kind_default">Show all events</string>
|
||||||
|
<string name="settings_room_unread_kind_content">Hide member changes</string>
|
||||||
|
<string name="settings_room_unread_kind_original_content">Hide member changes and reactions</string>
|
||||||
|
|
||||||
<string name="settings_dark_theme">Night Theme</string>
|
<string name="settings_dark_theme">Night Theme</string>
|
||||||
<string name="sc_light_theme">SC Light</string>
|
<string name="sc_light_theme">SC Light</string>
|
||||||
<string name="sc_theme">SC Black</string>
|
<string name="sc_theme">SC Black</string>
|
||||||
|
@ -45,6 +45,14 @@
|
|||||||
android:summary="@string/settings_single_overview_summary"
|
android:summary="@string/settings_single_overview_summary"
|
||||||
android:title="@string/settings_single_overview" />
|
android:title="@string/settings_single_overview" />
|
||||||
|
|
||||||
|
<im.vector.app.core.preference.VectorListPreference
|
||||||
|
android:defaultValue="1"
|
||||||
|
android:entries="@array/room_unread_kind_entries"
|
||||||
|
android:entryValues="@array/room_unread_kind_values"
|
||||||
|
android:key="SETTINGS_ROOM_UNREAD_KIND"
|
||||||
|
android:summary="%s"
|
||||||
|
android:title="@string/settings_room_unread_kind" />
|
||||||
|
|
||||||
<im.vector.app.core.preference.VectorPreference
|
<im.vector.app.core.preference.VectorPreference
|
||||||
android:dialogTitle="@string/font_size"
|
android:dialogTitle="@string/font_size"
|
||||||
android:key="SETTINGS_INTERFACE_TEXT_SIZE_KEY"
|
android:key="SETTINGS_INTERFACE_TEXT_SIZE_KEY"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user