Integration work - thread view

pull/1/head
Frederic Jacobs 11 years ago
parent b58d2fb864
commit 1e3dd3d946

@ -48,7 +48,8 @@ typedef void(^ABReloadRequestCompletionBlock)(NSArray *contacts);
- (BOOL)isContactRegisteredWithTextSecure:(Contact*)contact; - (BOOL)isContactRegisteredWithTextSecure:(Contact*)contact;
-(void)doAfterEnvironmentInitSetup; -(void)doAfterEnvironmentInitSetup;
- (NSString*)nameStringForPhoneIdentifier:(NSString*)identifier;
- (NSString*)nameStringForPhoneIdentifier:(NSString*)identifier;
- (UIImage*)imageForPhoneIdentifier:(NSString*)identifier;
@end @end

@ -436,4 +436,15 @@ void onAddressBookChanged(ABAddressBookRef notifyAddressBook, CFDictionaryRef in
return nil; 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 @end

@ -46,4 +46,8 @@
- (NSDate*)lastMessageDate; - (NSDate*)lastMessageDate;
- (NSString*)lastMessageLabel;
- (int)unreadMessages;
@end @end

@ -7,6 +7,10 @@
// //
#import "TSThread.h" #import "TSThread.h"
#import "Environment.h"
#import "ContactsManager.h"
#import "TSInteraction.h"
#import "TSStorageManager.h"
#import "TSGroup.h" #import "TSGroup.h"
@implementation TSThread @implementation TSThread
@ -19,7 +23,8 @@
self = [super initWithUniqueId:uniqueId]; self = [super initWithUniqueId:uniqueId];
if (self) { if (self) {
_blocked = NO; _blocked = NO;
_lastMessageId = 0;
} }
return self; return self;
@ -31,15 +36,41 @@
} }
- (uint64_t)lastMessageId{ - (uint64_t)lastMessageId{
return 0; return _lastMessageId;
} }
- (NSDate*)lastMessageDate{ - (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{ - (UIImage*)image{
return nil; 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 @end

@ -57,6 +57,11 @@
return name; return name;
} }
- (UIImage*)image{
UIImage *image = [[Environment getCurrent].contactsManager imageForPhoneIdentifier:self.contactIdentifier];
return image;
}
+ (NSString*)threadIdFromContactId:(NSString*)contactId{ + (NSString*)threadIdFromContactId:(NSString*)contactId{
return [TSContactThreadPrefix stringByAppendingString:contactId]; return [TSContactThreadPrefix stringByAppendingString:contactId];
} }

@ -30,8 +30,11 @@ extern const struct TSMessageEdges {
- (NSDate*)date; - (NSDate*)date;
- (uint64_t)timeStamp; - (uint64_t)timeStamp;
- (NSString*)description;
#pragma mark Utility Method #pragma mark Utility Method
+ (NSString*)stringFromTimeStamp:(uint64_t)timestamp; + (NSString*)stringFromTimeStamp:(uint64_t)timestamp;
+ (uint64_t)timeStampFromString:(NSString*)string;
@end @end

@ -52,10 +52,7 @@ const struct TSMessageEdges TSMessageEdges = {
#pragma mark Date operations #pragma mark Date operations
- (uint64_t)identifierToTimestamp{ - (uint64_t)identifierToTimestamp{
NSNumberFormatter * f = [[NSNumberFormatter alloc] init]; return [[self class] timeStampFromString:self.uniqueId];
[f setNumberStyle:NSNumberFormatterNoStyle];
NSNumber * myNumber = [f numberFromString:self.uniqueId];
return [myNumber unsignedLongLongValue];
} }
- (NSDate*)date{ - (NSDate*)date{
@ -72,4 +69,15 @@ const struct TSMessageEdges TSMessageEdges = {
return [[NSNumber numberWithUnsignedLongLong:timestamp] stringValue]; 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 @end

@ -94,6 +94,9 @@
[self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { [self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) {
[message setMessageState:TSOutgoingMessageStateSent]; [message setMessageState:TSOutgoingMessageStateSent];
[message saveWithTransaction:transaction]; [message saveWithTransaction:transaction];
TSThread *fetchedThread = [TSThread fetchObjectWithUniqueID:thread.uniqueId];
fetchedThread.lastMessageId = [TSInteraction timeStampFromString:message.uniqueId];
[thread saveWithTransaction:transaction];
}]; }];
} }

@ -211,6 +211,7 @@
} }
[incomingMessage saveWithTransaction:transaction]; [incomingMessage saveWithTransaction:transaction];
thread.lastMessageId = [TSInteraction timeStampFromString:incomingMessage.uniqueId];
[thread saveWithTransaction:transaction]; [thread saveWithTransaction:transaction];
}]; }];
} }

