Merge branch 'mkirk/disappear'

pull/1/head
Michael Kirk 7 years ago
commit a9e5d43fc8

@ -27,6 +27,7 @@ NS_ASSUME_NONNULL_BEGIN
transaction:(YapDatabaseReadTransaction *)transaction; transaction:(YapDatabaseReadTransaction *)transaction;
+ (NSArray<NSNumber *> *)validDurationsSeconds; + (NSArray<NSNumber *> *)validDurationsSeconds;
+ (uint32_t)maxDurationSeconds;
@end @end

@ -64,17 +64,29 @@ NS_ASSUME_NONNULL_BEGIN
+ (NSArray<NSNumber *> *)validDurationsSeconds + (NSArray<NSNumber *> *)validDurationsSeconds
{ {
return @[ @(5), return @[
@(10), @(5 * kSecondInterval),
@(30), @(10 * kSecondInterval),
@(60), @(30 * kSecondInterval),
@(300), @(1 * kMinuteInterval),
@(1800), @(5 * kMinuteInterval),
@(3600), @(30 * kMinuteInterval),
@(21600), @(1 * kHourInterval),
@(43200), @(6 * kHourInterval),
@(86400), @(12 * kHourInterval),
@(604800) ]; @(24 * kHourInterval),
@(1 * kWeekInterval)
];
}
+ (uint32_t)maxDurationSeconds
{
uint32_t max = [[self.validDurationsSeconds valueForKeyPath:@"@max.intValue"] unsignedIntValue];
// It's safe to update this assert if we add a larger duration
OWSAssert(max == 1 * kWeekInterval);
return max;
} }
- (NSUInteger)durationIndex - (NSUInteger)durationIndex

@ -151,9 +151,9 @@ NS_ASSUME_NONNULL_BEGIN
[[OWSDisappearingMessagesJob sharedJob] becomeConsistentWithConfigurationForMessage:outgoingMessage [[OWSDisappearingMessagesJob sharedJob] becomeConsistentWithConfigurationForMessage:outgoingMessage
contactsManager:self.contactsManager contactsManager:self.contactsManager
transaction:transaction]; transaction:transaction];
[[OWSDisappearingMessagesJob sharedJob] setExpirationForMessage:outgoingMessage [[OWSDisappearingMessagesJob sharedJob] startAnyExpirationForMessage:outgoingMessage
expirationStartedAt:transcript.expirationStartedAt expirationStartedAt:transcript.expirationStartedAt
transaction:transaction]; transaction:transaction];
[self.readReceiptManager applyEarlyReadReceiptsForOutgoingMessageFromLinkedDevice:outgoingMessage [self.readReceiptManager applyEarlyReadReceiptsForOutgoingMessageFromLinkedDevice:outgoingMessage
transaction:transaction]; transaction:transaction];

