react-native-screens 3.32.0 → 3.34.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 (142) hide show
  1. package/README.md +17 -13
  2. package/RNScreens.podspec +10 -52
  3. package/android/CMakeLists.txt +48 -4
  4. package/android/build.gradle +9 -81
  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/java/com/swmansion/rnscreens/CustomSearchView.kt +5 -2
  11. package/android/src/main/java/com/swmansion/rnscreens/CustomToolbar.kt +4 -1
  12. package/android/src/main/java/com/swmansion/rnscreens/FragmentBackPressOverrider.kt +2 -2
  13. package/android/src/main/java/com/swmansion/rnscreens/RNScreensPackage.kt +36 -17
  14. package/android/src/main/java/com/swmansion/rnscreens/Screen.kt +134 -38
  15. package/android/src/main/java/com/swmansion/rnscreens/ScreenContainer.kt +52 -30
  16. package/android/src/main/java/com/swmansion/rnscreens/ScreenContainerViewManager.kt +17 -7
  17. package/android/src/main/java/com/swmansion/rnscreens/ScreenEventDispatcher.kt +10 -2
  18. package/android/src/main/java/com/swmansion/rnscreens/ScreenFragment.kt +56 -27
  19. package/android/src/main/java/com/swmansion/rnscreens/ScreenFragmentWrapper.kt +8 -1
  20. package/android/src/main/java/com/swmansion/rnscreens/ScreenStack.kt +50 -19
  21. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackFragment.kt +60 -37
  22. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackFragmentWrapper.kt +4 -0
  23. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfig.kt +85 -58
  24. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfigViewManager.kt +128 -37
  25. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderSubview.kt +19 -4
  26. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderSubviewManager.kt +16 -10
  27. package/android/src/main/java/com/swmansion/rnscreens/ScreenStackViewManager.kt +28 -25
  28. package/android/src/main/java/com/swmansion/rnscreens/ScreenViewManager.kt +173 -78
  29. package/android/src/main/java/com/swmansion/rnscreens/ScreenWindowTraits.kt +59 -24
  30. package/android/src/main/java/com/swmansion/rnscreens/ScreensModule.kt +30 -8
  31. package/android/src/main/java/com/swmansion/rnscreens/ScreensShadowNode.kt +3 -1
  32. package/android/src/main/java/com/swmansion/rnscreens/SearchBarManager.kt +101 -50
  33. package/android/src/main/java/com/swmansion/rnscreens/SearchBarView.kt +29 -22
  34. package/android/src/main/java/com/swmansion/rnscreens/SearchViewFormatter.kt +7 -2
  35. package/android/src/main/java/com/swmansion/rnscreens/events/HeaderAttachedEvent.kt +4 -1
  36. package/android/src/main/java/com/swmansion/rnscreens/events/HeaderBackButtonClickedEvent.kt +4 -1
  37. package/android/src/main/java/com/swmansion/rnscreens/events/HeaderDetachedEvent.kt +4 -1
  38. package/android/src/main/java/com/swmansion/rnscreens/events/HeaderHeightChangeEvent.kt +5 -5
  39. package/android/src/main/java/com/swmansion/rnscreens/events/ScreenAppearEvent.kt +4 -1
  40. package/android/src/main/java/com/swmansion/rnscreens/events/ScreenDisappearEvent.kt +4 -1
  41. package/android/src/main/java/com/swmansion/rnscreens/events/ScreenDismissedEvent.kt +8 -4
  42. package/android/src/main/java/com/swmansion/rnscreens/events/ScreenTransitionProgressEvent.kt +7 -6
  43. package/android/src/main/java/com/swmansion/rnscreens/events/ScreenWillAppearEvent.kt +4 -1
  44. package/android/src/main/java/com/swmansion/rnscreens/events/ScreenWillDisappearEvent.kt +4 -1
  45. package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarBlurEvent.kt +4 -1
  46. package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarChangeTextEvent.kt +4 -3
  47. package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarCloseEvent.kt +4 -1
  48. package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarFocusEvent.kt +4 -1
  49. package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarOpenEvent.kt +4 -1
  50. package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarSearchButtonPressEvent.kt +9 -4
  51. package/android/src/main/java/com/swmansion/rnscreens/events/StackFinishTransitioningEvent.kt +4 -1
  52. package/android/src/main/java/com/swmansion/rnscreens/utils/DeviceUtils.kt +1 -5
  53. package/android/src/main/java/com/swmansion/rnscreens/utils/ScreenDummyLayoutHelper.kt +245 -0
  54. package/android/src/main/jni/CMakeLists.txt +5 -4
  55. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenManagerDelegate.java +3 -0
  56. package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenManagerInterface.java +1 -0
  57. package/android/src/paper/java/com/swmansion/rnscreens/FabricEnabledViewGroup.kt +10 -5
  58. package/android/src/paper/java/com/swmansion/rnscreens/NativeProxy.kt +19 -0
  59. package/android/src/paper/java/com/swmansion/rnscreens/NativeScreensModuleSpec.java +4 -0
  60. package/common/cpp/react/renderer/components/rnscreens/FrameCorrectionModes.h +51 -0
  61. package/common/cpp/react/renderer/components/rnscreens/RNSModalScreenShadowNode.cpp +2 -1
  62. package/common/cpp/react/renderer/components/rnscreens/RNSModalScreenShadowNode.h +1 -1
  63. package/common/cpp/react/renderer/components/rnscreens/RNSScreenComponentDescriptor.h +140 -1
  64. package/common/cpp/react/renderer/components/rnscreens/RNSScreenShadowNode.cpp +51 -1
  65. package/common/cpp/react/renderer/components/rnscreens/RNSScreenShadowNode.h +23 -1
  66. package/common/cpp/react/renderer/components/rnscreens/RNSScreenState.cpp +20 -0
  67. package/common/cpp/react/renderer/components/rnscreens/RNSScreenState.h +23 -1
  68. package/common/cpp/react/renderer/components/rnscreens/utils/RectUtil.h +36 -0
  69. package/cpp/RNSScreenRemovalListener.cpp +25 -0
  70. package/cpp/RNSScreenRemovalListener.h +20 -0
  71. package/ios/RNSConvert.h +1 -0
  72. package/ios/RNSModalScreen.mm +22 -0
  73. package/ios/RNSModule.mm +1 -1
  74. package/ios/RNSScreen.h +2 -1
  75. package/ios/RNSScreen.mm +27 -19
  76. package/ios/RNSScreenStack.mm +24 -77
  77. package/ios/RNSScreenStackAnimator.mm +43 -6
  78. package/ios/RNSScreenStackHeaderConfig.mm +49 -11
  79. package/ios/RNSScreenStackHeaderSubview.mm +8 -0
  80. package/ios/utils/UIView+RNSUtility.h +23 -0
  81. package/ios/utils/UIView+RNSUtility.mm +55 -0
  82. package/lib/commonjs/components/ScreenStack.js +8 -1
  83. package/lib/commonjs/components/ScreenStack.js.map +1 -1
  84. package/lib/commonjs/fabric/ModalScreenNativeComponent.js.map +1 -1
  85. package/lib/commonjs/fabric/ScreenNativeComponent.js.map +1 -1
  86. package/lib/commonjs/native-stack/views/NativeStackView.js +2 -0
  87. package/lib/commonjs/native-stack/views/NativeStackView.js.map +1 -1
  88. package/lib/module/components/ScreenStack.js +8 -1
  89. package/lib/module/components/ScreenStack.js.map +1 -1
  90. package/lib/module/fabric/ModalScreenNativeComponent.js.map +1 -1
  91. package/lib/module/fabric/ScreenNativeComponent.js.map +1 -1
  92. package/lib/module/native-stack/views/NativeStackView.js +2 -0
  93. package/lib/module/native-stack/views/NativeStackView.js.map +1 -1
  94. package/lib/typescript/components/ScreenStack.d.ts.map +1 -1
  95. package/lib/typescript/fabric/ModalScreenNativeComponent.d.ts +1 -0
  96. package/lib/typescript/fabric/ModalScreenNativeComponent.d.ts.map +1 -1
  97. package/lib/typescript/fabric/ScreenNativeComponent.d.ts +1 -0
  98. package/lib/typescript/fabric/ScreenNativeComponent.d.ts.map +1 -1
  99. package/lib/typescript/native-stack/types.d.ts +10 -0
  100. package/lib/typescript/native-stack/types.d.ts.map +1 -1
  101. package/lib/typescript/native-stack/views/NativeStackView.d.ts.map +1 -1
  102. package/lib/typescript/types.d.ts +10 -0
  103. package/lib/typescript/types.d.ts.map +1 -1
  104. package/native-stack/README.md +110 -99
  105. package/package.json +6 -3
  106. package/react-native.config.js +17 -15
  107. package/src/TransitionProgressContext.tsx +1 -1
  108. package/src/components/Screen.tsx +4 -4
  109. package/src/components/ScreenStack.tsx +11 -1
  110. package/src/components/ScreenStackHeaderConfig.tsx +5 -5
  111. package/src/components/ScreenStackHeaderConfig.web.tsx +6 -6
  112. package/src/components/SearchBar.tsx +4 -4
  113. package/src/core.ts +1 -1
  114. package/src/fabric/ModalScreenNativeComponent.ts +1 -0
  115. package/src/fabric/ScreenNativeComponent.ts +1 -0
  116. package/src/fabric/ScreenNavigationContainerNativeComponent.ts +1 -1
  117. package/src/fabric/ScreenStackHeaderConfigNativeComponent.ts +1 -1
  118. package/src/fabric/ScreenStackHeaderSubviewNativeComponent.ts +1 -1
  119. package/src/fabric/SearchBarNativeComponent.ts +1 -1
  120. package/src/gesture-handler/ScreenGestureDetector.tsx +5 -5
  121. package/src/gesture-handler/constraints.ts +5 -5
  122. package/src/gesture-handler/fabricUtils.ts +1 -1
  123. package/src/native-stack/contexts/GHContext.tsx +1 -1
  124. package/src/native-stack/navigators/createNativeStackNavigator.tsx +3 -3
  125. package/src/native-stack/types.tsx +14 -4
  126. package/src/native-stack/utils/getDefaultHeaderHeight.tsx +1 -1
  127. package/src/native-stack/utils/getStatusBarHeight.tsx +1 -1
  128. package/src/native-stack/utils/useAnimatedHeaderHeight.tsx +1 -1
  129. package/src/native-stack/utils/useBackPressSubscription.tsx +1 -1
  130. package/src/native-stack/utils/useHeaderHeight.tsx +1 -1
  131. package/src/native-stack/views/FontProcessor.tsx +1 -1
  132. package/src/native-stack/views/HeaderConfig.tsx +1 -1
  133. package/src/native-stack/views/NativeStackView.tsx +11 -9
  134. package/src/reanimated/ReanimatedHeaderHeightContext.tsx +1 -1
  135. package/src/reanimated/ReanimatedNativeStackScreen.tsx +5 -5
  136. package/src/reanimated/ReanimatedScreen.tsx +2 -2
  137. package/src/reanimated/ReanimatedScreenProvider.tsx +1 -1
  138. package/src/reanimated/useReanimatedHeaderHeight.tsx +1 -1
  139. package/src/reanimated/useReanimatedTransitionProgress.tsx +1 -1
  140. package/src/types.tsx +15 -5
  141. package/src/useTransitionProgress.tsx +1 -1
  142. 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,12 +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.32.0+ | 0.71.0+ |
