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