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.
- package/README.md +17 -13
- package/RNScreens.podspec +10 -52
- package/android/CMakeLists.txt +48 -4
- package/android/build.gradle +9 -81
- package/android/src/fabric/java/com/swmansion/rnscreens/FabricEnabledViewGroup.kt +25 -16
- package/android/src/fabric/java/com/swmansion/rnscreens/NativeProxy.kt +53 -0
- package/android/src/main/cpp/NativeProxy.cpp +51 -0
- package/android/src/main/cpp/NativeProxy.h +35 -0
- package/android/src/main/cpp/OnLoad.cpp +8 -0
- package/android/src/main/java/com/swmansion/rnscreens/CustomSearchView.kt +5 -2
- package/android/src/main/java/com/swmansion/rnscreens/CustomToolbar.kt +4 -1
- package/android/src/main/java/com/swmansion/rnscreens/FragmentBackPressOverrider.kt +2 -2
- package/android/src/main/java/com/swmansion/rnscreens/RNScreensPackage.kt +36 -17
- package/android/src/main/java/com/swmansion/rnscreens/Screen.kt +134 -38
- package/android/src/main/java/com/swmansion/rnscreens/ScreenContainer.kt +52 -30
- package/android/src/main/java/com/swmansion/rnscreens/ScreenContainerViewManager.kt +17 -7
- package/android/src/main/java/com/swmansion/rnscreens/ScreenEventDispatcher.kt +10 -2
- package/android/src/main/java/com/swmansion/rnscreens/ScreenFragment.kt +56 -27
- package/android/src/main/java/com/swmansion/rnscreens/ScreenFragmentWrapper.kt +8 -1
- package/android/src/main/java/com/swmansion/rnscreens/ScreenStack.kt +50 -19
- package/android/src/main/java/com/swmansion/rnscreens/ScreenStackFragment.kt +60 -37
- package/android/src/main/java/com/swmansion/rnscreens/ScreenStackFragmentWrapper.kt +4 -0
- package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfig.kt +85 -58
- package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfigViewManager.kt +128 -37
- package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderSubview.kt +19 -4
- package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderSubviewManager.kt +16 -10
- package/android/src/main/java/com/swmansion/rnscreens/ScreenStackViewManager.kt +28 -25
- package/android/src/main/java/com/swmansion/rnscreens/ScreenViewManager.kt +173 -78
- package/android/src/main/java/com/swmansion/rnscreens/ScreenWindowTraits.kt +59 -24
- package/android/src/main/java/com/swmansion/rnscreens/ScreensModule.kt +30 -8
- package/android/src/main/java/com/swmansion/rnscreens/ScreensShadowNode.kt +3 -1
- package/android/src/main/java/com/swmansion/rnscreens/SearchBarManager.kt +101 -50
- package/android/src/main/java/com/swmansion/rnscreens/SearchBarView.kt +29 -22
- package/android/src/main/java/com/swmansion/rnscreens/SearchViewFormatter.kt +7 -2
- package/android/src/main/java/com/swmansion/rnscreens/events/HeaderAttachedEvent.kt +4 -1
- package/android/src/main/java/com/swmansion/rnscreens/events/HeaderBackButtonClickedEvent.kt +4 -1
- package/android/src/main/java/com/swmansion/rnscreens/events/HeaderDetachedEvent.kt +4 -1
- package/android/src/main/java/com/swmansion/rnscreens/events/HeaderHeightChangeEvent.kt +5 -5
- package/android/src/main/java/com/swmansion/rnscreens/events/ScreenAppearEvent.kt +4 -1
- package/android/src/main/java/com/swmansion/rnscreens/events/ScreenDisappearEvent.kt +4 -1
- package/android/src/main/java/com/swmansion/rnscreens/events/ScreenDismissedEvent.kt +8 -4
- package/android/src/main/java/com/swmansion/rnscreens/events/ScreenTransitionProgressEvent.kt +7 -6
- package/android/src/main/java/com/swmansion/rnscreens/events/ScreenWillAppearEvent.kt +4 -1
- package/android/src/main/java/com/swmansion/rnscreens/events/ScreenWillDisappearEvent.kt +4 -1
- package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarBlurEvent.kt +4 -1
- package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarChangeTextEvent.kt +4 -3
- package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarCloseEvent.kt +4 -1
- package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarFocusEvent.kt +4 -1
- package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarOpenEvent.kt +4 -1
- package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarSearchButtonPressEvent.kt +9 -4
- package/android/src/main/java/com/swmansion/rnscreens/events/StackFinishTransitioningEvent.kt +4 -1
- package/android/src/main/java/com/swmansion/rnscreens/utils/DeviceUtils.kt +1 -5
- package/android/src/main/java/com/swmansion/rnscreens/utils/ScreenDummyLayoutHelper.kt +245 -0
- package/android/src/main/jni/CMakeLists.txt +5 -4
- package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenManagerDelegate.java +3 -0
- package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenManagerInterface.java +1 -0
- package/android/src/paper/java/com/swmansion/rnscreens/FabricEnabledViewGroup.kt +10 -5
- package/android/src/paper/java/com/swmansion/rnscreens/NativeProxy.kt +19 -0
- package/android/src/paper/java/com/swmansion/rnscreens/NativeScreensModuleSpec.java +4 -0
- package/common/cpp/react/renderer/components/rnscreens/FrameCorrectionModes.h +51 -0
- package/common/cpp/react/renderer/components/rnscreens/RNSModalScreenShadowNode.cpp +2 -1
- package/common/cpp/react/renderer/components/rnscreens/RNSModalScreenShadowNode.h +1 -1
- package/common/cpp/react/renderer/components/rnscreens/RNSScreenComponentDescriptor.h +140 -1
- package/common/cpp/react/renderer/components/rnscreens/RNSScreenShadowNode.cpp +51 -1
- package/common/cpp/react/renderer/components/rnscreens/RNSScreenShadowNode.h +23 -1
- package/common/cpp/react/renderer/components/rnscreens/RNSScreenState.cpp +20 -0
- package/common/cpp/react/renderer/components/rnscreens/RNSScreenState.h +23 -1
- package/common/cpp/react/renderer/components/rnscreens/utils/RectUtil.h +36 -0
- package/cpp/RNSScreenRemovalListener.cpp +25 -0
- package/cpp/RNSScreenRemovalListener.h +20 -0
- package/ios/RNSConvert.h +1 -0
- package/ios/RNSModalScreen.mm +22 -0
- package/ios/RNSModule.mm +1 -1
- package/ios/RNSScreen.h +2 -1
- package/ios/RNSScreen.mm +27 -19
- package/ios/RNSScreenStack.mm +24 -77
- package/ios/RNSScreenStackAnimator.mm +43 -6
- package/ios/RNSScreenStackHeaderConfig.mm +49 -11
- package/ios/RNSScreenStackHeaderSubview.mm +8 -0
- package/ios/utils/UIView+RNSUtility.h +23 -0
- package/ios/utils/UIView+RNSUtility.mm +55 -0
- package/lib/commonjs/components/ScreenStack.js +8 -1
- package/lib/commonjs/components/ScreenStack.js.map +1 -1
- package/lib/commonjs/fabric/ModalScreenNativeComponent.js.map +1 -1
- package/lib/commonjs/fabric/ScreenNativeComponent.js.map +1 -1
- package/lib/commonjs/native-stack/views/NativeStackView.js +2 -0
- package/lib/commonjs/native-stack/views/NativeStackView.js.map +1 -1
- package/lib/module/components/ScreenStack.js +8 -1
- package/lib/module/components/ScreenStack.js.map +1 -1
- package/lib/module/fabric/ModalScreenNativeComponent.js.map +1 -1
- package/lib/module/fabric/ScreenNativeComponent.js.map +1 -1
- package/lib/module/native-stack/views/NativeStackView.js +2 -0
- package/lib/module/native-stack/views/NativeStackView.js.map +1 -1
- package/lib/typescript/components/ScreenStack.d.ts.map +1 -1
- package/lib/typescript/fabric/ModalScreenNativeComponent.d.ts +1 -0
- package/lib/typescript/fabric/ModalScreenNativeComponent.d.ts.map +1 -1
- package/lib/typescript/fabric/ScreenNativeComponent.d.ts +1 -0
- package/lib/typescript/fabric/ScreenNativeComponent.d.ts.map +1 -1
- package/lib/typescript/native-stack/types.d.ts +10 -0
- package/lib/typescript/native-stack/types.d.ts.map +1 -1
- package/lib/typescript/native-stack/views/NativeStackView.d.ts.map +1 -1
- package/lib/typescript/types.d.ts +10 -0
- package/lib/typescript/types.d.ts.map +1 -1
- package/native-stack/README.md +110 -99
- package/package.json +6 -3
- package/react-native.config.js +17 -15
- package/src/TransitionProgressContext.tsx +1 -1
- package/src/components/Screen.tsx +4 -4
- package/src/components/ScreenStack.tsx +11 -1
- package/src/components/ScreenStackHeaderConfig.tsx +5 -5
- package/src/components/ScreenStackHeaderConfig.web.tsx +6 -6
- package/src/components/SearchBar.tsx +4 -4
- package/src/core.ts +1 -1
- package/src/fabric/ModalScreenNativeComponent.ts +1 -0
- package/src/fabric/ScreenNativeComponent.ts +1 -0
- package/src/fabric/ScreenNavigationContainerNativeComponent.ts +1 -1
- package/src/fabric/ScreenStackHeaderConfigNativeComponent.ts +1 -1
- package/src/fabric/ScreenStackHeaderSubviewNativeComponent.ts +1 -1
- package/src/fabric/SearchBarNativeComponent.ts +1 -1
- package/src/gesture-handler/ScreenGestureDetector.tsx +5 -5
- package/src/gesture-handler/constraints.ts +5 -5
- package/src/gesture-handler/fabricUtils.ts +1 -1
- package/src/native-stack/contexts/GHContext.tsx +1 -1
- package/src/native-stack/navigators/createNativeStackNavigator.tsx +3 -3
- package/src/native-stack/types.tsx +14 -4
- package/src/native-stack/utils/getDefaultHeaderHeight.tsx +1 -1
- package/src/native-stack/utils/getStatusBarHeight.tsx +1 -1
- package/src/native-stack/utils/useAnimatedHeaderHeight.tsx +1 -1
- package/src/native-stack/utils/useBackPressSubscription.tsx +1 -1
- package/src/native-stack/utils/useHeaderHeight.tsx +1 -1
- package/src/native-stack/views/FontProcessor.tsx +1 -1
- package/src/native-stack/views/HeaderConfig.tsx +1 -1
- package/src/native-stack/views/NativeStackView.tsx +11 -9
- package/src/reanimated/ReanimatedHeaderHeightContext.tsx +1 -1
- package/src/reanimated/ReanimatedNativeStackScreen.tsx +5 -5
- package/src/reanimated/ReanimatedScreen.tsx +2 -2
- package/src/reanimated/ReanimatedScreenProvider.tsx +1 -1
- package/src/reanimated/useReanimatedHeaderHeight.tsx +1 -1
- package/src/reanimated/useReanimatedTransitionProgress.tsx +1 -1
- package/src/types.tsx +15 -5
- package/src/useTransitionProgress.tsx +1 -1
- 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.
|
|
110
|
-
| 3.
|
|
111
|
-
| 3.
|
|
112
|
-
| 3.
|
|
113
|
-
|
|
|
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.
|
|
124
|
-
| 3.
|
|
125
|
-
| 3.
|
|
126
|
-
| 3.
|
|
127
|
-
| 3.
|
|
128
|
-
| 3.
|
|
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
|
|
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
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
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
|
package/android/CMakeLists.txt
CHANGED
|
@@ -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
|
-
|
|
25
|
-
|
|
26
|
-
|
|
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()
|
package/android/build.gradle
CHANGED
|
@@ -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.
|
|
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",
|
|
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 (
|
|
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
|
|
13
|
-
|
|
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
|
-
|
|
19
|
-
|
|
20
|
+
fun setStateWrapper(wrapper: StateWrapper?) {
|
|
21
|
+
mStateWrapper = wrapper
|
|
20
22
|
}
|
|
21
23
|
|
|
22
|
-
protected fun updateScreenSizeFabric(
|
|
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(
|
|
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
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
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
|
|
@@ -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(
|
|
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(
|
|
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
|
}
|