@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,133 @@
1
+ import com.android.Version
2
+
3
+ buildscript {
4
+ ext {
5
+ rnsDefaultTargetSdkVersion = 34
6
+ rnsDefaultCompileSdkVersion = 34
7
+ rnsDefaultMinSdkVersion = 21
8
+ rnsDefaultKotlinVersion = '1.8.0'
9
+ }
10
+ ext.safeExtGet = {prop, fallback ->
11
+ rootProject.ext.has(prop) ? rootProject.ext.get(prop) : fallback
12
+ }
13
+ repositories {
14
+ google()
15
+ mavenCentral()
16
+ }
17
+ dependencies {
18
+ classpath('com.android.tools.build:gradle:4.2.2')
19
+ classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${safeExtGet('kotlinVersion', rnsDefaultKotlinVersion)}"
20
+ classpath "com.diffplug.spotless:spotless-plugin-gradle:6.11.0"
21
+ }
22
+ }
23
+
24
+ def isNewArchitectureEnabled() {
25
+ // To opt-in for the New Architecture, you can either:
26
+ // - Set `newArchEnabled` to true inside the `gradle.properties` file
27
+ // - Invoke gradle with `-newArchEnabled=true`
28
+ // - Set an environment variable `ORG_GRADLE_PROJECT_newArchEnabled=true`
29
+ return project.hasProperty("newArchEnabled") && project.newArchEnabled == "true"
30
+ }
31
+
32
+ // spotless is only accessible within react-native-screens repo
33
+ if (project == rootProject) {
34
+ apply from: 'spotless.gradle'
35
+ }
36
+
37
+ if (isNewArchitectureEnabled()) {
38
+ apply plugin: "com.facebook.react"
39
+ }
40
+ apply plugin: 'com.android.library'
41
+ apply plugin: 'kotlin-android'
42
+
43
+ def reactNativeArchitectures() {
44
+ def value = project.getProperties().get("reactNativeArchitectures")
45
+ return value ? value.split(",") : ["armeabi-v7a", "x86", "x86_64", "arm64-v8a"]
46
+ }
47
+
48
+ android {
49
+ compileSdkVersion safeExtGet('compileSdkVersion', rnsDefaultCompileSdkVersion)
50
+ def agpVersion = Version.ANDROID_GRADLE_PLUGIN_VERSION
51
+ if (agpVersion.tokenize('.')[0].toInteger() >= 7) {
52
+ namespace "com.swmansion.rnscreens"
53
+ }
54
+
55
+ // Used to override the NDK path/version on internal CI or by allowing
56
+ // users to customize the NDK path/version from their root project (e.g. for M1 support)
57
+ if (rootProject.hasProperty("ndkPath")) {
58
+ ndkPath rootProject.ext.ndkPath
59
+ }
60
+ if (rootProject.hasProperty("ndkVersion")) {
61
+ ndkVersion rootProject.ext.ndkVersion
62
+ }
63
+
64
+ defaultConfig {
65
+ minSdkVersion safeExtGet('minSdkVersion', rnsDefaultMinSdkVersion)
66
+ targetSdkVersion safeExtGet('targetSdkVersion', rnsDefaultTargetSdkVersion)
67
+ versionCode 1
68
+ versionName "1.0"
69
+ buildConfigField "boolean", "IS_NEW_ARCHITECTURE_ENABLED", isNewArchitectureEnabled().toString()
70
+ ndk {
71
+ abiFilters (*reactNativeArchitectures())
72
+ }
73
+ }
74
+ lintOptions {
75
+ abortOnError false
76
+ }
77
+ compileOptions {
78
+ sourceCompatibility JavaVersion.VERSION_1_8
79
+ targetCompatibility JavaVersion.VERSION_1_8
80
+ }
81
+ packagingOptions {
82
+ // For some reason gradle only complains about the duplicated version of libreact_render libraries
83
+ // while there are more libraries copied in intermediates folder of the lib build directory, we exclude
84
+ // only the ones that make the build fail (ideally we should only include librnscreens_modules but we
85
+ // are only allowed to specify exclude patterns)
86
+ exclude "**/libreact_render*.so"
87
+ }
88
+ sourceSets.main {
89
+ ext.androidResDir = "src/main/res"
90
+ java {
91
+ if (isNewArchitectureEnabled()) {
92
+ srcDirs += [
93
+ "src/fabric/java",
94
+ ]
95
+ } else {
96
+ srcDirs += [
97
+ "src/paper/java",
98
+ "build/generated/source/codegen/java"
99
+ ]
100
+ }
101
+
102
+ }
103
+ res {
104
+ if (safeExtGet('compileSdkVersion', rnsDefaultCompileSdkVersion) >= 33) {
105
+ srcDirs = ["${androidResDir}/base", "${androidResDir}/v33"]
106
+ } else {
107
+ srcDirs = ["${androidResDir}/base"]
108
+ }
109
+ }
110
+ }
111
+ }
112
+
113
+ repositories {
114
+ maven {
115
+ // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm
116
+ // Matches the RN Hello World template
117
+ // https://github.com/facebook/react-native/blob/1e8f3b11027fe0a7514b4fc97d0798d3c64bc895/local-cli/templates/HelloWorld/android/build.gradle#L21
118
+ url "$projectDir/../node_modules/react-native/android"
119
+ }
120
+ mavenCentral()
121
+ mavenLocal()
122
+ google()
123
+ }
124
+
125
+ dependencies {
126
+ implementation 'com.facebook.react:react-native:+'
127
+ implementation 'androidx.appcompat:appcompat:1.6.1'
128
+ implementation 'androidx.fragment:fragment-ktx:1.6.1'
129
+ implementation 'androidx.coordinatorlayout:coordinatorlayout:1.2.0'
130
+ implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0'
131
+ implementation 'com.google.android.material:material:1.9.0'
132
+ implementation "androidx.core:core-ktx:1.10.1"
133
+ }
@@ -0,0 +1,49 @@
1
+ package com.swmansion.rnscreens
2
+
3
+ import android.view.ViewGroup
4
+ import androidx.annotation.UiThread
5
+ import com.facebook.react.bridge.ReactContext
6
+ import com.facebook.react.bridge.ReadableMap
7
+ import com.facebook.react.bridge.WritableMap
8
+ import com.facebook.react.bridge.WritableNativeMap
9
+ import com.facebook.react.uimanager.FabricViewStateManager
10
+ import com.facebook.react.uimanager.PixelUtil
11
+ import kotlin.math.abs
12
+
13
+ abstract class FabricEnabledViewGroup constructor(context: ReactContext?) : ViewGroup(context), FabricViewStateManager.HasFabricViewStateManager {
14
+ private val mFabricViewStateManager: FabricViewStateManager = FabricViewStateManager()
15
+
16
+ override fun getFabricViewStateManager(): FabricViewStateManager {
17
+ return mFabricViewStateManager
18
+ }
19
+
20
+ protected fun updateScreenSizeFabric(width: Int, height: Int) {
21
+ updateState(width, height)
22
+ }
23
+
24
+ @UiThread
25
+ fun updateState(width: Int, height: Int) {
26
+ val realWidth: Float = PixelUtil.toDIPFromPixel(width.toFloat())
27
+ val realHeight: Float = PixelUtil.toDIPFromPixel(height.toFloat())
28
+
29
+ // Check incoming state values. If they're already the correct value, return early to prevent
30
+ // infinite UpdateState/SetState loop.
31
+ val currentState: ReadableMap? = mFabricViewStateManager.getStateData()
32
+ if (currentState != null) {
33
+ val delta = 0.9f
34
+ val stateFrameHeight: Float = if (currentState.hasKey("frameHeight")) currentState.getDouble("frameHeight").toFloat() else 0f
35
+ val stateFrameWidth: Float = if (currentState.hasKey("frameWidth")) currentState.getDouble("frameWidth").toFloat() else 0f
36
+ if (abs(stateFrameWidth - realWidth) < delta &&
37
+ abs(stateFrameHeight - realHeight) < delta
38
+ ) {
39
+ return
40
+ }
41
+ }
42
+ mFabricViewStateManager.setState {
43
+ val map: WritableMap = WritableNativeMap()
44
+ map.putDouble("frameWidth", realWidth.toDouble())
45
+ map.putDouble("frameHeight", realHeight.toDouble())
46
+ map
47
+ }
48
+ }
49
+ }
@@ -0,0 +1,5 @@
1
+
2
+ <manifest xmlns:android="http://schemas.android.com/apk/res/android"
3
+ package="com.swmansion.rnscreens">
4
+
5
+ </manifest>
@@ -0,0 +1,77 @@
1
+ package com.swmansion.rnscreens
2
+
3
+ import android.content.Context
4
+ import androidx.activity.OnBackPressedCallback
5
+ import androidx.appcompat.widget.SearchView
6
+ import androidx.fragment.app.Fragment
7
+
8
+ class CustomSearchView(context: Context, fragment: Fragment) : SearchView(context) {
9
+ /*
10
+ CustomSearchView uses some variables from SearchView. They are listed below with links to documentation
11
+ isIconified - https://developer.android.com/reference/android/widget/SearchView#setIconified(boolean)
12
+ maxWidth - https://developer.android.com/reference/android/widget/SearchView#setMaxWidth(int)
13
+ setOnSearchClickListener - https://developer.android.com/reference/android/widget/SearchView#setOnSearchClickListener(android.view.View.OnClickListener)
14
+ setOnCloseListener - https://developer.android.com/reference/android/widget/SearchView#setOnCloseListener(android.widget.SearchView.OnCloseListener)
15
+ */
16
+ private var mCustomOnCloseListener: OnCloseListener? = null
17
+ private var mCustomOnSearchClickedListener: OnClickListener? = null
18
+
19
+ private var mOnBackPressedCallback: OnBackPressedCallback =
20
+ object : OnBackPressedCallback(true) {
21
+ override fun handleOnBackPressed() {
22
+ isIconified = true
23
+ }
24
+ }
25
+
26
+ private val backPressOverrider = FragmentBackPressOverrider(fragment, mOnBackPressedCallback)
27
+
28
+ var overrideBackAction: Boolean
29
+ set(value) {
30
+ backPressOverrider.overrideBackAction = value
31
+ }
32
+ get() = backPressOverrider.overrideBackAction
33
+
34
+ fun focus() {
35
+ isIconified = false
36
+ requestFocusFromTouch()
37
+ }
38
+
39
+ fun clearText() = setQuery("", false)
40
+
41
+ fun setText(text: String) = setQuery(text, false)
42
+
43
+ override fun setOnCloseListener(listener: OnCloseListener?) {
44
+ mCustomOnCloseListener = listener
45
+ }
46
+
47
+ override fun setOnSearchClickListener(listener: OnClickListener?) {
48
+ mCustomOnSearchClickedListener = listener
49
+ }
50
+
51
+ override fun onAttachedToWindow() {
52
+ super.onAttachedToWindow()
53
+ if (!isIconified) {
54
+ backPressOverrider.maybeAddBackCallback()
55
+ }
56
+ }
57
+
58
+ override fun onDetachedFromWindow() {
59
+ super.onDetachedFromWindow()
60
+ backPressOverrider.removeBackCallbackIfAdded()
61
+ }
62
+
63
+ init {
64
+ super.setOnSearchClickListener { v ->
65
+ mCustomOnSearchClickedListener?.onClick(v)
66
+ backPressOverrider.maybeAddBackCallback()
67
+ }
68
+
69
+ super.setOnCloseListener {
70
+ val result = mCustomOnCloseListener?.onClose() ?: false
71
+ backPressOverrider.removeBackCallbackIfAdded()
72
+ result
73
+ }
74
+
75
+ maxWidth = Integer.MAX_VALUE
76
+ }
77
+ }
@@ -0,0 +1,7 @@
1
+ package com.swmansion.rnscreens
2
+
3
+ import android.content.Context
4
+ import androidx.appcompat.widget.Toolbar
5
+
6
+ // This class is used to store config closer to search bar
7
+ open class CustomToolbar(context: Context, val config: ScreenStackHeaderConfig) : Toolbar(context)
@@ -0,0 +1,29 @@
1
+ package com.swmansion.rnscreens
2
+
3
+ import androidx.activity.OnBackPressedCallback
4
+ import androidx.fragment.app.Fragment
5
+
6
+ class FragmentBackPressOverrider(
7
+ private val fragment: Fragment,
8
+ private val mOnBackPressedCallback: OnBackPressedCallback
9
+ ) {
10
+ private var mIsBackCallbackAdded: Boolean = false
11
+ var overrideBackAction: Boolean = true
12
+
13
+ fun maybeAddBackCallback() {
14
+ if (!mIsBackCallbackAdded && overrideBackAction) {
15
+ fragment.activity?.onBackPressedDispatcher?.addCallback(
16
+ fragment,
17
+ mOnBackPressedCallback
18
+ )
19
+ mIsBackCallbackAdded = true
20
+ }
21
+ }
22
+
23
+ fun removeBackCallbackIfAdded() {
24
+ if (mIsBackCallbackAdded) {
25
+ mOnBackPressedCallback.remove()
26
+ mIsBackCallbackAdded = false
27
+ }
28
+ }
29
+ }
@@ -0,0 +1,7 @@
1
+ package com.swmansion.rnscreens
2
+
3
+ import androidx.fragment.app.Fragment
4
+
5
+ interface FragmentHolder {
6
+ val fragment: Fragment
7
+ }
@@ -0,0 +1,21 @@
1
+ package com.swmansion.rnscreens
2
+
3
+ import com.facebook.react.ReactPackage
4
+ import com.facebook.react.bridge.NativeModule
5
+ import com.facebook.react.bridge.ReactApplicationContext
6
+ import com.facebook.react.uimanager.ViewManager
7
+
8
+ class RNScreensPackage : ReactPackage {
9
+ override fun createNativeModules(reactContext: ReactApplicationContext): List<NativeModule> =
10
+ emptyList()
11
+
12
+ override fun createViewManagers(reactContext: ReactApplicationContext) =
13
+ listOf<ViewManager<*, *>>(
14
+ ScreenContainerViewManager(),
15
+ ScreenViewManager(),
16
+ ScreenStackViewManager(),
17
+ ScreenStackHeaderConfigViewManager(),
18
+ ScreenStackHeaderSubviewManager(),
19
+ SearchBarManager()
20
+ )
21
+ }
@@ -0,0 +1,289 @@
1
+ package com.swmansion.rnscreens
2
+
3
+ import android.annotation.SuppressLint
4
+ import android.content.pm.ActivityInfo
5
+ import android.graphics.Paint
6
+ import android.os.Parcelable
7
+ import android.util.SparseArray
8
+ import android.util.TypedValue
9
+ import android.view.ViewGroup
10
+ import android.view.WindowManager
11
+ import android.webkit.WebView
12
+ import androidx.core.view.children
13
+ import androidx.fragment.app.Fragment
14
+ import com.facebook.react.bridge.GuardedRunnable
15
+ import com.facebook.react.bridge.ReactContext
16
+ import com.facebook.react.uimanager.PixelUtil
17
+ import com.facebook.react.uimanager.UIManagerHelper
18
+ import com.facebook.react.uimanager.UIManagerModule
19
+ import com.swmansion.rnscreens.events.HeaderHeightChangeEvent
20
+
21
+ @SuppressLint("ViewConstructor")
22
+ class Screen constructor(context: ReactContext?) : FabricEnabledViewGroup(context) {
23
+ val fragment: Fragment?
24
+ get() = fragmentWrapper?.fragment
25
+
26
+ var fragmentWrapper: ScreenFragmentWrapper? = null
27
+ var container: ScreenContainer? = null
28
+ var activityState: ActivityState? = null
29
+ private set
30
+ private var mTransitioning = false
31
+ var stackPresentation = StackPresentation.PUSH
32
+ var replaceAnimation = ReplaceAnimation.POP
33
+ var stackAnimation = StackAnimation.DEFAULT
34
+ var isGestureEnabled = true
35
+ var screenOrientation: Int? = null
36
+ private set
37
+ private var mStatusBarStyle: String? = null
38
+ private var mStatusBarHidden: Boolean? = null
39
+ private var mStatusBarTranslucent: Boolean? = null
40
+ private var mStatusBarColor: Int? = null
41
+ private var mNavigationBarColor: Int? = null
42
+ private var mNavigationBarHidden: Boolean? = null
43
+ var isStatusBarAnimated: Boolean? = null
44
+ private var mNativeBackButtonDismissalEnabled = true
45
+
46
+ init {
47
+ // we set layout params as WindowManager.LayoutParams to workaround the issue with TextInputs
48
+ // not displaying modal menus (e.g., copy/paste or selection). The missing menus are due to the
49
+ // fact that TextView implementation is expected to be attached to window when layout happens.
50
+ // Then, at the moment of layout it checks whether window type is in a reasonable range to tell
51
+ // whether it should enable selection controls (see Editor.java#prepareCursorControllers).
52
+ // With screens, however, the text input component can be laid out before it is attached, in
53
+ // that case TextView tries to get window type property from the oldest existing parent, which
54
+ // in this case is a Screen class, as it is the root of the screen that is about to be attached.
55
+ // Setting params this way is not the most elegant way to solve this problem but workarounds it
56
+ // for the time being
57
+ layoutParams = WindowManager.LayoutParams(WindowManager.LayoutParams.TYPE_APPLICATION)
58
+ }
59
+
60
+ override fun dispatchSaveInstanceState(container: SparseArray<Parcelable>) {
61
+ // do nothing, react native will keep the view hierarchy so no need to serialize/deserialize
62
+ // view's states. The side effect of restoring is that TextInput components would trigger
63
+ // set-text events which may confuse text input handling.
64
+ }
65
+
66
+ override fun dispatchRestoreInstanceState(container: SparseArray<Parcelable>) {
67
+ // ignore restoring instance state too as we are not saving anything anyways.
68
+ }
69
+
70
+ override fun onLayout(changed: Boolean, l: Int, t: Int, r: Int, b: Int) {
71
+ if (changed) {
72
+ val width = r - l
73
+ val height = b - t
74
+
75
+ calculateHeaderHeight()
76
+ if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) {
77
+ updateScreenSizeFabric(width, height)
78
+ } else {
79
+ updateScreenSizePaper(width, height)
80
+ }
81
+ }
82
+ }
83
+
84
+ private fun updateScreenSizePaper(width: Int, height: Int) {
85
+ val reactContext = context as ReactContext
86
+ reactContext.runOnNativeModulesQueueThread(
87
+ object : GuardedRunnable(reactContext) {
88
+ override fun runGuarded() {
89
+ reactContext
90
+ .getNativeModule(UIManagerModule::class.java)
91
+ ?.updateNodeSize(id, width, height)
92
+ }
93
+ })
94
+ }
95
+
96
+ val headerConfig: ScreenStackHeaderConfig?
97
+ get() = children.find { it is ScreenStackHeaderConfig } as? ScreenStackHeaderConfig
98
+
99
+ /**
100
+ * While transitioning this property allows to optimize rendering behavior on Android and provide
101
+ * a correct blending options for the animated screen. It is turned on automatically by the
102
+ * container when transitioning is detected and turned off immediately after
103
+ */
104
+ fun setTransitioning(transitioning: Boolean) {
105
+ if (mTransitioning == transitioning) {
106
+ return
107
+ }
108
+ mTransitioning = transitioning
109
+ val isWebViewInScreen = hasWebView(this)
110
+ if (isWebViewInScreen && layerType != LAYER_TYPE_HARDWARE) {
111
+ return
112
+ }
113
+ super.setLayerType(
114
+ if (transitioning && !isWebViewInScreen) LAYER_TYPE_HARDWARE else LAYER_TYPE_NONE,
115
+ null
116
+ )
117
+ }
118
+
119
+ private fun hasWebView(viewGroup: ViewGroup): Boolean {
120
+ for (i in 0 until viewGroup.childCount) {
121
+ val child = viewGroup.getChildAt(i)
122
+ if (child is WebView) {
123
+ return true
124
+ } else if (child is ViewGroup) {
125
+ if (hasWebView(child)) {
126
+ return true
127
+ }
128
+ }
129
+ }
130
+ return false
131
+ }
132
+
133
+ override fun setLayerType(layerType: Int, paint: Paint?) {
134
+ // ignore - layer type is controlled by `transitioning` prop
135
+ }
136
+
137
+ fun setActivityState(activityState: ActivityState) {
138
+ if (activityState == this.activityState) {
139
+ return
140
+ }
141
+ this.activityState = activityState
142
+ container?.notifyChildUpdate()
143
+ }
144
+
145
+ fun setScreenOrientation(screenOrientation: String?) {
146
+ if (screenOrientation == null) {
147
+ this.screenOrientation = null
148
+ return
149
+ }
150
+ ScreenWindowTraits.applyDidSetOrientation()
151
+ this.screenOrientation = when (screenOrientation) {
152
+ "all" -> ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR
153
+ "portrait" -> ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT
154
+ "portrait_up" -> ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
155
+ "portrait_down" -> ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT
156
+ "landscape" -> ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE
157
+ "landscape_left" -> ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE
158
+ "landscape_right" -> ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
159
+ else -> ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED
160
+ }
161
+
162
+ fragmentWrapper?.let { ScreenWindowTraits.setOrientation(this, it.tryGetActivity()) }
163
+ }
164
+
165
+ // Accepts one of 4 accessibility flags
166
+ // developer.android.com/reference/android/view/View#attr_android:importantForAccessibility
167
+ fun changeAccessibilityMode(mode: Int) {
168
+ this.importantForAccessibility = mode
169
+ this.headerConfig?.toolbar?.importantForAccessibility = mode
170
+ }
171
+
172
+ var statusBarStyle: String?
173
+ get() = mStatusBarStyle
174
+ set(statusBarStyle) {
175
+ if (statusBarStyle != null) {
176
+ ScreenWindowTraits.applyDidSetStatusBarAppearance()
177
+ }
178
+ mStatusBarStyle = statusBarStyle
179
+ fragmentWrapper?.let { ScreenWindowTraits.setStyle(this, it.tryGetActivity(), it.tryGetContext()) }
180
+ }
181
+
182
+ var isStatusBarHidden: Boolean?
183
+ get() = mStatusBarHidden
184
+ set(statusBarHidden) {
185
+ if (statusBarHidden != null) {
186
+ ScreenWindowTraits.applyDidSetStatusBarAppearance()
187
+ }
188
+ mStatusBarHidden = statusBarHidden
189
+ fragmentWrapper?.let { ScreenWindowTraits.setHidden(this, it.tryGetActivity()) }
190
+ }
191
+
192
+ var isStatusBarTranslucent: Boolean?
193
+ get() = mStatusBarTranslucent
194
+ set(statusBarTranslucent) {
195
+ if (statusBarTranslucent != null) {
196
+ ScreenWindowTraits.applyDidSetStatusBarAppearance()
197
+ }
198
+ mStatusBarTranslucent = statusBarTranslucent
199
+ fragmentWrapper?.let {
200
+ ScreenWindowTraits.setTranslucent(
201
+ this,
202
+ it.tryGetActivity(),
203
+ it.tryGetContext()
204
+ )
205
+ }
206
+ }
207
+
208
+ var statusBarColor: Int?
209
+ get() = mStatusBarColor
210
+ set(statusBarColor) {
211
+ if (statusBarColor != null) {
212
+ ScreenWindowTraits.applyDidSetStatusBarAppearance()
213
+ }
214
+ mStatusBarColor = statusBarColor
215
+ fragmentWrapper?.let { ScreenWindowTraits.setColor(this, it.tryGetActivity(), it.tryGetContext()) }
216
+ }
217
+
218
+ var navigationBarColor: Int?
219
+ get() = mNavigationBarColor
220
+ set(navigationBarColor) {
221
+ if (navigationBarColor != null) {
222
+ ScreenWindowTraits.applyDidSetNavigationBarAppearance()
223
+ }
224
+ mNavigationBarColor = navigationBarColor
225
+ fragmentWrapper?.let { ScreenWindowTraits.setNavigationBarColor(this, it.tryGetActivity()) }
226
+ }
227
+
228
+ var isNavigationBarHidden: Boolean?
229
+ get() = mNavigationBarHidden
230
+ set(navigationBarHidden) {
231
+ if (navigationBarHidden != null) {
232
+ ScreenWindowTraits.applyDidSetNavigationBarAppearance()
233
+ }
234
+ mNavigationBarHidden = navigationBarHidden
235
+ fragmentWrapper?.let {
236
+ ScreenWindowTraits.setNavigationBarHidden(
237
+ this,
238
+ it.tryGetActivity(),
239
+ )
240
+ }
241
+ }
242
+
243
+ var nativeBackButtonDismissalEnabled: Boolean
244
+ get() = mNativeBackButtonDismissalEnabled
245
+ set(enableNativeBackButtonDismissal) {
246
+ mNativeBackButtonDismissalEnabled = enableNativeBackButtonDismissal
247
+ }
248
+
249
+ fun calculateHeaderHeight() {
250
+ val actionBarTv = TypedValue()
251
+ val resolvedActionBarSize = context.theme.resolveAttribute(android.R.attr.actionBarSize, actionBarTv, true)
252
+
253
+ // Check if it's possible to get an attribute from theme context and assign a value from it.
254
+ // Otherwise, the default value will be returned.
255
+ val actionBarHeight = TypedValue.complexToDimensionPixelSize(actionBarTv.data, resources.displayMetrics)
256
+ .takeIf { resolvedActionBarSize }
257
+ ?.let { PixelUtil.toDIPFromPixel(it.toFloat()).toDouble() } ?: 56.0
258
+
259
+ val statusBarHeight = context.resources.getIdentifier("status_bar_height", "dimen", "android")
260
+ .takeIf { it > 0 }
261
+ ?.let { (context.resources::getDimensionPixelSize)(it) }
262
+ ?.let { PixelUtil.toDIPFromPixel(it.toFloat()).toDouble() }
263
+ ?: 24.0
264
+
265
+ val totalHeight = actionBarHeight + statusBarHeight
266
+ UIManagerHelper.getEventDispatcherForReactTag(context as ReactContext, id)
267
+ ?.dispatchEvent(HeaderHeightChangeEvent(id, totalHeight))
268
+ }
269
+
270
+ enum class StackPresentation {
271
+ PUSH, MODAL, TRANSPARENT_MODAL
272
+ }
273
+
274
+ enum class StackAnimation {
275
+ DEFAULT, NONE, FADE, SLIDE_FROM_BOTTOM, SLIDE_FROM_RIGHT, SLIDE_FROM_LEFT, FADE_FROM_BOTTOM
276
+ }
277
+
278
+ enum class ReplaceAnimation {
279
+ PUSH, POP
280
+ }
281
+
282
+ enum class ActivityState {
283
+ INACTIVE, TRANSITIONING_OR_BELOW_TOP, ON_TOP
284
+ }
285
+
286
+ enum class WindowTraits {
287
+ ORIENTATION, COLOR, STYLE, TRANSLUCENT, HIDDEN, ANIMATED, NAVIGATION_BAR_COLOR, NAVIGATION_BAR_HIDDEN
288
+ }
289
+ }