1 package expo.modules.devmenu
2 
3 import android.content.pm.PackageManager
4 import android.os.Bundle
5 import com.facebook.react.ReactInstanceManager
6 import com.facebook.react.bridge.ReactContext
7 
8 object DevMenuAppInfo {
getAppInfonull9   fun getAppInfo(instanceManager: ReactInstanceManager, reactContext: ReactContext): Bundle {
10     val packageManager = reactContext.packageManager
11     val packageName = reactContext.packageName
12     val packageInfo = packageManager.getPackageInfo(packageName, 0)
13 
14     var appVersion = packageInfo.versionName
15     val applicationInfo = packageManager.getApplicationInfo(packageName, PackageManager.GET_META_DATA)
16     var appName = packageManager.getApplicationLabel(applicationInfo).toString()
17     val runtimeVersion = getMetadataValue(reactContext, "expo.modules.updates.EXPO_RUNTIME_VERSION")
18     val sdkVersion = getMetadataValue(reactContext, "expo.modules.updates.EXPO_SDK_VERSION")
19     val appIcon = getApplicationIconUri(reactContext)
20     var hostUrl = reactContext.sourceURL
21 
22     val manifest = DevMenuManager.currentManifest
23 
24     if (manifest != null) {
25       val manifestName = manifest.getName()
26       if (manifestName != null) {
27         appName = manifestName
28       }
29 
30       val manifestVersion = manifest.getVersion()
31       if (manifestVersion != null) {
32         appVersion = manifestVersion
33       }
34     }
35 
36     if (DevMenuManager.currentManifestURL != null) {
37       hostUrl = DevMenuManager.currentManifestURL
38     }
39 
40     val jsExecutorName = instanceManager.jsExecutorName
41     val engine = when {
42       jsExecutorName.contains("Hermes") -> "Hermes"
43       jsExecutorName.contains("V8") -> "V8"
44       else -> "JSC"
45     }
46 
47     return Bundle().apply {
48       putString("appVersion", appVersion)
49       putString("appName", appName)
50       putString("appIcon", appIcon)
51       putString("runtimeVersion", runtimeVersion)
52       putString("sdkVersion", sdkVersion)
53       putString("hostUrl", hostUrl)
54       putString("engine", engine)
55     }
56   }
57 
getMetadataValuenull58   private fun getMetadataValue(reactContext: ReactContext, key: String): String {
59     val packageManager = reactContext.packageManager
60     val packageName = reactContext.packageName
61     val applicationInfo = packageManager.getApplicationInfo(packageName, PackageManager.GET_META_DATA)
62     return applicationInfo.metaData?.get(key)?.toString() ?: ""
63   }
64 
getApplicationIconUrinull65   private fun getApplicationIconUri(reactContext: ReactContext): String {
66     var appIcon = ""
67     val packageManager = reactContext.packageManager
68     val packageName = reactContext.packageName
69     val applicationInfo = packageManager.getApplicationInfo(packageName, 0)
70 
71     if (applicationInfo.icon != null) {
72       appIcon = "" + applicationInfo.icon
73     }
74     //    TODO - figure out how to get resId for AdaptiveIconDrawable icons
75     return appIcon
76   }
77 }
78