Merge pull request #386 from oxen-io/unread-count-bug

Fix Unread Count Bug
This commit is contained in:
Niels Andriesse 2021-04-15 10:14:08 +10:00 committed by GitHub
commit 513658c991
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 30 additions and 18 deletions

View file

@ -10,6 +10,7 @@ public class Message : NSObject, NSCoding { // NSObject/NSCoding conformance is
public var sender: String? public var sender: String?
public var groupPublicKey: String? public var groupPublicKey: String?
public var openGroupServerMessageID: UInt64? public var openGroupServerMessageID: UInt64?
public var openGroupServerTimestamp: UInt64?
public var ttl: UInt64 { 2 * 24 * 60 * 60 * 1000 } public var ttl: UInt64 { 2 * 24 * 60 * 60 * 1000 }
public var isSelfSendValid: Bool { false } public var isSelfSendValid: Bool { false }
@ -30,6 +31,10 @@ public class Message : NSObject, NSCoding { // NSObject/NSCoding conformance is
if let sentTimestamp = coder.decodeObject(forKey: "sentTimestamp") as! UInt64? { self.sentTimestamp = sentTimestamp } if let sentTimestamp = coder.decodeObject(forKey: "sentTimestamp") as! UInt64? { self.sentTimestamp = sentTimestamp }
if let receivedTimestamp = coder.decodeObject(forKey: "receivedTimestamp") as! UInt64? { self.receivedTimestamp = receivedTimestamp } if let receivedTimestamp = coder.decodeObject(forKey: "receivedTimestamp") as! UInt64? { self.receivedTimestamp = receivedTimestamp }
if let recipient = coder.decodeObject(forKey: "recipient") as! String? { self.recipient = recipient } if let recipient = coder.decodeObject(forKey: "recipient") as! String? { self.recipient = recipient }
if let sender = coder.decodeObject(forKey: "sender") as! String? { self.sender = sender }
if let groupPublicKey = coder.decodeObject(forKey: "groupPublicKey") as! String? { self.groupPublicKey = groupPublicKey }
if let openGroupServerMessageID = coder.decodeObject(forKey: "openGroupServerMessageID") as! UInt64? { self.openGroupServerMessageID = openGroupServerMessageID }
if let openGroupServerTimestamp = coder.decodeObject(forKey: "openGroupServerTimestamp") as! UInt64? { self.openGroupServerTimestamp = openGroupServerTimestamp }
} }
public func encode(with coder: NSCoder) { public func encode(with coder: NSCoder) {
@ -38,6 +43,10 @@ public class Message : NSObject, NSCoding { // NSObject/NSCoding conformance is
coder.encode(sentTimestamp, forKey: "sentTimestamp") coder.encode(sentTimestamp, forKey: "sentTimestamp")
coder.encode(receivedTimestamp, forKey: "receivedTimestamp") coder.encode(receivedTimestamp, forKey: "receivedTimestamp")
coder.encode(recipient, forKey: "recipient") coder.encode(recipient, forKey: "recipient")
coder.encode(sender, forKey: "sender")
coder.encode(groupPublicKey, forKey: "groupPublicKey")
coder.encode(openGroupServerMessageID, forKey: "openGroupServerMessageID")
coder.encode(openGroupServerTimestamp, forKey: "openGroupServerTimestamp")
} }
// MARK: Proto Conversion // MARK: Proto Conversion

View file

@ -19,7 +19,7 @@ public extension TSIncomingMessage {
expiresInSeconds: !isOpenGroupMessage ? expiration : 0, // Ensure we don't ever expire open group messages expiresInSeconds: !isOpenGroupMessage ? expiration : 0, // Ensure we don't ever expire open group messages
quotedMessage: quotedMessage, quotedMessage: quotedMessage,
linkPreview: linkPreview, linkPreview: linkPreview,
serverTimestamp: nil, serverTimestamp: visibleMessage.openGroupServerTimestamp as NSNumber?,
wasReceivedByUD: true wasReceivedByUD: true
) )
result.openGroupServerMessageID = openGroupServerMessageID result.openGroupServerMessageID = openGroupServerMessageID

View file

