mirror of
https://github.com/oxen-io/session-ios.git
synced 2023-12-13 21:30:14 +01:00
Merge branch 'mkirk/pull-to-refresh-inbox' into release/2.18.0
This commit is contained in:
commit
69ee9cbcfa
4 changed files with 57 additions and 36 deletions
|
@ -833,11 +833,12 @@ static NSString *const kURLHostVerifyPrefix = @"verify";
|
|||
// Fetch messages as soon as possible after launching. In particular, when
|
||||
// launching from the background, without this, we end up waiting some extra
|
||||
// seconds before receiving an actionable push notification.
|
||||
[[Environment getCurrent].messageFetcherJob runAsync];
|
||||
__unused AnyPromise *messagePromise = [[Environment getCurrent].messageFetcherJob run];
|
||||
|
||||
// This should happen at any launch, background or foreground.
|
||||
__unused AnyPromise *promise = [OWSSyncPushTokensJob runWithAccountManager:[Environment getCurrent].accountManager
|
||||
preferences:[Environment preferences]];
|
||||
__unused AnyPromise *pushTokenpromise =
|
||||
[OWSSyncPushTokensJob runWithAccountManager:[Environment getCurrent].accountManager
|
||||
preferences:[Environment preferences]];
|
||||
}
|
||||
|
||||
[DeviceSleepManager.sharedInstance removeBlockWithBlockObject:self];
|
||||
|
|
|
@ -8,15 +8,14 @@ import PromiseKit
|
|||
@objc(OWSMessageFetcherJob)
|
||||
class MessageFetcherJob: NSObject {
|
||||
|
||||
let TAG = "[MessageFetcherJob]"
|
||||
var timer: Timer?
|
||||
private let TAG = "[MessageFetcherJob]"
|
||||
|
||||
private var timer: Timer?
|
||||
|
||||
// MARK: injected dependencies
|
||||
let networkManager: TSNetworkManager
|
||||
let messageReceiver: OWSMessageReceiver
|
||||
let signalService: OWSSignalService
|
||||
|
||||
var runPromises = [Double: Promise<Void>]()
|
||||
private let networkManager: TSNetworkManager
|
||||
private let messageReceiver: OWSMessageReceiver
|
||||
private let signalService: OWSSignalService
|
||||
|
||||
init(messageReceiver: OWSMessageReceiver, networkManager: TSNetworkManager, signalService: OWSSignalService) {
|
||||
self.messageReceiver = messageReceiver
|
||||
|
@ -24,53 +23,58 @@ class MessageFetcherJob: NSObject {
|
|||
self.signalService = signalService
|
||||
}
|
||||
|
||||
func runAsync() {
|
||||
Logger.debug("\(TAG) \(#function)")
|
||||
guard signalService.isCensorshipCircumventionActive else {
|
||||
public func run() -> Promise<Void> {
|
||||
Logger.debug("\(TAG) in \(#function)")
|
||||
|
||||
guard signalService.isCensorshipCircumventionActive else {
|
||||
Logger.debug("\(self.TAG) delegating message fetching to SocketManager since we're using normal transport.")
|
||||
TSSocketManager.requestSocketOpen()
|
||||
return
|
||||
return Promise(value: ())
|
||||
}
|
||||
|
||||
Logger.info("\(TAG) using fallback message fetching.")
|
||||
Logger.info("\(TAG) fetching messages via REST.")
|
||||
|
||||
let promiseId = NSDate().timeIntervalSince1970
|
||||
Logger.debug("\(self.TAG) starting promise: \(promiseId)")
|
||||
let runPromise = self.fetchUndeliveredMessages().then { (envelopes: [OWSSignalServiceProtosEnvelope], more: Bool) -> Void in
|
||||
let promise = self.fetchUndeliveredMessages().then { (envelopes: [OWSSignalServiceProtosEnvelope], more: Bool) -> Promise<Void> in
|
||||
for envelope in envelopes {
|
||||
Logger.info("\(self.TAG) received envelope.")
|
||||
self.messageReceiver.handleReceivedEnvelope(envelope)
|
||||
self.acknowledgeDelivery(envelope: envelope)
|
||||
}
|
||||
|
||||
if more {
|
||||
Logger.info("\(self.TAG) more messages, so recursing.")
|
||||
// recurse
|
||||
self.runAsync()
|
||||
Logger.info("\(self.TAG) fetching more messages.")
|
||||
return self.run()
|
||||
} else {
|
||||
// All finished
|
||||
return Promise(value: ())
|
||||
}
|
||||
}.always {
|
||||
Logger.debug("\(self.TAG) cleaning up promise: \(promiseId)")
|
||||
self.runPromises[promiseId] = nil
|
||||
}
|
||||
|
||||
// maintain reference to make sure it's not de-alloced prematurely.
|
||||
runPromises[promiseId] = runPromise
|
||||
promise.retainUntilComplete()
|
||||
|
||||
return promise
|
||||
}
|
||||
|
||||
@objc func run() -> AnyPromise {
|
||||
return AnyPromise(run())
|
||||
}
|
||||
|
||||
// use in DEBUG or wherever you can't receive push notifications to poll for messages.
|
||||
// Do not use in production.
|
||||
func startRunLoop(timeInterval: Double) {
|
||||
public func startRunLoop(timeInterval: Double) {
|
||||
Logger.error("\(TAG) Starting message fetch polling. This should not be used in production.")
|
||||
timer = WeakTimer.scheduledTimer(timeInterval: timeInterval, target: self, userInfo: nil, repeats: true) {[weak self] _ in
|
||||
self?.runAsync()
|
||||
let _: Promise<Void>? = self?.run()
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
func stopRunLoop() {
|
||||
public func stopRunLoop() {
|
||||
timer?.invalidate()
|
||||
timer = nil
|
||||
}
|
||||
|
||||
func parseMessagesResponse(responseObject: Any?) -> (envelopes: [OWSSignalServiceProtosEnvelope], more: Bool)? {
|
||||
private func parseMessagesResponse(responseObject: Any?) -> (envelopes: [OWSSignalServiceProtosEnvelope], more: Bool)? {
|
||||
guard let responseObject = responseObject else {
|
||||
Logger.error("\(self.TAG) response object was surpringly nil")
|
||||
return nil
|
||||
|
@ -103,7 +107,7 @@ class MessageFetcherJob: NSObject {
|
|||
)
|
||||
}
|
||||
|
||||
func buildEnvelope(messageDict: [String: Any]) -> OWSSignalServiceProtosEnvelope? {
|
||||
private func buildEnvelope(messageDict: [String: Any]) -> OWSSignalServiceProtosEnvelope? {
|
||||
let builder = OWSSignalServiceProtosEnvelopeBuilder()
|
||||
|
||||
guard let typeInt = messageDict["type"] as? Int32 else {
|
||||
|
@ -156,7 +160,7 @@ class MessageFetcherJob: NSObject {
|
|||
return builder.build()
|
||||
}
|
||||
|
||||
func fetchUndeliveredMessages() -> Promise<(envelopes: [OWSSignalServiceProtosEnvelope], more: Bool)> {
|
||||
private func fetchUndeliveredMessages() -> Promise<(envelopes: [OWSSignalServiceProtosEnvelope], more: Bool)> {
|
||||
return Promise { fulfill, reject in
|
||||
let messagesRequest = OWSGetMessagesRequest()
|
||||
|
||||
|
@ -181,7 +185,7 @@ class MessageFetcherJob: NSObject {
|
|||
}
|
||||
}
|
||||
|
||||
func acknowledgeDelivery(envelope: OWSSignalServiceProtosEnvelope) {
|
||||
private func acknowledgeDelivery(envelope: OWSSignalServiceProtosEnvelope) {
|
||||
let request = OWSAcknowledgeMessageDeliveryRequest(source: envelope.source, timestamp: envelope.timestamp)
|
||||
self.networkManager.makeRequest(request,
|
||||
success: { (_: URLSessionDataTask?, _: Any?) -> Void in
|
||||
|
|
|
@ -216,6 +216,13 @@ typedef NS_ENUM(NSInteger, CellState) { kArchiveState, kInboxState };
|
|||
[emptyBoxLabel autoPinToTopLayoutGuideOfViewController:self withInset:0];
|
||||
[emptyBoxLabel autoPinToBottomLayoutGuideOfViewController:self withInset:0];
|
||||
|
||||
UIRefreshControl *pullToRefreshView = [UIRefreshControl new];
|
||||
pullToRefreshView.tintColor = [UIColor grayColor];
|
||||
[pullToRefreshView addTarget:self
|
||||
action:@selector(pullToRefreshPerformed:)
|
||||
forControlEvents:UIControlEventValueChanged];
|
||||
[self.tableView insertSubview:pullToRefreshView atIndex:0];
|
||||
|
||||
[self updateReminderViews];
|
||||
}
|
||||
|
||||
|
@ -596,6 +603,16 @@ typedef NS_ENUM(NSInteger, CellState) { kArchiveState, kInboxState };
|
|||
return InboxTableViewCell.rowHeight;
|
||||
}
|
||||
|
||||
- (void)pullToRefreshPerformed:(UIRefreshControl *)refreshControl
|
||||
{
|
||||
OWSAssert([NSThread isMainThread]);
|
||||
DDLogInfo(@"%@ beggining refreshing.", self.tag);
|
||||
[[Environment getCurrent].messageFetcherJob run].always(^{
|
||||
DDLogInfo(@"%@ ending refreshing.", self.tag);
|
||||
[refreshControl endRefreshing];
|
||||
});
|
||||
}
|
||||
|
||||
#pragma mark Table Swipe to Delete
|
||||
|
||||
- (void)tableView:(UITableView *)tableView
|
||||
|
@ -605,7 +622,6 @@ typedef NS_ENUM(NSInteger, CellState) { kArchiveState, kInboxState };
|
|||
return;
|
||||
}
|
||||
|
||||
|
||||
- (NSArray *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath
|
||||
{
|
||||
UITableViewRowAction *deleteAction =
|
||||
|
|
|
@ -101,11 +101,11 @@ NSString *const Signal_Message_MarkAsRead_Identifier = @"Signal_Message_MarkAsRe
|
|||
{
|
||||
DDLogInfo(@"%@ received remote notification", self.tag);
|
||||
|
||||
[self.messageFetcherJob runAsync];
|
||||
[self.messageFetcherJob run];
|
||||
}
|
||||
|
||||
- (void)applicationDidBecomeActive {
|
||||
[self.messageFetcherJob runAsync];
|
||||
[self.messageFetcherJob run];
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
Loading…
Reference in a new issue