Make syncing strategy consistent with Android

pull/228/head
nielsandriesse 4 years ago
parent e5f8dd277e
commit 42cd30cf23

@ -194,9 +194,6 @@ final class DeviceLinkingModal : Modal, DeviceLinkingSessionDelegate {
// to the AFR mechanism
let _ = SSKEnvironment.shared.syncManager.syncAllContacts()
}
let blockedContacts = SSKEnvironment.shared.blockingManager.blockedPhoneNumbers()
let blockedContactsSyncMessage = OWSBlockedPhoneNumbersMessage(phoneNumbers: blockedContacts, groupIds: [])
SSKEnvironment.shared.messageSender.send(blockedContactsSyncMessage, success: { }) { _ in }
let _ = SSKEnvironment.shared.syncManager.syncAllOpenGroups()
DispatchQueue.main.async {
self?.dismiss(animated: true, completion: nil)

@ -1,14 +1,14 @@
@objc public final class ContactParser : NSObject {
public final class ContactParser {
private let data: Data
@objc public init(data: Data) {
public init(data: Data) {
self.data = data
}
@objc public func parseHexEncodedPublicKeys() -> [String] {
public func parse() -> [(publicKey: String, isBlocked: Bool)] {
var index = 0
var result: [String] = []
var result: [(String, Bool)] = []
while index < data.endIndex {
var uncheckedSize: UInt32? = try? data[index..<(index+4)].withUnsafeBytes { $0.pointee }
if let size = uncheckedSize, size >= data.count, let intermediate = try? data[index..<(index+4)].reversed() {
@ -21,7 +21,7 @@
let protoAsData = data[index..<(index+sizeAsInt)]
guard let proto = try? SSKProtoContactDetails.parseData(protoAsData) else { break }
index += sizeAsInt
result.append(proto.number)
result.append((publicKey: proto.number, isBlocked: proto.blocked))
}
return result
}

@ -233,16 +233,24 @@ public final class SyncMessagesProtocol : NSObject {
public static func handleContactSyncMessageData(_ data: Data, using transaction: YapDatabaseReadWriteTransaction) {
let parser = ContactParser(data: data)
let publicKeys = parser.parseHexEncodedPublicKeys()
let tuples = parser.parse()
let blockedPublicKeys = tuples.filter { $0.isBlocked }.map { $0.publicKey }
let userPublicKey = getUserHexEncodedPublicKey()
let userLinkedDevices = LokiDatabaseUtilities.getLinkedDeviceHexEncodedPublicKeys(for: userPublicKey, in: transaction)
// Try to establish sessions
for publicKey in publicKeys {
for (publicKey, isBlocked) in tuples {
guard !userLinkedDevices.contains(publicKey) else { continue } // Skip self and linked devices
let thread = TSContactThread.getOrCreateThread(withContactId: publicKey, transaction: transaction)
thread.shouldThreadBeVisible = true
thread.save(with: transaction)
SessionManagementProtocol.sendSessionRequestIfNeeded(to: publicKey, using: transaction)
if !isBlocked {
SessionManagementProtocol.sendSessionRequestIfNeeded(to: publicKey, using: transaction)
}
}
// Update the blocked contacts list
transaction.addCompletionQueue(DispatchQueue.main) {
SSKEnvironment.shared.blockingManager.setBlockedPhoneNumbers(blockedPublicKeys, sendSyncMessage: false)
NotificationCenter.default.post(name: .blockedContactsUpdated, object: nil)
}
}

Loading…
Cancel
Save