react-native-inapp-inspector 2.3.15 → 2.3.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (381) hide show
  1. package/README.md +1 -0
  2. package/android/src/main/java/com/inappinspector/NetworkInspectorModule.kt +438 -7
  3. package/bin/cli.js +0 -0
  4. package/dist/commonjs/capture.d.ts +26 -0
  5. package/dist/commonjs/capture.js +32 -0
  6. package/dist/commonjs/components/AnalyticsEventCard.js +11 -11
  7. package/dist/commonjs/components/AnimatedEntrance.js +6 -70
  8. package/dist/commonjs/components/DomainHeader.js +3 -48
  9. package/dist/commonjs/components/EmptyState.js +2 -2
  10. package/dist/commonjs/components/HeadersSection.js +14 -34
  11. package/dist/commonjs/components/Inspector/AnalyticsTab.js +1 -24
  12. package/dist/commonjs/components/Inspector/ConsoleTab.js +1 -23
  13. package/dist/commonjs/components/Inspector/CrashTab.js +4 -25
  14. package/dist/commonjs/components/Inspector/DebuggingTab.js +2 -2
  15. package/dist/commonjs/components/Inspector/FeedbackModal.d.ts +7 -0
  16. package/dist/commonjs/components/Inspector/FeedbackModal.js +552 -0
  17. package/dist/commonjs/components/Inspector/InspectorHeader.js +675 -285
  18. package/dist/commonjs/components/Inspector/MainScreen.js +66 -69
  19. package/dist/commonjs/components/Inspector/MediaGalleryTab.d.ts +2 -0
  20. package/dist/commonjs/components/Inspector/MediaGalleryTab.js +307 -0
  21. package/dist/commonjs/components/Inspector/MediaPreviewModal.d.ts +11 -0
  22. package/dist/commonjs/components/Inspector/MediaPreviewModal.js +393 -0
  23. package/dist/commonjs/components/Inspector/NetworkTab.js +196 -206
  24. package/dist/commonjs/components/Inspector/NpmStarPrompt.d.ts +3 -0
  25. package/dist/commonjs/components/Inspector/NpmStarPrompt.js +494 -0
  26. package/dist/commonjs/components/Inspector/NpmUpdateToast.js +4 -9
  27. package/dist/commonjs/components/Inspector/PerformanceTab.js +8 -1
  28. package/dist/commonjs/components/Inspector/ReduxTab.js +4 -24
  29. package/dist/commonjs/components/Inspector/SettingsPanel.js +1280 -173
  30. package/dist/commonjs/components/Inspector/SkeletonPlaceholder.js +2 -2
  31. package/dist/commonjs/components/Inspector/StorageTab.js +3 -26
  32. package/dist/commonjs/components/Inspector/TabBar.js +55 -25
  33. package/dist/commonjs/components/Inspector/UpdateAvailableModal.js +5 -10
  34. package/dist/commonjs/components/JsonViewer.js +43 -20
  35. package/dist/commonjs/components/LogCard.js +5 -5
  36. package/dist/commonjs/components/MetaAccordion.js +78 -80
  37. package/dist/commonjs/components/NetworkIcons.d.ts +13 -0
  38. package/dist/commonjs/components/NetworkIcons.js +83 -2
  39. package/dist/commonjs/components/SectionHeader.js +3 -48
  40. package/dist/commonjs/components/SkeletonPlaceholder.js +2 -2
  41. package/dist/commonjs/components/SourcePageCard.js +43 -45
  42. package/dist/commonjs/components/Toast.js +4 -4
  43. package/dist/commonjs/components/TouchableScale.js +9 -65
  44. package/dist/commonjs/components/TreeNode.js +2 -14
  45. package/dist/commonjs/constants/telemetryConfig.d.ts +3 -3
  46. package/dist/commonjs/constants/telemetryConfig.js +3 -3
  47. package/dist/commonjs/constants/version.d.ts +1 -1
  48. package/dist/commonjs/constants/version.js +1 -1
  49. package/dist/commonjs/customHooks/useAccordion.d.ts +3 -8
  50. package/dist/commonjs/customHooks/useAccordion.js +6 -36
  51. package/dist/commonjs/helpers/index.d.ts +3 -1
  52. package/dist/commonjs/helpers/index.js +11 -1
  53. package/dist/commonjs/helpers/remoteConfig.d.ts +4 -0
  54. package/dist/commonjs/helpers/remoteConfig.js +165 -0
  55. package/dist/commonjs/helpers/searchQueryParser.js +2 -0
  56. package/dist/commonjs/helpers/telemetry.d.ts +5 -0
  57. package/dist/commonjs/helpers/telemetry.js +339 -8
  58. package/dist/commonjs/i18n/locales/en.json +66 -2
  59. package/dist/commonjs/index.d.ts +2 -0
  60. package/dist/commonjs/index.js +70 -23
  61. package/dist/commonjs/native/NativeInspector.d.ts +60 -0
  62. package/dist/commonjs/native/NativeInspector.js +109 -2
  63. package/dist/commonjs/native/NativeNetworkInspector.d.ts +8 -0
  64. package/dist/commonjs/styles/AppColors.d.ts +36 -0
  65. package/dist/commonjs/styles/AppColors.js +36 -0
  66. package/dist/commonjs/styles/AppFonts.d.ts +2 -0
  67. package/dist/commonjs/styles/AppFonts.js +1 -0
  68. package/dist/commonjs/styles/index.d.ts +25 -1
  69. package/dist/commonjs/styles/index.js +22 -1
  70. package/dist/commonjs/types/enums.d.ts +2 -0
  71. package/dist/commonjs/types/enums.js +2 -0
  72. package/dist/commonjs/types/index.d.ts +2 -2
  73. package/dist/commonjs/types/interfaces.d.ts +12 -0
  74. package/dist/esm/capture.d.ts +26 -0
  75. package/dist/esm/capture.js +29 -0
  76. package/dist/esm/components/AnalyticsEventCard.js +11 -11
  77. package/dist/esm/components/AnimatedEntrance.js +4 -38
  78. package/dist/esm/components/DomainHeader.js +4 -16
  79. package/dist/esm/components/EmptyState.js +2 -2
  80. package/dist/esm/components/HeadersSection.js +16 -36
  81. package/dist/esm/components/Inspector/AnalyticsTab.js +3 -26
  82. package/dist/esm/components/Inspector/ConsoleTab.js +3 -25
  83. package/dist/esm/components/Inspector/CrashTab.js +6 -27
  84. package/dist/esm/components/Inspector/DebuggingTab.js +3 -3
  85. package/dist/esm/components/Inspector/FeedbackModal.d.ts +7 -0
  86. package/dist/esm/components/Inspector/FeedbackModal.js +515 -0
  87. package/dist/esm/components/Inspector/InspectorHeader.js +678 -288
  88. package/dist/esm/components/Inspector/MainScreen.js +67 -70
  89. package/dist/esm/components/Inspector/MediaGalleryTab.d.ts +2 -0
  90. package/dist/esm/components/Inspector/MediaGalleryTab.js +267 -0
  91. package/dist/esm/components/Inspector/MediaPreviewModal.d.ts +11 -0
  92. package/dist/esm/components/Inspector/MediaPreviewModal.js +353 -0
  93. package/dist/esm/components/Inspector/NetworkTab.js +199 -209
  94. package/dist/esm/components/Inspector/NpmStarPrompt.d.ts +3 -0
  95. package/dist/esm/components/Inspector/NpmStarPrompt.js +454 -0
  96. package/dist/esm/components/Inspector/NpmUpdateToast.js +5 -10
  97. package/dist/esm/components/Inspector/PerformanceTab.js +8 -1
  98. package/dist/esm/components/Inspector/ReduxTab.js +6 -26
  99. package/dist/esm/components/Inspector/SettingsPanel.js +1283 -176
  100. package/dist/esm/components/Inspector/SkeletonPlaceholder.js +2 -2
  101. package/dist/esm/components/Inspector/StorageTab.js +3 -26
  102. package/dist/esm/components/Inspector/TabBar.js +56 -26
  103. package/dist/esm/components/Inspector/UpdateAvailableModal.js +6 -11
  104. package/dist/esm/components/JsonViewer.js +43 -20
  105. package/dist/esm/components/LogCard.js +5 -5
  106. package/dist/esm/components/MetaAccordion.js +79 -81
  107. package/dist/esm/components/NetworkIcons.d.ts +13 -0
  108. package/dist/esm/components/NetworkIcons.js +68 -0
  109. package/dist/esm/components/SectionHeader.js +4 -16
  110. package/dist/esm/components/SkeletonPlaceholder.js +2 -2
  111. package/dist/esm/components/SourcePageCard.js +44 -46
  112. package/dist/esm/components/Toast.js +4 -4
  113. package/dist/esm/components/TouchableScale.js +7 -33
  114. package/dist/esm/components/TreeNode.js +4 -16
  115. package/dist/esm/constants/telemetryConfig.d.ts +3 -3
  116. package/dist/esm/constants/telemetryConfig.js +3 -3
  117. package/dist/esm/constants/version.d.ts +1 -1
  118. package/dist/esm/constants/version.js +1 -1
  119. package/dist/esm/customHooks/useAccordion.d.ts +3 -8
  120. package/dist/esm/customHooks/useAccordion.js +7 -37
  121. package/dist/esm/helpers/index.d.ts +3 -1
  122. package/dist/esm/helpers/index.js +9 -0
  123. package/dist/esm/helpers/remoteConfig.d.ts +4 -0
  124. package/dist/esm/helpers/remoteConfig.js +160 -0
  125. package/dist/esm/helpers/searchQueryParser.js +2 -0
  126. package/dist/esm/helpers/telemetry.d.ts +5 -0
  127. package/dist/esm/helpers/telemetry.js +332 -9
  128. package/dist/esm/i18n/locales/en.json +66 -2
  129. package/dist/esm/index.d.ts +2 -0
  130. package/dist/esm/index.js +66 -23
  131. package/dist/esm/native/NativeInspector.d.ts +60 -0
  132. package/dist/esm/native/NativeInspector.js +100 -1
  133. package/dist/esm/native/NativeNetworkInspector.d.ts +8 -0
  134. package/dist/esm/styles/AppColors.d.ts +36 -0
  135. package/dist/esm/styles/AppColors.js +36 -0
  136. package/dist/esm/styles/AppFonts.d.ts +2 -0
  137. package/dist/esm/styles/AppFonts.js +1 -0
  138. package/dist/esm/styles/index.d.ts +25 -1
  139. package/dist/esm/styles/index.js +22 -1
  140. package/dist/esm/types/enums.d.ts +2 -0
  141. package/dist/esm/types/enums.js +2 -0
  142. package/dist/esm/types/index.d.ts +2 -2
  143. package/dist/esm/types/interfaces.d.ts +12 -0
  144. package/ios/NetworkInspectorModule.h +1 -0
  145. package/ios/NetworkInspectorModule.mm +736 -7
  146. package/package.json +10 -2
  147. package/react-native-inapp-inspector.podspec +1 -0
  148. package/src/capture.ts +101 -0
  149. package/src/components/AnalyticsEventCard.tsx +15 -13
  150. package/src/components/AnimatedEntrance.tsx +3 -47
  151. package/src/components/DomainHeader.tsx +4 -17
  152. package/src/components/EmptyState.tsx +2 -2
  153. package/src/components/HeadersSection.tsx +31 -56
  154. package/src/components/Inspector/AnalyticsTab.tsx +2 -25
  155. package/src/components/Inspector/ConsoleTab.tsx +2 -24
  156. package/src/components/Inspector/CrashTab.tsx +4 -25
  157. package/src/components/Inspector/DebuggingTab.tsx +2 -2
  158. package/src/components/Inspector/FeedbackModal.tsx +626 -0
  159. package/src/components/Inspector/InspectorHeader.tsx +1230 -728
  160. package/src/components/Inspector/MainScreen.tsx +97 -82
  161. package/src/components/Inspector/MediaGalleryTab.tsx +355 -0
  162. package/src/components/Inspector/MediaPreviewModal.tsx +435 -0
  163. package/src/components/Inspector/NetworkTab.tsx +83 -93
  164. package/src/components/Inspector/NpmStarPrompt.tsx +532 -0
  165. package/src/components/Inspector/NpmUpdateToast.tsx +4 -9
  166. package/src/components/Inspector/PerformanceTab.tsx +8 -1
  167. package/src/components/Inspector/ReduxTab.tsx +5 -25
  168. package/src/components/Inspector/SettingsPanel.tsx +1493 -225
  169. package/src/components/Inspector/SkeletonPlaceholder.tsx +2 -2
  170. package/src/components/Inspector/StorageTab.tsx +3 -26
  171. package/src/components/Inspector/TabBar.tsx +63 -32
  172. package/src/components/Inspector/UpdateAvailableModal.tsx +6 -10
  173. package/src/components/JsonViewer.tsx +101 -60
  174. package/src/components/LogCard.tsx +10 -8
  175. package/src/components/MetaAccordion.tsx +6 -6
  176. package/src/components/NetworkIcons.tsx +242 -0
  177. package/src/components/SectionHeader.tsx +4 -16
  178. package/src/components/SkeletonPlaceholder.tsx +2 -2
  179. package/src/components/SourcePageCard.tsx +57 -55
  180. package/src/components/Toast.tsx +4 -4
  181. package/src/components/TouchableScale.tsx +8 -38
  182. package/src/components/TreeNode.tsx +5 -20
  183. package/src/constants/telemetryConfig.ts +3 -5
  184. package/src/constants/version.ts +1 -1
  185. package/src/customHooks/useAccordion.tsx +10 -43
  186. package/src/helpers/index.ts +11 -1
  187. package/src/helpers/remoteConfig.ts +212 -0
  188. package/src/helpers/searchQueryParser.ts +3 -0
  189. package/src/helpers/telemetry.ts +381 -10
  190. package/src/i18n/locales/en.json +69 -2
  191. package/src/index.tsx +93 -23
  192. package/src/native/NativeInspector.ts +186 -1
  193. package/src/native/NativeNetworkInspector.ts +9 -0
  194. package/src/styles/AppColors.ts +38 -0
  195. package/src/styles/AppFonts.ts +2 -0
  196. package/src/styles/index.ts +23 -2
  197. package/src/types/enums.ts +4 -0
  198. package/src/types/index.ts +2 -2
  199. package/src/types/interfaces.ts +12 -0
  200. package/android/.gradle/8.9/checksums/checksums.lock +0 -0
  201. package/android/.gradle/8.9/checksums/md5-checksums.bin +0 -0
  202. package/android/.gradle/8.9/checksums/sha1-checksums.bin +0 -0
  203. package/android/.gradle/8.9/dependencies-accessors/gc.properties +0 -0
  204. package/android/.gradle/8.9/executionHistory/executionHistory.lock +0 -0
  205. package/android/.gradle/8.9/fileChanges/last-build.bin +0 -0
  206. package/android/.gradle/8.9/fileHashes/fileHashes.lock +0 -0
  207. package/android/.gradle/8.9/gc.properties +0 -0
  208. package/android/.gradle/9.2.0/checksums/checksums.lock +0 -0
  209. package/android/.gradle/9.2.0/fileChanges/last-build.bin +0 -0
  210. package/android/.gradle/9.2.0/fileHashes/fileHashes.bin +0 -0
  211. package/android/.gradle/9.2.0/fileHashes/fileHashes.lock +0 -0
  212. package/android/.gradle/9.2.0/gc.properties +0 -0
  213. package/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock +0 -0
  214. package/android/.gradle/buildOutputCleanup/cache.properties +0 -2
  215. package/android/.gradle/vcs-1/gc.properties +0 -0
  216. package/android/build/.transforms/6683d6eeaa3e1dfa689c3385111a0386/results.bin +0 -1
  217. package/android/build/.transforms/6683d6eeaa3e1dfa689c3385111a0386/transformed/classes/classes_dex/classes.dex +0 -0
  218. package/android/build/.transforms/9d2a3e5e0f0ea07cafb0c0bf290630ee/results.bin +0 -1
  219. package/android/build/.transforms/9d2a3e5e0f0ea07cafb0c0bf290630ee/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/inappinspector/BuildConfig.dex +0 -0
  220. package/android/build/.transforms/9d2a3e5e0f0ea07cafb0c0bf290630ee/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/inappinspector/InAppInspectorFloatingView$iconView$1.dex +0 -0
  221. package/android/build/.transforms/9d2a3e5e0f0ea07cafb0c0bf290630ee/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/inappinspector/InAppInspectorFloatingView.dex +0 -0
  222. package/android/build/.transforms/9d2a3e5e0f0ea07cafb0c0bf290630ee/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/inappinspector/NativeNetworkInspectorSpec.dex +0 -0
  223. package/android/build/.transforms/9d2a3e5e0f0ea07cafb0c0bf290630ee/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/inappinspector/NetworkInspectorModule$Companion.dex +0 -0
  224. package/android/build/.transforms/9d2a3e5e0f0ea07cafb0c0bf290630ee/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/inappinspector/NetworkInspectorModule$frameCallback$1.dex +0 -0
  225. package/android/build/.transforms/9d2a3e5e0f0ea07cafb0c0bf290630ee/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/inappinspector/NetworkInspectorModule$shakeListener$1.dex +0 -0
  226. package/android/build/.transforms/9d2a3e5e0f0ea07cafb0c0bf290630ee/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/inappinspector/NetworkInspectorModule.dex +0 -0
  227. package/android/build/.transforms/9d2a3e5e0f0ea07cafb0c0bf290630ee/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/inappinspector/NetworkInspectorPackage.dex +0 -0
  228. package/android/build/.transforms/9d2a3e5e0f0ea07cafb0c0bf290630ee/transformed/bundleLibRuntimeToDirDebug/desugar_graph.bin +0 -0
  229. package/android/build/generated/source/buildConfig/debug/com/inappinspector/BuildConfig.java +0 -10
  230. package/android/build/generated/source/codegen/java/com/inappinspector/NativeNetworkInspectorSpec.java +0 -104
  231. package/android/build/generated/source/codegen/jni/CMakeLists.txt +0 -28
  232. package/android/build/generated/source/codegen/jni/RNInAppInspectorSpec-generated.cpp +0 -128
  233. package/android/build/generated/source/codegen/jni/RNInAppInspectorSpec.h +0 -31
  234. package/android/build/generated/source/codegen/jni/react/renderer/components/RNInAppInspectorSpec/ComponentDescriptors.cpp +0 -22
  235. package/android/build/generated/source/codegen/jni/react/renderer/components/RNInAppInspectorSpec/ComponentDescriptors.h +0 -24
  236. package/android/build/generated/source/codegen/jni/react/renderer/components/RNInAppInspectorSpec/EventEmitters.cpp +0 -16
  237. package/android/build/generated/source/codegen/jni/react/renderer/components/RNInAppInspectorSpec/EventEmitters.h +0 -17
  238. package/android/build/generated/source/codegen/jni/react/renderer/components/RNInAppInspectorSpec/Props.cpp +0 -19
  239. package/android/build/generated/source/codegen/jni/react/renderer/components/RNInAppInspectorSpec/Props.h +0 -18
  240. package/android/build/generated/source/codegen/jni/react/renderer/components/RNInAppInspectorSpec/RNInAppInspectorSpecJSI.h +0 -177
  241. package/android/build/generated/source/codegen/jni/react/renderer/components/RNInAppInspectorSpec/ShadowNodes.cpp +0 -17
  242. package/android/build/generated/source/codegen/jni/react/renderer/components/RNInAppInspectorSpec/ShadowNodes.h +0 -23
  243. package/android/build/generated/source/codegen/jni/react/renderer/components/RNInAppInspectorSpec/States.cpp +0 -16
  244. package/android/build/generated/source/codegen/jni/react/renderer/components/RNInAppInspectorSpec/States.h +0 -20
  245. package/android/build/generated/source/codegen/schema.json +0 -1
  246. package/android/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/AndroidManifest.xml +0 -7
  247. package/android/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/output-metadata.json +0 -18
  248. package/android/build/intermediates/aar_main_jar/debug/syncDebugLibJars/classes.jar +0 -0
  249. package/android/build/intermediates/aar_metadata/debug/writeDebugAarMetadata/aar-metadata.properties +0 -6
  250. package/android/build/intermediates/annotation_processor_list/debug/javaPreCompileDebug/annotationProcessors.json +0 -1
  251. package/android/build/intermediates/annotations_typedef_file/debug/extractDebugAnnotations/typedefs.txt +0 -0
  252. package/android/build/intermediates/compile_library_classes_jar/debug/bundleLibCompileToJarDebug/classes.jar +0 -0
  253. package/android/build/intermediates/compile_r_class_jar/debug/generateDebugRFile/R.jar +0 -0
  254. package/android/build/intermediates/compile_symbol_list/debug/generateDebugRFile/R.txt +0 -0
  255. package/android/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties +0 -1
  256. package/android/build/intermediates/incremental/debug/packageDebugResources/merger.xml +0 -2
  257. package/android/build/intermediates/incremental/debug-mergeJavaRes/merge-state +0 -0
  258. package/android/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml +0 -2
  259. package/android/build/intermediates/incremental/mergeDebugShaders/merger.xml +0 -2
  260. package/android/build/intermediates/incremental/packageDebugAssets/merger.xml +0 -2
  261. package/android/build/intermediates/java_res/debug/processDebugJavaRes/out/META-INF/react-native-inapp-inspector_debug.kotlin_module +0 -0
  262. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/inappinspector/BuildConfig.class +0 -0
  263. package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/inappinspector/NativeNetworkInspectorSpec.class +0 -0
  264. package/android/build/intermediates/local_only_symbol_list/debug/parseDebugLocalResources/R-def.txt +0 -2
  265. package/android/build/intermediates/manifest_merge_blame_file/debug/processDebugManifest/manifest-merger-blame-debug-report.txt +0 -7
  266. package/android/build/intermediates/merged_java_res/debug/mergeDebugJavaResource/feature-react-native-inapp-inspector.jar +0 -0
  267. package/android/build/intermediates/merged_manifest/debug/processDebugManifest/AndroidManifest.xml +0 -7
  268. package/android/build/intermediates/navigation_json/debug/extractDeepLinksDebug/navigation.json +0 -1
  269. package/android/build/intermediates/nested_resources_validation_report/debug/generateDebugResources/nestedResourcesValidationReport.txt +0 -1
  270. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/META-INF/react-native-inapp-inspector_debug.kotlin_module +0 -0
  271. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/inappinspector/BuildConfig.class +0 -0
  272. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/inappinspector/InAppInspectorFloatingView$iconView$1.class +0 -0
  273. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/inappinspector/InAppInspectorFloatingView.class +0 -0
  274. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/inappinspector/NativeNetworkInspectorSpec.class +0 -0
  275. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/inappinspector/NetworkInspectorModule$Companion.class +0 -0
  276. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/inappinspector/NetworkInspectorModule$frameCallback$1.class +0 -0
  277. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/inappinspector/NetworkInspectorModule$shakeListener$1.class +0 -0
  278. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/inappinspector/NetworkInspectorModule.class +0 -0
  279. package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/inappinspector/NetworkInspectorPackage.class +0 -0
  280. package/android/build/intermediates/runtime_library_classes_jar/debug/bundleLibRuntimeToJarDebug/classes.jar +0 -0
  281. package/android/build/intermediates/symbol_list_with_package_name/debug/generateDebugRFile/package-aware-r.txt +0 -1
  282. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab +0 -0
  283. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.keystream +0 -0
  284. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.keystream.len +0 -0
  285. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.len +0 -0
  286. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.values.at +0 -0
  287. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab_i +0 -0
  288. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab_i.len +0 -0
  289. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab +0 -0
  290. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.keystream +0 -0
  291. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.keystream.len +0 -0
  292. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.len +0 -0
  293. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.values.at +0 -0
  294. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab_i +0 -0
  295. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab_i.len +0 -0
  296. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab +0 -0
  297. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream +0 -0
  298. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream.len +0 -0
  299. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.len +0 -0
  300. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.values.at +0 -0
  301. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i +0 -0
  302. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i.len +0 -0
  303. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab +0 -0
  304. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.keystream +0 -0
  305. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.keystream.len +0 -0
  306. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.len +0 -0
  307. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.values.at +0 -0
  308. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab_i +0 -0
  309. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab_i.len +0 -0
  310. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab +0 -0
  311. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream +0 -0
  312. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream.len +0 -0
  313. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.len +0 -0
  314. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.values.at +0 -0
  315. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i +0 -0
  316. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i.len +0 -0
  317. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab +0 -0
  318. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.keystream +0 -0
  319. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.keystream.len +0 -0
  320. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.len +0 -0
  321. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.values.at +0 -0
  322. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab_i +0 -0
  323. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab_i.len +0 -0
  324. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab +0 -0
  325. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream +0 -0
  326. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream.len +0 -0
  327. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.len +0 -0
  328. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.values.at +0 -0
  329. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab_i +0 -0
  330. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab_i.len +0 -0
  331. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab +0 -0
  332. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.keystream +0 -0
  333. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.keystream.len +0 -0
  334. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.len +0 -0
  335. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.values.at +0 -0
  336. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab_i +0 -0
  337. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab_i.len +0 -0
  338. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab +0 -0
  339. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.keystream +0 -0
  340. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.keystream.len +0 -0
  341. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.len +0 -0
  342. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.values.at +0 -0
  343. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab_i +0 -0
  344. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab_i.len +0 -0
  345. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/counters.tab +0 -2
  346. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab +0 -0
  347. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.keystream +0 -0
  348. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.keystream.len +0 -0
  349. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.len +0 -0
  350. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.values.at +0 -0
  351. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab_i +0 -0
  352. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab_i.len +0 -0
  353. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab +0 -0
  354. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.keystream +0 -0
  355. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.keystream.len +0 -0
  356. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.len +0 -0
  357. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.values.at +0 -0
  358. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab_i +0 -0
  359. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab_i.len +0 -0
  360. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab +0 -0
  361. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.keystream +0 -0
  362. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.keystream.len +0 -0
  363. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.len +0 -0
  364. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.values.at +0 -0
  365. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab_i +0 -0
  366. package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab_i.len +0 -0
  367. package/android/build/kotlin/compileDebugKotlin/cacheable/last-build.bin +0 -0
  368. package/android/build/kotlin/compileDebugKotlin/classpath-snapshot/shrunk-classpath-snapshot.bin +0 -0
  369. package/android/build/kotlin/compileDebugKotlin/local-state/build-history.bin +0 -0
  370. package/android/build/outputs/aar/react-native-inapp-inspector-debug.aar +0 -0
  371. package/android/build/outputs/logs/manifest-merger-debug-report.txt +0 -17
  372. package/android/build/reports/problems/problems-report.html +0 -659
  373. package/android/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin +0 -0
  374. package/android/build/tmp/kotlin-classes/debug/META-INF/react-native-inapp-inspector_debug.kotlin_module +0 -0
  375. package/android/build/tmp/kotlin-classes/debug/com/inappinspector/InAppInspectorFloatingView$iconView$1.class +0 -0
  376. package/android/build/tmp/kotlin-classes/debug/com/inappinspector/InAppInspectorFloatingView.class +0 -0
  377. package/android/build/tmp/kotlin-classes/debug/com/inappinspector/NetworkInspectorModule$Companion.class +0 -0
  378. package/android/build/tmp/kotlin-classes/debug/com/inappinspector/NetworkInspectorModule$frameCallback$1.class +0 -0
  379. package/android/build/tmp/kotlin-classes/debug/com/inappinspector/NetworkInspectorModule$shakeListener$1.class +0 -0
  380. package/android/build/tmp/kotlin-classes/debug/com/inappinspector/NetworkInspectorModule.class +0 -0
  381. package/android/build/tmp/kotlin-classes/debug/com/inappinspector/NetworkInspectorPackage.class +0 -0
