<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