Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(Android): restore default Android animations #2110

Open
wants to merge 9 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
6 changes: 6 additions & 0 deletions android/src/main/java/com/swmansion/rnscreens/Screen.kt
Original file line number Diff line number Diff line change
Expand Up @@ -278,4 +278,10 @@ class Screen(context: ReactContext?) : FabricEnabledViewGroup(context) {
enum class WindowTraits {
ORIENTATION, COLOR, STYLE, TRANSLUCENT, HIDDEN, ANIMATED, NAVIGATION_BAR_COLOR, NAVIGATION_BAR_HIDDEN
}

companion object {
fun isSystemAnimation(stackAnimation: StackAnimation): Boolean {
return stackAnimation === StackAnimation.DEFAULT || stackAnimation === StackAnimation.FADE || stackAnimation === StackAnimation.NONE
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -272,7 +272,7 @@ open class ScreenFragment : Fragment, ScreenFragmentWrapper {
// onViewAnimationStart/End is triggered from View#onAnimationStart/End method of the fragment's root
// view. We override an appropriate method of the StackFragment's
// root view in order to achieve this.
if (isResumed) {
if (isResumed || screen.container?.topScreen === screen) {
// Android dispatches the animation start event for the fragment that is being added first
// however we want the one being dismissed first to match iOS. It also makes more sense from
// a navigation point of view to have the disappear event first.
Expand Down
15 changes: 7 additions & 8 deletions android/src/main/java/com/swmansion/rnscreens/ScreenStack.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,12 @@ import android.content.Context
import android.graphics.Canvas
import android.os.Build
import android.view.View
import androidx.fragment.app.FragmentTransaction
import com.facebook.react.bridge.ReactContext
import com.facebook.react.uimanager.UIManagerHelper
import com.swmansion.rnscreens.Screen.StackAnimation
import com.swmansion.rnscreens.events.StackFinishTransitioningEvent
import java.util.Collections
import kotlin.collections.ArrayList
import kotlin.collections.HashSet

class ScreenStack(context: Context?) : ScreenContainer(context) {
private val stack = ArrayList<ScreenStackFragmentWrapper>()
Expand Down Expand Up @@ -139,9 +138,9 @@ class ScreenStack(context: Context?) : ScreenContainer(context) {
if (stackAnimation != null) {
if (shouldUseOpenAnimation) {
when (stackAnimation) {
StackAnimation.DEFAULT -> it.setCustomAnimations(R.anim.rns_default_enter_in, R.anim.rns_default_enter_out)
StackAnimation.NONE -> it.setCustomAnimations(R.anim.rns_no_animation_20, R.anim.rns_no_animation_20)
StackAnimation.FADE -> it.setCustomAnimations(R.anim.rns_fade_in, R.anim.rns_fade_out)
StackAnimation.DEFAULT -> it.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
StackAnimation.NONE -> it.setTransition(FragmentTransaction.TRANSIT_NONE)
StackAnimation.FADE -> it.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE)
StackAnimation.SLIDE_FROM_RIGHT -> it.setCustomAnimations(R.anim.rns_slide_in_from_right, R.anim.rns_slide_out_to_left)
StackAnimation.SLIDE_FROM_LEFT -> it.setCustomAnimations(R.anim.rns_slide_in_from_left, R.anim.rns_slide_out_to_right)
StackAnimation.SLIDE_FROM_BOTTOM -> it.setCustomAnimations(
Expand All @@ -152,9 +151,9 @@ class ScreenStack(context: Context?) : ScreenContainer(context) {
}
} else {
when (stackAnimation) {
StackAnimation.DEFAULT -> it.setCustomAnimations(R.anim.rns_default_exit_in, R.anim.rns_default_exit_out)
StackAnimation.NONE -> it.setCustomAnimations(R.anim.rns_no_animation_20, R.anim.rns_no_animation_20)
StackAnimation.FADE -> it.setCustomAnimations(R.anim.rns_fade_in, R.anim.rns_fade_out)
StackAnimation.DEFAULT -> it.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE)
StackAnimation.NONE -> it.setTransition(FragmentTransaction.TRANSIT_NONE)
StackAnimation.FADE -> it.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE)
StackAnimation.SLIDE_FROM_RIGHT -> it.setCustomAnimations(R.anim.rns_slide_in_from_left, R.anim.rns_slide_out_to_right)
StackAnimation.SLIDE_FROM_LEFT -> it.setCustomAnimations(R.anim.rns_slide_in_from_right, R.anim.rns_slide_out_to_left)
StackAnimation.SLIDE_FROM_BOTTOM -> it.setCustomAnimations(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
package com.swmansion.rnscreens

import android.animation.Animator
import android.animation.AnimatorInflater
import android.animation.AnimatorListenerAdapter
import android.animation.AnimatorSet
import android.annotation.SuppressLint
import android.content.Context
import android.graphics.Color
Expand All @@ -16,6 +20,9 @@ import android.view.animation.Transformation
import android.widget.LinearLayout
import androidx.appcompat.widget.Toolbar
import androidx.coordinatorlayout.widget.CoordinatorLayout
import androidx.fragment.R
import androidx.fragment.app.FragmentTransaction
import com.facebook.react.bridge.UiThreadUtil
import com.facebook.react.uimanager.PixelUtil
import com.google.android.material.appbar.AppBarLayout
import com.google.android.material.appbar.AppBarLayout.ScrollingViewBehavior
Expand Down Expand Up @@ -86,6 +93,53 @@ class ScreenStackFragment : ScreenFragment, ScreenStackFragmentWrapper {
notifyViewAppearTransitionEnd()
}

// Similarly to ScreensCoordinatorLayout, this method listens only for the phases of default Android
// transitions (default/none/fade), since `ScreensCoordinatorLayout#startAnimation` is being
// called only for custom animations.
override fun onCreateAnimator(transit: Int, enter: Boolean, nextAnim: Int): Animator? {
val listener = object : AnimatorListenerAdapter() {
override fun onAnimationStart(animation: Animator) {
onViewAnimationStart()
super.onAnimationStart(animation)
}

override fun onAnimationEnd(animation: Animator) {
onViewAnimationEnd()
super.onAnimationEnd(animation)
}
}

// If there's custom animation set, use default onCreateAnimator implementation, as event
// handling will be handled by ScreensCoordinatorLayout.
if (!Screen.isSystemAnimation(screen.stackAnimation)) {
return super.onCreateAnimator(transit, enter, nextAnim)
}

// When fragment is being removed or there's no transition selected, we simply
// return AnimatorSet without any animation.
if (isRemoving || transit == FragmentTransaction.TRANSIT_NONE) {
return AnimatorSet().apply {
addListener(listener)
}
}

var selectedNextAnim = nextAnim
if (nextAnim == 0) {
selectedNextAnim = when (transit) {
FragmentTransaction.TRANSIT_FRAGMENT_OPEN -> if (enter) R.animator.fragment_open_enter else R.animator.fragment_open_exit
FragmentTransaction.TRANSIT_FRAGMENT_CLOSE -> if (enter) R.animator.fragment_close_enter else R.animator.fragment_close_exit
FragmentTransaction.TRANSIT_FRAGMENT_FADE -> if (enter) R.animator.fragment_fade_enter else R.animator.fragment_fade_exit
else -> 0
}
}

val animator = AnimatorInflater.loadAnimator(context, selectedNextAnim).apply {
addListener(listener)
}

return animator
}

private fun notifyViewAppearTransitionEnd() {
val screenStack = view?.parent
if (screenStack is ScreenStack) {
Expand Down
18 changes: 0 additions & 18 deletions android/src/main/res/base/anim/rns_default_enter_in.xml

This file was deleted.

19 changes: 0 additions & 19 deletions android/src/main/res/base/anim/rns_default_enter_out.xml

This file was deleted.

17 changes: 0 additions & 17 deletions android/src/main/res/base/anim/rns_default_exit_in.xml

This file was deleted.

18 changes: 0 additions & 18 deletions android/src/main/res/base/anim/rns_default_exit_out.xml

This file was deleted.

7 changes: 0 additions & 7 deletions android/src/main/res/base/anim/rns_fade_in.xml

This file was deleted.

7 changes: 0 additions & 7 deletions android/src/main/res/base/anim/rns_fade_out.xml

This file was deleted.

6 changes: 0 additions & 6 deletions android/src/main/res/base/anim/rns_no_animation_20.xml

This file was deleted.

37 changes: 0 additions & 37 deletions android/src/main/res/v33/anim-v33/rns_default_enter_in.xml

This file was deleted.

38 changes: 0 additions & 38 deletions android/src/main/res/v33/anim-v33/rns_default_enter_out.xml

This file was deleted.

38 changes: 0 additions & 38 deletions android/src/main/res/v33/anim-v33/rns_default_exit_in.xml

This file was deleted.

38 changes: 0 additions & 38 deletions android/src/main/res/v33/anim-v33/rns_default_exit_out.xml

This file was deleted.

2 changes: 1 addition & 1 deletion react-navigation
Submodule react-navigation updated 471 files