From f21ec66cb48971c4ebf40dc374c71c6690c0c1ae Mon Sep 17 00:00:00 2001 From: Krzysztof Magiera Date: Wed, 15 Jan 2020 21:25:36 +0100 Subject: [PATCH] Fix header transition on Android. (#284) This change prevents toolbar from updating when there is a transition happening to the view. This fixes the issue where header subviews would disappear when going back from a given screen. The root cause was that the config view manager would trigger subviews removal and re-layout itself. As aresult if we had a custom back button that back button would get removed and the title would move into its place while the screen animation is running. In order to prevent that we hook into View Manager's onDropViewInstance to notify header config that it is about to be destroyed. This in turn prevents any updates to be made to the toolbar config. --- .../com/swmansion/rnscreens/ScreenStackHeaderConfig.java | 9 +++++++-- .../rnscreens/ScreenStackHeaderConfigViewManager.java | 8 +++++++- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfig.java b/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfig.java index 93121d01..e6065dc2 100644 --- a/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfig.java +++ b/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfig.java @@ -33,6 +33,7 @@ public class ScreenStackHeaderConfig extends ViewGroup { private boolean mGestureEnabled = true; private boolean mIsBackButtonHidden; private boolean mIsShadowHidden; + private boolean mDestroyed; private int mTintColor; private final Toolbar mToolbar; @@ -63,6 +64,10 @@ public class ScreenStackHeaderConfig extends ViewGroup { // no-op } + public void destroy() { + mDestroyed = true; + } + @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); @@ -116,7 +121,7 @@ public class ScreenStackHeaderConfig extends ViewGroup { boolean isRoot = stack == null ? true : stack.getRootScreen() == parent; boolean isTop = stack == null ? true : stack.getTopScreen() == parent; - if (!mIsAttachedToWindow || !isTop) { + if (!mIsAttachedToWindow || !isTop || mDestroyed) { return; } @@ -225,7 +230,7 @@ public class ScreenStackHeaderConfig extends ViewGroup { } private void maybeUpdate() { - if (getParent() != null) { + if (getParent() != null && !mDestroyed) { onUpdate(); } } diff --git a/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfigViewManager.java b/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfigViewManager.java index 0e271470..7ba8f26c 100644 --- a/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfigViewManager.java +++ b/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfigViewManager.java @@ -4,11 +4,12 @@ import android.view.View; import com.facebook.react.bridge.JSApplicationCausedNativeException; import com.facebook.react.module.annotations.ReactModule; -import com.facebook.react.uimanager.PixelUtil; import com.facebook.react.uimanager.ThemedReactContext; import com.facebook.react.uimanager.ViewGroupManager; import com.facebook.react.uimanager.annotations.ReactProp; +import javax.annotation.Nonnull; + @ReactModule(name = ScreenStackHeaderConfigViewManager.REACT_CLASS) public class ScreenStackHeaderConfigViewManager extends ViewGroupManager { @@ -32,6 +33,11 @@ public class ScreenStackHeaderConfigViewManager extends ViewGroupManager