@ -41,8 +41,6 @@ NSString *NSStringFromOWSInteractionType(OWSInteractionType value);
@property (nonatomic, readonly) uint64_t receivedAtTimestamp; @property (nonatomic, readonly) uint64_t receivedAtTimestamp;
@property (nonatomic, readonly) BOOL shouldUseServerTime; @property (nonatomic, readonly) BOOL shouldUseServerTime;
- (void)setServerTimestampToReceivedTimestamp:(uint64_t)receivedAtTimestamp;
- (uint64_t)timestampForUI; - (uint64_t)timestampForUI;
- (NSDate *)receivedAtDate; - (NSDate *)receivedAtDate;

View file

@ -169,8 +169,8 @@ NSString *NSStringFromOWSInteractionType(OWSInteractionType value)
- (uint64_t)timestampForUI - (uint64_t)timestampForUI
{ {
if (_shouldUseServerTime) { if ([self isKindOfClass:TSIncomingMessage.class] && ((TSIncomingMessage *) self).isOpenGroupMessage) {
return _receivedAtTimestamp; return ((TSIncomingMessage *) self).serverTimestamp.unsignedLongLongValue;
} }
return _timestamp; return _timestamp;
} }
@ -180,14 +180,11 @@ NSString *NSStringFromOWSInteractionType(OWSInteractionType value)
return self.timestamp; return self.timestamp;
} }
- (void)setServerTimestampToReceivedTimestamp:(uint64_t)receivedAtTimestamp
{
_shouldUseServerTime = YES;
_receivedAtTimestamp = receivedAtTimestamp;
}
- (NSDate *)receivedAtDate - (NSDate *)receivedAtDate
{ {
if ([self isKindOfClass:TSIncomingMessage.class] && ((TSIncomingMessage *) self).isOpenGroupMessage) {
return [NSDate ows_dateWithMillisecondsSince1970:((TSIncomingMessage *) self).serverTimestamp.unsignedLongLongValue];
}
return [NSDate ows_dateWithMillisecondsSince1970:self.receivedAtTimestamp]; return [NSDate ows_dateWithMillisecondsSince1970:self.receivedAtTimestamp];
} }
@ -199,13 +196,10 @@ NSString *NSStringFromOWSInteractionType(OWSInteractionType value)
// In open groups messages should be sorted by server timestamp. `sortId` represents the order in which messages // In open groups messages should be sorted by server timestamp. `sortId` represents the order in which messages
// were processed. Since in the open group poller we sort messages by their server timestamp, sorting by `sortId` is // were processed. Since in the open group poller we sort messages by their server timestamp, sorting by `sortId` is
// effectively the same as sorting by server timestamp. // effectively the same as sorting by server timestamp.
if ([self isKindOfClass:TSMessage.class] && ((TSMessage *)self).isOpenGroupMessage) { // sortId == serverTimestamp for open group messages.
sortId1 = self.sortId; // sortId == timestamp (the sent timestamp) for one-to-one and closed group messages.
sortId2 = other.sortId; sortId1 = self.sortId;
} else { sortId2 = other.sortId;
sortId1 = self.timestamp;
sortId2 = other.timestamp;
}
if (sortId1 > sortId2) { if (sortId1 > sortId2) {
return NSOrderedDescending; return NSOrderedDescending;
@ -229,6 +223,14 @@ NSString *NSStringFromOWSInteractionType(OWSInteractionType value)
(unsigned long)self.timestamp]; (unsigned long)self.timestamp];
} }
- (uint64_t)sortId
{
if ([self isKindOfClass:TSIncomingMessage.class] && ((TSIncomingMessage *) self).isOpenGroupMessage) {
return ((TSIncomingMessage *) self).serverTimestamp.unsignedLongLongValue;
}
return self.timestamp;
}
- (void)saveWithTransaction:(YapDatabaseReadWriteTransaction *)transaction - (void)saveWithTransaction:(YapDatabaseReadWriteTransaction *)transaction
{ {
if (!self.uniqueId) { if (!self.uniqueId) {

View file

@ -146,6 +146,9 @@ public enum MessageReceiver {
message.recipient = userPublicKey message.recipient = userPublicKey
message.sentTimestamp = envelope.timestamp message.sentTimestamp = envelope.timestamp
message.receivedTimestamp = NSDate.millisecondTimestamp() message.receivedTimestamp = NSDate.millisecondTimestamp()
if isOpenGroupMessage {
message.openGroupServerTimestamp = envelope.serverTimestamp
}
message.groupPublicKey = groupPublicKey message.groupPublicKey = groupPublicKey
message.openGroupServerMessageID = openGroupMessageServerID message.openGroupServerMessageID = openGroupMessageServerID
// Validate // Validate