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

187 lines
5.8 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 "TSDatabaseView.h"
2014-11-25 19:06:09 +01:00
#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, copy) NSDate *archivalDate;
@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) {
_archivalDate = nil;
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;
}
- (NSDate *)archivalDate{
return _archivalDate;
}
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)markAllAsReadWithTransaction:(YapDatabaseReadWriteTransaction*)transaction {
YapDatabaseViewTransaction *viewTransaction = [transaction ext:TSUnreadDatabaseViewExtensionName];
NSMutableArray *array = [NSMutableArray array];
[viewTransaction enumerateRowsInGroup:self.uniqueId usingBlock:^(NSString *collection, NSString *key, id object, id metadata, NSUInteger index, BOOL *stop) {
[array addObject:object];
}];
for (TSIncomingMessage *message in array) {
message.read = YES;
[message saveWithTransaction:transaction];
}
}
- (void)archiveThreadWithTransaction:(YapDatabaseReadWriteTransaction *)transaction {
[self archiveThreadWithTransaction:transaction referenceDate:[NSDate date]];
}
- (void)archiveThreadWithTransaction:(YapDatabaseReadWriteTransaction*)transaction referenceDate:(NSDate*)date {
[self markAllAsReadWithTransaction:transaction];
_archivalDate = date;
[self saveWithTransaction:transaction];
}
- (void)unarchiveThreadWithTransaction:(YapDatabaseReadWriteTransaction*)transaction {
_archivalDate = nil;
[self saveWithTransaction:transaction];
}
- (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