@ -36,8 +36,7 @@
}]; }];
} }
- (void)removeWithTransaction:(YapDatabaseReadWriteTransaction *)transaction - (void)removeWithTransaction:(YapDatabaseReadWriteTransaction *)transaction{
{
[transaction removeObjectForKey:self.uniqueId inCollection:[[self class] collection]]; [transaction removeObjectForKey:self.uniqueId inCollection:[[self class] collection]];
} }
@ -45,6 +44,7 @@
- (void)remove{ - (void)remove{
[[TSStorageManager sharedManager].dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { [[TSStorageManager sharedManager].dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) {
[self removeWithTransaction:transaction]; [self removeWithTransaction:transaction];
[[transaction ext:@"relationships"] flush];
}]; }];
} }

@ -43,10 +43,10 @@
-(void)configureWithThread:(TSThread*)thread { -(void)configureWithThread:(TSThread*)thread {
_nameLabel.text = thread.name; _nameLabel.text = thread.name;
_snippetLabel.text = @"Missing implementation"; _snippetLabel.text = thread.lastMessageLabel;
_contactPictureView.image = nil; _contactPictureView.image = thread.image;
_timeLabel.attributedText = [self dateAttributedString:thread.lastMessageDate]; _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 [self setUpLastAction:@"read"]; // TODO: Change
} }

@ -12,8 +12,6 @@
@class TSThread; @class TSThread;
@interface MessagesViewController : JSQMessagesViewController <UIImagePickerControllerDelegate,UINavigationControllerDelegate> @interface MessagesViewController : JSQMessagesViewController <UIImagePickerControllerDelegate,UINavigationControllerDelegate>
@property (strong, nonatomic) NSString* senderTitleString;
@property TSThread *thread; @property TSThread *thread;
- (void)setupWithThread:(TSThread*)thread; - (void)setupWithThread:(TSThread*)thread;

