Merge branch 'mkirk/avatar-flash'

pull/1/head
Michael Kirk 9 years ago
commit 5884d5d231

@ -11,8 +11,8 @@ NS_ASSUME_NONNULL_BEGIN
@interface OWSAvatarBuilder : NSObject
+ (UIImage *)buildImageForThread:(TSThread *)thread
contactsManager:(OWSContactsManager *)contactsManager
diameter:(NSUInteger)diameter;
diameter:(NSUInteger)diameter
contactsManager:(OWSContactsManager *)contactsManager NS_SWIFT_NAME(buildImage(thread:diameter:contactsManager:));
- (nullable UIImage *)buildSavedImage;
- (UIImage *)buildDefaultImage;

@ -13,8 +13,8 @@ NS_ASSUME_NONNULL_BEGIN
@implementation OWSAvatarBuilder
+ (UIImage *)buildImageForThread:(TSThread *)thread
contactsManager:(OWSContactsManager *)contactsManager
diameter:(NSUInteger)diameter
contactsManager:(OWSContactsManager *)contactsManager
{
OWSAvatarBuilder *avatarBuilder;
if ([thread isKindOfClass:[TSContactThread class]]) {

@ -95,7 +95,7 @@ NS_ASSUME_NONNULL_BEGIN
textColor:[UIColor whiteColor]
font:[UIFont ows_boldFontWithSize:fontSize]
diameter:self.diameter] avatarImage];
[self.contactsManager.avatarCache setObject:image forKey:self.signalId];
[self.contactsManager.avatarCache setObject:image forKey:cacheKey];
return image;
}

@ -1,5 +1,6 @@
// Created by Michael Kirk on 9/26/16.
// Copyright © 2016 Open Whisper Systems. All rights reserved.
//
// Copyright (c) 2017 Open Whisper Systems. All rights reserved.
//
#import "OWSGroupAvatarBuilder.h"
#import "TSGroupThread.h"
@ -32,7 +33,12 @@ NS_ASSUME_NONNULL_BEGIN
- (UIImage *)buildDefaultImage
{
return [UIImage imageNamed:@"empty-group-avatar"];
static UIImage *defaultGroupImage;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
defaultGroupImage = [UIImage imageNamed:@"empty-group-avatar"];
});
return defaultGroupImage;
}
@end

@ -399,7 +399,7 @@ class CallViewController: OWSViewController, CallObserver, CallServiceObserver,
}
func updateAvatarImage() {
contactAvatarView.image = OWSAvatarBuilder.buildImage(for: thread, contactsManager: contactsManager, diameter:400)
contactAvatarView.image = OWSAvatarBuilder.buildImage(thread: thread, diameter: 400, contactsManager: contactsManager)
}
func createIncomingCallControls() {

@ -7,9 +7,14 @@
NS_ASSUME_NONNULL_BEGIN
@class OWSTableSection;
@class CNContact;
@interface DebugUIContacts : DebugUIPage
+ (void)createRandomContacts:(NSUInteger)count
contactHandler:
(nullable void (^)(CNContact *_Nonnull contact, NSUInteger idx, BOOL *_Nonnull stop))contactHandler;
@end
NS_ASSUME_NONNULL_END

@ -1137,13 +1137,20 @@ NS_ASSUME_NONNULL_BEGIN
+ (void)createRandomContacts:(int)count
{
OWSAssert(count > 0);
[self createRandomContacts:count contactHandler:nil];
}
+ (void)createRandomContacts:(NSUInteger)count
contactHandler:
(nullable void (^)(CNContact *_Nonnull contact, NSUInteger idx, BOOL *_Nonnull stop))contactHandler
{
CNAuthorizationStatus status = [CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts];
if (status == CNAuthorizationStatusDenied || status == CNAuthorizationStatusRestricted) {
[OWSAlerts showAlertWithTitle:@"Error" message:@"No contacts access."];
return;
}
NSMutableArray<CNContact *> *contacts = [NSMutableArray new];
CNContactStore *store = [[CNContactStore alloc] init];
[store
requestAccessForEntityType:CNEntityTypeContacts
@ -1166,12 +1173,17 @@ NS_ASSUME_NONNULL_BEGIN
value:[CNPhoneNumber phoneNumberWithStringValue:[self randomPhoneNumber]]];
contact.phoneNumbers = @[ homePhone ];
[contacts addObject:contact];
[request addContact:contact toContainerWithIdentifier:nil];
}
NSError *saveError = nil;
if (![store executeSaveRequest:request error:&saveError]) {
NSLog(@"error = %@", saveError);
[OWSAlerts showAlertWithTitle:@"Error" message:saveError.localizedDescription];
} else {
if (contactHandler) {
[contacts enumerateObjectsUsingBlock:contactHandler];
}
}
}];
}

