Debug friend request expiration
This commit is contained in:
parent
3d7bd6b895
commit
4a633fba68
|
@ -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.
|
||||
|
|
|
@ -78,7 +78,7 @@
|
|||
}
|
||||
|
||||
// MARK: Updating
|
||||
private func handleMessageChanged() {
|
||||
@objc func handleMessageChanged() {
|
||||
precondition(message != nil)
|
||||
switch kind {
|
||||
case .incoming:
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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];
|
||||
}
|
||||
|
|
|
@ -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 }
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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 {
|
||||
|
|
Loading…
Reference in New Issue