From dfa238a287b0bf1a893c2fdb19fc6804e22569b7 Mon Sep 17 00:00:00 2001
From: Ryan ZHAO <ryanzhaors@qq.com>
Date: Mon, 24 Feb 2020 11:52:54 +1100
Subject: [PATCH] wip: fix sync message

---
 Signal/Signal-Info.plist                      |  2 +-
 .../View Controllers/DeviceLinkingModal.swift |  4 +--
 SignalMessaging/contacts/OWSSyncManager.m     | 32 +++++++++++++------
 3 files changed, 25 insertions(+), 13 deletions(-)

diff --git a/Signal/Signal-Info.plist b/Signal/Signal-Info.plist
index c49053bcc..9d7c02e10 100644
--- a/Signal/Signal-Info.plist
+++ b/Signal/Signal-Info.plist
@@ -5,7 +5,7 @@
 	<key>BuildDetails</key>
 	<dict>
 		<key>CarthageVersion</key>
-		<string>0.33.0</string>
+		<string>0.34.0</string>
 		<key>OSXVersion</key>
 		<string>10.15.2</string>
 		<key>WebRTCCommit</key>
diff --git a/Signal/src/Loki/View Controllers/DeviceLinkingModal.swift b/Signal/src/Loki/View Controllers/DeviceLinkingModal.swift
index b2a304ea3..195dd5669 100644
--- a/Signal/src/Loki/View Controllers/DeviceLinkingModal.swift	
+++ b/Signal/src/Loki/View Controllers/DeviceLinkingModal.swift	
@@ -165,8 +165,8 @@ final class DeviceLinkingModal : Modal, DeviceLinkingSessionDelegate {
         let linkingAuthorizationMessage = DeviceLinkingUtilities.getLinkingAuthorizationMessage(for: deviceLink)
         ThreadUtil.enqueue(linkingAuthorizationMessage)
         SSKEnvironment.shared.messageSender.send(linkingAuthorizationMessage, success: {
-            let _ = SSKEnvironment.shared.syncManager.syncAllContacts()
-//            _ = SSKEnvironment.shared.syncManager.syncAllGroups()
+            let _ = [SSKEnvironment.shared.syncManager.syncAllContacts(),
+                     SSKEnvironment.shared.syncManager.syncAllGroups()]
         }) { _ in
             print("[Loki] Failed to send device link authorization message.")
         }
diff --git a/SignalMessaging/contacts/OWSSyncManager.m b/SignalMessaging/contacts/OWSSyncManager.m
index 4c4df6d87..2ebbc95ee 100644
--- a/SignalMessaging/contacts/OWSSyncManager.m
+++ b/SignalMessaging/contacts/OWSSyncManager.m
@@ -288,15 +288,21 @@ NSString *const kSyncManagerLastContactSyncKey = @"kTSStorageManagerOWSSyncManag
         if (hexEncodedPublicKey != nil && thread.isContactFriend && thread.shouldThreadBeVisible && !thread.isForceHidden) {
             [friends addObject:[[SignalAccount alloc] initWithRecipientId:hexEncodedPublicKey]];
         }
-        if (friends.count >= 2) {
-            [promises addObject:[self syncContactsForSignalAccounts:friends]];
-            [friends removeAllObjects];
-        }
     }];
-    if (friends.count > 0) {
-        [promises addObject:[self syncContactsForSignalAccounts:friends]];
+    NSMutableArray<SignalAccount *> *signalAccounts = @[].mutableCopy;
+    for (SignalAccount *contact in friends) {
+        [signalAccounts addObject:contact];
+        if (signalAccounts.count >= 2) {
+            [promises addObject:[self syncContactsForSignalAccounts:signalAccounts]];
+            [signalAccounts removeAllObjects];
+        }
     }
-    return PMKJoin(promises);
+    if (signalAccounts.count > 0) {
+        [promises addObject:[self syncContactsForSignalAccounts:signalAccounts]];
+    }
+    AnyPromise *promise = PMKJoin(promises);
+    [promise retainUntilComplete];
+    return promise;
 }
 
 - (AnyPromise *)syncContactsForSignalAccounts:(NSArray<SignalAccount *> *)signalAccounts
@@ -319,13 +325,19 @@ NSString *const kSyncManagerLastContactSyncKey = @"kTSStorageManagerOWSSyncManag
 
 - (AnyPromise *)syncAllGroups
 {
+    NSMutableArray<TSGroupThread *> *groupThreads = @[].mutableCopy;
     NSMutableArray<AnyPromise *> *promises = @[].mutableCopy;
     [TSGroupThread enumerateCollectionObjectsUsingBlock:^(TSGroupThread *thread, BOOL *stop) {
-        if (thread.groupModel && thread.shouldThreadBeVisible && !thread.isForceHidden) {
-            [promises addObject:[self syncGroupForThread:thread]];
+        if (thread.groupModel.groupType == closedGroup && thread.shouldThreadBeVisible && !thread.isForceHidden) {
+            [groupThreads addObject:thread];
         }
     }];
-    return PMKJoin(promises);
+    for (TSGroupThread *groupThread in groupThreads) {
+        [promises addObject:[self syncGroupForThread:groupThread]];
+    }
+    AnyPromise *promise = PMKJoin(promises);
+    [promise retainUntilComplete];
+    return promise;
 }
 
 - (AnyPromise *)syncGroupForThread:(TSGroupThread *)thread