react-native-screens 3.31.1 → 3.33.0

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 (203) hide show
  1. package/README.md +21 -11
  2. package/RNScreens.podspec +11 -52
  3. package/android/CMakeLists.txt +48 -4
  4. package/android/build.gradle +16 -9
  5. package/android/src/fabric/java/com/swmansion/rnscreens/FabricEnabledViewGroup.kt +25 -16
  6. package/android/src/fabric/java/com/swmansion/rnscreens/NativeProxy.kt +53 -0
  7. package/android/src/main/cpp/NativeProxy.cpp +51 -0
  8. package/android/src/main/cpp/NativeProxy.h +35 -0
  9. package/android/src/main/cpp/OnLoad.cpp +8 -0
  10. package/android/src/main/cpp/jni-adapter.cpp +86 -93
  11. package/android/src/main/java/com/swmansion/rnscreens/CustomSearchView.kt +7 -2
  12. package/android/src/main/java/com/swmansion/rnscreens/CustomToolbar.kt +6 -1
  13. package/android/src/main/java/com/swmansion/rnscreens/FragmentBackPressOverrider.kt +2 -2
  14. package/android/src/main/java/com/swmansion/rnscreens/RNScreensPackage.kt +36 -17
  15. package/android/src/main/java/com/swmansion/rnscreens/Screen.kt +150 -40
  16. package/android/src/main/java/com/swmansion/rnscreens/ScreenContainer.kt +52 -30
  17. package/android/src/main/java/com/swmansion/rnscreens/ScreenContainerViewManager.kt +27 -4
  18. package/android/src/main/java/com/swmansion/rnscreens/ScreenEventDispatcher.kt +10 -2
  19. package/android/src/main/java/com/swmansion/rnscreens/ScreenFragment.kt +56 -27
  20. package/android/src/main/java/com/swmansion/rnscreens/ScreenFragmentWrapper.kt +8 -1
  21. package/android/src/main/java/com/swmansion/rnscreens/ScreenStack.kt +50 -19
  22. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackFragment.kt +63 -39
  23. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackFragmentWrapper.kt +4 -0
  24. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfig.kt +88 -57
  25. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfigViewManager.kt +131 -36
  26. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderSubview.kt +19 -4
  27. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderSubviewManager.kt +16 -10
  28. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackViewManager.kt +28 -25
  29. package/android/src/main/java/com/swmansion/rnscreens/ScreenViewManager.kt +177 -77
  30. package/android/src/main/java/com/swmansion/rnscreens/ScreenWindowTraits.kt +77 -25
  31. package/android/src/main/java/com/swmansion/rnscreens/ScreensModule.kt +31 -9
  32. package/android/src/main/java/com/swmansion/rnscreens/ScreensShadowNode.kt +3 -1
  33. package/android/src/main/java/com/swmansion/rnscreens/SearchBarManager.kt +160 -54
  34. package/android/src/main/java/com/swmansion/rnscreens/SearchBarView.kt +29 -22
  35. package/android/src/main/java/com/swmansion/rnscreens/SearchViewFormatter.kt +7 -2
  36. package/android/src/main/java/com/swmansion/rnscreens/events/HeaderAttachedEvent.kt +4 -1
  37. package/android/src/main/java/com/swmansion/rnscreens/events/HeaderBackButtonClickedEvent.kt +4 -1
  38. package/android/src/main/java/com/swmansion/rnscreens/events/HeaderDetachedEvent.kt +4 -1
  39. package/android/src/main/java/com/swmansion/rnscreens/events/HeaderHeightChangeEvent.kt +5 -6
  40. package/android/src/main/java/com/swmansion/rnscreens/events/ScreenAppearEvent.kt +4 -1
  41. package/android/src/main/java/com/swmansion/rnscreens/events/ScreenDisappearEvent.kt +4 -1
  42. package/android/src/main/java/com/swmansion/rnscreens/events/ScreenDismissedEvent.kt +8 -4
  43. package/android/src/main/java/com/swmansion/rnscreens/events/ScreenTransitionProgressEvent.kt +7 -6
  44. package/android/src/main/java/com/swmansion/rnscreens/events/ScreenWillAppearEvent.kt +4 -1
  45. package/android/src/main/java/com/swmansion/rnscreens/events/ScreenWillDisappearEvent.kt +4 -1
  46. package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarBlurEvent.kt +5 -2
  47. package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarChangeTextEvent.kt +4 -3
  48. package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarCloseEvent.kt +4 -1
  49. package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarFocusEvent.kt +5 -2
  50. package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarOpenEvent.kt +4 -1
  51. package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarSearchButtonPressEvent.kt +9 -4
  52. package/android/src/main/java/com/swmansion/rnscreens/events/StackFinishTransitioningEvent.kt +4 -1
  53. package/android/src/main/java/com/swmansion/rnscreens/utils/DeviceUtils.kt +1 -5
  54. package/android/src/main/java/com/swmansion/rnscreens/utils/ScreenDummyLayoutHelper.kt +214 -0
  55. package/android/src/main/jni/CMakeLists.txt +5 -4
  56. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenContainerManagerDelegate.java +25 -0
  57. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenContainerManagerInterface.java +16 -0
  58. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenManagerDelegate.java +6 -0
  59. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenManagerInterface.java +2 -0
  60. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderConfigManagerDelegate.java +3 -0
  61. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderConfigManagerInterface.java +1 -0
  62. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSSearchBarManagerDelegate.java +99 -0
  63. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSSearchBarManagerInterface.java +37 -0
  64. package/android/src/paper/java/com/swmansion/rnscreens/FabricEnabledViewGroup.kt +10 -5
  65. package/android/src/paper/java/com/swmansion/rnscreens/NativeProxy.kt +19 -0
  66. package/android/src/paper/java/com/swmansion/rnscreens/NativeScreensModuleSpec.java +4 -0
  67. package/common/cpp/react/renderer/components/rnscreens/FrameCorrectionModes.h +51 -0
  68. package/common/cpp/react/renderer/components/rnscreens/RNSModalScreenComponentDescriptor.h +8 -9
  69. package/common/cpp/react/renderer/components/rnscreens/RNSModalScreenShadowNode.cpp +2 -1
  70. package/common/cpp/react/renderer/components/rnscreens/RNSModalScreenShadowNode.h +9 -8
  71. package/common/cpp/react/renderer/components/rnscreens/RNSScreenComponentDescriptor.h +147 -10
  72. package/common/cpp/react/renderer/components/rnscreens/RNSScreenShadowNode.cpp +51 -1
  73. package/common/cpp/react/renderer/components/rnscreens/RNSScreenShadowNode.h +29 -7
  74. package/common/cpp/react/renderer/components/rnscreens/RNSScreenState.cpp +22 -1
  75. package/common/cpp/react/renderer/components/rnscreens/RNSScreenState.h +30 -10
  76. package/common/cpp/react/renderer/components/rnscreens/utils/RectUtil.h +36 -0
  77. package/cpp/RNSScreenRemovalListener.cpp +25 -0
  78. package/cpp/RNSScreenRemovalListener.h +20 -0
  79. package/cpp/RNScreensTurboModule.cpp +31 -23
  80. package/cpp/RNScreensTurboModule.h +17 -20
  81. package/ios/RNSConvert.h +7 -0
  82. package/ios/RNSConvert.mm +24 -0
  83. package/ios/RNSModalScreen.mm +22 -0
  84. package/ios/RNSModule.mm +2 -3
  85. package/ios/RNSScreen.h +2 -1
  86. package/ios/RNSScreen.mm +35 -19
  87. package/ios/RNSScreenContainer.mm +1 -1
  88. package/ios/RNSScreenStack.mm +59 -54
  89. package/ios/RNSScreenStackAnimator.mm +43 -6
  90. package/ios/RNSScreenStackHeaderConfig.h +2 -0
  91. package/ios/RNSScreenStackHeaderConfig.mm +93 -28
  92. package/ios/RNSScreenStackHeaderSubview.mm +8 -0
  93. package/ios/RNSSearchBar.h +5 -5
  94. package/ios/RNSSearchBar.mm +11 -11
  95. package/ios/utils/RCTSurfaceTouchHandler+RNSUtility.h +15 -0
  96. package/ios/utils/RCTSurfaceTouchHandler+RNSUtility.mm +14 -0
  97. package/ios/utils/RCTTouchHandler+RNSUtility.h +15 -0
  98. package/ios/utils/RCTTouchHandler+RNSUtility.mm +15 -0
  99. package/ios/utils/UIView+RNSUtility.h +23 -0
  100. package/ios/utils/UIView+RNSUtility.mm +55 -0
  101. package/lib/commonjs/components/Screen.js +119 -127
  102. package/lib/commonjs/components/Screen.js.map +1 -1
  103. package/lib/commonjs/components/ScreenStack.js +8 -1
  104. package/lib/commonjs/components/ScreenStack.js.map +1 -1
  105. package/lib/commonjs/components/SearchBar.js +39 -36
  106. package/lib/commonjs/components/SearchBar.js.map +1 -1
  107. package/lib/commonjs/fabric/ModalScreenNativeComponent.js.map +1 -1
  108. package/lib/commonjs/fabric/ScreenNativeComponent.js.map +1 -1
  109. package/lib/commonjs/fabric/ScreenStackHeaderConfigNativeComponent.js.map +1 -1
  110. package/lib/commonjs/native-stack/views/HeaderConfig.js +2 -0
  111. package/lib/commonjs/native-stack/views/HeaderConfig.js.map +1 -1
  112. package/lib/commonjs/native-stack/views/NativeStackView.js +4 -0
  113. package/lib/commonjs/native-stack/views/NativeStackView.js.map +1 -1
  114. package/lib/module/components/Screen.js +118 -126
  115. package/lib/module/components/Screen.js.map +1 -1
  116. package/lib/module/components/ScreenStack.js +8 -1
  117. package/lib/module/components/ScreenStack.js.map +1 -1
  118. package/lib/module/components/SearchBar.js +39 -36
  119. package/lib/module/components/SearchBar.js.map +1 -1
  120. package/lib/module/fabric/ModalScreenNativeComponent.js.map +1 -1
  121. package/lib/module/fabric/ScreenNativeComponent.js.map +1 -1
  122. package/lib/module/fabric/ScreenStackHeaderConfigNativeComponent.js.map +1 -1
  123. package/lib/module/native-stack/views/HeaderConfig.js +2 -0
  124. package/lib/module/native-stack/views/HeaderConfig.js.map +1 -1
  125. package/lib/module/native-stack/views/NativeStackView.js +4 -0
  126. package/lib/module/native-stack/views/NativeStackView.js.map +1 -1
  127. package/lib/typescript/TransitionProgressContext.d.ts +1 -1
  128. package/lib/typescript/TransitionProgressContext.d.ts.map +1 -1
  129. package/lib/typescript/components/Screen.d.ts +3 -14
  130. package/lib/typescript/components/Screen.d.ts.map +1 -1
  131. package/lib/typescript/components/ScreenStack.d.ts.map +1 -1
  132. package/lib/typescript/components/SearchBar.d.ts +14 -21
  133. package/lib/typescript/components/SearchBar.d.ts.map +1 -1
  134. package/lib/typescript/fabric/ModalScreenNativeComponent.d.ts +12 -10
  135. package/lib/typescript/fabric/ModalScreenNativeComponent.d.ts.map +1 -1
  136. package/lib/typescript/fabric/ScreenNativeComponent.d.ts +12 -10
  137. package/lib/typescript/fabric/ScreenNativeComponent.d.ts.map +1 -1
  138. package/lib/typescript/fabric/ScreenStackHeaderConfigNativeComponent.d.ts +5 -3
  139. package/lib/typescript/fabric/ScreenStackHeaderConfigNativeComponent.d.ts.map +1 -1
  140. package/lib/typescript/fabric/ScreenStackHeaderSubviewNativeComponent.d.ts +1 -1
  141. package/lib/typescript/fabric/ScreenStackHeaderSubviewNativeComponent.d.ts.map +1 -1
  142. package/lib/typescript/fabric/ScreenStackNativeComponent.d.ts +1 -1
  143. package/lib/typescript/fabric/ScreenStackNativeComponent.d.ts.map +1 -1
  144. package/lib/typescript/fabric/SearchBarNativeComponent.d.ts +9 -9
  145. package/lib/typescript/fabric/SearchBarNativeComponent.d.ts.map +1 -1
  146. package/lib/typescript/gesture-handler/RNScreensTurboModule.d.ts +1 -1
  147. package/lib/typescript/gesture-handler/RNScreensTurboModule.d.ts.map +1 -1
  148. package/lib/typescript/native-stack/types.d.ts +39 -14
  149. package/lib/typescript/native-stack/types.d.ts.map +1 -1
  150. package/lib/typescript/native-stack/utils/SafeAreaProviderCompat.d.ts +1 -1
  151. package/lib/typescript/native-stack/utils/SafeAreaProviderCompat.d.ts.map +1 -1
  152. package/lib/typescript/native-stack/utils/getDefaultHeaderHeight.d.ts +1 -1
  153. package/lib/typescript/native-stack/utils/getDefaultHeaderHeight.d.ts.map +1 -1
  154. package/lib/typescript/native-stack/utils/useAnimatedHeaderHeight.d.ts +1 -1
  155. package/lib/typescript/native-stack/utils/useAnimatedHeaderHeight.d.ts.map +1 -1
  156. package/lib/typescript/native-stack/views/HeaderConfig.d.ts +2 -2
  157. package/lib/typescript/native-stack/views/HeaderConfig.d.ts.map +1 -1
  158. package/lib/typescript/native-stack/views/NativeStackView.d.ts +1 -1
  159. package/lib/typescript/native-stack/views/NativeStackView.d.ts.map +1 -1
  160. package/lib/typescript/reanimated/ReanimatedTransitionProgressContext.d.ts +1 -1
  161. package/lib/typescript/reanimated/ReanimatedTransitionProgressContext.d.ts.map +1 -1
  162. package/lib/typescript/types.d.ts +39 -13
  163. package/lib/typescript/types.d.ts.map +1 -1
  164. package/lib/typescript/useTransitionProgress.d.ts +3 -3
  165. package/native-stack/README.md +116 -98
  166. package/package.json +16 -7
  167. package/react-native.config.js +17 -15
  168. package/src/TransitionProgressContext.tsx +1 -1
  169. package/src/components/Screen.tsx +31 -37
  170. package/src/components/ScreenStack.tsx +11 -1
  171. package/src/components/ScreenStackHeaderConfig.tsx +5 -5
  172. package/src/components/ScreenStackHeaderConfig.web.tsx +6 -6
  173. package/src/components/SearchBar.tsx +77 -65
  174. package/src/core.ts +1 -1
  175. package/src/fabric/ModalScreenNativeComponent.ts +2 -0
  176. package/src/fabric/ScreenNativeComponent.ts +2 -0
  177. package/src/fabric/ScreenNavigationContainerNativeComponent.ts +1 -1
  178. package/src/fabric/ScreenStackHeaderConfigNativeComponent.ts +4 -1
  179. package/src/fabric/ScreenStackHeaderSubviewNativeComponent.ts +1 -1
  180. package/src/fabric/SearchBarNativeComponent.ts +7 -7
  181. package/src/gesture-handler/ScreenGestureDetector.tsx +5 -5
  182. package/src/gesture-handler/constraints.ts +5 -5
  183. package/src/gesture-handler/fabricUtils.ts +1 -1
  184. package/src/native-stack/contexts/GHContext.tsx +1 -1
  185. package/src/native-stack/navigators/createNativeStackNavigator.tsx +3 -3
  186. package/src/native-stack/types.tsx +29 -4
  187. package/src/native-stack/utils/getDefaultHeaderHeight.tsx +1 -1
  188. package/src/native-stack/utils/getStatusBarHeight.tsx +1 -1
  189. package/src/native-stack/utils/useAnimatedHeaderHeight.tsx +1 -1
  190. package/src/native-stack/utils/useBackPressSubscription.tsx +1 -1
  191. package/src/native-stack/utils/useHeaderHeight.tsx +1 -1
  192. package/src/native-stack/views/FontProcessor.tsx +1 -1
  193. package/src/native-stack/views/HeaderConfig.tsx +3 -1
  194. package/src/native-stack/views/NativeStackView.tsx +13 -9
  195. package/src/reanimated/ReanimatedHeaderHeightContext.tsx +1 -1
  196. package/src/reanimated/ReanimatedNativeStackScreen.tsx +5 -5
  197. package/src/reanimated/ReanimatedScreen.tsx +2 -2
  198. package/src/reanimated/ReanimatedScreenProvider.tsx +1 -1
  199. package/src/reanimated/useReanimatedHeaderHeight.tsx +1 -1
  200. package/src/reanimated/useReanimatedTransitionProgress.tsx +1 -1
  201. package/src/types.tsx +31 -5
  202. package/src/useTransitionProgress.tsx +1 -1
  203. package/windows/README.md +4 -1
