@amazon-devices/react-native-screens 2.0.1758683737

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/LICENSE +7 -0
  2. package/README.md +223 -0
  3. package/RNScreens.podspec +53 -0
  4. package/SystemBundles/8f5a820b958535e533acb38dbc0c72c1837721b9db075f4a1740e42b9fee3910.bundle +33668 -0
  5. package/SystemBundles/8f5a820b958535e533acb38dbc0c72c1837721b9db075f4a1740e42b9fee3910.map +1 -0
  6. package/SystemModules/amzn__react-native-screens.modules.txt +101 -0
  7. package/SystemModules/amzn__react-native-screens.private.modules.txt +244 -0
  8. package/SystemModules/keplerscript-system-bundle-config.json +7 -0
  9. package/THIRD_PARTY_NOTICES.txt +707 -0
  10. package/android/build.gradle +133 -0
  11. package/android/src/fabric/java/com/swmansion/rnscreens/FabricEnabledViewGroup.kt +49 -0
  12. package/android/src/main/AndroidManifest.xml +5 -0
  13. package/android/src/main/java/com/swmansion/rnscreens/CustomSearchView.kt +77 -0
  14. package/android/src/main/java/com/swmansion/rnscreens/CustomToolbar.kt +7 -0
  15. package/android/src/main/java/com/swmansion/rnscreens/FragmentBackPressOverrider.kt +29 -0
  16. package/android/src/main/java/com/swmansion/rnscreens/FragmentHolder.kt +7 -0
  17. package/android/src/main/java/com/swmansion/rnscreens/RNScreensPackage.kt +21 -0
  18. package/android/src/main/java/com/swmansion/rnscreens/Screen.kt +289 -0
  19. package/android/src/main/java/com/swmansion/rnscreens/ScreenContainer.kt +372 -0
  20. package/android/src/main/java/com/swmansion/rnscreens/ScreenContainerViewManager.kt +40 -0
  21. package/android/src/main/java/com/swmansion/rnscreens/ScreenEventDispatcher.kt +21 -0
  22. package/android/src/main/java/com/swmansion/rnscreens/ScreenFragment.kt +331 -0
  23. package/android/src/main/java/com/swmansion/rnscreens/ScreenFragmentWrapper.kt +22 -0
  24. package/android/src/main/java/com/swmansion/rnscreens/ScreenStack.kt +336 -0
  25. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackFragment.kt +282 -0
  26. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackFragmentWrapper.kt +15 -0
  27. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfig.kt +398 -0
  28. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfigViewManager.kt +204 -0
  29. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderSubview.kt +38 -0
  30. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderSubviewManager.kt +41 -0
  31. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackViewManager.kt +75 -0
  32. package/android/src/main/java/com/swmansion/rnscreens/ScreenViewManager.kt +186 -0
  33. package/android/src/main/java/com/swmansion/rnscreens/ScreenWindowTraits.kt +296 -0
  34. package/android/src/main/java/com/swmansion/rnscreens/ScreensShadowNode.kt +19 -0
  35. package/android/src/main/java/com/swmansion/rnscreens/SearchBarManager.kt +133 -0
  36. package/android/src/main/java/com/swmansion/rnscreens/SearchBarView.kt +178 -0
  37. package/android/src/main/java/com/swmansion/rnscreens/SearchViewFormatter.kt +67 -0
  38. package/android/src/main/java/com/swmansion/rnscreens/events/HeaderAttachedEvent.kt +22 -0
  39. package/android/src/main/java/com/swmansion/rnscreens/events/HeaderBackButtonClickedEvent.kt +22 -0
  40. package/android/src/main/java/com/swmansion/rnscreens/events/HeaderDetachedEvent.kt +22 -0
  41. package/android/src/main/java/com/swmansion/rnscreens/events/HeaderHeightChangeEvent.kt +26 -0
  42. package/android/src/main/java/com/swmansion/rnscreens/events/ScreenAppearEvent.kt +18 -0
  43. package/android/src/main/java/com/swmansion/rnscreens/events/ScreenDisappearEvent.kt +18 -0
  44. package/android/src/main/java/com/swmansion/rnscreens/events/ScreenDismissedEvent.kt +20 -0
  45. package/android/src/main/java/com/swmansion/rnscreens/events/ScreenTransitionProgressEvent.kt +32 -0
  46. package/android/src/main/java/com/swmansion/rnscreens/events/ScreenWillAppearEvent.kt +18 -0
  47. package/android/src/main/java/com/swmansion/rnscreens/events/ScreenWillDisappearEvent.kt +18 -0
  48. package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarBlurEvent.kt +22 -0
  49. package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarChangeTextEvent.kt +28 -0
  50. package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarCloseEvent.kt +22 -0
  51. package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarFocusEvent.kt +22 -0
  52. package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarOpenEvent.kt +22 -0
  53. package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarSearchButtonPressEvent.kt +24 -0
  54. package/android/src/main/java/com/swmansion/rnscreens/events/StackFinishTransitioningEvent.kt +18 -0
  55. package/android/src/main/java/com/swmansion/rnscreens/utils/DeviceUtils.kt +12 -0
  56. package/android/src/main/jni/CMakeLists.txt +72 -0
  57. package/android/src/main/jni/rnscreens.cpp +16 -0
  58. package/android/src/main/jni/rnscreens.h +28 -0
  59. package/android/src/main/res/base/anim/rns_default_enter_in.xml +18 -0
  60. package/android/src/main/res/base/anim/rns_default_enter_out.xml +19 -0
  61. package/android/src/main/res/base/anim/rns_default_exit_in.xml +17 -0
  62. package/android/src/main/res/base/anim/rns_default_exit_out.xml +18 -0
  63. package/android/src/main/res/base/anim/rns_fade_from_bottom.xml +14 -0
  64. package/android/src/main/res/base/anim/rns_fade_in.xml +7 -0
  65. package/android/src/main/res/base/anim/rns_fade_out.xml +7 -0
  66. package/android/src/main/res/base/anim/rns_fade_to_bottom.xml +15 -0
  67. package/android/src/main/res/base/anim/rns_no_animation_20.xml +6 -0
  68. package/android/src/main/res/base/anim/rns_no_animation_250.xml +7 -0
  69. package/android/src/main/res/base/anim/rns_no_animation_350.xml +6 -0
  70. package/android/src/main/res/base/anim/rns_no_animation_medium.xml +7 -0
  71. package/android/src/main/res/base/anim/rns_slide_in_from_bottom.xml +7 -0
  72. package/android/src/main/res/base/anim/rns_slide_in_from_left.xml +5 -0
  73. package/android/src/main/res/base/anim/rns_slide_in_from_right.xml +5 -0
  74. package/android/src/main/res/base/anim/rns_slide_out_to_bottom.xml +7 -0
  75. package/android/src/main/res/base/anim/rns_slide_out_to_left.xml +5 -0
  76. package/android/src/main/res/base/anim/rns_slide_out_to_right.xml +5 -0
  77. package/android/src/main/res/base/anim/rns_standard_accelerate_interpolator.xml +6 -0
  78. package/android/src/main/res/v33/anim-v33/rns_default_enter_in.xml +38 -0
  79. package/android/src/main/res/v33/anim-v33/rns_default_enter_out.xml +38 -0
  80. package/android/src/main/res/v33/anim-v33/rns_default_exit_in.xml +38 -0
  81. package/android/src/main/res/v33/anim-v33/rns_default_exit_out.xml +38 -0
  82. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenManagerDelegate.java +111 -0
  83. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenManagerInterface.java +44 -0
  84. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderConfigManagerDelegate.java +107 -0
  85. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderConfigManagerInterface.java +42 -0
  86. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderSubviewManagerDelegate.java +31 -0
  87. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderSubviewManagerInterface.java +17 -0
  88. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackManagerDelegate.java +25 -0
  89. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackManagerInterface.java +16 -0
  90. package/android/src/paper/java/com/swmansion/rnscreens/FabricEnabledViewGroup.kt +10 -0
  91. package/common/cpp/react/renderer/components/rnscreens/RNSScreenComponentDescriptor.h +41 -0
  92. package/common/cpp/react/renderer/components/rnscreens/RNSScreenShadowNode.cpp +9 -0
  93. package/common/cpp/react/renderer/components/rnscreens/RNSScreenShadowNode.h +30 -0
  94. package/common/cpp/react/renderer/components/rnscreens/RNSScreenState.cpp +14 -0
  95. package/common/cpp/react/renderer/components/rnscreens/RNSScreenState.h +45 -0
  96. package/ios/RCTImageComponentView+RNSScreenStackHeaderConfig.h +11 -0
  97. package/ios/RCTImageComponentView+RNSScreenStackHeaderConfig.mm +14 -0
  98. package/ios/RNSConvert.h +36 -0
  99. package/ios/RNSConvert.mm +154 -0
  100. package/ios/RNSEnums.h +71 -0
  101. package/ios/RNSFullWindowOverlay.h +34 -0
  102. package/ios/RNSFullWindowOverlay.mm +241 -0
  103. package/ios/RNSScreen.h +144 -0
  104. package/ios/RNSScreen.mm +1599 -0
  105. package/ios/RNSScreenContainer.h +45 -0
  106. package/ios/RNSScreenContainer.mm +343 -0
  107. package/ios/RNSScreenNavigationContainer.h +16 -0
  108. package/ios/RNSScreenNavigationContainer.mm +66 -0
  109. package/ios/RNSScreenStack.h +37 -0
  110. package/ios/RNSScreenStack.mm +1111 -0
  111. package/ios/RNSScreenStackAnimator.h +8 -0
  112. package/ios/RNSScreenStackAnimator.mm +320 -0
  113. package/ios/RNSScreenStackHeaderConfig.h +74 -0
  114. package/ios/RNSScreenStackHeaderConfig.mm +967 -0
  115. package/ios/RNSScreenStackHeaderSubview.h +44 -0
  116. package/ios/RNSScreenStackHeaderSubview.mm +147 -0
  117. package/ios/RNSScreenWindowTraits.h +26 -0
  118. package/ios/RNSScreenWindowTraits.mm +266 -0
  119. package/ios/RNSSearchBar.h +43 -0
  120. package/ios/RNSSearchBar.mm +465 -0
  121. package/ios/RNScreens.xcodeproj/project.pbxproj +461 -0
  122. package/ios/UIViewController+RNScreens.h +9 -0
  123. package/ios/UIViewController+RNScreens.mm +78 -0
  124. package/ios/UIWindow+RNScreens.h +9 -0
  125. package/ios/UIWindow+RNScreens.mm +17 -0
  126. package/ios/events/RNSHeaderHeightChangeEvent.h +8 -0
  127. package/ios/events/RNSHeaderHeightChangeEvent.mm +44 -0
  128. package/ios/events/RNSScreenViewEvent.h +12 -0
  129. package/ios/events/RNSScreenViewEvent.mm +59 -0
  130. package/ios/utils/RNSUIBarButtonItem.h +5 -0
  131. package/ios/utils/RNSUIBarButtonItem.mm +22 -0
  132. package/kepler-compatibility.json +8 -0
  133. package/kepler-transformed-package-info.json +3 -0
  134. package/lib/commonjs/TransitionProgressContext.js +11 -0
  135. package/lib/commonjs/TransitionProgressContext.js.map +1 -0
  136. package/lib/commonjs/fabric/FullWindowOverlayNativeComponent.js +11 -0
  137. package/lib/commonjs/fabric/FullWindowOverlayNativeComponent.js.map +1 -0
  138. package/lib/commonjs/fabric/ScreenContainerNativeComponent.js +33 -0
  139. package/lib/commonjs/fabric/ScreenContainerNativeComponent.js.map +1 -0
  140. package/lib/commonjs/fabric/ScreenNativeComponent.js +70 -0
  141. package/lib/commonjs/fabric/ScreenNativeComponent.js.map +1 -0
  142. package/lib/commonjs/fabric/ScreenNavigationContainerNativeComponent.js +11 -0
  143. package/lib/commonjs/fabric/ScreenNavigationContainerNativeComponent.js.map +1 -0
  144. package/lib/commonjs/fabric/ScreenStackHeaderConfigNativeComponent.js +31 -0
  145. package/lib/commonjs/fabric/ScreenStackHeaderConfigNativeComponent.js.map +1 -0
  146. package/lib/commonjs/fabric/ScreenStackHeaderSubviewNativeComponent.js +12 -0
  147. package/lib/commonjs/fabric/ScreenStackHeaderSubviewNativeComponent.js.map +1 -0
  148. package/lib/commonjs/fabric/ScreenStackNativeComponent.js +35 -0
  149. package/lib/commonjs/fabric/ScreenStackNativeComponent.js.map +1 -0
  150. package/lib/commonjs/fabric/SearchBarNativeComponent.js +19 -0
  151. package/lib/commonjs/fabric/SearchBarNativeComponent.js.map +1 -0
  152. package/lib/commonjs/index.js +147 -0
  153. package/lib/commonjs/index.js.map +1 -0
  154. package/lib/commonjs/index.native.js +407 -0
  155. package/lib/commonjs/index.native.js.map +1 -0
  156. package/lib/commonjs/native-stack/index.js +49 -0
  157. package/lib/commonjs/native-stack/index.js.map +1 -0
  158. package/lib/commonjs/native-stack/navigators/createNativeStackNavigator.js +75 -0
  159. package/lib/commonjs/native-stack/navigators/createNativeStackNavigator.js.map +1 -0
  160. package/lib/commonjs/native-stack/types.js +6 -0
  161. package/lib/commonjs/native-stack/types.js.map +1 -0
  162. package/lib/commonjs/native-stack/utils/AnimatedHeaderHeightContext.js +12 -0
  163. package/lib/commonjs/native-stack/utils/AnimatedHeaderHeightContext.js.map +1 -0
  164. package/lib/commonjs/native-stack/utils/HeaderHeightContext.js +12 -0
  165. package/lib/commonjs/native-stack/utils/HeaderHeightContext.js.map +1 -0
  166. package/lib/commonjs/native-stack/utils/SafeAreaProviderCompat.js +75 -0
  167. package/lib/commonjs/native-stack/utils/SafeAreaProviderCompat.js.map +1 -0
  168. package/lib/commonjs/native-stack/utils/getDefaultHeaderHeight.js +35 -0
  169. package/lib/commonjs/native-stack/utils/getDefaultHeaderHeight.js.map +1 -0
  170. package/lib/commonjs/native-stack/utils/useAnimatedHeaderHeight.js +19 -0
  171. package/lib/commonjs/native-stack/utils/useAnimatedHeaderHeight.js.map +1 -0
  172. package/lib/commonjs/native-stack/utils/useBackPressSubscription.js +54 -0
  173. package/lib/commonjs/native-stack/utils/useBackPressSubscription.js.map +1 -0
  174. package/lib/commonjs/native-stack/utils/useHeaderHeight.js +19 -0
  175. package/lib/commonjs/native-stack/utils/useHeaderHeight.js.map +1 -0
  176. package/lib/commonjs/native-stack/views/FontProcessor.js +21 -0
  177. package/lib/commonjs/native-stack/views/FontProcessor.js.map +1 -0
  178. package/lib/commonjs/native-stack/views/HeaderConfig.js +141 -0
  179. package/lib/commonjs/native-stack/views/HeaderConfig.js.map +1 -0
  180. package/lib/commonjs/native-stack/views/NativeStackView.js +354 -0
  181. package/lib/commonjs/native-stack/views/NativeStackView.js.map +1 -0
  182. package/lib/commonjs/reanimated/ReanimatedHeaderHeightContext.js +12 -0
  183. package/lib/commonjs/reanimated/ReanimatedHeaderHeightContext.js.map +1 -0
  184. package/lib/commonjs/reanimated/ReanimatedNativeStackScreen.js +101 -0
  185. package/lib/commonjs/reanimated/ReanimatedNativeStackScreen.js.map +1 -0
  186. package/lib/commonjs/reanimated/ReanimatedScreen.js +22 -0
  187. package/lib/commonjs/reanimated/ReanimatedScreen.js.map +1 -0
  188. package/lib/commonjs/reanimated/ReanimatedScreenProvider.js +47 -0
  189. package/lib/commonjs/reanimated/ReanimatedScreenProvider.js.map +1 -0
  190. package/lib/commonjs/reanimated/ReanimatedTransitionProgressContext.js +12 -0
  191. package/lib/commonjs/reanimated/ReanimatedTransitionProgressContext.js.map +1 -0
  192. package/lib/commonjs/reanimated/index.js +28 -0
  193. package/lib/commonjs/reanimated/index.js.map +1 -0
  194. package/lib/commonjs/reanimated/useReanimatedHeaderHeight.js +19 -0
  195. package/lib/commonjs/reanimated/useReanimatedHeaderHeight.js.map +1 -0
  196. package/lib/commonjs/reanimated/useReanimatedTransitionProgress.js +19 -0
  197. package/lib/commonjs/reanimated/useReanimatedTransitionProgress.js.map +1 -0
  198. package/lib/commonjs/types.js +6 -0
  199. package/lib/commonjs/types.js.map +1 -0
  200. package/lib/commonjs/useTransitionProgress.js +19 -0
  201. package/lib/commonjs/useTransitionProgress.js.map +1 -0
  202. package/lib/commonjs/utils.js +21 -0
  203. package/lib/commonjs/utils.js.map +1 -0
  204. package/lib/module/TransitionProgressContext.js +3 -0
  205. package/lib/module/TransitionProgressContext.js.map +1 -0
  206. package/lib/module/fabric/FullWindowOverlayNativeComponent.js +4 -0
  207. package/lib/module/fabric/FullWindowOverlayNativeComponent.js.map +1 -0
  208. package/lib/module/fabric/ScreenContainerNativeComponent.js +25 -0
  209. package/lib/module/fabric/ScreenContainerNativeComponent.js.map +1 -0
  210. package/lib/module/fabric/ScreenNativeComponent.js +63 -0
  211. package/lib/module/fabric/ScreenNativeComponent.js.map +1 -0
  212. package/lib/module/fabric/ScreenNavigationContainerNativeComponent.js +4 -0
  213. package/lib/module/fabric/ScreenNavigationContainerNativeComponent.js.map +1 -0
  214. package/lib/module/fabric/ScreenStackHeaderConfigNativeComponent.js +23 -0
  215. package/lib/module/fabric/ScreenStackHeaderConfigNativeComponent.js.map +1 -0
  216. package/lib/module/fabric/ScreenStackHeaderSubviewNativeComponent.js +7 -0
  217. package/lib/module/fabric/ScreenStackHeaderSubviewNativeComponent.js.map +1 -0
  218. package/lib/module/fabric/ScreenStackNativeComponent.js +28 -0
  219. package/lib/module/fabric/ScreenStackNativeComponent.js.map +1 -0
  220. package/lib/module/fabric/SearchBarNativeComponent.js +10 -0
  221. package/lib/module/fabric/SearchBarNativeComponent.js.map +1 -0
  222. package/lib/module/index.js +67 -0
  223. package/lib/module/index.js.map +1 -0
  224. package/lib/module/index.native.js +410 -0
  225. package/lib/module/index.native.js.map +1 -0
  226. package/lib/module/native-stack/index.js +22 -0
  227. package/lib/module/native-stack/index.js.map +1 -0
  228. package/lib/module/native-stack/navigators/createNativeStackNavigator.js +72 -0
  229. package/lib/module/native-stack/navigators/createNativeStackNavigator.js.map +1 -0
  230. package/lib/module/native-stack/types.js +2 -0
  231. package/lib/module/native-stack/types.js.map +1 -0
  232. package/lib/module/native-stack/utils/AnimatedHeaderHeightContext.js +4 -0
  233. package/lib/module/native-stack/utils/AnimatedHeaderHeightContext.js.map +1 -0
  234. package/lib/module/native-stack/utils/HeaderHeightContext.js +4 -0
  235. package/lib/module/native-stack/utils/HeaderHeightContext.js.map +1 -0
  236. package/lib/module/native-stack/utils/SafeAreaProviderCompat.js +68 -0
  237. package/lib/module/native-stack/utils/SafeAreaProviderCompat.js.map +1 -0
  238. package/lib/module/native-stack/utils/getDefaultHeaderHeight.js +29 -0
  239. package/lib/module/native-stack/utils/getDefaultHeaderHeight.js.map +1 -0
  240. package/lib/module/native-stack/utils/useAnimatedHeaderHeight.js +10 -0
  241. package/lib/module/native-stack/utils/useAnimatedHeaderHeight.js.map +1 -0
  242. package/lib/module/native-stack/utils/useBackPressSubscription.js +47 -0
  243. package/lib/module/native-stack/utils/useBackPressSubscription.js.map +1 -0
  244. package/lib/module/native-stack/utils/useHeaderHeight.js +10 -0
  245. package/lib/module/native-stack/utils/useHeaderHeight.js.map +1 -0
  246. package/lib/module/native-stack/views/FontProcessor.js +13 -0
  247. package/lib/module/native-stack/views/FontProcessor.js.map +1 -0
  248. package/lib/module/native-stack/views/HeaderConfig.js +132 -0
  249. package/lib/module/native-stack/views/HeaderConfig.js.map +1 -0
  250. package/lib/module/native-stack/views/NativeStackView.js +355 -0
  251. package/lib/module/native-stack/views/NativeStackView.js.map +1 -0
  252. package/lib/module/reanimated/ReanimatedHeaderHeightContext.js +5 -0
  253. package/lib/module/reanimated/ReanimatedHeaderHeightContext.js.map +1 -0
  254. package/lib/module/reanimated/ReanimatedNativeStackScreen.js +97 -0
  255. package/lib/module/reanimated/ReanimatedNativeStackScreen.js.map +1 -0
  256. package/lib/module/reanimated/ReanimatedScreen.js +17 -0
  257. package/lib/module/reanimated/ReanimatedScreen.js.map +1 -0
  258. package/lib/module/reanimated/ReanimatedScreenProvider.js +40 -0
  259. package/lib/module/reanimated/ReanimatedScreenProvider.js.map +1 -0
  260. package/lib/module/reanimated/ReanimatedTransitionProgressContext.js +5 -0
  261. package/lib/module/reanimated/ReanimatedTransitionProgressContext.js.map +1 -0
  262. package/lib/module/reanimated/index.js +4 -0
  263. package/lib/module/reanimated/index.js.map +1 -0
  264. package/lib/module/reanimated/useReanimatedHeaderHeight.js +10 -0
  265. package/lib/module/reanimated/useReanimatedHeaderHeight.js.map +1 -0
  266. package/lib/module/reanimated/useReanimatedTransitionProgress.js +10 -0
  267. package/lib/module/reanimated/useReanimatedTransitionProgress.js.map +1 -0
  268. package/lib/module/types.js +2 -0
  269. package/lib/module/types.js.map +1 -0
  270. package/lib/module/useTransitionProgress.js +10 -0
  271. package/lib/module/useTransitionProgress.js.map +1 -0
  272. package/lib/module/utils.js +14 -0
  273. package/lib/module/utils.js.map +1 -0
  274. package/lib/typescript/TransitionProgressContext.d.ts +9 -0
  275. package/lib/typescript/fabric/FullWindowOverlayNativeComponent.d.ts +7 -0
  276. package/lib/typescript/fabric/ScreenContainerNativeComponent.d.ts +5 -0
  277. package/lib/typescript/fabric/ScreenNativeComponent.d.ts +66 -0
  278. package/lib/typescript/fabric/ScreenNavigationContainerNativeComponent.d.ts +7 -0
  279. package/lib/typescript/fabric/ScreenStackHeaderConfigNativeComponent.d.ts +33 -0
  280. package/lib/typescript/fabric/ScreenStackHeaderSubviewNativeComponent.d.ts +10 -0
  281. package/lib/typescript/fabric/ScreenStackNativeComponent.d.ts +8 -0
  282. package/lib/typescript/fabric/SearchBarNativeComponent.d.ts +49 -0
  283. package/lib/typescript/index.d.ts +33 -0
  284. package/lib/typescript/index.native.d.ts +2 -0
  285. package/lib/typescript/native-stack/index.d.ts +19 -0
  286. package/lib/typescript/native-stack/navigators/createNativeStackNavigator.d.ts +6 -0
  287. package/lib/typescript/native-stack/types.d.ts +438 -0
  288. package/lib/typescript/native-stack/utils/AnimatedHeaderHeightContext.d.ts +4 -0
  289. package/lib/typescript/native-stack/utils/HeaderHeightContext.d.ts +3 -0
  290. package/lib/typescript/native-stack/utils/SafeAreaProviderCompat.d.ts +11 -0
  291. package/lib/typescript/native-stack/utils/getDefaultHeaderHeight.d.ts +7 -0
  292. package/lib/typescript/native-stack/utils/useAnimatedHeaderHeight.d.ts +1 -0
  293. package/lib/typescript/native-stack/utils/useBackPressSubscription.d.ts +16 -0
  294. package/lib/typescript/native-stack/utils/useHeaderHeight.d.ts +1 -0
  295. package/lib/typescript/native-stack/views/FontProcessor.d.ts +1 -0
  296. package/lib/typescript/native-stack/views/HeaderConfig.d.ts +8 -0
  297. package/lib/typescript/native-stack/views/NativeStackView.d.ts +10 -0
  298. package/lib/typescript/reanimated/ReanimatedHeaderHeightContext.d.ts +4 -0
  299. package/lib/typescript/reanimated/ReanimatedNativeStackScreen.d.ts +5 -0
  300. package/lib/typescript/reanimated/ReanimatedScreen.d.ts +5 -0
  301. package/lib/typescript/reanimated/ReanimatedScreenProvider.d.ts +2 -0
  302. package/lib/typescript/reanimated/ReanimatedTransitionProgressContext.d.ts +9 -0
  303. package/lib/typescript/reanimated/index.d.ts +3 -0
  304. package/lib/typescript/reanimated/useReanimatedHeaderHeight.d.ts +3 -0
  305. package/lib/typescript/reanimated/useReanimatedTransitionProgress.d.ts +11 -0
  306. package/lib/typescript/types.d.ts +612 -0
  307. package/lib/typescript/useTransitionProgress.d.ts +5 -0
  308. package/lib/typescript/utils.d.ts +3 -0
  309. package/native-stack/README.md +814 -0
  310. package/native-stack/package.json +6 -0
  311. package/package.json +1 -0
  312. package/react-native.config.js +42 -0
  313. package/reanimated/package.json +6 -0
  314. package/src/TransitionProgressContext.tsx +12 -0
  315. package/src/fabric/FullWindowOverlayNativeComponent.ts +7 -0
  316. package/src/fabric/ScreenContainerNativeComponent.ts +28 -0
  317. package/src/fabric/ScreenNativeComponent.ts +158 -0
  318. package/src/fabric/ScreenNavigationContainerNativeComponent.ts +10 -0
  319. package/src/fabric/ScreenStackHeaderConfigNativeComponent.ts +61 -0
  320. package/src/fabric/ScreenStackHeaderSubviewNativeComponent.ts +22 -0
  321. package/src/fabric/ScreenStackNativeComponent.ts +33 -0
  322. package/src/fabric/SearchBarNativeComponent.ts +79 -0
  323. package/src/index.native.tsx +599 -0
  324. package/src/index.tsx +119 -0
  325. package/src/native-stack/index.tsx +27 -0
  326. package/src/native-stack/navigators/createNativeStackNavigator.tsx +107 -0
  327. package/src/native-stack/types.tsx +486 -0
  328. package/src/native-stack/utils/AnimatedHeaderHeightContext.tsx +8 -0
  329. package/src/native-stack/utils/HeaderHeightContext.tsx +5 -0
  330. package/src/native-stack/utils/SafeAreaProviderCompat.tsx +78 -0
  331. package/src/native-stack/utils/getDefaultHeaderHeight.tsx +41 -0
  332. package/src/native-stack/utils/useAnimatedHeaderHeight.tsx +15 -0
  333. package/src/native-stack/utils/useBackPressSubscription.tsx +66 -0
  334. package/src/native-stack/utils/useHeaderHeight.tsx +15 -0
  335. package/src/native-stack/views/FontProcessor.tsx +14 -0
  336. package/src/native-stack/views/HeaderConfig.tsx +187 -0
  337. package/src/native-stack/views/NativeStackView.tsx +466 -0
  338. package/src/reanimated/ReanimatedHeaderHeightContext.tsx +7 -0
  339. package/src/reanimated/ReanimatedNativeStackScreen.tsx +130 -0
  340. package/src/reanimated/ReanimatedScreen.tsx +25 -0
  341. package/src/reanimated/ReanimatedScreenProvider.tsx +42 -0
  342. package/src/reanimated/ReanimatedTransitionProgressContext.tsx +13 -0
  343. package/src/reanimated/index.tsx +3 -0
  344. package/src/reanimated/useReanimatedHeaderHeight.tsx +14 -0
  345. package/src/reanimated/useReanimatedTransitionProgress.tsx +14 -0
  346. package/src/types.tsx +699 -0
  347. package/src/useTransitionProgress.tsx +15 -0
  348. package/src/utils.ts +18 -0
  349. package/windows/README.md +25 -0
  350. package/windows/RNScreens/PropertySheet.props +16 -0
  351. package/windows/RNScreens/RNScreens.cpp +66 -0
  352. package/windows/RNScreens/RNScreens.def +3 -0
  353. package/windows/RNScreens/RNScreens.h +41 -0
  354. package/windows/RNScreens/RNScreens.idl +8 -0
  355. package/windows/RNScreens/RNScreens.vcxproj +187 -0
  356. package/windows/RNScreens/RNScreens.vcxproj.filters +52 -0
  357. package/windows/RNScreens/ReactPackageProvider.cpp +30 -0
  358. package/windows/RNScreens/ReactPackageProvider.h +17 -0
  359. package/windows/RNScreens/ReactPackageProvider.idl +9 -0
  360. package/windows/RNScreens/Screen.cpp +122 -0
  361. package/windows/RNScreens/Screen.h +64 -0
  362. package/windows/RNScreens/ScreenContainer.cpp +49 -0
  363. package/windows/RNScreens/ScreenContainer.h +23 -0
  364. package/windows/RNScreens/ScreenContainerViewManager.cpp +133 -0
  365. package/windows/RNScreens/ScreenContainerViewManager.h +78 -0
  366. package/windows/RNScreens/ScreenStack.cpp +65 -0
  367. package/windows/RNScreens/ScreenStack.h +23 -0
  368. package/windows/RNScreens/ScreenStackHeaderConfig.cpp +19 -0
  369. package/windows/RNScreens/ScreenStackHeaderConfig.h +14 -0
  370. package/windows/RNScreens/ScreenStackHeaderConfigViewManager.cpp +89 -0
  371. package/windows/RNScreens/ScreenStackHeaderConfigViewManager.h +62 -0
  372. package/windows/RNScreens/ScreenStackViewManager.cpp +132 -0
  373. package/windows/RNScreens/ScreenStackViewManager.h +78 -0
  374. package/windows/RNScreens/ScreenViewManager.cpp +154 -0
  375. package/windows/RNScreens/ScreenViewManager.h +78 -0
  376. package/windows/RNScreens/packages.config +4 -0
  377. package/windows/RNScreens/pch.cpp +1 -0
  378. package/windows/RNScreens/pch.h +9 -0
  379. package/windows/RNScreens62.sln +254 -0
  380. package/windows/RNScreens63.sln +225 -0
  381. package/windows/RNScreens65.sln +144 -0
