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