mirror of
https://github.com/Novaloop-AG/element-x-ios.git
synced 2026-11-03 16:10:20 +00:00
Add encryption history banner and update session verification banner strings. (#1250)
* Add a hard wall on back-pagination in encrypted rooms. Until the app supports key backup, the history will never be decryptable. * Fix initial display of the timeline table view. * Update session verification banner strings.
This commit is contained in:
+1
-2
@@ -17,8 +17,7 @@
|
||||
import Foundation
|
||||
|
||||
struct MockRoomTimelineControllerFactory: RoomTimelineControllerFactoryProtocol {
|
||||
func buildRoomTimelineController(userId: String,
|
||||
roomProxy: RoomProxyProtocol,
|
||||
func buildRoomTimelineController(roomProxy: RoomProxyProtocol,
|
||||
timelineItemFactory: RoomTimelineItemFactoryProtocol,
|
||||
mediaProvider: MediaProviderProtocol) -> RoomTimelineControllerProtocol {
|
||||
let timelineController = MockRoomTimelineController()
|
||||
|
||||
@@ -19,7 +19,6 @@ import Foundation
|
||||
import UIKit
|
||||
|
||||
class RoomTimelineController: RoomTimelineControllerProtocol {
|
||||
private let userId: String
|
||||
private let roomProxy: RoomProxyProtocol
|
||||
private let timelineProvider: RoomTimelineProviderProtocol
|
||||
private let timelineItemFactory: RoomTimelineItemFactoryProtocol
|
||||
@@ -42,12 +41,10 @@ class RoomTimelineController: RoomTimelineControllerProtocol {
|
||||
roomProxy.id
|
||||
}
|
||||
|
||||
init(userId: String,
|
||||
roomProxy: RoomProxyProtocol,
|
||||
init(roomProxy: RoomProxyProtocol,
|
||||
timelineItemFactory: RoomTimelineItemFactoryProtocol,
|
||||
mediaProvider: MediaProviderProtocol,
|
||||
appSettings: AppSettings) {
|
||||
self.userId = userId
|
||||
self.roomProxy = roomProxy
|
||||
timelineProvider = roomProxy.timelineProvider
|
||||
self.timelineItemFactory = timelineItemFactory
|
||||
@@ -246,6 +243,7 @@ class RoomTimelineController: RoomTimelineControllerProtocol {
|
||||
var newTimelineItems = [RoomTimelineItemProtocol]()
|
||||
var canBackPaginate = true
|
||||
var isBackPaginating = false
|
||||
var lastEncryptedHistoryItemIndex: Int?
|
||||
|
||||
let collapsibleChunks = timelineProvider.itemsPublisher.value.groupBy { isItemCollapsible($0) }
|
||||
|
||||
@@ -264,6 +262,8 @@ class RoomTimelineController: RoomTimelineControllerProtocol {
|
||||
isBackPaginating = true
|
||||
} else if timelineItem is TimelineStartRoomTimelineItem {
|
||||
canBackPaginate = false
|
||||
} else if timelineItem is EncryptedHistoryRoomTimelineItem {
|
||||
canBackPaginate = false
|
||||
}
|
||||
|
||||
return timelineItem
|
||||
@@ -280,11 +280,21 @@ class RoomTimelineController: RoomTimelineControllerProtocol {
|
||||
continue
|
||||
}
|
||||
|
||||
if timelineItem is EncryptedHistoryRoomTimelineItem {
|
||||
lastEncryptedHistoryItemIndex = newTimelineItems.endIndex
|
||||
}
|
||||
|
||||
newTimelineItems.append(timelineItem)
|
||||
} else {
|
||||
newTimelineItems.append(CollapsibleTimelineItem(items: items))
|
||||
}
|
||||
}
|
||||
|
||||
if let lastEncryptedHistoryItemIndex {
|
||||
// Remove everything up to the last encrypted history item.
|
||||
// It only contains encrypted messages, state changes and date separators.
|
||||
newTimelineItems.removeFirst(lastEncryptedHistoryItemIndex)
|
||||
}
|
||||
|
||||
timelineItems = newTimelineItems
|
||||
|
||||
@@ -298,6 +308,10 @@ class RoomTimelineController: RoomTimelineControllerProtocol {
|
||||
case .event(let eventTimelineItem):
|
||||
let timelineItem = timelineItemFactory.buildTimelineItem(for: eventTimelineItem)
|
||||
|
||||
if timelineItem is EncryptedRoomTimelineItem, isItemInEncryptionHistory(eventTimelineItem) {
|
||||
return EncryptedHistoryRoomTimelineItem(id: eventTimelineItem.id)
|
||||
}
|
||||
|
||||
if let messageTimelineItem = timelineItem as? EventBasedMessageTimelineItemProtocol {
|
||||
// Avoid fetching this over and over again as it changes states if it keeps failing to load
|
||||
// Errors will be handled again on appearance
|
||||
@@ -326,6 +340,13 @@ class RoomTimelineController: RoomTimelineControllerProtocol {
|
||||
}
|
||||
}
|
||||
|
||||
/// Whether or not a specific item is part of the room's history that can't be decrypted due
|
||||
/// to the lack of key-backup. This is handled differently so we only show a single item.
|
||||
private func isItemInEncryptionHistory(_ itemProxy: EventTimelineItemProxy) -> Bool {
|
||||
guard roomProxy.isEncrypted, let lastLoginDate = appSettings.lastLoginDate else { return false }
|
||||
return itemProxy.timestamp < lastLoginDate
|
||||
}
|
||||
|
||||
private func isItemCollapsible(_ item: TimelineItemProxy) -> Bool {
|
||||
if !appSettings.shouldCollapseRoomStateEvents {
|
||||
return false
|
||||
|
||||
+2
-4
@@ -17,12 +17,10 @@
|
||||
import Foundation
|
||||
|
||||
struct RoomTimelineControllerFactory: RoomTimelineControllerFactoryProtocol {
|
||||
func buildRoomTimelineController(userId: String,
|
||||
roomProxy: RoomProxyProtocol,
|
||||
func buildRoomTimelineController(roomProxy: RoomProxyProtocol,
|
||||
timelineItemFactory: RoomTimelineItemFactoryProtocol,
|
||||
mediaProvider: MediaProviderProtocol) -> RoomTimelineControllerProtocol {
|
||||
RoomTimelineController(userId: userId,
|
||||
roomProxy: roomProxy,
|
||||
RoomTimelineController(roomProxy: roomProxy,
|
||||
timelineItemFactory: timelineItemFactory,
|
||||
mediaProvider: mediaProvider,
|
||||
appSettings: ServiceLocator.shared.settings)
|
||||
|
||||
+1
-2
@@ -18,8 +18,7 @@ import Foundation
|
||||
|
||||
@MainActor
|
||||
protocol RoomTimelineControllerFactoryProtocol {
|
||||
func buildRoomTimelineController(userId: String,
|
||||
roomProxy: RoomProxyProtocol,
|
||||
func buildRoomTimelineController(roomProxy: RoomProxyProtocol,
|
||||
timelineItemFactory: RoomTimelineItemFactoryProtocol,
|
||||
mediaProvider: MediaProviderProtocol) -> RoomTimelineControllerProtocol
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user