package/README.md CHANGED
@@ -51,6 +51,7 @@ public class MainActivity extends ReactActivity {
51
51
  }
52
52
  }
53
53
  ```
54
+
54
55
  </details>
55
56
 
56
57
  <details>
@@ -69,6 +70,7 @@ class MainActivity: ReactActivity() {
69
70
  }
70
71
  }
71
72
  ```
73
+
72
74
  </details>
73
75
 
74
76
  For people that must handle cases like this, there is [a more detailed discussion of the difficulties in a series of related comments](https://github.com/software-mansion/react-native-screens/issues/17#issuecomment-424704633).
@@ -105,11 +107,13 @@ Screens are already integrated with the React Native's most popular navigation l
105
107
  ## Supported react-native version
106
108
 
107
109
  | library version | react-native version |
108
- | ------- | -------------------- |
109
- | 3.30.0+ | 0.68.0+ |
110
- | 3.14.0+ | 0.64.0+ |
111
- | 3.0.0+ | 0.62.0+ |
112
- | 2.0.0+ | 0.60.0+ |
110
+ | --------------- | -------------------- |
111
+ | 3.33.0+ | 0.72.0+
112
+ | 3.32.0+ | 0.71.0+ |
113
+ | 3.30.0+ | 0.68.0+ |
114
+ | 3.14.0+ | 0.64.0+ |
115
+ | 3.0.0+ | 0.62.0+ |
116
+ | 2.0.0+ | 0.60.0+ |
113
117
 
114
118
  ### Support for Fabric
115
119
 
@@ -118,12 +122,14 @@ Screens are already integrated with the React Native's most popular navigation l
118
122
  Here's a table with summary of supported `react-native` versions when Fabric is turned on.
119
123
 
120
124
  | library version | react-native version |
121
- | ------- | -------------------- |
122
- | 3.28.0+ | 0.73.0+ |
123
- | 3.21.0+ | 0.72.0+ |
124
- | 3.19.0+ | 0.71.0+ |
125
- | 3.18.0+ | 0.70.0+ |
126
- | 3.14.0+ | 0.69.0+ |
125
+ | --------------- | -------------------- |
126
+ | 3.33.0+ | 0.75.0+ |
127
+ | 3.32.0+ | 0.74.0+ |
128
+ | 3.28.0+ | 0.73.0+ |
129
+ | 3.21.0+ | 0.72.0+ |
130
+ | 3.19.0+ | 0.71.0+ |
131
+ | 3.18.0+ | 0.70.0+ |
132
+ | 3.14.0+ | 0.69.0+ |
127
133
 
128
134
  ## Usage with [react-navigation](https://github.com/react-navigation/react-navigation)
129
135
 
@@ -233,3 +239,7 @@ This project has been build and is maintained thanks to the support from [Shopif
233
239
  [![shopify](https://avatars1.githubusercontent.com/u/8085?v=3&s=100 'Shopify.com')](https://shopify.com)
234
240
  [![expo](https://avatars2.githubusercontent.com/u/12504344?v=3&s=100 'Expo.io')](https://expo.io)
235
241
  [![swm](https://logo.swmansion.com/logo?color=white&variant=desktop&width=150&tag=react-native-reanimated-github 'Software Mansion')](https://swmansion.com)
242
+
243
+ ## React Native Screens is created by Software Mansion
244
+
245
+ Since 2012 [Software Mansion](https://swmansion.com) is a software agency with experience in building web and mobile apps. We are Core React Native Contributors and experts in dealing with all kinds of React Native issues. We can help you build your next dream product – [Hire us](https://swmansion.com/contact/projects?utm_source=screens&utm_medium=readme).
package/RNScreens.podspec CHANGED
@@ -4,51 +4,7 @@ package = JSON.parse(File.read(File.join(__dir__, "package.json")))
4
4
 
5
5
  new_arch_enabled = ENV['RCT_NEW_ARCH_ENABLED'] == '1'
6
6
  platform = new_arch_enabled ? "11.0" : "9.0"
7
- source_files = new_arch_enabled ? 'ios/**/*.{h,m,mm,cpp}' : ["ios/**/*.{h,m,mm}", "cpp/**/*.{cpp,h}"]
8
-
9
- folly_compiler_flags = '-DFOLLY_NO_CONFIG -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1 -Wno-comma -Wno-shorten-64-to-32'
10
-
11
- # Helper class to avoid clashing with Cocoapods install_dependencies function
12
- class RNScreensDependencyHelper
13
- # Helper class to add the Common subspec
14
- def self.add_common_subspec(s, new_arch_enabled)
15
- unless new_arch_enabled
16
- return
17
- end
18
-
19
- s.subspec "common" do |ss|
20
- ss.source_files = ["common/cpp/**/*.{cpp,h}", "cpp/**/*.{cpp,h}"]
21
- ss.header_dir = "rnscreens"
22
- ss.pod_target_xcconfig = { "HEADER_SEARCH_PATHS" => "\"$(PODS_TARGET_SRCROOT)/common/cpp\"" }
23
- end
24
- end
25
-
26
- # Function to support older versions of React Native which do not provide the
27
- # install_modules_dependencies function
28
- def self.install_dependencies(s, new_arch_enabled)
29
- if new_arch_enabled
30
- s.pod_target_xcconfig = {
31
- 'HEADER_SEARCH_PATHS' => '"$(PODS_ROOT)/boost" "$(PODS_ROOT)/boost-for-react-native" "$(PODS_ROOT)/RCT-Folly"',
32
- "CLANG_CXX_LANGUAGE_STANDARD" => "c++17",
33
- }
34
-
35
- s.compiler_flags = folly_compiler_flags + ' ' + '-DRCT_NEW_ARCH_ENABLED'
36
-
37
- s.dependency "React"
38
- s.dependency "React-RCTFabric"
39
- s.dependency "React-Codegen"
40
- s.dependency "RCT-Folly"
41
- s.dependency "RCTRequired"
42
- s.dependency "RCTTypeSafety"
43
- s.dependency "ReactCommon/turbomodule/core"
44
-
45
- self.add_common_subspec(s, new_arch_enabled)
46
- else
47
- s.dependency "React-Core"
48
- s.dependency "React-RCTImage"
49
- end
50
- end
51
- end
7
+ source_files = new_arch_enabled ? 'ios/**/*.{h,m,mm,cpp}' : ["ios/**/*.{h,m,mm}", "cpp/RNScreensTurboModule.cpp", "cpp/RNScreensTurboModule.h"]
52
8
 
53
9
  Pod::Spec.new do |s|
54
10
  s.name = "RNScreens"
@@ -63,14 +19,17 @@ Pod::Spec.new do |s|
63
19
  s.platforms = { :ios => platform, :tvos => "11.0", :visionos => "1.0" }
64
20
  s.source = { :git => "https://github.com/software-mansion/react-native-screens.git", :tag => "#{s.version}" }
65
21
  s.source_files = source_files
22
+ s.project_header_files = "cpp/**/*.h" # Don't expose C++ headers publicly to allow importing framework into Swift files
66
23
  s.requires_arc = true
67
24
 
68
- if defined?(install_modules_dependencies()) != nil
69
- install_modules_dependencies(s)
70
- # Add missing dependencies, that were not included in install_modules_dependencies
71
- s.dependency "React-RCTImage"
72
- RNScreensDependencyHelper.add_common_subspec(s, new_arch_enabled)
73
- else
74
- RNScreensDependencyHelper.install_dependencies(s, new_arch_enabled)
25
+ install_modules_dependencies(s)
26
+ if new_arch_enabled
27
+ s.subspec "common" do |ss|
28
+ ss.source_files = ["common/cpp/**/*.{cpp,h}", "cpp/**/*.{cpp,h}"]
29
+ ss.header_dir = "rnscreens"
30
+ ss.pod_target_xcconfig = { "HEADER_SEARCH_PATHS" => "\"$(PODS_TARGET_SRCROOT)/common/cpp\"" }
31
+ end
75
32
  end
33
+
34
+ s.dependency "React-RCTImage"
76
35
  end
@@ -2,11 +2,22 @@ cmake_minimum_required(VERSION 3.9.0)
2
2
 
3
3
  project(rnscreens)
4
4
 
5
+ if(${RNS_NEW_ARCH_ENABLED})
5
6
  add_library(rnscreens
6
7
  SHARED
7
8
  ../cpp/RNScreensTurboModule.cpp
9
+ ../cpp/RNSScreenRemovalListener.cpp
8
10
  ./src/main/cpp/jni-adapter.cpp
11
+ ./src/main/cpp/NativeProxy.cpp
12
+ ./src/main/cpp/OnLoad.cpp
9
13
  )
14
+ else()
15
+ add_library(rnscreens
16
+ SHARED
17
+ ../cpp/RNScreensTurboModule.cpp
18
+ ./src/main/cpp/jni-adapter.cpp
19
+ )
20
+ endif()
10
21
 
11
22
  include_directories(
12
23
  ../cpp
@@ -19,9 +30,42 @@ set_target_properties(rnscreens PROPERTIES
19
30
  POSITION_INDEPENDENT_CODE ON
20
31
  )
21
32
 
33
+ target_compile_definitions(
34
+ rnscreens
35
+ PRIVATE
36
+ -DFOLLY_NO_CONFIG=1
37
+ )
38
+
22
39
  find_package(ReactAndroid REQUIRED CONFIG)
23
40
 
24
- target_link_libraries(rnscreens
25
- ReactAndroid::jsi
26
- android
27
- )
41
+ if(${RNS_NEW_ARCH_ENABLED})
42
+ find_package(fbjni REQUIRED CONFIG)
43
+
44
+ target_link_libraries(
45
+ rnscreens
46
+ ReactAndroid::jsi
47
+ ReactAndroid::react_nativemodule_core
48
+ ReactAndroid::react_utils
49
+ ReactAndroid::reactnativejni
50
+ ReactAndroid::fabricjni
51
+ ReactAndroid::react_debug
52
+ ReactAndroid::react_render_core
53
+ ReactAndroid::runtimeexecutor
54
+ ReactAndroid::react_render_graphics
55
+ ReactAndroid::rrc_view
56
+ ReactAndroid::yoga
57
+ ReactAndroid::rrc_text
58
+ ReactAndroid::glog
59
+ ReactAndroid::react_render_componentregistry
60
+ ReactAndroid::react_render_consistency
61
+ ReactAndroid::react_performance_timeline
62
+ ReactAndroid::react_render_observers_events
63
+ fbjni::fbjni
64
+ android
65
+ )
66
+ else()
67
+ target_link_libraries(rnscreens
68
+ ReactAndroid::jsi
69
+ android
70
+ )
71
+ endif()
@@ -18,10 +18,14 @@ buildscript {
18
18
  dependencies {
19
19
  classpath('com.android.tools.build:gradle:4.2.2')
20
20
  classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${safeExtGet('kotlinVersion', rnsDefaultKotlinVersion)}"
21
- classpath "com.diffplug.spotless:spotless-plugin-gradle:6.11.0"
21
+ classpath "com.diffplug.spotless:spotless-plugin-gradle:6.25.0"
22
22
  }
23
23
  }
24
24
 
25
+ def isRunningInContextOfScreensRepo() {
26
+ return project == rootProject
27
+ }
28
+
25
29
  def isNewArchitectureEnabled() {
26
30
  // To opt-in for the New Architecture, you can either:
27
31
  // - Set `newArchEnabled` to true inside the `gradle.properties` file
@@ -31,7 +35,7 @@ def isNewArchitectureEnabled() {
31
35
  }
32
36
 
33
37
  // spotless is only accessible within react-native-screens repo
34
- if (project == rootProject) {
38
+ if (isRunningInContextOfScreensRepo()) {
35
39
  apply from: 'spotless.gradle'
36
40
  }
37
41
 
@@ -58,7 +62,7 @@ def resolveReactNativeDirectory() {
58
62
  }
59
63
 
60
64
  def reactNativeFromAppNodeModules = file("${projectDir}/../../react-native")
61
- if (reactNativeFromAppNodeModules.exists()) {
65
+ if (!isRunningInContextOfScreensRepo() && reactNativeFromAppNodeModules.exists()) {
62
66
  return reactNativeFromAppNodeModules
63
67
  }
64
68
 
@@ -68,7 +72,7 @@ def resolveReactNativeDirectory() {
68
72
  }
69
73
 
70
74
  throw new GradleException(
71
- "[RNScreens] Unable to resolve react-native location in node_modules. You should project extension property (in `app/build.gradle`) `REACT_NATIVE_NODE_MODULES_DIR` with path to react-native."
75
+ "[RNScreens] Unable to resolve react-native location in node_modules. You should add project extension property (in `app/build.gradle`) `REACT_NATIVE_NODE_MODULES_DIR` with path to react-native."
72
76
  )
73
77
  }
74
78
 
@@ -77,6 +81,7 @@ def reactProperties = new Properties()
77
81
  file("$reactNativeRootDir/ReactAndroid/gradle.properties").withInputStream { reactProperties.load(it) }
78
82
  def REACT_NATIVE_VERSION = reactProperties.getProperty("VERSION_NAME")
79
83
  def REACT_NATIVE_MINOR_VERSION = REACT_NATIVE_VERSION.startsWith("0.0.0-") ? 1000 : REACT_NATIVE_VERSION.split("\\.")[1].toInteger()
84
+ def IS_NEW_ARCHITECTURE_ENABLED = isNewArchitectureEnabled()
80
85
 
81
86
  android {
82
87
  compileSdkVersion safeExtGet('compileSdkVersion', rnsDefaultCompileSdkVersion)
@@ -102,13 +107,14 @@ android {
102
107
  targetSdkVersion safeExtGet('targetSdkVersion', rnsDefaultTargetSdkVersion)
103
108
  versionCode 1
104
109
  versionName "1.0"
105
- buildConfigField "boolean", "IS_NEW_ARCHITECTURE_ENABLED", isNewArchitectureEnabled().toString()
110
+ buildConfigField "boolean", "IS_NEW_ARCHITECTURE_ENABLED", IS_NEW_ARCHITECTURE_ENABLED.toString()
106
111
  ndk {
107
112
  abiFilters (*reactNativeArchitectures())
108
113
  }
109
114
  externalNativeBuild {
110
115
  cmake {
111
- arguments "-DANDROID_STL=c++_shared"
116
+ arguments "-DANDROID_STL=c++_shared",
117
+ "-DRNS_NEW_ARCH_ENABLED=${IS_NEW_ARCHITECTURE_ENABLED}"
112
118
  }
113
119
  }
114
120
  }
@@ -139,20 +145,21 @@ android {
139
145
  "META-INF/**",
140
146
  "**/libjsi.so",
141
147
  "**/libc++_shared.so",
142
- "**/libreact_render*.so"
148
+ "**/libreact_render*.so",
149
+ "**/libreactnativejni.so",
150
+ "**/libreact_performance_timeline.so"
143
151
  ]
144
152
  }
145
153
  sourceSets.main {
146
154
  ext.androidResDir = "src/main/res"
147
155
  java {
148
- if (isNewArchitectureEnabled()) {
156
+ if (IS_NEW_ARCHITECTURE_ENABLED) {
149
157
  srcDirs += [
150
158
  "src/fabric/java",
151
159
  ]
152
160
  } else {
153
161
  srcDirs += [
154
162
  "src/paper/java",
155
- "build/generated/source/codegen/java"
156
163
  ]
157
164
  }
158
165
  }
@@ -5,26 +5,36 @@ import androidx.annotation.UiThread
5
5
  import com.facebook.react.bridge.ReactContext
6
6
  import com.facebook.react.bridge.WritableMap
7
7
  import com.facebook.react.bridge.WritableNativeMap
8
- import com.facebook.react.uimanager.FabricViewStateManager
9
8
  import com.facebook.react.uimanager.PixelUtil
9
+ import com.facebook.react.uimanager.StateWrapper
10
10
  import kotlin.math.abs
11
11
 
12
- abstract class FabricEnabledViewGroup constructor(context: ReactContext?) : ViewGroup(context), FabricViewStateManager.HasFabricViewStateManager {
13
- private val mFabricViewStateManager: FabricViewStateManager = FabricViewStateManager()
12
+ abstract class FabricEnabledViewGroup(
13
+ context: ReactContext?,
14
+ ) : ViewGroup(context) {
15
+ private var mStateWrapper: StateWrapper? = null
14
16
 
15
17
  private var lastSetWidth = 0f
16
18
  private var lastSetHeight = 0f
17
19
 
18
- override fun getFabricViewStateManager(): FabricViewStateManager {
19
- return mFabricViewStateManager
20
+ fun setStateWrapper(wrapper: StateWrapper?) {
21
+ mStateWrapper = wrapper
20
22
  }
21
23
 
22
- protected fun updateScreenSizeFabric(width: Int, height: Int, headerHeight: Double) {
24
+ protected fun updateScreenSizeFabric(
25
+ width: Int,
26
+ height: Int,
27
+ headerHeight: Double,
28
+ ) {
23
29
  updateState(width, height, headerHeight)
24
30
  }
25
31
 
26
32
  @UiThread
27
- fun updateState(width: Int, height: Int, headerHeight: Double) {
33
+ fun updateState(
34
+ width: Int,
35
+ height: Int,
36
+ headerHeight: Double,
37
+ ) {
28
38
  val realWidth: Float = PixelUtil.toDIPFromPixel(width.toFloat())
29
39
  val realHeight: Float = PixelUtil.toDIPFromPixel(height.toFloat())
30
40
 
@@ -39,14 +49,13 @@ abstract class FabricEnabledViewGroup constructor(context: ReactContext?) : View
39
49
 
40
50
  lastSetWidth = realWidth
41
51
  lastSetHeight = realHeight
42
-
43
- mFabricViewStateManager.setState {
44
- val map: WritableMap = WritableNativeMap()
45
- map.putDouble("frameWidth", realWidth.toDouble())
46
- map.putDouble("frameHeight", realHeight.toDouble())
47
- map.putDouble("contentOffsetX", 0.0)
48
- map.putDouble("contentOffsetY", headerHeight)
49
- map
50
- }
52
+ val map: WritableMap =
53
+ WritableNativeMap().apply {
54
+ putDouble("frameWidth", realWidth.toDouble())
55
+ putDouble("frameHeight", realHeight.toDouble())
56
+ putDouble("contentOffsetX", 0.0)
57
+ putDouble("contentOffsetY", headerHeight)
58
+ }
59
+ mStateWrapper?.updateState(map)
51
60
  }
52
61
  }
@@ -0,0 +1,53 @@
1
+ package com.swmansion.rnscreens
2
+
3
+ import android.util.Log
4
+ import com.facebook.jni.HybridData
5
+ import com.facebook.proguard.annotations.DoNotStrip
6
+ import com.facebook.react.fabric.FabricUIManager
7
+ import java.lang.ref.WeakReference
8
+ import java.util.concurrent.ConcurrentHashMap
9
+
10
+ class NativeProxy {
11
+ @DoNotStrip
12
+ @Suppress("unused")
13
+ private val mHybridData: HybridData
14
+
15
+ init {
16
+ mHybridData = initHybrid()
17
+ }
18
+
19
+ private external fun initHybrid(): HybridData
20
+
21
+ external fun nativeAddMutationsListener(fabricUIManager: FabricUIManager)
22
+
23
+ companion object {
24
+ // we use ConcurrentHashMap here since it will be read on the JS thread,
25
+ // and written to on the UI thread.
26
+ private val viewsMap = ConcurrentHashMap<Int, WeakReference<Screen>>()
27
+
28
+ fun addScreenToMap(
29
+ tag: Int,
30
+ view: Screen,
31
+ ) {
32
+ viewsMap[tag] = WeakReference(view)
33
+ }
34
+
35
+ fun removeScreenFromMap(tag: Int) {
36
+ viewsMap.remove(tag)
37
+ }
38
+
39
+ fun clearMapOnInvalidate() {
40
+ viewsMap.clear()
41
+ }
42
+ }
43
+
44
+ @DoNotStrip
45
+ public fun notifyScreenRemoved(screenTag: Int) {
46
+ val screen = viewsMap[screenTag]?.get()
47
+ if (screen is Screen) {
48
+ screen.startRemovalTransition()
49
+ } else {
50
+ Log.w("[RNScreens]", "Did not find view with tag $screenTag.")
51
+ }
52
+ }
53
+ }
@@ -0,0 +1,51 @@
1
+ #include <fbjni/fbjni.h>
2
+ #include <react/fabric/Binding.h>
3
+ #include <react/renderer/scheduler/Scheduler.h>
4
+
5
+ #include <string>
6
+
7
+ #include "NativeProxy.h"
8
+
9
+ using namespace facebook;
10
+ using namespace react;
11
+
12
+ namespace rnscreens {
13
+
14
+ NativeProxy::NativeProxy(jni::alias_ref<NativeProxy::javaobject> jThis)
15
+ : javaPart_(jni::make_global(jThis)) {}
16
+
17
+ NativeProxy::~NativeProxy() {}
18
+
19
+ void NativeProxy::registerNatives() {
20
+ registerHybrid(
21
+ {makeNativeMethod("initHybrid", NativeProxy::initHybrid),
22
+ makeNativeMethod(
23
+ "nativeAddMutationsListener",
24
+ NativeProxy::nativeAddMutationsListener)});
25
+ }
26
+
27
+ void NativeProxy::nativeAddMutationsListener(
28
+ jni::alias_ref<facebook::react::JFabricUIManager::javaobject>
29
+ fabricUIManager) {
30
+ auto uiManager =
31
+ fabricUIManager->getBinding()->getScheduler()->getUIManager();
32
+ screenRemovalListener_ =
33
+ std::make_shared<RNSScreenRemovalListener>([this](int tag) {
34
+ static const auto method =
35
+ javaPart_->getClass()->getMethod<void(jint)>("notifyScreenRemoved");
36
+ method(javaPart_, tag);
37
+ });
38
+
39
+ uiManager->getShadowTreeRegistry().enumerate(
40
+ [this](const facebook::react::ShadowTree &shadowTree, bool &stop) {
41
+ shadowTree.getMountingCoordinator()->setMountingOverrideDelegate(
42
+ screenRemovalListener_);
43
+ });
44
+ }
45
+
46
+ jni::local_ref<NativeProxy::jhybriddata> NativeProxy::initHybrid(
47
+ jni::alias_ref<jhybridobject> jThis) {
48
+ return makeCxxInstance(jThis);
49
+ }
50
+
51
+ } // namespace rnscreens
@@ -0,0 +1,35 @@
1
+ #pragma once
2
+
3
+ #include <fbjni/fbjni.h>
4
+ #include <react/fabric/JFabricUIManager.h>
5
+ #include "RNSScreenRemovalListener.h"
6
+
7
+ #include <string>
8
+
9
+ namespace rnscreens {
10
+ using namespace facebook;
11
+ using namespace facebook::jni;
12
+
13
+ class NativeProxy : public jni::HybridClass<NativeProxy> {
14
+ public:
15
+ std::shared_ptr<RNSScreenRemovalListener> screenRemovalListener_;
16
+ static auto constexpr kJavaDescriptor =
17
+ "Lcom/swmansion/rnscreens/NativeProxy;";
18
+ static jni::local_ref<jhybriddata> initHybrid(
19
+ jni::alias_ref<jhybridobject> jThis);
20
+ static void registerNatives();
21
+
22
+ ~NativeProxy();
23
+
24
+ private:
25
+ friend HybridBase;
26
+ jni::global_ref<NativeProxy::javaobject> javaPart_;
27
+
28
+ explicit NativeProxy(jni::alias_ref<NativeProxy::javaobject> jThis);
29
+
30
+ void nativeAddMutationsListener(
31
+ jni::alias_ref<facebook::react::JFabricUIManager::javaobject>
32
+ fabricUIManager);
33
+ };
34
+
35
+ } // namespace rnscreens
@@ -0,0 +1,8 @@
1
+ #include <fbjni/fbjni.h>
2
+
3
+ #include "NativeProxy.h"
4
+
5
+ JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *) {
6
+ return facebook::jni::initialize(
7
+ vm, [] { rnscreens::NativeProxy::registerNatives(); });
8
+ }