@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,133 @@
|
|
|
1
|
+
import com.android.Version
|
|
2
|
+
|
|
3
|
+
buildscript {
|
|
4
|
+
ext {
|
|
5
|
+
rnsDefaultTargetSdkVersion = 34
|
|
6
|
+
rnsDefaultCompileSdkVersion = 34
|
|
7
|
+
rnsDefaultMinSdkVersion = 21
|
|
8
|
+
rnsDefaultKotlinVersion = '1.8.0'
|
|
9
|
+
}
|
|
10
|
+
ext.safeExtGet = {prop, fallback ->
|
|
11
|
+
rootProject.ext.has(prop) ? rootProject.ext.get(prop) : fallback
|
|
12
|
+
}
|
|
13
|
+
repositories {
|
|
14
|
+
google()
|
|
15
|
+
mavenCentral()
|
|
16
|
+
}
|
|
17
|
+
dependencies {
|
|
18
|
+
classpath('com.android.tools.build:gradle:4.2.2')
|
|
19
|
+
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${safeExtGet('kotlinVersion', rnsDefaultKotlinVersion)}"
|
|
20
|
+
classpath "com.diffplug.spotless:spotless-plugin-gradle:6.11.0"
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
def isNewArchitectureEnabled() {
|
|
25
|
+
// To opt-in for the New Architecture, you can either:
|
|
26
|
+
// - Set `newArchEnabled` to true inside the `gradle.properties` file
|
|
27
|
+
// - Invoke gradle with `-newArchEnabled=true`
|
|
28
|
+
// - Set an environment variable `ORG_GRADLE_PROJECT_newArchEnabled=true`
|
|
29
|
+
return project.hasProperty("newArchEnabled") && project.newArchEnabled == "true"
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// spotless is only accessible within react-native-screens repo
|
|
33
|
+
if (project == rootProject) {
|
|
34
|
+
apply from: 'spotless.gradle'
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
if (isNewArchitectureEnabled()) {
|
|
38
|
+
apply plugin: "com.facebook.react"
|
|
39
|
+
}
|
|
40
|
+
apply plugin: 'com.android.library'
|
|
41
|
+
apply plugin: 'kotlin-android'
|
|
42
|
+
|
|
43
|
+
def reactNativeArchitectures() {
|
|
44
|
+
def value = project.getProperties().get("reactNativeArchitectures")
|
|
45
|
+
return value ? value.split(",") : ["armeabi-v7a", "x86", "x86_64", "arm64-v8a"]
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
android {
|
|
49
|
+
compileSdkVersion safeExtGet('compileSdkVersion', rnsDefaultCompileSdkVersion)
|
|
50
|
+
def agpVersion = Version.ANDROID_GRADLE_PLUGIN_VERSION
|
|
51
|
+
if (agpVersion.tokenize('.')[0].toInteger() >= 7) {
|
|
52
|
+
namespace "com.swmansion.rnscreens"
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// Used to override the NDK path/version on internal CI or by allowing
|
|
56
|
+
// users to customize the NDK path/version from their root project (e.g. for M1 support)
|
|
57
|
+
if (rootProject.hasProperty("ndkPath")) {
|
|
58
|
+
ndkPath rootProject.ext.ndkPath
|
|
59
|
+
}
|
|
60
|
+
if (rootProject.hasProperty("ndkVersion")) {
|
|
61
|
+
ndkVersion rootProject.ext.ndkVersion
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
defaultConfig {
|
|
65
|
+
minSdkVersion safeExtGet('minSdkVersion', rnsDefaultMinSdkVersion)
|
|
66
|
+
targetSdkVersion safeExtGet('targetSdkVersion', rnsDefaultTargetSdkVersion)
|
|
67
|
+
versionCode 1
|
|
68
|
+
versionName "1.0"
|
|
69
|
+
buildConfigField "boolean", "IS_NEW_ARCHITECTURE_ENABLED", isNewArchitectureEnabled().toString()
|
|
70
|
+
ndk {
|
|
71
|
+
abiFilters (*reactNativeArchitectures())
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
lintOptions {
|
|
75
|
+
abortOnError false
|
|
76
|
+
}
|
|
77
|
+
compileOptions {
|
|
78
|
+
sourceCompatibility JavaVersion.VERSION_1_8
|
|
79
|
+
targetCompatibility JavaVersion.VERSION_1_8
|
|
80
|
+
}
|
|
81
|
+
packagingOptions {
|
|
82
|
+
// For some reason gradle only complains about the duplicated version of libreact_render libraries
|
|
83
|
+
// while there are more libraries copied in intermediates folder of the lib build directory, we exclude
|
|
84
|
+
// only the ones that make the build fail (ideally we should only include librnscreens_modules but we
|
|
85
|
+
// are only allowed to specify exclude patterns)
|
|
86
|
+
exclude "**/libreact_render*.so"
|
|
87
|
+
}
|
|
88
|
+
sourceSets.main {
|
|
89
|
+
ext.androidResDir = "src/main/res"
|
|
90
|
+
java {
|
|
91
|
+
if (isNewArchitectureEnabled()) {
|
|
92
|
+
srcDirs += [
|
|
93
|
+
"src/fabric/java",
|
|
94
|
+
]
|
|
95
|
+
} else {
|
|
96
|
+
srcDirs += [
|
|
97
|
+
"src/paper/java",
|
|
98
|
+
"build/generated/source/codegen/java"
|
|
99
|
+
]
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
}
|
|
103
|
+
res {
|
|
104
|
+
if (safeExtGet('compileSdkVersion', rnsDefaultCompileSdkVersion) >= 33) {
|
|
105
|
+
srcDirs = ["${androidResDir}/base", "${androidResDir}/v33"]
|
|
106
|
+
} else {
|
|
107
|
+
srcDirs = ["${androidResDir}/base"]
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
repositories {
|
|
114
|
+
maven {
|
|
115
|
+
// All of React Native (JS, Obj-C sources, Android binaries) is installed from npm
|
|
116
|
+
// Matches the RN Hello World template
|
|
117
|
+
// https://github.com/facebook/react-native/blob/1e8f3b11027fe0a7514b4fc97d0798d3c64bc895/local-cli/templates/HelloWorld/android/build.gradle#L21
|
|
118
|
+
url "$projectDir/../node_modules/react-native/android"
|
|
119
|
+
}
|
|
120
|
+
mavenCentral()
|
|
121
|
+
mavenLocal()
|
|
122
|
+
google()
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
dependencies {
|
|
126
|
+
implementation 'com.facebook.react:react-native:+'
|
|
127
|
+
implementation 'androidx.appcompat:appcompat:1.6.1'
|
|
128
|
+
implementation 'androidx.fragment:fragment-ktx:1.6.1'
|
|
129
|
+
implementation 'androidx.coordinatorlayout:coordinatorlayout:1.2.0'
|
|
130
|
+
implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0'
|
|
131
|
+
implementation 'com.google.android.material:material:1.9.0'
|
|
132
|
+
implementation "androidx.core:core-ktx:1.10.1"
|
|
133
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
package com.swmansion.rnscreens
|
|
2
|
+
|
|
3
|
+
import android.view.ViewGroup
|
|
4
|
+
import androidx.annotation.UiThread
|
|
5
|
+
import com.facebook.react.bridge.ReactContext
|
|
6
|
+
import com.facebook.react.bridge.ReadableMap
|
|
7
|
+
import com.facebook.react.bridge.WritableMap
|
|
8
|
+
import com.facebook.react.bridge.WritableNativeMap
|
|
9
|
+
import com.facebook.react.uimanager.FabricViewStateManager
|
|
10
|
+
import com.facebook.react.uimanager.PixelUtil
|
|
11
|
+
import kotlin.math.abs
|
|
12
|
+
|
|
13
|
+
abstract class FabricEnabledViewGroup constructor(context: ReactContext?) : ViewGroup(context), FabricViewStateManager.HasFabricViewStateManager {
|
|
14
|
+
private val mFabricViewStateManager: FabricViewStateManager = FabricViewStateManager()
|
|
15
|
+
|
|
16
|
+
override fun getFabricViewStateManager(): FabricViewStateManager {
|
|
17
|
+
return mFabricViewStateManager
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
protected fun updateScreenSizeFabric(width: Int, height: Int) {
|
|
21
|
+
updateState(width, height)
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
@UiThread
|
|
25
|
+
fun updateState(width: Int, height: Int) {
|
|
26
|
+
val realWidth: Float = PixelUtil.toDIPFromPixel(width.toFloat())
|
|
27
|
+
val realHeight: Float = PixelUtil.toDIPFromPixel(height.toFloat())
|
|
28
|
+
|
|
29
|
+
// Check incoming state values. If they're already the correct value, return early to prevent
|
|
30
|
+
// infinite UpdateState/SetState loop.
|
|
31
|
+
val currentState: ReadableMap? = mFabricViewStateManager.getStateData()
|
|
32
|
+
if (currentState != null) {
|
|
33
|
+
val delta = 0.9f
|
|
34
|
+
val stateFrameHeight: Float = if (currentState.hasKey("frameHeight")) currentState.getDouble("frameHeight").toFloat() else 0f
|
|
35
|
+
val stateFrameWidth: Float = if (currentState.hasKey("frameWidth")) currentState.getDouble("frameWidth").toFloat() else 0f
|
|
36
|
+
if (abs(stateFrameWidth - realWidth) < delta &&
|
|
37
|
+
abs(stateFrameHeight - realHeight) < delta
|
|
38
|
+
) {
|
|
39
|
+
return
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
mFabricViewStateManager.setState {
|
|
43
|
+
val map: WritableMap = WritableNativeMap()
|
|
44
|
+
map.putDouble("frameWidth", realWidth.toDouble())
|
|
45
|
+
map.putDouble("frameHeight", realHeight.toDouble())
|
|
46
|
+
map
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
package com.swmansion.rnscreens
|
|
2
|
+
|
|
3
|
+
import android.content.Context
|
|
4
|
+
import androidx.activity.OnBackPressedCallback
|
|
5
|
+
import androidx.appcompat.widget.SearchView
|
|
6
|
+
import androidx.fragment.app.Fragment
|
|
7
|
+
|
|
8
|
+
class CustomSearchView(context: Context, fragment: Fragment) : SearchView(context) {
|
|
9
|
+
/*
|
|
10
|
+
CustomSearchView uses some variables from SearchView. They are listed below with links to documentation
|
|
11
|
+
isIconified - https://developer.android.com/reference/android/widget/SearchView#setIconified(boolean)
|
|
12
|
+
maxWidth - https://developer.android.com/reference/android/widget/SearchView#setMaxWidth(int)
|
|
13
|
+
setOnSearchClickListener - https://developer.android.com/reference/android/widget/SearchView#setOnSearchClickListener(android.view.View.OnClickListener)
|
|
14
|
+
setOnCloseListener - https://developer.android.com/reference/android/widget/SearchView#setOnCloseListener(android.widget.SearchView.OnCloseListener)
|
|
15
|
+
*/
|
|
16
|
+
private var mCustomOnCloseListener: OnCloseListener? = null
|
|
17
|
+
private var mCustomOnSearchClickedListener: OnClickListener? = null
|
|
18
|
+
|
|
19
|
+
private var mOnBackPressedCallback: OnBackPressedCallback =
|
|
20
|
+
object : OnBackPressedCallback(true) {
|
|
21
|
+
override fun handleOnBackPressed() {
|
|
22
|
+
isIconified = true
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
private val backPressOverrider = FragmentBackPressOverrider(fragment, mOnBackPressedCallback)
|
|
27
|
+
|
|
28
|
+
var overrideBackAction: Boolean
|
|
29
|
+
set(value) {
|
|
30
|
+
backPressOverrider.overrideBackAction = value
|
|
31
|
+
}
|
|
32
|
+
get() = backPressOverrider.overrideBackAction
|
|
33
|
+
|
|
34
|
+
fun focus() {
|
|
35
|
+
isIconified = false
|
|
36
|
+
requestFocusFromTouch()
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
fun clearText() = setQuery("", false)
|
|
40
|
+
|
|
41
|
+
fun setText(text: String) = setQuery(text, false)
|
|
42
|
+
|
|
43
|
+
override fun setOnCloseListener(listener: OnCloseListener?) {
|
|
44
|
+
mCustomOnCloseListener = listener
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
override fun setOnSearchClickListener(listener: OnClickListener?) {
|
|
48
|
+
mCustomOnSearchClickedListener = listener
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
override fun onAttachedToWindow() {
|
|
52
|
+
super.onAttachedToWindow()
|
|
53
|
+
if (!isIconified) {
|
|
54
|
+
backPressOverrider.maybeAddBackCallback()
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
override fun onDetachedFromWindow() {
|
|
59
|
+
super.onDetachedFromWindow()
|
|
60
|
+
backPressOverrider.removeBackCallbackIfAdded()
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
init {
|
|
64
|
+
super.setOnSearchClickListener { v ->
|
|
65
|
+
mCustomOnSearchClickedListener?.onClick(v)
|
|
66
|
+
backPressOverrider.maybeAddBackCallback()
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
super.setOnCloseListener {
|
|
70
|
+
val result = mCustomOnCloseListener?.onClose() ?: false
|
|
71
|
+
backPressOverrider.removeBackCallbackIfAdded()
|
|
72
|
+
result
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
maxWidth = Integer.MAX_VALUE
|
|
76
|
+
}
|
|
77
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
package com.swmansion.rnscreens
|
|
2
|
+
|
|
3
|
+
import android.content.Context
|
|
4
|
+
import androidx.appcompat.widget.Toolbar
|
|
5
|
+
|
|
6
|
+
// This class is used to store config closer to search bar
|
|
7
|
+
open class CustomToolbar(context: Context, val config: ScreenStackHeaderConfig) : Toolbar(context)
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
package com.swmansion.rnscreens
|
|
2
|
+
|
|
3
|
+
import androidx.activity.OnBackPressedCallback
|
|
4
|
+
import androidx.fragment.app.Fragment
|
|
5
|
+
|
|
6
|
+
class FragmentBackPressOverrider(
|
|
7
|
+
private val fragment: Fragment,
|
|
8
|
+
private val mOnBackPressedCallback: OnBackPressedCallback
|
|
9
|
+
) {
|
|
10
|
+
private var mIsBackCallbackAdded: Boolean = false
|
|
11
|
+
var overrideBackAction: Boolean = true
|
|
12
|
+
|
|
13
|
+
fun maybeAddBackCallback() {
|
|
14
|
+
if (!mIsBackCallbackAdded && overrideBackAction) {
|
|
15
|
+
fragment.activity?.onBackPressedDispatcher?.addCallback(
|
|
16
|
+
fragment,
|
|
17
|
+
mOnBackPressedCallback
|
|
18
|
+
)
|
|
19
|
+
mIsBackCallbackAdded = true
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
fun removeBackCallbackIfAdded() {
|
|
24
|
+
if (mIsBackCallbackAdded) {
|
|
25
|
+
mOnBackPressedCallback.remove()
|
|
26
|
+
mIsBackCallbackAdded = false
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
package com.swmansion.rnscreens
|
|
2
|
+
|
|
3
|
+
import com.facebook.react.ReactPackage
|
|
4
|
+
import com.facebook.react.bridge.NativeModule
|
|
5
|
+
import com.facebook.react.bridge.ReactApplicationContext
|
|
6
|
+
import com.facebook.react.uimanager.ViewManager
|
|
7
|
+
|
|
8
|
+
class RNScreensPackage : ReactPackage {
|
|
9
|
+
override fun createNativeModules(reactContext: ReactApplicationContext): List<NativeModule> =
|
|
10
|
+
emptyList()
|
|
11
|
+
|
|
12
|
+
override fun createViewManagers(reactContext: ReactApplicationContext) =
|
|
13
|
+
listOf<ViewManager<*, *>>(
|
|
14
|
+
ScreenContainerViewManager(),
|
|
15
|
+
ScreenViewManager(),
|
|
16
|
+
ScreenStackViewManager(),
|
|
17
|
+
ScreenStackHeaderConfigViewManager(),
|
|
18
|
+
ScreenStackHeaderSubviewManager(),
|
|
19
|
+
SearchBarManager()
|
|
20
|
+
)
|
|
21
|
+
}
|
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
package com.swmansion.rnscreens
|
|
2
|
+
|
|
3
|
+
import android.annotation.SuppressLint
|
|
4
|
+
import android.content.pm.ActivityInfo
|
|
5
|
+
import android.graphics.Paint
|
|
6
|
+
import android.os.Parcelable
|
|
7
|
+
import android.util.SparseArray
|
|
8
|
+
import android.util.TypedValue
|
|
9
|
+
import android.view.ViewGroup
|
|
10
|
+
import android.view.WindowManager
|
|
11
|
+
import android.webkit.WebView
|
|
12
|
+
import androidx.core.view.children
|
|
13
|
+
import androidx.fragment.app.Fragment
|
|
14
|
+
import com.facebook.react.bridge.GuardedRunnable
|
|
15
|
+
import com.facebook.react.bridge.ReactContext
|
|
16
|
+
import com.facebook.react.uimanager.PixelUtil
|
|
17
|
+
import com.facebook.react.uimanager.UIManagerHelper
|
|
18
|
+
import com.facebook.react.uimanager.UIManagerModule
|
|
19
|
+
import com.swmansion.rnscreens.events.HeaderHeightChangeEvent
|
|
20
|
+
|
|
21
|
+
@SuppressLint("ViewConstructor")
|
|
22
|
+
class Screen constructor(context: ReactContext?) : FabricEnabledViewGroup(context) {
|
|
23
|
+
val fragment: Fragment?
|
|
24
|
+
get() = fragmentWrapper?.fragment
|
|
25
|
+
|
|
26
|
+
var fragmentWrapper: ScreenFragmentWrapper? = null
|
|
27
|
+
var container: ScreenContainer? = null
|
|
28
|
+
var activityState: ActivityState? = null
|
|
29
|
+
private set
|
|
30
|
+
private var mTransitioning = false
|
|
31
|
+
var stackPresentation = StackPresentation.PUSH
|
|
32
|
+
var replaceAnimation = ReplaceAnimation.POP
|
|
33
|
+
var stackAnimation = StackAnimation.DEFAULT
|
|
34
|
+
var isGestureEnabled = true
|
|
35
|
+
var screenOrientation: Int? = null
|
|
36
|
+
private set
|
|
37
|
+
private var mStatusBarStyle: String? = null
|
|
38
|
+
private var mStatusBarHidden: Boolean? = null
|
|
39
|
+
private var mStatusBarTranslucent: Boolean? = null
|
|
40
|
+
private var mStatusBarColor: Int? = null
|
|
41
|
+
private var mNavigationBarColor: Int? = null
|
|
42
|
+
private var mNavigationBarHidden: Boolean? = null
|
|
43
|
+
var isStatusBarAnimated: Boolean? = null
|
|
44
|
+
private var mNativeBackButtonDismissalEnabled = true
|
|
45
|
+
|
|
46
|
+
init {
|
|
47
|
+
// we set layout params as WindowManager.LayoutParams to workaround the issue with TextInputs
|
|
48
|
+
// not displaying modal menus (e.g., copy/paste or selection). The missing menus are due to the
|
|
49
|
+
// fact that TextView implementation is expected to be attached to window when layout happens.
|
|
50
|
+
// Then, at the moment of layout it checks whether window type is in a reasonable range to tell
|
|
51
|
+
// whether it should enable selection controls (see Editor.java#prepareCursorControllers).
|
|
52
|
+
// With screens, however, the text input component can be laid out before it is attached, in
|
|
53
|
+
// that case TextView tries to get window type property from the oldest existing parent, which
|
|
54
|
+
// in this case is a Screen class, as it is the root of the screen that is about to be attached.
|
|
55
|
+
// Setting params this way is not the most elegant way to solve this problem but workarounds it
|
|
56
|
+
// for the time being
|
|
57
|
+
layoutParams = WindowManager.LayoutParams(WindowManager.LayoutParams.TYPE_APPLICATION)
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
override fun dispatchSaveInstanceState(container: SparseArray<Parcelable>) {
|
|
61
|
+
// do nothing, react native will keep the view hierarchy so no need to serialize/deserialize
|
|
62
|
+
// view's states. The side effect of restoring is that TextInput components would trigger
|
|
63
|
+
// set-text events which may confuse text input handling.
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
override fun dispatchRestoreInstanceState(container: SparseArray<Parcelable>) {
|
|
67
|
+
// ignore restoring instance state too as we are not saving anything anyways.
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
override fun onLayout(changed: Boolean, l: Int, t: Int, r: Int, b: Int) {
|
|
71
|
+
if (changed) {
|
|
72
|
+
val width = r - l
|
|
73
|
+
val height = b - t
|
|
74
|
+
|
|
75
|
+
calculateHeaderHeight()
|
|
76
|
+
if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) {
|
|
77
|
+
updateScreenSizeFabric(width, height)
|
|
78
|
+
} else {
|
|
79
|
+
updateScreenSizePaper(width, height)
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
private fun updateScreenSizePaper(width: Int, height: Int) {
|
|
85
|
+
val reactContext = context as ReactContext
|
|
86
|
+
reactContext.runOnNativeModulesQueueThread(
|
|
87
|
+
object : GuardedRunnable(reactContext) {
|
|
88
|
+
override fun runGuarded() {
|
|
89
|
+
reactContext
|
|
90
|
+
.getNativeModule(UIManagerModule::class.java)
|
|
91
|
+
?.updateNodeSize(id, width, height)
|
|
92
|
+
}
|
|
93
|
+
})
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
val headerConfig: ScreenStackHeaderConfig?
|
|
97
|
+
get() = children.find { it is ScreenStackHeaderConfig } as? ScreenStackHeaderConfig
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* While transitioning this property allows to optimize rendering behavior on Android and provide
|
|
101
|
+
* a correct blending options for the animated screen. It is turned on automatically by the
|
|
102
|
+
* container when transitioning is detected and turned off immediately after
|
|
103
|
+
*/
|
|
104
|
+
fun setTransitioning(transitioning: Boolean) {
|
|
105
|
+
if (mTransitioning == transitioning) {
|
|
106
|
+
return
|
|
107
|
+
}
|
|
108
|
+
mTransitioning = transitioning
|
|
109
|
+
val isWebViewInScreen = hasWebView(this)
|
|
110
|
+
if (isWebViewInScreen && layerType != LAYER_TYPE_HARDWARE) {
|
|
111
|
+
return
|
|
112
|
+
}
|
|
113
|
+
super.setLayerType(
|
|
114
|
+
if (transitioning && !isWebViewInScreen) LAYER_TYPE_HARDWARE else LAYER_TYPE_NONE,
|
|
115
|
+
null
|
|
116
|
+
)
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
private fun hasWebView(viewGroup: ViewGroup): Boolean {
|
|
120
|
+
for (i in 0 until viewGroup.childCount) {
|
|
121
|
+
val child = viewGroup.getChildAt(i)
|
|
122
|
+
if (child is WebView) {
|
|
123
|
+
return true
|
|
124
|
+
} else if (child is ViewGroup) {
|
|
125
|
+
if (hasWebView(child)) {
|
|
126
|
+
return true
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return false
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
override fun setLayerType(layerType: Int, paint: Paint?) {
|
|
134
|
+
// ignore - layer type is controlled by `transitioning` prop
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
fun setActivityState(activityState: ActivityState) {
|
|
138
|
+
if (activityState == this.activityState) {
|
|
139
|
+
return
|
|
140
|
+
}
|
|
141
|
+
this.activityState = activityState
|
|
142
|
+
container?.notifyChildUpdate()
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
fun setScreenOrientation(screenOrientation: String?) {
|
|
146
|
+
if (screenOrientation == null) {
|
|
147
|
+
this.screenOrientation = null
|
|
148
|
+
return
|
|
149
|
+
}
|
|
150
|
+
ScreenWindowTraits.applyDidSetOrientation()
|
|
151
|
+
this.screenOrientation = when (screenOrientation) {
|
|
152
|
+
"all" -> ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR
|
|
153
|
+
"portrait" -> ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT
|
|
154
|
+
"portrait_up" -> ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
|
|
155
|
+
"portrait_down" -> ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT
|
|
156
|
+
"landscape" -> ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE
|
|
157
|
+
"landscape_left" -> ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE
|
|
158
|
+
"landscape_right" -> ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
|
|
159
|
+
else -> ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
fragmentWrapper?.let { ScreenWindowTraits.setOrientation(this, it.tryGetActivity()) }
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
// Accepts one of 4 accessibility flags
|
|
166
|
+
// developer.android.com/reference/android/view/View#attr_android:importantForAccessibility
|
|
167
|
+
fun changeAccessibilityMode(mode: Int) {
|
|
168
|
+
this.importantForAccessibility = mode
|
|
169
|
+
this.headerConfig?.toolbar?.importantForAccessibility = mode
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
var statusBarStyle: String?
|
|
173
|
+
get() = mStatusBarStyle
|
|
174
|
+
set(statusBarStyle) {
|
|
175
|
+
if (statusBarStyle != null) {
|
|
176
|
+
ScreenWindowTraits.applyDidSetStatusBarAppearance()
|
|
177
|
+
}
|
|
178
|
+
mStatusBarStyle = statusBarStyle
|
|
179
|
+
fragmentWrapper?.let { ScreenWindowTraits.setStyle(this, it.tryGetActivity(), it.tryGetContext()) }
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
var isStatusBarHidden: Boolean?
|
|
183
|
+
get() = mStatusBarHidden
|
|
184
|
+
set(statusBarHidden) {
|
|
185
|
+
if (statusBarHidden != null) {
|
|
186
|
+
ScreenWindowTraits.applyDidSetStatusBarAppearance()
|
|
187
|
+
}
|
|
188
|
+
mStatusBarHidden = statusBarHidden
|
|
189
|
+
fragmentWrapper?.let { ScreenWindowTraits.setHidden(this, it.tryGetActivity()) }
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
var isStatusBarTranslucent: Boolean?
|
|
193
|
+
get() = mStatusBarTranslucent
|
|
194
|
+
set(statusBarTranslucent) {
|
|
195
|
+
if (statusBarTranslucent != null) {
|
|
196
|
+
ScreenWindowTraits.applyDidSetStatusBarAppearance()
|
|
197
|
+
}
|
|
198
|
+
mStatusBarTranslucent = statusBarTranslucent
|
|
199
|
+
fragmentWrapper?.let {
|
|
200
|
+
ScreenWindowTraits.setTranslucent(
|
|
201
|
+
this,
|
|
202
|
+
it.tryGetActivity(),
|
|
203
|
+
it.tryGetContext()
|
|
204
|
+
)
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
var statusBarColor: Int?
|
|
209
|
+
get() = mStatusBarColor
|
|
210
|
+
set(statusBarColor) {
|
|
211
|
+
if (statusBarColor != null) {
|
|
212
|
+
ScreenWindowTraits.applyDidSetStatusBarAppearance()
|
|
213
|
+
}
|
|
214
|
+
mStatusBarColor = statusBarColor
|
|
215
|
+
fragmentWrapper?.let { ScreenWindowTraits.setColor(this, it.tryGetActivity(), it.tryGetContext()) }
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
var navigationBarColor: Int?
|
|
219
|
+
get() = mNavigationBarColor
|
|
220
|
+
set(navigationBarColor) {
|
|
221
|
+
if (navigationBarColor != null) {
|
|
222
|
+
ScreenWindowTraits.applyDidSetNavigationBarAppearance()
|
|
223
|
+
}
|
|
224
|
+
mNavigationBarColor = navigationBarColor
|
|
225
|
+
fragmentWrapper?.let { ScreenWindowTraits.setNavigationBarColor(this, it.tryGetActivity()) }
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
var isNavigationBarHidden: Boolean?
|
|
229
|
+
get() = mNavigationBarHidden
|
|
230
|
+
set(navigationBarHidden) {
|
|
231
|
+
if (navigationBarHidden != null) {
|
|
232
|
+
ScreenWindowTraits.applyDidSetNavigationBarAppearance()
|
|
233
|
+
}
|
|
234
|
+
mNavigationBarHidden = navigationBarHidden
|
|
235
|
+
fragmentWrapper?.let {
|
|
236
|
+
ScreenWindowTraits.setNavigationBarHidden(
|
|
237
|
+
this,
|
|
238
|
+
it.tryGetActivity(),
|
|
239
|
+
)
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
var nativeBackButtonDismissalEnabled: Boolean
|
|
244
|
+
get() = mNativeBackButtonDismissalEnabled
|
|
245
|
+
set(enableNativeBackButtonDismissal) {
|
|
246
|
+
mNativeBackButtonDismissalEnabled = enableNativeBackButtonDismissal
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
fun calculateHeaderHeight() {
|
|
250
|
+
val actionBarTv = TypedValue()
|
|
251
|
+
val resolvedActionBarSize = context.theme.resolveAttribute(android.R.attr.actionBarSize, actionBarTv, true)
|
|
252
|
+
|
|
253
|
+
// Check if it's possible to get an attribute from theme context and assign a value from it.
|
|
254
|
+
// Otherwise, the default value will be returned.
|
|
255
|
+
val actionBarHeight = TypedValue.complexToDimensionPixelSize(actionBarTv.data, resources.displayMetrics)
|
|
256
|
+
.takeIf { resolvedActionBarSize }
|
|
257
|
+
?.let { PixelUtil.toDIPFromPixel(it.toFloat()).toDouble() } ?: 56.0
|
|
258
|
+
|
|
259
|
+
val statusBarHeight = context.resources.getIdentifier("status_bar_height", "dimen", "android")
|
|
260
|
+
.takeIf { it > 0 }
|
|
261
|
+
?.let { (context.resources::getDimensionPixelSize)(it) }
|
|
262
|
+
?.let { PixelUtil.toDIPFromPixel(it.toFloat()).toDouble() }
|
|
263
|
+
?: 24.0
|
|
264
|
+
|
|
265
|
+
val totalHeight = actionBarHeight + statusBarHeight
|
|
266
|
+
UIManagerHelper.getEventDispatcherForReactTag(context as ReactContext, id)
|
|
267
|
+
?.dispatchEvent(HeaderHeightChangeEvent(id, totalHeight))
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
enum class StackPresentation {
|
|
271
|
+
PUSH, MODAL, TRANSPARENT_MODAL
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
enum class StackAnimation {
|
|
275
|
+
DEFAULT, NONE, FADE, SLIDE_FROM_BOTTOM, SLIDE_FROM_RIGHT, SLIDE_FROM_LEFT, FADE_FROM_BOTTOM
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
enum class ReplaceAnimation {
|
|
279
|
+
PUSH, POP
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
enum class ActivityState {
|
|
283
|
+
INACTIVE, TRANSITIONING_OR_BELOW_TOP, ON_TOP
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
enum class WindowTraits {
|
|
287
|
+
ORIENTATION, COLOR, STYLE, TRANSLUCENT, HIDDEN, ANIMATED, NAVIGATION_BAR_COLOR, NAVIGATION_BAR_HIDDEN
|
|
288
|
+
}
|
|
289
|
+
}
|