110
- | 3.30.0+ | 0.68.0+ |
111
- | 3.14.0+ | 0.64.0+ |
112
- | 3.0.0+ | 0.62.0+ |
113
- | 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+ |
114
117
 
115
118
  ### Support for Fabric
116
119
 
@@ -119,13 +122,14 @@ Screens are already integrated with the React Native's most popular navigation l
119
122
  Here's a table with summary of supported `react-native` versions when Fabric is turned on.
120
123
 
121
124
  | library version | react-native version |
122
- | ------- | -------------------- |
123
- | 3.32.0+ | 0.74.0+ |
124
- | 3.28.0+ | 0.73.0+ |
125
- | 3.21.0+ | 0.72.0+ |
126
- | 3.19.0+ | 0.71.0+ |
127
- | 3.18.0+ | 0.70.0+ |
128
- | 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+ |
129
133
 
130
134
  ## Usage with [react-navigation](https://github.com/react-navigation/react-navigation)
131
135
 
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"
@@ -66,12 +22,14 @@ Pod::Spec.new do |s|
66
22
  s.project_header_files = "cpp/**/*.h" # Don't expose C++ headers publicly to allow importing framework into Swift files
67
23
  s.requires_arc = true
68
24
 
69
- if defined?(install_modules_dependencies()) != nil
70
- install_modules_dependencies(s)
71
- # Add missing dependencies, that were not included in install_modules_dependencies
72
- s.dependency "React-RCTImage"
73
- RNScreensDependencyHelper.add_common_subspec(s, new_arch_enabled)
74
- else
75
- 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
76
32
  end
