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 "EXHomeModuleManager.h" 10#import "EXKernelAppRegistry.h" 11#import "EXKernelLinkingManager.h" 12#import "EXKernelService.h" 13#import "EXRemoteNotificationManager.h" 14#import "EXScreenOrientationManager.h" 15#import "EXSensorManager.h" 16#import "EXAudioSessionManager.h" 17#import "EXUpdatesManager.h" 18 19#import <EXCore/EXModuleRegistryProvider.h> 20 21@interface EXKernelServiceRegistry () 22 23@property (nonatomic, strong) EXBranchManager *branchManager; 24@property (nonatomic, strong) EXCachedResourceManager *cachedResourceManager; 25@property (nonatomic, strong) EXFileSystemManager *fileSystemManager; 26@property (nonatomic, strong) EXGoogleAuthManager *googleAuthManager; 27@property (nonatomic, strong) EXErrorRecoveryManager *errorRecoveryManager; 28@property (nonatomic, strong) EXHomeModuleManager *homeModuleManager; 29@property (nonatomic, strong) EXKernelLinkingManager *linkingManager; 30@property (nonatomic, strong) EXRemoteNotificationManager *remoteNotificationManager; 31@property (nonatomic, strong) EXScreenOrientationManager *screenOrientationManager; 32@property (nonatomic, strong) EXSensorManager *sensorManager; 33@property (nonatomic, strong) EXAudioSessionManager *audioSessionManager; 34@property (nonatomic, strong) EXUpdatesManager *updatesManager; 35@property (nonatomic, strong) NSDictionary<NSString *, id> *allServices; 36 37@end 38 39@implementation EXKernelServiceRegistry 40 41- (instancetype)init 42{ 43 if (self = [super init]) { 44 // TODO: init these in some clean way 45 [self branchManager]; 46 [self cachedResourceManager]; 47 [self errorRecoveryManager]; 48 [self remoteNotificationManager]; 49 [self linkingManager]; 50 [self homeModuleManager]; 51 [self screenOrientationManager]; 52 [self googleAuthManager]; 53 [self sensorManager]; 54 [self fileSystemManager]; 55 [self audioSessionManager]; 56 [self updatesManager]; 57 } 58 return self; 59} 60 61- (EXBranchManager *)branchManager 62{ 63 if (!_branchManager) { 64 _branchManager = [[EXBranchManager alloc] init]; 65 } 66 return _branchManager; 67} 68 69- (EXCachedResourceManager *)cachedResourceManager 70{ 71 if (!_cachedResourceManager) { 72 _cachedResourceManager = [[EXCachedResourceManager alloc] init]; 73 } 74 return _cachedResourceManager; 75} 76 77- (EXRemoteNotificationManager *)remoteNotificationManager 78{ 79 if (!_remoteNotificationManager) { 80 _remoteNotificationManager = [[EXRemoteNotificationManager alloc] init]; 81 } 82 return _remoteNotificationManager; 83} 84 85- (EXErrorRecoveryManager *)errorRecoveryManager 86{ 87 if (!_errorRecoveryManager) { 88 _errorRecoveryManager = [[EXErrorRecoveryManager alloc] init]; 89 } 90 return _errorRecoveryManager; 91} 92 93- (EXFileSystemManager *)fileSystemManager 94{ 95 if (!_fileSystemManager) { 96 _fileSystemManager = [[EXFileSystemManager alloc] init]; 97 } 98 return _fileSystemManager; 99} 100 101- (EXGoogleAuthManager *)googleAuthManager 102{ 103 if (!_googleAuthManager) { 104 _googleAuthManager = [[EXGoogleAuthManager alloc] init]; 105 } 106 return _googleAuthManager; 107} 108 109- (EXKernelLinkingManager *)linkingManager 110{ 111 if (!_linkingManager) { 112 _linkingManager = [[EXKernelLinkingManager alloc] init]; 113 } 114 return _linkingManager; 115} 116 117- (EXHomeModuleManager *)homeModuleManager 118{ 119 if (!_homeModuleManager) { 120 _homeModuleManager = [[EXHomeModuleManager alloc] init]; 121 } 122 return _homeModuleManager; 123} 124 125- (EXScreenOrientationManager *)screenOrientationManager 126{ 127 if (!_screenOrientationManager) { 128 _screenOrientationManager = [[EXScreenOrientationManager alloc] init]; 129 } 130 return _screenOrientationManager; 131} 132 133- (EXSensorManager *)sensorManager 134{ 135 if (!_sensorManager) { 136 _sensorManager = [[EXSensorManager alloc] init]; 137 } 138 return _sensorManager; 139} 140 141- (EXAudioSessionManager *)audioSessionManager 142{ 143 if (!_audioSessionManager) { 144 _audioSessionManager = [[EXAudioSessionManager alloc] init]; 145 } 146 return _audioSessionManager; 147} 148 149- (EXUpdatesManager *)updatesManager 150{ 151 if (!_updatesManager) { 152 _updatesManager = [[EXUpdatesManager alloc] init]; 153 } 154 return _updatesManager; 155} 156 157- (NSDictionary *)allServices 158{ 159 if (!_allServices) { 160 NSMutableDictionary *result = [NSMutableDictionary dictionary]; 161 // Here we have services that must be accessible by our scoped Expo modules 162 // EXVersionManagers pass these modules to scoped modules as an initializer argument 163 // 164 // New modules should access singleton modules via the module registry. 165 // New singleton modules should register themselves in EXModuleRegistryProvider's set 166 // using EX_REGISTER_SINGLETON_MODULE macro. 167 NSArray *registryServices = @[ 168 self.branchManager, 169 self.cachedResourceManager, 170 self.errorRecoveryManager, 171 self.fileSystemManager, 172 self.googleAuthManager, 173 self.homeModuleManager, 174 self.linkingManager, 175 self.remoteNotificationManager, 176 self.screenOrientationManager, 177 self.sensorManager, 178 self.updatesManager, 179 self.audioSessionManager 180 ]; 181 NSArray *allServices = [registryServices arrayByAddingObjectsFromArray:[[EXModuleRegistryProvider singletonModules] allObjects]]; 182 for (id service in allServices) { 183 NSString *className = NSStringFromClass([service class]); 184 result[className] = service; 185 } 186 _allServices = result; 187 } 188 return _allServices; 189} 190 191#pragma mark - app registry delegate 192 193- (void)appRegistry:(EXKernelAppRegistry *)registry didRegisterAppRecord:(EXKernelAppRecord *)appRecord 194{ 195 [self.allServices enumerateKeysAndObjectsUsingBlock:^(NSString * _Nonnull className, id _Nonnull service, BOOL * _Nonnull stop) { 196 if ([service respondsToSelector:@selector(kernelDidRegisterAppWithRecord:)]) { 197 [service kernelDidRegisterAppWithRecord:appRecord]; 198 } 199 }]; 200} 201 202- (void)appRegistry:(EXKernelAppRegistry *)registry willUnregisterAppRecord:(EXKernelAppRecord *)appRecord 203{ 204 [self.allServices enumerateKeysAndObjectsUsingBlock:^(NSString * _Nonnull className, id _Nonnull service, BOOL * _Nonnull stop) { 205 if ([service respondsToSelector:@selector(kernelWillUnregisterAppWithRecord:)]) { 206 [service kernelWillUnregisterAppWithRecord:appRecord]; 207 } 208 }]; 209} 210 211@end 212