@ -151,11 +151,11 @@ NS_ASSUME_NONNULL_BEGIN
{ {
OWSAssert(transaction); OWSAssert(transaction);
if (_read && readTimestamp <= self.expireStartedAt) { if (_read && readTimestamp >= self.expireStartedAt) {
return; return;
} }
NSTimeInterval secondsAgoRead = ([NSDate ows_millisecondTimeStamp] - readTimestamp) / 1000; NSTimeInterval secondsAgoRead = ((NSTimeInterval)[NSDate ows_millisecondTimeStamp] - (NSTimeInterval)readTimestamp) / 1000;
DDLogDebug(@"%@ marking uniqueId: %@ which has timestamp: %llu as read: %f seconds ago", DDLogDebug(@"%@ marking uniqueId: %@ which has timestamp: %llu as read: %f seconds ago",
self.logTag, self.logTag,
self.uniqueId, self.uniqueId,
@ -164,6 +164,13 @@ NS_ASSUME_NONNULL_BEGIN
_read = YES; _read = YES;
[self saveWithTransaction:transaction]; [self saveWithTransaction:transaction];
[self touchThreadWithTransaction:transaction]; [self touchThreadWithTransaction:transaction];
[transaction addCompletionQueue:nil
completionBlock:^{
[[NSNotificationCenter defaultCenter]
postNotificationNameAsync:kIncomingMessageMarkedAsReadNotification
object:self];
}];
[[OWSDisappearingMessagesJob sharedJob] startAnyExpirationForMessage:self [[OWSDisappearingMessagesJob sharedJob] startAnyExpirationForMessage:self
expirationStartedAt:readTimestamp expirationStartedAt:readTimestamp

@ -8,6 +8,7 @@
#import "NSDate+OWS.h" #import "NSDate+OWS.h"
#import "NSString+SSK.h" #import "NSString+SSK.h"
#import "OWSContact.h" #import "OWSContact.h"
#import "OWSDisappearingMessagesConfiguration.h"
#import "TSAttachment.h" #import "TSAttachment.h"
#import "TSAttachmentStream.h" #import "TSAttachmentStream.h"
#import "TSQuotedMessage.h" #import "TSQuotedMessage.h"
@ -153,13 +154,31 @@ static const NSUInteger OWSMessageSchemaVersion = 4;
- (void)setExpiresInSeconds:(uint32_t)expiresInSeconds - (void)setExpiresInSeconds:(uint32_t)expiresInSeconds
{ {
_expiresInSeconds = expiresInSeconds; uint32_t maxExpirationDuration = [OWSDisappearingMessagesConfiguration maxDurationSeconds];
if (expiresInSeconds > maxExpirationDuration) {
OWSProdLogAndFail(@"%@ in %s using `maxExpirationDuration` instead of: %u",
self.logTag,
__PRETTY_FUNCTION__,
maxExpirationDuration);
}
_expiresInSeconds = MIN(expiresInSeconds, maxExpirationDuration);
[self updateExpiresAt]; [self updateExpiresAt];
} }
- (void)setExpireStartedAt:(uint64_t)expireStartedAt - (void)setExpireStartedAt:(uint64_t)expireStartedAt
{ {
_expireStartedAt = expireStartedAt; if (_expireStartedAt != 0 && _expireStartedAt < expireStartedAt) {
DDLogDebug(@"%@ in %s ignoring later startedAt time", self.logTag, __PRETTY_FUNCTION__);
return;
}
uint64_t now = [NSDate ows_millisecondTimeStamp];
if (expireStartedAt > now) {
DDLogWarn(@"%@ in %s using `now` instead of future time", self.logTag, __PRETTY_FUNCTION__);
}
_expireStartedAt = MIN(now, expireStartedAt);
[self updateExpiresAt]; [self updateExpiresAt];
} }

@ -21,10 +21,6 @@ NS_ASSUME_NONNULL_BEGIN
expirationStartedAt:(uint64_t)expirationStartedAt expirationStartedAt:(uint64_t)expirationStartedAt
transaction:(YapDatabaseReadWriteTransaction *_Nonnull)transaction; transaction:(YapDatabaseReadWriteTransaction *_Nonnull)transaction;
- (void)setExpirationForMessage:(TSMessage *)message
expirationStartedAt:(uint64_t)expirationStartedAt
transaction:(YapDatabaseReadWriteTransaction *_Nonnull)transaction;
/** /**
* Synchronize our disappearing messages settings with that of the given message. Useful so we can * Synchronize our disappearing messages settings with that of the given message. Useful so we can
* become eventually consistent with remote senders. * become eventually consistent with remote senders.

@ -170,17 +170,6 @@ void AssertIsOnDisappearingMessagesQueue()
- (void)startAnyExpirationForMessage:(TSMessage *)message - (void)startAnyExpirationForMessage:(TSMessage *)message
expirationStartedAt:(uint64_t)expirationStartedAt expirationStartedAt:(uint64_t)expirationStartedAt
transaction:(YapDatabaseReadWriteTransaction *_Nonnull)transaction transaction:(YapDatabaseReadWriteTransaction *_Nonnull)transaction
{
if (!message.isExpiringMessage) {
return;
}
[self setExpirationForMessage:message expirationStartedAt:expirationStartedAt transaction:transaction];
}
- (void)setExpirationForMessage:(TSMessage *)message
expirationStartedAt:(uint64_t)expirationStartedAt
transaction:(YapDatabaseReadWriteTransaction *_Nonnull)transaction
{ {
OWSAssert(transaction); OWSAssert(transaction);
@ -401,7 +390,7 @@ void AssertIsOnDisappearingMessagesQueue()
// We don't know when it was actually read, so assume it was read as soon as it was received. // We don't know when it was actually read, so assume it was read as soon as it was received.
uint64_t readTimeBestGuess = message.timestampForSorting; uint64_t readTimeBestGuess = message.timestampForSorting;
[self setExpirationForMessage:message expirationStartedAt:readTimeBestGuess transaction:transaction]; [self startAnyExpirationForMessage:message expirationStartedAt:readTimeBestGuess transaction:transaction];
} }
transaction:transaction]; transaction:transaction];
} }

@ -438,13 +438,6 @@ NSString *const OWSReadReceiptManagerAreReadReceiptsEnabled = @"areReadReceiptsE
[message markAsReadAtTimestamp:readReceipt.readTimestamp sendReadReceipt:NO transaction:transaction]; [message markAsReadAtTimestamp:readReceipt.readTimestamp sendReadReceipt:NO transaction:transaction];
[readReceipt removeWithTransaction:transaction]; [readReceipt removeWithTransaction:transaction];
[transaction addCompletionQueue:nil
completionBlock:^{
[[NSNotificationCenter defaultCenter]
postNotificationNameAsync:kIncomingMessageMarkedAsReadNotification
object:message];
}];
} }
- (void)processReadReceiptsFromLinkedDevice:(NSArray<OWSSignalServiceProtosSyncMessageRead *> *)readReceiptProtos - (void)processReadReceiptsFromLinkedDevice:(NSArray<OWSSignalServiceProtosSyncMessageRead *> *)readReceiptProtos
@ -498,6 +491,11 @@ NSString *const OWSReadReceiptManagerAreReadReceiptsEnabled = @"areReadReceiptsE
OWSAssert(message); OWSAssert(message);
OWSAssert(transaction); OWSAssert(transaction);
// Always re-mark the message as read to ensure any earlier read time is applied to disappearing messages.
[message markAsReadAtTimestamp:readTimestamp sendReadReceipt:NO transaction:transaction];
// Also mark any messages appearing earlier in the thread as read.
//
// Use `timestampForSorting` which reflects local received order, rather than `timestamp` // Use `timestampForSorting` which reflects local received order, rather than `timestamp`
// which reflect sender time. // which reflect sender time.
[self markAsReadBeforeTimestamp:message.timestampForSorting [self markAsReadBeforeTimestamp:message.timestampForSorting
@ -547,10 +545,9 @@ NSString *const OWSReadReceiptManagerAreReadReceiptsEnabled = @"areReadReceiptsE
} }
OWSAssert(!possiblyRead.read); OWSAssert(!possiblyRead.read);
OWSAssert(possiblyRead.expireStartedAt == 0);
if (!possiblyRead.read) { if (!possiblyRead.read) {
[newlyReadList addObject:possiblyRead]; [newlyReadList addObject:possiblyRead];
} else if (readTimestamp < possiblyRead.expireStartedAt) {
[newlyReadList addObject:possiblyRead];
} }
}]; }];
@ -565,16 +562,6 @@ NSString *const OWSReadReceiptManagerAreReadReceiptsEnabled = @"areReadReceiptsE
} }
for (id<OWSReadTracking> readItem in newlyReadList) { for (id<OWSReadTracking> readItem in newlyReadList) {
[readItem markAsReadAtTimestamp:readTimestamp sendReadReceipt:wasLocal transaction:transaction]; [readItem markAsReadAtTimestamp:readTimestamp sendReadReceipt:wasLocal transaction:transaction];
if ([readItem isKindOfClass:[TSIncomingMessage class]]) {
TSIncomingMessage *incomingMessage = (TSIncomingMessage *)readItem;
[transaction addCompletionQueue:nil
completionBlock:^{
[[NSNotificationCenter defaultCenter]
postNotificationNameAsync:kIncomingMessageMarkedAsReadNotification
object:incomingMessage];
}];
}
} }
} }

Loading…
Cancel
Save