session-ios/Signal/src/view controllers/TSMessageAdapter.m

182 lines
5.6 KiB
Mathematica
Raw Normal View History

2014-11-25 16:38:33 +01:00
//
// TSMessageAdapter.m
// Signal
//
// Created by Frederic Jacobs on 24/11/14.
// Copyright (c) 2014 Open Whisper Systems. All rights reserved.
//
#import "TSMessageAdapter.h"
#import "TSIncomingMessage.h"
#import "TSOutgoingMessage.h"
#import "TSCall.h"
#import "TSInfoMessage.h"
#import "TSErrorMessage.h"
2014-12-21 12:52:42 +01:00
#import "TSattachment.h"
#import "TSAttachmentStream.h"
#import "TSAttachmentAdapter.h"
#import "TSAttachmentPointer.h"
2014-11-25 16:38:33 +01:00
@interface TSMessageAdapter ()
// ---
@property (nonatomic, retain) TSContactThread *thread;
// OR for groups
@property (nonatomic, retain) NSString *senderId;
@property (nonatomic, retain) NSString *senderDisplayName;
// for InfoMessages
@property NSInteger infoMessageType;
// for ErrorMessages
@property NSInteger errorMessageType;
// for outgoing Messages only
@property NSInteger outgoingMessageStatus;
2014-12-18 00:00:10 +01:00
// for MediaMessages
@property JSQMediaItem *mediaItem;
2014-11-25 16:38:33 +01:00
// ---
@property (nonatomic, copy) NSDate *messageDate;
@property (nonatomic, retain) NSString *messageBody;
2014-11-27 03:10:00 +01:00
@property NSUInteger identifier;
2014-11-25 16:38:33 +01:00
@end
@implementation TSMessageAdapter
2014-12-18 00:00:10 +01:00
+ (id<JSQMessageData>)messageViewDataWithInteraction:(TSInteraction*)interaction inThread:(TSThread*)thread{
2014-11-25 16:38:33 +01:00
TSMessageAdapter *adapter = [[TSMessageAdapter alloc] init];
2014-12-18 00:00:10 +01:00
adapter.messageDate = interaction.date;
adapter.identifier = (NSUInteger)interaction.uniqueId;
2014-11-27 03:10:00 +01:00
2014-11-25 16:38:33 +01:00
if ([thread isKindOfClass:[TSContactThread class]]) {
adapter.thread = (TSContactThread*)thread;
2014-11-25 19:06:09 +01:00
if ([interaction isKindOfClass:[TSIncomingMessage class]]) {
NSString *contactId = ((TSContactThread*)thread).contactIdentifier;
adapter.senderId = contactId;
adapter.senderDisplayName = contactId;
adapter.messageType = TSIncomingMessageAdapter;
} else {
2014-11-25 19:06:09 +01:00
adapter.senderId = ME_MESSAGE_IDENTIFIER;
adapter.senderDisplayName = @"Me";
adapter.messageType = TSOutgoingMessageAdapter;
2014-11-25 19:06:09 +01:00
}
2014-11-25 16:38:33 +01:00
} else if ([thread isKindOfClass:[TSGroupThread class]]){
if ([interaction isKindOfClass:[TSIncomingMessage class]]) {
TSIncomingMessage *message = (TSIncomingMessage*)interaction;
adapter.senderId = message.authorId;
adapter.senderDisplayName = message.authorId;
adapter.messageType = TSIncomingMessageAdapter;
} else {
2014-11-25 19:06:09 +01:00
adapter.senderId = ME_MESSAGE_IDENTIFIER;
2014-11-25 16:38:33 +01:00
adapter.senderDisplayName = @"Me";
adapter.messageType = TSOutgoingMessageAdapter;
2014-11-25 16:38:33 +01:00
}
}
2014-11-27 03:10:00 +01:00
if ([interaction isKindOfClass:[TSIncomingMessage class]] || [interaction isKindOfClass:[TSOutgoingMessage class]]) {
2014-11-25 16:38:33 +01:00
TSMessage *message = (TSMessage*)interaction;
adapter.messageBody = message.body;
2014-12-18 00:00:10 +01:00
2014-12-22 00:40:15 +01:00
if ([message.attachments count] > 0) {
2014-12-18 00:00:10 +01:00
2014-12-21 12:52:42 +01:00
for (NSString *attachmentID in message.attachments) {
TSAttachment *attachment = [TSAttachment fetchObjectWithUniqueID:attachmentID];
2014-12-21 12:52:42 +01:00
if ([attachment isKindOfClass:[TSAttachmentStream class]]) {
TSAttachmentStream *stream = (TSAttachmentStream*)attachment;
2014-12-18 00:00:10 +01:00
if ([stream isImage]) {
2014-12-21 12:52:42 +01:00
adapter.mediaItem = [[TSAttachmentAdapter alloc] initWithAttachment:stream];
2014-12-18 00:00:10 +01:00
adapter.mediaItem.appliesMediaViewMaskAsOutgoing = [interaction isKindOfClass:[TSOutgoingMessage class]];
break;
} else {
DDLogWarn(@"We have a TSAttachmentStream for an unsupported media type");
2014-12-18 00:00:10 +01:00
}
} else if ([attachment isKindOfClass:[TSAttachmentPointer class]]){
//TSAttachmentPointer *pointer = (TSAttachmentPointer*)attachment;
//TODO: Change this status when download failed;
adapter.messageBody = @"Attachment is downloading";
adapter.messageType = TSInfoMessageAdapter;
} else {
DDLogError(@"We retreived an attachment that doesn't have a known type : %@", NSStringFromClass([attachment class]));
2014-12-18 00:00:10 +01:00
}
}
}
2014-11-25 16:38:33 +01:00
} else if ([interaction isKindOfClass:[TSCall class]]){
adapter.messageBody = @"Placeholder for TSCalls";
adapter.messageType = TSCallAdapter;
2014-11-25 16:38:33 +01:00
} else if ([interaction isKindOfClass:[TSInfoMessage class]]){
TSInfoMessage * infoMessage = (TSInfoMessage*)interaction;
adapter.infoMessageType = infoMessage.messageType;
adapter.messageBody = infoMessage.description;
adapter.messageType = TSInfoMessageAdapter;
} else {
TSErrorMessage * errorMessage = (TSErrorMessage*)interaction;
adapter.infoMessageType = errorMessage.errorType;
adapter.messageBody = errorMessage.description;
adapter.messageType = TSErrorMessageAdapter;
2014-11-25 16:38:33 +01:00
}
if ([interaction isKindOfClass:[TSOutgoingMessage class]]) {
adapter.outgoingMessageStatus = ((TSOutgoingMessage*)interaction).messageState;
}
2014-11-25 16:38:33 +01:00
return adapter;
}
- (NSString*)senderId{
2014-11-25 19:06:09 +01:00
if (_senderId) {
return _senderId;
}
else{
return ME_MESSAGE_IDENTIFIER;
}
2014-11-25 16:38:33 +01:00
}
- (NSString *)senderDisplayName{
if (self.thread) {
return _thread.name;
}
return self.senderDisplayName;
}
- (NSDate *)date{
return self.messageDate;
}
- (BOOL)isMediaMessage{
2014-12-18 00:00:10 +01:00
return _mediaItem?YES:NO;
}
- (id<JSQMessageMediaData>)media{
return _mediaItem;
2014-11-25 16:38:33 +01:00
}
- (NSString *)text{
return self.messageBody;
}
2014-11-27 03:10:00 +01:00
- (NSUInteger)hash{
return self.identifier;
}
- (NSInteger)messageState{
return self.outgoingMessageStatus;
}
2014-11-25 16:38:33 +01:00
@end