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;
+ (NSArray<NSNumber *> *)validDurationsSeconds;
+ (uint32_t)maxDurationSeconds;
@end

@ -64,17 +64,29 @@ NS_ASSUME_NONNULL_BEGIN
+ (NSArray<NSNumber *> *)validDurationsSeconds
{
return @[ @(5),
@(10),
@(30),
@(60),
@(300),
@(1800),
@(3600),
@(21600),
@(43200),
@(86400),
@(604800) ];
return @[
@(5 * kSecondInterval),
@(10 * kSecondInterval),
@(30 * kSecondInterval),
@(1 * kMinuteInterval),
@(5 * kMinuteInterval),
@(30 * kMinuteInterval),
@(1 * kHourInterval),
@(6 * kHourInterval),
@(12 * kHourInterval),
@(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

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

@ -151,11 +151,11 @@ NS_ASSUME_NONNULL_BEGIN
{
OWSAssert(transaction);
if (_read && readTimestamp <= self.expireStartedAt) {
if (_read && readTimestamp >= self.expireStartedAt) {
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",
self.logTag,
self.uniqueId,
@ -164,6 +164,13 @@ NS_ASSUME_NONNULL_BEGIN
_read = YES;
[self saveWithTransaction:transaction];
[self touchThreadWithTransaction:transaction];
[transaction addCompletionQueue:nil
completionBlock:^{
[[NSNotificationCenter defaultCenter]
postNotificationNameAsync:kIncomingMessageMarkedAsReadNotification
object:self];
}];
[[OWSDisappearingMessagesJob sharedJob] startAnyExpirationForMessage:self
expirationStartedAt:readTimestamp

@ -8,6 +8,7 @@
#import "NSDate+OWS.h"
#import "NSString+SSK.h"
#import "OWSContact.h"
#import "OWSDisappearingMessagesConfiguration.h"
#import "TSAttachment.h"
#import "TSAttachmentStream.h"
#import "TSQuotedMessage.h"
@ -153,13 +154,31 @@ static const NSUInteger OWSMessageSchemaVersion = 4;
- (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];
}
- (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];
}

@ -21,10 +21,6 @@ NS_ASSUME_NONNULL_BEGIN
expirationStartedAt:(uint64_t)expirationStartedAt
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
* become eventually consistent with remote senders.

@ -170,17 +170,6 @@ void AssertIsOnDisappearingMessagesQueue()
- (void)startAnyExpirationForMessage:(TSMessage *)message
expirationStartedAt:(uint64_t)expirationStartedAt
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);
@ -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.
uint64_t readTimeBestGuess = message.timestampForSorting;
[self setExpirationForMessage:message expirationStartedAt:readTimeBestGuess transaction:transaction];
[self startAnyExpirationForMessage:message expirationStartedAt:readTimeBestGuess transaction:transaction];
}
transaction:transaction];
}

@ -438,13 +438,6 @@ NSString *const OWSReadReceiptManagerAreReadReceiptsEnabled = @"areReadReceiptsE
[message markAsReadAtTimestamp:readReceipt.readTimestamp sendReadReceipt:NO transaction:transaction];
[readReceipt removeWithTransaction:transaction];
[transaction addCompletionQueue:nil
completionBlock:^{
[[NSNotificationCenter defaultCenter]
postNotificationNameAsync:kIncomingMessageMarkedAsReadNotification
object:message];
}];
}
- (void)processReadReceiptsFromLinkedDevice:(NSArray<OWSSignalServiceProtosSyncMessageRead *> *)readReceiptProtos
@ -498,6 +491,11 @@ NSString *const OWSReadReceiptManagerAreReadReceiptsEnabled = @"areReadReceiptsE
OWSAssert(message);
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`
// which reflect sender time.
[self markAsReadBeforeTimestamp:message.timestampForSorting
@ -547,10 +545,9 @@ NSString *const OWSReadReceiptManagerAreReadReceiptsEnabled = @"areReadReceiptsE
}
OWSAssert(!possiblyRead.read);
OWSAssert(possiblyRead.expireStartedAt == 0);
if (!possiblyRead.read) {
[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) {
[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