session-ios/Signal/src/textsecure/Contacts/TSThread.m

151 lines
4.5 KiB
Mathematica
Raw Normal View History

//
// TSThread.m
// TextSecureKit
//
// Created by Frederic Jacobs on 16/11/14.
// Copyright (c) 2014 Open Whisper Systems. All rights reserved.
//
#import "TSThread.h"
2014-11-25 19:06:09 +01:00
#import "ContactsManager.h"
#import "TSInteraction.h"
#import "TSStorageManager.h"
#import "TSCall.h"
#import "TSOutgoingMessage.h"
#import "TSIncomingMessage.h"
#import "TSInfoMessage.h"
#import "TSErrorMessage.h"
@interface TSThread ()
@property (nonatomic, retain) NSDate *creationDate;
@property (nonatomic, retain) NSDate *lastMessageDate;
@property (nonatomic, copy ) NSString *latestMessageId;
@end
@implementation TSThread
+ (NSString *)collection{
return @"TSThread";
}
- (instancetype)initWithUniqueId:(NSString *)uniqueId{
self = [super initWithUniqueId:uniqueId];
if (self) {
2015-01-26 01:15:22 +01:00
_latestMessageId = nil;
_lastMessageDate = nil;
_creationDate = [NSDate date];
}
return self;
}
- (BOOL)isGroupThread{
NSAssert(false, @"An abstract method on TSThread was called.");
return FALSE;
}
- (NSDate *)lastMessageDate{
if (_lastMessageDate) {
return _lastMessageDate;
} else {
return _creationDate;
2014-11-25 19:06:09 +01:00
}
}
- (UIImage*)image{
return nil;
}
2014-11-25 19:06:09 +01:00
- (NSString*)lastMessageLabel{
__block TSInteraction *interaction;
[[TSStorageManager sharedManager].dbConnection readWithBlock:^(YapDatabaseReadTransaction *transaction) {
2015-01-26 01:15:22 +01:00
interaction = [TSInteraction fetchObjectWithUniqueID:self.latestMessageId transaction:transaction];
2014-11-25 19:06:09 +01:00
}];
return interaction.description;
}
- (TSLastActionType)lastAction
{
__block TSInteraction *interaction;
[[TSStorageManager sharedManager].dbConnection readWithBlock:^(YapDatabaseReadTransaction *transaction) {
2015-01-26 01:15:22 +01:00
interaction = [TSInteraction fetchObjectWithUniqueID:self.latestMessageId transaction:transaction];
}];
return [self lastActionForInteraction:interaction];
}
- (TSLastActionType)lastActionForInteraction:(TSInteraction*)interaction
{
if ([interaction isKindOfClass:[TSCall class]])
{
TSCall * callInteraction = (TSCall*)interaction;
switch (callInteraction.callType) {
2014-12-29 22:40:33 +01:00
case RPRecentCallTypeMissed:
return TSLastActionCallIncomingMissed;
case RPRecentCallTypeIncoming:
return TSLastActionCallIncoming;
case RPRecentCallTypeOutgoing:
return TSLastActionCallOutgoing;
default:
return TSLastActionNone;
}
} else if ([interaction isKindOfClass:[TSOutgoingMessage class]]) {
TSOutgoingMessage * outgoingMessageInteraction = (TSOutgoingMessage*)interaction;
switch (outgoingMessageInteraction.messageState) {
case TSOutgoingMessageStateAttemptingOut:
return TSLastActionNone;
case TSOutgoingMessageStateUnsent:
return TSLastActionMessageUnsent;
case TSOutgoingMessageStateSent:
return TSLastActionMessageSent;
case TSOutgoingMessageStateDelivered:
return TSLastActionMessageDelivered;
default:
return TSLastActionNone;
}
} else if ([interaction isKindOfClass:[TSIncomingMessage class]]) {
return self.hasUnreadMessages ? TSLastActionMessageIncomingUnread : TSLastActionMessageIncomingRead ;
} else if ([interaction isKindOfClass:[TSErrorMessage class]]) {
return TSLastActionErrorMessage;
} else if ([interaction isKindOfClass:[TSInfoMessage class]]) {
return TSLastActionInfoMessage;
} else {
return TSLastActionNone;
}
}
- (BOOL)hasUnreadMessages{
__block TSInteraction * interaction;
__block BOOL hasUnread = NO;
[[TSStorageManager sharedManager].dbConnection readWithBlock:^(YapDatabaseReadTransaction *transaction) {
2015-01-26 01:15:22 +01:00
interaction = [TSInteraction fetchObjectWithUniqueID:self.latestMessageId transaction:transaction];
if ([interaction isKindOfClass:[TSIncomingMessage class]]){
hasUnread = ![(TSIncomingMessage*)interaction wasRead];
}
}];
return hasUnread;
2014-11-25 19:06:09 +01:00
}
- (void)updateWithLastMessage:(TSInteraction*)lastMessage transaction:(YapDatabaseReadWriteTransaction*)transaction {
if (!_lastMessageDate || [lastMessage.date timeIntervalSinceDate:self.lastMessageDate] > 0) {
_latestMessageId = lastMessage.uniqueId;
_lastMessageDate = lastMessage.date;
[self saveWithTransaction:transaction];
}
}
2014-11-25 19:06:09 +01:00
- (NSString *)name{
NSAssert(FALSE, @"Should be implemented in subclasses");
return nil;
}
@end