33
+
34
+ s.dependency "React-RCTImage"
77
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,7 +18,7 @@ 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
 
@@ -81,6 +81,7 @@ def reactProperties = new Properties()
81
81
  file("$reactNativeRootDir/ReactAndroid/gradle.properties").withInputStream { reactProperties.load(it) }
82
82
  def REACT_NATIVE_VERSION = reactProperties.getProperty("VERSION_NAME")
83
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()
84
85
 
85
86
  android {
86
87
  compileSdkVersion safeExtGet('compileSdkVersion', rnsDefaultCompileSdkVersion)
@@ -106,13 +107,14 @@ android {
106
107
  targetSdkVersion safeExtGet('targetSdkVersion', rnsDefaultTargetSdkVersion)
107
108
  versionCode 1
108
109
  versionName "1.0"
109
- buildConfigField "boolean", "IS_NEW_ARCHITECTURE_ENABLED", isNewArchitectureEnabled().toString()
110
+ buildConfigField "boolean", "IS_NEW_ARCHITECTURE_ENABLED", IS_NEW_ARCHITECTURE_ENABLED.toString()
110
111
  ndk {
111
112
  abiFilters (*reactNativeArchitectures())
112
113
  }
113
114
  externalNativeBuild {
114
115
  cmake {
115
- arguments "-DANDROID_STL=c++_shared"
116
+ arguments "-DANDROID_STL=c++_shared",
117
+ "-DRNS_NEW_ARCH_ENABLED=${IS_NEW_ARCHITECTURE_ENABLED}"
116
118
  }
117
119
  }
118
120
  }
@@ -143,13 +145,15 @@ android {
143
145
  "META-INF/**",
144
146
  "**/libjsi.so",
145
147
  "**/libc++_shared.so",
146
- "**/libreact_render*.so"
148
+ "**/libreact_render*.so",
149
+ "**/libreactnativejni.so",
150
+ "**/libreact_performance_timeline.so"
147
151
  ]
148
152
  }
