@amazon-devices/react-native-screens 2.0.1758683737
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +7 -0
- package/README.md +223 -0
- package/RNScreens.podspec +53 -0
- package/SystemBundles/8f5a820b958535e533acb38dbc0c72c1837721b9db075f4a1740e42b9fee3910.bundle +33668 -0
- package/SystemBundles/8f5a820b958535e533acb38dbc0c72c1837721b9db075f4a1740e42b9fee3910.map +1 -0
- package/SystemModules/amzn__react-native-screens.modules.txt +101 -0
- package/SystemModules/amzn__react-native-screens.private.modules.txt +244 -0
- package/SystemModules/keplerscript-system-bundle-config.json +7 -0
- package/THIRD_PARTY_NOTICES.txt +707 -0
- package/android/build.gradle +133 -0
- package/android/src/fabric/java/com/swmansion/rnscreens/FabricEnabledViewGroup.kt +49 -0
- package/android/src/main/AndroidManifest.xml +5 -0
- package/android/src/main/java/com/swmansion/rnscreens/CustomSearchView.kt +77 -0
- package/android/src/main/java/com/swmansion/rnscreens/CustomToolbar.kt +7 -0
- package/android/src/main/java/com/swmansion/rnscreens/FragmentBackPressOverrider.kt +29 -0
- package/android/src/main/java/com/swmansion/rnscreens/FragmentHolder.kt +7 -0
- package/android/src/main/java/com/swmansion/rnscreens/RNScreensPackage.kt +21 -0
- package/android/src/main/java/com/swmansion/rnscreens/Screen.kt +289 -0
- package/android/src/main/java/com/swmansion/rnscreens/ScreenContainer.kt +372 -0
- package/android/src/main/java/com/swmansion/rnscreens/ScreenContainerViewManager.kt +40 -0
- package/android/src/main/java/com/swmansion/rnscreens/ScreenEventDispatcher.kt +21 -0
- package/android/src/main/java/com/swmansion/rnscreens/ScreenFragment.kt +331 -0
- package/android/src/main/java/com/swmansion/rnscreens/ScreenFragmentWrapper.kt +22 -0
- package/android/src/main/java/com/swmansion/rnscreens/ScreenStack.kt +336 -0
- package/android/src/main/java/com/swmansion/rnscreens/ScreenStackFragment.kt +282 -0
- package/android/src/main/java/com/swmansion/rnscreens/ScreenStackFragmentWrapper.kt +15 -0
- package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfig.kt +398 -0
- package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfigViewManager.kt +204 -0
- package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderSubview.kt +38 -0
- package/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderSubviewManager.kt +41 -0
- package/android/src/main/java/com/swmansion/rnscreens/ScreenStackViewManager.kt +75 -0
- package/android/src/main/java/com/swmansion/rnscreens/ScreenViewManager.kt +186 -0
- package/android/src/main/java/com/swmansion/rnscreens/ScreenWindowTraits.kt +296 -0
- package/android/src/main/java/com/swmansion/rnscreens/ScreensShadowNode.kt +19 -0
- package/android/src/main/java/com/swmansion/rnscreens/SearchBarManager.kt +133 -0
- package/android/src/main/java/com/swmansion/rnscreens/SearchBarView.kt +178 -0
- package/android/src/main/java/com/swmansion/rnscreens/SearchViewFormatter.kt +67 -0
- package/android/src/main/java/com/swmansion/rnscreens/events/HeaderAttachedEvent.kt +22 -0
- package/android/src/main/java/com/swmansion/rnscreens/events/HeaderBackButtonClickedEvent.kt +22 -0
- package/android/src/main/java/com/swmansion/rnscreens/events/HeaderDetachedEvent.kt +22 -0
- package/android/src/main/java/com/swmansion/rnscreens/events/HeaderHeightChangeEvent.kt +26 -0
- package/android/src/main/java/com/swmansion/rnscreens/events/ScreenAppearEvent.kt +18 -0
- package/android/src/main/java/com/swmansion/rnscreens/events/ScreenDisappearEvent.kt +18 -0
- package/android/src/main/java/com/swmansion/rnscreens/events/ScreenDismissedEvent.kt +20 -0
- package/android/src/main/java/com/swmansion/rnscreens/events/ScreenTransitionProgressEvent.kt +32 -0
- package/android/src/main/java/com/swmansion/rnscreens/events/ScreenWillAppearEvent.kt +18 -0
- package/android/src/main/java/com/swmansion/rnscreens/events/ScreenWillDisappearEvent.kt +18 -0
- package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarBlurEvent.kt +22 -0
- package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarChangeTextEvent.kt +28 -0
- package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarCloseEvent.kt +22 -0
- package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarFocusEvent.kt +22 -0
- package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarOpenEvent.kt +22 -0
- package/android/src/main/java/com/swmansion/rnscreens/events/SearchBarSearchButtonPressEvent.kt +24 -0
- package/android/src/main/java/com/swmansion/rnscreens/events/StackFinishTransitioningEvent.kt +18 -0
- package/android/src/main/java/com/swmansion/rnscreens/utils/DeviceUtils.kt +12 -0
- package/android/src/main/jni/CMakeLists.txt +72 -0
- package/android/src/main/jni/rnscreens.cpp +16 -0
- package/android/src/main/jni/rnscreens.h +28 -0
- package/android/src/main/res/base/anim/rns_default_enter_in.xml +18 -0
- package/android/src/main/res/base/anim/rns_default_enter_out.xml +19 -0
- package/android/src/main/res/base/anim/rns_default_exit_in.xml +17 -0
- package/android/src/main/res/base/anim/rns_default_exit_out.xml +18 -0
- package/android/src/main/res/base/anim/rns_fade_from_bottom.xml +14 -0
- package/android/src/main/res/base/anim/rns_fade_in.xml +7 -0
- package/android/src/main/res/base/anim/rns_fade_out.xml +7 -0
- package/android/src/main/res/base/anim/rns_fade_to_bottom.xml +15 -0
- package/android/src/main/res/base/anim/rns_no_animation_20.xml +6 -0
- package/android/src/main/res/base/anim/rns_no_animation_250.xml +7 -0
- package/android/src/main/res/base/anim/rns_no_animation_350.xml +6 -0
- package/android/src/main/res/base/anim/rns_no_animation_medium.xml +7 -0
- package/android/src/main/res/base/anim/rns_slide_in_from_bottom.xml +7 -0
- package/android/src/main/res/base/anim/rns_slide_in_from_left.xml +5 -0
- package/android/src/main/res/base/anim/rns_slide_in_from_right.xml +5 -0
- package/android/src/main/res/base/anim/rns_slide_out_to_bottom.xml +7 -0
- package/android/src/main/res/base/anim/rns_slide_out_to_left.xml +5 -0
- package/android/src/main/res/base/anim/rns_slide_out_to_right.xml +5 -0
- package/android/src/main/res/base/anim/rns_standard_accelerate_interpolator.xml +6 -0
- package/android/src/main/res/v33/anim-v33/rns_default_enter_in.xml +38 -0
- package/android/src/main/res/v33/anim-v33/rns_default_enter_out.xml +38 -0
- package/android/src/main/res/v33/anim-v33/rns_default_exit_in.xml +38 -0
- package/android/src/main/res/v33/anim-v33/rns_default_exit_out.xml +38 -0
- package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenManagerDelegate.java +111 -0
- package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenManagerInterface.java +44 -0
- package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderConfigManagerDelegate.java +107 -0
- package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderConfigManagerInterface.java +42 -0
- package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderSubviewManagerDelegate.java +31 -0
- package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderSubviewManagerInterface.java +17 -0
- package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackManagerDelegate.java +25 -0
- package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackManagerInterface.java +16 -0
- package/android/src/paper/java/com/swmansion/rnscreens/FabricEnabledViewGroup.kt +10 -0
- package/common/cpp/react/renderer/components/rnscreens/RNSScreenComponentDescriptor.h +41 -0
- package/common/cpp/react/renderer/components/rnscreens/RNSScreenShadowNode.cpp +9 -0
- package/common/cpp/react/renderer/components/rnscreens/RNSScreenShadowNode.h +30 -0
- package/common/cpp/react/renderer/components/rnscreens/RNSScreenState.cpp +14 -0
- package/common/cpp/react/renderer/components/rnscreens/RNSScreenState.h +45 -0
- package/ios/RCTImageComponentView+RNSScreenStackHeaderConfig.h +11 -0
- package/ios/RCTImageComponentView+RNSScreenStackHeaderConfig.mm +14 -0
- package/ios/RNSConvert.h +36 -0
- package/ios/RNSConvert.mm +154 -0
- package/ios/RNSEnums.h +71 -0
- package/ios/RNSFullWindowOverlay.h +34 -0
- package/ios/RNSFullWindowOverlay.mm +241 -0
- package/ios/RNSScreen.h +144 -0
- package/ios/RNSScreen.mm +1599 -0
- package/ios/RNSScreenContainer.h +45 -0
- package/ios/RNSScreenContainer.mm +343 -0
- package/ios/RNSScreenNavigationContainer.h +16 -0
- package/ios/RNSScreenNavigationContainer.mm +66 -0
- package/ios/RNSScreenStack.h +37 -0
- package/ios/RNSScreenStack.mm +1111 -0
- package/ios/RNSScreenStackAnimator.h +8 -0
- package/ios/RNSScreenStackAnimator.mm +320 -0
- package/ios/RNSScreenStackHeaderConfig.h +74 -0
- package/ios/RNSScreenStackHeaderConfig.mm +967 -0
- package/ios/RNSScreenStackHeaderSubview.h +44 -0
- package/ios/RNSScreenStackHeaderSubview.mm +147 -0
- package/ios/RNSScreenWindowTraits.h +26 -0
- package/ios/RNSScreenWindowTraits.mm +266 -0
- package/ios/RNSSearchBar.h +43 -0
- package/ios/RNSSearchBar.mm +465 -0
- package/ios/RNScreens.xcodeproj/project.pbxproj +461 -0
- package/ios/UIViewController+RNScreens.h +9 -0
- package/ios/UIViewController+RNScreens.mm +78 -0
- package/ios/UIWindow+RNScreens.h +9 -0
- package/ios/UIWindow+RNScreens.mm +17 -0
- package/ios/events/RNSHeaderHeightChangeEvent.h +8 -0
- package/ios/events/RNSHeaderHeightChangeEvent.mm +44 -0
- package/ios/events/RNSScreenViewEvent.h +12 -0
- package/ios/events/RNSScreenViewEvent.mm +59 -0
- package/ios/utils/RNSUIBarButtonItem.h +5 -0
- package/ios/utils/RNSUIBarButtonItem.mm +22 -0
- package/kepler-compatibility.json +8 -0
- package/kepler-transformed-package-info.json +3 -0
- package/lib/commonjs/TransitionProgressContext.js +11 -0
- package/lib/commonjs/TransitionProgressContext.js.map +1 -0
- package/lib/commonjs/fabric/FullWindowOverlayNativeComponent.js +11 -0
- package/lib/commonjs/fabric/FullWindowOverlayNativeComponent.js.map +1 -0
- package/lib/commonjs/fabric/ScreenContainerNativeComponent.js +33 -0
- package/lib/commonjs/fabric/ScreenContainerNativeComponent.js.map +1 -0
- package/lib/commonjs/fabric/ScreenNativeComponent.js +70 -0
- package/lib/commonjs/fabric/ScreenNativeComponent.js.map +1 -0
- package/lib/commonjs/fabric/ScreenNavigationContainerNativeComponent.js +11 -0
- package/lib/commonjs/fabric/ScreenNavigationContainerNativeComponent.js.map +1 -0
- package/lib/commonjs/fabric/ScreenStackHeaderConfigNativeComponent.js +31 -0
- package/lib/commonjs/fabric/ScreenStackHeaderConfigNativeComponent.js.map +1 -0
- package/lib/commonjs/fabric/ScreenStackHeaderSubviewNativeComponent.js +12 -0
- package/lib/commonjs/fabric/ScreenStackHeaderSubviewNativeComponent.js.map +1 -0
- package/lib/commonjs/fabric/ScreenStackNativeComponent.js +35 -0
- package/lib/commonjs/fabric/ScreenStackNativeComponent.js.map +1 -0
- package/lib/commonjs/fabric/SearchBarNativeComponent.js +19 -0
- package/lib/commonjs/fabric/SearchBarNativeComponent.js.map +1 -0
- package/lib/commonjs/index.js +147 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/commonjs/index.native.js +407 -0
- package/lib/commonjs/index.native.js.map +1 -0
- package/lib/commonjs/native-stack/index.js +49 -0
- package/lib/commonjs/native-stack/index.js.map +1 -0
- package/lib/commonjs/native-stack/navigators/createNativeStackNavigator.js +75 -0
- package/lib/commonjs/native-stack/navigators/createNativeStackNavigator.js.map +1 -0
- package/lib/commonjs/native-stack/types.js +6 -0
- package/lib/commonjs/native-stack/types.js.map +1 -0
- package/lib/commonjs/native-stack/utils/AnimatedHeaderHeightContext.js +12 -0
- package/lib/commonjs/native-stack/utils/AnimatedHeaderHeightContext.js.map +1 -0
- package/lib/commonjs/native-stack/utils/HeaderHeightContext.js +12 -0
- package/lib/commonjs/native-stack/utils/HeaderHeightContext.js.map +1 -0
- package/lib/commonjs/native-stack/utils/SafeAreaProviderCompat.js +75 -0
- package/lib/commonjs/native-stack/utils/SafeAreaProviderCompat.js.map +1 -0
- package/lib/commonjs/native-stack/utils/getDefaultHeaderHeight.js +35 -0
- package/lib/commonjs/native-stack/utils/getDefaultHeaderHeight.js.map +1 -0
- package/lib/commonjs/native-stack/utils/useAnimatedHeaderHeight.js +19 -0
- package/lib/commonjs/native-stack/utils/useAnimatedHeaderHeight.js.map +1 -0
- package/lib/commonjs/native-stack/utils/useBackPressSubscription.js +54 -0
- package/lib/commonjs/native-stack/utils/useBackPressSubscription.js.map +1 -0
- package/lib/commonjs/native-stack/utils/useHeaderHeight.js +19 -0
- package/lib/commonjs/native-stack/utils/useHeaderHeight.js.map +1 -0
- package/lib/commonjs/native-stack/views/FontProcessor.js +21 -0
- package/lib/commonjs/native-stack/views/FontProcessor.js.map +1 -0
- package/lib/commonjs/native-stack/views/HeaderConfig.js +141 -0
- package/lib/commonjs/native-stack/views/HeaderConfig.js.map +1 -0
- package/lib/commonjs/native-stack/views/NativeStackView.js +354 -0
- package/lib/commonjs/native-stack/views/NativeStackView.js.map +1 -0
- package/lib/commonjs/reanimated/ReanimatedHeaderHeightContext.js +12 -0
- package/lib/commonjs/reanimated/ReanimatedHeaderHeightContext.js.map +1 -0
- package/lib/commonjs/reanimated/ReanimatedNativeStackScreen.js +101 -0
- package/lib/commonjs/reanimated/ReanimatedNativeStackScreen.js.map +1 -0
- package/lib/commonjs/reanimated/ReanimatedScreen.js +22 -0
- package/lib/commonjs/reanimated/ReanimatedScreen.js.map +1 -0
- package/lib/commonjs/reanimated/ReanimatedScreenProvider.js +47 -0
- package/lib/commonjs/reanimated/ReanimatedScreenProvider.js.map +1 -0
- package/lib/commonjs/reanimated/ReanimatedTransitionProgressContext.js +12 -0
- package/lib/commonjs/reanimated/ReanimatedTransitionProgressContext.js.map +1 -0
- package/lib/commonjs/reanimated/index.js +28 -0
- package/lib/commonjs/reanimated/index.js.map +1 -0
- package/lib/commonjs/reanimated/useReanimatedHeaderHeight.js +19 -0
- package/lib/commonjs/reanimated/useReanimatedHeaderHeight.js.map +1 -0
- package/lib/commonjs/reanimated/useReanimatedTransitionProgress.js +19 -0
- package/lib/commonjs/reanimated/useReanimatedTransitionProgress.js.map +1 -0
- package/lib/commonjs/types.js +6 -0
- package/lib/commonjs/types.js.map +1 -0
- package/lib/commonjs/useTransitionProgress.js +19 -0
- package/lib/commonjs/useTransitionProgress.js.map +1 -0
- package/lib/commonjs/utils.js +21 -0
- package/lib/commonjs/utils.js.map +1 -0
- package/lib/module/TransitionProgressContext.js +3 -0
- package/lib/module/TransitionProgressContext.js.map +1 -0
- package/lib/module/fabric/FullWindowOverlayNativeComponent.js +4 -0
- package/lib/module/fabric/FullWindowOverlayNativeComponent.js.map +1 -0
- package/lib/module/fabric/ScreenContainerNativeComponent.js +25 -0
- package/lib/module/fabric/ScreenContainerNativeComponent.js.map +1 -0
- package/lib/module/fabric/ScreenNativeComponent.js +63 -0
- package/lib/module/fabric/ScreenNativeComponent.js.map +1 -0
- package/lib/module/fabric/ScreenNavigationContainerNativeComponent.js +4 -0
- package/lib/module/fabric/ScreenNavigationContainerNativeComponent.js.map +1 -0
- package/lib/module/fabric/ScreenStackHeaderConfigNativeComponent.js +23 -0
- package/lib/module/fabric/ScreenStackHeaderConfigNativeComponent.js.map +1 -0
- package/lib/module/fabric/ScreenStackHeaderSubviewNativeComponent.js +7 -0
- package/lib/module/fabric/ScreenStackHeaderSubviewNativeComponent.js.map +1 -0
- package/lib/module/fabric/ScreenStackNativeComponent.js +28 -0
- package/lib/module/fabric/ScreenStackNativeComponent.js.map +1 -0
- package/lib/module/fabric/SearchBarNativeComponent.js +10 -0
- package/lib/module/fabric/SearchBarNativeComponent.js.map +1 -0
- package/lib/module/index.js +67 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/index.native.js +410 -0
- package/lib/module/index.native.js.map +1 -0
- package/lib/module/native-stack/index.js +22 -0
- package/lib/module/native-stack/index.js.map +1 -0
- package/lib/module/native-stack/navigators/createNativeStackNavigator.js +72 -0
- package/lib/module/native-stack/navigators/createNativeStackNavigator.js.map +1 -0
- package/lib/module/native-stack/types.js +2 -0
- package/lib/module/native-stack/types.js.map +1 -0
- package/lib/module/native-stack/utils/AnimatedHeaderHeightContext.js +4 -0
- package/lib/module/native-stack/utils/AnimatedHeaderHeightContext.js.map +1 -0
- package/lib/module/native-stack/utils/HeaderHeightContext.js +4 -0
- package/lib/module/native-stack/utils/HeaderHeightContext.js.map +1 -0
- package/lib/module/native-stack/utils/SafeAreaProviderCompat.js +68 -0
- package/lib/module/native-stack/utils/SafeAreaProviderCompat.js.map +1 -0
- package/lib/module/native-stack/utils/getDefaultHeaderHeight.js +29 -0
- package/lib/module/native-stack/utils/getDefaultHeaderHeight.js.map +1 -0
- package/lib/module/native-stack/utils/useAnimatedHeaderHeight.js +10 -0
- package/lib/module/native-stack/utils/useAnimatedHeaderHeight.js.map +1 -0
- package/lib/module/native-stack/utils/useBackPressSubscription.js +47 -0
- package/lib/module/native-stack/utils/useBackPressSubscription.js.map +1 -0
- package/lib/module/native-stack/utils/useHeaderHeight.js +10 -0
- package/lib/module/native-stack/utils/useHeaderHeight.js.map +1 -0
- package/lib/module/native-stack/views/FontProcessor.js +13 -0
- package/lib/module/native-stack/views/FontProcessor.js.map +1 -0
- package/lib/module/native-stack/views/HeaderConfig.js +132 -0
- package/lib/module/native-stack/views/HeaderConfig.js.map +1 -0
- package/lib/module/native-stack/views/NativeStackView.js +355 -0
- package/lib/module/native-stack/views/NativeStackView.js.map +1 -0
- package/lib/module/reanimated/ReanimatedHeaderHeightContext.js +5 -0
- package/lib/module/reanimated/ReanimatedHeaderHeightContext.js.map +1 -0
- package/lib/module/reanimated/ReanimatedNativeStackScreen.js +97 -0
- package/lib/module/reanimated/ReanimatedNativeStackScreen.js.map +1 -0
- package/lib/module/reanimated/ReanimatedScreen.js +17 -0
- package/lib/module/reanimated/ReanimatedScreen.js.map +1 -0
- package/lib/module/reanimated/ReanimatedScreenProvider.js +40 -0
- package/lib/module/reanimated/ReanimatedScreenProvider.js.map +1 -0
- package/lib/module/reanimated/ReanimatedTransitionProgressContext.js +5 -0
- package/lib/module/reanimated/ReanimatedTransitionProgressContext.js.map +1 -0
- package/lib/module/reanimated/index.js +4 -0
- package/lib/module/reanimated/index.js.map +1 -0
- package/lib/module/reanimated/useReanimatedHeaderHeight.js +10 -0
- package/lib/module/reanimated/useReanimatedHeaderHeight.js.map +1 -0
- package/lib/module/reanimated/useReanimatedTransitionProgress.js +10 -0
- package/lib/module/reanimated/useReanimatedTransitionProgress.js.map +1 -0
- package/lib/module/types.js +2 -0
- package/lib/module/types.js.map +1 -0
- package/lib/module/useTransitionProgress.js +10 -0
- package/lib/module/useTransitionProgress.js.map +1 -0
- package/lib/module/utils.js +14 -0
- package/lib/module/utils.js.map +1 -0
- package/lib/typescript/TransitionProgressContext.d.ts +9 -0
- package/lib/typescript/fabric/FullWindowOverlayNativeComponent.d.ts +7 -0
- package/lib/typescript/fabric/ScreenContainerNativeComponent.d.ts +5 -0
- package/lib/typescript/fabric/ScreenNativeComponent.d.ts +66 -0
- package/lib/typescript/fabric/ScreenNavigationContainerNativeComponent.d.ts +7 -0
- package/lib/typescript/fabric/ScreenStackHeaderConfigNativeComponent.d.ts +33 -0
- package/lib/typescript/fabric/ScreenStackHeaderSubviewNativeComponent.d.ts +10 -0
- package/lib/typescript/fabric/ScreenStackNativeComponent.d.ts +8 -0
- package/lib/typescript/fabric/SearchBarNativeComponent.d.ts +49 -0
- package/lib/typescript/index.d.ts +33 -0
- package/lib/typescript/index.native.d.ts +2 -0
- package/lib/typescript/native-stack/index.d.ts +19 -0
- package/lib/typescript/native-stack/navigators/createNativeStackNavigator.d.ts +6 -0
- package/lib/typescript/native-stack/types.d.ts +438 -0
- package/lib/typescript/native-stack/utils/AnimatedHeaderHeightContext.d.ts +4 -0
- package/lib/typescript/native-stack/utils/HeaderHeightContext.d.ts +3 -0
- package/lib/typescript/native-stack/utils/SafeAreaProviderCompat.d.ts +11 -0
- package/lib/typescript/native-stack/utils/getDefaultHeaderHeight.d.ts +7 -0
- package/lib/typescript/native-stack/utils/useAnimatedHeaderHeight.d.ts +1 -0
- package/lib/typescript/native-stack/utils/useBackPressSubscription.d.ts +16 -0
- package/lib/typescript/native-stack/utils/useHeaderHeight.d.ts +1 -0
- package/lib/typescript/native-stack/views/FontProcessor.d.ts +1 -0
- package/lib/typescript/native-stack/views/HeaderConfig.d.ts +8 -0
- package/lib/typescript/native-stack/views/NativeStackView.d.ts +10 -0
- package/lib/typescript/reanimated/ReanimatedHeaderHeightContext.d.ts +4 -0
- package/lib/typescript/reanimated/ReanimatedNativeStackScreen.d.ts +5 -0
- package/lib/typescript/reanimated/ReanimatedScreen.d.ts +5 -0
- package/lib/typescript/reanimated/ReanimatedScreenProvider.d.ts +2 -0
- package/lib/typescript/reanimated/ReanimatedTransitionProgressContext.d.ts +9 -0
- package/lib/typescript/reanimated/index.d.ts +3 -0
- package/lib/typescript/reanimated/useReanimatedHeaderHeight.d.ts +3 -0
- package/lib/typescript/reanimated/useReanimatedTransitionProgress.d.ts +11 -0
- package/lib/typescript/types.d.ts +612 -0
- package/lib/typescript/useTransitionProgress.d.ts +5 -0
- package/lib/typescript/utils.d.ts +3 -0
- package/native-stack/README.md +814 -0
- package/native-stack/package.json +6 -0
- package/package.json +1 -0
- package/react-native.config.js +42 -0
- package/reanimated/package.json +6 -0
- package/src/TransitionProgressContext.tsx +12 -0
- package/src/fabric/FullWindowOverlayNativeComponent.ts +7 -0
- package/src/fabric/ScreenContainerNativeComponent.ts +28 -0
- package/src/fabric/ScreenNativeComponent.ts +158 -0
- package/src/fabric/ScreenNavigationContainerNativeComponent.ts +10 -0
- package/src/fabric/ScreenStackHeaderConfigNativeComponent.ts +61 -0
- package/src/fabric/ScreenStackHeaderSubviewNativeComponent.ts +22 -0
- package/src/fabric/ScreenStackNativeComponent.ts +33 -0
- package/src/fabric/SearchBarNativeComponent.ts +79 -0
- package/src/index.native.tsx +599 -0
- package/src/index.tsx +119 -0
- package/src/native-stack/index.tsx +27 -0
- package/src/native-stack/navigators/createNativeStackNavigator.tsx +107 -0
- package/src/native-stack/types.tsx +486 -0
- package/src/native-stack/utils/AnimatedHeaderHeightContext.tsx +8 -0
- package/src/native-stack/utils/HeaderHeightContext.tsx +5 -0
- package/src/native-stack/utils/SafeAreaProviderCompat.tsx +78 -0
- package/src/native-stack/utils/getDefaultHeaderHeight.tsx +41 -0
- package/src/native-stack/utils/useAnimatedHeaderHeight.tsx +15 -0
- package/src/native-stack/utils/useBackPressSubscription.tsx +66 -0
- package/src/native-stack/utils/useHeaderHeight.tsx +15 -0
- package/src/native-stack/views/FontProcessor.tsx +14 -0
- package/src/native-stack/views/HeaderConfig.tsx +187 -0
- package/src/native-stack/views/NativeStackView.tsx +466 -0
- package/src/reanimated/ReanimatedHeaderHeightContext.tsx +7 -0
- package/src/reanimated/ReanimatedNativeStackScreen.tsx +130 -0
- package/src/reanimated/ReanimatedScreen.tsx +25 -0
- package/src/reanimated/ReanimatedScreenProvider.tsx +42 -0
- package/src/reanimated/ReanimatedTransitionProgressContext.tsx +13 -0
- package/src/reanimated/index.tsx +3 -0
- package/src/reanimated/useReanimatedHeaderHeight.tsx +14 -0
- package/src/reanimated/useReanimatedTransitionProgress.tsx +14 -0
- package/src/types.tsx +699 -0
- package/src/useTransitionProgress.tsx +15 -0
- package/src/utils.ts +18 -0
- package/windows/README.md +25 -0
- package/windows/RNScreens/PropertySheet.props +16 -0
- package/windows/RNScreens/RNScreens.cpp +66 -0
- package/windows/RNScreens/RNScreens.def +3 -0
- package/windows/RNScreens/RNScreens.h +41 -0
- package/windows/RNScreens/RNScreens.idl +8 -0
- package/windows/RNScreens/RNScreens.vcxproj +187 -0
- package/windows/RNScreens/RNScreens.vcxproj.filters +52 -0
- package/windows/RNScreens/ReactPackageProvider.cpp +30 -0
- package/windows/RNScreens/ReactPackageProvider.h +17 -0
- package/windows/RNScreens/ReactPackageProvider.idl +9 -0
- package/windows/RNScreens/Screen.cpp +122 -0
- package/windows/RNScreens/Screen.h +64 -0
- package/windows/RNScreens/ScreenContainer.cpp +49 -0
- package/windows/RNScreens/ScreenContainer.h +23 -0
- package/windows/RNScreens/ScreenContainerViewManager.cpp +133 -0
- package/windows/RNScreens/ScreenContainerViewManager.h +78 -0
- package/windows/RNScreens/ScreenStack.cpp +65 -0
- package/windows/RNScreens/ScreenStack.h +23 -0
- package/windows/RNScreens/ScreenStackHeaderConfig.cpp +19 -0
- package/windows/RNScreens/ScreenStackHeaderConfig.h +14 -0
- package/windows/RNScreens/ScreenStackHeaderConfigViewManager.cpp +89 -0
- package/windows/RNScreens/ScreenStackHeaderConfigViewManager.h +62 -0
- package/windows/RNScreens/ScreenStackViewManager.cpp +132 -0
- package/windows/RNScreens/ScreenStackViewManager.h +78 -0
- package/windows/RNScreens/ScreenViewManager.cpp +154 -0
- package/windows/RNScreens/ScreenViewManager.h +78 -0
- package/windows/RNScreens/packages.config +4 -0
- package/windows/RNScreens/pch.cpp +1 -0
- package/windows/RNScreens/pch.h +9 -0
- package/windows/RNScreens62.sln +254 -0
- package/windows/RNScreens63.sln +225 -0
- package/windows/RNScreens65.sln +144 -0
|
@@ -0,0 +1,372 @@
|
|
|
1
|
+
package com.swmansion.rnscreens
|
|
2
|
+
|
|
3
|
+
import android.content.Context
|
|
4
|
+
import android.content.ContextWrapper
|
|
5
|
+
import android.view.View
|
|
6
|
+
import android.view.ViewGroup
|
|
7
|
+
import android.view.ViewParent
|
|
8
|
+
import android.view.inputmethod.InputMethodManager
|
|
9
|
+
import androidx.fragment.app.Fragment
|
|
10
|
+
import androidx.fragment.app.FragmentActivity
|
|
11
|
+
import androidx.fragment.app.FragmentManager
|
|
12
|
+
import androidx.fragment.app.FragmentTransaction
|
|
13
|
+
import com.facebook.react.ReactRootView
|
|
14
|
+
import com.facebook.react.bridge.ReactContext
|
|
15
|
+
import com.facebook.react.modules.core.ChoreographerCompat
|
|
16
|
+
import com.facebook.react.modules.core.ReactChoreographer
|
|
17
|
+
import com.swmansion.rnscreens.Screen.ActivityState
|
|
18
|
+
|
|
19
|
+
open class ScreenContainer(context: Context?) : ViewGroup(context) {
|
|
20
|
+
@JvmField
|
|
21
|
+
protected val mScreenFragments = ArrayList<ScreenFragmentWrapper>()
|
|
22
|
+
@JvmField
|
|
23
|
+
protected var mFragmentManager: FragmentManager? = null
|
|
24
|
+
private var mIsAttached = false
|
|
25
|
+
private var mNeedUpdate = false
|
|
26
|
+
private var mLayoutEnqueued = false
|
|
27
|
+
private val mLayoutCallback: ChoreographerCompat.FrameCallback = object : ChoreographerCompat.FrameCallback() {
|
|
28
|
+
override fun doFrame(frameTimeNanos: Long) {
|
|
29
|
+
mLayoutEnqueued = false
|
|
30
|
+
measure(
|
|
31
|
+
MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY),
|
|
32
|
+
MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY)
|
|
33
|
+
)
|
|
34
|
+
layout(left, top, right, bottom)
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
private var mParentScreenFragment: ScreenFragmentWrapper? = null
|
|
38
|
+
|
|
39
|
+
override fun onLayout(changed: Boolean, l: Int, t: Int, r: Int, b: Int) {
|
|
40
|
+
var i = 0
|
|
41
|
+
val size = childCount
|
|
42
|
+
while (i < size) {
|
|
43
|
+
getChildAt(i).layout(0, 0, width, height)
|
|
44
|
+
i++
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
override fun removeView(view: View) {
|
|
49
|
+
// The below block is a workaround for an issue with keyboard handling within fragments. Despite
|
|
50
|
+
// Android handles input focus on the fragments that leave the screen, the keyboard stays open
|
|
51
|
+
// in a number of cases. The issue can be best reproduced on Android 5 devices, before some
|
|
52
|
+
// changes in Android's InputMethodManager have been introduced (specifically around dismissing
|
|
53
|
+
// the keyboard in onDetachedFromWindow). However, we also noticed the keyboard issue happen
|
|
54
|
+
// intermittently on recent versions of Android as well. The issue hasn't been previously
|
|
55
|
+
// noticed as in React Native <= 0.61 there was a logic that'd trigger keyboard dismiss upon a
|
|
56
|
+
// blur event (the blur even gets dispatched properly, the keyboard just stays open despite
|
|
57
|
+
// that) – note the change in RN core here:
|
|
58
|
+
// https://github.com/facebook/react-native/commit/e9b4928311513d3cbbd9d875827694eab6cfa932
|
|
59
|
+
// The workaround is to force-hide keyboard when the screen that has focus is dismissed (we
|
|
60
|
+
// detect that in removeView as super.removeView causes the input view to un focus while keeping
|
|
61
|
+
// the keyboard open).
|
|
62
|
+
if (view === focusedChild) {
|
|
63
|
+
(context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager)
|
|
64
|
+
.hideSoftInputFromWindow(windowToken, InputMethodManager.HIDE_NOT_ALWAYS)
|
|
65
|
+
}
|
|
66
|
+
super.removeView(view)
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
override fun requestLayout() {
|
|
70
|
+
super.requestLayout()
|
|
71
|
+
@Suppress("SENSELESS_COMPARISON") // mLayoutCallback can be null here since this method can be called in init
|
|
72
|
+
if (!mLayoutEnqueued && mLayoutCallback != null) {
|
|
73
|
+
mLayoutEnqueued = true
|
|
74
|
+
// we use NATIVE_ANIMATED_MODULE choreographer queue because it allows us to catch the current
|
|
75
|
+
// looper loop instead of enqueueing the update in the next loop causing a one frame delay.
|
|
76
|
+
ReactChoreographer.getInstance()
|
|
77
|
+
.postFrameCallback(
|
|
78
|
+
ReactChoreographer.CallbackType.NATIVE_ANIMATED_MODULE, mLayoutCallback
|
|
79
|
+
)
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
val isNested: Boolean
|
|
84
|
+
get() = mParentScreenFragment != null
|
|
85
|
+
|
|
86
|
+
fun notifyChildUpdate() {
|
|
87
|
+
performUpdatesNow()
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
protected open fun adapt(screen: Screen): ScreenFragmentWrapper = ScreenFragment(screen)
|
|
91
|
+
|
|
92
|
+
fun addScreen(screen: Screen, index: Int) {
|
|
93
|
+
val fragment = adapt(screen)
|
|
94
|
+
screen.fragmentWrapper = fragment
|
|
95
|
+
mScreenFragments.add(index, fragment)
|
|
96
|
+
screen.container = this
|
|
97
|
+
onScreenChanged()
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
open fun removeScreenAt(index: Int) {
|
|
101
|
+
mScreenFragments[index].screen.container = null
|
|
102
|
+
mScreenFragments.removeAt(index)
|
|
103
|
+
onScreenChanged()
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
open fun removeAllScreens() {
|
|
107
|
+
for (screenFragment in mScreenFragments) {
|
|
108
|
+
screenFragment.screen.container = null
|
|
109
|
+
}
|
|
110
|
+
mScreenFragments.clear()
|
|
111
|
+
onScreenChanged()
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
val screenCount: Int
|
|
115
|
+
get() = mScreenFragments.size
|
|
116
|
+
|
|
117
|
+
fun getScreenAt(index: Int): Screen = mScreenFragments[index].screen
|
|
118
|
+
|
|
119
|
+
fun getScreenFragmentWrapperAt(index: Int): ScreenFragmentWrapper = mScreenFragments[index]
|
|
120
|
+
|
|
121
|
+
open val topScreen: Screen?
|
|
122
|
+
get() = mScreenFragments.firstOrNull { getActivityState(it) === ActivityState.ON_TOP }?.screen
|
|
123
|
+
|
|
124
|
+
private fun setFragmentManager(fm: FragmentManager) {
|
|
125
|
+
mFragmentManager = fm
|
|
126
|
+
performUpdatesNow()
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
private fun findFragmentManagerForReactRootView(rootView: ReactRootView): FragmentManager {
|
|
130
|
+
var context = rootView.context
|
|
131
|
+
|
|
132
|
+
// ReactRootView is expected to be initialized with the main React Activity as a context but
|
|
133
|
+
// in case of Expo the activity is wrapped in ContextWrapper and we need to unwrap it
|
|
134
|
+
while (context !is FragmentActivity && context is ContextWrapper) {
|
|
135
|
+
context = context.baseContext
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
check(context is FragmentActivity) {
|
|
139
|
+
"In order to use RNScreens components your app's activity need to extend ReactActivity"
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// In case React Native is loaded on a Fragment (not directly in activity) we need to find
|
|
143
|
+
// fragment manager whose fragment's view is ReactRootView. As of now, we detect such case by
|
|
144
|
+
// checking whether any fragments are attached to activity which hosts ReactRootView.
|
|
145
|
+
// See: https://github.com/software-mansion/react-native-screens/issues/1506 on why the cases
|
|
146
|
+
// must be treated separately.
|
|
147
|
+
return if (context.supportFragmentManager.fragments.isEmpty()) {
|
|
148
|
+
// We are in standard React Native application w/o custom native navigation based on fragments.
|
|
149
|
+
context.supportFragmentManager
|
|
150
|
+
} else {
|
|
151
|
+
// We are in some custom setup & we want to use the closest fragment manager in hierarchy.
|
|
152
|
+
// `findFragment` method throws IllegalStateException when it fails to resolve appropriate
|
|
153
|
+
// fragment. It might happen when e.g. React Native is loaded directly in Activity
|
|
154
|
+
// but some custom fragments are still used. Such use case seems highly unlikely
|
|
155
|
+
// so, as for now we fallback to activity's FragmentManager in hope for the best.
|
|
156
|
+
try {
|
|
157
|
+
FragmentManager.findFragment<Fragment>(rootView).childFragmentManager
|
|
158
|
+
} catch (ex: IllegalStateException) {
|
|
159
|
+
context.supportFragmentManager
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
private fun setupFragmentManager() {
|
|
165
|
+
var parent: ViewParent = this
|
|
166
|
+
// We traverse view hierarchy up until we find screen parent or a root view
|
|
167
|
+
while (!(parent is ReactRootView || parent is Screen) &&
|
|
168
|
+
parent.parent != null
|
|
169
|
+
) {
|
|
170
|
+
parent = parent.parent
|
|
171
|
+
}
|
|
172
|
+
// If parent is of type Screen it means we are inside a nested fragment structure.
|
|
173
|
+
// Otherwise we expect to connect directly with root view and get root fragment manager
|
|
174
|
+
if (parent is Screen) {
|
|
175
|
+
checkNotNull(
|
|
176
|
+
parent.fragmentWrapper?.let { fragmentWrapper ->
|
|
177
|
+
mParentScreenFragment = fragmentWrapper
|
|
178
|
+
fragmentWrapper.addChildScreenContainer(this)
|
|
179
|
+
setFragmentManager(fragmentWrapper.fragment.childFragmentManager)
|
|
180
|
+
}
|
|
181
|
+
) { "Parent Screen does not have its Fragment attached" }
|
|
182
|
+
} else {
|
|
183
|
+
// we expect top level view to be of type ReactRootView, this isn't really necessary but in
|
|
184
|
+
// order to find root view we test if parent is null. This could potentially happen also when
|
|
185
|
+
// the view is detached from the hierarchy and that test would not correctly indicate the root
|
|
186
|
+
// view. So in order to make sure we indeed reached the root we test if it is of a correct type.
|
|
187
|
+
// This allows us to provide a more descriptive error message for the aforementioned case.
|
|
188
|
+
check(parent is ReactRootView) { "ScreenContainer is not attached under ReactRootView" }
|
|
189
|
+
setFragmentManager(findFragmentManagerForReactRootView(parent))
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
protected fun createTransaction(): FragmentTransaction {
|
|
194
|
+
return requireNotNull(mFragmentManager) { "mFragmentManager is null when creating transaction" }
|
|
195
|
+
.beginTransaction()
|
|
196
|
+
.setReorderingAllowed(true)
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
private fun attachScreen(transaction: FragmentTransaction, fragment: Fragment) {
|
|
200
|
+
transaction.add(id, fragment)
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
private fun detachScreen(transaction: FragmentTransaction, fragment: Fragment) {
|
|
204
|
+
transaction.remove(fragment)
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
private fun getActivityState(screenFragmentWrapper: ScreenFragmentWrapper): ActivityState? =
|
|
208
|
+
screenFragmentWrapper.screen.activityState
|
|
209
|
+
|
|
210
|
+
open fun hasScreen(screenFragmentWrapper: ScreenFragmentWrapper?): Boolean =
|
|
211
|
+
mScreenFragments.contains(screenFragmentWrapper)
|
|
212
|
+
|
|
213
|
+
override fun onAttachedToWindow() {
|
|
214
|
+
super.onAttachedToWindow()
|
|
215
|
+
mIsAttached = true
|
|
216
|
+
setupFragmentManager()
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
/** Removes fragments from fragment manager that are attached to this container */
|
|
220
|
+
private fun removeMyFragments(fragmentManager: FragmentManager) {
|
|
221
|
+
val transaction = fragmentManager.beginTransaction()
|
|
222
|
+
var hasFragments = false
|
|
223
|
+
for (fragment in fragmentManager.fragments) {
|
|
224
|
+
if (fragment is ScreenFragment && fragment.screen.container === this) {
|
|
225
|
+
transaction.remove(fragment)
|
|
226
|
+
hasFragments = true
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
if (hasFragments) {
|
|
231
|
+
transaction.commitNowAllowingStateLoss()
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
override fun onDetachedFromWindow() {
|
|
236
|
+
// if there are pending transactions and this view is about to get detached we need to perform
|
|
237
|
+
// them here as otherwise fragment manager will crash because it won't be able to find container
|
|
238
|
+
// view. We also need to make sure all the fragments attached to the given container are removed
|
|
239
|
+
// from fragment manager as in some cases fragment manager may be reused and in such case it'd
|
|
240
|
+
// attempt to reattach previously registered fragments that are not removed
|
|
241
|
+
mFragmentManager?.let {
|
|
242
|
+
if (!it.isDestroyed) {
|
|
243
|
+
removeMyFragments(it)
|
|
244
|
+
it.executePendingTransactions()
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
mParentScreenFragment?.removeChildScreenContainer(this)
|
|
249
|
+
mParentScreenFragment = null
|
|
250
|
+
|
|
251
|
+
super.onDetachedFromWindow()
|
|
252
|
+
mIsAttached = false
|
|
253
|
+
// When fragment container view is detached we force all its children to be removed.
|
|
254
|
+
// It is because children screens are controlled by their fragments, which can often have a
|
|
255
|
+
// delayed lifecycle (due to transitions). As a result due to ongoing transitions the fragment
|
|
256
|
+
// may choose not to remove the view despite the parent container being completely detached
|
|
257
|
+
// from the view hierarchy until the transition is over. In such a case when the container gets
|
|
258
|
+
// re-attached while the transition is ongoing, the child view would still be there and we'd
|
|
259
|
+
// attempt to re-attach it to with a misconfigured fragment. This would result in a crash. To
|
|
260
|
+
// avoid it we clear all the children here as we attach all the child fragments when the
|
|
261
|
+
// container is reattached anyways. We don't use `removeAllViews` since it does not check if the
|
|
262
|
+
// children are not already detached, which may lead to calling `onDetachedFromWindow` on them
|
|
263
|
+
// twice.
|
|
264
|
+
// We also get the size earlier, because we will be removing child views in `for` loop.
|
|
265
|
+
for (i in childCount - 1 downTo 0) {
|
|
266
|
+
removeViewAt(i)
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
|
|
271
|
+
super.onMeasure(widthMeasureSpec, heightMeasureSpec)
|
|
272
|
+
for (i in 0 until childCount) {
|
|
273
|
+
getChildAt(i).measure(widthMeasureSpec, heightMeasureSpec)
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
private fun onScreenChanged() {
|
|
278
|
+
// we perform update in `onBeforeLayout` of `ScreensShadowNode` by adding an UIBlock
|
|
279
|
+
// which is called after updating children of the ScreenContainer.
|
|
280
|
+
// We do it there because `onUpdate` logic requires all changes of children to be already
|
|
281
|
+
// made in order to provide proper animation for fragment transition for ScreenStack
|
|
282
|
+
// and this in turn makes nested ScreenContainers detach too early and disappear
|
|
283
|
+
// before transition if also not dispatched after children updates.
|
|
284
|
+
// The exception to this rule is `updateImmediately` which is triggered by actions
|
|
285
|
+
// not connected to React view hierarchy changes, but rather internal events
|
|
286
|
+
mNeedUpdate = true
|
|
287
|
+
(context as? ReactContext)?.runOnUiQueueThread {
|
|
288
|
+
// We schedule the update here because LayoutAnimations of `react-native-reanimated`
|
|
289
|
+
// sometimes attach/detach screens after the layout block of `ScreensShadowNode` has
|
|
290
|
+
// already run, and we want to update the container then too. In the other cases,
|
|
291
|
+
// this code will do nothing since it will run after the UIBlock when `mNeedUpdate`
|
|
292
|
+
// will already be false.
|
|
293
|
+
performUpdates()
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
protected fun performUpdatesNow() {
|
|
298
|
+
// we want to update immediately when the fragment manager is set or native back button
|
|
299
|
+
// dismiss is dispatched or Screen's activityState changes since it is not connected to React
|
|
300
|
+
// view hierarchy changes and will not trigger `onBeforeLayout` method of `ScreensShadowNode`
|
|
301
|
+
mNeedUpdate = true
|
|
302
|
+
performUpdates()
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
fun performUpdates() {
|
|
306
|
+
if (!mNeedUpdate || !mIsAttached || mFragmentManager == null || mFragmentManager?.isDestroyed == true) {
|
|
307
|
+
return
|
|
308
|
+
}
|
|
309
|
+
mNeedUpdate = false
|
|
310
|
+
onUpdate()
|
|
311
|
+
notifyContainerUpdate()
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
open fun onUpdate() {
|
|
315
|
+
createTransaction().let {
|
|
316
|
+
// detach screens that are no longer active
|
|
317
|
+
val orphaned: MutableSet<Fragment> = HashSet(
|
|
318
|
+
requireNotNull(mFragmentManager) {
|
|
319
|
+
"mFragmentManager is null when performing update in ScreenContainer"
|
|
320
|
+
}.fragments
|
|
321
|
+
)
|
|
322
|
+
for (fragmentWrapper in mScreenFragments) {
|
|
323
|
+
if (getActivityState(fragmentWrapper) === ActivityState.INACTIVE &&
|
|
324
|
+
fragmentWrapper.fragment.isAdded
|
|
325
|
+
) {
|
|
326
|
+
detachScreen(it, fragmentWrapper.fragment)
|
|
327
|
+
}
|
|
328
|
+
orphaned.remove(fragmentWrapper.fragment)
|
|
329
|
+
}
|
|
330
|
+
if (orphaned.isNotEmpty()) {
|
|
331
|
+
val orphanedAry = orphaned.toTypedArray()
|
|
332
|
+
for (fragment in orphanedAry) {
|
|
333
|
+
if (fragment is ScreenFragment) {
|
|
334
|
+
if (fragment.screen.container == null) {
|
|
335
|
+
detachScreen(it, fragment)
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
// if there is an "onTop" screen it means the transition has ended
|
|
342
|
+
val transitioning = topScreen == null
|
|
343
|
+
|
|
344
|
+
// attach newly activated screens
|
|
345
|
+
var addedBefore = false
|
|
346
|
+
val pendingFront: ArrayList<ScreenFragmentWrapper> = ArrayList()
|
|
347
|
+
|
|
348
|
+
for (fragmentWrapper in mScreenFragments) {
|
|
349
|
+
val activityState = getActivityState(fragmentWrapper)
|
|
350
|
+
if (activityState !== ActivityState.INACTIVE && !fragmentWrapper.fragment.isAdded) {
|
|
351
|
+
addedBefore = true
|
|
352
|
+
attachScreen(it, fragmentWrapper.fragment)
|
|
353
|
+
} else if (activityState !== ActivityState.INACTIVE && addedBefore) {
|
|
354
|
+
// we detach the screen and then reattach it later to make it appear on front
|
|
355
|
+
detachScreen(it, fragmentWrapper.fragment)
|
|
356
|
+
pendingFront.add(fragmentWrapper)
|
|
357
|
+
}
|
|
358
|
+
fragmentWrapper.screen.setTransitioning(transitioning)
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
for (screenFragment in pendingFront) {
|
|
362
|
+
attachScreen(it, screenFragment.fragment)
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
it.commitNowAllowingStateLoss()
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
protected open fun notifyContainerUpdate() {
|
|
370
|
+
topScreen?.fragmentWrapper?.onContainerUpdate()
|
|
371
|
+
}
|
|
372
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
package com.swmansion.rnscreens
|
|
2
|
+
|
|
3
|
+
import android.view.View
|
|
4
|
+
import com.facebook.react.bridge.ReactApplicationContext
|
|
5
|
+
import com.facebook.react.module.annotations.ReactModule
|
|
6
|
+
import com.facebook.react.uimanager.LayoutShadowNode
|
|
7
|
+
import com.facebook.react.uimanager.ThemedReactContext
|
|
8
|
+
import com.facebook.react.uimanager.ViewGroupManager
|
|
9
|
+
|
|
10
|
+
@ReactModule(name = ScreenContainerViewManager.REACT_CLASS)
|
|
11
|
+
class ScreenContainerViewManager : ViewGroupManager<ScreenContainer>() {
|
|
12
|
+
override fun getName(): String = REACT_CLASS
|
|
13
|
+
|
|
14
|
+
override fun createViewInstance(reactContext: ThemedReactContext): ScreenContainer = ScreenContainer(reactContext)
|
|
15
|
+
|
|
16
|
+
override fun addView(parent: ScreenContainer, child: View, index: Int) {
|
|
17
|
+
require(child is Screen) { "Attempt attach child that is not of type RNScreens" }
|
|
18
|
+
parent.addScreen(child, index)
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
override fun removeViewAt(parent: ScreenContainer, index: Int) {
|
|
22
|
+
parent.removeScreenAt(index)
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
override fun removeAllViews(parent: ScreenContainer) {
|
|
26
|
+
parent.removeAllScreens()
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
override fun getChildCount(parent: ScreenContainer): Int = parent.screenCount
|
|
30
|
+
|
|
31
|
+
override fun getChildAt(parent: ScreenContainer, index: Int): View = parent.getScreenAt(index)
|
|
32
|
+
|
|
33
|
+
override fun createShadowNodeInstance(context: ReactApplicationContext): LayoutShadowNode = ScreensShadowNode(context)
|
|
34
|
+
|
|
35
|
+
override fun needsCustomLayoutForChildren(): Boolean = true
|
|
36
|
+
|
|
37
|
+
companion object {
|
|
38
|
+
const val REACT_CLASS = "RNSScreenContainer"
|
|
39
|
+
}
|
|
40
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
package com.swmansion.rnscreens
|
|
2
|
+
|
|
3
|
+
interface ScreenEventDispatcher {
|
|
4
|
+
fun canDispatchLifecycleEvent(event: ScreenFragment.ScreenLifecycleEvent): Boolean
|
|
5
|
+
fun updateLastEventDispatched(event: ScreenFragment.ScreenLifecycleEvent)
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Dispatches given screen lifecycle event to JS using screen from given fragment `fragmentWrapper`
|
|
9
|
+
*/
|
|
10
|
+
fun dispatchLifecycleEvent(event: ScreenFragment.ScreenLifecycleEvent, fragmentWrapper: ScreenFragmentWrapper)
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Dispatches given screen lifecycle event from all non-empty child containers to JS
|
|
14
|
+
*/
|
|
15
|
+
fun dispatchLifecycleEventInChildContainers(event: ScreenFragment.ScreenLifecycleEvent)
|
|
16
|
+
|
|
17
|
+
fun dispatchHeaderBackButtonClickedEvent()
|
|
18
|
+
fun dispatchTransitionProgressEvent(alpha: Float, closing: Boolean)
|
|
19
|
+
|
|
20
|
+
// Concrete dispatchers
|
|
21
|
+
}
|