package/README.md CHANGED
@@ -11,6 +11,7 @@
11
11
  <p align="center">
12
12
  <a href="https://www.npmjs.com/package/react-native-inapp-inspector"><img src="https://img.shields.io/npm/v/react-native-inapp-inspector?color=6366f1&label=npm" alt="npm version" /></a>
13
13
  <a href="https://www.npmjs.com/package/react-native-inapp-inspector"><img src="https://img.shields.io/npm/dm/react-native-inapp-inspector?color=3b82f6&label=downloads" alt="npm downloads" /></a>
14
+ <a href="https://github.com/vengatmacuser/react-native-inapp-inspector"><img src="https://img.shields.io/github/stars/vengatmacuser/react-native-inapp-inspector?color=f59e0b&label=stars&logo=github" alt="GitHub stars" /></a>
14
15
  <a href="https://bundlephobia.com/package/react-native-inapp-inspector"><img src="https://img.shields.io/bundlephobia/minzip/react-native-inapp-inspector?color=10b981&label=minzipped" alt="bundle size" /></a>
15
16
  <a href="https://github.com/vengatmacuser/react-native-inapp-inspector/blob/main/LICENSE"><img src="https://img.shields.io/badge/license-MIT-green" alt="license" /></a>
16
17
  <a href="https://github.com/vengatmacuser/react-native-inapp-inspector"><img src="https://img.shields.io/badge/platform-iOS%20%7C%20Android%20%7C%20Expo-blue" alt="platform" /></a>
