1// Copyright 2015-present 650 Industries. All rights reserved.
2#import <EXDevMenu/EXDevMenuAppInfo.h>
3#import <React/RCTBridge+Private.h>
4#if __has_include(<EXDevMenu/EXDevMenu-Swift.h>)
5#import <EXDevMenu/EXDevMenu-Swift.h>
6#else
7#import <EXDevMenu-Swift.h>
8#endif
9
10@import EXManifests;
11
12@implementation EXDevMenuAppInfo
13
14+(NSDictionary *)getAppInfo
15{
16  NSMutableDictionary *appInfo = [NSMutableDictionary new];
17
18  NSString *appIcon = [EXDevMenuAppInfo getAppIcon];
19  NSString *runtimeVersion = [EXDevMenuAppInfo getUpdatesConfigForKey:@"EXUpdatesRuntimeVersion"];
20  NSString *sdkVersion = [EXDevMenuAppInfo getUpdatesConfigForKey:@"EXUpdatesSDKVersion"];
21  NSString *appVersion = [EXDevMenuAppInfo getFormattedAppVersion];
22  NSString *appName = [[NSBundle mainBundle] objectForInfoDictionaryKey: @"CFBundleDisplayName"] ?: [[NSBundle mainBundle] objectForInfoDictionaryKey: @"CFBundleExecutable"];
23
24  DevMenuManager *manager = [DevMenuManager shared];
25
26  if (manager.currentManifest != nil) {
27    appName = [manager.currentManifest name];
28    appVersion = [manager.currentManifest version];
29  }
30
31  NSString *engine;
32  NSString *bridgeDescription = [[[manager currentBridge] batchedBridge] bridgeDescription];
33  if ([bridgeDescription containsString:@"Hermes"]) {
34    engine = @"Hermes";
35  } else if ([bridgeDescription containsString:@"V8"]) {
36    engine = @"V8";
37  } else {
38    engine = @"JSC";
39  }
40
41  NSString *hostUrl = [manager.currentManifestURL absoluteString] ?: @"";
42
43  appInfo[@"appName"] = appName;
44  appInfo[@"appIcon"] = appIcon;
45  appInfo[@"appVersion"] = appVersion;
46  appInfo[@"runtimeVersion"] = runtimeVersion;
47  appInfo[@"sdkVersion"] = sdkVersion;
48  appInfo[@"hostUrl"] = hostUrl;
49  appInfo[@"engine"] = engine;
50
51  return appInfo;
52}
53
54+(NSString *)getAppIcon
55{
56  NSString *appIcon = @"";
57  NSString *appIconName = [[[[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleIcons"] objectForKey:@"CFBundlePrimaryIcon"] objectForKey:@"CFBundleIconFiles"]  lastObject];
58
59  if (appIconName != nil) {
60    NSString *resourcePath = [[NSBundle mainBundle] resourcePath];
61    NSString *appIconPath = [[resourcePath stringByAppendingString:appIconName] stringByAppendingString:@".png"];
62    appIcon = [@"file://" stringByAppendingString:appIconPath];
63  }
64
65  return appIcon;
66}
67
68+(NSString *)getUpdatesConfigForKey:(NSString *)key
69{
70  NSString *value = @"";
71  NSString *path = [[NSBundle mainBundle] pathForResource:@"Expo" ofType:@"plist"];
72
73  if (path != nil) {
74    NSDictionary *expoConfig = [NSDictionary dictionaryWithContentsOfFile:path];
75
76    if (expoConfig != nil) {
77      value = [expoConfig objectForKey:key] ?: @"";
78    }
79  }
80
81  return value;
82}
83
84+(NSString *)getFormattedAppVersion
85{
86  NSString *shortVersion = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"];
87  NSString *buildVersion = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"];
88  NSString *appVersion = [NSString stringWithFormat:@"%@ (%@)", shortVersion, buildVersion];
89  return appVersion;
90}
91
92@end
93