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#import "EXPermissionsManager.h"
19#import "EXUtilService.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) EXPermissionsManager *permissionsManager;
36@property (nonatomic, strong) EXUtilService *utilService;
37@property (nonatomic, strong) NSDictionary<NSString *, id> *allServices;
38
39@end
40
41@implementation EXKernelServiceRegistry
42
43- (instancetype)init
44{
45  if (self = [super init]) {
46    // TODO: init these in some clean way
47    [self branchManager];
48    [self cachedResourceManager];
49    [self errorRecoveryManager];
50    [self remoteNotificationManager];
51    [self linkingManager];
52    [self homeModuleManager];
53    [self screenOrientationManager];
54    [self googleAuthManager];
55    [self sensorManager];
56    [self fileSystemManager];
57    [self audioSessionManager];
58    [self updatesManager];
59    [self permissionsManager];
60    [self utilService];
61  }
62  return self;
63}
64
65- (EXBranchManager *)branchManager
66{
67  if (!_branchManager) {
68    _branchManager = [[EXBranchManager alloc] init];
69  }
70  return _branchManager;
71}
72
73- (EXCachedResourceManager *)cachedResourceManager
74{
75  if (!_cachedResourceManager) {
76    _cachedResourceManager = [[EXCachedResourceManager alloc] init];
77  }
78  return _cachedResourceManager;
79}
80
81- (EXRemoteNotificationManager *)remoteNotificationManager
82{
83  if (!_remoteNotificationManager) {
84    _remoteNotificationManager = [[EXRemoteNotificationManager alloc] init];
85  }
86  return _remoteNotificationManager;
87}
88
89- (EXErrorRecoveryManager *)errorRecoveryManager
90{
91  if (!_errorRecoveryManager) {
92    _errorRecoveryManager = [[EXErrorRecoveryManager alloc] init];
93  }
94  return _errorRecoveryManager;
95}
96
97- (EXFileSystemManager *)fileSystemManager
98{
99  if (!_fileSystemManager) {
100    _fileSystemManager = [[EXFileSystemManager alloc] init];
101  }
102  return _fileSystemManager;
103}
104
105- (EXGoogleAuthManager *)googleAuthManager
106{
107  if (!_googleAuthManager) {
108    _googleAuthManager = [[EXGoogleAuthManager alloc] init];
109  }
110  return _googleAuthManager;
111}
112
113- (EXKernelLinkingManager *)linkingManager
114{
115  if (!_linkingManager) {
116    _linkingManager = [[EXKernelLinkingManager alloc] init];
117  }
118  return _linkingManager;
119}
120
121- (EXHomeModuleManager *)homeModuleManager
122{
123  if (!_homeModuleManager) {
124    _homeModuleManager = [[EXHomeModuleManager alloc] init];
125  }
126  return _homeModuleManager;
127}
128
129- (EXScreenOrientationManager *)screenOrientationManager
130{
131  if (!_screenOrientationManager) {
132    _screenOrientationManager = [[EXScreenOrientationManager alloc] init];
133  }
134  return _screenOrientationManager;
135}
136
137- (EXSensorManager *)sensorManager
138{
139  if (!_sensorManager) {
140    _sensorManager = [[EXSensorManager alloc] init];
141  }
142  return _sensorManager;
143}
144
145
146- (EXAudioSessionManager *)audioSessionManager
147{
148  if (!_audioSessionManager) {
149    _audioSessionManager = [[EXAudioSessionManager alloc] init];
150  }
151  return _audioSessionManager;
152}
153
154- (EXUpdatesManager *)updatesManager
155{
156  if (!_updatesManager) {
157    _updatesManager = [[EXUpdatesManager alloc] init];
158  }
159  return _updatesManager;
160}
161
162- (EXPermissionsManager *)permissionsManager
163{
164  if (!_permissionsManager) {
165    _permissionsManager = [[EXPermissionsManager alloc] init];
166  }
167  return _permissionsManager;
168}
169
170- (EXUtilService *)utilService
171{
172  if (!_utilService) {
173    _utilService = [[EXUtilService alloc] init];
174  }
175  return _utilService;
176}
177
178- (NSDictionary *)allServices
179{
180  if (!_allServices) {
181    NSMutableDictionary *result = [NSMutableDictionary dictionary];
182    for (id service in @[ self.branchManager, self.cachedResourceManager, self.errorRecoveryManager, self.fileSystemManager, self.googleAuthManager, self.homeModuleManager, self.linkingManager, self.remoteNotificationManager, self.screenOrientationManager, self.sensorManager, self.updatesManager, self.audioSessionManager, self.permissionsManager, self.utilService ]) {
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