@@ -0,0 +1,372 @@
1
+ package com.swmansion.rnscreens
2
+
3
+ import android.content.Context
4
+ import android.content.ContextWrapper
5
+ import android.view.View
6
+ import android.view.ViewGroup
7
+ import android.view.ViewParent
8
+ import android.view.inputmethod.InputMethodManager
9
+ import androidx.fragment.app.Fragment
10
+ import androidx.fragment.app.FragmentActivity
11
+ import androidx.fragment.app.FragmentManager
12
+ import androidx.fragment.app.FragmentTransaction
13
+ import com.facebook.react.ReactRootView
14
+ import com.facebook.react.bridge.ReactContext
15
+ import com.facebook.react.modules.core.ChoreographerCompat
16
+ import com.facebook.react.modules.core.ReactChoreographer
17
+ import com.swmansion.rnscreens.Screen.ActivityState
18
+
19
+ open class ScreenContainer(context: Context?) : ViewGroup(context) {
20
+ @JvmField
21
+ protected val mScreenFragments = ArrayList<ScreenFragmentWrapper>()
22
+ @JvmField
23
+ protected var mFragmentManager: FragmentManager? = null
24
+ private var mIsAttached = false
25
+ private var mNeedUpdate = false
26
+ private var mLayoutEnqueued = false
27
+ private val mLayoutCallback: ChoreographerCompat.FrameCallback = object : ChoreographerCompat.FrameCallback() {
28
+ override fun doFrame(frameTimeNanos: Long) {
29
+ mLayoutEnqueued = false
30
+ measure(
31
+ MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY),
32
+ MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY)
33
+ )
34
+ layout(left, top, right, bottom)
35
+ }
36
+ }
37
+ private var mParentScreenFragment: ScreenFragmentWrapper? = null
38
+
39
+ override fun onLayout(changed: Boolean, l: Int, t: Int, r: Int, b: Int) {
40
+ var i = 0
41
+ val size = childCount
42
+ while (i < size) {
43
+ getChildAt(i).layout(0, 0, width, height)
44
+ i++
45
+ }
46
+ }
47
+
48
+ override fun removeView(view: View) {
49
+ // The below block is a workaround for an issue with keyboard handling within fragments. Despite
50
+ // Android handles input focus on the fragments that leave the screen, the keyboard stays open
51
+ // in a number of cases. The issue can be best reproduced on Android 5 devices, before some
52
+ // changes in Android's InputMethodManager have been introduced (specifically around dismissing
53
+ // the keyboard in onDetachedFromWindow). However, we also noticed the keyboard issue happen
54
+ // intermittently on recent versions of Android as well. The issue hasn't been previously
55
+ // noticed as in React Native <= 0.61 there was a logic that'd trigger keyboard dismiss upon a
56
+ // blur event (the blur even gets dispatched properly, the keyboard just stays open despite
57
+ // that) – note the change in RN core here:
58
+ // https://github.com/facebook/react-native/commit/e9b4928311513d3cbbd9d875827694eab6cfa932
59
+ // The workaround is to force-hide keyboard when the screen that has focus is dismissed (we
60
+ // detect that in removeView as super.removeView causes the input view to un focus while keeping
61
+ // the keyboard open).
62
+ if (view === focusedChild) {
63
+ (context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager)
64
+ .hideSoftInputFromWindow(windowToken, InputMethodManager.HIDE_NOT_ALWAYS)
65
+ }
66
+ super.removeView(view)
67
+ }
68
+
69
+ override fun requestLayout() {
70
+ super.requestLayout()
71
+ @Suppress("SENSELESS_COMPARISON") // mLayoutCallback can be null here since this method can be called in init
72
+ if (!mLayoutEnqueued && mLayoutCallback != null) {
73
+ mLayoutEnqueued = true
74
+ // we use NATIVE_ANIMATED_MODULE choreographer queue because it allows us to catch the current
75
+ // looper loop instead of enqueueing the update in the next loop causing a one frame delay.
76
+ ReactChoreographer.getInstance()
77
+ .postFrameCallback(
78
+ ReactChoreographer.CallbackType.NATIVE_ANIMATED_MODULE, mLayoutCallback
79
+ )
80
+ }
81
+ }
82
+
83
+ val isNested: Boolean
84
+ get() = mParentScreenFragment != null
85
+
86
+ fun notifyChildUpdate() {
87
+ performUpdatesNow()
88
+ }
89
+
90
+ protected open fun adapt(screen: Screen): ScreenFragmentWrapper = ScreenFragment(screen)
91
+
92
+ fun addScreen(screen: Screen, index: Int) {
93
+ val fragment = adapt(screen)
94
+ screen.fragmentWrapper = fragment
95
+ mScreenFragments.add(index, fragment)
96
+ screen.container = this
97
+ onScreenChanged()
98
+ }
99
+
100
+ open fun removeScreenAt(index: Int) {
101
+ mScreenFragments[index].screen.container = null
102
+ mScreenFragments.removeAt(index)
103
+ onScreenChanged()
104
+ }
105
+
106
+ open fun removeAllScreens() {
107
+ for (screenFragment in mScreenFragments) {
108
+ screenFragment.screen.container = null
109
+ }
110
+ mScreenFragments.clear()
111
+ onScreenChanged()
112
+ }
113
+
114
+ val screenCount: Int
115
+ get() = mScreenFragments.size
116
+
117
+ fun getScreenAt(index: Int): Screen = mScreenFragments[index].screen
118
+
119
+ fun getScreenFragmentWrapperAt(index: Int): ScreenFragmentWrapper = mScreenFragments[index]
120
+
121
+ open val topScreen: Screen?
122
+ get() = mScreenFragments.firstOrNull { getActivityState(it) === ActivityState.ON_TOP }?.screen
123
+
124
+ private fun setFragmentManager(fm: FragmentManager) {
125
+ mFragmentManager = fm
126
+ performUpdatesNow()
127
+ }
128
+
129
+ private fun findFragmentManagerForReactRootView(rootView: ReactRootView): FragmentManager {
130
+ var context = rootView.context
131
+
132
+ // ReactRootView is expected to be initialized with the main React Activity as a context but
133
+ // in case of Expo the activity is wrapped in ContextWrapper and we need to unwrap it
134
+ while (context !is FragmentActivity && context is ContextWrapper) {
135
+ context = context.baseContext
136
+ }
137
+
138
+ check(context is FragmentActivity) {
139
+ "In order to use RNScreens components your app's activity need to extend ReactActivity"
140
+ }
141
+
142
+ // In case React Native is loaded on a Fragment (not directly in activity) we need to find
143
+ // fragment manager whose fragment's view is ReactRootView. As of now, we detect such case by
144
+ // checking whether any fragments are attached to activity which hosts ReactRootView.
145
+ // See: https://github.com/software-mansion/react-native-screens/issues/1506 on why the cases
146
+ // must be treated separately.
147
+ return if (context.supportFragmentManager.fragments.isEmpty()) {
148
+ // We are in standard React Native application w/o custom native navigation based on fragments.
149
+ context.supportFragmentManager
150
+ } else {
151
+ // We are in some custom setup & we want to use the closest fragment manager in hierarchy.
152
+ // `findFragment` method throws IllegalStateException when it fails to resolve appropriate
153
+ // fragment. It might happen when e.g. React Native is loaded directly in Activity
154
+ // but some custom fragments are still used. Such use case seems highly unlikely
155
+ // so, as for now we fallback to activity's FragmentManager in hope for the best.
156
+ try {
157
+ FragmentManager.findFragment<Fragment>(rootView).childFragmentManager
158
+ } catch (ex: IllegalStateException) {
159
+ context.supportFragmentManager
160
+ }
161
+ }
162
+ }
163
+
164
+ private fun setupFragmentManager() {
165
+ var parent: ViewParent = this
166
+ // We traverse view hierarchy up until we find screen parent or a root view
167
+ while (!(parent is ReactRootView || parent is Screen) &&
168
+ parent.parent != null
169
+ ) {
170
+ parent = parent.parent
171
+ }
172
+ // If parent is of type Screen it means we are inside a nested fragment structure.
173
+ // Otherwise we expect to connect directly with root view and get root fragment manager
174
+ if (parent is Screen) {
175
+ checkNotNull(
176
+ parent.fragmentWrapper?.let { fragmentWrapper ->
177
+ mParentScreenFragment = fragmentWrapper
178
+ fragmentWrapper.addChildScreenContainer(this)
179
+ setFragmentManager(fragmentWrapper.fragment.childFragmentManager)
180
+ }
181
+ ) { "Parent Screen does not have its Fragment attached" }
182
+ } else {
183
+ // we expect top level view to be of type ReactRootView, this isn't really necessary but in
184
+ // order to find root view we test if parent is null. This could potentially happen also when
185
+ // the view is detached from the hierarchy and that test would not correctly indicate the root
186
+ // view. So in order to make sure we indeed reached the root we test if it is of a correct type.
187
+ // This allows us to provide a more descriptive error message for the aforementioned case.
188
+ check(parent is ReactRootView) { "ScreenContainer is not attached under ReactRootView" }
189
+ setFragmentManager(findFragmentManagerForReactRootView(parent))
190
+ }
191
+ }
192
+
193
+ protected fun createTransaction(): FragmentTransaction {
194
+ return requireNotNull(mFragmentManager) { "mFragmentManager is null when creating transaction" }
195
+ .beginTransaction()
196
+ .setReorderingAllowed(true)
197
+ }
198
+
199
+ private fun attachScreen(transaction: FragmentTransaction, fragment: Fragment) {
200
+ transaction.add(id, fragment)
201
+ }
202
+
203
+ private fun detachScreen(transaction: FragmentTransaction, fragment: Fragment) {
204
+ transaction.remove(fragment)
205
+ }
206
+
207
+ private fun getActivityState(screenFragmentWrapper: ScreenFragmentWrapper): ActivityState? =
208
+ screenFragmentWrapper.screen.activityState
209
+
210
+ open fun hasScreen(screenFragmentWrapper: ScreenFragmentWrapper?): Boolean =
211
+ mScreenFragments.contains(screenFragmentWrapper)
212
+
213
+ override fun onAttachedToWindow() {
214
+ super.onAttachedToWindow()
215
+ mIsAttached = true
216
+ setupFragmentManager()
217
+ }
218
+
219
+ /** Removes fragments from fragment manager that are attached to this container */
220
+ private fun removeMyFragments(fragmentManager: FragmentManager) {
221
+ val transaction = fragmentManager.beginTransaction()
222
+ var hasFragments = false
223
+ for (fragment in fragmentManager.fragments) {
224
+ if (fragment is ScreenFragment && fragment.screen.container === this) {
225
+ transaction.remove(fragment)
226
+ hasFragments = true
227
+ }
228
+ }
229
+
230
+ if (hasFragments) {
231
+ transaction.commitNowAllowingStateLoss()
232
+ }
233
+ }
234
+
235
+ override fun onDetachedFromWindow() {
236
+ // if there are pending transactions and this view is about to get detached we need to perform
237
+ // them here as otherwise fragment manager will crash because it won't be able to find container
238
+ // view. We also need to make sure all the fragments attached to the given container are removed
239
+ // from fragment manager as in some cases fragment manager may be reused and in such case it'd
240
+ // attempt to reattach previously registered fragments that are not removed
241
+ mFragmentManager?.let {
242
+ if (!it.isDestroyed) {
243
+ removeMyFragments(it)
244
+ it.executePendingTransactions()
245
+ }
246
+ }
247
+
248
+ mParentScreenFragment?.removeChildScreenContainer(this)
249
+ mParentScreenFragment = null
250
+
251
+ super.onDetachedFromWindow()
252
+ mIsAttached = false
253
+ // When fragment container view is detached we force all its children to be removed.
254
+ // It is because children screens are controlled by their fragments, which can often have a
255
+ // delayed lifecycle (due to transitions). As a result due to ongoing transitions the fragment
256
+ // may choose not to remove the view despite the parent container being completely detached
257
+ // from the view hierarchy until the transition is over. In such a case when the container gets
258
+ // re-attached while the transition is ongoing, the child view would still be there and we'd
259
+ // attempt to re-attach it to with a misconfigured fragment. This would result in a crash. To
260
+ // avoid it we clear all the children here as we attach all the child fragments when the
261
+ // container is reattached anyways. We don't use `removeAllViews` since it does not check if the
262
+ // children are not already detached, which may lead to calling `onDetachedFromWindow` on them
263
+ // twice.
264
+ // We also get the size earlier, because we will be removing child views in `for` loop.
265
+ for (i in childCount - 1 downTo 0) {
266
+ removeViewAt(i)
267
+ }
268
+ }
269
+
270
+ override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
271
+ super.onMeasure(widthMeasureSpec, heightMeasureSpec)
272
+ for (i in 0 until childCount) {
273
+ getChildAt(i).measure(widthMeasureSpec, heightMeasureSpec)
274
+ }
275
+ }
276
+
277
+ private fun onScreenChanged() {
278
+ // we perform update in `onBeforeLayout` of `ScreensShadowNode` by adding an UIBlock
279
+ // which is called after updating children of the ScreenContainer.
280
+ // We do it there because `onUpdate` logic requires all changes of children to be already
281
+ // made in order to provide proper animation for fragment transition for ScreenStack
282
+ // and this in turn makes nested ScreenContainers detach too early and disappear
283
+ // before transition if also not dispatched after children updates.
284
+ // The exception to this rule is `updateImmediately` which is triggered by actions
285
+ // not connected to React view hierarchy changes, but rather internal events
286
+ mNeedUpdate = true
287
+ (context as? ReactContext)?.runOnUiQueueThread {
288
+ // We schedule the update here because LayoutAnimations of `react-native-reanimated`
289
+ // sometimes attach/detach screens after the layout block of `ScreensShadowNode` has
290
+ // already run, and we want to update the container then too. In the other cases,
291
+ // this code will do nothing since it will run after the UIBlock when `mNeedUpdate`
292
+ // will already be false.
293
+ performUpdates()
294
+ }
295
+ }
296
+
297
+ protected fun performUpdatesNow() {
298
+ // we want to update immediately when the fragment manager is set or native back button
299
+ // dismiss is dispatched or Screen's activityState changes since it is not connected to React
300
+ // view hierarchy changes and will not trigger `onBeforeLayout` method of `ScreensShadowNode`
301
+ mNeedUpdate = true
302
+ performUpdates()
303
+ }
304
+
305
+ fun performUpdates() {
306
+ if (!mNeedUpdate || !mIsAttached || mFragmentManager == null || mFragmentManager?.isDestroyed == true) {
307
+ return
308
+ }
309
+ mNeedUpdate = false
310
+ onUpdate()
311
+ notifyContainerUpdate()
312
+ }
313
+
314
+ open fun onUpdate() {
315
+ createTransaction().let {
316
+ // detach screens that are no longer active
317
+ val orphaned: MutableSet<Fragment> = HashSet(
318
+ requireNotNull(mFragmentManager) {
319
+ "mFragmentManager is null when performing update in ScreenContainer"
320
+ }.fragments
321
+ )
322
+ for (fragmentWrapper in mScreenFragments) {
323
+ if (getActivityState(fragmentWrapper) === ActivityState.INACTIVE &&
324
+ fragmentWrapper.fragment.isAdded
325
+ ) {
326
+ detachScreen(it, fragmentWrapper.fragment)
327
+ }
328
+ orphaned.remove(fragmentWrapper.fragment)
329
+ }
330
+ if (orphaned.isNotEmpty()) {
331
+ val orphanedAry = orphaned.toTypedArray()
332
+ for (fragment in orphanedAry) {
333
+ if (fragment is ScreenFragment) {
334
+ if (fragment.screen.container == null) {
335
+ detachScreen(it, fragment)
336
+ }
337
+ }
338
+ }
339
+ }
340
+
341
+ // if there is an "onTop" screen it means the transition has ended
342
+ val transitioning = topScreen == null
343
+
344
+ // attach newly activated screens
345
+ var addedBefore = false
346
+ val pendingFront: ArrayList<ScreenFragmentWrapper> = ArrayList()
347
+
348
+ for (fragmentWrapper in mScreenFragments) {
349
+ val activityState = getActivityState(fragmentWrapper)
350
+ if (activityState !== ActivityState.INACTIVE && !fragmentWrapper.fragment.isAdded) {
351
+ addedBefore = true
352
+ attachScreen(it, fragmentWrapper.fragment)
353
+ } else if (activityState !== ActivityState.INACTIVE && addedBefore) {
354
+ // we detach the screen and then reattach it later to make it appear on front
355
+ detachScreen(it, fragmentWrapper.fragment)
356
+ pendingFront.add(fragmentWrapper)
357
+ }
358
+ fragmentWrapper.screen.setTransitioning(transitioning)
359
+ }
360
+
361
+ for (screenFragment in pendingFront) {
362
+ attachScreen(it, screenFragment.fragment)
363
+ }
364
+
365
+ it.commitNowAllowingStateLoss()
366
+ }
367
+ }
368
+
369
+ protected open fun notifyContainerUpdate() {
370
+ topScreen?.fragmentWrapper?.onContainerUpdate()
371
+ }
372
+ }
@@ -0,0 +1,40 @@
1
+ package com.swmansion.rnscreens
2
+
3
+ import android.view.View
4
+ import com.facebook.react.bridge.ReactApplicationContext
5
+ import com.facebook.react.module.annotations.ReactModule
6
+ import com.facebook.react.uimanager.LayoutShadowNode
7
+ import com.facebook.react.uimanager.ThemedReactContext
8
+ import com.facebook.react.uimanager.ViewGroupManager
9
+
10
+ @ReactModule(name = ScreenContainerViewManager.REACT_CLASS)
11
+ class ScreenContainerViewManager : ViewGroupManager<ScreenContainer>() {
12
+ override fun getName(): String = REACT_CLASS
13
+
14
+ override fun createViewInstance(reactContext: ThemedReactContext): ScreenContainer = ScreenContainer(reactContext)
15
+
16
+ override fun addView(parent: ScreenContainer, child: View, index: Int) {
17
+ require(child is Screen) { "Attempt attach child that is not of type RNScreens" }
18
+ parent.addScreen(child, index)
19
+ }
20
+
21
+ override fun removeViewAt(parent: ScreenContainer, index: Int) {
22
+ parent.removeScreenAt(index)
23
+ }
24
+
25
+ override fun removeAllViews(parent: ScreenContainer) {
26
+ parent.removeAllScreens()
27
+ }
28
+
29
+ override fun getChildCount(parent: ScreenContainer): Int = parent.screenCount
30
+
31
+ override fun getChildAt(parent: ScreenContainer, index: Int): View = parent.getScreenAt(index)
32
+
33
+ override fun createShadowNodeInstance(context: ReactApplicationContext): LayoutShadowNode = ScreensShadowNode(context)
34
+
35
+ override fun needsCustomLayoutForChildren(): Boolean = true
36
+
37
+ companion object {
38
+ const val REACT_CLASS = "RNSScreenContainer"
39
+ }
40
+ }
@@ -0,0 +1,21 @@
1
+ package com.swmansion.rnscreens
2
+
3
+ interface ScreenEventDispatcher {
4
+ fun canDispatchLifecycleEvent(event: ScreenFragment.ScreenLifecycleEvent): Boolean
5
+ fun updateLastEventDispatched(event: ScreenFragment.ScreenLifecycleEvent)
6
+
7
+ /**
8
+ * Dispatches given screen lifecycle event to JS using screen from given fragment `fragmentWrapper`
9
+ */
10
+ fun dispatchLifecycleEvent(event: ScreenFragment.ScreenLifecycleEvent, fragmentWrapper: ScreenFragmentWrapper)
11
+
12
+ /**
13
+ * Dispatches given screen lifecycle event from all non-empty child containers to JS
14
+ */
15
+ fun dispatchLifecycleEventInChildContainers(event: ScreenFragment.ScreenLifecycleEvent)
16
+
17
+ fun dispatchHeaderBackButtonClickedEvent()
18
+ fun dispatchTransitionProgressEvent(alpha: Float, closing: Boolean)
19
+
20
+ // Concrete dispatchers
21
+ }