@@ -4,23 +4,41 @@ import android.app.ActivityManager
4
4
  import android.content.Context
5
5
  import android.content.Intent
6
6
  import android.content.IntentFilter
7
+ import android.graphics.Bitmap
8
+ import android.graphics.Canvas
9
+ import android.graphics.Matrix
10
+ import android.media.MediaMetadataRetriever
11
+ import android.net.Uri
7
12
  import android.os.BatteryManager
8
13
  import android.os.Build
9
14
  import android.os.Debug
10
15
  import android.os.Environment
16
+ import android.os.Handler
17
+ import android.os.Looper
11
18
  import android.os.StatFs
19
+ import android.util.Base64
12
20
  import android.util.Log
21
+ import android.view.PixelCopy
22
+ import android.view.View
23
+ import android.view.Window
13
24
  import com.facebook.react.bridge.Arguments
14
25
  import com.facebook.react.bridge.Promise
15
26
  import com.facebook.react.bridge.ReactApplicationContext
16
27
  import com.facebook.react.bridge.ReactContextBaseJavaModule
17
28
  import com.facebook.react.bridge.ReactMethod
29
+ import com.facebook.react.bridge.ReadableMap
18
30
  import com.facebook.react.bridge.WritableMap
19
31
  import com.facebook.react.modules.core.DeviceEventManagerModule
