diff --git a/SignalMessaging/profiles/OWSProfileManager.m b/SignalMessaging/profiles/OWSProfileManager.m index 7cdb16fd40..50d13b9a0f 100644 --- a/SignalMessaging/profiles/OWSProfileManager.m +++ b/SignalMessaging/profiles/OWSProfileManager.m @@ -453,6 +453,13 @@ const NSString *kNSNotificationKey_WasLocallyInitiated = @"kNSNotificationKey_Wa }); } +- (void)reuploadLocalProfile +{ + [self reuploadLocalProfilePromiseObjc].then(^{ OWSLogInfo(@"Done."); }).catch(^(NSError *error) { + OWSFailDebug(@"Error: %@", error); + }); +} + #pragma mark - Profile Key Rotation - (nullable NSString *)groupKeyForGroupId:(NSData *)groupId { diff --git a/SignalServiceKit/src/Protocols/ProfileManagerProtocol.h b/SignalServiceKit/src/Protocols/ProfileManagerProtocol.h index 56f8497bba..dd5d058d7b 100644 --- a/SignalServiceKit/src/Protocols/ProfileManagerProtocol.h +++ b/SignalServiceKit/src/Protocols/ProfileManagerProtocol.h @@ -130,6 +130,8 @@ NS_ASSUME_NONNULL_BEGIN - (void)didSendOrReceiveMessageFromAddress:(SignalServiceAddress *)address transaction:(SDSAnyWriteTransaction *)transaction; +- (void)reuploadLocalProfile; + @end NS_ASSUME_NONNULL_END diff --git a/SignalServiceKit/src/TestUtils/OWSFakeProfileManager.m b/SignalServiceKit/src/TestUtils/OWSFakeProfileManager.m index b5116b94fc..b3f5993a1a 100644 --- a/SignalServiceKit/src/TestUtils/OWSFakeProfileManager.m +++ b/SignalServiceKit/src/TestUtils/OWSFakeProfileManager.m @@ -322,6 +322,11 @@ NS_ASSUME_NONNULL_BEGIN // Do nothing. } +- (void)reuploadLocalProfile +{ + // Do nothing. +} + @end #endif diff --git a/SignalServiceKit/src/Util/Atomics.swift b/SignalServiceKit/src/Util/Atomics.swift index 3defe8a0f5..395c8b1042 100644 --- a/SignalServiceKit/src/Util/Atomics.swift +++ b/SignalServiceKit/src/Util/Atomics.swift @@ -34,7 +34,7 @@ private class Atomics { public class AtomicBool: NSObject { private let value = AtomicValue(false) - @objc + @objc(initWithValue:) public required init(_ value: Bool) { self.value.set(value) } diff --git a/SignalServiceKit/src/Util/ExperienceUpgradeFinder.swift b/SignalServiceKit/src/Util/ExperienceUpgradeFinder.swift index 3b3382fd49..6d144a71a9 100644 --- a/SignalServiceKit/src/Util/ExperienceUpgradeFinder.swift +++ b/SignalServiceKit/src/Util/ExperienceUpgradeFinder.swift @@ -125,6 +125,8 @@ public enum ExperienceUpgradeId: String, CaseIterable { switch self { case .pinReminder: return false + case .messageRequests: + return false default: return true } @@ -140,6 +142,8 @@ public enum ExperienceUpgradeId: String, CaseIterable { return false case .contactPermissionReminder: return false + case .messageRequests: + return false default: return true } @@ -261,7 +265,10 @@ public class ExperienceUpgradeFinder: NSObject { while true { guard let experienceUpgrade = try? cursor.next() else { break } - + guard experienceUpgrade.id.shouldSave else { + // Ignore saved upgrades that we don't currently save. + continue + } if !experienceUpgrade.isComplete && !experienceUpgrade.hasCompletedVisibleDuration { experienceUpgrades.append(experienceUpgrade) } diff --git a/SignalServiceKit/src/Util/OWSUserProfile.m b/SignalServiceKit/src/Util/OWSUserProfile.m index 7cf349c143..247e6fd511 100644 --- a/SignalServiceKit/src/Util/OWSUserProfile.m +++ b/SignalServiceKit/src/Util/OWSUserProfile.m @@ -351,6 +351,18 @@ NSUInteger const kUserProfileSchemaVersion = 1; #pragma mark - Update With... Methods ++ (BOOL)shouldReuploadProtectedProfileName +{ + // Only re-upload once per launch. + // + // This value will only be accessed within write transactions, + // so it is thread-safe. + static BOOL hasReuploaded = NO; + BOOL canReupload = !hasReuploaded; + hasReuploaded = YES; + return canReupload; +} + // Similar in spirit to anyUpdateWithTransaction, // but with significant differences. // @@ -409,6 +421,25 @@ NSUInteger const kUserProfileSchemaVersion = 1; equalTo:profile.familyName]; BOOL avatarUrlPathDidChange = ![NSObject isNullableObject:avatarUrlPathBefore equalTo:profile.avatarUrlPath]; + + if ([profile.address.phoneNumber + isEqualToString:kLocalProfileInvariantPhoneNumber]) { + BOOL hasValidProfileNameBefore = givenNameBefore.length > 0; + BOOL hasValidProfileNameAfter = profile.givenName.length > 0; + if (hasValidProfileNameBefore && !hasValidProfileNameAfter) { + OWSFailDebug(@"Restoring local profile name."); + // Profile names are required; never clear the profile + // name for the local user. + profile.givenName = givenNameBefore; + + if (OWSUserProfile.shouldReuploadProtectedProfileName) { + [transaction addAsyncCompletionOffMain:^{ + [self.profileManager reuploadLocalProfile]; + }]; + } + } + } + NSString *profileKeyDescription; if (profile.profileKey.keyData != nil) { if (SSKDebugFlags.internalLogging) {