diff --git a/android/src/main/java/com/swmansion/rnscreens/Screen.kt b/android/src/main/java/com/swmansion/rnscreens/Screen.kt index 03d2463a0b..f5178f3e4d 100644 --- a/android/src/main/java/com/swmansion/rnscreens/Screen.kt +++ b/android/src/main/java/com/swmansion/rnscreens/Screen.kt @@ -234,6 +234,9 @@ class Screen( if (activityState == this.activityState) { return } + if (container is ScreenStack && this.activityState != null && activityState < this.activityState!!) { + throw IllegalStateException("[RNScreens] activityState can only progress in NativeStack") + } this.activityState = activityState container?.notifyChildUpdate() } 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/TestActivityStateProgression.tsx b/apps/src/tests/TestActivityStateProgression.tsx new file mode 100644 index 0000000000..045e1e16c5 --- /dev/null +++ b/apps/src/tests/TestActivityStateProgression.tsx @@ -0,0 +1,69 @@ +import * as React from 'react'; +import { View, Text, Button } from 'react-native'; +import { Screen, ScreenStack } from '../../../src'; + +function HomeScreen({ + setActivityState, +}: { + setActivityState: (state: 0 | 1 | 2) => void; +}) { + console.log('Render home'); + return ( + + Home! +