Debug friend request expiration

This commit is contained in:
Niels Andriesse 2019-05-20 14:52:26 +10:00
parent 3d7bd6b895
commit 4a633fba68
7 changed files with 45 additions and 56 deletions

View File

@ -688,7 +688,7 @@ static NSTimeInterval launchStartedAt;
// and continue cleaning in the background.
[self.disappearingMessagesJob startIfNecessary];
// Start loki friend request expire job
// Start Loki friend request expire job
[self.lokiFriendRequestExpireJob startIfNecessary];
[self enableBackgroundRefreshIfNecessary];
@ -1326,7 +1326,7 @@ static NSTimeInterval launchStartedAt;
[self.disappearingMessagesJob startIfNecessary];
[self.profileManager ensureLocalProfileCached];
// Start loki friend request expire job
// Start Loki friend request expire job
[self.lokiFriendRequestExpireJob startIfNecessary];
// For non-legacy users, read receipts are on by default.

View File

@ -78,7 +78,7 @@
}
// MARK: Updating
private func handleMessageChanged() {
@objc func handleMessageChanged() {
precondition(message != nil)
switch kind {
case .incoming:

View File

@ -5,6 +5,7 @@
#import "ConversationViewCell.h"
@class OWSMessageBubbleView;
@class FriendRequestView;
@protocol FriendRequestViewDelegate;
NS_ASSUME_NONNULL_BEGIN
@ -12,6 +13,7 @@ NS_ASSUME_NONNULL_BEGIN
@interface OWSMessageCell : ConversationViewCell
@property (nonatomic, readonly) OWSMessageBubbleView *messageBubbleView;
@property (nonatomic, readonly, nullable) FriendRequestView *friendRequestView;
@property (nonatomic, nullable, weak) id<FriendRequestViewDelegate> friendRequestViewDelegate;
+ (NSString *)cellReuseIdentifier;

View File

@ -480,7 +480,14 @@ typedef enum : NSUInteger {
// Ensure thread instance is up to date
[self.thread reload];
// Update UI
[self.viewItems.lastObject clearCachedLayoutState]; // Presumably a cell with a friend request view
id<ConversationViewItem> lastItem = self.viewItems.lastObject;
[lastItem clearCachedLayoutState];
UICollectionViewCell *cell = self.collectionView.visibleCells.lastObject;
OWSMessageCell *messageCell = (OWSMessageCell *)[cell as:OWSMessageCell.class];
if (messageCell != nil) {
[messageCell.friendRequestView.message reload];
[messageCell.friendRequestView handleMessageChanged];
}
[self resetContentAndLayout];
[self updateInputToolbar];
}

View File

@ -1,22 +1,21 @@
/*
This class is used for settings friend requests to expired
This is modelled after `OWSDisappearingMessagesJob`.
*/
@objc(OWSLokiFriendRequestExpireJob)
public class FriendRequestExpireJob : NSObject {
public final class FriendRequestExpireJob : NSObject {
private let databaseConnection: YapDatabaseConnection
private let messageFinder = FriendRequestExpireMessageFinder()
// These three properties should only be accessed on the main thread.
// These properties should only be accessed on the main thread.
private var hasStarted = false
private var fallbackTimer: Timer?
private var nextExpireTimer: Timer?
private var nextExpireDate: Date?
// Our queue
public static let serialQueue = DispatchQueue(label: "network.loki.friendrequest.expire")
fileprivate static let serialQueue = DispatchQueue(label: "network.loki.friendrequest.expire")
/// Create a `FriendRequestExpireJob`.
/// This will create a auto-running job which will set friend requests to expired.
@ -31,14 +30,12 @@ public class FriendRequestExpireJob : NSObject {
// Setup a timer that runs periodically to check for new friend request messages that will soon expire
AppReadiness.runNowOrWhenAppDidBecomeReady {
if (CurrentAppContext().isMainApp) {
if CurrentAppContext().isMainApp {
let fallbackInterval = 5 * kMinuteInterval
self.fallbackTimer = WeakTimer.scheduledTimer(timeInterval: fallbackInterval, target: self, userInfo: nil, repeats: true) { [weak self] _ in
AssertIsOnMainThread()
guard let strongSelf = self else {
return
}
guard let strongSelf = self else { return }
strongSelf.timerDidFire(mainTimer: false)
}
@ -56,9 +53,7 @@ public class FriendRequestExpireJob : NSObject {
/// Start the job if we haven't done it yet
@objc public func startIfNecessary() {
DispatchQueue.main.async {
guard !self.hasStarted else {
return
}
guard !self.hasStarted else { return }
self.hasStarted = true;
FriendRequestExpireJob.serialQueue.async {
@ -72,20 +67,17 @@ public class FriendRequestExpireJob : NSObject {
AssertIsOnFriendRequestExpireQueue();
// Expire any messages
self.expireMessages()
expireMessages()
var nextExpirationTimestamp: UInt64? = nil
self.databaseConnection.readWrite { transaction in
databaseConnection.readWrite { transaction in
nextExpirationTimestamp = self.messageFinder.nextExpirationTimestamp(with: transaction)
}
guard let timestamp = nextExpirationTimestamp,
let nextExpireDate = NSDate.ows_date(withMillisecondsSince1970: timestamp) as? Date else {
return
}
guard let timestamp = nextExpirationTimestamp, let nextExpireDate = NSDate.ows_date(withMillisecondsSince1970: timestamp) as? Date else { return }
// Schedule the next timer
self.scheduleRun(by: nextExpireDate)
scheduleRun(by: nextExpireDate)
}
// Schedule the next timer to run
@ -96,7 +88,7 @@ public class FriendRequestExpireJob : NSObject {
return
}
let minDelaySeconds: TimeInterval = 1.0
let minDelaySeconds: TimeInterval = 1
let delaySeconds = max(minDelaySeconds, date.timeIntervalSinceNow)
let newTimerScheduleDate = Date(timeIntervalSinceNow: delaySeconds)
@ -109,9 +101,7 @@ public class FriendRequestExpireJob : NSObject {
self.resetNextExpireTimer()
self.nextExpireDate = newTimerScheduleDate
self.nextExpireTimer = WeakTimer.scheduledTimer(timeInterval: delaySeconds, target: self, userInfo: nil, repeats: false) { [weak self] _ in
guard let strongSelf = self else {
return
}
guard let strongSelf = self else { return }
strongSelf.timerDidFire(mainTimer: true)
}
@ -126,13 +116,9 @@ public class FriendRequestExpireJob : NSObject {
var backgroundTask: OWSBackgroundTask? = OWSBackgroundTask(label: "\(#function)", completionBlock: { [weak self] status in
AssertIsOnMainThread()
guard status == .expired else {
return
}
guard status == .success else { return }
guard let strongSelf = self else {
return
}
guard let strongSelf = self else { return }
strongSelf.databaseConnection.readWrite { transaction in
strongSelf.messageFinder.enumurateExpiredMessages(with: { message in
@ -144,7 +130,7 @@ public class FriendRequestExpireJob : NSObject {
}
// Check that we only expire sent messages
guard message.thread.friendRequestStatus == .requestSent else {
guard message is TSOutgoingMessage && message.isFriendRequest else {
// Set message to not expire, so our other logic works correctly
message.saveFriendRequestExpires(at: 0, with: transaction)
return;
@ -202,6 +188,7 @@ private extension FriendRequestExpireJob {
// MARK: Asserts
private extension FriendRequestExpireJob {
func AssertIsOnFriendRequestExpireQueue() {
#if DEBUG
guard #available(iOS 10.0, *) else { return }

View File

@ -1,11 +1,10 @@
/*
This class is used for finding friend request messages which are expired.
This is modelled after `OWSDisappearingMessagesFinder`.
*/
@objc(OWSLokiFriendRequestExpireMessageFinder)
public class FriendRequestExpireMessageFinder: NSObject {
public class FriendRequestExpireMessageFinder : NSObject {
public static let friendRequestExpireColumn = "friend_request_expires_at"
public static let friendRequestExpireIndex = "loki_index_friend_request_expires_at"
@ -20,18 +19,14 @@ public class FriendRequestExpireMessageFinder: NSObject {
stop.pointee = true
}
guard let expireTime = firstMessage?.friendRequestExpiresAt, expireTime > 0 else {
return nil
}
guard let expireTime = firstMessage?.friendRequestExpiresAt, expireTime > 0 else { return nil }
return expireTime
}
public func enumurateExpiredMessages(with block: (TSMessage) -> Void, transaction: YapDatabaseReadTransaction) {
for messageId in self.fetchExpiredMessageIds(with: transaction) {
guard let message = TSMessage.fetch(uniqueId: messageId, transaction: transaction) else {
continue
}
for messageId in fetchExpiredMessageIds(with: transaction) {
guard let message = TSMessage.fetch(uniqueId: messageId, transaction: transaction) else { continue }
block(message)
}
}
@ -43,9 +38,10 @@ public class FriendRequestExpireMessageFinder: NSObject {
let query = "WHERE \(FriendRequestExpireMessageFinder.friendRequestExpireColumn) > 0 AND \(FriendRequestExpireMessageFinder.friendRequestExpireColumn) <= \(now)"
// When (expireAt == 0) then the friend request SHOULD NOT expire
let dbQuery = YapDatabaseQuery(string: query, parameters: [])
let ext = transaction.ext(FriendRequestExpireMessageFinder.friendRequestExpireIndex) as? YapDatabaseSecondaryIndexTransaction
ext?.enumerateKeys(matching: dbQuery) { (collection, key, stop) in
messageIds.append(key)
if let ext = transaction.ext(FriendRequestExpireMessageFinder.friendRequestExpireIndex) as? YapDatabaseSecondaryIndexTransaction {
ext.enumerateKeys(matching: dbQuery) { (_, key, _) in
messageIds.append(key)
}
}
return Array(messageIds)
@ -56,22 +52,19 @@ public class FriendRequestExpireMessageFinder: NSObject {
// MARK: YapDatabaseExtension
public extension FriendRequestExpireMessageFinder {
@objc public static var indexDatabaseExtension: YapDatabaseSecondaryIndex {
let setup = YapDatabaseSecondaryIndexSetup()
setup.addColumn(friendRequestExpireColumn, with: .integer)
let handler = YapDatabaseSecondaryIndexHandler.withObjectBlock { (transaction, dict, collection, key, object) in
guard let message = object as? TSMessage else {
return
}
guard let message = object as? TSMessage else { return }
// Only select messages whose status is sent
guard message.thread.friendRequestStatus == .requestSent else {
return
}
guard message is TSOutgoingMessage && message.isFriendRequest else { return }
// TODO: Replace this with unlock timer
dict[friendRequestExpireColumn] = message.expiresAt
dict[friendRequestExpireColumn] = message.friendRequestExpiresAt
}
return YapDatabaseSecondaryIndex(setup: setup, handler: handler)
@ -82,7 +75,7 @@ public extension FriendRequestExpireMessageFinder {
}
@objc public static func asyncRegisterDatabaseExtensions(_ storage: OWSStorage) {
storage.register(self.indexDatabaseExtension, withName: friendRequestExpireIndex)
storage.register(indexDatabaseExtension, withName: friendRequestExpireIndex)
}
}

View File

@ -463,7 +463,7 @@ static const NSUInteger OWSMessageSchemaVersion = 4;
- (void)saveIsFriendRequestExpired:(BOOL)isFriendRequestExpired withTransaction:(YapDatabaseReadWriteTransaction *_Nullable)transaction
{
self.isFriendRequest = isFriendRequestExpired;
self.isFriendRequestExpired = isFriendRequestExpired;
if (transaction == nil) {
[self save];
} else {