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
20@interface EXKernelServiceRegistry ()
21
22@property (nonatomic, strong) EXBranchManager *branchManager;
23@property (nonatomic, strong) EXCachedResourceManager *cachedResourceManager;
24@property (nonatomic, strong) EXFileSystemManager *fileSystemManager;
25@property (nonatomic, strong) EXGoogleAuthManager *googleAuthManager;
26@property (nonatomic, strong) EXErrorRecoveryManager *errorRecoveryManager;
27@property (nonatomic, strong) EXHomeModuleManager *homeModuleManager;
28@property (nonatomic, strong) EXKernelLinkingManager *linkingManager;
29@property (nonatomic, strong) EXRemoteNotificationManager *remoteNotificationManager;
30@property (nonatomic, strong) EXScreenOrientationManager *screenOrientationManager;
31@property (nonatomic, strong) EXSensorManager *sensorManager;
32@property (nonatomic, strong) EXAudioSessionManager *audioSessionManager;
33@property (nonatomic, strong) EXUpdatesManager *updatesManager;
34@property (nonatomic, strong) EXPermissionsManager *permissionsManager;
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    [self permissionsManager];
58  }
59  return self;
60}
61
62- (EXBranchManager *)branchManager
63{
64  if (!_branchManager) {
65    _branchManager = [[EXBranchManager alloc] init];
66  }
67  return _branchManager;
68}
69
70- (EXCachedResourceManager *)cachedResourceManager
71{
72  if (!_cachedResourceManager) {
73    _cachedResourceManager = [[EXCachedResourceManager alloc] init];
74  }
75  return _cachedResourceManager;
76}
77
78- (EXRemoteNotificationManager *)remoteNotificationManager
79{
80  if (!_remoteNotificationManager) {
81    _remoteNotificationManager = [[EXRemoteNotificationManager alloc] init];
82  }
83  return _remoteNotificationManager;
84}
85
86- (EXErrorRecoveryManager *)errorRecoveryManager
87{
88  if (!_errorRecoveryManager) {
89    _errorRecoveryManager = [[EXErrorRecoveryManager alloc] init];
90  }
91  return _errorRecoveryManager;
92}
93
94- (EXFileSystemManager *)fileSystemManager
95{
96  if (!_fileSystemManager) {
97    _fileSystemManager = [[EXFileSystemManager alloc] init];
98  }
99  return _fileSystemManager;
100}
101
102- (EXGoogleAuthManager *)googleAuthManager
103{
104  if (!_googleAuthManager) {
105    _googleAuthManager = [[EXGoogleAuthManager alloc] init];
106  }
107  return _googleAuthManager;
108}
109
110- (EXKernelLinkingManager *)linkingManager
111{
112  if (!_linkingManager) {
113    _linkingManager = [[EXKernelLinkingManager alloc] init];
114  }
115  return _linkingManager;
116}
117
118- (EXHomeModuleManager *)homeModuleManager
119{
120  if (!_homeModuleManager) {
121    _homeModuleManager = [[EXHomeModuleManager alloc] init];
122  }
123  return _homeModuleManager;
124}
125
126- (EXScreenOrientationManager *)screenOrientationManager
127{
128  if (!_screenOrientationManager) {
129    _screenOrientationManager = [[EXScreenOrientationManager alloc] init];
130  }
131  return _screenOrientationManager;
132}
133
134- (EXSensorManager *)sensorManager
135{
136  if (!_sensorManager) {
137    _sensorManager = [[EXSensorManager alloc] init];
138  }
139  return _sensorManager;
140}
141
142
143- (EXAudioSessionManager *)audioSessionManager
144{
145  if (!_audioSessionManager) {
146    _audioSessionManager = [[EXAudioSessionManager alloc] init];
147  }
148  return _audioSessionManager;
149}
150
151- (EXUpdatesManager *)updatesManager
152{
153  if (!_updatesManager) {
154    _updatesManager = [[EXUpdatesManager alloc] init];
155  }
156  return _updatesManager;
157}
158
159- (EXPermissionsManager *)permissionsManager
160{
161  if (!_permissionsManager) {
162    _permissionsManager = [[EXPermissionsManager alloc] init];
163  }
164  return _permissionsManager;
165}
166
167- (NSDictionary *)allServices
168{
169  if (!_allServices) {
170    NSMutableDictionary *result = [NSMutableDictionary dictionary];
171    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 ]) {
172      NSString *className = NSStringFromClass([service class]);
173      result[className] = service;
174    }
175    _allServices = result;
176  }
177  return _allServices;
178}
179
180#pragma mark - app registry delegate
181
182- (void)appRegistry:(EXKernelAppRegistry *)registry didRegisterAppRecord:(EXKernelAppRecord *)appRecord
183{
184  [self.allServices enumerateKeysAndObjectsUsingBlock:^(NSString * _Nonnull className, id  _Nonnull service, BOOL * _Nonnull stop) {
185    if ([service respondsToSelector:@selector(kernelDidRegisterAppWithRecord:)]) {
186      [service kernelDidRegisterAppWithRecord:appRecord];
187    }
188  }];
189}
190
191- (void)appRegistry:(EXKernelAppRegistry *)registry willUnregisterAppRecord:(EXKernelAppRecord *)appRecord
192{
193  [self.allServices enumerateKeysAndObjectsUsingBlock:^(NSString * _Nonnull className, id  _Nonnull service, BOOL * _Nonnull stop) {
194    if ([service respondsToSelector:@selector(kernelWillUnregisterAppWithRecord:)]) {
195      [service kernelWillUnregisterAppWithRecord:appRecord];
196    }
197  }];
198}
199
200@end
201