Mark rooms as read on push and pop. (#462)

We don't have visibility into timeline item read status so can't do this continuously yet.

* Simplify RoomTimelineProvider's responsibilities.
This commit is contained in:
Doug
2023-01-18 15:14:03 +00:00
committed by GitHub
parent 6615116226
commit 5017ba7122
14 changed files with 183 additions and 226 deletions
@@ -29,6 +29,7 @@ struct MockRoomProxy: RoomProxyProtocol {
var isPublic = Bool.random()
var isEncrypted = Bool.random()
var isTombstoned = Bool.random()
var hasUnreadNotifications = Bool.random()
var members: [RoomMemberProxy]?
let timelineProvider: RoomTimelineProviderProtocol = MockRoomTimelineProvider()
@@ -58,16 +59,20 @@ struct MockRoomProxy: RoomProxyProtocol {
func paginateBackwards(requestSize: UInt, untilNumberOfItems: UInt) async -> Result<Void, RoomProxyError> {
.failure(.failedPaginatingBackwards)
}
func sendReadReceipt(for eventID: String) async -> Result<Void, RoomProxyError> {
.failure(.failedSendingReadReceipt)
}
func sendMessage(_ message: String, inReplyToEventId: String? = nil) async -> Result<Void, RoomProxyError> {
func sendMessage(_ message: String, inReplyTo eventID: String? = nil) async -> Result<Void, RoomProxyError> {
.failure(.failedSendingMessage)
}
func sendReaction(_ reaction: String, for eventId: String) async -> Result<Void, RoomProxyError> {
func sendReaction(_ reaction: String, to eventID: String) async -> Result<Void, RoomProxyError> {
.failure(.failedSendingMessage)
}
func editMessage(_ newMessage: String, originalEventId: String) async -> Result<Void, RoomProxyError> {
func editMessage(_ newMessage: String, original eventID: String) async -> Result<Void, RoomProxyError> {
.failure(.failedSendingMessage)
}
@@ -82,5 +87,5 @@ struct MockRoomProxy: RoomProxyProtocol {
return .failure(.failedRetrievingMembers)
}
func retryDecryption(forSessionId sessionId: String) async { }
func retryDecryption(for sessionID: String) async { }
}
+43 -18
View File
@@ -24,6 +24,7 @@ class RoomProxy: RoomProxyProtocol {
private let slidingSyncRoom: SlidingSyncRoomProtocol
private let room: RoomProtocol
private let backgroundTaskService: BackgroundTaskServiceProtocol
private let backgroundTaskName = "SendRoomEvent"
private let serialDispatchQueue = DispatchQueue(label: "io.element.elementx.roomproxy.serial")
@@ -82,6 +83,10 @@ class RoomProxy: RoomProxyProtocol {
room.isTombstoned()
}
var hasUnreadNotifications: Bool {
slidingSyncRoom.hasUnreadNotifications()
}
var avatarURL: URL? {
room.avatarUrl().flatMap(URL.init(string:))
}
@@ -156,18 +161,34 @@ class RoomProxy: RoomProxyProtocol {
}
}
func sendMessage(_ message: String, inReplyToEventId: String? = nil) async -> Result<Void, RoomProxyError> {
sendMessageBackgroundTask = backgroundTaskService.startBackgroundTask(withName: "SendMessage", isReusable: true)
func sendReadReceipt(for eventID: String) async -> Result<Void, RoomProxyError> {
sendMessageBackgroundTask = backgroundTaskService.startBackgroundTask(withName: backgroundTaskName, isReusable: true)
defer {
sendMessageBackgroundTask?.stop()
}
return await Task.dispatch(on: serialDispatchQueue) {
do {
try self.room.sendReadReceipt(eventId: eventID)
return .success(())
} catch {
return .failure(.failedSendingReadReceipt)
}
}
}
func sendMessage(_ message: String, inReplyTo eventID: String? = nil) async -> Result<Void, RoomProxyError> {
sendMessageBackgroundTask = backgroundTaskService.startBackgroundTask(withName: backgroundTaskName, isReusable: true)
defer {
sendMessageBackgroundTask?.stop()
}
let transactionId = genTransactionId()
return await Task.dispatch(on: .global()) {
return await Task.dispatch(on: serialDispatchQueue) {
do {
if let inReplyToEventId {
try self.room.sendReply(msg: message, inReplyToEventId: inReplyToEventId, txnId: transactionId)
if let eventID {
try self.room.sendReply(msg: message, inReplyToEventId: eventID, txnId: transactionId)
} else {
let messageContent = messageEventContentFromMarkdown(md: message)
try self.room.send(msg: messageContent, txnId: transactionId)
@@ -179,15 +200,15 @@ class RoomProxy: RoomProxyProtocol {
}
}
func sendReaction(_ reaction: String, for eventId: String) async -> Result<Void, RoomProxyError> {
sendMessageBackgroundTask = backgroundTaskService.startBackgroundTask(withName: "SendMessage", isReusable: true)
func sendReaction(_ reaction: String, to eventID: String) async -> Result<Void, RoomProxyError> {
sendMessageBackgroundTask = backgroundTaskService.startBackgroundTask(withName: backgroundTaskName, isReusable: true)
defer {
sendMessageBackgroundTask?.stop()
}
return await Task.dispatch(on: .global()) {
return await Task.dispatch(on: serialDispatchQueue) {
do {
try self.room.sendReaction(eventId: eventId, key: reaction)
try self.room.sendReaction(eventId: eventID, key: reaction)
return .success(())
} catch {
return .failure(.failedSendingReaction)
@@ -195,17 +216,17 @@ class RoomProxy: RoomProxyProtocol {
}
}
func editMessage(_ newMessage: String, originalEventId: String) async -> Result<Void, RoomProxyError> {
sendMessageBackgroundTask = backgroundTaskService.startBackgroundTask(withName: "SendMessage", isReusable: true)
func editMessage(_ newMessage: String, original eventID: String) async -> Result<Void, RoomProxyError> {
sendMessageBackgroundTask = backgroundTaskService.startBackgroundTask(withName: backgroundTaskName, isReusable: true)
defer {
sendMessageBackgroundTask?.stop()
}
let transactionId = genTransactionId()
return await Task.dispatch(on: .global()) {
return await Task.dispatch(on: serialDispatchQueue) {
do {
try self.room.edit(newMsg: newMessage, originalEventId: originalEventId, txnId: transactionId)
try self.room.edit(newMsg: newMessage, originalEventId: eventID, txnId: transactionId)
return .success(())
} catch {
return .failure(.failedEditingMessage)
@@ -214,17 +235,21 @@ class RoomProxy: RoomProxyProtocol {
}
func redact(_ eventID: String) async -> Result<Void, RoomProxyError> {
sendMessageBackgroundTask = backgroundTaskService.startBackgroundTask(withName: backgroundTaskName, isReusable: true)
defer {
sendMessageBackgroundTask?.stop()
}
let transactionID = genTransactionId()
return await Task {
return await Task.dispatch(on: serialDispatchQueue) {
do {
try room.redact(eventId: eventID, reason: nil, txnId: transactionID)
try self.room.redact(eventId: eventID, reason: nil, txnId: transactionID)
return .success(())
} catch {
return .failure(.failedRedactingEvent)
}
}
.value
}
func members() async -> Result<[RoomMemberProxy], RoomProxyError> {
@@ -238,9 +263,9 @@ class RoomProxy: RoomProxyProtocol {
}
}
func retryDecryption(forSessionId sessionId: String) async {
func retryDecryption(for sessionID: String) async {
await Task.dispatch(on: .global()) { [weak self] in
self?.room.retryDecryption(sessionIds: [sessionId])
self?.room.retryDecryption(sessionIds: [sessionID])
}
}
@@ -23,6 +23,7 @@ enum RoomProxyError: Error {
case failedPaginatingBackwards
case failedRetrievingMemberAvatarURL
case failedRetrievingMemberDisplayName
case failedSendingReadReceipt
case failedSendingMessage
case failedSendingReaction
case failedEditingMessage
@@ -39,6 +40,7 @@ protocol RoomProxyProtocol {
var isSpace: Bool { get }
var isEncrypted: Bool { get }
var isTombstoned: Bool { get }
var hasUnreadNotifications: Bool { get }
var name: String? { get }
var displayName: String? { get }
@@ -59,21 +61,23 @@ protocol RoomProxyProtocol {
func paginateBackwards(requestSize: UInt, untilNumberOfItems: UInt) async -> Result<Void, RoomProxyError>
func sendMessage(_ message: String, inReplyToEventId: String?) async -> Result<Void, RoomProxyError>
func sendReadReceipt(for eventID: String) async -> Result<Void, RoomProxyError>
func sendReaction(_ reaction: String, for eventId: String) async -> Result<Void, RoomProxyError>
func sendMessage(_ message: String, inReplyTo eventID: String?) async -> Result<Void, RoomProxyError>
func sendReaction(_ reaction: String, to eventID: String) async -> Result<Void, RoomProxyError>
func editMessage(_ newMessage: String, originalEventId: String) async -> Result<Void, RoomProxyError>
func editMessage(_ newMessage: String, original eventID: String) async -> Result<Void, RoomProxyError>
func redact(_ eventID: String) async -> Result<Void, RoomProxyError>
func members() async -> Result<[RoomMemberProxy], RoomProxyError>
func retryDecryption(forSessionId sessionId: String) async
func retryDecryption(for sessionID: String) async
}
extension RoomProxyProtocol {
func sendMessage(_ message: String) async -> Result<Void, RoomProxyError> {
await sendMessage(message, inReplyToEventId: nil)
await sendMessage(message, inReplyTo: nil)
}
}