|
|
|
@ -106,7 +106,7 @@ const NSUInteger kOWSProfileManager_MaxAvatarDiameter = 640;
|
|
|
|
|
@property (nonatomic, readonly) TSNetworkManager *networkManager;
|
|
|
|
|
|
|
|
|
|
// This property can be accessed on any thread, while synchronized on self.
|
|
|
|
|
@property (atomic, nullable) UserProfile *localUserProfile;
|
|
|
|
|
@property (nonatomic, readonly) UserProfile *localUserProfile;
|
|
|
|
|
// This property can be accessed on any thread, while synchronized on self.
|
|
|
|
|
@property (atomic, nullable) UIImage *localCachedAvatarImage;
|
|
|
|
|
|
|
|
|
@ -130,6 +130,8 @@ const NSUInteger kOWSProfileManager_MaxAvatarDiameter = 640;
|
|
|
|
|
// Writes should happen off the main thread, wherever possible.
|
|
|
|
|
@implementation OWSProfileManager
|
|
|
|
|
|
|
|
|
|
@synthesize localUserProfile = _localUserProfile;
|
|
|
|
|
|
|
|
|
|
+ (instancetype)sharedManager
|
|
|
|
|
{
|
|
|
|
|
static OWSProfileManager *sharedMyManager = nil;
|
|
|
|
@ -175,20 +177,6 @@ const NSUInteger kOWSProfileManager_MaxAvatarDiameter = 640;
|
|
|
|
|
|
|
|
|
|
OWSSingletonAssert();
|
|
|
|
|
|
|
|
|
|
self.localUserProfile = [self getOrBuildUserProfileForRecipientId:kLocalProfileUniqueId];
|
|
|
|
|
OWSAssert(self.localUserProfile);
|
|
|
|
|
if (!self.localUserProfile.profileKey) {
|
|
|
|
|
DDLogInfo(@"%@ Generating local profile key", self.tag);
|
|
|
|
|
self.localUserProfile.profileKey = [OWSAES256Key generateRandomKey];
|
|
|
|
|
// Make sure to save on the local db connection for consistency.
|
|
|
|
|
//
|
|
|
|
|
// NOTE: we do an async read/write here to avoid blocking during app launch path.
|
|
|
|
|
[self.dbConnection asyncReadWriteWithBlock:^(YapDatabaseReadWriteTransaction *_Nonnull transaction) {
|
|
|
|
|
[self.localUserProfile saveWithTransaction:transaction];
|
|
|
|
|
}];
|
|
|
|
|
}
|
|
|
|
|
OWSAssert(self.localUserProfile.profileKey.keyData.length == kAES256_KeyByteLength);
|
|
|
|
|
|
|
|
|
|
return self;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -264,6 +252,30 @@ const NSUInteger kOWSProfileManager_MaxAvatarDiameter = 640;
|
|
|
|
|
|
|
|
|
|
#pragma mark - Local Profile
|
|
|
|
|
|
|
|
|
|
- (UserProfile *)localUserProfile
|
|
|
|
|
{
|
|
|
|
|
@synchronized(self)
|
|
|
|
|
{
|
|
|
|
|
if (_localUserProfile == nil) {
|
|
|
|
|
// Make sure to read on the local db connection for consistency.
|
|
|
|
|
[self.dbConnection readWithBlock:^(YapDatabaseReadTransaction *transaction) {
|
|
|
|
|
_localUserProfile = [UserProfile fetchObjectWithUniqueID:kLocalProfileUniqueId transaction:transaction];
|
|
|
|
|
}];
|
|
|
|
|
|
|
|
|
|
if (_localUserProfile == nil) {
|
|
|
|
|
DDLogInfo(@"%@ Building local profile.", self.tag);
|
|
|
|
|
_localUserProfile = [[UserProfile alloc] initWithRecipientId:kLocalProfileUniqueId];
|
|
|
|
|
_localUserProfile.profileKey = [OWSAES256Key generateRandomKey];
|
|
|
|
|
[self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *_Nonnull transaction) {
|
|
|
|
|
[_localUserProfile saveWithTransaction:transaction];
|
|
|
|
|
}];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return _localUserProfile;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
- (OWSAES256Key *)localProfileKey
|
|
|
|
|
{
|
|
|
|
|
@synchronized(self)
|
|
|
|
|