1// Copyright 2015-present 650 Industries. All rights reserved.
2
3#import "EXErrorRecoveryManager.h"
4#import "EXFileDownloader.h"
5#import "EXKernel.h"
6#import "EXKernelAppLoader.h"
7#import "EXKernelDevKeyCommands.h"
8#import "EXKernelDevMotionHandler.h"
9#import "EXKernelLinkingManager.h"
10#import "EXHomeModuleManager.h"
11#import "EXManifestResource.h"
12#import "EXReactAppManager.h"
13#import "EXShellManager.h"
14
15@implementation EXHomeModuleManager
16
17- (instancetype)init
18{
19  if (self = [super init]) {
20    [EXKernelDevMotionHandler sharedInstance];
21    [EXKernelDevKeyCommands sharedInstance];
22  }
23  return self;
24}
25
26- (BOOL)homeModuleShouldEnableLegacyMenuBehavior:(EXHomeModule *)module
27{
28  return [EXKernelDevKeyCommands sharedInstance].isLegacyMenuBehaviorEnabled;
29}
30
31- (void)homeModule:(EXHomeModule *)module didSelectEnableLegacyMenuBehavior:(BOOL)isEnabled
32{
33  [EXKernelDevKeyCommands sharedInstance].isLegacyMenuBehaviorEnabled = isEnabled;
34}
35
36- (BOOL)homeModuleShouldEnableDevtools:(__unused EXHomeModule *)module
37{
38  EXKernelAppRecord *visibleApp = [EXKernel sharedInstance].visibleApp;
39  return (
40    visibleApp != [EXKernel sharedInstance].appRegistry.homeAppRecord &&
41    [visibleApp.appManager enablesDeveloperTools]
42  );
43  return NO;
44}
45
46- (NSDictionary<NSString *, NSString *> *)devMenuItemsForHomeModule:(EXHomeModule *)module
47{
48  return [[EXKernel sharedInstance].visibleApp.appManager devMenuItems];
49}
50
51- (void)homeModule:(EXHomeModule *)module didSelectDevMenuItemWithKey:(NSString *)key
52{
53  [[EXKernel sharedInstance].visibleApp.appManager selectDevMenuItemWithKey:key];
54  if ([EXKernel sharedInstance].browserController) {
55    dispatch_async(dispatch_get_main_queue(), ^{
56      [[EXKernel sharedInstance].browserController toggleMenu];
57    });
58  }
59}
60
61- (void)homeModuleDidSelectRefresh:(EXHomeModule *)module
62{
63  if ([EXKernel sharedInstance].browserController) {
64    dispatch_async(dispatch_get_main_queue(), ^{
65      [[EXKernel sharedInstance].browserController refreshVisibleApp];
66    });
67  }
68}
69
70- (void)homeModuleDidSelectCloseMenu:(EXHomeModule *)module
71{
72  if ([EXKernel sharedInstance].browserController) {
73    dispatch_async(dispatch_get_main_queue(), ^{
74      [[EXKernel sharedInstance].browserController setIsMenuVisible:NO];
75    });
76  }
77}
78
79- (void)homeModuleDidSelectGoToHome:(EXHomeModule *)module
80{
81  if ([EXKernel sharedInstance].browserController) {
82    dispatch_async(dispatch_get_main_queue(), ^{
83      [[EXKernel sharedInstance].browserController moveHomeToVisible];
84    });
85  }
86}
87
88- (void)homeModuleDidSelectHomeDiagnostics:(__unused EXHomeModule *)module
89{
90  if ([EXKernel sharedInstance].browserController) {
91    [EXUtil performSynchronouslyOnMainThread:^{
92      [[EXKernel sharedInstance].browserController showDiagnostics];
93    }];
94  }
95}
96
97- (void)homeModuleDidSelectQRReader:(EXHomeModule *)module
98{
99  if ([EXKernel sharedInstance].browserController) {
100    [EXUtil performSynchronouslyOnMainThread:^{
101      [[EXKernel sharedInstance].browserController showQRReader];
102    }];
103  }
104}
105
106- (BOOL)homeModuleShouldAutoReloadCurrentTask:(EXHomeModule *)module
107{
108  // TODO: ben: error recovery audit
109  NSString *visibleAppExperienceId = [EXKernel sharedInstance].visibleApp.experienceId;
110  return [[EXKernel sharedInstance].serviceRegistry.errorRecoveryManager experienceIdShouldReloadOnError:visibleAppExperienceId];
111}
112
113- (void)homeModule:(__unused EXHomeModule *)module didOpenUrl:(NSString *)url
114{
115  [[EXKernel sharedInstance].serviceRegistry.linkingManager openUrl:url isUniversalLink:NO];
116}
117
118@end
119