1// Copyright 2015-present 650 Industries. All rights reserved. 2 3#import "EXKernelServiceRegistry.h" 4#import "EXBranchManager.h" 5#import "EXErrorRecoveryManager.h" 6#import "EXGoogleAuthManager.h" 7#import "EXKernelLinkingManager.h" 8#import "EXKernelModuleManager.h" 9#import "EXKernelService.h" 10#import "EXRemoteNotificationManager.h" 11#import "EXScreenOrientationManager.h" 12#import "EXSensorManager.h" 13 14@interface EXKernelServiceRegistry () 15 16@property (nonatomic, strong) EXBranchManager *branchManager; 17@property (nonatomic, strong) EXGoogleAuthManager *googleAuthManager; 18@property (nonatomic, strong) EXErrorRecoveryManager *errorRecoveryManager; 19@property (nonatomic, strong) EXKernelModuleManager *kernelModuleManager; 20@property (nonatomic, strong) EXKernelLinkingManager *linkingManager; 21@property (nonatomic, strong) EXRemoteNotificationManager *remoteNotificationManager; 22@property (nonatomic, strong) EXScreenOrientationManager *screenOrientationManager; 23@property (nonatomic, strong) EXSensorManager *sensorManager; 24@property (nonatomic, strong) NSDictionary<NSString *, id> *allServices; 25 26@end 27 28@implementation EXKernelServiceRegistry 29 30- (instancetype)init 31{ 32 if (self = [super init]) { 33 // TODO: init these in some clean way 34 [self branchManager]; 35 [self errorRecoveryManager]; 36 [self remoteNotificationManager]; 37 [self linkingManager]; 38 [self kernelModuleManager]; 39 [self screenOrientationManager]; 40 [self googleAuthManager]; 41 [self sensorManager]; 42 } 43 return self; 44} 45 46- (EXBranchManager *)branchManager 47{ 48 if (!_branchManager) { 49 _branchManager = [[EXBranchManager alloc] init]; 50 } 51 return _branchManager; 52} 53 54- (EXRemoteNotificationManager *)remoteNotificationManager 55{ 56 if (!_remoteNotificationManager) { 57 _remoteNotificationManager = [[EXRemoteNotificationManager alloc] init]; 58 } 59 return _remoteNotificationManager; 60} 61 62- (EXErrorRecoveryManager *)errorRecoveryManager 63{ 64 if (!_errorRecoveryManager) { 65 _errorRecoveryManager = [[EXErrorRecoveryManager alloc] init]; 66 } 67 return _errorRecoveryManager; 68} 69 70- (EXGoogleAuthManager *)googleAuthManager 71{ 72 if (!_googleAuthManager) { 73 _googleAuthManager = [[EXGoogleAuthManager alloc] init]; 74 } 75 return _googleAuthManager; 76} 77 78- (EXKernelLinkingManager *)linkingManager 79{ 80 if (!_linkingManager) { 81 _linkingManager = [[EXKernelLinkingManager alloc] init]; 82 } 83 return _linkingManager; 84} 85 86- (EXKernelModuleManager *)kernelModuleManager 87{ 88 if (!_kernelModuleManager) { 89 _kernelModuleManager = [[EXKernelModuleManager alloc] init]; 90 } 91 return _kernelModuleManager; 92} 93 94- (EXScreenOrientationManager *)screenOrientationManager 95{ 96 if (!_screenOrientationManager) { 97 _screenOrientationManager = [[EXScreenOrientationManager alloc] init]; 98 } 99 return _screenOrientationManager; 100} 101 102- (EXSensorManager *)sensorManager 103{ 104 if (!_sensorManager) { 105 _sensorManager = [[EXSensorManager alloc] init]; 106 } 107 return _sensorManager; 108} 109 110- (NSDictionary *)allServices 111{ 112 if (!_allServices) { 113 NSMutableDictionary *result = [NSMutableDictionary dictionary]; 114 for (id service in @[ self.branchManager, self.errorRecoveryManager, self.googleAuthManager, self.kernelModuleManager, self.linkingManager, self.remoteNotificationManager, self.screenOrientationManager, self.sensorManager ]) { 115 NSString *className = NSStringFromClass([service class]); 116 result[className] = service; 117 } 118 _allServices = result; 119 } 120 return _allServices; 121} 122 123#pragma mark - bridge registry delegate 124 125- (void)bridgeRegistry:(EXKernelBridgeRegistry *)registry didRegisterBridgeRecord:(EXKernelBridgeRecord *)bridgeRecord 126{ 127 [self.allServices enumerateKeysAndObjectsUsingBlock:^(NSString * _Nonnull className, id _Nonnull service, BOOL * _Nonnull stop) { 128 if ([service respondsToSelector:@selector(kernelDidRegisterBridgeWithRecord:)]) { 129 [service kernelDidRegisterBridgeWithRecord:bridgeRecord]; 130 } 131 }]; 132} 133 134- (void)bridgeRegistry:(EXKernelBridgeRegistry *)registry willUnregisterBridgeRecord:(EXKernelBridgeRecord *)bridgeRecord 135{ 136 [self.allServices enumerateKeysAndObjectsUsingBlock:^(NSString * _Nonnull className, id _Nonnull service, BOOL * _Nonnull stop) { 137 if ([service respondsToSelector:@selector(kernelWillUnregisterBridgeWithRecord:)]) { 138 [service kernelWillUnregisterBridgeWithRecord:bridgeRecord]; 139 } 140 }]; 141} 142 143@end 144