149
153
  sourceSets.main {
150
154
  ext.androidResDir = "src/main/res"
151
155
  java {
152
- if (isNewArchitectureEnabled()) {
156
+ if (IS_NEW_ARCHITECTURE_ENABLED) {
153
157
  srcDirs += [
154
158
  "src/fabric/java",
155
159
  ]
@@ -196,79 +200,3 @@ dependencies {
196
200
  }
197
201
  }
198
202
  }
199
-
200
- def isScreensExampleApp() {
201
- return project.hasProperty('isScreensExampleApp') && project.property('isScreensExampleApp') == "true"
202
- }
203
-
204
- def getAbsoluteCodegenArtifactsPaperDestination() {
205
- if (!project.hasProperty('codegenArtifactsPaperDestination')) {
206
- throw new Exception('[RNScreens] Please fill codegenArtifactsPaperDestination variable in android/gradle.properties correct path to paper paper destination')
207
- }
208
-
209
- return "${project.rootDir}/../../${project.property('codegenArtifactsPaperDestination')}"
210
- }
211
-
212
- def getAbsoluteCodegenArtifactsSource() {
213
- if (!project.hasProperty('codegenArtifactsSource')) {
214
- throw new Exception('[RNScreens] Please fill codegenArtifactsSource variable in android/gradle.properties correct path to codegenerated artifacts')
215
- }
216
-
217
- return "${project.rootDir}/../../${project.property('codegenArtifactsSource')}"
218
- }
219
-
220
-
221
- tasks.register("copyCodegenArtifacts") {
222
- group 'After build tasks'
223
- description 'Tasks which copy codegen artifacts to paper architecture'
224
-
225
- if (!isScreensExampleApp() || !isNewArchitectureEnabled()) {
226
- return
227
- }
228
-
229
- dependsOn tasks.generateCodegenArtifactsFromSchema
230
-
231
- doLast {
232
-
233
- def absoluteCodegenArtifactsPaperDestination = getAbsoluteCodegenArtifactsPaperDestination()
234
- def absoluteCodegenArtifactsSource = getAbsoluteCodegenArtifactsSource()
235
-
236
- def existingFiles = fileTree(absoluteCodegenArtifactsPaperDestination).matching {
237
- include '**/*.java'
238
- }
239
-
240
- def generatedFiles = fileTree(absoluteCodegenArtifactsSource).matching {
241
- include '**/*.java'
242
- }
243
-
244
- def existingFilesMap = [:]
245
-
246
- existingFiles.forEach { existingFile ->
247
- existingFilesMap[existingFile.name] = 1
248
- }
249
-
250
- generatedFiles.forEach { generatedFile ->
251
- if (!existingFilesMap.containsKey(generatedFile.name)) {
252
- logger.warn("[RNScreens] ${generatedFile.name} not found in paper dir, if it's used in Android you need to copy it manually and implement yourself before using auto-copy feature")
253
- }
254
- }
255
-
256
- if (existingFiles.size() == 0) {
257
- logger.warn("[RNScreens] Paper destination with codegen interfaces is empty. This might be okay if you don't have any interfaces/delegates used in Android, if that's not the case please check if codegenArtifactsPaperDestination in android/gradle.properties is correct")
258
- }
259
-
260
- if (existingFiles.size() > generatedFiles.size()) {
261
- throw new Exception("[RNScreens] Number od generated artifacts should be greather then or equal to paper interfaces. Please check if codegenArtifactsSource in android/gradle.properties is correct")
262
- }
263
-
264
- copy {
265
- from absoluteCodegenArtifactsSource
266
- include existingFiles.collect { it.name }
267
- into absoluteCodegenArtifactsPaperDestination
268
- }
269
- }
270
- }
271
-
272
- if (isScreensExampleApp() && isNewArchitectureEnabled()) {
273
- tasks.generateCodegenArtifactsFromSchema.finalizedBy('copyCodegenArtifacts')
274
- }
@@ -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
+ }
@@ -7,14 +7,17 @@ import androidx.appcompat.widget.SearchView
7
7
  import androidx.fragment.app.Fragment
8
8
 
9
9
  @SuppressLint("ViewConstructor") // Only we construct this view, it is never inflated.
10
- class CustomSearchView(context: Context, fragment: Fragment) : SearchView(context) {
10
+ class CustomSearchView(
11
+ context: Context,
12
+ fragment: Fragment,
13
+ ) : SearchView(context) {
11
14
  /*
12
15
  CustomSearchView uses some variables from SearchView. They are listed below with links to documentation
13
16
  isIconified - https://developer.android.com/reference/android/widget/SearchView#setIconified(boolean)
14
17
  maxWidth - https://developer.android.com/reference/android/widget/SearchView#setMaxWidth(int)
15
18
  setOnSearchClickListener - https://developer.android.com/reference/android/widget/SearchView#setOnSearchClickListener(android.view.View.OnClickListener)
16
19
  setOnCloseListener - https://developer.android.com/reference/android/widget/SearchView#setOnCloseListener(android.widget.SearchView.OnCloseListener)
17
- */
20
+ */
18
21
  private var onCloseListener: OnCloseListener? = null
19
22
  private var onSearchClickedListener: OnClickListener? = null
20
23
 
@@ -6,4 +6,7 @@ import androidx.appcompat.widget.Toolbar
6
6
 
7
7
  // This class is used to store config closer to search bar
8
8
  @SuppressLint("ViewConstructor") // Only we construct this view, it is never inflated.
9
- open class CustomToolbar(context: Context, val config: ScreenStackHeaderConfig) : Toolbar(context)
9
+ open class CustomToolbar(
10
+ context: Context,
11
+ val config: ScreenStackHeaderConfig,
12
+ ) : Toolbar(context)
@@ -5,7 +5,7 @@ import androidx.fragment.app.Fragment
5
5
 
6
6
  class FragmentBackPressOverrider(
7
7
  private val fragment: Fragment,
8
- private val onBackPressedCallback: OnBackPressedCallback
8
+ private val onBackPressedCallback: OnBackPressedCallback,
9
9
  ) {
10
10
  private var isCallbackAdded: Boolean = false
11
11
  var overrideBackAction: Boolean = true
@@ -14,7 +14,7 @@ class FragmentBackPressOverrider(
14
14
  if (!isCallbackAdded && overrideBackAction) {
15
15
  fragment.activity?.onBackPressedDispatcher?.addCallback(
16
16
  fragment,
17
- onBackPressedCallback
17
+ onBackPressedCallback,
18
18
  )
19
19
  isCallbackAdded = true
20
20
  }