Skip to content

Commit d9dc3e8

Browse files
committed
Filter conversation and time
1 parent f8822b2 commit d9dc3e8

16 files changed

+318
-132
lines changed

Mixin.xcodeproj/project.pbxproj

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -625,7 +625,7 @@
625625
7C7635B826A13461006101DB /* HomeAppsConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C7635B726A13461006101DB /* HomeAppsConstants.swift */; };
626626
7C7DBAD62A2F3464008D4B0E /* DeviceTransferDateSelectionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C7DBAD52A2F3464008D4B0E /* DeviceTransferDateSelectionViewController.swift */; };
627627
7C7DBAD82A2F34CC008D4B0E /* DeviceTransferConversationSelectionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C7DBAD72A2F34CC008D4B0E /* DeviceTransferConversationSelectionViewController.swift */; };
628-
7C7DBADA2A2F391C008D4B0E /* DeviceTransferRange.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C7DBAD92A2F391C008D4B0E /* DeviceTransferRange.swift */; };
628+
7C7DBADA2A2F391C008D4B0E /* DeviceTransferFilter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C7DBAD92A2F391C008D4B0E /* DeviceTransferFilter.swift */; };
629629
7C8CC5A4280D347A00F7CBDF /* PreviewWallpaperViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C8CC5A2280D347A00F7CBDF /* PreviewWallpaperViewController.swift */; };
630630
7C8CC5A7280D40E900F7CBDF /* PreviewWallpaperCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C8CC5A6280D40E900F7CBDF /* PreviewWallpaperCell.swift */; };
631631
7C8FA78D27687D1500855AFD /* DeleteAccountSettingViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C8FA78C27687D1500855AFD /* DeleteAccountSettingViewController.swift */; };
@@ -1704,7 +1704,7 @@
17041704
7C7635B726A13461006101DB /* HomeAppsConstants.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeAppsConstants.swift; sourceTree = "<group>"; };
17051705
7C7DBAD52A2F3464008D4B0E /* DeviceTransferDateSelectionViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeviceTransferDateSelectionViewController.swift; sourceTree = "<group>"; };
17061706
7C7DBAD72A2F34CC008D4B0E /* DeviceTransferConversationSelectionViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeviceTransferConversationSelectionViewController.swift; sourceTree = "<group>"; };
1707-
7C7DBAD92A2F391C008D4B0E /* DeviceTransferRange.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeviceTransferRange.swift; sourceTree = "<group>"; };
1707+
7C7DBAD92A2F391C008D4B0E /* DeviceTransferFilter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeviceTransferFilter.swift; sourceTree = "<group>"; };
17081708
7C8CC5A2280D347A00F7CBDF /* PreviewWallpaperViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PreviewWallpaperViewController.swift; sourceTree = "<group>"; };
17091709
7C8CC5A6280D40E900F7CBDF /* PreviewWallpaperCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PreviewWallpaperCell.swift; sourceTree = "<group>"; };
17101710
7C8FA78C27687D1500855AFD /* DeleteAccountSettingViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeleteAccountSettingViewController.swift; sourceTree = "<group>"; };
@@ -2801,7 +2801,7 @@
28012801
7C7579D529DC573F0002DA0B /* DeviceTransferProgressViewController.swift */,
28022802
7C7DBAD72A2F34CC008D4B0E /* DeviceTransferConversationSelectionViewController.swift */,
28032803
7C7DBAD52A2F3464008D4B0E /* DeviceTransferDateSelectionViewController.swift */,
2804-
7C7DBAD92A2F391C008D4B0E /* DeviceTransferRange.swift */,
2804+
7C7DBAD92A2F391C008D4B0E /* DeviceTransferFilter.swift */,
28052805
);
28062806
path = DeviceTransfer;
28072807
sourceTree = "<group>";
@@ -5160,7 +5160,7 @@
51605160
7B57186E24D9375300682D86 /* MixinAPIError+Description.swift in Sources */,
51615161
E0320FA523CC3D1600A651D4 /* MessageTagLabel.swift in Sources */,
51625162
7B333A8623406AD000FDA848 /* GalleryTransitionFromMessageCellView.swift in Sources */,
5163-
7C7DBADA2A2F391C008D4B0E /* DeviceTransferRange.swift in Sources */,
5163+
7C7DBADA2A2F391C008D4B0E /* DeviceTransferFilter.swift in Sources */,
51645164
7B54F95922B243EA00908A9D /* EmergencyContactVerifyPinViewController.swift in Sources */,
51655165
7B68F78B2191741300B79978 /* BiometryType.swift in Sources */,
51665166
7BD0532820A41F6A00C36F69 /* RangeExtension.swift in Sources */,

