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.
- package/README.md +21 -11
- package/RNScreens.podspec +11 -52
- package/android/CMakeLists.txt +48 -4
- package/android/build.gradle +16 -9
- 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/cpp/jni-adapter.cpp +86 -93
- package/android/src/main/java/com/swmansion/rnscreens/CustomSearchView.kt +7 -2
- package/android/src/main/java/com/swmansion/rnscreens/CustomToolbar.kt +6 -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 +150 -40
- package/android/src/main/java/com/swmansion/rnscreens/ScreenContainer.kt +52 -30
- package/android/src/main/java/com/swmansion/rnscreens/ScreenContainerViewManager.kt +27 -4
- 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 +63 -39
- package/android/src/main/java/com/swmansion/rnscreens/ScreenStackFragmentWrapper.kt +4 -0
- package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfig.kt +88 -57
- package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfigViewManager.kt +131 -36
- 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 +177 -77
- package/android/src/main/java/com/swmansion/rnscreens/ScreenWindowTraits.kt +77 -25
- package/android/src/main/java/com/swmansion/rnscreens/ScreensModule.kt +31 -9
- package/android/src/main/java/com/swmansion/rnscreens/ScreensShadowNode.kt +3 -1
- package/android/src/main/java/com/swmansion/rnscreens/SearchBarManager.kt +160 -54
- 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 -6
- 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 +5 -2
- 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 +5 -2
- 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 +214 -0
- package/android/src/main/jni/CMakeLists.txt +5 -4
- package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenContainerManagerDelegate.java +25 -0
- package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenContainerManagerInterface.java +16 -0
- package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenManagerDelegate.java +6 -0
- package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenManagerInterface.java +2 -0
- package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderConfigManagerDelegate.java +3 -0
- package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderConfigManagerInterface.java +1 -0
- package/android/src/paper/java/com/facebook/react/viewmanagers/RNSSearchBarManagerDelegate.java +99 -0
- package/android/src/paper/java/com/facebook/react/viewmanagers/RNSSearchBarManagerInterface.java +37 -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/RNSModalScreenComponentDescriptor.h +8 -9
- package/common/cpp/react/renderer/components/rnscreens/RNSModalScreenShadowNode.cpp +2 -1
- package/common/cpp/react/renderer/components/rnscreens/RNSModalScreenShadowNode.h +9 -8
- package/common/cpp/react/renderer/components/rnscreens/RNSScreenComponentDescriptor.h +147 -10
- package/common/cpp/react/renderer/components/rnscreens/RNSScreenShadowNode.cpp +51 -1
- package/common/cpp/react/renderer/components/rnscreens/RNSScreenShadowNode.h +29 -7
- package/common/cpp/react/renderer/components/rnscreens/RNSScreenState.cpp +22 -1
- package/common/cpp/react/renderer/components/rnscreens/RNSScreenState.h +30 -10
- 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/cpp/RNScreensTurboModule.cpp +31 -23
- package/cpp/RNScreensTurboModule.h +17 -20
- package/ios/RNSConvert.h +7 -0
- package/ios/RNSConvert.mm +24 -0
- package/ios/RNSModalScreen.mm +22 -0
- package/ios/RNSModule.mm +2 -3
- package/ios/RNSScreen.h +2 -1
- package/ios/RNSScreen.mm +35 -19
- package/ios/RNSScreenContainer.mm +1 -1
- package/ios/RNSScreenStack.mm +59 -54
- package/ios/RNSScreenStackAnimator.mm +43 -6
- package/ios/RNSScreenStackHeaderConfig.h +2 -0
- package/ios/RNSScreenStackHeaderConfig.mm +93 -28
- package/ios/RNSScreenStackHeaderSubview.mm +8 -0
- package/ios/RNSSearchBar.h +5 -5
- package/ios/RNSSearchBar.mm +11 -11
- package/ios/utils/RCTSurfaceTouchHandler+RNSUtility.h +15 -0
- package/ios/utils/RCTSurfaceTouchHandler+RNSUtility.mm +14 -0
- package/ios/utils/RCTTouchHandler+RNSUtility.h +15 -0
- package/ios/utils/RCTTouchHandler+RNSUtility.mm +15 -0
- package/ios/utils/UIView+RNSUtility.h +23 -0
- package/ios/utils/UIView+RNSUtility.mm +55 -0
- package/lib/commonjs/components/Screen.js +119 -127
- package/lib/commonjs/components/Screen.js.map +1 -1
- package/lib/commonjs/components/ScreenStack.js +8 -1
- package/lib/commonjs/components/ScreenStack.js.map +1 -1
- package/lib/commonjs/components/SearchBar.js +39 -36
- package/lib/commonjs/components/SearchBar.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/fabric/ScreenStackHeaderConfigNativeComponent.js.map +1 -1
- package/lib/commonjs/native-stack/views/HeaderConfig.js +2 -0
- package/lib/commonjs/native-stack/views/HeaderConfig.js.map +1 -1
- package/lib/commonjs/native-stack/views/NativeStackView.js +4 -0
- package/lib/commonjs/native-stack/views/NativeStackView.js.map +1 -1
- package/lib/module/components/Screen.js +118 -126
- package/lib/module/components/Screen.js.map +1 -1
- package/lib/module/components/ScreenStack.js +8 -1
- package/lib/module/components/ScreenStack.js.map +1 -1
- package/lib/module/components/SearchBar.js +39 -36
- package/lib/module/components/SearchBar.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/fabric/ScreenStackHeaderConfigNativeComponent.js.map +1 -1
- package/lib/module/native-stack/views/HeaderConfig.js +2 -0
- package/lib/module/native-stack/views/HeaderConfig.js.map +1 -1
- package/lib/module/native-stack/views/NativeStackView.js +4 -0
- package/lib/module/native-stack/views/NativeStackView.js.map +1 -1
- package/lib/typescript/TransitionProgressContext.d.ts +1 -1
- package/lib/typescript/TransitionProgressContext.d.ts.map +1 -1
- package/lib/typescript/components/Screen.d.ts +3 -14
- package/lib/typescript/components/Screen.d.ts.map +1 -1
- package/lib/typescript/components/ScreenStack.d.ts.map +1 -1
- package/lib/typescript/components/SearchBar.d.ts +14 -21
- package/lib/typescript/components/SearchBar.d.ts.map +1 -1
- package/lib/typescript/fabric/ModalScreenNativeComponent.d.ts +12 -10
- package/lib/typescript/fabric/ModalScreenNativeComponent.d.ts.map +1 -1
- package/lib/typescript/fabric/ScreenNativeComponent.d.ts +12 -10
- package/lib/typescript/fabric/ScreenNativeComponent.d.ts.map +1 -1
- package/lib/typescript/fabric/ScreenStackHeaderConfigNativeComponent.d.ts +5 -3
- package/lib/typescript/fabric/ScreenStackHeaderConfigNativeComponent.d.ts.map +1 -1
- package/lib/typescript/fabric/ScreenStackHeaderSubviewNativeComponent.d.ts +1 -1
- package/lib/typescript/fabric/ScreenStackHeaderSubviewNativeComponent.d.ts.map +1 -1
- package/lib/typescript/fabric/ScreenStackNativeComponent.d.ts +1 -1
- package/lib/typescript/fabric/ScreenStackNativeComponent.d.ts.map +1 -1
- package/lib/typescript/fabric/SearchBarNativeComponent.d.ts +9 -9
- package/lib/typescript/fabric/SearchBarNativeComponent.d.ts.map +1 -1
- package/lib/typescript/gesture-handler/RNScreensTurboModule.d.ts +1 -1
- package/lib/typescript/gesture-handler/RNScreensTurboModule.d.ts.map +1 -1
- package/lib/typescript/native-stack/types.d.ts +39 -14
- package/lib/typescript/native-stack/types.d.ts.map +1 -1
- package/lib/typescript/native-stack/utils/SafeAreaProviderCompat.d.ts +1 -1
- package/lib/typescript/native-stack/utils/SafeAreaProviderCompat.d.ts.map +1 -1
- package/lib/typescript/native-stack/utils/getDefaultHeaderHeight.d.ts +1 -1
- package/lib/typescript/native-stack/utils/getDefaultHeaderHeight.d.ts.map +1 -1
- package/lib/typescript/native-stack/utils/useAnimatedHeaderHeight.d.ts +1 -1
- package/lib/typescript/native-stack/utils/useAnimatedHeaderHeight.d.ts.map +1 -1
- package/lib/typescript/native-stack/views/HeaderConfig.d.ts +2 -2
- package/lib/typescript/native-stack/views/HeaderConfig.d.ts.map +1 -1
- package/lib/typescript/native-stack/views/NativeStackView.d.ts +1 -1
- package/lib/typescript/native-stack/views/NativeStackView.d.ts.map +1 -1
- package/lib/typescript/reanimated/ReanimatedTransitionProgressContext.d.ts +1 -1
- package/lib/typescript/reanimated/ReanimatedTransitionProgressContext.d.ts.map +1 -1
- package/lib/typescript/types.d.ts +39 -13
- package/lib/typescript/types.d.ts.map +1 -1
- package/lib/typescript/useTransitionProgress.d.ts +3 -3
- package/native-stack/README.md +116 -98
- package/package.json +16 -7
- package/react-native.config.js +17 -15
- package/src/TransitionProgressContext.tsx +1 -1
- package/src/components/Screen.tsx +31 -37
- 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 +77 -65
- package/src/core.ts +1 -1
- package/src/fabric/ModalScreenNativeComponent.ts +2 -0
- package/src/fabric/ScreenNativeComponent.ts +2 -0
- package/src/fabric/ScreenNavigationContainerNativeComponent.ts +1 -1
- package/src/fabric/ScreenStackHeaderConfigNativeComponent.ts +4 -1
- package/src/fabric/ScreenStackHeaderSubviewNativeComponent.ts +1 -1
- package/src/fabric/SearchBarNativeComponent.ts +7 -7
- 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 +29 -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 +3 -1
- package/src/native-stack/views/NativeStackView.tsx +13 -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 +31 -5
- package/src/useTransitionProgress.tsx +1 -1
- package/windows/README.md +4 -1
|
@@ -19,27 +19,37 @@ import com.facebook.react.uimanager.UIManagerHelper
|
|
|
19
19
|
import com.swmansion.rnscreens.Screen.ActivityState
|
|
20
20
|
import com.swmansion.rnscreens.events.ScreenDismissedEvent
|
|
21
21
|
|
|
22
|
-
open class ScreenContainer(
|
|
22
|
+
open class ScreenContainer(
|
|
23
|
+
context: Context?,
|
|
24
|
+
) : ViewGroup(context) {
|
|
23
25
|
@JvmField
|
|
24
26
|
protected val screenWrappers = ArrayList<ScreenFragmentWrapper>()
|
|
27
|
+
|
|
25
28
|
@JvmField
|
|
26
29
|
protected var fragmentManager: FragmentManager? = null
|
|
27
30
|
private var isAttached = false
|
|
28
31
|
private var needsUpdate = false
|
|
29
32
|
private var isLayoutEnqueued = false
|
|
30
|
-
private val layoutCallback: ChoreographerCompat.FrameCallback =
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
33
|
+
private val layoutCallback: ChoreographerCompat.FrameCallback =
|
|
34
|
+
object : ChoreographerCompat.FrameCallback() {
|
|
35
|
+
override fun doFrame(frameTimeNanos: Long) {
|
|
36
|
+
isLayoutEnqueued = false
|
|
37
|
+
measure(
|
|
38
|
+
MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY),
|
|
39
|
+
MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY),
|
|
40
|
+
)
|
|
41
|
+
layout(left, top, right, bottom)
|
|
42
|
+
}
|
|
38
43
|
}
|
|
39
|
-
}
|
|
40
44
|
private var parentScreenWrapper: ScreenFragmentWrapper? = null
|
|
41
45
|
|
|
42
|
-
override fun onLayout(
|
|
46
|
+
override fun onLayout(
|
|
47
|
+
changed: Boolean,
|
|
48
|
+
l: Int,
|
|
49
|
+
t: Int,
|
|
50
|
+
r: Int,
|
|
51
|
+
b: Int,
|
|
52
|
+
) {
|
|
43
53
|
var i = 0
|
|
44
54
|
val size = childCount
|
|
45
55
|
while (i < size) {
|
|
@@ -69,9 +79,11 @@ open class ScreenContainer(context: Context?) : ViewGroup(context) {
|
|
|
69
79
|
isLayoutEnqueued = true
|
|
70
80
|
// we use NATIVE_ANIMATED_MODULE choreographer queue because it allows us to catch the current
|
|
71
81
|
// looper loop instead of enqueueing the update in the next loop causing a one frame delay.
|
|
72
|
-
ReactChoreographer
|
|
82
|
+
ReactChoreographer
|
|
83
|
+
.getInstance()
|
|
73
84
|
.postFrameCallback(
|
|
74
|
-
ReactChoreographer.CallbackType.NATIVE_ANIMATED_MODULE,
|
|
85
|
+
ReactChoreographer.CallbackType.NATIVE_ANIMATED_MODULE,
|
|
86
|
+
layoutCallback,
|
|
75
87
|
)
|
|
76
88
|
}
|
|
77
89
|
}
|
|
@@ -85,7 +97,10 @@ open class ScreenContainer(context: Context?) : ViewGroup(context) {
|
|
|
85
97
|
|
|
86
98
|
protected open fun adapt(screen: Screen): ScreenFragmentWrapper = ScreenFragment(screen)
|
|
87
99
|
|
|
88
|
-
fun addScreen(
|
|
100
|
+
fun addScreen(
|
|
101
|
+
screen: Screen,
|
|
102
|
+
index: Int,
|
|
103
|
+
) {
|
|
89
104
|
val fragment = adapt(screen)
|
|
90
105
|
screen.fragmentWrapper = fragment
|
|
91
106
|
screenWrappers.add(index, fragment)
|
|
@@ -173,7 +188,7 @@ open class ScreenContainer(context: Context?) : ViewGroup(context) {
|
|
|
173
188
|
parentScreenWrapper = fragmentWrapper
|
|
174
189
|
fragmentWrapper.addChildScreenContainer(this)
|
|
175
190
|
setFragmentManager(fragmentWrapper.fragment.childFragmentManager)
|
|
176
|
-
}
|
|
191
|
+
},
|
|
177
192
|
) { "Parent Screen does not have its Fragment attached" }
|
|
178
193
|
} else {
|
|
179
194
|
// we expect top level view to be of type ReactRootView, this isn't really necessary but in
|
|
@@ -186,13 +201,15 @@ open class ScreenContainer(context: Context?) : ViewGroup(context) {
|
|
|
186
201
|
}
|
|
187
202
|
}
|
|
188
203
|
|
|
189
|
-
protected fun createTransaction(): FragmentTransaction
|
|
190
|
-
|
|
204
|
+
protected fun createTransaction(): FragmentTransaction =
|
|
205
|
+
requireNotNull(fragmentManager) { "fragment manager is null when creating transaction" }
|
|
191
206
|
.beginTransaction()
|
|
192
207
|
.setReorderingAllowed(true)
|
|
193
|
-
}
|
|
194
208
|
|
|
195
|
-
private fun attachScreen(
|
|
209
|
+
private fun attachScreen(
|
|
210
|
+
transaction: FragmentTransaction,
|
|
211
|
+
fragment: Fragment,
|
|
212
|
+
) {
|
|
196
213
|
transaction.add(id, fragment)
|
|
197
214
|
}
|
|
198
215
|
|
|
@@ -228,15 +245,16 @@ open class ScreenContainer(context: Context?) : ViewGroup(context) {
|
|
|
228
245
|
}
|
|
229
246
|
}
|
|
230
247
|
|
|
231
|
-
private fun detachScreen(
|
|
248
|
+
private fun detachScreen(
|
|
249
|
+
transaction: FragmentTransaction,
|
|
250
|
+
fragment: Fragment,
|
|
251
|
+
) {
|
|
232
252
|
transaction.remove(fragment)
|
|
233
253
|
}
|
|
234
254
|
|
|
235
|
-
private fun getActivityState(screenFragmentWrapper: ScreenFragmentWrapper): ActivityState? =
|
|
236
|
-
screenFragmentWrapper.screen.activityState
|
|
255
|
+
private fun getActivityState(screenFragmentWrapper: ScreenFragmentWrapper): ActivityState? = screenFragmentWrapper.screen.activityState
|
|
237
256
|
|
|
238
|
-
open fun hasScreen(screenFragmentWrapper: ScreenFragmentWrapper?): Boolean =
|
|
239
|
-
screenWrappers.contains(screenFragmentWrapper)
|
|
257
|
+
open fun hasScreen(screenFragmentWrapper: ScreenFragmentWrapper?): Boolean = screenWrappers.contains(screenFragmentWrapper)
|
|
240
258
|
|
|
241
259
|
override fun onAttachedToWindow() {
|
|
242
260
|
super.onAttachedToWindow()
|
|
@@ -295,7 +313,10 @@ open class ScreenContainer(context: Context?) : ViewGroup(context) {
|
|
|
295
313
|
}
|
|
296
314
|
}
|
|
297
315
|
|
|
298
|
-
override fun onMeasure(
|
|
316
|
+
override fun onMeasure(
|
|
317
|
+
widthMeasureSpec: Int,
|
|
318
|
+
heightMeasureSpec: Int,
|
|
319
|
+
) {
|
|
299
320
|
super.onMeasure(widthMeasureSpec, heightMeasureSpec)
|
|
300
321
|
for (i in 0 until childCount) {
|
|
301
322
|
getChildAt(i).measure(widthMeasureSpec, heightMeasureSpec)
|
|
@@ -342,11 +363,12 @@ open class ScreenContainer(context: Context?) : ViewGroup(context) {
|
|
|
342
363
|
open fun onUpdate() {
|
|
343
364
|
createTransaction().let {
|
|
344
365
|
// detach screens that are no longer active
|
|
345
|
-
val orphaned: MutableSet<Fragment> =
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
366
|
+
val orphaned: MutableSet<Fragment> =
|
|
367
|
+
HashSet(
|
|
368
|
+
requireNotNull(fragmentManager) {
|
|
369
|
+
"fragment manager is null when performing update in ScreenContainer"
|
|
370
|
+
}.fragments,
|
|
371
|
+
)
|
|
350
372
|
for (fragmentWrapper in screenWrappers) {
|
|
351
373
|
if (getActivityState(fragmentWrapper) === ActivityState.INACTIVE &&
|
|
352
374
|
fragmentWrapper.fragment.isAdded
|
|
@@ -6,19 +6,39 @@ import com.facebook.react.module.annotations.ReactModule
|
|
|
6
6
|
import com.facebook.react.uimanager.LayoutShadowNode
|
|
7
7
|
import com.facebook.react.uimanager.ThemedReactContext
|
|
8
8
|
import com.facebook.react.uimanager.ViewGroupManager
|
|
9
|
+
import com.facebook.react.uimanager.ViewManagerDelegate
|
|
10
|
+
import com.facebook.react.viewmanagers.RNSScreenContainerManagerDelegate
|
|
11
|
+
import com.facebook.react.viewmanagers.RNSScreenContainerManagerInterface
|
|
9
12
|
|
|
10
13
|
@ReactModule(name = ScreenContainerViewManager.REACT_CLASS)
|
|
11
|
-
class ScreenContainerViewManager :
|
|
14
|
+
class ScreenContainerViewManager :
|
|
15
|
+
ViewGroupManager<ScreenContainer>(),
|
|
16
|
+
RNSScreenContainerManagerInterface<ScreenContainer> {
|
|
17
|
+
private val delegate: ViewManagerDelegate<ScreenContainer>
|
|
18
|
+
|
|
19
|
+
init {
|
|
20
|
+
delegate = RNSScreenContainerManagerDelegate<ScreenContainer, ScreenContainerViewManager>(this)
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
protected override fun getDelegate(): ViewManagerDelegate<ScreenContainer> = delegate
|
|
24
|
+
|
|
12
25
|
override fun getName(): String = REACT_CLASS
|
|
13
26
|
|
|
14
27
|
override fun createViewInstance(reactContext: ThemedReactContext): ScreenContainer = ScreenContainer(reactContext)
|
|
15
28
|
|
|
16
|
-
override fun addView(
|
|
29
|
+
override fun addView(
|
|
30
|
+
parent: ScreenContainer,
|
|
31
|
+
child: View,
|
|
32
|
+
index: Int,
|
|
33
|
+
) {
|
|
17
34
|
require(child is Screen) { "Attempt attach child that is not of type RNScreens" }
|
|
18
35
|
parent.addScreen(child, index)
|
|
19
36
|
}
|
|
20
37
|
|
|
21
|
-
override fun removeViewAt(
|
|
38
|
+
override fun removeViewAt(
|
|
39
|
+
parent: ScreenContainer,
|
|
40
|
+
index: Int,
|
|
41
|
+
) {
|
|
22
42
|
parent.removeScreenAt(index)
|
|
23
43
|
}
|
|
24
44
|
|
|
@@ -28,7 +48,10 @@ class ScreenContainerViewManager : ViewGroupManager<ScreenContainer>() {
|
|
|
28
48
|
|
|
29
49
|
override fun getChildCount(parent: ScreenContainer): Int = parent.screenCount
|
|
30
50
|
|
|
31
|
-
override fun getChildAt(
|
|
51
|
+
override fun getChildAt(
|
|
52
|
+
parent: ScreenContainer,
|
|
53
|
+
index: Int,
|
|
54
|
+
): View = parent.getScreenAt(index)
|
|
32
55
|
|
|
33
56
|
override fun createShadowNodeInstance(context: ReactApplicationContext): LayoutShadowNode = ScreensShadowNode(context)
|
|
34
57
|
|
|
@@ -2,12 +2,16 @@ package com.swmansion.rnscreens
|
|
|
2
2
|
|
|
3
3
|
interface ScreenEventDispatcher {
|
|
4
4
|
fun canDispatchLifecycleEvent(event: ScreenFragment.ScreenLifecycleEvent): Boolean
|
|
5
|
+
|
|
5
6
|
fun updateLastEventDispatched(event: ScreenFragment.ScreenLifecycleEvent)
|
|
6
7
|
|
|
7
8
|
/**
|
|
8
9
|
* Dispatches given screen lifecycle event to JS using screen from given fragment `fragmentWrapper`
|
|
9
10
|
*/
|
|
10
|
-
fun dispatchLifecycleEvent(
|
|
11
|
+
fun dispatchLifecycleEvent(
|
|
12
|
+
event: ScreenFragment.ScreenLifecycleEvent,
|
|
13
|
+
fragmentWrapper: ScreenFragmentWrapper,
|
|
14
|
+
)
|
|
11
15
|
|
|
12
16
|
/**
|
|
13
17
|
* Dispatches given screen lifecycle event from all non-empty child containers to JS
|
|
@@ -15,7 +19,11 @@ interface ScreenEventDispatcher {
|
|
|
15
19
|
fun dispatchLifecycleEventInChildContainers(event: ScreenFragment.ScreenLifecycleEvent)
|
|
16
20
|
|
|
17
21
|
fun dispatchHeaderBackButtonClickedEvent()
|
|
18
|
-
|
|
22
|
+
|
|
23
|
+
fun dispatchTransitionProgressEvent(
|
|
24
|
+
alpha: Float,
|
|
25
|
+
closing: Boolean,
|
|
26
|
+
)
|
|
19
27
|
|
|
20
28
|
// Concrete dispatchers
|
|
21
29
|
}
|
|
@@ -25,9 +25,14 @@ import com.swmansion.rnscreens.events.ScreenWillDisappearEvent
|
|
|
25
25
|
import kotlin.math.max
|
|
26
26
|
import kotlin.math.min
|
|
27
27
|
|
|
28
|
-
open class ScreenFragment :
|
|
28
|
+
open class ScreenFragment :
|
|
29
|
+
Fragment,
|
|
30
|
+
ScreenFragmentWrapper {
|
|
29
31
|
enum class ScreenLifecycleEvent {
|
|
30
|
-
DID_APPEAR,
|
|
32
|
+
DID_APPEAR,
|
|
33
|
+
WILL_APPEAR,
|
|
34
|
+
DID_DISAPPEAR,
|
|
35
|
+
WILL_DISAPPEAR,
|
|
31
36
|
}
|
|
32
37
|
|
|
33
38
|
override val fragment: Fragment
|
|
@@ -40,6 +45,7 @@ open class ScreenFragment : Fragment, ScreenFragmentWrapper {
|
|
|
40
45
|
override val childScreenContainers: MutableList<ScreenContainer> = ArrayList()
|
|
41
46
|
|
|
42
47
|
private var shouldUpdateOnResume = false
|
|
48
|
+
|
|
43
49
|
// if we don't set it, it will be 0.0f at the beginning so the progress will not be sent
|
|
44
50
|
// due to progress value being already 0.0f
|
|
45
51
|
private var transitionProgress = -1f
|
|
@@ -57,7 +63,7 @@ open class ScreenFragment : Fragment, ScreenFragmentWrapper {
|
|
|
57
63
|
|
|
58
64
|
constructor() {
|
|
59
65
|
throw IllegalStateException(
|
|
60
|
-
"Screen fragments should never be restored. Follow instructions from https://github.com/software-mansion/react-native-screens/issues/17#issuecomment-424704067 to properly configure your main activity."
|
|
66
|
+
"Screen fragments should never be restored. Follow instructions from https://github.com/software-mansion/react-native-screens/issues/17#issuecomment-424704067 to properly configure your main activity.",
|
|
61
67
|
)
|
|
62
68
|
}
|
|
63
69
|
|
|
@@ -77,14 +83,17 @@ open class ScreenFragment : Fragment, ScreenFragmentWrapper {
|
|
|
77
83
|
override fun onCreateView(
|
|
78
84
|
inflater: LayoutInflater,
|
|
79
85
|
container: ViewGroup?,
|
|
80
|
-
savedInstanceState: Bundle
|
|
86
|
+
savedInstanceState: Bundle?,
|
|
81
87
|
): View? {
|
|
82
|
-
screen.layoutParams =
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
+
screen.layoutParams =
|
|
89
|
+
FrameLayout.LayoutParams(
|
|
90
|
+
ViewGroup.LayoutParams.MATCH_PARENT,
|
|
91
|
+
ViewGroup.LayoutParams.MATCH_PARENT,
|
|
92
|
+
)
|
|
93
|
+
val wrapper =
|
|
94
|
+
context?.let { ScreensFrameLayout(it) }?.apply {
|
|
95
|
+
addView(recycleView(screen))
|
|
96
|
+
}
|
|
88
97
|
return wrapper
|
|
89
98
|
}
|
|
90
99
|
|
|
@@ -154,12 +163,13 @@ open class ScreenFragment : Fragment, ScreenFragmentWrapper {
|
|
|
154
163
|
return null
|
|
155
164
|
}
|
|
156
165
|
|
|
157
|
-
override fun canDispatchLifecycleEvent(event: ScreenLifecycleEvent): Boolean =
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
166
|
+
override fun canDispatchLifecycleEvent(event: ScreenLifecycleEvent): Boolean =
|
|
167
|
+
when (event) {
|
|
168
|
+
ScreenLifecycleEvent.WILL_APPEAR -> canDispatchWillAppear
|
|
169
|
+
ScreenLifecycleEvent.DID_APPEAR -> canDispatchAppear
|
|
170
|
+
ScreenLifecycleEvent.WILL_DISAPPEAR -> !canDispatchWillAppear
|
|
171
|
+
ScreenLifecycleEvent.DID_DISAPPEAR -> !canDispatchAppear
|
|
172
|
+
}
|
|
163
173
|
|
|
164
174
|
override fun updateLastEventDispatched(event: ScreenLifecycleEvent) {
|
|
165
175
|
when (event) {
|
|
@@ -190,18 +200,22 @@ open class ScreenFragment : Fragment, ScreenFragmentWrapper {
|
|
|
190
200
|
dispatchTransitionProgressEvent(1.0f, true)
|
|
191
201
|
}
|
|
192
202
|
|
|
193
|
-
override fun dispatchLifecycleEvent(
|
|
203
|
+
override fun dispatchLifecycleEvent(
|
|
204
|
+
event: ScreenLifecycleEvent,
|
|
205
|
+
fragmentWrapper: ScreenFragmentWrapper,
|
|
206
|
+
) {
|
|
194
207
|
val fragment = fragmentWrapper.fragment
|
|
195
208
|
if (fragment is ScreenStackFragment && fragment.canDispatchLifecycleEvent(event)) {
|
|
196
209
|
fragment.screen.let {
|
|
197
210
|
fragmentWrapper.updateLastEventDispatched(event)
|
|
198
211
|
val surfaceId = UIManagerHelper.getSurfaceId(it)
|
|
199
|
-
val lifecycleEvent: Event<*> =
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
212
|
+
val lifecycleEvent: Event<*> =
|
|
213
|
+
when (event) {
|
|
214
|
+
ScreenLifecycleEvent.WILL_APPEAR -> ScreenWillAppearEvent(surfaceId, it.id)
|
|
215
|
+
ScreenLifecycleEvent.DID_APPEAR -> ScreenAppearEvent(surfaceId, it.id)
|
|
216
|
+
ScreenLifecycleEvent.WILL_DISAPPEAR -> ScreenWillDisappearEvent(surfaceId, it.id)
|
|
217
|
+
ScreenLifecycleEvent.DID_DISAPPEAR -> ScreenDisappearEvent(surfaceId, it.id)
|
|
218
|
+
}
|
|
205
219
|
val screenContext = screen.context as ReactContext
|
|
206
220
|
val eventDispatcher: EventDispatcher? =
|
|
207
221
|
UIManagerHelper.getEventDispatcherForReactTag(screenContext, screen.id)
|
|
@@ -225,7 +239,10 @@ open class ScreenFragment : Fragment, ScreenFragmentWrapper {
|
|
|
225
239
|
?.dispatchEvent(HeaderBackButtonClickedEvent(surfaceId, screen.id))
|
|
226
240
|
}
|
|
227
241
|
|
|
228
|
-
override fun dispatchTransitionProgressEvent(
|
|
242
|
+
override fun dispatchTransitionProgressEvent(
|
|
243
|
+
alpha: Float,
|
|
244
|
+
closing: Boolean,
|
|
245
|
+
) {
|
|
229
246
|
if (this is ScreenStackFragment) {
|
|
230
247
|
if (transitionProgress != alpha) {
|
|
231
248
|
transitionProgress = max(0.0f, min(1.0f, alpha))
|
|
@@ -238,8 +255,12 @@ open class ScreenFragment : Fragment, ScreenFragmentWrapper {
|
|
|
238
255
|
?.dispatchEvent(
|
|
239
256
|
ScreenTransitionProgressEvent(
|
|
240
257
|
UIManagerHelper.getSurfaceId(screenContext),
|
|
241
|
-
screen.id,
|
|
242
|
-
|
|
258
|
+
screen.id,
|
|
259
|
+
transitionProgress,
|
|
260
|
+
closing,
|
|
261
|
+
goingForward,
|
|
262
|
+
coalescingKey,
|
|
263
|
+
),
|
|
243
264
|
)
|
|
244
265
|
}
|
|
245
266
|
}
|
|
@@ -328,7 +349,15 @@ open class ScreenFragment : Fragment, ScreenFragmentWrapper {
|
|
|
328
349
|
- progress is 1 -> key 2
|
|
329
350
|
- progress is between 0 and 1 -> key 3
|
|
330
351
|
*/
|
|
331
|
-
return (
|
|
352
|
+
return (
|
|
353
|
+
if (progress == 0.0f) {
|
|
354
|
+
1
|
|
355
|
+
} else if (progress == 1.0f) {
|
|
356
|
+
2
|
|
357
|
+
} else {
|
|
358
|
+
3
|
|
359
|
+
}
|
|
360
|
+
).toShort()
|
|
332
361
|
}
|
|
333
362
|
}
|
|
334
363
|
}
|
|
@@ -3,20 +3,27 @@ package com.swmansion.rnscreens
|
|
|
3
3
|
import android.app.Activity
|
|
4
4
|
import com.facebook.react.bridge.ReactContext
|
|
5
5
|
|
|
6
|
-
interface ScreenFragmentWrapper :
|
|
6
|
+
interface ScreenFragmentWrapper :
|
|
7
|
+
FragmentHolder,
|
|
8
|
+
ScreenEventDispatcher {
|
|
7
9
|
var screen: Screen
|
|
8
10
|
|
|
9
11
|
// Communication with container
|
|
10
12
|
val childScreenContainers: List<ScreenContainer>
|
|
13
|
+
|
|
11
14
|
fun addChildScreenContainer(container: ScreenContainer)
|
|
15
|
+
|
|
12
16
|
fun removeChildScreenContainer(container: ScreenContainer)
|
|
17
|
+
|
|
13
18
|
fun onContainerUpdate()
|
|
14
19
|
|
|
15
20
|
// Animation phase callbacks
|
|
16
21
|
fun onViewAnimationStart()
|
|
22
|
+
|
|
17
23
|
fun onViewAnimationEnd()
|
|
18
24
|
|
|
19
25
|
// Helpers
|
|
20
26
|
fun tryGetActivity(): Activity?
|
|
27
|
+
|
|
21
28
|
fun tryGetContext(): ReactContext?
|
|
22
29
|
}
|
|
@@ -12,7 +12,9 @@ import java.util.Collections
|
|
|
12
12
|
import kotlin.collections.ArrayList
|
|
13
13
|
import kotlin.collections.HashSet
|
|
14
14
|
|
|
15
|
-
class ScreenStack(
|
|
15
|
+
class ScreenStack(
|
|
16
|
+
context: Context?,
|
|
17
|
+
) : ScreenContainer(context) {
|
|
16
18
|
private val stack = ArrayList<ScreenStackFragmentWrapper>()
|
|
17
19
|
private val dismissedWrappers: MutableSet<ScreenStackFragmentWrapper> = HashSet()
|
|
18
20
|
private val drawingOpPool: MutableList<DrawingOp> = ArrayList()
|
|
@@ -142,11 +144,21 @@ class ScreenStack(context: Context?) : ScreenContainer(context) {
|
|
|
142
144
|
StackAnimation.DEFAULT -> it.setCustomAnimations(R.anim.rns_default_enter_in, R.anim.rns_default_enter_out)
|
|
143
145
|
StackAnimation.NONE -> it.setCustomAnimations(R.anim.rns_no_animation_20, R.anim.rns_no_animation_20)
|
|
144
146
|
StackAnimation.FADE -> it.setCustomAnimations(R.anim.rns_fade_in, R.anim.rns_fade_out)
|
|
145
|
-
StackAnimation.SLIDE_FROM_RIGHT ->
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
147
|
+
StackAnimation.SLIDE_FROM_RIGHT ->
|
|
148
|
+
it.setCustomAnimations(
|
|
149
|
+
R.anim.rns_slide_in_from_right,
|
|
150
|
+
R.anim.rns_slide_out_to_left,
|
|
151
|
+
)
|
|
152
|
+
StackAnimation.SLIDE_FROM_LEFT ->
|
|
153
|
+
it.setCustomAnimations(
|
|
154
|
+
R.anim.rns_slide_in_from_left,
|
|
155
|
+
R.anim.rns_slide_out_to_right,
|
|
156
|
+
)
|
|
157
|
+
StackAnimation.SLIDE_FROM_BOTTOM ->
|
|
158
|
+
it.setCustomAnimations(
|
|
159
|
+
R.anim.rns_slide_in_from_bottom,
|
|
160
|
+
R.anim.rns_no_animation_medium,
|
|
161
|
+
)
|
|
150
162
|
StackAnimation.FADE_FROM_BOTTOM -> it.setCustomAnimations(R.anim.rns_fade_from_bottom, R.anim.rns_no_animation_350)
|
|
151
163
|
StackAnimation.IOS -> it.setCustomAnimations(R.anim.rns_slide_in_from_right_ios, R.anim.rns_slide_out_to_left_ios)
|
|
152
164
|
}
|
|
@@ -155,11 +167,21 @@ class ScreenStack(context: Context?) : ScreenContainer(context) {
|
|
|
155
167
|
StackAnimation.DEFAULT -> it.setCustomAnimations(R.anim.rns_default_exit_in, R.anim.rns_default_exit_out)
|
|
156
168
|
StackAnimation.NONE -> it.setCustomAnimations(R.anim.rns_no_animation_20, R.anim.rns_no_animation_20)
|
|
157
169
|
StackAnimation.FADE -> it.setCustomAnimations(R.anim.rns_fade_in, R.anim.rns_fade_out)
|
|
158
|
-
StackAnimation.SLIDE_FROM_RIGHT ->
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
170
|
+
StackAnimation.SLIDE_FROM_RIGHT ->
|
|
171
|
+
it.setCustomAnimations(
|
|
172
|
+
R.anim.rns_slide_in_from_left,
|
|
173
|
+
R.anim.rns_slide_out_to_right,
|
|
174
|
+
)
|
|
175
|
+
StackAnimation.SLIDE_FROM_LEFT ->
|
|
176
|
+
it.setCustomAnimations(
|
|
177
|
+
R.anim.rns_slide_in_from_right,
|
|
178
|
+
R.anim.rns_slide_out_to_left,
|
|
179
|
+
)
|
|
180
|
+
StackAnimation.SLIDE_FROM_BOTTOM ->
|
|
181
|
+
it.setCustomAnimations(
|
|
182
|
+
R.anim.rns_no_animation_medium,
|
|
183
|
+
R.anim.rns_slide_out_to_bottom,
|
|
184
|
+
)
|
|
163
185
|
StackAnimation.FADE_FROM_BOTTOM -> it.setCustomAnimations(R.anim.rns_no_animation_250, R.anim.rns_fade_to_bottom)
|
|
164
186
|
StackAnimation.IOS -> it.setCustomAnimations(R.anim.rns_slide_in_from_left_ios, R.anim.rns_slide_out_to_right_ios)
|
|
165
187
|
}
|
|
@@ -170,7 +192,8 @@ class ScreenStack(context: Context?) : ScreenContainer(context) {
|
|
|
170
192
|
goingForward = shouldUseOpenAnimation
|
|
171
193
|
|
|
172
194
|
if (shouldUseOpenAnimation &&
|
|
173
|
-
newTop != null &&
|
|
195
|
+
newTop != null &&
|
|
196
|
+
needsDrawReordering(newTop) &&
|
|
174
197
|
visibleBottom == null
|
|
175
198
|
) {
|
|
176
199
|
// When using an open animation in which two screens overlap (eg. fade_from_bottom or
|
|
@@ -208,9 +231,12 @@ class ScreenStack(context: Context?) : ScreenContainer(context) {
|
|
|
208
231
|
for (fragmentWrapper in screenWrappers) {
|
|
209
232
|
// ignore all screens beneath the visible bottom
|
|
210
233
|
if (beneathVisibleBottom) {
|
|
211
|
-
beneathVisibleBottom =
|
|
212
|
-
|
|
213
|
-
|
|
234
|
+
beneathVisibleBottom =
|
|
235
|
+
if (fragmentWrapper === visibleBottom) {
|
|
236
|
+
false
|
|
237
|
+
} else {
|
|
238
|
+
continue
|
|
239
|
+
}
|
|
214
240
|
}
|
|
215
241
|
// when first visible screen found, make all screens after that visible
|
|
216
242
|
it.add(id, fragmentWrapper.fragment).runOnCommit { top?.screen?.bringToFront() }
|
|
@@ -298,13 +324,17 @@ class ScreenStack(context: Context?) : ScreenContainer(context) {
|
|
|
298
324
|
drawAndRelease()
|
|
299
325
|
}
|
|
300
326
|
|
|
301
|
-
override fun drawChild(
|
|
327
|
+
override fun drawChild(
|
|
328
|
+
canvas: Canvas,
|
|
329
|
+
child: View,
|
|
330
|
+
drawingTime: Long,
|
|
331
|
+
): Boolean {
|
|
302
332
|
drawingOps.add(
|
|
303
333
|
obtainDrawingOp().apply {
|
|
304
334
|
this.canvas = canvas
|
|
305
335
|
this.child = child
|
|
306
336
|
this.drawingTime = drawingTime
|
|
307
|
-
}
|
|
337
|
+
},
|
|
308
338
|
)
|
|
309
339
|
return true
|
|
310
340
|
}
|
|
@@ -315,8 +345,9 @@ class ScreenStack(context: Context?) : ScreenContainer(context) {
|
|
|
315
345
|
super.drawChild(op.canvas!!, op.child, op.drawingTime)
|
|
316
346
|
}
|
|
317
347
|
|
|
318
|
-
|
|
319
|
-
|
|
348
|
+
// Can't use `drawingOpPool.removeLast` here due to issues with static name resolution in Android SDK 35+.
|
|
349
|
+
// See: https://developer.android.com/about/versions/15/behavior-changes-15?hl=en#openjdk-api-changes
|
|
350
|
+
private fun obtainDrawingOp(): DrawingOp = if (drawingOpPool.isEmpty()) DrawingOp() else drawingOpPool.removeAt(drawingOpPool.lastIndex)
|
|
320
351
|
|
|
321
352
|
private inner class DrawingOp {
|
|
322
353
|
var canvas: Canvas? = null
|