From a03f6fdac0b268acb6d5f30f80f913169aa90c56 Mon Sep 17 00:00:00 2001 From: Maciej Stosio Date: Fri, 4 Oct 2024 16:47:42 +0200 Subject: [PATCH 1/6] feat: allow preload using activityState --- .../com/swmansion/rnscreens/ScreenStack.kt | 30 +- apps/src/tests/TestPreload.tsx | 369 ++++++++++++++++++ apps/src/tests/index.ts | 1 + ios/RNSScreenStack.mm | 3 +- 4 files changed, 396 insertions(+), 7 deletions(-) create mode 100644 apps/src/tests/TestPreload.tsx diff --git a/android/src/main/java/com/swmansion/rnscreens/ScreenStack.kt b/android/src/main/java/com/swmansion/rnscreens/ScreenStack.kt index a4e6fea83e..75453fa7ae 100644 --- a/android/src/main/java/com/swmansion/rnscreens/ScreenStack.kt +++ b/android/src/main/java/com/swmansion/rnscreens/ScreenStack.kt @@ -104,7 +104,7 @@ class ScreenStack( for (i in screenWrappers.indices.reversed()) { val screenWrapper = getScreenFragmentWrapperAt(i) - if (!dismissedWrappers.contains(screenWrapper)) { + if (!dismissedWrappers.contains(screenWrapper) && screenWrapper.screen.activityState !== Screen.ActivityState.INACTIVE) { if (newTop == null) { newTop = screenWrapper } else { @@ -182,8 +182,16 @@ class ScreenStack( R.anim.rns_no_animation_medium, ) StackAnimation.FADE_FROM_BOTTOM -> it.setCustomAnimations(R.anim.rns_fade_from_bottom, R.anim.rns_no_animation_350) - StackAnimation.IOS_FROM_RIGHT -> it.setCustomAnimations(R.anim.rns_ios_from_right_foreground_open, R.anim.rns_ios_from_right_background_open) - StackAnimation.IOS_FROM_LEFT -> it.setCustomAnimations(R.anim.rns_ios_from_left_foreground_open, R.anim.rns_ios_from_left_background_open) + StackAnimation.IOS_FROM_RIGHT -> + it.setCustomAnimations( + R.anim.rns_ios_from_right_foreground_open, + R.anim.rns_ios_from_right_background_open, + ) + StackAnimation.IOS_FROM_LEFT -> + it.setCustomAnimations( + R.anim.rns_ios_from_left_foreground_open, + R.anim.rns_ios_from_left_background_open, + ) } } else { when (stackAnimation) { @@ -221,8 +229,16 @@ class ScreenStack( R.anim.rns_slide_out_to_bottom, ) StackAnimation.FADE_FROM_BOTTOM -> it.setCustomAnimations(R.anim.rns_no_animation_250, R.anim.rns_fade_to_bottom) - StackAnimation.IOS_FROM_RIGHT -> it.setCustomAnimations(R.anim.rns_ios_from_right_background_close, R.anim.rns_ios_from_right_foreground_close) - StackAnimation.IOS_FROM_LEFT -> it.setCustomAnimations(R.anim.rns_ios_from_left_background_close, R.anim.rns_ios_from_left_foreground_close) + StackAnimation.IOS_FROM_RIGHT -> + it.setCustomAnimations( + R.anim.rns_ios_from_right_background_close, + R.anim.rns_ios_from_right_foreground_close, + ) + StackAnimation.IOS_FROM_LEFT -> + it.setCustomAnimations( + R.anim.rns_ios_from_left_background_close, + R.anim.rns_ios_from_left_foreground_close, + ) } } } @@ -258,7 +274,9 @@ class ScreenStack( break } // detach all screens that should not be visible - if (fragmentWrapper !== newTop && !dismissedWrappers.contains(fragmentWrapper)) { + if ((fragmentWrapper !== newTop && !dismissedWrappers.contains(fragmentWrapper)) || + fragmentWrapper.screen.activityState === Screen.ActivityState.INACTIVE + ) { it.remove(fragmentWrapper.fragment) } } diff --git a/apps/src/tests/TestPreload.tsx b/apps/src/tests/TestPreload.tsx new file mode 100644 index 0000000000..58e4ae91f0 --- /dev/null +++ b/apps/src/tests/TestPreload.tsx @@ -0,0 +1,369 @@ +import * as React from 'react'; + + + import { View, Text, Button } from 'react-native'; + import { + useNavigation, + CommonActions, + NavigationContainer, + } from '@react-navigation/native'; + import { createNativeStackNavigator } from '@react-navigation/native-stack'; +import { createBottomTabNavigator } from '@react-navigation/bottom-tabs'; + + function HomeScreen() { + const navigation = useNavigation(); + + return ( + + Home! +