Mixin/Service/DeviceTransfer/DeviceTransferServer.swift

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ final class DeviceTransferServer {
2525
// Access on main queue
2626
@Published private(set) var lastConnectionRejectedReason: ConnectionRejectedReason?
2727

28-
private let range: DeviceTransferRange
28+
private let filter: DeviceTransferFilter
2929
private let queue = Queue(label: "one.mixin.messenger.DeviceTransferServer")
3030
private let dataLoaderQueue = Queue(label: "one.mixin.messenger.DeviceTransferServer.Loader")
3131
private let speedInspector = NetworkSpeedInspector()
@@ -42,9 +42,9 @@ final class DeviceTransferServer {
4242
Unmanaged<DeviceTransferServer>.passUnretained(self).toOpaque()
4343
}
4444

45-
init(range: DeviceTransferRange) {
46-
self.range = range
47-
Logger.general.info(category: "DeviceTransferServer", message: "\(opaquePointer) init with range: \(range)")
45+
init(filter: DeviceTransferFilter) {
46+
self.filter = filter
47+
Logger.general.info(category: "DeviceTransferServer", message: "\(opaquePointer) init with filter: \(filter)")
4848
}
4949

5050
deinit {
@@ -322,7 +322,7 @@ extension DeviceTransferServer {
322322
Logger.general.warn(category: "DeviceTransferServer", message: "Not transfering due to invalid state")
323323
return
324324
}
325-
let dataSource = DeviceTransferServerDataSource(key: key, remotePlatform: remotePlatform)
325+
let dataSource = DeviceTransferServerDataSource(key: key, remotePlatform: remotePlatform, filter: filter)
326326
let count = dataSource.totalCount()
327327
let start = DeviceTransferCommand(action: .start(count))
328328
do {

Mixin/Service/DeviceTransfer/DeviceTransferServerDataSource.swift

Lines changed: 89 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,17 @@ final class DeviceTransferServerDataSource {
99
private let key: DeviceTransferKey
1010
private let remotePlatform: DeviceTransferPlatform
1111
private let fileContentBuffer: UnsafeMutablePointer<UInt8>
12+
private let conversationIDs: String?
13+
private let fromDate: String?
14+
private let needsFilterData: Bool
1215

13-
init(key: DeviceTransferKey, remotePlatform: DeviceTransferPlatform) {
16+
init(key: DeviceTransferKey, remotePlatform: DeviceTransferPlatform, filter: DeviceTransferFilter) {
1417
self.key = key
1518
self.remotePlatform = remotePlatform
1619
self.fileContentBuffer = .allocate(capacity: fileChunkSize)
20+
conversationIDs = filter.conversation.joinedIDs
21+
fromDate = filter.time.utcString
22+
needsFilterData = conversationIDs != nil || fromDate != nil
1723
}
1824

1925
deinit {
@@ -27,22 +33,27 @@ extension DeviceTransferServerDataSource {
2733

2834
func totalCount() -> Int {
2935
assert(!Queue.main.isCurrent)
30-
let messagesCount = MessageDAO.shared.messagesCount()
31-
let attachmentsCount = attachmentsCount()
32-
let total = ConversationDAO.shared.conversationsCount()
33-
+ ParticipantDAO.shared.participantsCount()
36+
let messagesCount = MessageDAO.shared.messagesCount(matching: conversationIDs, sinceDate: fromDate)
37+
let attachmentsCount = needsFilterData
38+
? MessageDAO.shared.mediaMessagesCount(matching: conversationIDs)
39+
: attachmentsCount()
40+
let transcriptMessageCount = needsFilterData
41+
? MessageDAO.shared.transcriptMessageCount(matching: conversationIDs, sinceDate: fromDate)
42+
: TranscriptMessageDAO.shared.transcriptMessagesCount()
43+
let total = ConversationDAO.shared.conversationsCount(matching: conversationIDs)
44+
+ ParticipantDAO.shared.participantsCount(matching: conversationIDs)
3445
+ UserDAO.shared.usersCount()
3546
+ AppDAO.shared.appsCount()
3647
+ AssetDAO.shared.assetsCount()
3748
+ SnapshotDAO.shared.snapshotsCount()
3849
+ StickerDAO.shared.stickersCount()
39-
+ PinMessageDAO.shared.pinMessagesCount()
40-
+ TranscriptMessageDAO.shared.transcriptMessagesCount()
50+
+ PinMessageDAO.shared.pinMessagesCount(matching: conversationIDs, sinceDate: fromDate)
51+
+ transcriptMessageCount
4152
+ messagesCount
42-
+ MessageMentionDAO.shared.messageMentionsCount()
53+
+ MessageMentionDAO.shared.messageMentionsCount(matching: conversationIDs)
4354
+ ExpiredMessageDAO.shared.expiredMessagesCount()
4455
+ attachmentsCount
45-
Logger.general.info(category: "DeviceTransferServerDataSource", message: "Total: \(total), Messages: \(messagesCount), attachments: \(attachmentsCount)")
56+
Logger.general.info(category: "DeviceTransferServerDataSource", message: "Total: \(total), Messages: \(messagesCount), attachments: \(attachmentsCount), transcriptMessageCount: \(transcriptMessageCount)")
4657
return total
4758
}
4859

@@ -156,7 +167,9 @@ extension DeviceTransferServerDataSource {
156167
let databaseItemCount: Int
157168
switch location.type {
158169
case .conversation:
159-
let conversations = ConversationDAO.shared.conversations(limit: limit, after: location.primaryID)
170+
let conversations = ConversationDAO.shared.conversations(limit: limit,
171+
after: location.primaryID,
172+
matching: conversationIDs)
160173
databaseItemCount = conversations.count
161174
nextPrimaryID = conversations.last?.conversationId
162175
nextSecondaryID = nil
@@ -171,7 +184,10 @@ extension DeviceTransferServerDataSource {
171184
}
172185
}
173186
case .participant:
174-
let participants = ParticipantDAO.shared.participants(limit: limit, after: location.primaryID, with: location.secondaryID)
187+
let participants = ParticipantDAO.shared.participants(limit: limit,
188+
after: location.primaryID,
189+
with: location.secondaryID,
190+
matching: conversationIDs)
175191
databaseItemCount = participants.count
176192
nextPrimaryID = participants.last?.conversationId
177193
nextSecondaryID = participants.last?.userId
@@ -261,7 +277,10 @@ extension DeviceTransferServerDataSource {
261277
}
262278
}
263279
case .pinMessage:
264-
let pinMessages = PinMessageDAO.shared.pinMessages(limit: limit, after: location.primaryID)
280+
let pinMessages = PinMessageDAO.shared.pinMessages(limit: limit,
281+
after: location.primaryID,
282+
matching: conversationIDs,
283+
sinceDate: fromDate)
265284
databaseItemCount = pinMessages.count
266285
nextPrimaryID = pinMessages.last?.messageId
267286
nextSecondaryID = nil
@@ -276,49 +295,61 @@ extension DeviceTransferServerDataSource {
276295
}
277296
}
278297
case .transcriptMessage:
279-
let transcriptMessages = TranscriptMessageDAO.shared.transcriptMessages(limit: limit, after: location.primaryID, with: location.secondaryID)
280-
databaseItemCount = transcriptMessages.count
281-
nextPrimaryID = transcriptMessages.last?.transcriptId
282-
nextSecondaryID = transcriptMessages.last?.messageId
283-
transferItems = transcriptMessages.compactMap { transcriptMessage in
284-
let deviceTransferTranscriptMessage = DeviceTransferTranscriptMessage(transcriptMessage: transcriptMessage, to: remotePlatform)
285-
do {
286-
let outputData = try DeviceTransferProtocol.output(type: location.type, data: deviceTransferTranscriptMessage, key: key)
287-
if let mediaURL = transcriptMessage.mediaUrl, !mediaURL.isEmpty, transcriptMessage.mediaStatus == MediaStatus.DONE.rawValue {
288-
let url = AttachmentContainer.url(transcriptId: transcriptMessage.transcriptId, filename: mediaURL)
289-
let attachment = TransferItem.Attachment(messageID: transcriptMessage.messageId, url: url)
290-
return TransferItem(rawItem: transcriptMessage, outputData: outputData, attachment: attachment)
291-
} else {
292-
return TransferItem(rawItem: transcriptMessage, outputData: outputData, attachment: nil)
293-
}
294-
} catch {
295-
Logger.general.error(category: "DeviceTransferServerDataSource", message: "Failed to output: \(error)")
296-
return nil
297-
}
298+
if needsFilterData {
299+
databaseItemCount = 0
300+
nextPrimaryID = nil
301+
nextSecondaryID = nil
302+
transferItems = []
303+
} else {
304+
let transcriptMessages = TranscriptMessageDAO.shared.transcriptMessages(limit: limit, after: location.primaryID, with: location.secondaryID)
305+
databaseItemCount = transcriptMessages.count
306+
nextPrimaryID = transcriptMessages.last?.transcriptId
307+
nextSecondaryID = transcriptMessages.last?.messageId
308+
transferItems = transcriptTransferItems(for: transcriptMessages)
298309
}
299310
case .message:
300-
let messages = MessageDAO.shared.messages(limit: limit, after: location.primaryID)
311+
let messages = MessageDAO.shared.messages(limit: limit,
312+
after: location.primaryID,
313+
matching: conversationIDs,
314+
sinceDate: fromDate)
301315
databaseItemCount = messages.count
302316
nextPrimaryID = messages.last?.messageId
303317
nextSecondaryID = nil
304-
transferItems = messages.compactMap { message in
318+
var messageItems = [TransferItem]()
319+
var transcriptMessageItems = [TransferItem]()
320+
var transcriptMessageCount = 0
321+
for message in messages {
305322
let deviceTransferMessage = DeviceTransferMessage(message: message, to: remotePlatform)
306323
do {
307324
let outputData = try DeviceTransferProtocol.output(type: location.type, data: deviceTransferMessage, key: key)
325+
let attachment: TransferItem.Attachment?
308326
if let mediaURL = message.mediaUrl, !mediaURL.isEmpty, message.mediaStatus == MediaStatus.DONE.rawValue, let category = AttachmentContainer.Category(messageCategory: message.category) {
309327
let url = AttachmentContainer.url(for: category, filename: mediaURL)
310-
let attachment = TransferItem.Attachment(messageID: message.messageId, url: url)
311-
return TransferItem(rawItem: message, outputData: outputData, attachment: attachment)
328+
attachment = TransferItem.Attachment(messageID: message.messageId, url: url)
312329
} else {
313-
return TransferItem(rawItem: message, outputData: outputData, attachment: nil)
330+
attachment = nil
331+
}
332+
if let item = TransferItem(rawItem: message, outputData: outputData, attachment: attachment) {
333+
messageItems.append(item)
314334
}
315335
} catch {
316-
Logger.general.error(category: "DeviceTransferServerDataSource", message: "Failed to output: \(error)")
317-
return nil
336+
Logger.general.error(category: "DeviceTransferServerDataSource", message: "Failed to output message: \(error)")
318337
}
338+
// TranscriptMessage
339+
if needsFilterData && message.category.hasSuffix("_TRANSCRIPT") {
340+
transcriptMessageCount += 1
341+
let transcriptMessages = TranscriptMessageDAO.shared.transcriptMessages(transcriptId: message.messageId)
342+
transcriptMessageItems = transcriptTransferItems(for: transcriptMessages)
343+
}
344+
}
345+
if transcriptMessageCount != 0 {
346+
Logger.general.info(category: "DeviceTransferServerDataSource", message: "Send transcriptMessages along with messages: \(transcriptMessageCount)")
319347
}
348+
transferItems = transcriptMessageItems + messageItems
320349
case .messageMention:
321-
let messageMentions = MessageMentionDAO.shared.messageMentions(limit: limit, after: location.primaryID)
350+
let messageMentions = MessageMentionDAO.shared.messageMentions(limit: limit,
351+
after: location.primaryID,
352+
matching: conversationIDs)
322353
databaseItemCount = messageMentions.count
323354
nextPrimaryID = messageMentions.last?.messageId
324355
nextSecondaryID = nil
@@ -430,4 +461,23 @@ extension DeviceTransferServerDataSource {
430461
return true
431462
}
432463

464+
private func transcriptTransferItems(for transcriptMessages: [TranscriptMessage]) -> [TransferItem] {
465+
transcriptMessages.compactMap { transcriptMessage in
466+
let deviceTransferTranscriptMessage = DeviceTransferTranscriptMessage(transcriptMessage: transcriptMessage, to: remotePlatform)
467+
do {
468+
let outputData = try DeviceTransferProtocol.output(type: .transcriptMessage, data: deviceTransferTranscriptMessage, key: key)
469+
if let mediaURL = transcriptMessage.mediaUrl, !mediaURL.isEmpty, transcriptMessage.mediaStatus == MediaStatus.DONE.rawValue {
470+
let url = AttachmentContainer.url(transcriptId: transcriptMessage.transcriptId, filename: mediaURL)
471+
let attachment = TransferItem.Attachment(messageID: transcriptMessage.messageId, url: url)
472+
return TransferItem(rawItem: transcriptMessage, outputData: outputData, attachment: attachment)
473+
} else {
474+
return TransferItem(rawItem: transcriptMessage, outputData: outputData, attachment: nil)
475+
}
476+
} catch {
477+
Logger.general.error(category: "DeviceTransferServerDataSource", message: "Failed to output: \(error)")
478+
return nil
479+
}
480+
}
481+
}
482+
433483
}

0 commit comments

Comments
 (0)