From 2a12cbdba22030e2d223b4e35485db11f33bf301 Mon Sep 17 00:00:00 2001 From: Kacper Kafara Date: Fri, 21 Feb 2025 14:27:26 +0100 Subject: [PATCH 1/7] Remove unused GestureTransparentViewGroup --- .../GestureTransparentViewGroup.kt | 23 ------------------- 1 file changed, 23 deletions(-) delete mode 100644 android/src/main/java/com/swmansion/rnscreens/bottomsheet/GestureTransparentViewGroup.kt diff --git a/android/src/main/java/com/swmansion/rnscreens/bottomsheet/GestureTransparentViewGroup.kt b/android/src/main/java/com/swmansion/rnscreens/bottomsheet/GestureTransparentViewGroup.kt deleted file mode 100644 index 59097cd2f..000000000 --- a/android/src/main/java/com/swmansion/rnscreens/bottomsheet/GestureTransparentViewGroup.kt +++ /dev/null @@ -1,23 +0,0 @@ -package com.swmansion.rnscreens.bottomsheet - -import android.content.Context -import android.widget.FrameLayout -import com.facebook.react.uimanager.PointerEvents -import com.facebook.react.uimanager.ReactPointerEventsView - -/** - * View group that will be ignored by RN event system, and won't be target of touches. - * - * Currently used as container for the form sheet, so that user can interact with the view - * under the sheet (otherwise RN captures the gestures). - */ -class GestureTransparentViewGroup( - context: Context, -) : FrameLayout(context), - ReactPointerEventsView { - override val pointerEvents: PointerEvents = PointerEvents.BOX_NONE - - companion object { - const val TAG = "GestureTransparentFrameLayout" - } -} From 62c5ad22071f734ccd7e47426e4a86da4773c977 Mon Sep 17 00:00:00 2001 From: Kacper Kafara Date: Fri, 21 Feb 2025 14:41:02 +0100 Subject: [PATCH 2/7] Extract delegate implementations to versioned source files --- android/build.gradle | 7 +++++ .../rnscreens/ScreenStackFragment.kt | 15 ++++++----- .../rnscreens/bottomsheet/DimmingView.kt | 26 ++++++++++++++----- .../77/DimmingViewPointerEvents.kt | 15 +++++++++++ .../ScreensCoordinatorLayoutPointerEvents.kt | 11 ++++++++ .../latest/DimmingViewPointerEvents.kt | 16 ++++++++++++ .../ScreensCoordinatorLayoutPointerEvents.kt | 11 ++++++++ 7 files changed, 88 insertions(+), 13 deletions(-) create mode 100644 android/src/versioned/pointerevents/77/DimmingViewPointerEvents.kt create mode 100644 android/src/versioned/pointerevents/77/ScreensCoordinatorLayoutPointerEvents.kt create mode 100644 android/src/versioned/pointerevents/latest/DimmingViewPointerEvents.kt create mode 100644 android/src/versioned/pointerevents/latest/ScreensCoordinatorLayoutPointerEvents.kt diff --git a/android/build.gradle b/android/build.gradle index 12bf5ef2c..872d44e0f 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -194,6 +194,13 @@ android { } else { srcDirs += "src/versioned/backgroundcolor/latest" } + + // Native only classes that use PointerEvents + if (REACT_NATIVE_MINOR_VERSION <= 77) { + srcDirs += "src/versioned/pointerevents/77" + } else { + srcDirs += "src/versioned/pointerevents/latest" + } } res { if (safeExtGet(['compileSdkVersion', 'compileSdk'], rnsDefaultCompileSdkVersion) >= 33) { diff --git a/android/src/main/java/com/swmansion/rnscreens/ScreenStackFragment.kt b/android/src/main/java/com/swmansion/rnscreens/ScreenStackFragment.kt index 379ef1732..03e7e0cd5 100644 --- a/android/src/main/java/com/swmansion/rnscreens/ScreenStackFragment.kt +++ b/android/src/main/java/com/swmansion/rnscreens/ScreenStackFragment.kt @@ -27,7 +27,6 @@ import androidx.appcompat.widget.Toolbar import androidx.coordinatorlayout.widget.CoordinatorLayout import androidx.core.view.WindowInsetsCompat import com.facebook.react.uimanager.PixelUtil -import com.facebook.react.uimanager.PointerEvents import com.facebook.react.uimanager.ReactPointerEventsView import com.facebook.react.uimanager.UIManagerHelper import com.google.android.material.appbar.AppBarLayout @@ -722,9 +721,16 @@ class ScreenStackFragment : private class ScreensCoordinatorLayout( context: Context, private val fragment: ScreenStackFragment, + private val pointerEventsImpl: ReactPointerEventsView, // ) : CoordinatorLayout(context), ReactCompoundViewGroup, ReactHitSlopView { ) : CoordinatorLayout(context), - ReactPointerEventsView { + ReactPointerEventsView by pointerEventsImpl { + constructor(context: Context, fragment: ScreenStackFragment) : this( + context, + fragment, + ScreensCoordinatorLayoutPointerEventsImpl(), + ) + override fun onApplyWindowInsets(insets: WindowInsets?): WindowInsets = super.onApplyWindowInsets(insets) private val animationListener: Animation.AnimationListener = @@ -801,11 +807,6 @@ class ScreenStackFragment : // // bottom – The Y coordinate of the bottom of the rectangle // return Rect(screen.x.toInt(), -screen.y.toInt(), screen.x.toInt() + screen.width, screen.y.toInt() + screen.height) // } - - // We set pointer events to BOX_NONE, because we don't want the ScreensCoordinatorLayout - // to be target of react gestures and effectively prevent interaction with screens - // underneath the current screen (useful in `modal` & `formSheet` presentation). - override val pointerEvents: PointerEvents = PointerEvents.BOX_NONE } private class ScreensAnimation( diff --git a/android/src/main/java/com/swmansion/rnscreens/bottomsheet/DimmingView.kt b/android/src/main/java/com/swmansion/rnscreens/bottomsheet/DimmingView.kt index 14f7bd26f..bfa16c632 100644 --- a/android/src/main/java/com/swmansion/rnscreens/bottomsheet/DimmingView.kt +++ b/android/src/main/java/com/swmansion/rnscreens/bottomsheet/DimmingView.kt @@ -5,7 +5,6 @@ import android.content.Context import android.graphics.Color import android.view.MotionEvent import android.view.ViewGroup -import com.facebook.react.uimanager.PointerEvents import com.facebook.react.uimanager.ReactCompoundViewGroup import com.facebook.react.uimanager.ReactPointerEventsView import com.swmansion.rnscreens.ext.equalWithRespectToEps @@ -17,13 +16,24 @@ import com.swmansion.rnscreens.ext.equalWithRespectToEps * This dimming view has one more additional feature: it blocks gestures if its alpha > 0. */ @SuppressLint("ViewConstructor") // Only we instantiate this view -class DimmingView( +internal class DimmingView( context: Context, initialAlpha: Float = 0.6F, + private val pointerEventsProxy: DimmingViewPointerEventsProxy ) : ViewGroup(context), ReactCompoundViewGroup, - ReactPointerEventsView { - private val blockGestures + ReactPointerEventsView by pointerEventsProxy { + + constructor(context: Context, initialAlpha: Float = 0.6F) : this( + context, initialAlpha, + DimmingViewPointerEventsProxy(null) + ) + + init { + pointerEventsProxy.pointerEventsImpl = DimmingViewPointerEventsImpl(this) + } + + internal val blockGestures get() = !alpha.equalWithRespectToEps(0F) init { @@ -59,8 +69,12 @@ class DimmingView( y: Float, ) = blockGestures - override val pointerEvents: PointerEvents - get() = if (blockGestures) PointerEvents.AUTO else PointerEvents.NONE + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + + // Break reference cycle, since the pointerEventsImpl strongly retains this. + pointerEventsProxy.pointerEventsImpl = null + } companion object { const val TAG = "DimmingView" diff --git a/android/src/versioned/pointerevents/77/DimmingViewPointerEvents.kt b/android/src/versioned/pointerevents/77/DimmingViewPointerEvents.kt new file mode 100644 index 000000000..8cb276a0f --- /dev/null +++ b/android/src/versioned/pointerevents/77/DimmingViewPointerEvents.kt @@ -0,0 +1,15 @@ +package com.swmansion.rnscreens.bottomsheet + +import com.facebook.react.uimanager.PointerEvents +import com.facebook.react.uimanager.ReactPointerEventsView +import com.swmansion.rnscreens.bottomsheet.DimmingView + + +internal class DimmingViewPointerEventsImpl(val dimmingView: DimmingView) : ReactPointerEventsView { + override fun getPointerEvents(): PointerEvents = if (dimmingView.blockGestures == false) PointerEvents.AUTO else PointerEvents.NONE +} + +internal class DimmingViewPointerEventsProxy(var pointerEventsImpl: DimmingViewPointerEventsImpl?) : + ReactPointerEventsView { + override fun getPointerEvents(): PointerEvents = pointerEventsImpl?.pointerEvents ?: PointerEvents.NONE +} diff --git a/android/src/versioned/pointerevents/77/ScreensCoordinatorLayoutPointerEvents.kt b/android/src/versioned/pointerevents/77/ScreensCoordinatorLayoutPointerEvents.kt new file mode 100644 index 000000000..ef89636b8 --- /dev/null +++ b/android/src/versioned/pointerevents/77/ScreensCoordinatorLayoutPointerEvents.kt @@ -0,0 +1,11 @@ +package com.swmansion.rnscreens + +import com.facebook.react.uimanager.PointerEvents +import com.facebook.react.uimanager.ReactPointerEventsView + +internal class ScreensCoordinatorLayoutPointerEventsImpl() : ReactPointerEventsView { + // We set pointer events to BOX_NONE, because we don't want the ScreensCoordinatorLayout + // to be target of react gestures and effectively prevent interaction with screens + // underneath the current screen (useful in `modal` & `formSheet` presentation). + override fun getPointerEvents(): PointerEvents = PointerEvents.BOX_NONE +} diff --git a/android/src/versioned/pointerevents/latest/DimmingViewPointerEvents.kt b/android/src/versioned/pointerevents/latest/DimmingViewPointerEvents.kt new file mode 100644 index 000000000..a88e138f4 --- /dev/null +++ b/android/src/versioned/pointerevents/latest/DimmingViewPointerEvents.kt @@ -0,0 +1,16 @@ +package com.swmansion.rnscreens.bottomsheet + +import com.facebook.react.uimanager.PointerEvents +import com.facebook.react.uimanager.ReactPointerEventsView + + +internal class DimmingViewPointerEventsImpl(val dimmingView: DimmingView) : ReactPointerEventsView { + override val pointerEvents: PointerEvents + get() = if (dimmingView.blockGestures == false) PointerEvents.AUTO else PointerEvents.NONE +} + +internal class DimmingViewPointerEventsProxy(var pointerEventsImpl: DimmingViewPointerEventsImpl?) : + ReactPointerEventsView { + override val pointerEvents: PointerEvents + get() = pointerEventsImpl?.pointerEvents ?: PointerEvents.NONE +} diff --git a/android/src/versioned/pointerevents/latest/ScreensCoordinatorLayoutPointerEvents.kt b/android/src/versioned/pointerevents/latest/ScreensCoordinatorLayoutPointerEvents.kt new file mode 100644 index 000000000..b926258fd --- /dev/null +++ b/android/src/versioned/pointerevents/latest/ScreensCoordinatorLayoutPointerEvents.kt @@ -0,0 +1,11 @@ +package com.swmansion.rnscreens + +import com.facebook.react.uimanager.PointerEvents +import com.facebook.react.uimanager.ReactPointerEventsView + +internal class ScreensCoordinatorLayoutPointerEventsImpl() : ReactPointerEventsView { + // We set pointer events to BOX_NONE, because we don't want the ScreensCoordinatorLayout + // to be target of react gestures and effectively prevent interaction with screens + // underneath the current screen (useful in `modal` & `formSheet` presentation). + override val pointerEvents: PointerEvents = PointerEvents.BOX_NONE +} From 042d3ac8b56596198e777c295b05285f276cda0d Mon Sep 17 00:00:00 2001 From: Kacper Kafara Date: Fri, 21 Feb 2025 14:49:14 +0100 Subject: [PATCH 3/7] Put files in appropriate package hierarchy --- .../rnscreens/ScreensCoordinatorLayoutPointerEventsImpl.kt} | 2 +- .../rnscreens/bottomsheet}/DimmingViewPointerEvents.kt | 0 .../rnscreens/ScreensCoordinatorLayoutPointerEventsImpl.kt} | 0 .../rnscreens/bottomsheet}/DimmingViewPointerEvents.kt | 0 4 files changed, 1 insertion(+), 1 deletion(-) rename android/src/versioned/pointerevents/77/{ScreensCoordinatorLayoutPointerEvents.kt => com/swmansion/rnscreens/ScreensCoordinatorLayoutPointerEventsImpl.kt} (84%) rename android/src/versioned/pointerevents/77/{ => com/swmansion/rnscreens/bottomsheet}/DimmingViewPointerEvents.kt (100%) rename android/src/versioned/pointerevents/latest/{ScreensCoordinatorLayoutPointerEvents.kt => com/swmansion/rnscreens/ScreensCoordinatorLayoutPointerEventsImpl.kt} (100%) rename android/src/versioned/pointerevents/latest/{ => com/swmansion/rnscreens/bottomsheet}/DimmingViewPointerEvents.kt (100%) diff --git a/android/src/versioned/pointerevents/77/ScreensCoordinatorLayoutPointerEvents.kt b/android/src/versioned/pointerevents/77/com/swmansion/rnscreens/ScreensCoordinatorLayoutPointerEventsImpl.kt similarity index 84% rename from android/src/versioned/pointerevents/77/ScreensCoordinatorLayoutPointerEvents.kt rename to android/src/versioned/pointerevents/77/com/swmansion/rnscreens/ScreensCoordinatorLayoutPointerEventsImpl.kt index ef89636b8..06008b62e 100644 --- a/android/src/versioned/pointerevents/77/ScreensCoordinatorLayoutPointerEvents.kt +++ b/android/src/versioned/pointerevents/77/com/swmansion/rnscreens/ScreensCoordinatorLayoutPointerEventsImpl.kt @@ -3,7 +3,7 @@ package com.swmansion.rnscreens import com.facebook.react.uimanager.PointerEvents import com.facebook.react.uimanager.ReactPointerEventsView -internal class ScreensCoordinatorLayoutPointerEventsImpl() : ReactPointerEventsView { +internal class ScreensCoordinatorLayoutPointerEventsImpl : ReactPointerEventsView { // We set pointer events to BOX_NONE, because we don't want the ScreensCoordinatorLayout // to be target of react gestures and effectively prevent interaction with screens // underneath the current screen (useful in `modal` & `formSheet` presentation). diff --git a/android/src/versioned/pointerevents/77/DimmingViewPointerEvents.kt b/android/src/versioned/pointerevents/77/com/swmansion/rnscreens/bottomsheet/DimmingViewPointerEvents.kt similarity index 100% rename from android/src/versioned/pointerevents/77/DimmingViewPointerEvents.kt rename to android/src/versioned/pointerevents/77/com/swmansion/rnscreens/bottomsheet/DimmingViewPointerEvents.kt diff --git a/android/src/versioned/pointerevents/latest/ScreensCoordinatorLayoutPointerEvents.kt b/android/src/versioned/pointerevents/latest/com/swmansion/rnscreens/ScreensCoordinatorLayoutPointerEventsImpl.kt similarity index 100% rename from android/src/versioned/pointerevents/latest/ScreensCoordinatorLayoutPointerEvents.kt rename to android/src/versioned/pointerevents/latest/com/swmansion/rnscreens/ScreensCoordinatorLayoutPointerEventsImpl.kt diff --git a/android/src/versioned/pointerevents/latest/DimmingViewPointerEvents.kt b/android/src/versioned/pointerevents/latest/com/swmansion/rnscreens/bottomsheet/DimmingViewPointerEvents.kt similarity index 100% rename from android/src/versioned/pointerevents/latest/DimmingViewPointerEvents.kt rename to android/src/versioned/pointerevents/latest/com/swmansion/rnscreens/bottomsheet/DimmingViewPointerEvents.kt From 44513aa0d8c5a710305851178748886728504137 Mon Sep 17 00:00:00 2001 From: Kacper Kafara Date: Fri, 21 Feb 2025 15:48:47 +0100 Subject: [PATCH 4/7] iOS backward compat --- ios/RNSScreenStack.mm | 3 ++- ios/utils/RNSDefines.h | 17 +++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/ios/RNSScreenStack.mm b/ios/RNSScreenStack.mm index ef5d9c360..40c12f5e5 100644 --- a/ios/RNSScreenStack.mm +++ b/ios/RNSScreenStack.mm @@ -4,6 +4,7 @@ #import #import #import +#import #import #import #import @@ -1232,7 +1233,7 @@ - (void)mountingTransactionDidMount:(const facebook::react::MountingTransaction withSurfaceTelemetry:(const facebook::react::SurfaceTelemetry &)surfaceTelemetry { for (const auto &mutation : transaction.getMutations()) { - if (mutation.parentTag == self.tag && + if (MUTATION_PARENT_TAG(mutation) == self.tag && (mutation.type == react::ShadowViewMutation::Type::Insert || mutation.type == react::ShadowViewMutation::Type::Remove)) { // we need to wait until children have their layout set. At this point they don't have the layout diff --git a/ios/utils/RNSDefines.h b/ios/utils/RNSDefines.h index 83bde1c81..7f6506b94 100644 --- a/ios/utils/RNSDefines.h +++ b/ios/utils/RNSDefines.h @@ -5,3 +5,20 @@ _Pragma("clang diagnostic ignored \"-Wobjc-missing-super-calls\"") #define RNS_IGNORE_SUPER_CALL_END _Pragma("clang diagnostic pop") + +#import + +#if defined __has_include +#if __has_include( \ + ) // added in 78 +#define RNS_REACT_NATIVE_VERSION_MINOR_BELOW_78 0 +#else +#define RNS_REACT_NATIVE_VERSION_MINOR_BELOW_78 1 +#endif +#endif + +#if RNS_REACT_NATIVE_VERSION_MINOR_BELOW_78 +#define MUTATION_PARENT_TAG(mutation) mutation.parentShadowView.tag +#else +#define MUTATION_PARENT_TAG(mutation) mutation.parentTag +#endif From 9f0af2df9f6bfeb4180e7f589ab8498b25a7bb3a Mon Sep 17 00:00:00 2001 From: Kacper Kafara Date: Fri, 21 Feb 2025 18:01:14 +0100 Subject: [PATCH 5/7] Restore backward-compatible codegened interfaces --- .../viewmanagers/RNSScreenContainerManagerInterface.java | 4 ++-- .../viewmanagers/RNSScreenContentWrapperManagerInterface.java | 4 ++-- .../react/viewmanagers/RNSScreenFooterManagerInterface.java | 4 ++-- .../react/viewmanagers/RNSScreenManagerInterface.java | 4 ++-- .../RNSScreenStackHeaderConfigManagerInterface.java | 4 ++-- .../RNSScreenStackHeaderSubviewManagerInterface.java | 4 ++-- .../react/viewmanagers/RNSScreenStackManagerInterface.java | 4 ++-- .../react/viewmanagers/RNSSearchBarManagerInterface.java | 4 ++-- 8 files changed, 16 insertions(+), 16 deletions(-) diff --git a/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenContainerManagerInterface.java b/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenContainerManagerInterface.java index f39873dc2..99cb5107e 100644 --- a/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenContainerManagerInterface.java +++ b/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenContainerManagerInterface.java @@ -10,8 +10,8 @@ package com.facebook.react.viewmanagers; import android.view.View; -import com.facebook.react.uimanager.ViewManagerWithGeneratedInterface; -public interface RNSScreenContainerManagerInterface extends ViewManagerWithGeneratedInterface { + +public interface RNSScreenContainerManagerInterface { // No props } diff --git a/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenContentWrapperManagerInterface.java b/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenContentWrapperManagerInterface.java index c5a46818d..7cc6203e3 100644 --- a/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenContentWrapperManagerInterface.java +++ b/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenContentWrapperManagerInterface.java @@ -10,8 +10,8 @@ package com.facebook.react.viewmanagers; import android.view.View; -import com.facebook.react.uimanager.ViewManagerWithGeneratedInterface; -public interface RNSScreenContentWrapperManagerInterface extends ViewManagerWithGeneratedInterface { + +public interface RNSScreenContentWrapperManagerInterface { // No props } diff --git a/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenFooterManagerInterface.java b/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenFooterManagerInterface.java index e091c4f2d..9e0f49563 100644 --- a/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenFooterManagerInterface.java +++ b/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenFooterManagerInterface.java @@ -10,8 +10,8 @@ package com.facebook.react.viewmanagers; import android.view.View; -import com.facebook.react.uimanager.ViewManagerWithGeneratedInterface; -public interface RNSScreenFooterManagerInterface extends ViewManagerWithGeneratedInterface { + +public interface RNSScreenFooterManagerInterface { // No props } diff --git a/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenManagerInterface.java b/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenManagerInterface.java index 98fcdbdab..7544f69f4 100644 --- a/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenManagerInterface.java +++ b/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenManagerInterface.java @@ -13,9 +13,9 @@ import androidx.annotation.Nullable; import com.facebook.react.bridge.ReadableArray; import com.facebook.react.bridge.ReadableMap; -import com.facebook.react.uimanager.ViewManagerWithGeneratedInterface; -public interface RNSScreenManagerInterface extends ViewManagerWithGeneratedInterface { + +public interface RNSScreenManagerInterface { void setSheetAllowedDetents(T view, @Nullable ReadableArray value); void setSheetLargestUndimmedDetent(T view, int value); void setSheetGrabberVisible(T view, boolean value); diff --git a/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderConfigManagerInterface.java b/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderConfigManagerInterface.java index cb29c7f6f..446043698 100644 --- a/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderConfigManagerInterface.java +++ b/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderConfigManagerInterface.java @@ -11,9 +11,9 @@ import android.view.View; import androidx.annotation.Nullable; -import com.facebook.react.uimanager.ViewManagerWithGeneratedInterface; -public interface RNSScreenStackHeaderConfigManagerInterface extends ViewManagerWithGeneratedInterface { + +public interface RNSScreenStackHeaderConfigManagerInterface { void setBackgroundColor(T view, @Nullable Integer value); void setBackTitle(T view, @Nullable String value); void setBackTitleFontFamily(T view, @Nullable String value); diff --git a/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderSubviewManagerInterface.java b/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderSubviewManagerInterface.java index b56df67d9..dc320ad03 100644 --- a/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderSubviewManagerInterface.java +++ b/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderSubviewManagerInterface.java @@ -11,8 +11,8 @@ import android.view.View; import androidx.annotation.Nullable; -import com.facebook.react.uimanager.ViewManagerWithGeneratedInterface; -public interface RNSScreenStackHeaderSubviewManagerInterface extends ViewManagerWithGeneratedInterface { + +public interface RNSScreenStackHeaderSubviewManagerInterface { void setType(T view, @Nullable String value); } diff --git a/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackManagerInterface.java b/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackManagerInterface.java index 62f345a92..27c7f124f 100644 --- a/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackManagerInterface.java +++ b/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackManagerInterface.java @@ -10,8 +10,8 @@ package com.facebook.react.viewmanagers; import android.view.View; -import com.facebook.react.uimanager.ViewManagerWithGeneratedInterface; -public interface RNSScreenStackManagerInterface extends ViewManagerWithGeneratedInterface { + +public interface RNSScreenStackManagerInterface { // No props } diff --git a/android/src/paper/java/com/facebook/react/viewmanagers/RNSSearchBarManagerInterface.java b/android/src/paper/java/com/facebook/react/viewmanagers/RNSSearchBarManagerInterface.java index 5f7f326d2..04cd889eb 100644 --- a/android/src/paper/java/com/facebook/react/viewmanagers/RNSSearchBarManagerInterface.java +++ b/android/src/paper/java/com/facebook/react/viewmanagers/RNSSearchBarManagerInterface.java @@ -11,9 +11,9 @@ import android.view.View; import androidx.annotation.Nullable; -import com.facebook.react.uimanager.ViewManagerWithGeneratedInterface; -public interface RNSSearchBarManagerInterface extends ViewManagerWithGeneratedInterface { + +public interface RNSSearchBarManagerInterface { void setHideWhenScrolling(T view, boolean value); void setAutoCapitalize(T view, @Nullable String value); void setPlaceholder(T view, @Nullable String value); From 5621b2fbe7fd8e2bcd6e4ba150c46ea56311b00b Mon Sep 17 00:00:00 2001 From: Kacper Kafara Date: Fri, 21 Feb 2025 18:02:07 +0100 Subject: [PATCH 6/7] Add transform to sync script --- scripts/codegen-utils.js | 52 +++++++++++++++++++++++++++++++++------- 1 file changed, 44 insertions(+), 8 deletions(-) diff --git a/scripts/codegen-utils.js b/scripts/codegen-utils.js index 9633aa7e8..4a1ea8150 100644 --- a/scripts/codegen-utils.js +++ b/scripts/codegen-utils.js @@ -17,11 +17,11 @@ const RN_CODEGEN_DIR = path.resolve( ); const SOURCE_FOLDER = 'java/com/facebook/react/viewmanagers'; -const SCREENS_SOURCE_FOLDER = 'java/com/swmansion/rnscreens' +const SCREENS_SOURCE_FOLDER = 'java/com/swmansion/rnscreens'; const SOURCE_FOLDERS = [ - {codegenPath: `${GENERATED_DIR}/source/codegen/${SOURCE_FOLDER}`, oldArchPath: `${OLD_ARCH_DIR}/${SOURCE_FOLDER}`}, - {codegenPath: `${GENERATED_DIR}/source/codegen/${SCREENS_SOURCE_FOLDER}`, oldArchPath: `${OLD_ARCH_DIR}/${SCREENS_SOURCE_FOLDER}`}, + { codegenPath: `${GENERATED_DIR}/source/codegen/${SOURCE_FOLDER}`, oldArchPath: `${OLD_ARCH_DIR}/${SOURCE_FOLDER}` }, + { codegenPath: `${GENERATED_DIR}/source/codegen/${SCREENS_SOURCE_FOLDER}`, oldArchPath: `${OLD_ARCH_DIR}/${SCREENS_SOURCE_FOLDER}` }, ] const BLACKLISTED_FILES = new Set([ @@ -62,7 +62,7 @@ function fixOldArchJavaForRN72Compat(dir) { const filePath = path.join(dir, file); const fileExtension = path.extname(file); if (fileExtension === '.java') { - let fileContent = fs.readFileSync(filePath, 'utf-8'); + const fileContent = fs.readFileSync(filePath, 'utf-8'); let newFileContent = fileContent.replace( /extends ReactContextBaseJavaModule implements TurboModule/g, 'extends ReactContextBaseJavaModule implements ReactModuleWithSpec, TurboModule', @@ -74,7 +74,7 @@ function fixOldArchJavaForRN72Compat(dir) { 'import com.facebook.react.bridge.ReactMethod;\nimport com.facebook.react.bridge.ReactModuleWithSpec;', ); - console.log(' => fixOldArchJava applied to:', filePath); + console.log(' => fixOldArchJava72 applied to:', filePath); fs.writeFileSync(filePath, newFileContent, 'utf-8'); } } else if (fs.lstatSync(filePath).isDirectory()) { @@ -83,6 +83,40 @@ function fixOldArchJavaForRN72Compat(dir) { }); } +/** + * Adapts files codegend for the new architecture for paticular needs of old architecure. + * This usually comes down to keeping backward compat on old architecture. + * + * @param {string} dir - directory with codegened files + */ +function fixOldArchJavaForRN77Compat(dir) { + console.log(`${TAG} fixOldArchJavaForRN77Compat: ${dir}`); + const files = readdirSync(dir); + files.forEach(file => { + const filePath = path.join(dir, file); + const fileExtension = path.extname(file); + if (fileExtension === '.java') { + const fileContent = fs.readFileSync(filePath, 'utf-8'); + let newFileContent = fileContent.replace( + /extends ViewManagerWithGeneratedInterface/g, + '', + ); + if (fileContent !== newFileContent) { + // Also remove redundant import + newFileContent = newFileContent.replace( + /import com.facebook.react.uimanager.ViewManagerWithGeneratedInterface;/, + '', + ); + + console.log(' => fixOldArchJava77 applied to:', filePath); + fs.writeFileSync(filePath, newFileContent, 'utf-8'); + } + } else if (fs.lstatSync(filePath).isDirectory()) { + fixOldArchJavaForRN77Compat(filePath); + } + }); +} + async function generateCodegen() { console.log(`${TAG} generateCodegen`); exec(`rm -rf ${GENERATED_DIR}`); @@ -95,13 +129,15 @@ async function generateCodegen() { `node ${RN_DIR}/scripts/generate-specs-cli.js --platform android --schemaPath ${GENERATED_DIR}/source/codegen/schema.json --outputDir ${GENERATED_DIR}/source/codegen --javaPackageName ${PACKAGE_NAME}`, ); - fixOldArchJavaForRN72Compat(`${GENERATED_DIR}/source/codegen/java/`); + const generatedJavaFilesDir = `${GENERATED_DIR}/source/codegen/java/`; + fixOldArchJavaForRN72Compat(generatedJavaFilesDir); + fixOldArchJavaForRN77Compat(generatedJavaFilesDir); } async function generateCodegenJavaOldArch() { await generateCodegen(); - SOURCE_FOLDERS.forEach(({codegenPath, oldArchPath}) => { + SOURCE_FOLDERS.forEach(({ codegenPath, oldArchPath }) => { const generatedFiles = readdirSync(codegenPath); const oldArchFiles = readdirSync(oldArchPath); const existingFilesSet = new Set(oldArchFiles.map(fileName => fileName)); @@ -155,7 +191,7 @@ async function checkCodegenIntegrity() { await generateCodegen(); - SOURCE_FOLDERS.forEach(({codegenPath, oldArchPath}) => { + SOURCE_FOLDERS.forEach(({ codegenPath, oldArchPath }) => { const oldArchFiles = readdirSync(oldArchPath); oldArchFiles.forEach(file => { compareFileAtTwoPaths(file, codegenPath, oldArchPath); From 4aa830b752d67a25bcc1835ca71d55c26e704830 Mon Sep 17 00:00:00 2001 From: Kacper Kafara Date: Fri, 21 Feb 2025 18:08:16 +0100 Subject: [PATCH 7/7] Cleanup iOS files --- ios/RNSScreenStack.mm | 1 - ios/utils/RNSDefines.h | 2 -- 2 files changed, 3 deletions(-) diff --git a/ios/RNSScreenStack.mm b/ios/RNSScreenStack.mm index 40c12f5e5..9eb103b13 100644 --- a/ios/RNSScreenStack.mm +++ b/ios/RNSScreenStack.mm @@ -4,7 +4,6 @@ #import #import #import -#import #import #import #import diff --git a/ios/utils/RNSDefines.h b/ios/utils/RNSDefines.h index 7f6506b94..1b9a5bfc5 100644 --- a/ios/utils/RNSDefines.h +++ b/ios/utils/RNSDefines.h @@ -6,8 +6,6 @@ #define RNS_IGNORE_SUPER_CALL_END _Pragma("clang diagnostic pop") -#import - #if defined __has_include #if __has_include( \ ) // added in 78