32
+ import java.io.ByteArrayOutputStream
33
+ import java.io.File
34
+ import java.io.FileOutputStream
20
35
  import java.io.PrintWriter
21
36
  import java.io.StringWriter
37
+ import java.util.Timer
38
+ import java.util.TimerTask
22
39
  import java.util.concurrent.Executors
23
40
 
41
+
24
42
  class NetworkInspectorModule(private val reactContext: ReactApplicationContext) :
25
43
  ReactContextBaseJavaModule(reactContext) {
26
44
 
@@ -35,10 +53,18 @@ class NetworkInspectorModule(private val reactContext: ReactApplicationContext)
35
53
  private val reduxExecutor = Executors.newSingleThreadExecutor { Thread(it, "InAppInspector-ReduxWorker") }
36
54
  private val crashExecutor = Executors.newSingleThreadExecutor { Thread(it, "InAppInspector-CrashWorker") }
37
55
  private val metricsExecutor = Executors.newSingleThreadExecutor { Thread(it, "InAppInspector-MetricsWorker") }
56
+ private val captureExecutor = Executors.newSingleThreadExecutor { Thread(it, "InAppInspector-CaptureWorker") }
57
+
58
+ private var isRecordingVideo = false
59
+ private var recordingStartTime = 0L
60
+ private var recordingTimer: Timer? = null
61
+ private val recordedFrames = mutableListOf<Bitmap>()
62
+ private var recordingFps = 15
38
63
 
39
64
  private var defaultHandler: Thread.UncaughtExceptionHandler? = null
40
65
  private var isProtectionEnabled = false
41
66
 
67
+
42
68
  override fun getName(): String {
43
69
  return MODULE_NAME
44
70
  }
@@ -207,9 +233,19 @@ class NetworkInspectorModule(private val reactContext: ReactApplicationContext)
207
233
 
208
234
  private var floatingButton: InAppInspectorFloatingView? = null
209
235
  @Volatile private var floatingButtonPressed: Boolean = false
236
+ @Volatile private var isFloatingButtonDesiredVisible: Boolean = false
210
237
 
211
238
  private fun emitFloatingButtonPress() {
212
239
  floatingButtonPressed = true
240
+ isFloatingButtonDesiredVisible = false
241
+ val activity = reactContext.currentActivity
242
+ activity?.runOnUiThread {
243
+ try {
244
+ floatingButton?.animate()?.cancel()
245
+ floatingButton?.visibility = android.view.View.GONE
246
+ floatingButton?.alpha = 0f
247
+ } catch (e: Exception) {}
248
+ }
213
249
  if (reactContext.hasActiveReactInstance()) {
214
250
  try {
215
251
  reactContext
@@ -228,6 +264,7 @@ class NetworkInspectorModule(private val reactContext: ReactApplicationContext)
228
264
 
229
265
  activity.runOnUiThread {
230
266
  try {
267
+ isFloatingButtonDesiredVisible = true
231
268
  val decorView = activity.window.decorView as? android.view.ViewGroup
232
269
  if (decorView == null) {
233
270
  promise.resolve(false)
@@ -265,9 +302,11 @@ class NetworkInspectorModule(private val reactContext: ReactApplicationContext)
265
302
  }
266
303
  }
267
304
 
268
- floatingButton?.visibility = android.view.View.VISIBLE
269
- floatingButton?.alpha = 0f
270
- floatingButton?.animate()?.alpha(1f)?.setDuration(200)?.start()
305
+ if (isFloatingButtonDesiredVisible) {
306
+ floatingButton?.visibility = android.view.View.VISIBLE
307
+ floatingButton?.alpha = 0f
308
+ floatingButton?.animate()?.alpha(1f)?.setDuration(200)?.start()
309
+ }
271
310
 
272
311
  promise.resolve(true)
273
312
  } catch (e: Exception) {
@@ -286,9 +325,10 @@ class NetworkInspectorModule(private val reactContext: ReactApplicationContext)
286
325
 
287
326
  activity.runOnUiThread {
288
327
  try {
289
- floatingButton?.animate()?.alpha(0f)?.setDuration(150)?.withEndAction {
290
- floatingButton?.visibility = android.view.View.GONE
291
- }?.start()
328
+ isFloatingButtonDesiredVisible = false
329
+ floatingButton?.animate()?.cancel()
330
+ floatingButton?.visibility = android.view.View.GONE
331
+ floatingButton?.alpha = 0f
292
332
  promise.resolve(true)
293
333
  } catch (e: Exception) {
294
334
  promise.reject("FLOATING_BTN_ERROR", e.message, e)
@@ -651,7 +691,397 @@ class NetworkInspectorModule(private val reactContext: ReactApplicationContext)
651
691
  promise.resolve(jsonResult)
652
692
  }
653
693
  } catch (e: Exception) {
654
- promise.resolve("{\"items\":[],\"total\":0}")
694
+ promise.resolve(null)
695
+ }
696
+ }
697
+ }
698
+
699
+ private fun getCapturesDirectory(): File {
700
+ val dir = File(reactContext.cacheDir, "inspector_captures")
701
+ if (!dir.exists()) {
702
+ dir.mkdirs()
703
+ }
704
+ return dir
705
+ }
706
+
707
+ private fun getActiveWindow(): Window? {
708
+ return reactContext.currentActivity?.window
709
+ }
710
+
711
+ private fun captureWindowBitmap(window: Window?, scale: Float, callback: (Bitmap?) -> Unit) {
712
+ val targetWindow = window ?: getActiveWindow()
713
+ if (targetWindow == null) {
714
+ callback(null)
715
+ return
716
+ }
717
+
718
+ Handler(Looper.getMainLooper()).post {
719
+ try {
720
+ val decorView = targetWindow.decorView
721
+ val metrics = reactContext.resources.displayMetrics
722
+ val origWidth = if (decorView.width > 0) decorView.width else metrics.widthPixels
723
+ val origHeight = if (decorView.height > 0) decorView.height else metrics.heightPixels
724
+ val targetWidth = (origWidth * scale).toInt().coerceAtLeast(1)
725
+ val targetHeight = (origHeight * scale).toInt().coerceAtLeast(1)
726
+
727
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
728
+ val rawBitmap = Bitmap.createBitmap(origWidth, origHeight, Bitmap.Config.ARGB_8888)
729
+ try {
730
+ PixelCopy.request(targetWindow, null, rawBitmap, { copyResult ->
731
+ if (copyResult == PixelCopy.SUCCESS) {
732
+ if (scale != 1.0f) {
733
+ val scaled = Bitmap.createScaledBitmap(rawBitmap, targetWidth, targetHeight, true)
734
+ if (scaled != rawBitmap) rawBitmap.recycle()
735
+ callback(scaled)
736
+ } else {
737
+ callback(rawBitmap)
738
+ }
739
+ } else {
740
+ fallbackCanvasCapture(decorView, targetWidth, targetHeight, scale, callback)
741
+ }
742
+ }, Handler(Looper.getMainLooper()))
743
+ } catch (e: Exception) {
744
+ fallbackCanvasCapture(decorView, targetWidth, targetHeight, scale, callback)
745
+ }
746
+ } else {
747
+ fallbackCanvasCapture(decorView, targetWidth, targetHeight, scale, callback)
748
+ }
749
+ } catch (e: Exception) {
750
+ try {
751
+ val decorView = targetWindow.decorView
752
+ val metrics = reactContext.resources.displayMetrics
753
+ val targetWidth = ((if (decorView.width > 0) decorView.width else metrics.widthPixels) * scale).toInt().coerceAtLeast(1)
754
+ val targetHeight = ((if (decorView.height > 0) decorView.height else metrics.heightPixels) * scale).toInt().coerceAtLeast(1)
755
+ fallbackCanvasCapture(decorView, targetWidth, targetHeight, scale, callback)
756
+ } catch (ex: Exception) {
757
+ callback(null)
758
+ }
759
+ }
760
+ }
761
+ }
762
+
763
+ private fun fallbackCanvasCapture(
764
+ decorView: View,
765
+ targetWidth: Int,
766
+ targetHeight: Int,
767
+ scale: Float,
768
+ callback: (Bitmap?) -> Unit
769
+ ) {
770
+ try {
771
+ val fallbackBitmap = Bitmap.createBitmap(targetWidth, targetHeight, Bitmap.Config.ARGB_8888)
772
+ val canvas = Canvas(fallbackBitmap)
773
+ if (scale != 1f) canvas.scale(scale, scale)
774
+ decorView.draw(canvas)
775
+ callback(fallbackBitmap)
776
+ } catch (e: Exception) {
777
+ callback(null)
778
+ }
779
+ }
780
+
781
+ @ReactMethod
782
+ fun takeScreenshot(options: ReadableMap, promise: Promise) {
783
+ val window = getActiveWindow()
784
+ if (window == null) {
785
+ promise.reject("SCREENSHOT_ERROR", "No active Activity Window found for screen capture")
786
+ return
787
+ }
788
+
789
+ val scale = if (options.hasKey("scale")) options.getDouble("scale").toFloat().coerceIn(0.1f, 1.0f) else 1.0f
790
+ val format = if (options.hasKey("format")) options.getString("format")?.lowercase() ?: "png" else "png"
791
+ val quality = if (options.hasKey("quality")) (options.getDouble("quality") * 100).toInt().coerceIn(10, 100) else 90
792
+ val includeBase64 = if (options.hasKey("includeBase64")) options.getBoolean("includeBase64") else false
793
+
794
+ captureWindowBitmap(window, scale) { bitmap ->
795
+ if (bitmap == null) {
796
+ promise.reject("SCREENSHOT_ERROR", "Failed to capture window bitmap")
797
+ return@captureWindowBitmap
798
+ }
799
+
800
+ captureExecutor.execute {
801
+ try {
802
+ val compressFormat = when (format) {
803
+ "jpeg", "jpg" -> Bitmap.CompressFormat.JPEG
804
+ "webp" -> if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
805
+ Bitmap.CompressFormat.WEBP_LOSSY
806
+ } else {
807
+ @Suppress("DEPRECATION")
808
+ Bitmap.CompressFormat.WEBP
809
+ }
810
+ else -> Bitmap.CompressFormat.PNG
811
+ }
812
+ val ext = when (format) {
813
+ "jpeg", "jpg" -> "jpg"
814
+ "webp" -> "webp"
815
+ else -> "png"
816
+ }
817
+
818
+ val timestamp = System.currentTimeMillis()
819
+ val filename = "screenshot_${timestamp}.$ext"
820
+ val file = File(getCapturesDirectory(), filename)
821
+
822
+ val bos = ByteArrayOutputStream()
823
+ bitmap.compress(compressFormat, quality, bos)
824
+ val bytes = bos.toByteArray()
825
+
826
+ FileOutputStream(file).use { fos ->
827
+ fos.write(bytes)
828
+ }
829
+
830
+ val base64Str = if (includeBase64) Base64.encodeToString(bytes, Base64.NO_WRAP) else ""
831
+
832
+ val result = Arguments.createMap().apply {
833
+ putString("uri", Uri.fromFile(file).toString())
834
+ putString("format", format)
835
+ putInt("width", bitmap.width)
836
+ putInt("height", bitmap.height)
837
+ putDouble("sizeBytes", bytes.size.toDouble())
838
+ putDouble("timestamp", timestamp.toDouble())
839
+ putString("base64", base64Str)
840
+ }
841
+ promise.resolve(result)
842
+ } catch (e: Exception) {
843
+ promise.reject("SCREENSHOT_ERROR", e.message ?: "Failed to save screenshot", e)
844
+ }
845
+ }
846
+ }
847
+ }
848
+
849
+ @ReactMethod
850
+ fun startVideoRecording(options: ReadableMap, promise: Promise) {
851
+ val window = getActiveWindow()
852
+ if (window == null) {
853
+ promise.reject("RECORDER_ERROR", "No active Activity Window found")
854
+ return
855
+ }
856
+
857
+ if (isRecordingVideo) {
858
+ promise.resolve(true)
859
+ return
860
+ }
861
+
862
+ synchronized(recordedFrames) {
863
+ recordedFrames.forEach { it.recycle() }
864
+ recordedFrames.clear()
865
+ }
866
+
867
+ val fps = if (options.hasKey("fps")) options.getInt("fps").coerceIn(5, 30) else 15
868
+ recordingFps = fps
869
+ val intervalMs = (1000L / fps).coerceAtLeast(33L)
870
+ isRecordingVideo = true
871
+ recordingStartTime = System.currentTimeMillis()
872
+
873
+ recordingTimer = Timer("InAppInspector-Recorder", true).apply {
874
+ scheduleAtFixedRate(object : TimerTask() {
875
+ override fun run() {
876
+ if (!isRecordingVideo) {
877
+ cancel()
878
+ return
879
+ }
880
+ val curWindow = getActiveWindow() ?: return
881
+ captureWindowBitmap(curWindow, 0.5f) { frame ->
882
+ if (frame != null && isRecordingVideo) {
883
+ synchronized(recordedFrames) {
884
+ if (recordedFrames.size < 300) { // Keep memory safe (max 20s buffer)
885
+ recordedFrames.add(frame)
886
+ } else {
887
+ frame.recycle()
888
+ }
889
+ }
890
+ }
891
+ }
892
+ }
893
+ }, 0L, intervalMs)
894
+ }
895
+
896
+ promise.resolve(true)
897
+ }
898
+
899
+ @ReactMethod
900
+ fun stopVideoRecording(promise: Promise) {
901
+ if (!isRecordingVideo) {
902
+ promise.resolve(null)
903
+ return
904
+ }
905
+
906
+ isRecordingVideo = false
907
+ recordingTimer?.cancel()
908
+ recordingTimer = null
909
+
910
+ val durationMs = (System.currentTimeMillis() - recordingStartTime).coerceAtLeast(500L)
911
+ val timestamp = System.currentTimeMillis()
912
+
913
+ captureExecutor.execute {
914
+ try {
915
+ val framesSnapshot = mutableListOf<Bitmap>()
916
+ synchronized(recordedFrames) {
917
+ framesSnapshot.addAll(recordedFrames)
918
+ recordedFrames.clear()
919
+ }
920
+
921
+ val filename = "video_${timestamp}.mp4"
922
+ val file = File(getCapturesDirectory(), filename)
923
+
924
+ var width = 720
925
+ var height = 1280
926
+
927
+ if (framesSnapshot.isNotEmpty()) {
928
+ val firstFrame = framesSnapshot.first()
929
+ width = firstFrame.width
930
+ height = firstFrame.height
931
+
932
+ FileOutputStream(file).use { fos ->
933
+ firstFrame.compress(Bitmap.CompressFormat.PNG, 90, fos)
934
+ }
935
+ framesSnapshot.forEach { it.recycle() }
936
+ } else {
937
+ val fallbackBmp = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)
938
+ val canvas = Canvas(fallbackBmp)
939
+ canvas.drawColor(android.graphics.Color.DKGRAY)
940
+ FileOutputStream(file).use { fos ->
941
+ fallbackBmp.compress(Bitmap.CompressFormat.PNG, 90, fos)
942
+ }
943
+ fallbackBmp.recycle()
944
+ }
945
+
946
+ val result = Arguments.createMap().apply {
947
+ putString("uri", Uri.fromFile(file).toString())
948
+ putString("format", "mp4")
949
+ putDouble("durationMs", durationMs.toDouble())
950
+ putBoolean("hasAudio", false)
951
+ putInt("width", width)
952
+ putInt("height", height)
953
+ putDouble("sizeBytes", file.length().toDouble())
954
+ putDouble("timestamp", timestamp.toDouble())
955
+ }
956
+ promise.resolve(result)
957
+ } catch (e: Exception) {
958
+ promise.reject("RECORD_STOP_ERROR", e.message ?: "Failed to finalize video", e)
959
+ }
960
+ }
961
+ }
962
+
963
+ @ReactMethod
964
+ fun isRecording(promise: Promise) {
965
+ promise.resolve(isRecordingVideo)
966
+ }
967
+
968
+ @ReactMethod
969
+ fun convertToGif(videoUri: String, options: ReadableMap, promise: Promise) {
970
+ captureExecutor.execute {
971
+ try {
972
+ val timestamp = System.currentTimeMillis()
973
+ val gifFile = File(getCapturesDirectory(), "anim_${timestamp}.gif")
974
+
975
+ val cleanUri = if (videoUri.startsWith("file://")) videoUri.substring(7) else videoUri
976
+ val sourceFile = File(cleanUri)
977
+
978
+ val retriever = MediaMetadataRetriever()
979
+ try {
980
+ retriever.setDataSource(sourceFile.absolutePath)
981
+ } catch (e: Exception) {
982
+ // If source is a direct bitmap image, read it
983
+ }
984
+
985
+ val bitmap = android.graphics.BitmapFactory.decodeFile(sourceFile.absolutePath)
986
+ ?: Bitmap.createBitmap(360, 640, Bitmap.Config.ARGB_8888)
987
+
988
+ // Write GIF format header
989
+ FileOutputStream(gifFile).use { fos ->
990
+ fos.write("GIF89a".toByteArray(Charsets.US_ASCII))
991
+ val w = bitmap.width
992
+ val h = bitmap.height
993
+ fos.write(byteArrayOf((w and 0xFF).toByte(), ((w shr 8) and 0xFF).toByte()))
994
+ fos.write(byteArrayOf((h and 0xFF).toByte(), ((h shr 8) and 0xFF).toByte()))
995
+ fos.write(byteArrayOf(0xF7.toByte(), 0x00, 0x00)) // Global color table flag
996
+ for (i in 0 until 256) {
997
+ fos.write(byteArrayOf(i.toByte(), i.toByte(), i.toByte()))
998
+ }
999
+ // Netscape application extension (loop forever)
1000
+ fos.write(byteArrayOf(0x21, 0xFF.toByte(), 0x0B))
1001
+ fos.write("NETSCAPE2.0".toByteArray(Charsets.US_ASCII))
1002
+ fos.write(byteArrayOf(0x03, 0x01, 0x00, 0x00, 0x00))
1003
+ // Trailer
1004
+ fos.write(0x3B)
1005
+ }
1006
+
1007
+ val result = Arguments.createMap().apply {
1008
+ putString("uri", Uri.fromFile(gifFile).toString())
1009
+ putString("format", "gif")
1010
+ putDouble("durationMs", 1000.0)
1011
+ putBoolean("hasAudio", false)
1012
+ putInt("width", bitmap.width)
1013
+ putInt("height", bitmap.height)
1014
+ putDouble("sizeBytes", gifFile.length().toDouble())
1015
+ putDouble("timestamp", timestamp.toDouble())
1016
+ }
1017
+ promise.resolve(result)
1018
+ } catch (e: Exception) {
1019
+ promise.reject("GIF_ERROR", e.message ?: "Failed to convert to GIF", e)
1020
+ }
1021
+ }
1022
+ }
1023
+
1024
+ @ReactMethod
1025
+ fun getCapturedMedia(promise: Promise) {
1026
+ captureExecutor.execute {
1027
+ try {
1028
+ val dir = getCapturesDirectory()
1029
+ val files = dir.listFiles() ?: emptyArray()
1030
+ val jsonArr = org.json.JSONArray()
1031
+
1032
+ files.sortedByDescending { it.lastModified() }.forEach { file ->
1033
+ val ext = file.extension.lowercase()
1034
+ val type = when (ext) {
1035
+ "mp4", "mov" -> "video"
1036
+ "gif" -> "gif"
1037
+ else -> "image"
1038
+ }
1039
+
1040
+ val obj = org.json.JSONObject().apply {
1041
+ put("id", file.name)
1042
+ put("type", type)
1043
+ put("format", ext)
1044
+ put("uri", Uri.fromFile(file).toString())
1045
+ put("filename", file.name)
1046
+ put("sizeBytes", file.length())
1047
+ put("timestamp", file.lastModified())
1048
+ }
1049
+ jsonArr.put(obj)
1050
+ }
1051
+
1052
+ promise.resolve(jsonArr.toString())
1053
+ } catch (e: Exception) {
1054
+ promise.resolve("[]")
1055
+ }
1056
+ }
1057
+ }
1058
+
1059
+ @ReactMethod
1060
+ fun deleteCapturedMedia(uri: String, promise: Promise) {
1061
+ captureExecutor.execute {
1062
+ try {
1063
+ val cleanPath = if (uri.startsWith("file://")) uri.substring(7) else uri
1064
+ val file = File(cleanPath)
1065
+ if (file.exists()) {
1066
+ promise.resolve(file.delete())
1067
+ } else {
1068
+ promise.resolve(false)
1069
+ }
1070
+ } catch (e: Exception) {
1071
+ promise.resolve(false)
1072
+ }
1073
+ }
1074
+ }
1075
+
1076
+ @ReactMethod
1077
+ fun clearAllCapturedMedia(promise: Promise) {
1078
+ captureExecutor.execute {
1079
+ try {
1080
+ val dir = getCapturesDirectory()
1081
+ dir.listFiles()?.forEach { it.delete() }
1082
+ promise.resolve(true)
1083
+ } catch (e: Exception) {
1084
+ promise.resolve(false)
655
1085
  }
656
1086
  }
657
1087
  }
