diff --git a/Signal/src/contact/ContactsManager.h b/Signal/src/contact/ContactsManager.h index 4c1acb234..587dec610 100644 --- a/Signal/src/contact/ContactsManager.h +++ b/Signal/src/contact/ContactsManager.h @@ -48,7 +48,8 @@ typedef void(^ABReloadRequestCompletionBlock)(NSArray *contacts); - (BOOL)isContactRegisteredWithTextSecure:(Contact*)contact; -(void)doAfterEnvironmentInitSetup; -- (NSString*)nameStringForPhoneIdentifier:(NSString*)identifier; +- (NSString*)nameStringForPhoneIdentifier:(NSString*)identifier; +- (UIImage*)imageForPhoneIdentifier:(NSString*)identifier; @end diff --git a/Signal/src/contact/ContactsManager.m b/Signal/src/contact/ContactsManager.m index 747620f2c..7fe1434ac 100644 --- a/Signal/src/contact/ContactsManager.m +++ b/Signal/src/contact/ContactsManager.m @@ -436,4 +436,15 @@ void onAddressBookChanged(ABAddressBookRef notifyAddressBook, CFDictionaryRef in return nil; } +- (UIImage*)imageForPhoneIdentifier:(NSString*)identifier{ + for (Contact *contact in self.textSecureContacts) { + for (PhoneNumber *phoneNumber in contact.parsedPhoneNumbers) { + if ([phoneNumber.toE164 isEqualToString:identifier]) { + return contact.image; + } + } + } + return nil; +} + @end diff --git a/Signal/src/textsecure/Contacts/TSThread.h b/Signal/src/textsecure/Contacts/TSThread.h index 7ee48ec24..07e5b7296 100644 --- a/Signal/src/textsecure/Contacts/TSThread.h +++ b/Signal/src/textsecure/Contacts/TSThread.h @@ -46,4 +46,8 @@ - (NSDate*)lastMessageDate; +- (NSString*)lastMessageLabel; + +- (int)unreadMessages; + @end diff --git a/Signal/src/textsecure/Contacts/TSThread.m b/Signal/src/textsecure/Contacts/TSThread.m index ff10b4845..06047ead2 100644 --- a/Signal/src/textsecure/Contacts/TSThread.m +++ b/Signal/src/textsecure/Contacts/TSThread.m @@ -7,6 +7,10 @@ // #import "TSThread.h" +#import "Environment.h" +#import "ContactsManager.h" +#import "TSInteraction.h" +#import "TSStorageManager.h" #import "TSGroup.h" @implementation TSThread @@ -19,7 +23,8 @@ self = [super initWithUniqueId:uniqueId]; if (self) { - _blocked = NO; + _blocked = NO; + _lastMessageId = 0; } return self; @@ -31,15 +36,41 @@ } - (uint64_t)lastMessageId{ - return 0; + return _lastMessageId; } - (NSDate*)lastMessageDate{ - return [NSDate date]; + __block NSDate *date; + [[TSStorageManager sharedManager].dbConnection readWithBlock:^(YapDatabaseReadTransaction *transaction) { + date = [TSInteraction fetchObjectWithUniqueID:[TSInteraction stringFromTimeStamp:_lastMessageId] transaction:transaction].date; + }]; + + if (date) { + return date; + } else{ + return [NSDate date]; + } } - (UIImage*)image{ return nil; } +- (NSString*)lastMessageLabel{ + __block TSInteraction *interaction; + [[TSStorageManager sharedManager].dbConnection readWithBlock:^(YapDatabaseReadTransaction *transaction) { + interaction = [TSInteraction fetchObjectWithUniqueID:[TSInteraction stringFromTimeStamp:_lastMessageId] transaction:transaction]; + }]; + return interaction.description; +} + +- (int)unreadMessages{ + return 0; +} + +- (NSString *)name{ + NSAssert(FALSE, @"Should be implemented in subclasses"); + return nil; +} + @end diff --git a/Signal/src/textsecure/Contacts/Threads/TSContactThread.m b/Signal/src/textsecure/Contacts/Threads/TSContactThread.m index cc10f5b6c..9f3e0c711 100644 --- a/Signal/src/textsecure/Contacts/Threads/TSContactThread.m +++ b/Signal/src/textsecure/Contacts/Threads/TSContactThread.m @@ -57,6 +57,11 @@ return name; } +- (UIImage*)image{ + UIImage *image = [[Environment getCurrent].contactsManager imageForPhoneIdentifier:self.contactIdentifier]; + return image; +} + + (NSString*)threadIdFromContactId:(NSString*)contactId{ return [TSContactThreadPrefix stringByAppendingString:contactId]; } diff --git a/Signal/src/textsecure/Messages/TSInteraction.h b/Signal/src/textsecure/Messages/TSInteraction.h index f368e1288..6079d937c 100644 --- a/Signal/src/textsecure/Messages/TSInteraction.h +++ b/Signal/src/textsecure/Messages/TSInteraction.h @@ -30,8 +30,11 @@ extern const struct TSMessageEdges { - (NSDate*)date; - (uint64_t)timeStamp; +- (NSString*)description; #pragma mark Utility Method + (NSString*)stringFromTimeStamp:(uint64_t)timestamp; ++ (uint64_t)timeStampFromString:(NSString*)string; + @end diff --git a/Signal/src/textsecure/Messages/TSInteraction.m b/Signal/src/textsecure/Messages/TSInteraction.m index 83f47bd4d..84b5eaef5 100644 --- a/Signal/src/textsecure/Messages/TSInteraction.m +++ b/Signal/src/textsecure/Messages/TSInteraction.m @@ -52,10 +52,7 @@ const struct TSMessageEdges TSMessageEdges = { #pragma mark Date operations - (uint64_t)identifierToTimestamp{ - NSNumberFormatter * f = [[NSNumberFormatter alloc] init]; - [f setNumberStyle:NSNumberFormatterNoStyle]; - NSNumber * myNumber = [f numberFromString:self.uniqueId]; - return [myNumber unsignedLongLongValue]; + return [[self class] timeStampFromString:self.uniqueId]; } - (NSDate*)date{ @@ -72,4 +69,15 @@ const struct TSMessageEdges TSMessageEdges = { return [[NSNumber numberWithUnsignedLongLong:timestamp] stringValue]; } ++ (uint64_t)timeStampFromString:(NSString*)string{ + NSNumberFormatter * f = [[NSNumberFormatter alloc] init]; + [f setNumberStyle:NSNumberFormatterNoStyle]; + NSNumber * myNumber = [f numberFromString:string]; + return [myNumber unsignedLongLongValue]; +} + +- (NSString*)description{ + return @"Interaction description"; +} + @end diff --git a/Signal/src/textsecure/Messages/TSMessagesManager+sendMessages.m b/Signal/src/textsecure/Messages/TSMessagesManager+sendMessages.m index 69a941914..48d1048e1 100644 --- a/Signal/src/textsecure/Messages/TSMessagesManager+sendMessages.m +++ b/Signal/src/textsecure/Messages/TSMessagesManager+sendMessages.m @@ -94,6 +94,9 @@ [self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { [message setMessageState:TSOutgoingMessageStateSent]; [message saveWithTransaction:transaction]; + TSThread *fetchedThread = [TSThread fetchObjectWithUniqueID:thread.uniqueId]; + fetchedThread.lastMessageId = [TSInteraction timeStampFromString:message.uniqueId]; + [thread saveWithTransaction:transaction]; }]; } diff --git a/Signal/src/textsecure/Messages/TSMessagesManager.m b/Signal/src/textsecure/Messages/TSMessagesManager.m index d35849faa..3e03762c8 100644 --- a/Signal/src/textsecure/Messages/TSMessagesManager.m +++ b/Signal/src/textsecure/Messages/TSMessagesManager.m @@ -211,6 +211,7 @@ } [incomingMessage saveWithTransaction:transaction]; + thread.lastMessageId = [TSInteraction timeStampFromString:incomingMessage.uniqueId]; [thread saveWithTransaction:transaction]; }]; } diff --git a/Signal/src/textsecure/Storage/TSYapDatabaseObject.m b/Signal/src/textsecure/Storage/TSYapDatabaseObject.m index bcdf47a0c..d5196f926 100644 --- a/Signal/src/textsecure/Storage/TSYapDatabaseObject.m +++ b/Signal/src/textsecure/Storage/TSYapDatabaseObject.m @@ -36,8 +36,7 @@ }]; } -- (void)removeWithTransaction:(YapDatabaseReadWriteTransaction *)transaction -{ +- (void)removeWithTransaction:(YapDatabaseReadWriteTransaction *)transaction{ [transaction removeObjectForKey:self.uniqueId inCollection:[[self class] collection]]; } @@ -45,6 +44,7 @@ - (void)remove{ [[TSStorageManager sharedManager].dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { [self removeWithTransaction:transaction]; + [[transaction ext:@"relationships"] flush]; }]; } diff --git a/Signal/src/view controllers/InboxTableViewCell.m b/Signal/src/view controllers/InboxTableViewCell.m index e6d6428ca..b4c4dd519 100644 --- a/Signal/src/view controllers/InboxTableViewCell.m +++ b/Signal/src/view controllers/InboxTableViewCell.m @@ -43,10 +43,10 @@ -(void)configureWithThread:(TSThread*)thread { _nameLabel.text = thread.name; - _snippetLabel.text = @"Missing implementation"; - _contactPictureView.image = nil; + _snippetLabel.text = thread.lastMessageLabel; + _contactPictureView.image = thread.image; _timeLabel.attributedText = [self dateAttributedString:thread.lastMessageDate]; - self.separatorInset = UIEdgeInsetsMake(0,_contactPictureView.frame.size.width*1.5f, 0, 0); + self.separatorInset = UIEdgeInsetsMake(0,_contactPictureView.frame.size.width*1.5f, 0, 0); [self setUpLastAction:@"read"]; // TODO: Change } diff --git a/Signal/src/view controllers/MessagesViewController.h b/Signal/src/view controllers/MessagesViewController.h index 007398039..877e9ccbe 100644 --- a/Signal/src/view controllers/MessagesViewController.h +++ b/Signal/src/view controllers/MessagesViewController.h @@ -12,8 +12,6 @@ @class TSThread; @interface MessagesViewController : JSQMessagesViewController - -@property (strong, nonatomic) NSString* senderTitleString; @property TSThread *thread; - (void)setupWithThread:(TSThread*)thread; diff --git a/Signal/src/view controllers/MessagesViewController.m b/Signal/src/view controllers/MessagesViewController.m index 7205f2b7b..f875a5812 100644 --- a/Signal/src/view controllers/MessagesViewController.m +++ b/Signal/src/view controllers/MessagesViewController.m @@ -57,6 +57,8 @@ typedef enum : NSUInteger { [super viewDidLoad]; // Do any additional setup after loading the view. + isGroupConversation = NO; // TODO: Support Group Conversations + JSQMessagesBubbleImageFactory *bubbleFactory = [[JSQMessagesBubbleImageFactory alloc] init]; self.outgoingBubbleImageData = [bubbleFactory outgoingMessagesBubbleImageWithColor:[UIColor jsq_messageBubbleBlueColor]]; @@ -66,7 +68,6 @@ typedef enum : NSUInteger { [self.uiDatabaseConnection readWithBlock:^(YapDatabaseReadTransaction *transaction) { [self.messageMappings updateWithTransaction:transaction]; - NSLog(@"Total messages: %lu", (unsigned long)[self.messageMappings numberOfItemsInAllGroups]); }]; self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc]initWithImage:[UIImage imageNamed:@"lock.png"] style:UIBarButtonItemStylePlain target:self action:@selector(showFingerprint)]; @@ -76,13 +77,10 @@ typedef enum : NSUInteger { self.collectionView.showsVerticalScrollIndicator = NO; self.collectionView.showsHorizontalScrollIndicator = NO; - //DEBUG: - isGroupConversation = NO; - - self.title = self.senderTitleString; + self.title = self.thread.name; - self.senderId = @"self"; - self.senderDisplayName = @"self"; + self.senderId = ME_MESSAGE_IDENTIFIER + self.senderDisplayName = ME_MESSAGE_IDENTIFIER; self.automaticallyScrollsToMostRecentMessage = YES; @@ -142,8 +140,9 @@ typedef enum : NSUInteger { #pragma mark - JSQMessage custom methods -(void)updateMessageStatus:(JSQMessage*)message { - if ([message.senderId isEqualToString:self.senderId]) + if ([message.senderId isEqualToString:self.senderId]){ message.status = kMessageReceived; + } } #pragma mark - JSQMessagesViewController method overrides diff --git a/Signal/src/view controllers/TSMessageAdapter.h b/Signal/src/view controllers/TSMessageAdapter.h index ce7d9ebc3..0e2d7cc14 100644 --- a/Signal/src/view controllers/TSMessageAdapter.h +++ b/Signal/src/view controllers/TSMessageAdapter.h @@ -13,6 +13,8 @@ #import "TSInteraction.h" #import "TSThread.h" +#define ME_MESSAGE_IDENTIFIER @"Me"; + @interface TSMessageAdapter : NSObject + (instancetype)messageViewDataWithInteraction:(TSInteraction*)interaction inThread:(TSThread*)thread; diff --git a/Signal/src/view controllers/TSMessageAdapter.m b/Signal/src/view controllers/TSMessageAdapter.m index e354d2abc..63a91640e 100644 --- a/Signal/src/view controllers/TSMessageAdapter.m +++ b/Signal/src/view controllers/TSMessageAdapter.m @@ -41,13 +41,21 @@ if ([thread isKindOfClass:[TSContactThread class]]) { adapter.thread = (TSContactThread*)thread; + if ([interaction isKindOfClass:[TSIncomingMessage class]]) { + NSString *contactId = ((TSContactThread*)thread).contactIdentifier; + adapter.senderId = contactId; + adapter.senderDisplayName = contactId; + } else{ + adapter.senderId = ME_MESSAGE_IDENTIFIER; + adapter.senderDisplayName = @"Me"; + } } else if ([thread isKindOfClass:[TSGroupThread class]]){ if ([interaction isKindOfClass:[TSIncomingMessage class]]) { TSIncomingMessage *message = (TSIncomingMessage*)interaction; adapter.senderId = message.authorId; adapter.senderDisplayName = message.authorId; } else{ - adapter.senderId = @"self"; + adapter.senderId = ME_MESSAGE_IDENTIFIER; adapter.senderDisplayName = @"Me"; } } @@ -68,7 +76,12 @@ - (NSString*)senderId{ - return self.thread.uniqueId; + if (_senderId) { + return _senderId; + } + else{ + return ME_MESSAGE_IDENTIFIER; + } } - (NSString *)senderDisplayName{ diff --git a/Signal/src/view controllers/UITests/SignalsViewController.m b/Signal/src/view controllers/UITests/SignalsViewController.m index acd0cd1da..ef7848dc7 100644 --- a/Signal/src/view controllers/UITests/SignalsViewController.m +++ b/Signal/src/view controllers/UITests/SignalsViewController.m @@ -68,21 +68,7 @@ static NSString *const kSegueIndentifier = @"showSegue"; -(void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; - - if ([self.threadMappings numberOfItemsInAllGroups]==0) - { - CGRect r = CGRectMake(0, 60, 300, 70); - _emptyViewLabel = [[UILabel alloc]initWithFrame:r]; - _emptyViewLabel.text = @"You have no messages yet."; - _emptyViewLabel.textColor = [UIColor grayColor]; - _emptyViewLabel.font = [UIFont ows_thinFontWithSize:14.0f]; - _emptyViewLabel.textAlignment = NSTextAlignmentCenter; - self.tableView.tableHeaderView = _emptyViewLabel; - } else { - _emptyViewLabel = nil; - self.tableView.tableHeaderView = nil; - } - + [self updateTableViewHeader]; } - (void)didReceiveMemoryWarning { @@ -109,7 +95,7 @@ static NSString *const kSegueIndentifier = @"showSegue"; - (InboxTableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath { InboxTableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:inboxTableViewCell]; - TSThread *thread = [self threadForIndexPath:indexPath]; + TSThread *thread = [self threadForIndexPath:indexPath]; if (!cell) { cell = [[InboxTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault @@ -143,9 +129,7 @@ static NSString *const kSegueIndentifier = @"showSegue"; NSIndexPath *indexPath = [self.tableView indexPathForCell:cell]; TSThread *thread = [self threadForIndexPath:indexPath]; - [[TSStorageManager sharedManager].dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { - [thread removeWithTransaction:transaction]; - }]; + [thread remove]; } - (void)tableViewCellTappedArchive:(InboxTableViewCell*)cell { @@ -282,5 +266,23 @@ static NSString *const kSegueIndentifier = @"showSegue"; } [self.tableView endUpdates]; + [self updateTableViewHeader]; } + +- (void)updateTableViewHeader{ + if ([self.threadMappings numberOfItemsInAllGroups]==0) + { + CGRect r = CGRectMake(0, 60, 300, 70); + _emptyViewLabel = [[UILabel alloc]initWithFrame:r]; + _emptyViewLabel.text = @"You have no messages yet."; + _emptyViewLabel.textColor = [UIColor grayColor]; + _emptyViewLabel.font = [UIFont ows_thinFontWithSize:14.0f]; + _emptyViewLabel.textAlignment = NSTextAlignmentCenter; + self.tableView.tableHeaderView = _emptyViewLabel; + } else { + _emptyViewLabel = nil; + self.tableView.tableHeaderView = nil; + } +} + @end