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