@ -57,6 +57,8 @@ typedef enum : NSUInteger {
[super viewDidLoad]; [super viewDidLoad];
// Do any additional setup after loading the view. // Do any additional setup after loading the view.
isGroupConversation = NO; // TODO: Support Group Conversations
JSQMessagesBubbleImageFactory *bubbleFactory = [[JSQMessagesBubbleImageFactory alloc] init]; JSQMessagesBubbleImageFactory *bubbleFactory = [[JSQMessagesBubbleImageFactory alloc] init];
self.outgoingBubbleImageData = [bubbleFactory outgoingMessagesBubbleImageWithColor:[UIColor jsq_messageBubbleBlueColor]]; self.outgoingBubbleImageData = [bubbleFactory outgoingMessagesBubbleImageWithColor:[UIColor jsq_messageBubbleBlueColor]];
@ -66,7 +68,6 @@ typedef enum : NSUInteger {
[self.uiDatabaseConnection readWithBlock:^(YapDatabaseReadTransaction *transaction) { [self.uiDatabaseConnection readWithBlock:^(YapDatabaseReadTransaction *transaction) {
[self.messageMappings updateWithTransaction: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)]; 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.showsVerticalScrollIndicator = NO;
self.collectionView.showsHorizontalScrollIndicator = NO; self.collectionView.showsHorizontalScrollIndicator = NO;
//DEBUG: self.title = self.thread.name;
isGroupConversation = NO;
self.title = self.senderTitleString;
self.senderId = @"self"; self.senderId = ME_MESSAGE_IDENTIFIER
self.senderDisplayName = @"self"; self.senderDisplayName = ME_MESSAGE_IDENTIFIER;
self.automaticallyScrollsToMostRecentMessage = YES; self.automaticallyScrollsToMostRecentMessage = YES;
@ -142,8 +140,9 @@ typedef enum : NSUInteger {
#pragma mark - JSQMessage custom methods #pragma mark - JSQMessage custom methods
-(void)updateMessageStatus:(JSQMessage*)message { -(void)updateMessageStatus:(JSQMessage*)message {
if ([message.senderId isEqualToString:self.senderId]) if ([message.senderId isEqualToString:self.senderId]){
message.status = kMessageReceived; message.status = kMessageReceived;
}
} }
#pragma mark - JSQMessagesViewController method overrides #pragma mark - JSQMessagesViewController method overrides

@ -13,6 +13,8 @@
#import "TSInteraction.h" #import "TSInteraction.h"
#import "TSThread.h" #import "TSThread.h"
#define ME_MESSAGE_IDENTIFIER @"Me";
@interface TSMessageAdapter : NSObject <JSQMessageData> @interface TSMessageAdapter : NSObject <JSQMessageData>
+ (instancetype)messageViewDataWithInteraction:(TSInteraction*)interaction inThread:(TSThread*)thread; + (instancetype)messageViewDataWithInteraction:(TSInteraction*)interaction inThread:(TSThread*)thread;

@ -41,13 +41,21 @@
if ([thread isKindOfClass:[TSContactThread class]]) { if ([thread isKindOfClass:[TSContactThread class]]) {
adapter.thread = (TSContactThread*)thread; 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]]){ } else if ([thread isKindOfClass:[TSGroupThread class]]){
if ([interaction isKindOfClass:[TSIncomingMessage class]]) { if ([interaction isKindOfClass:[TSIncomingMessage class]]) {
TSIncomingMessage *message = (TSIncomingMessage*)interaction; TSIncomingMessage *message = (TSIncomingMessage*)interaction;
adapter.senderId = message.authorId; adapter.senderId = message.authorId;
adapter.senderDisplayName = message.authorId; adapter.senderDisplayName = message.authorId;
} else{ } else{
adapter.senderId = @"self"; adapter.senderId = ME_MESSAGE_IDENTIFIER;
adapter.senderDisplayName = @"Me"; adapter.senderDisplayName = @"Me";
} }
} }
@ -68,7 +76,12 @@
- (NSString*)senderId{ - (NSString*)senderId{
return self.thread.uniqueId; if (_senderId) {
return _senderId;
}
else{
return ME_MESSAGE_IDENTIFIER;
}
} }
- (NSString *)senderDisplayName{ - (NSString *)senderDisplayName{

@ -68,21 +68,7 @@ static NSString *const kSegueIndentifier = @"showSegue";
-(void)viewWillAppear:(BOOL)animated -(void)viewWillAppear:(BOOL)animated
{ {
[super viewWillAppear:animated]; [super viewWillAppear:animated];
[self 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;
}
} }
- (void)didReceiveMemoryWarning { - (void)didReceiveMemoryWarning {
@ -109,7 +95,7 @@ static NSString *const kSegueIndentifier = @"showSegue";
- (InboxTableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath { - (InboxTableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath {
InboxTableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:inboxTableViewCell]; InboxTableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:inboxTableViewCell];
TSThread *thread = [self threadForIndexPath:indexPath]; TSThread *thread = [self threadForIndexPath:indexPath];
if (!cell) { if (!cell) {
cell = [[InboxTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault cell = [[InboxTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
@ -143,9 +129,7 @@ static NSString *const kSegueIndentifier = @"showSegue";
NSIndexPath *indexPath = [self.tableView indexPathForCell:cell]; NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];
TSThread *thread = [self threadForIndexPath:indexPath]; TSThread *thread = [self threadForIndexPath:indexPath];
[[TSStorageManager sharedManager].dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { [thread remove];
[thread removeWithTransaction:transaction];
}];
} }
- (void)tableViewCellTappedArchive:(InboxTableViewCell*)cell { - (void)tableViewCellTappedArchive:(InboxTableViewCell*)cell {
@ -282,5 +266,23 @@ static NSString *const kSegueIndentifier = @"showSegue";
} }
[self.tableView endUpdates]; [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 @end

Loading…
Cancel
Save