<lambda>null1 package expo.modules.devmenu.extensions
2 
3 import android.util.Log
4 import android.view.KeyEvent
5 import com.facebook.react.bridge.ReactApplicationContext
6 import com.facebook.react.bridge.ReactContextBaseJavaModule
7 import expo.interfaces.devmenu.DevMenuExtensionInterface
8 import expo.interfaces.devmenu.DevMenuExtensionSettingsInterface
9 import expo.interfaces.devmenu.items.DevMenuDataSourceInterface
10 import expo.interfaces.devmenu.items.DevMenuItemImportance
11 import expo.interfaces.devmenu.items.DevMenuItemsContainer
12 import expo.interfaces.devmenu.items.DevMenuScreen
13 import expo.interfaces.devmenu.items.KeyCommand
14 import expo.modules.devmenu.DEV_MENU_TAG
15 import expo.modules.devmenu.DevMenuManager
16 import expo.modules.devmenu.devtools.DevMenuDevToolsDelegate
17 
18 class DevMenuExtension(reactContext: ReactApplicationContext) :
19   ReactContextBaseJavaModule(reactContext), DevMenuExtensionInterface {
20   override fun getName() = "ExpoDevMenuExtensions"
21 
22   override fun devMenuItems(settings: DevMenuExtensionSettingsInterface) = DevMenuItemsContainer.export {
23     if (!settings.wasRunOnDevelopmentBridge()) {
24       return@export
25     }
26 
27     val manager = DevMenuManager
28     val reactInstanceManager = manager.getReactInstanceManager()
29     if (reactInstanceManager == null) {
30       Log.w(DEV_MENU_TAG, "Couldn't export dev-menu items, because the react instance manager isn't present.")
31       return@export
32     }
33 
34     val devDelegate = DevMenuDevToolsDelegate(settings.manager, reactInstanceManager)
35     val reactDevManager = devDelegate.reactDevManager
36     val devSettings = devDelegate.devSettings
37 
38     if (reactDevManager == null || devSettings == null) {
39       Log.w(DEV_MENU_TAG, "Couldn't export dev-menu items, because react-native bridge doesn't contain the dev support manager.")
40       return@export
41     }
42 
43     action("reload", devDelegate::reload) {
44       label = { "Reload" }
45       glyphName = { "reload" }
46       keyCommand = KeyCommand(KeyEvent.KEYCODE_R)
47       importance = DevMenuItemImportance.HIGHEST.value
48     }
49 
50     action(
51       "performance-monitor",
52       {
53         currentActivity?.let {
54           devDelegate.togglePerformanceMonitor(it)
55         }
56       }
57     ) {
58       isEnabled = { devSettings.isFpsDebugEnabled }
59       label = { if (isEnabled()) "Hide Performance Monitor" else "Show Performance Monitor" }
60       glyphName = { "speedometer" }
61       keyCommand = KeyCommand(KeyEvent.KEYCODE_P)
62       importance = DevMenuItemImportance.HIGH.value
63     }
64 
65     action("inspector", devDelegate::toggleElementInspector) {
66       isEnabled = { devSettings.isElementInspectorEnabled }
67       label = { if (isEnabled()) "Hide Element Inspector" else "Show Element Inspector" }
68       glyphName = { "border-style" }
69       keyCommand = KeyCommand(KeyEvent.KEYCODE_I)
70       importance = DevMenuItemImportance.HIGH.value
71     }
72 
73     action("remote-debug", devDelegate::toggleRemoteDebugging) {
74       isEnabled = {
75         devSettings.isRemoteJSDebugEnabled
76       }
77       label = { if (isEnabled()) "Stop Remote Debugging" else "Debug Remote JS" }
78       glyphName = { "remote-desktop" }
79       importance = DevMenuItemImportance.LOW.value
80     }
81 
82     devDelegate.devInternalSettings?.let { devInternalSettings ->
83       action("js-inspector", devDelegate::openJSInspector) {
84         label = { "Open JavaScript debugger" }
85         glyphName = { "language-javascript" }
86         importance = DevMenuItemImportance.LOW.value
87       }
88 
89       val fastRefreshAction = {
90         devInternalSettings.isHotModuleReplacementEnabled = !devInternalSettings.isHotModuleReplacementEnabled
91       }
92 
93       action("fast-refresh", fastRefreshAction) {
94         isEnabled = { devInternalSettings.isHotModuleReplacementEnabled }
95         label = { if (isEnabled()) "Disable Fast Refresh" else "Enable Fast Refresh" }
96         glyphName = { "run-fast" }
97         importance = DevMenuItemImportance.LOW.value
98       }
99     }
100   }
101 
102   override fun devMenuScreens(settings: DevMenuExtensionSettingsInterface): List<DevMenuScreen>? = null
103 
104   override fun devMenuDataSources(settings: DevMenuExtensionSettingsInterface): List<DevMenuDataSourceInterface>? = null
105 }
106