From 54c63c7a2e4ba063b0ef05d682e761512f98e709 Mon Sep 17 00:00:00 2001 From: Michael Kirk Date: Mon, 22 Oct 2018 09:42:53 -0600 Subject: [PATCH] Reachability Singleton --- Signal/src/AppDelegate.m | 3 +- SignalMessaging/environment/AppSetup.m | 2 + .../src/Network/ReachabilityManager.swift | 57 +++++++++++++++++++ SignalServiceKit/src/SSKEnvironment.h | 3 + SignalServiceKit/src/SSKEnvironment.m | 4 ++ SignalServiceKit/src/SignalServiceKit.h | 1 + .../src/TestUtils/MockSSKEnvironment.m | 2 + 7 files changed, 70 insertions(+), 2 deletions(-) create mode 100644 SignalServiceKit/src/Network/ReachabilityManager.swift diff --git a/Signal/src/AppDelegate.m b/Signal/src/AppDelegate.m index 899f00896..c2ef3c3f5 100644 --- a/Signal/src/AppDelegate.m +++ b/Signal/src/AppDelegate.m @@ -1108,8 +1108,7 @@ static NSTimeInterval launchStartedAt; [SSKEnvironment.shared.messageReceiver handleAnyUnprocessedEnvelopesAsync]; [SSKEnvironment.shared.batchMessageProcessor handleAnyUnprocessedEnvelopesAsync]; - // TODO - // - incorporate reachability check + [SSKEnvironment.shared.reachabilityManager setup]; [SSKEnvironment.shared.messageSenderJobQueue setup]; [AppEnvironment.shared.sessionResetJobQueue setup]; diff --git a/SignalMessaging/environment/AppSetup.m b/SignalMessaging/environment/AppSetup.m index 1ee77ad7b..0ee536ec8 100644 --- a/SignalMessaging/environment/AppSetup.m +++ b/SignalMessaging/environment/AppSetup.m @@ -85,6 +85,7 @@ NS_ASSUME_NONNULL_BEGIN [[OWSOutgoingReceiptManager alloc] initWithPrimaryStorage:primaryStorage]; OWSSyncManager *syncManager = [[OWSSyncManager alloc] initDefault]; + id reachabilityManager = [SSKReachabilityManagerImpl new]; OWSSounds *sounds = [[OWSSounds alloc] initWithPrimaryStorage:primaryStorage]; LockInteractionController *lockInteractionController = [[LockInteractionController alloc] initDefault]; OWSWindowManager *windowManager = [[OWSWindowManager alloc] initDefault]; @@ -115,6 +116,7 @@ NS_ASSUME_NONNULL_BEGIN contactDiscoveryService:contactDiscoveryService readReceiptManager:readReceiptManager outgoingReceiptManager:outgoingReceiptManager + reachabilityManager:reachabilityManager syncManager:syncManager]]; appSpecificSingletonBlock(); diff --git a/SignalServiceKit/src/Network/ReachabilityManager.swift b/SignalServiceKit/src/Network/ReachabilityManager.swift new file mode 100644 index 000000000..2d02f4570 --- /dev/null +++ b/SignalServiceKit/src/Network/ReachabilityManager.swift @@ -0,0 +1,57 @@ +// +// Copyright (c) 2018 Open Whisper Systems. All rights reserved. +// + +import Foundation + +@objc(SSKReachabilityType) +public enum ReachabilityType: Int { + case any, wifi, cellular +} + +@objc +public protocol SSKReachabilityManager { + var observationContext: AnyObject { get } + func setup() + + var isReachable: Bool { get } + func isReachable(via reachabilityType: ReachabilityType) -> Bool +} + +@objc +public class SSKReachabilityManagerImpl: NSObject, SSKReachabilityManager { + + public let reachability: Reachability + public var observationContext: AnyObject { + return self.reachability + } + + public var isReachable: Bool { + return isReachable(via: .any) + } + + public func isReachable(via reachabilityType: ReachabilityType) -> Bool { + switch reachabilityType { + case .any: + return reachability.isReachable() + case .wifi: + return reachability.isReachableViaWiFi() + case .cellular: + return reachability.isReachableViaWWAN() + } + } + + @objc + override public init() { + self.reachability = Reachability.forInternetConnection() + } + + @objc + public func setup() { + guard reachability.startNotifier() else { + owsFailDebug("failed to start notifier") + return + } + Logger.debug("started notifier") + } +} diff --git a/SignalServiceKit/src/SSKEnvironment.h b/SignalServiceKit/src/SSKEnvironment.h index 7e76a4302..ada5b1431 100644 --- a/SignalServiceKit/src/SSKEnvironment.h +++ b/SignalServiceKit/src/SSKEnvironment.h @@ -31,6 +31,7 @@ NS_ASSUME_NONNULL_BEGIN @protocol OWSCallMessageHandler; @protocol ProfileManagerProtocol; @protocol OWSUDManager; +@protocol SSKReachabilityManager; @protocol OWSSyncManagerProtocol; @interface SSKEnvironment : NSObject @@ -56,6 +57,7 @@ NS_ASSUME_NONNULL_BEGIN contactDiscoveryService:(ContactDiscoveryService *)contactDiscoveryService readReceiptManager:(OWSReadReceiptManager *)readReceiptManager outgoingReceiptManager:(OWSOutgoingReceiptManager *)outgoingReceiptManager + reachabilityManager:(id)reachabilityManager syncManager:(id)syncManager NS_DESIGNATED_INITIALIZER; - (instancetype)init NS_UNAVAILABLE; @@ -91,6 +93,7 @@ NS_ASSUME_NONNULL_BEGIN @property (nonatomic, readonly) OWSReadReceiptManager *readReceiptManager; @property (nonatomic, readonly) OWSOutgoingReceiptManager *outgoingReceiptManager; @property (nonatomic, readonly) id syncManager; +@property (nonatomic, readonly) id reachabilityManager; // This property is configured after Environment is created. @property (atomic, nullable) id callMessageHandler; diff --git a/SignalServiceKit/src/SSKEnvironment.m b/SignalServiceKit/src/SSKEnvironment.m index 07355297e..006e09f1e 100644 --- a/SignalServiceKit/src/SSKEnvironment.m +++ b/SignalServiceKit/src/SSKEnvironment.m @@ -33,6 +33,7 @@ static SSKEnvironment *sharedSSKEnvironment; @property (nonatomic) OWSReadReceiptManager *readReceiptManager; @property (nonatomic) OWSOutgoingReceiptManager *outgoingReceiptManager; @property (nonatomic) id syncManager; +@property (nonatomic) id reachabilityManager; @end @@ -68,6 +69,7 @@ static SSKEnvironment *sharedSSKEnvironment; contactDiscoveryService:(ContactDiscoveryService *)contactDiscoveryService readReceiptManager:(OWSReadReceiptManager *)readReceiptManager outgoingReceiptManager:(OWSOutgoingReceiptManager *)outgoingReceiptManager + reachabilityManager:(id)reachabilityManager syncManager:(id)syncManager { self = [super init]; @@ -97,6 +99,7 @@ static SSKEnvironment *sharedSSKEnvironment; OWSAssertDebug(readReceiptManager); OWSAssertDebug(outgoingReceiptManager); OWSAssertDebug(syncManager); + OWSAssertDebug(reachabilityManager); _contactsManager = contactsManager; _messageSender = messageSender; @@ -120,6 +123,7 @@ static SSKEnvironment *sharedSSKEnvironment; _readReceiptManager = readReceiptManager; _outgoingReceiptManager = outgoingReceiptManager; _syncManager = syncManager; + _reachabilityManager = reachabilityManager; return self; } diff --git a/SignalServiceKit/src/SignalServiceKit.h b/SignalServiceKit/src/SignalServiceKit.h index eb4382c5f..cd8c4bcd1 100644 --- a/SignalServiceKit/src/SignalServiceKit.h +++ b/SignalServiceKit/src/SignalServiceKit.h @@ -3,6 +3,7 @@ // // Anything used by Swift outside of the framework must be imported. +#import #import #import #import diff --git a/SignalServiceKit/src/TestUtils/MockSSKEnvironment.m b/SignalServiceKit/src/TestUtils/MockSSKEnvironment.m index 65966b2f1..69eb3eafa 100644 --- a/SignalServiceKit/src/TestUtils/MockSSKEnvironment.m +++ b/SignalServiceKit/src/TestUtils/MockSSKEnvironment.m @@ -73,6 +73,7 @@ NS_ASSUME_NONNULL_BEGIN OWSReadReceiptManager *readReceiptManager = [[OWSReadReceiptManager alloc] initWithPrimaryStorage:primaryStorage]; OWSOutgoingReceiptManager *outgoingReceiptManager = [[OWSOutgoingReceiptManager alloc] initWithPrimaryStorage:primaryStorage]; + id reachabilityManager = [SSKReachabilityManagerImpl new]; id syncManager = [[OWSMockSyncManager alloc] init]; self = [super initWithContactsManager:contactsManager @@ -96,6 +97,7 @@ NS_ASSUME_NONNULL_BEGIN contactDiscoveryService:contactDiscoveryService readReceiptManager:readReceiptManager outgoingReceiptManager:outgoingReceiptManager + reachabilityManager:reachabilityManager syncManager:syncManager]; if (!self) { return nil;