@ -3,9 +3,9 @@
//
#import "DebugUIMessages.h"
#import "DebugUIContacts.h"
#import "Environment.h"
#import "OWSTableViewController.h"
#import "SecurityUtils.h"
#import "Signal-Swift.h"
#import "ThreadUtil.h"
#import <AFNetworking/AFNetworking.h>
@ -13,6 +13,7 @@
#import <SignalServiceKit/OWSDisappearingConfigurationUpdateInfoMessage.h>
#import <SignalServiceKit/OWSDisappearingMessagesConfiguration.h>
#import <SignalServiceKit/OWSVerificationStateChangeMessage.h>
#import <SignalServiceKit/SecurityUtils.h>
#import <SignalServiceKit/TSCall.h>
#import <SignalServiceKit/TSInvalidIdentityKeyReceivingErrorMessage.h>
#import <SignalServiceKit/TSStorageManager+SessionStore.h>
@ -82,6 +83,22 @@ NS_ASSUME_NONNULL_BEGIN
actionBlock:^{
[DebugUIMessages sendFakeMessages:10 thread:thread];
}],
[OWSTableItem itemWithTitle:@"Create 100 fake threads with 10 messages"
actionBlock:^{
[DebugUIMessages createFakeThreads:100 withFakeMessages:10];
}],
[OWSTableItem itemWithTitle:@"Create 10 fake threads with 100 messages"
actionBlock:^{
[DebugUIMessages createFakeThreads:10 withFakeMessages:100];
}],
[OWSTableItem itemWithTitle:@"Create 10 fake threads with 10 messages"
actionBlock:^{
[DebugUIMessages createFakeThreads:10 withFakeMessages:10];
}],
[OWSTableItem itemWithTitle:@"Create 100 fake threads with 100 messages"
actionBlock:^{
[DebugUIMessages createFakeThreads:100 withFakeMessages:100];
}],
[OWSTableItem itemWithTitle:@"Create 1k fake messages"
actionBlock:^{
[DebugUIMessages sendFakeMessages:1000 thread:thread];
@ -836,11 +853,27 @@ NS_ASSUME_NONNULL_BEGIN
}];
}
+ (void)sendFakeMessages:(int)counter thread:(TSThread *)thread
+ (void)createFakeThreads:(NSUInteger)threadCount withFakeMessages:(NSUInteger)messageCount
{
[DebugUIContacts
createRandomContacts:threadCount
contactHandler:^(CNContact *_Nonnull contact, NSUInteger idx, BOOL *_Nonnull stop) {
NSString *phoneNumberText = contact.phoneNumbers.firstObject.value.stringValue;
OWSAssert(phoneNumberText);
PhoneNumber *phoneNumber = [PhoneNumber tryParsePhoneNumberFromUserSpecifiedText:phoneNumberText];
OWSAssert(phoneNumber);
OWSAssert(phoneNumber.toE164);
TSContactThread *contactThread = [TSContactThread getOrCreateThreadWithContactId:phoneNumber.toE164];
[self sendFakeMessages:messageCount thread:contactThread];
}];
}
+ (void)sendFakeMessages:(NSUInteger)counter thread:(TSThread *)thread
{
[TSStorageManager.sharedManager.dbReadWriteConnection readWriteWithBlock:^(
YapDatabaseReadWriteTransaction *transaction) {
for (int i = 0; i < counter; i++) {
for (NSUInteger i = 0; i < counter; i++) {
NSString *randomText = [self randomText];
switch (arc4random_uniform(4)) {
case 0: {

@ -6,7 +6,6 @@
#import "Environment.h"
#import "OWSCountryMetadata.h"
#import "OWSTableViewController.h"
#import "SecurityUtils.h"
#import "Signal-Swift.h"
#import "ThreadUtil.h"
#import <AFNetworking/AFNetworking.h>
@ -14,6 +13,7 @@
#import <SignalServiceKit/OWSDisappearingConfigurationUpdateInfoMessage.h>
#import <SignalServiceKit/OWSDisappearingMessagesConfiguration.h>
#import <SignalServiceKit/OWSVerificationStateChangeMessage.h>
#import <SignalServiceKit/SecurityUtils.h>
#import <SignalServiceKit/TSCall.h>
#import <SignalServiceKit/TSInvalidIdentityKeyReceivingErrorMessage.h>
#import <SignalServiceKit/TSStorageManager+SessionStore.h>

@ -20,7 +20,7 @@ NS_ASSUME_NONNULL_BEGIN
#define DATE_LABEL_SIZE 13
#define SWIPE_ARCHIVE_OFFSET -50
const NSUInteger kavatarViewDiameter = 52;
const NSUInteger kAvatarViewDiameter = 52;
@interface InboxTableViewCell ()
@ -227,16 +227,8 @@ const NSUInteger kavatarViewDiameter = 52;
self.unreadLabel.hidden = YES;
}
NSString *threadIdCopy = thread.uniqueId;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
UIImage *avatar =
[OWSAvatarBuilder buildImageForThread:thread contactsManager:contactsManager diameter:kavatarViewDiameter];
dispatch_async(dispatch_get_main_queue(), ^{
if ([_threadId isEqualToString:threadIdCopy]) {
self.avatarView.image = avatar;
}
});
});
self.avatarView.image =
[OWSAvatarBuilder buildImageForThread:thread diameter:kAvatarViewDiameter contactsManager:contactsManager];
}
- (void)updateCellForUnreadMessage {

@ -11,7 +11,6 @@
#import "GroupViewHelper.h"
#import "OWSContactsManager.h"
#import "OWSTableViewController.h"
#import "SecurityUtils.h"
#import "Signal-Swift.h"
#import "SignalKeyingStorage.h"
#import "TSOutgoingMessage.h"
@ -20,6 +19,7 @@
#import "UIViewController+OWS.h"
#import <SignalServiceKit/NSDate+millisecondTimeStamp.h>
#import <SignalServiceKit/OWSMessageSender.h>
#import <SignalServiceKit/SecurityUtils.h>
#import <SignalServiceKit/SignalAccount.h>
#import <SignalServiceKit/TSGroupModel.h>
#import <SignalServiceKit/TSGroupThread.h>

@ -575,11 +575,11 @@ NS_ASSUME_NONNULL_BEGIN
[threadInfoView autoPinHeightToSuperviewWithMargin:16.f];
const NSUInteger kAvatarSize = 68;
UIImage *avatar =
[OWSAvatarBuilder buildImageForThread:self.thread contactsManager:self.contactsManager diameter:kAvatarSize];
OWSAssert(avatar);
UIImage *avatarImage =
[OWSAvatarBuilder buildImageForThread:self.thread diameter:kAvatarSize contactsManager:self.contactsManager];
OWSAssert(avatarImage);
AvatarImageView *avatarView = [[AvatarImageView alloc] initWithImage:avatar];
AvatarImageView *avatarView = [[AvatarImageView alloc] initWithImage:avatarImage];
_avatarView = avatarView;
[threadInfoView addSubview:avatarView];
[avatarView autoVCenterInSuperview];

@ -11,7 +11,6 @@
#import "GroupViewHelper.h"
#import "OWSContactsManager.h"
#import "OWSTableViewController.h"
#import "SecurityUtils.h"
#import "Signal-Swift.h"
#import "SignalKeyingStorage.h"
#import "TSOutgoingMessage.h"
@ -21,6 +20,7 @@
#import "ViewControllerUtils.h"
#import <SignalServiceKit/NSDate+millisecondTimeStamp.h>
#import <SignalServiceKit/OWSMessageSender.h>
#import <SignalServiceKit/SecurityUtils.h>
#import <SignalServiceKit/SignalAccount.h>
#import <SignalServiceKit/TSGroupModel.h>
#import <SignalServiceKit/TSGroupThread.h>

@ -139,8 +139,8 @@ const NSUInteger kContactTableViewCellAvatarSize = 40;
self.nameLabel.attributedText = attributedText;
self.avatarView.image = [OWSAvatarBuilder buildImageForThread:thread
contactsManager:contactsManager
diameter:kContactTableViewCellAvatarSize];
diameter:kContactTableViewCellAvatarSize
contactsManager:contactsManager];
// Force layout, since imageView isn't being initally rendered on App Store optimized build.
[self layoutSubviews];

@ -6,21 +6,7 @@ BIN_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
REPO_ROOT=$BIN_DIR/../../..
cd $REPO_ROOT
SSK_DIR="../SignalServiceKit/src"
pushd $SSK_DIR
CURRENT_SSK_BRANCH=$(git status|awk 'NR==1{print $3}')
if [ $CURRENT_SSK_BRANCH != "master" ]
then
if [[ $* == *--non-master* ]]
then
echo "[!] Note - generating from non-master SSK."
else
echo "[!] Error - SSK must be on master to be sure we're generating up-to-date strings, or use '--non-master'."
exit 1
fi
fi
popd
SSK_DIR="./SignalServiceKit/src"
TARGETS="Signal/src ${SSK_DIR}"
TMP="$(mktemp -d)"

@ -4,9 +4,6 @@
NS_ASSUME_NONNULL_BEGIN
@class TSStorageManager;
@class OWSMessageSender;
extern NSString *const kNSNotificationName_BlockedPhoneNumbersDidChange;
// This class can be safely accessed and used from any thread.

@ -5,14 +5,16 @@
NS_ASSUME_NONNULL_BEGIN
@class ContactsUpdater;
@class OWSBlockingManager;
@class OWSProfilesManager;
@class OWSUploadingService;
@class SignalRecipient;
@class OWSBlockingManager;
@class TSInvalidIdentityKeySendingErrorMessage;
@class TSNetworkManager;
@class TSOutgoingMessage;
@class TSStorageManager;
@class TSThread;
@protocol ContactsManagerProtocol;
/**
@ -57,6 +59,8 @@ NS_SWIFT_NAME(MessageSender)
- (void)setBlockingManager:(OWSBlockingManager *)blockingManager;
- (void)setProfilesManager:(OWSProfilesManager *)profilesManager;
/**
* Send and resend text messages or resend messages with existing attachments.
* If you haven't yet created the attachment, see the `sendAttachmentData:` variants.

@ -14,6 +14,7 @@
#import "OWSMessageServiceParams.h"
#import "OWSOutgoingSentMessageTranscript.h"
#import "OWSOutgoingSyncMessage.h"
#import "OWSProfilesManager.h"
#import "OWSUploadingService.h"
#import "PreKeyBundle+jsonDict.h"
#import "SignalRecipient.h"
@ -356,6 +357,7 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException";
@property (nonatomic, readonly) TSNetworkManager *networkManager;
@property (nonatomic, readonly) TSStorageManager *storageManager;
@property (nonatomic, readonly) OWSBlockingManager *blockingManager;
@property (nonatomic, readonly) OWSProfilesManager *profilesManager;
@property (nonatomic, readonly) OWSUploadingService *uploadingService;
@property (nonatomic, readonly) YapDatabaseConnection *dbConnection;
@property (nonatomic, readonly) id<ContactsManagerProtocol> contactsManager;
@ -398,6 +400,14 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException";
_blockingManager = blockingManager;
}
- (void)setProfilesManager:(OWSProfilesManager *)profilesManager
{
OWSAssert(profilesManager);
OWSAssert(!_profilesManager);
_profilesManager = profilesManager;
}
- (NSOperationQueue *)sendingQueueForMessage:(TSOutgoingMessage *)message
{
OWSAssert(message);

@ -0,0 +1,16 @@
//
// Copyright (c) 2017 Open Whisper Systems. All rights reserved.
//
NS_ASSUME_NONNULL_BEGIN
// This class can be safely accessed and used from any thread.
@interface OWSProfilesManager : NSObject
- (instancetype)init NS_UNAVAILABLE;
+ (instancetype)sharedManager;
@end
NS_ASSUME_NONNULL_END

@ -0,0 +1,144 @@
//
// Copyright (c) 2017 Open Whisper Systems. All rights reserved.
//
#import "OWSProfilesManager.h"
#import "OWSMessageSender.h"
#import "SecurityUtils.h"
#import "TSStorageManager.h"
#import "TextSecureKitEnv.h"
NS_ASSUME_NONNULL_BEGIN
NSString *const kOWSProfilesManager_Collection = @"kOWSProfilesManager_Collection";
// This key is used to persist the local user's profile key.
NSString *const kOWSProfilesManager_LocalProfileKey = @"kOWSProfilesManager_LocalProfileKey";
// TODO:
static const NSInteger kProfileKeyLength = 16;
@interface OWSProfilesManager ()
@property (nonatomic, readonly) TSStorageManager *storageManager;
@property (nonatomic, readonly) OWSMessageSender *messageSender;
@property (nonatomic, readonly, nullable) NSData *localProfileKey;
@end
#pragma mark -
@implementation OWSProfilesManager
@synthesize localProfileKey = _localProfileKey;
+ (instancetype)sharedManager
{
static OWSProfilesManager *sharedMyManager = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedMyManager = [[self alloc] initDefault];
});
return sharedMyManager;
}
- (instancetype)initDefault
{
TSStorageManager *storageManager = [TSStorageManager sharedManager];
OWSMessageSender *messageSender = [TextSecureKitEnv sharedEnv].messageSender;
return [self initWithStorageManager:storageManager messageSender:messageSender];
}
- (instancetype)initWithStorageManager:(TSStorageManager *)storageManager
messageSender:(OWSMessageSender *)messageSender
{
self = [super init];
if (!self) {
return self;
}
OWSAssert(storageManager);
OWSAssert(messageSender);
_storageManager = storageManager;
_messageSender = messageSender;
OWSSingletonAssert();
// Register this manager with the message sender.
// This is a circular dependency.
[messageSender setProfilesManager:self];
// Try to load.
_localProfileKey = [self.storageManager objectForKey:kOWSProfilesManager_LocalProfileKey
inCollection:kOWSProfilesManager_Collection];
if (!_localProfileKey) {
// Generate
_localProfileKey = [OWSProfilesManager generateLocalProfileKey];
// Persist
[self.storageManager setObject:_localProfileKey
forKey:kOWSProfilesManager_LocalProfileKey
inCollection:kOWSProfilesManager_Collection];
}
OWSAssert(_localProfileKey.length == kProfileKeyLength);
return self;
}
- (void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
- (void)observeNotifications
{
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(applicationDidBecomeActive:)
name:UIApplicationDidBecomeActiveNotification
object:nil];
}
#pragma mark - Local Profile Key
+ (NSData *)generateLocalProfileKey
{
// TODO:
OWSFail(@"Profile key generation is not yet implemented.");
return [SecurityUtils generateRandomBytes:kProfileKeyLength];
}
- (nullable NSData *)localProfileKey
{
OWSAssert(_localProfileKey.length == kProfileKeyLength);
return _localProfileKey;
}
#pragma mark - Notifications
- (void)applicationDidBecomeActive:(NSNotification *)notification
{
OWSAssert([NSThread isMainThread]);
@synchronized(self)
{
// TODO: Sync if necessary.
}
}
#pragma mark - Logging
+ (NSString *)tag
{
return [NSString stringWithFormat:@"[%@]", self.class];
}
- (NSString *)tag
{
return self.class.tag;
}
@end
NS_ASSUME_NONNULL_END
Loading…
Cancel
Save