@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,296 @@
1
+ package com.swmansion.rnscreens
2
+
3
+ import android.animation.ArgbEvaluator
4
+ import android.animation.ValueAnimator
5
+ import android.annotation.SuppressLint
6
+ import android.annotation.TargetApi
7
+ import android.app.Activity
8
+ import android.content.pm.ActivityInfo
9
+ import android.graphics.Color
10
+ import android.os.Build
11
+ import android.view.ViewParent
12
+ import androidx.core.graphics.Insets
13
+ import androidx.core.view.ViewCompat
14
+ import androidx.core.view.WindowCompat
15
+ import androidx.core.view.WindowInsetsCompat
16
+ import androidx.core.view.WindowInsetsControllerCompat
17
+ import com.facebook.react.bridge.GuardedRunnable
18
+ import com.facebook.react.bridge.ReactContext
19
+ import com.facebook.react.bridge.UiThreadUtil
20
+ import com.swmansion.rnscreens.Screen.WindowTraits
21
+
22
+ object ScreenWindowTraits {
23
+ // Methods concerning statusBar management were taken from `react-native`'s status bar module:
24
+ // https://github.com/facebook/react-native/blob/master/ReactAndroid/src/main/java/com/facebook/react/modules/statusbar/StatusBarModule.java
25
+ private var mDidSetOrientation = false
26
+ private var mDidSetStatusBarAppearance = false
27
+ private var mDidSetNavigationBarAppearance = false
28
+ private var mDefaultStatusBarColor: Int? = null
29
+
30
+ internal fun applyDidSetOrientation() {
31
+ mDidSetOrientation = true
32
+ }
33
+
34
+ internal fun applyDidSetStatusBarAppearance() {
35
+ mDidSetStatusBarAppearance = true
36
+ }
37
+
38
+ internal fun applyDidSetNavigationBarAppearance() {
39
+ mDidSetNavigationBarAppearance = true
40
+ }
41
+
42
+ internal fun setOrientation(screen: Screen, activity: Activity?) {
43
+ if (activity == null) {
44
+ return
45
+ }
46
+ val screenForOrientation = findScreenForTrait(screen, WindowTraits.ORIENTATION)
47
+ val orientation = screenForOrientation?.screenOrientation ?: ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED
48
+ activity.requestedOrientation = orientation
49
+ }
50
+
51
+ @SuppressLint("ObsoleteSdkInt") // to be removed when support for < 0.64 is dropped
52
+ internal fun setColor(screen: Screen, activity: Activity?, context: ReactContext?) {
53
+ if (activity == null || context == null) {
54
+ return
55
+ }
56
+ if (mDefaultStatusBarColor == null) {
57
+ mDefaultStatusBarColor = activity.window.statusBarColor
58
+ }
59
+ val screenForColor = findScreenForTrait(screen, WindowTraits.COLOR)
60
+ val screenForAnimated = findScreenForTrait(screen, WindowTraits.ANIMATED)
61
+ val color = screenForColor?.statusBarColor ?: mDefaultStatusBarColor
62
+ val animated = screenForAnimated?.isStatusBarAnimated ?: false
63
+
64
+ UiThreadUtil.runOnUiThread(
65
+ object : GuardedRunnable(context) {
66
+ override fun runGuarded() {
67
+ val window = activity.window
68
+ val curColor: Int = window.statusBarColor
69
+ val colorAnimation = ValueAnimator.ofObject(ArgbEvaluator(), curColor, color)
70
+ colorAnimation.addUpdateListener { animator ->
71
+ window.statusBarColor = animator.animatedValue as Int
72
+ }
73
+ if (animated) {
74
+ colorAnimation.setDuration(300).startDelay = 0
75
+ } else {
76
+ colorAnimation.setDuration(0).startDelay = 300
77
+ }
78
+ colorAnimation.start()
79
+ }
80
+ })
81
+ }
82
+
83
+ internal fun setStyle(screen: Screen, activity: Activity?, context: ReactContext?) {
84
+ if (activity == null || context == null || Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
85
+ return
86
+ }
87
+ val screenForStyle = findScreenForTrait(screen, WindowTraits.STYLE)
88
+ val style = screenForStyle?.statusBarStyle ?: "light"
89
+
90
+ UiThreadUtil.runOnUiThread {
91
+ val decorView = activity.window.decorView
92
+ val window = activity.window
93
+ val controller = WindowInsetsControllerCompat(window, decorView)
94
+
95
+ controller.isAppearanceLightStatusBars = style == "dark"
96
+ }
97
+ }
98
+
99
+ internal fun setTranslucent(
100
+ screen: Screen,
101
+ activity: Activity?,
102
+ context: ReactContext?
103
+ ) {
104
+ if (activity == null || context == null) {
105
+ return
106
+ }
107
+ val screenForTranslucent = findScreenForTrait(screen, WindowTraits.TRANSLUCENT)
108
+ val translucent = screenForTranslucent?.isStatusBarTranslucent ?: false
109
+ UiThreadUtil.runOnUiThread(
110
+ object : GuardedRunnable(context) {
111
+ @TargetApi(Build.VERSION_CODES.LOLLIPOP)
112
+ override fun runGuarded() {
113
+ // If the status bar is translucent hook into the window insets calculations
114
+ // and consume all the top insets so no padding will be added under the status bar.
115
+ val decorView = activity.window.decorView
116
+ if (translucent) {
117
+ ViewCompat.setOnApplyWindowInsetsListener(decorView) { v, insets ->
118
+ val defaultInsets = ViewCompat.onApplyWindowInsets(v, insets)
119
+
120
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
121
+ val windowInsets =
122
+ defaultInsets.getInsets(WindowInsetsCompat.Type.statusBars())
123
+
124
+ WindowInsetsCompat
125
+ .Builder()
126
+ .setInsets(
127
+ WindowInsetsCompat.Type.statusBars(),
128
+ Insets.of(
129
+ windowInsets.left,
130
+ 0,
131
+ windowInsets.right,
132
+ windowInsets.bottom
133
+ )
134
+ )
135
+ .build()
136
+ } else {
137
+ defaultInsets.replaceSystemWindowInsets(
138
+ defaultInsets.systemWindowInsetLeft,
139
+ 0,
140
+ defaultInsets.systemWindowInsetRight,
141
+ defaultInsets.systemWindowInsetBottom
142
+ )
143
+ }
144
+ }
145
+ } else {
146
+ ViewCompat.setOnApplyWindowInsetsListener(decorView, null)
147
+ }
148
+ ViewCompat.requestApplyInsets(decorView)
149
+ }
150
+ })
151
+ }
152
+
153
+ internal fun setHidden(screen: Screen, activity: Activity?) {
154
+ if (activity == null) {
155
+ return
156
+ }
157
+ val screenForHidden = findScreenForTrait(screen, WindowTraits.HIDDEN)
158
+ val hidden = screenForHidden?.isStatusBarHidden ?: false
159
+ val window = activity.window
160
+ val controller = WindowInsetsControllerCompat(window, window.decorView)
161
+
162
+ UiThreadUtil.runOnUiThread {
163
+ if (hidden) {
164
+ controller.hide(WindowInsetsCompat.Type.statusBars())
165
+ } else {
166
+ controller.show(WindowInsetsCompat.Type.statusBars())
167
+ }
168
+ }
169
+ }
170
+
171
+ // Methods concerning navigationBar management were taken from `react-native-navigation`'s repo:
172
+ // https://github.com/wix/react-native-navigation/blob/9bb70d81700692141a2c505c081c2d86c7f9c66e/lib/android/app/src/main/java/com/reactnativenavigation/utils/SystemUiUtils.kt
173
+ internal fun setNavigationBarColor(screen: Screen, activity: Activity?) {
174
+ if (activity == null) {
175
+ return
176
+ }
177
+
178
+ val window = activity.window
179
+
180
+ val screenForNavBarColor = findScreenForTrait(screen, WindowTraits.NAVIGATION_BAR_COLOR)
181
+ val color = screenForNavBarColor?.navigationBarColor ?: window.navigationBarColor
182
+
183
+ UiThreadUtil.runOnUiThread {
184
+ WindowInsetsControllerCompat(window, window.decorView).isAppearanceLightNavigationBars =
185
+ isColorLight(color)
186
+ }
187
+ window.navigationBarColor = color
188
+ }
189
+
190
+ internal fun setNavigationBarHidden(screen: Screen, activity: Activity?) {
191
+ if (activity == null) {
192
+ return
193
+ }
194
+
195
+ val window = activity.window
196
+
197
+ val screenForNavBarHidden = findScreenForTrait(screen, WindowTraits.NAVIGATION_BAR_HIDDEN)
198
+ val hidden = screenForNavBarHidden?.isNavigationBarHidden ?: false
199
+
200
+ WindowCompat.setDecorFitsSystemWindows(window, hidden)
201
+ if (hidden) {
202
+ WindowInsetsControllerCompat(window, window.decorView).let { controller ->
203
+ controller.hide(WindowInsetsCompat.Type.navigationBars())
204
+ controller.systemBarsBehavior =
205
+ WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
206
+ }
207
+ } else {
208
+ WindowInsetsControllerCompat(
209
+ window,
210
+ window.decorView
211
+ ).show(WindowInsetsCompat.Type.navigationBars())
212
+ }
213
+ }
214
+
215
+ internal fun trySetWindowTraits(screen: Screen, activity: Activity?, context: ReactContext?) {
216
+ if (mDidSetOrientation) {
217
+ setOrientation(screen, activity)
218
+ }
219
+ if (mDidSetStatusBarAppearance) {
220
+ setColor(screen, activity, context)
221
+ setStyle(screen, activity, context)
222
+ setTranslucent(screen, activity, context)
223
+ setHidden(screen, activity)
224
+ }
225
+ if (mDidSetNavigationBarAppearance) {
226
+ setNavigationBarColor(screen, activity)
227
+ setNavigationBarHidden(screen, activity)
228
+ }
229
+ }
230
+
231
+ private fun findScreenForTrait(screen: Screen, trait: WindowTraits): Screen? {
232
+ val childWithTrait = childScreenWithTraitSet(screen, trait)
233
+ if (childWithTrait != null) {
234
+ return childWithTrait
235
+ }
236
+ return if (checkTraitForScreen(screen, trait)) {
237
+ screen
238
+ } else {
239
+ // if there is no child with trait set and this screen has no trait set, we look for a parent
240
+ // that has the trait set
241
+ findParentWithTraitSet(screen, trait)
242
+ }
243
+ }
244
+
245
+ private fun findParentWithTraitSet(screen: Screen, trait: WindowTraits): Screen? {
246
+ var parent: ViewParent? = screen.container
247
+ while (parent != null) {
248
+ if (parent is Screen) {
249
+ if (checkTraitForScreen(parent, trait)) {
250
+ return parent
251
+ }
252
+ }
253
+ parent = parent.parent
254
+ }
255
+ return null
256
+ }
257
+
258
+ private fun childScreenWithTraitSet(
259
+ screen: Screen?,
260
+ trait: WindowTraits
261
+ ): Screen? {
262
+ screen?.fragmentWrapper?.let {
263
+ for (sc in it.childScreenContainers) {
264
+ // we check only the top screen for the trait
265
+ val topScreen = sc.topScreen
266
+ val child = childScreenWithTraitSet(topScreen, trait)
267
+ if (child != null) {
268
+ return child
269
+ }
270
+ if (topScreen != null && checkTraitForScreen(topScreen, trait)) {
271
+ return topScreen
272
+ }
273
+ }
274
+ }
275
+ return null
276
+ }
277
+
278
+ private fun checkTraitForScreen(screen: Screen, trait: WindowTraits): Boolean {
279
+ return when (trait) {
280
+ WindowTraits.ORIENTATION -> screen.screenOrientation != null
281
+ WindowTraits.COLOR -> screen.statusBarColor != null
282
+ WindowTraits.STYLE -> screen.statusBarStyle != null
283
+ WindowTraits.TRANSLUCENT -> screen.isStatusBarTranslucent != null
284
+ WindowTraits.HIDDEN -> screen.isStatusBarHidden != null
285
+ WindowTraits.ANIMATED -> screen.isStatusBarAnimated != null
286
+ WindowTraits.NAVIGATION_BAR_COLOR -> screen.navigationBarColor != null
287
+ WindowTraits.NAVIGATION_BAR_HIDDEN -> screen.isNavigationBarHidden != null
288
+ }
289
+ }
290
+
291
+ private fun isColorLight(color: Int): Boolean {
292
+ val darkness: Double =
293
+ 1 - (0.299 * Color.red(color) + 0.587 * Color.green(color) + 0.114 * Color.blue(color)) / 255
294
+ return darkness < 0.5
295
+ }
296
+ }
@@ -0,0 +1,19 @@
1
+ package com.swmansion.rnscreens
2
+
3
+ import com.facebook.react.bridge.ReactContext
4
+ import com.facebook.react.uimanager.LayoutShadowNode
5
+ import com.facebook.react.uimanager.NativeViewHierarchyManager
6
+ import com.facebook.react.uimanager.NativeViewHierarchyOptimizer
7
+ import com.facebook.react.uimanager.UIManagerModule
8
+
9
+ internal class ScreensShadowNode(private var mContext: ReactContext) : LayoutShadowNode() {
10
+ override fun onBeforeLayout(nativeViewHierarchyOptimizer: NativeViewHierarchyOptimizer) {
11
+ super.onBeforeLayout(nativeViewHierarchyOptimizer)
12
+ (mContext.getNativeModule(UIManagerModule::class.java))?.addUIBlock { nativeViewHierarchyManager: NativeViewHierarchyManager ->
13
+ val view = nativeViewHierarchyManager.resolveView(reactTag)
14
+ if (view is ScreenContainer) {
15
+ view.performUpdates()
16
+ }
17
+ }
18
+ }
19
+ }
@@ -0,0 +1,133 @@
1
+ package com.swmansion.rnscreens
2
+
3
+ import com.facebook.react.bridge.JSApplicationIllegalArgumentException
4
+ import com.facebook.react.bridge.ReadableArray
5
+ import com.facebook.react.common.MapBuilder
6
+ import com.facebook.react.module.annotations.ReactModule
7
+ import com.facebook.react.uimanager.ThemedReactContext
8
+ import com.facebook.react.uimanager.ViewGroupManager
9
+ import com.facebook.react.uimanager.annotations.ReactProp
10
+ import com.swmansion.rnscreens.events.SearchBarBlurEvent
11
+ import com.swmansion.rnscreens.events.SearchBarChangeTextEvent
12
+ import com.swmansion.rnscreens.events.SearchBarCloseEvent
13
+ import com.swmansion.rnscreens.events.SearchBarFocusEvent
14
+ import com.swmansion.rnscreens.events.SearchBarOpenEvent
15
+ import com.swmansion.rnscreens.events.SearchBarSearchButtonPressEvent
16
+
17
+ @ReactModule(name = SearchBarManager.REACT_CLASS)
18
+ class SearchBarManager : ViewGroupManager<SearchBarView>() {
19
+ override fun getName(): String {
20
+ return REACT_CLASS
21
+ }
22
+
23
+ override fun createViewInstance(context: ThemedReactContext): SearchBarView {
24
+ return SearchBarView(context)
25
+ }
26
+
27
+ override fun onAfterUpdateTransaction(view: SearchBarView) {
28
+ super.onAfterUpdateTransaction(view)
29
+ view.onUpdate()
30
+ }
31
+
32
+ @ReactProp(name = "autoCapitalize")
33
+ fun setAutoCapitalize(view: SearchBarView, autoCapitalize: String?) {
34
+ view.autoCapitalize = when (autoCapitalize) {
35
+ null, "none" -> SearchBarView.SearchBarAutoCapitalize.NONE
36
+ "words" -> SearchBarView.SearchBarAutoCapitalize.WORDS
37
+ "sentences" -> SearchBarView.SearchBarAutoCapitalize.SENTENCES
38
+ "characters" -> SearchBarView.SearchBarAutoCapitalize.CHARACTERS
39
+ else -> throw JSApplicationIllegalArgumentException(
40
+ "Forbidden auto capitalize value passed"
41
+ )
42
+ }
43
+ }
44
+
45
+ @ReactProp(name = "autoFocus")
46
+ fun setAutoFocus(view: SearchBarView, autoFocus: Boolean?) {
47
+ view.autoFocus = autoFocus ?: false
48
+ }
49
+
50
+ @ReactProp(name = "barTintColor", customType = "Color")
51
+ fun setTintColor(view: SearchBarView, color: Int?) {
52
+ view.tintColor = color
53
+ }
54
+
55
+ @ReactProp(name = "disableBackButtonOverride")
56
+ fun setDisableBackButtonOverride(view: SearchBarView, disableBackButtonOverride: Boolean?) {
57
+ view.shouldOverrideBackButton = disableBackButtonOverride != true
58
+ }
59
+
60
+ @ReactProp(name = "inputType")
61
+ fun setInputType(view: SearchBarView, inputType: String?) {
62
+ view.inputType = when (inputType) {
63
+ null, "text" -> SearchBarView.SearchBarInputTypes.TEXT
64
+ "phone" -> SearchBarView.SearchBarInputTypes.PHONE
65
+ "number" -> SearchBarView.SearchBarInputTypes.NUMBER
66
+ "email" -> SearchBarView.SearchBarInputTypes.EMAIL
67
+ else -> throw JSApplicationIllegalArgumentException(
68
+ "Forbidden input type value"
69
+ )
70
+ }
71
+ }
72
+
73
+ @ReactProp(name = "placeholder")
74
+ fun setPlaceholder(view: SearchBarView, placeholder: String?) {
75
+ if (placeholder != null) {
76
+ view.placeholder = placeholder
77
+ }
78
+ }
79
+
80
+ @ReactProp(name = "textColor", customType = "Color")
81
+ fun setTextColor(view: SearchBarView, color: Int?) {
82
+ view.textColor = color
83
+ }
84
+
85
+ @ReactProp(name = "headerIconColor", customType = "Color")
86
+ fun setHeaderIconColor(view: SearchBarView, color: Int?) {
87
+ view.headerIconColor = color
88
+ }
89
+
90
+ @ReactProp(name = "hintTextColor", customType = "Color")
91
+ fun setHintTextColor(view: SearchBarView, color: Int?) {
92
+ view.hintTextColor = color
93
+ }
94
+
95
+ @ReactProp(name = "shouldShowHintSearchIcon")
96
+ fun setShouldShowHintSearchIcon(view: SearchBarView, shouldShowHintSearchIcon: Boolean?) {
97
+ view.shouldShowHintSearchIcon = shouldShowHintSearchIcon ?: true
98
+ }
99
+
100
+ fun setPlacement(view: SearchBarView, placeholder: String?) = Unit
101
+
102
+ override fun receiveCommand(root: SearchBarView, commandId: String?, args: ReadableArray?) {
103
+ when (commandId) {
104
+ "focus" -> root.handleFocusJsRequest()
105
+ "blur" -> root.handleBlurJsRequest()
106
+ "clearText" -> root.handleClearTextJsRequest()
107
+ "toggleCancelButton" -> root.handleToggleCancelButtonJsRequest(false) // just a dummy argument
108
+ "setText" -> root.handleSetTextJsRequest(args?.getString(0))
109
+ else -> throw JSApplicationIllegalArgumentException("Unsupported native command received: $commandId")
110
+ }
111
+ }
112
+
113
+ override fun getExportedCustomDirectEventTypeConstants(): Map<String, Any>? {
114
+ return MapBuilder.of(
115
+ SearchBarBlurEvent.EVENT_NAME,
116
+ MapBuilder.of("registrationName", "onBlur"),
117
+ SearchBarChangeTextEvent.EVENT_NAME,
118
+ MapBuilder.of("registrationName", "onChangeText"),
119
+ SearchBarCloseEvent.EVENT_NAME,
120
+ MapBuilder.of("registrationName", "onClose"),
121
+ SearchBarFocusEvent.EVENT_NAME,
122
+ MapBuilder.of("registrationName", "onFocus"),
123
+ SearchBarOpenEvent.EVENT_NAME,
124
+ MapBuilder.of("registrationName", "onOpen"),
125
+ SearchBarSearchButtonPressEvent.EVENT_NAME,
126
+ MapBuilder.of("registrationName", "onSearchButtonPress"),
127
+ )
128
+ }
129
+
130
+ companion object {
131
+ const val REACT_CLASS = "RNSSearchBar"
132
+ }
133
+ }
@@ -0,0 +1,178 @@
1
+ package com.swmansion.rnscreens
2
+
3
+ import android.annotation.SuppressLint
4
+ import android.text.InputType
5
+ import androidx.appcompat.widget.SearchView
6
+ import com.facebook.react.bridge.ReactContext
7
+ import com.facebook.react.uimanager.UIManagerHelper
8
+ import com.facebook.react.uimanager.events.Event
9
+ import com.facebook.react.uimanager.events.EventDispatcher
10
+ import com.facebook.react.views.view.ReactViewGroup
11
+ import com.swmansion.rnscreens.events.SearchBarBlurEvent
12
+ import com.swmansion.rnscreens.events.SearchBarChangeTextEvent
13
+ import com.swmansion.rnscreens.events.SearchBarCloseEvent
14
+ import com.swmansion.rnscreens.events.SearchBarFocusEvent
15
+ import com.swmansion.rnscreens.events.SearchBarOpenEvent
16
+ import com.swmansion.rnscreens.events.SearchBarSearchButtonPressEvent
17
+
18
+ @SuppressLint("ViewConstructor")
19
+ class SearchBarView(reactContext: ReactContext?) : ReactViewGroup(reactContext) {
20
+ var inputType: SearchBarInputTypes = SearchBarInputTypes.TEXT
21
+ var autoCapitalize: SearchBarAutoCapitalize = SearchBarAutoCapitalize.NONE
22
+ var textColor: Int? = null
23
+ var tintColor: Int? = null
24
+ var headerIconColor: Int? = null
25
+ var hintTextColor: Int? = null
26
+ var placeholder: String = ""
27
+ var shouldOverrideBackButton: Boolean = true
28
+ var autoFocus: Boolean = false
29
+ var shouldShowHintSearchIcon: Boolean = true
30
+
31
+ private var mSearchViewFormatter: SearchViewFormatter? = null
32
+
33
+ private var mAreListenersSet: Boolean = false
34
+
35
+ private val screenStackFragment: ScreenStackFragment?
36
+ get() {
37
+ val currentParent = parent
38
+ if (currentParent is ScreenStackHeaderSubview) {
39
+ return currentParent.config?.screenFragment
40
+ }
41
+ return null
42
+ }
43
+
44
+ fun onUpdate() {
45
+ setSearchViewProps()
46
+ }
47
+
48
+ private fun setSearchViewProps() {
49
+ val searchView = screenStackFragment?.searchView
50
+ if (searchView != null) {
51
+ if (!mAreListenersSet) {
52
+ setSearchViewListeners(searchView)
53
+ mAreListenersSet = true
54
+ }
55
+
56
+ searchView.inputType = inputType.toAndroidInputType(autoCapitalize)
57
+ mSearchViewFormatter?.setTextColor(textColor)
58
+ mSearchViewFormatter?.setTintColor(tintColor)
59
+ mSearchViewFormatter?.setHeaderIconColor(headerIconColor)
60
+ mSearchViewFormatter?.setHintTextColor(hintTextColor)
61
+ mSearchViewFormatter?.setPlaceholder(placeholder, shouldShowHintSearchIcon)
62
+ searchView.overrideBackAction = shouldOverrideBackButton
63
+ }
64
+ }
65
+
66
+ override fun onAttachedToWindow() {
67
+ super.onAttachedToWindow()
68
+
69
+ screenStackFragment?.onSearchViewCreate = { newSearchView ->
70
+ if (mSearchViewFormatter == null) mSearchViewFormatter =
71
+ SearchViewFormatter(newSearchView)
72
+ setSearchViewProps()
73
+ if (autoFocus) {
74
+ screenStackFragment?.searchView?.focus()
75
+ }
76
+ }
77
+ }
78
+
79
+ private fun setSearchViewListeners(searchView: SearchView) {
80
+ searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
81
+ override fun onQueryTextChange(newText: String?): Boolean {
82
+ handleTextChange(newText)
83
+ return true
84
+ }
85
+
86
+ override fun onQueryTextSubmit(query: String?): Boolean {
87
+ handleTextSubmit(query)
88
+ return true
89
+ }
90
+ })
91
+ searchView.setOnQueryTextFocusChangeListener { _, hasFocus ->
92
+ handleFocusChange(hasFocus)
93
+ }
94
+ searchView.setOnCloseListener {
95
+ handleClose()
96
+ false
97
+ }
98
+ searchView.setOnSearchClickListener {
99
+ handleOpen()
100
+ }
101
+ }
102
+
103
+ private fun handleTextChange(newText: String?) {
104
+ sendEvent(SearchBarChangeTextEvent(surfaceId, id, newText))
105
+ }
106
+
107
+ private fun handleFocusChange(hasFocus: Boolean) {
108
+ sendEvent(if (hasFocus) SearchBarFocusEvent(surfaceId, id) else SearchBarBlurEvent(surfaceId, id))
109
+ }
110
+
111
+ private fun handleClose() {
112
+ sendEvent(SearchBarCloseEvent(surfaceId, id))
113
+ }
114
+
115
+ private fun handleOpen() {
116
+ sendEvent(SearchBarOpenEvent(surfaceId, id))
117
+ }
118
+
119
+ private fun handleTextSubmit(newText: String?) {
120
+ sendEvent(SearchBarSearchButtonPressEvent(surfaceId, id, newText))
121
+ }
122
+
123
+ private fun sendEvent(event: Event<*>) {
124
+ val eventDispatcher: EventDispatcher? =
125
+ UIManagerHelper.getEventDispatcherForReactTag(context as ReactContext, id)
126
+ eventDispatcher?.dispatchEvent(event)
127
+ }
128
+
129
+ fun handleClearTextJsRequest() {
130
+ screenStackFragment?.searchView?.clearText()
131
+ }
132
+
133
+ fun handleFocusJsRequest() {
134
+ screenStackFragment?.searchView?.focus()
135
+ }
136
+
137
+ fun handleBlurJsRequest() {
138
+ screenStackFragment?.searchView?.clearFocus()
139
+ }
140
+
141
+ fun handleToggleCancelButtonJsRequest(flag: Boolean) = Unit
142
+
143
+ fun handleSetTextJsRequest(text: String?) {
144
+ text?.let { screenStackFragment?.searchView?.setText(it) }
145
+ }
146
+
147
+ private val surfaceId = UIManagerHelper.getSurfaceId(this)
148
+
149
+ enum class SearchBarAutoCapitalize {
150
+ NONE, WORDS, SENTENCES, CHARACTERS
151
+ }
152
+
153
+ enum class SearchBarInputTypes {
154
+ TEXT {
155
+ override fun toAndroidInputType(capitalize: SearchBarAutoCapitalize) =
156
+ when (capitalize) {
157
+ SearchBarAutoCapitalize.NONE -> InputType.TYPE_CLASS_TEXT
158
+ SearchBarAutoCapitalize.WORDS -> InputType.TYPE_TEXT_FLAG_CAP_WORDS
159
+ SearchBarAutoCapitalize.SENTENCES -> InputType.TYPE_TEXT_FLAG_CAP_SENTENCES
160
+ SearchBarAutoCapitalize.CHARACTERS -> InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS
161
+ }
162
+ },
163
+ PHONE {
164
+ override fun toAndroidInputType(capitalize: SearchBarAutoCapitalize) =
165
+ InputType.TYPE_CLASS_PHONE
166
+ },
167
+ NUMBER {
168
+ override fun toAndroidInputType(capitalize: SearchBarAutoCapitalize) =
169
+ InputType.TYPE_CLASS_NUMBER
170
+ },
171
+ EMAIL {
172
+ override fun toAndroidInputType(capitalize: SearchBarAutoCapitalize) =
173
+ InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS
174
+ };
175
+
176
+ abstract fun toAndroidInputType(capitalize: SearchBarAutoCapitalize): Int
177
+ }
178
+ }
@@ -0,0 +1,67 @@
1
+ package com.swmansion.rnscreens
2
+
3
+ import android.graphics.drawable.Drawable
4
+ import android.view.View
5
+ import android.widget.EditText
6
+ import android.widget.ImageView
7
+ import androidx.appcompat.R
8
+ import androidx.appcompat.widget.SearchView
9
+
10
+ class SearchViewFormatter(var searchView: SearchView) {
11
+ private var mDefaultTextColor: Int? = null
12
+ private var mDefaultTintBackground: Drawable? = null
13
+
14
+ private val searchEditText
15
+ get() = searchView.findViewById<View>(R.id.search_src_text) as? EditText
16
+ private val searchTextPlate
17
+ get() = searchView.findViewById<View>(R.id.search_plate)
18
+ private val searchIcon
19
+ get() = searchView.findViewById<ImageView>(R.id.search_button)
20
+ private val searchCloseIcon
21
+ get() = searchView.findViewById<ImageView>(R.id.search_close_btn)
22
+
23
+ fun setTextColor(textColor: Int?) {
24
+ val currentDefaultTextColor = mDefaultTextColor
25
+ if (textColor != null) {
26
+ if (mDefaultTextColor == null) {
27
+ mDefaultTextColor = searchEditText?.textColors?.defaultColor
28
+ }
29
+ searchEditText?.setTextColor(textColor)
30
+ } else if (currentDefaultTextColor != null) {
31
+ searchEditText?.setTextColor(currentDefaultTextColor)
32
+ }
33
+ }
34
+
35
+ fun setTintColor(tintColor: Int?) {
36
+ val currentDefaultTintColor = mDefaultTintBackground
37
+ if (tintColor != null) {
38
+ if (mDefaultTintBackground == null) {
39
+ mDefaultTintBackground = searchTextPlate.background
40
+ }
41
+ searchTextPlate.setBackgroundColor(tintColor)
42
+ } else if (currentDefaultTintColor != null) {
43
+ searchTextPlate.background = currentDefaultTintColor
44
+ }
45
+ }
46
+
47
+ fun setHeaderIconColor(headerIconColor: Int?) {
48
+ headerIconColor?.let {
49
+ searchIcon.setColorFilter(it)
50
+ searchCloseIcon.setColorFilter(it)
51
+ }
52
+ }
53
+
54
+ fun setHintTextColor(hintTextColor: Int?) {
55
+ hintTextColor?.let {
56
+ searchEditText?.setHintTextColor(it)
57
+ }
58
+ }
59
+
60
+ fun setPlaceholder(placeholder: String, shouldShowHintSearchIcon: Boolean) {
61
+ if (shouldShowHintSearchIcon) {
62
+ searchView.queryHint = placeholder
63
+ } else {
64
+ searchEditText?.hint = placeholder
65
+ }
66
+ }
67
+ }