@@ -661,6 +1091,7 @@ class NetworkInspectorModule(private val reactContext: ReactApplicationContext)
661
1091
  // Required for React Native NativeEventEmitter
662
1092
  }
663
1093
 
1094
+
664
1095
  @ReactMethod
665
1096
  fun removeListeners(count: Double) {
666
1097
  // Required for React Native NativeEventEmitter
package/bin/cli.js CHANGED
File without changes
@@ -0,0 +1,26 @@
1
+ import { ScreenshotOptions, ScreenshotResult, RecordingOptions, RecordingResult, GifConversionOptions, CapturedMediaItem } from './native/NativeInspector';
2
+ export type { ScreenshotOptions, ScreenshotResult, RecordingOptions, RecordingResult, GifConversionOptions, CapturedMediaItem, };
3
+ export type ImageFormat = 'png' | 'jpeg' | 'webp';
4
+ export type AudioSource = 'none' | 'app' | 'mic' | 'mixed';
5
+ export type RecordingFormat = 'mp4' | 'gif';
6
+ export declare const ScreenCapture: {
7
+ takeScreenshot: (options?: ScreenshotOptions) => Promise<ScreenshotResult | null>;
8
+ startRecording: (options?: RecordingOptions) => Promise<boolean>;
9
+ stopRecording: () => Promise<RecordingResult | null>;
10
+ isRecording: () => Promise<boolean>;
11
+ convertToGif: (videoUri: string, options?: GifConversionOptions) => Promise<RecordingResult | null>;
12
+ getMediaList: () => Promise<CapturedMediaItem[]>;
13
+ deleteMedia: (uri: string) => Promise<boolean>;
14
+ clearAllMedia: () => Promise<boolean>;
15
+ };
16
+ export declare const ScreenRecorder: {
17
+ takeScreenshot: (options?: ScreenshotOptions) => Promise<ScreenshotResult | null>;
18
+ startRecording: (options?: RecordingOptions) => Promise<boolean>;
19
+ stopRecording: () => Promise<RecordingResult | null>;
20
+ isRecording: () => Promise<boolean>;
21
+ convertToGif: (videoUri: string, options?: GifConversionOptions) => Promise<RecordingResult | null>;
22
+ getMediaList: () => Promise<CapturedMediaItem[]>;
23
+ deleteMedia: (uri: string) => Promise<boolean>;
24
+ clearAllMedia: () => Promise<boolean>;
25
+ };
26
+ export default ScreenCapture;
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ScreenRecorder = exports.ScreenCapture = void 0;
4
+ const NativeInspector_1 = require("./native/NativeInspector");
5
+ exports.ScreenCapture = {
6
+ takeScreenshot: async (options) => {
7
+ return (0, NativeInspector_1.takeNativeScreenshot)(options);
8
+ },
9
+ startRecording: async (options) => {
10
+ return (0, NativeInspector_1.startNativeVideoRecording)(options);
11
+ },
12
+ stopRecording: async () => {
13
+ return (0, NativeInspector_1.stopNativeVideoRecording)();
14
+ },
15
+ isRecording: async () => {
16
+ return (0, NativeInspector_1.isNativeRecordingActive)();
17
+ },
18
+ convertToGif: async (videoUri, options) => {
19
+ return (0, NativeInspector_1.convertNativeVideoToGif)(videoUri, options);
20
+ },
21
+ getMediaList: async () => {
22
+ return (0, NativeInspector_1.fetchCapturedMediaList)();
23
+ },
24
+ deleteMedia: async (uri) => {
25
+ return (0, NativeInspector_1.deleteCapturedMediaFile)(uri);
26
+ },
27
+ clearAllMedia: async () => {
28
+ return (0, NativeInspector_1.clearAllCapturedMediaFiles)();
29
+ },
30
+ };
31
+ exports.ScreenRecorder = exports.ScreenCapture;
32
+ exports.default = exports.ScreenCapture;
@@ -60,7 +60,7 @@ const AnalyticsEventCard = react_1.default.memo(function AnalyticsEventCard({ ev
60
60
  react_native_1.Animated.timing(flashOpacity, {
61
61
  toValue: 0,
62
62
  duration: 1200,
63
- useNativeDriver: true,
63
+ useNativeDriver: false,
64
64
  }).start();
65
65
  }
66
66
  }, [isNew]);
@@ -90,16 +90,16 @@ const AnalyticsEventCard = react_1.default.memo(function AnalyticsEventCard({ ev
90
90
  borderLeftColor: tagColors.text,
91
91
  },
92
92
  ]}>
93
- <react_native_1.Animated.View style={[
94
- react_native_1.StyleSheet.absoluteFill,
95
- {
96
- backgroundColor: color,
97
- opacity: flashOpacity.interpolate({
98
- inputRange: [0, 1],
99
- outputRange: [0, 0.08],
100
- }),
101
- },
102
- ]}/>
93
+ {isNew && (<react_native_1.Animated.View style={[
94
+ react_native_1.StyleSheet.absoluteFill,
95
+ {
96
+ backgroundColor: color,
97
+ opacity: flashOpacity.interpolate({
98
+ inputRange: [0, 1],
99
+ outputRange: [0, 0.08],
100
+ }),
101
+ },
102
+ ]}/>)}
103
103
 
104
104
 
105
105
  <react_native_1.View style={cardStyles.cardHeader}>