diff --git a/CHANGELOG.md b/CHANGELOG.md index b706b0a76e2b8..7762ef93dde9a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ Package-specific changes not released in any SDK will be added here just before - Updated `react-native-webview` from `11.23.0` to `11.23.1`. ([#19375](https://github.com/expo/expo/pull/19375) by [@aleqsio](https://github.com/aleqsio)) - Updated `react-native-gesture-handler` from `2.5.0` to `2.7.0`. ([#19362](https://github.com/expo/expo/pull/19362) by [@tsapeta](https://github.com/tsapeta)) - Updated `@react-native-picker/picker` from `2.4.2` to `2.4.6`. ([#19390](https://github.com/expo/expo/pull/19390) by [@aleqsio](https://github.com/aleqsio)) +- Updated `react-native-screens` from `3.15.0` to `3.18.0`. ([#19383](https://github.com/expo/expo/pull/19383) by [@tsapeta](https://github.com/tsapeta)) ### 🛠 Breaking changes diff --git a/android/expoview/build.gradle b/android/expoview/build.gradle index 2507a96d5b25b..792e9cb5a65d7 100644 --- a/android/expoview/build.gradle +++ b/android/expoview/build.gradle @@ -392,11 +392,6 @@ dependencies { } } - // react-native-screens - api 'androidx.fragment:fragment:1.2.2' - api 'androidx.coordinatorlayout:coordinatorlayout:1.1.0' - api 'com.google.android.material:material:1.1.0' - api 'com.google.firebase:firebase-core:17.2.3' api 'com.google.firebase:firebase-messaging:22.0.0' api 'com.google.maps.android:android-maps-utils:0.5' diff --git a/android/expoview/src/main/java/versioned/host/exp/exponent/ExponentPackage.kt b/android/expoview/src/main/java/versioned/host/exp/exponent/ExponentPackage.kt index d463e6a680e33..6f5b87a638f12 100644 --- a/android/expoview/src/main/java/versioned/host/exp/exponent/ExponentPackage.kt +++ b/android/expoview/src/main/java/versioned/host/exp/exponent/ExponentPackage.kt @@ -9,6 +9,7 @@ import com.facebook.react.bridge.ReactApplicationContext import com.facebook.react.uimanager.ViewManager import com.shopify.reactnative.flash_list.ReactNativeFlashListPackage import com.shopify.reactnative.skia.RNSkiaPackage +import com.swmansion.rnscreens.RNScreensPackage import com.swmansion.gesturehandler.RNGestureHandlerPackage import com.swmansion.gesturehandler.react.RNGestureHandlerModule import expo.modules.adapters.react.ReactModuleRegistryProvider @@ -43,7 +44,6 @@ import versioned.host.exp.exponent.modules.api.components.webview.RNCWebViewPack import versioned.host.exp.exponent.modules.api.netinfo.NetInfoModule import versioned.host.exp.exponent.modules.api.notifications.NotificationsModule import versioned.host.exp.exponent.modules.api.safeareacontext.SafeAreaContextPackage -import versioned.host.exp.exponent.modules.api.screens.RNScreensPackage import versioned.host.exp.exponent.modules.api.viewshot.RNViewShotModule import versioned.host.exp.exponent.modules.internal.DevMenuModule import versioned.host.exp.exponent.modules.test.ExponentTestNativeModule diff --git a/android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/RNScreensPackage.kt b/android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/RNScreensPackage.kt deleted file mode 100644 index 78b0720f8be5b..0000000000000 --- a/android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/RNScreensPackage.kt +++ /dev/null @@ -1,32 +0,0 @@ -package versioned.host.exp.exponent.modules.api.screens - -import com.facebook.react.ReactPackage -import com.facebook.react.bridge.NativeModule -import com.facebook.react.bridge.ReactApplicationContext -import com.facebook.react.uimanager.ViewManager -import com.facebook.soloader.SoLoader - -import host.exp.expoview.BuildConfig - -class RNScreensPackage : ReactPackage { - override fun createNativeModules(reactContext: ReactApplicationContext): List { - if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) { - // For Fabric, we load c++ native library here, this triggers screen's Fabric - // component registration which is necessary in order to avoid asking users - // to manually add init calls in their application code. - // This should no longer be needed if RN's autolink mechanism has Fabric support - SoLoader.loadLibrary("rnscreens_modules") - } - return emptyList() - } - - override fun createViewManagers(reactContext: ReactApplicationContext) = - listOf>( - ScreenContainerViewManager(), - ScreenViewManager(), - ScreenStackViewManager(), - ScreenStackHeaderConfigViewManager(), - ScreenStackHeaderSubviewManager(), - SearchBarManager() - ) -} diff --git a/android/vendored/unversioned/react-native-screens/android/build.gradle b/android/vendored/unversioned/react-native-screens/android/build.gradle new file mode 100644 index 0000000000000..58fe0e43d4811 --- /dev/null +++ b/android/vendored/unversioned/react-native-screens/android/build.gradle @@ -0,0 +1,117 @@ +buildscript { + ext.safeExtGet = {prop, fallback -> + rootProject.ext.has(prop) ? rootProject.ext.get(prop) : fallback + } + repositories { + google() + mavenCentral() + } + dependencies { + classpath('com.android.tools.build:gradle:4.2.2') + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${safeExtGet('kotlinVersion', '1.6.21')}" + classpath "com.diffplug.spotless:spotless-plugin-gradle:5.15.0" + } +} + +def isNewArchitectureEnabled() { + // To opt-in for the New Architecture, you can either: + // - Set `newArchEnabled` to true inside the `gradle.properties` file + // - Invoke gradle with `-newArchEnabled=true` + // - Set an environment variable `ORG_GRADLE_PROJECT_newArchEnabled=true` + return project.hasProperty("newArchEnabled") && project.newArchEnabled == "true" +} + +// spotless is only accessible within react-native-screens repo +if (project == rootProject) { + apply from: 'spotless.gradle' +} + +if (isNewArchitectureEnabled()) { + apply plugin: "com.facebook.react" +} +apply plugin: 'com.android.library' +apply plugin: 'kotlin-android' + +def reactNativeArchitectures() { + def value = project.getProperties().get("reactNativeArchitectures") + return value ? value.split(",") : ["armeabi-v7a", "x86", "x86_64", "arm64-v8a"] +} + +android { + compileSdkVersion safeExtGet('compileSdkVersion', 28) + + // Used to override the NDK path/version on internal CI or by allowing + // users to customize the NDK path/version from their root project (e.g. for M1 support) + if (rootProject.hasProperty("ndkPath")) { + ndkPath rootProject.ext.ndkPath + } + if (rootProject.hasProperty("ndkVersion")) { + ndkVersion rootProject.ext.ndkVersion + } + + defaultConfig { + minSdkVersion safeExtGet('minSdkVersion', 21) + targetSdkVersion safeExtGet('targetSdkVersion', 22) + versionCode 1 + versionName "1.0" + buildConfigField "boolean", "IS_NEW_ARCHITECTURE_ENABLED", isNewArchitectureEnabled().toString() + ndk { + abiFilters (*reactNativeArchitectures()) + } + } + lintOptions { + abortOnError false + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + packagingOptions { + // For some reason gradle only complains about the duplicated version of libreact_render libraries + // while there are more libraries copied in intermediates folder of the lib build directory, we exlude + // only the ones that make the build fail (ideally we should only include librnscreens_modules but we + // are only allowed to specify exlude patterns) + exclude "**/libreact_render*.so" + } + sourceSets.main { + java { + if (isNewArchitectureEnabled()) { + srcDirs += [ + "src/fabric/java", + ] + } else { + srcDirs += [ + "src/paper/java", + "build/generated/source/codegen/java" + ] + } + + } + } +} + +repositories { + maven { + // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm + // Matches the RN Hello World template + // https://github.com/facebook/react-native/blob/1e8f3b11027fe0a7514b4fc97d0798d3c64bc895/local-cli/templates/HelloWorld/android/build.gradle#L21 + url "$projectDir/../node_modules/react-native/android" + } + mavenCentral() + mavenLocal() + google() +} + +dependencies { + if (isNewArchitectureEnabled()) { + implementation project(":ReactAndroid") + } else { + implementation 'com.facebook.react:react-native:+' + } + implementation 'androidx.appcompat:appcompat:1.1.0' + implementation 'androidx.fragment:fragment:1.2.1' + implementation 'androidx.coordinatorlayout:coordinatorlayout:1.1.0' + implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.0.0' + implementation 'com.google.android.material:material:1.1.0' + implementation "androidx.core:core-ktx:1.5.0" +} diff --git a/android/vendored/unversioned/react-native-screens/android/src/fabric/java/com/swmansion/rnscreens/FabricEnabledViewGroup.kt b/android/vendored/unversioned/react-native-screens/android/src/fabric/java/com/swmansion/rnscreens/FabricEnabledViewGroup.kt new file mode 100644 index 0000000000000..d9e0e58dac49c --- /dev/null +++ b/android/vendored/unversioned/react-native-screens/android/src/fabric/java/com/swmansion/rnscreens/FabricEnabledViewGroup.kt @@ -0,0 +1,49 @@ +package com.swmansion.rnscreens + +import android.view.ViewGroup +import androidx.annotation.UiThread +import com.facebook.react.bridge.ReactContext +import com.facebook.react.bridge.ReadableMap +import com.facebook.react.bridge.WritableMap +import com.facebook.react.bridge.WritableNativeMap +import com.facebook.react.uimanager.FabricViewStateManager +import com.facebook.react.uimanager.PixelUtil +import kotlin.math.abs + +abstract class FabricEnabledViewGroup constructor(context: ReactContext?) : ViewGroup(context), FabricViewStateManager.HasFabricViewStateManager { + private val mFabricViewStateManager: FabricViewStateManager = FabricViewStateManager() + + override fun getFabricViewStateManager(): FabricViewStateManager { + return mFabricViewStateManager + } + + protected fun updateScreenSizeFabric(width: Int, height: Int) { + updateState(width, height) + } + + @UiThread + fun updateState(width: Int, height: Int) { + val realWidth: Float = PixelUtil.toDIPFromPixel(width.toFloat()) + val realHeight: Float = PixelUtil.toDIPFromPixel(height.toFloat()) + + // Check incoming state values. If they're already the correct value, return early to prevent + // infinite UpdateState/SetState loop. + val currentState: ReadableMap? = mFabricViewStateManager.getStateData() + if (currentState != null) { + val delta = 0.9f + val stateFrameHeight: Float = if (currentState.hasKey("frameHeight")) currentState.getDouble("frameHeight").toFloat() else 0f + val stateFrameWidth: Float = if (currentState.hasKey("frameWidth")) currentState.getDouble("frameWidth").toFloat() else 0f + if (abs(stateFrameWidth - realWidth) < delta && + abs(stateFrameHeight - realHeight) < delta + ) { + return + } + } + mFabricViewStateManager.setState { + val map: WritableMap = WritableNativeMap() + map.putDouble("frameWidth", realWidth.toDouble()) + map.putDouble("frameHeight", realHeight.toDouble()) + map + } + } +} diff --git a/android/vendored/unversioned/react-native-screens/android/src/main/AndroidManifest.xml b/android/vendored/unversioned/react-native-screens/android/src/main/AndroidManifest.xml new file mode 100644 index 0000000000000..2de74e803d009 --- /dev/null +++ b/android/vendored/unversioned/react-native-screens/android/src/main/AndroidManifest.xml @@ -0,0 +1,5 @@ + + + + diff --git a/android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/CustomSearchView.kt b/android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/CustomSearchView.kt similarity index 97% rename from android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/CustomSearchView.kt rename to android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/CustomSearchView.kt index d610a4b1f39fc..b6961844b51b3 100644 --- a/android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/CustomSearchView.kt +++ b/android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/CustomSearchView.kt @@ -1,4 +1,4 @@ -package versioned.host.exp.exponent.modules.api.screens +package com.swmansion.rnscreens import android.content.Context import androidx.activity.OnBackPressedCallback @@ -22,7 +22,9 @@ class CustomSearchView(context: Context, fragment: Fragment) : SearchView(contex isIconified = true } } + private val backPressOverrider = FragmentBackPressOverrider(fragment, mOnBackPressedCallback) + var overrideBackAction: Boolean set(value) { backPressOverrider.overrideBackAction = value diff --git a/android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/CustomToolbar.kt b/android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/CustomToolbar.kt similarity index 80% rename from android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/CustomToolbar.kt rename to android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/CustomToolbar.kt index 61e1ea0f3a532..3bc36355aad65 100644 --- a/android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/CustomToolbar.kt +++ b/android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/CustomToolbar.kt @@ -1,4 +1,4 @@ -package versioned.host.exp.exponent.modules.api.screens +package com.swmansion.rnscreens import android.content.Context import androidx.appcompat.widget.Toolbar diff --git a/android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/FragmentBackPressOverrider.kt b/android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/FragmentBackPressOverrider.kt similarity index 93% rename from android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/FragmentBackPressOverrider.kt rename to android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/FragmentBackPressOverrider.kt index 2885103b35566..0cf1706a85c69 100644 --- a/android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/FragmentBackPressOverrider.kt +++ b/android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/FragmentBackPressOverrider.kt @@ -1,4 +1,4 @@ -package versioned.host.exp.exponent.modules.api.screens +package com.swmansion.rnscreens import androidx.activity.OnBackPressedCallback import androidx.fragment.app.Fragment diff --git a/android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/LifecycleHelper.kt b/android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/LifecycleHelper.kt similarity index 93% rename from android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/LifecycleHelper.kt rename to android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/LifecycleHelper.kt index 0c77431920def..41bfc802df603 100644 --- a/android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/LifecycleHelper.kt +++ b/android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/LifecycleHelper.kt @@ -1,4 +1,4 @@ -package versioned.host.exp.exponent.modules.api.screens +package com.swmansion.rnscreens import android.view.View import androidx.fragment.app.Fragment @@ -43,8 +43,7 @@ class LifecycleHelper { } fun unregister(view: T) where T : View, T : LifecycleObserver? { - val lifecycle = mViewToLifecycleMap[view] - lifecycle?.removeObserver(view) + mViewToLifecycleMap[view]?.removeObserver(view) } companion object { diff --git a/android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/RNScreensPackage.kt b/android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/RNScreensPackage.kt new file mode 100644 index 0000000000000..371ed8cfc3c6e --- /dev/null +++ b/android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/RNScreensPackage.kt @@ -0,0 +1,21 @@ +package com.swmansion.rnscreens + +import com.facebook.react.ReactPackage +import com.facebook.react.bridge.NativeModule +import com.facebook.react.bridge.ReactApplicationContext +import com.facebook.react.uimanager.ViewManager + +class RNScreensPackage : ReactPackage { + override fun createNativeModules(reactContext: ReactApplicationContext): List = + emptyList() + + override fun createViewManagers(reactContext: ReactApplicationContext) = + listOf>( + ScreenContainerViewManager(), + ScreenViewManager(), + ScreenStackViewManager(), + ScreenStackHeaderConfigViewManager(), + ScreenStackHeaderSubviewManager(), + SearchBarManager() + ) +} diff --git a/android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/Screen.kt b/android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/Screen.kt similarity index 97% rename from android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/Screen.kt rename to android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/Screen.kt index acd8b56b066c3..dac3ac9013462 100644 --- a/android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/Screen.kt +++ b/android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/Screen.kt @@ -1,4 +1,4 @@ -package versioned.host.exp.exponent.modules.api.screens +package com.swmansion.rnscreens import android.annotation.SuppressLint import android.content.pm.ActivityInfo @@ -12,8 +12,6 @@ import com.facebook.react.bridge.GuardedRunnable import com.facebook.react.bridge.ReactContext import com.facebook.react.uimanager.UIManagerModule -import host.exp.expoview.BuildConfig - @SuppressLint("ViewConstructor") class Screen constructor(context: ReactContext?) : FabricEnabledViewGroup(context) { @@ -86,12 +84,7 @@ class Screen constructor(context: ReactContext?) : FabricEnabledViewGroup(contex } val headerConfig: ScreenStackHeaderConfig? - get() { - val child = getChildAt(0) - return if (child is ScreenStackHeaderConfig) { - child - } else null - } + get() = getChildAt(0) as? ScreenStackHeaderConfig /** * While transitioning this property allows to optimize rendering behavior on Android and provide diff --git a/android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/ScreenContainer.kt b/android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/ScreenContainer.kt similarity index 78% rename from android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/ScreenContainer.kt rename to android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/ScreenContainer.kt index 214b14b7ce147..39a51135478b6 100644 --- a/android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/ScreenContainer.kt +++ b/android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/ScreenContainer.kt @@ -1,4 +1,4 @@ -package versioned.host.exp.exponent.modules.api.screens +package com.swmansion.rnscreens import android.content.Context import android.content.ContextWrapper @@ -14,7 +14,7 @@ import com.facebook.react.ReactRootView import com.facebook.react.bridge.ReactContext import com.facebook.react.modules.core.ChoreographerCompat import com.facebook.react.modules.core.ReactChoreographer -import versioned.host.exp.exponent.modules.api.screens.Screen.ActivityState +import com.swmansion.rnscreens.Screen.ActivityState open class ScreenContainer(context: Context?) : ViewGroup(context) { @JvmField @@ -35,6 +35,7 @@ open class ScreenContainer(context: Context?) : ViewGroup(co } } private var mParentScreenFragment: ScreenFragment? = null + override fun onLayout(changed: Boolean, l: Int, t: Int, r: Int, b: Int) { var i = 0 val size = childCount @@ -116,25 +117,51 @@ open class ScreenContainer(context: Context?) : ViewGroup(co val screenCount: Int get() = mScreenFragments.size - fun getScreenAt(index: Int): Screen { - return mScreenFragments[index].screen - } + fun getScreenAt(index: Int): Screen = mScreenFragments[index].screen open val topScreen: Screen? - get() { - for (screenFragment in mScreenFragments) { - if (getActivityState(screenFragment) === ActivityState.ON_TOP) { - return screenFragment.screen - } - } - return null - } + get() = mScreenFragments.firstOrNull { getActivityState(it) === ActivityState.ON_TOP }?.screen private fun setFragmentManager(fm: FragmentManager) { mFragmentManager = fm performUpdatesNow() } + private fun findFragmentManagerForReactRootView(rootView: ReactRootView): FragmentManager { + var context = rootView.context + + // ReactRootView is expected to be initialized with the main React Activity as a context but + // in case of Expo the activity is wrapped in ContextWrapper and we need to unwrap it + while (context !is FragmentActivity && context is ContextWrapper) { + context = context.baseContext + } + + check(context is FragmentActivity) { + "In order to use RNScreens components your app's activity need to extend ReactActivity" + } + + // In case React Native is loaded on a Fragment (not directly in activity) we need to find + // fragment manager whose fragment's view is ReactRootView. As of now, we detect such case by + // checking whether any fragments are attached to activity which hosts ReactRootView. + // See: https://github.com/software-mansion/react-native-screens/issues/1506 on why the cases + // must be treated separately. + return if (context.supportFragmentManager.fragments.isEmpty()) { + // We are in standard React Native application w/o custom native navigation based on fragments. + context.supportFragmentManager + } else { + // We are in some custom setup & we want to use the closest fragment manager in hierarchy. + // `findFragment` method throws IllegalStateException when it fails to resolve appropriate + // fragment. It might happen when e.g. React Native is loaded directly in Activity + // but some custom fragments are still used. Such use case seems highly unlikely + // so, as for now we fallback to activity's FragmentManager in hope for the best. + try { + FragmentManager.findFragment(rootView).childFragmentManager + } catch (ex: IllegalStateException) { + context.supportFragmentManager + } + } + } + private fun setupFragmentManager() { var parent: ViewParent = this // We traverse view hierarchy up until we find screen parent or a root view @@ -146,35 +173,28 @@ open class ScreenContainer(context: Context?) : ViewGroup(co // If parent is of type Screen it means we are inside a nested fragment structure. // Otherwise we expect to connect directly with root view and get root fragment manager if (parent is Screen) { - val screenFragment = parent.fragment - check(screenFragment != null) { "Parent Screen does not have its Fragment attached" } - mParentScreenFragment = screenFragment - screenFragment.registerChildScreenContainer(this) - setFragmentManager(screenFragment.childFragmentManager) - return - } - - // we expect top level view to be of type ReactRootView, this isn't really necessary but in - // order to find root view we test if parent is null. This could potentially happen also when - // the view is detached from the hierarchy and that test would not correctly indicate the root - // view. So in order to make sure we indeed reached the root we test if it is of a correct type. - // This allows us to provide a more descriptive error message for the aforementioned case. - check(parent is ReactRootView) { "ScreenContainer is not attached under ReactRootView" } - // ReactRootView is expected to be initialized with the main React Activity as a context but - // in case of Expo the activity is wrapped in ContextWrapper and we need to unwrap it - var context = parent.context - while (context !is FragmentActivity && context is ContextWrapper) { - context = context.baseContext + checkNotNull( + parent.fragment?.let { screenFragment -> + mParentScreenFragment = screenFragment + screenFragment.registerChildScreenContainer(this) + setFragmentManager(screenFragment.childFragmentManager) + } + ) { "Parent Screen does not have its Fragment attached" } + } else { + // we expect top level view to be of type ReactRootView, this isn't really necessary but in + // order to find root view we test if parent is null. This could potentially happen also when + // the view is detached from the hierarchy and that test would not correctly indicate the root + // view. So in order to make sure we indeed reached the root we test if it is of a correct type. + // This allows us to provide a more descriptive error message for the aforementioned case. + check(parent is ReactRootView) { "ScreenContainer is not attached under ReactRootView" } + setFragmentManager(findFragmentManagerForReactRootView(parent)) } - check(context is FragmentActivity) { "In order to use RNScreens components your app's activity need to extend ReactActivity" } - setFragmentManager(context.supportFragmentManager) } protected fun createTransaction(): FragmentTransaction { - val fragmentManager = requireNotNull(mFragmentManager, { "mFragmentManager is null when creating transaction" }) - val transaction = fragmentManager.beginTransaction() - transaction.setReorderingAllowed(true) - return transaction + return requireNotNull(mFragmentManager) { "mFragmentManager is null when creating transaction" } + .beginTransaction() + .setReorderingAllowed(true) } private fun attachScreen(transaction: FragmentTransaction, screenFragment: ScreenFragment) { @@ -185,13 +205,11 @@ open class ScreenContainer(context: Context?) : ViewGroup(co transaction.remove(screenFragment) } - private fun getActivityState(screenFragment: ScreenFragment): ActivityState? { - return screenFragment.screen.activityState - } + private fun getActivityState(screenFragment: ScreenFragment): ActivityState? = + screenFragment.screen.activityState - open fun hasScreen(screenFragment: ScreenFragment?): Boolean { - return mScreenFragments.contains(screenFragment) - } + open fun hasScreen(screenFragment: ScreenFragment?): Boolean = + mScreenFragments.contains(screenFragment) override fun onAttachedToWindow() { super.onAttachedToWindow() @@ -204,9 +222,7 @@ open class ScreenContainer(context: Context?) : ViewGroup(co val transaction = fragmentManager.beginTransaction() var hasFragments = false for (fragment in fragmentManager.fragments) { - if (fragment is ScreenFragment && - fragment.screen.container === this - ) { + if (fragment is ScreenFragment && fragment.screen.container === this) { transaction.remove(fragment) hasFragments = true } @@ -247,19 +263,15 @@ open class ScreenContainer(context: Context?) : ViewGroup(co // children are not already detached, which may lead to calling `onDetachedFromWindow` on them // twice. // We also get the size earlier, because we will be removing child views in `for` loop. - val size = childCount - for (i in size - 1 downTo 0) { + for (i in childCount - 1 downTo 0) { removeViewAt(i) } } override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { super.onMeasure(widthMeasureSpec, heightMeasureSpec) - var i = 0 - val size = childCount - while (i < size) { + for (i in 0 until childCount) { getChildAt(i).measure(widthMeasureSpec, heightMeasureSpec) - i++ } } @@ -303,7 +315,11 @@ open class ScreenContainer(context: Context?) : ViewGroup(co open fun onUpdate() { createTransaction().let { // detach screens that are no longer active - val orphaned: MutableSet = HashSet(requireNotNull(mFragmentManager, { "mFragmentManager is null when performing update in ScreenContainer" }).fragments) + val orphaned: MutableSet = HashSet( + requireNotNull(mFragmentManager) { + "mFragmentManager is null when performing update in ScreenContainer" + }.fragments + ) for (screenFragment in mScreenFragments) { if (getActivityState(screenFragment) === ActivityState.INACTIVE && screenFragment.isAdded diff --git a/android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/ScreenContainerViewManager.kt b/android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/ScreenContainerViewManager.kt similarity index 71% rename from android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/ScreenContainerViewManager.kt rename to android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/ScreenContainerViewManager.kt index a6ca814b6d882..4cf0a1443e27f 100644 --- a/android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/ScreenContainerViewManager.kt +++ b/android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/ScreenContainerViewManager.kt @@ -1,4 +1,4 @@ -package versioned.host.exp.exponent.modules.api.screens +package com.swmansion.rnscreens import android.view.View import com.facebook.react.bridge.ReactApplicationContext @@ -9,13 +9,9 @@ import com.facebook.react.uimanager.ViewGroupManager @ReactModule(name = ScreenContainerViewManager.REACT_CLASS) class ScreenContainerViewManager : ViewGroupManager>() { - override fun getName(): String { - return REACT_CLASS - } + override fun getName(): String = REACT_CLASS - override fun createViewInstance(reactContext: ThemedReactContext): ScreenContainer { - return ScreenContainer(reactContext) - } + override fun createViewInstance(reactContext: ThemedReactContext): ScreenContainer = ScreenContainer(reactContext) override fun addView(parent: ScreenContainer<*>, child: View, index: Int) { require(child is Screen) { "Attempt attach child that is not of type RNScreens" } @@ -30,21 +26,13 @@ class ScreenContainerViewManager : ViewGroupManager>() { parent.removeAllScreens() } - override fun getChildCount(parent: ScreenContainer<*>): Int { - return parent.screenCount - } + override fun getChildCount(parent: ScreenContainer<*>): Int = parent.screenCount - override fun getChildAt(parent: ScreenContainer<*>, index: Int): View { - return parent.getScreenAt(index) - } + override fun getChildAt(parent: ScreenContainer<*>, index: Int): View = parent.getScreenAt(index) - override fun createShadowNodeInstance(context: ReactApplicationContext): LayoutShadowNode { - return ScreensShadowNode(context) - } + override fun createShadowNodeInstance(context: ReactApplicationContext): LayoutShadowNode = ScreensShadowNode(context) - override fun needsCustomLayoutForChildren(): Boolean { - return true - } + override fun needsCustomLayoutForChildren(): Boolean = true companion object { const val REACT_CLASS = "RNSScreenContainer" diff --git a/android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/ScreenFragment.kt b/android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/ScreenFragment.kt similarity index 84% rename from android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/ScreenFragment.kt rename to android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/ScreenFragment.kt index 9169e76ac935e..f9b1a71bba43f 100644 --- a/android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/ScreenFragment.kt +++ b/android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/ScreenFragment.kt @@ -1,4 +1,4 @@ -package versioned.host.exp.exponent.modules.api.screens +package com.swmansion.rnscreens import android.annotation.SuppressLint import android.app.Activity @@ -12,15 +12,16 @@ import android.widget.FrameLayout import androidx.fragment.app.Fragment import com.facebook.react.bridge.ReactContext import com.facebook.react.bridge.UiThreadUtil -import com.facebook.react.uimanager.UIManagerModule +import com.facebook.react.uimanager.UIManagerHelper import com.facebook.react.uimanager.events.Event -import versioned.host.exp.exponent.modules.api.screens.events.HeaderBackButtonClickedEvent -import versioned.host.exp.exponent.modules.api.screens.events.ScreenAppearEvent -import versioned.host.exp.exponent.modules.api.screens.events.ScreenDisappearEvent -import versioned.host.exp.exponent.modules.api.screens.events.ScreenDismissedEvent -import versioned.host.exp.exponent.modules.api.screens.events.ScreenTransitionProgressEvent -import versioned.host.exp.exponent.modules.api.screens.events.ScreenWillAppearEvent -import versioned.host.exp.exponent.modules.api.screens.events.ScreenWillDisappearEvent +import com.facebook.react.uimanager.events.EventDispatcher +import com.swmansion.rnscreens.events.HeaderBackButtonClickedEvent +import com.swmansion.rnscreens.events.ScreenAppearEvent +import com.swmansion.rnscreens.events.ScreenDisappearEvent +import com.swmansion.rnscreens.events.ScreenDismissedEvent +import com.swmansion.rnscreens.events.ScreenTransitionProgressEvent +import com.swmansion.rnscreens.events.ScreenWillAppearEvent +import com.swmansion.rnscreens.events.ScreenWillDisappearEvent import kotlin.math.max import kotlin.math.min @@ -73,13 +74,12 @@ open class ScreenFragment : Fragment { container: ViewGroup?, savedInstanceState: Bundle? ): View? { - val wrapper = context?.let { ScreensFrameLayout(it) } - - val params = FrameLayout.LayoutParams( + screen.layoutParams = FrameLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT ) - screen.layoutParams = params - wrapper?.addView(recycleView(screen)) + val wrapper = context?.let { ScreensFrameLayout(it) }?.apply { + addView(recycleView(screen)) + } return wrapper } @@ -152,13 +152,11 @@ open class ScreenFragment : Fragment { val childScreenContainers: List> get() = mChildScreenContainers - private fun canDispatchEvent(event: ScreenLifecycleEvent): Boolean { - return when (event) { - ScreenLifecycleEvent.WillAppear -> canDispatchWillAppear - ScreenLifecycleEvent.Appear -> canDispatchAppear - ScreenLifecycleEvent.WillDisappear -> !canDispatchWillAppear - ScreenLifecycleEvent.Disappear -> !canDispatchAppear - } + private fun canDispatchEvent(event: ScreenLifecycleEvent): Boolean = when (event) { + ScreenLifecycleEvent.WillAppear -> canDispatchWillAppear + ScreenLifecycleEvent.Appear -> canDispatchAppear + ScreenLifecycleEvent.WillDisappear -> !canDispatchWillAppear + ScreenLifecycleEvent.Disappear -> !canDispatchAppear } private fun setLastEventDispatched(event: ScreenLifecycleEvent) { @@ -172,25 +170,21 @@ open class ScreenFragment : Fragment { private fun dispatchOnWillAppear() { dispatchEvent(ScreenLifecycleEvent.WillAppear, this) - dispatchTransitionProgress(0.0f, false) } private fun dispatchOnAppear() { dispatchEvent(ScreenLifecycleEvent.Appear, this) - dispatchTransitionProgress(1.0f, false) } private fun dispatchOnWillDisappear() { dispatchEvent(ScreenLifecycleEvent.WillDisappear, this) - dispatchTransitionProgress(0.0f, true) } private fun dispatchOnDisappear() { dispatchEvent(ScreenLifecycleEvent.Disappear, this) - dispatchTransitionProgress(1.0f, true) } @@ -204,29 +198,25 @@ open class ScreenFragment : Fragment { ScreenLifecycleEvent.WillDisappear -> ScreenWillDisappearEvent(it.id) ScreenLifecycleEvent.Disappear -> ScreenDisappearEvent(it.id) } - (it.context as ReactContext) - .getNativeModule(UIManagerModule::class.java) - ?.eventDispatcher - ?.dispatchEvent(lifecycleEvent) + val screenContext = screen.context as ReactContext + val eventDispatcher: EventDispatcher? = + UIManagerHelper.getEventDispatcherForReactTag(screenContext, screen.id) + eventDispatcher?.dispatchEvent(lifecycleEvent) fragment.dispatchEventInChildContainers(event) } } } private fun dispatchEventInChildContainers(event: ScreenLifecycleEvent) { - for (sc in mChildScreenContainers) { - if (sc.screenCount > 0) { - sc.topScreen?.let { - sc.topScreen?.fragment?.let { fragment -> dispatchEvent(event, fragment) } - } - } + mChildScreenContainers.filter { it.screenCount > 0 }.forEach { + it.topScreen?.fragment?.let { fragment -> dispatchEvent(event, fragment) } } } fun dispatchHeaderBackButtonClickedEvent() { - (screen.context as ReactContext) - .getNativeModule(UIManagerModule::class.java) - ?.eventDispatcher + val screenContext = screen.context as ReactContext + UIManagerHelper + .getEventDispatcherForReactTag(screenContext, screen.id) ?.dispatchEvent(HeaderBackButtonClickedEvent(screen.id)) } @@ -242,9 +232,9 @@ open class ScreenFragment : Fragment { val coalescingKey = (if (mProgress == 0.0f) 1 else if (mProgress == 1.0f) 2 else 3).toShort() val container: ScreenContainer<*>? = screen.container val goingForward = if (container is ScreenStack) container.goingForward else false - (screen.context as ReactContext) - .getNativeModule(UIManagerModule::class.java) - ?.eventDispatcher + val screenContext = screen.context as ReactContext + UIManagerHelper + .getEventDispatcherForReactTag(screenContext, screen.id) ?.dispatchEvent( ScreenTransitionProgressEvent( screen.id, mProgress, closing, goingForward, coalescingKey @@ -302,10 +292,10 @@ open class ScreenFragment : Fragment { val container = screen.container if (container == null || !container.hasScreen(this)) { // we only send dismissed even when the screen has been removed from its container - if (screen.context is ReactContext) { - (screen.context as ReactContext) - .getNativeModule(UIManagerModule::class.java) - ?.eventDispatcher + val screenContext = screen.context + if (screenContext is ReactContext) { + UIManagerHelper + .getEventDispatcherForReactTag(screenContext, screen.id) ?.dispatchEvent(ScreenDismissedEvent(screen.id)) } } diff --git a/android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/ScreenStack.kt b/android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/ScreenStack.kt similarity index 90% rename from android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/ScreenStack.kt rename to android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/ScreenStack.kt index 4e6a4269c2038..34aed7959dc62 100644 --- a/android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/ScreenStack.kt +++ b/android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/ScreenStack.kt @@ -1,18 +1,16 @@ -package versioned.host.exp.exponent.modules.api.screens +package com.swmansion.rnscreens import android.content.Context import android.graphics.Canvas import android.view.View import com.facebook.react.bridge.ReactContext -import com.facebook.react.uimanager.UIManagerModule -import versioned.host.exp.exponent.modules.api.screens.Screen.StackAnimation -import versioned.host.exp.exponent.modules.api.screens.events.StackFinishTransitioningEvent +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 -import host.exp.expoview.R - class ScreenStack(context: Context?) : ScreenContainer(context) { private val mStack = ArrayList() private val mDismissed: MutableSet = HashSet() @@ -24,6 +22,7 @@ class ScreenStack(context: Context?) : ScreenContainer(cont private var reverseLastTwoChildren = false private var previousChildrenCount = 0 var goingForward = false + fun dismiss(screenFragment: ScreenStackFragment) { mDismissed.add(screenFragment) performUpdatesNow() @@ -31,23 +30,19 @@ class ScreenStack(context: Context?) : ScreenContainer(cont override val topScreen: Screen? get() = mTopScreen?.screen + val rootScreen: Screen get() { - var i = 0 - val size = screenCount - while (i < size) { + for (i in 0 until screenCount) { val screen = getScreenAt(i) if (!mDismissed.contains(screen.fragment)) { return screen } - i++ } throw IllegalStateException("Stack has no root screen set") } - override fun adapt(screen: Screen): ScreenStackFragment { - return ScreenStackFragment(screen) - } + override fun adapt(screen: Screen) = ScreenStackFragment(screen) override fun startViewTransition(view: View) { super.startViewTransition(view) @@ -69,15 +64,13 @@ class ScreenStack(context: Context?) : ScreenContainer(cont } private fun dispatchOnFinishTransitioning() { - (context as ReactContext) - .getNativeModule(UIManagerModule::class.java) - ?.eventDispatcher + UIManagerHelper + .getEventDispatcherForReactTag((context as ReactContext), id) ?.dispatchEvent(StackFinishTransitioningEvent(id)) } override fun removeScreenAt(index: Int) { - val toBeRemoved = getScreenAt(index) - mDismissed.remove(toBeRemoved.fragment) + mDismissed.remove(getScreenAt(index).fragment) super.removeScreenAt(index) } @@ -86,9 +79,8 @@ class ScreenStack(context: Context?) : ScreenContainer(cont super.removeAllScreens() } - override fun hasScreen(screenFragment: ScreenFragment?): Boolean { - return super.hasScreen(screenFragment) && !mDismissed.contains(screenFragment) - } + override fun hasScreen(screenFragment: ScreenFragment?): Boolean = + super.hasScreen(screenFragment) && !mDismissed.contains(screenFragment) override fun onUpdate() { // When going back from a nested stack with a single screen on it, we may hit an edge case @@ -252,9 +244,7 @@ class ScreenStack(context: Context?) : ScreenContainer(cont } override fun notifyContainerUpdate() { - for (screen in mStack) { - screen.onContainerUpdate() - } + mStack.forEach { it.onContainerUpdate() } } // below methods are taken from @@ -310,16 +300,14 @@ class ScreenStack(context: Context?) : ScreenContainer(cont super.drawChild(op.canvas, op.child, op.drawingTime) } - private fun obtainDrawingOp(): DrawingOp { - return if (drawingOpPool.isEmpty()) { - DrawingOp() - } else drawingOpPool.removeAt(drawingOpPool.size - 1) - } + private fun obtainDrawingOp(): DrawingOp = + if (drawingOpPool.isEmpty()) DrawingOp() else drawingOpPool.removeAt(drawingOpPool.size - 1) private inner class DrawingOp { var canvas: Canvas? = null var child: View? = null var drawingTime: Long = 0 + operator fun set(canvas: Canvas?, child: View?, drawingTime: Long): DrawingOp { this.canvas = canvas this.child = child @@ -336,18 +324,11 @@ class ScreenStack(context: Context?) : ScreenContainer(cont } companion object { - private fun isTransparent(fragment: ScreenStackFragment): Boolean { - return ( - fragment.screen.stackPresentation - === Screen.StackPresentation.TRANSPARENT_MODAL - ) - } + private fun isTransparent(fragment: ScreenStackFragment): Boolean = + fragment.screen.stackPresentation === Screen.StackPresentation.TRANSPARENT_MODAL - private fun needsDrawReordering(fragment: ScreenStackFragment): Boolean { - return ( - fragment.screen.stackAnimation === StackAnimation.SLIDE_FROM_BOTTOM || - fragment.screen.stackAnimation === StackAnimation.FADE_FROM_BOTTOM - ) - } + private fun needsDrawReordering(fragment: ScreenStackFragment): Boolean = + fragment.screen.stackAnimation === StackAnimation.SLIDE_FROM_BOTTOM || + fragment.screen.stackAnimation === StackAnimation.FADE_FROM_BOTTOM } } diff --git a/android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/ScreenStackFragment.kt b/android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/ScreenStackFragment.kt similarity index 82% rename from android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/ScreenStackFragment.kt rename to android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/ScreenStackFragment.kt index a266321d224bd..86a7654805783 100644 --- a/android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/ScreenStackFragment.kt +++ b/android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/ScreenStackFragment.kt @@ -1,4 +1,4 @@ -package versioned.host.exp.exponent.modules.api.screens +package com.swmansion.rnscreens import android.annotation.SuppressLint import android.content.Context @@ -51,11 +51,9 @@ class ScreenStackFragment : ScreenFragment { fun setToolbar(toolbar: Toolbar) { mAppBarLayout?.addView(toolbar) - val params = AppBarLayout.LayoutParams( + toolbar.layoutParams = AppBarLayout.LayoutParams( AppBarLayout.LayoutParams.MATCH_PARENT, AppBarLayout.LayoutParams.WRAP_CONTENT - ) - params.scrollFlags = 0 - toolbar.layoutParams = params + ).apply { scrollFlags = 0 } mToolbar = toolbar } @@ -76,8 +74,7 @@ class ScreenStackFragment : ScreenFragment { } override fun onContainerUpdate() { - val headerConfig = screen.headerConfig - headerConfig?.onUpdate() + screen.headerConfig?.onUpdate() } override fun onViewAnimationEnd() { @@ -99,22 +96,24 @@ class ScreenStackFragment : ScreenFragment { ): View? { val view: ScreensCoordinatorLayout? = context?.let { ScreensCoordinatorLayout(it, this) } - val params = CoordinatorLayout.LayoutParams( + + screen.layoutParams = CoordinatorLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT - ) - params.behavior = if (mIsTranslucent) null else ScrollingViewBehavior() - screen.layoutParams = params + ).apply { behavior = if (mIsTranslucent) null else ScrollingViewBehavior() } + view?.addView(recycleView(screen)) - mAppBarLayout = context?.let { AppBarLayout(it) } - // By default AppBarLayout will have a background color set but since we cover the whole layout - // with toolbar (that can be semi-transparent) the bar layout background color does not pay a - // role. On top of that it breaks screens animations when alfa offscreen compositing is off - // (which is the default) - mAppBarLayout?.setBackgroundColor(Color.TRANSPARENT) - mAppBarLayout?.layoutParams = AppBarLayout.LayoutParams( - AppBarLayout.LayoutParams.MATCH_PARENT, AppBarLayout.LayoutParams.WRAP_CONTENT - ) + mAppBarLayout = context?.let { AppBarLayout(it) }?.apply { + // By default AppBarLayout will have a background color set but since we cover the whole layout + // with toolbar (that can be semi-transparent) the bar layout background color does not pay a + // role. On top of that it breaks screens animations when alfa offscreen compositing is off + // (which is the default) + setBackgroundColor(Color.TRANSPARENT) + layoutParams = AppBarLayout.LayoutParams( + AppBarLayout.LayoutParams.MATCH_PARENT, AppBarLayout.LayoutParams.WRAP_CONTENT + ) + } + view?.addView(mAppBarLayout) if (mShadowHidden) { mAppBarLayout?.targetElevation = 0f @@ -157,9 +156,10 @@ class ScreenStackFragment : ScreenFragment { searchView = newSearchView onSearchViewCreate?.invoke(newSearchView) } - val item = menu.add("") - item.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS) - item.actionView = searchView + menu.add("").apply { + setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS) + actionView = searchView + } } } @@ -213,18 +213,23 @@ class ScreenStackFragment : ScreenFragment { // and also this is not necessary when going back since the lifecycle methods // are correctly dispatched then. // We also add fakeAnimation to the set of animations, which sends the progress of animation - val fakeAnimation = ScreensAnimation(mFragment) - fakeAnimation.duration = animation.duration + val fakeAnimation = ScreensAnimation(mFragment).apply { duration = animation.duration } + if (animation is AnimationSet && !mFragment.isRemoving) { - animation.addAnimation(fakeAnimation) - animation.setAnimationListener(mAnimationListener) - super.startAnimation(animation) + animation.apply { + addAnimation(fakeAnimation) + setAnimationListener(mAnimationListener) + }.also { + super.startAnimation(it) + } } else { - val set = AnimationSet(true) - set.addAnimation(animation) - set.addAnimation(fakeAnimation) - set.setAnimationListener(mAnimationListener) - super.startAnimation(set) + AnimationSet(true).apply { + addAnimation(animation) + addAnimation(fakeAnimation) + setAnimationListener(mAnimationListener) + }.also { + super.startAnimation(it) + } } } diff --git a/android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/ScreenStackHeaderConfig.kt b/android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfig.kt similarity index 92% rename from android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/ScreenStackHeaderConfig.kt rename to android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfig.kt index 111132fb2b72d..aa4c27c0c4dca 100644 --- a/android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/ScreenStackHeaderConfig.kt +++ b/android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfig.kt @@ -1,6 +1,5 @@ -package versioned.host.exp.exponent.modules.api.screens +package com.swmansion.rnscreens -import android.annotation.SuppressLint import android.content.Context import android.graphics.PorterDuff import android.os.Build @@ -21,9 +20,6 @@ import com.facebook.react.bridge.WritableMap import com.facebook.react.uimanager.events.RCTEventEmitter import com.facebook.react.views.text.ReactTypefaceUtils -import host.exp.expoview.BuildConfig -import host.exp.expoview.R - class ScreenStackHeaderConfig(context: Context) : ViewGroup(context) { private val mConfigSubviews = ArrayList(3) val toolbar: CustomToolbar @@ -104,23 +100,9 @@ class ScreenStackHeaderConfig(context: Context) : ViewGroup(context) { } private val screen: Screen? - get() { - val screen = parent - return if (screen is Screen) { - screen - } else null - } + get() = parent as? Screen private val screenStack: ScreenStack? - get() { - val screen = screen - if (screen != null) { - val container = screen.container - if (container is ScreenStack) { - return container - } - } - return null - } + get() = screen?.container as? ScreenStack val screenFragment: ScreenStackFragment? get() { val screen = parent @@ -133,15 +115,16 @@ class ScreenStackHeaderConfig(context: Context) : ViewGroup(context) { return null } - @SuppressLint("ObsoleteSdkInt") // to be removed when support for < 0.64 is dropped fun onUpdate() { val stack = screenStack val isTop = stack == null || stack.topScreen == parent + if (!mIsAttachedToWindow || !isTop || mDestroyed) { return } + val activity = screenFragment?.activity as AppCompatActivity? ?: return - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 && mDirection != null) { + if (mDirection != null) { if (mDirection == "rtl") { toolbar.layoutDirection = LAYOUT_DIRECTION_RTL } else if (mDirection == "ltr") { @@ -162,15 +145,18 @@ class ScreenStackHeaderConfig(context: Context) : ViewGroup(context) { } ScreenWindowTraits.trySetWindowTraits(it, activity, reactContext) } + if (mIsHidden) { if (toolbar.parent != null) { screenFragment?.removeToolbar() } return } + if (toolbar.parent == null) { screenFragment?.setToolbar(toolbar) } + if (mIsTopInsetEnabled) { headerTopInset.let { toolbar.setPadding(0, it ?: 0, 0, 0) @@ -180,6 +166,7 @@ class ScreenStackHeaderConfig(context: Context) : ViewGroup(context) { toolbar.setPadding(0, 0, 0, 0) } } + activity.setSupportActionBar(toolbar) // non-null toolbar is set in the line above and it is used here val actionBar = requireNotNull(activity.supportActionBar) @@ -216,10 +203,12 @@ class ScreenStackHeaderConfig(context: Context) : ViewGroup(context) { // which would impact the position of custom header views rendered at the center. toolbar.contentInsetStartWithNavigation = 0 } + val titleTextView = titleTextView if (mTitleColor != 0) { toolbar.setTitleTextColor(mTitleColor) } + if (titleTextView != null) { if (mTitleFontFamily != null || mTitleFontWeight > 0) { val titleTypeface = ReactTypefaceUtils.applyStyles( @@ -237,8 +226,7 @@ class ScreenStackHeaderConfig(context: Context) : ViewGroup(context) { // color if (mTintColor != 0) { - val navigationIcon = toolbar.navigationIcon - navigationIcon?.setColorFilter(mTintColor, PorterDuff.Mode.SRC_ATOP) + toolbar.navigationIcon?.setColorFilter(mTintColor, PorterDuff.Mode.SRC_ATOP) } // subviews @@ -247,6 +235,7 @@ class ScreenStackHeaderConfig(context: Context) : ViewGroup(context) { toolbar.removeViewAt(i) } } + var i = 0 val size = mConfigSubviews.size while (i < size) { @@ -294,9 +283,7 @@ class ScreenStackHeaderConfig(context: Context) : ViewGroup(context) { } } - fun getConfigSubview(index: Int): ScreenStackHeaderSubview { - return mConfigSubviews[index] - } + fun getConfigSubview(index: Int): ScreenStackHeaderSubview = mConfigSubviews[index] val configSubviewsCount: Int get() = mConfigSubviews.size @@ -318,16 +305,13 @@ class ScreenStackHeaderConfig(context: Context) : ViewGroup(context) { private val titleTextView: TextView? get() { - var i = 0 - val size = toolbar.childCount - while (i < size) { + for (i in 0 until toolbar.childCount) { val view = toolbar.getChildAt(i) if (view is TextView) { if (view.text == toolbar.title) { return view } } - i++ } return null } diff --git a/android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/ScreenStackHeaderConfigViewManager.kt b/android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfigViewManager.kt similarity index 93% rename from android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/ScreenStackHeaderConfigViewManager.kt rename to android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfigViewManager.kt index 6895cfc6a73c0..f17630319fb0b 100644 --- a/android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/ScreenStackHeaderConfigViewManager.kt +++ b/android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfigViewManager.kt @@ -1,4 +1,4 @@ -package versioned.host.exp.exponent.modules.api.screens +package com.swmansion.rnscreens import android.util.Log import android.view.View @@ -21,13 +21,9 @@ class ScreenStackHeaderConfigViewManager : ViewGroupManager(this) } - override fun getName(): String { - return REACT_CLASS - } + override fun getName(): String = REACT_CLASS - override fun createViewInstance(reactContext: ThemedReactContext): ScreenStackHeaderConfig { - return ScreenStackHeaderConfig(reactContext) - } + override fun createViewInstance(reactContext: ThemedReactContext) = ScreenStackHeaderConfig(reactContext) override fun addView(parent: ScreenStackHeaderConfig, child: View, index: Int) { if (child !is ScreenStackHeaderSubview) { @@ -50,17 +46,11 @@ class ScreenStackHeaderConfigViewManager : ViewGroupManager { - return mDelegate - } + protected override fun getDelegate(): ViewManagerDelegate = mDelegate companion object { const val REACT_CLASS = "RNSScreenStackHeaderConfig" diff --git a/android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/ScreenStackHeaderSubview.kt b/android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderSubview.kt similarity index 86% rename from android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/ScreenStackHeaderSubview.kt rename to android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderSubview.kt index cde35dec37592..74a2c8b1239fd 100644 --- a/android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/ScreenStackHeaderSubview.kt +++ b/android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderSubview.kt @@ -1,4 +1,4 @@ -package versioned.host.exp.exponent.modules.api.screens +package com.swmansion.rnscreens import android.annotation.SuppressLint import android.view.View @@ -12,9 +12,7 @@ class ScreenStackHeaderSubview(context: ReactContext?) : ReactViewGroup(context) var type = Type.RIGHT val config: ScreenStackHeaderConfig? - get() { - return (parent as? CustomToolbar)?.config - } + get() = (parent as? CustomToolbar)?.config override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { if (MeasureSpec.getMode(widthMeasureSpec) == MeasureSpec.EXACTLY && @@ -32,9 +30,7 @@ class ScreenStackHeaderSubview(context: ReactContext?) : ReactViewGroup(context) setMeasuredDimension(mReactWidth, mReactHeight) } - override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) { - // no-op - } + override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) = Unit enum class Type { LEFT, CENTER, RIGHT, BACK, SEARCH_BAR diff --git a/android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/ScreenStackHeaderSubviewManager.kt b/android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderSubviewManager.kt similarity index 86% rename from android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/ScreenStackHeaderSubviewManager.kt rename to android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderSubviewManager.kt index e56bd636db465..b2d2505ffd9f7 100644 --- a/android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/ScreenStackHeaderSubviewManager.kt +++ b/android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderSubviewManager.kt @@ -1,4 +1,4 @@ -package versioned.host.exp.exponent.modules.api.screens +package com.swmansion.rnscreens import com.facebook.react.bridge.JSApplicationIllegalArgumentException import com.facebook.react.module.annotations.ReactModule @@ -17,13 +17,9 @@ class ScreenStackHeaderSubviewManager : ViewGroupManager(this) } - override fun getName(): String { - return REACT_CLASS - } + override fun getName() = REACT_CLASS - override fun createViewInstance(context: ThemedReactContext): ScreenStackHeaderSubview { - return ScreenStackHeaderSubview(context) - } + override fun createViewInstance(context: ThemedReactContext) = ScreenStackHeaderSubview(context) @ReactProp(name = "type") override fun setType(view: ScreenStackHeaderSubview, type: String?) { @@ -37,9 +33,7 @@ class ScreenStackHeaderSubviewManager : ViewGroupManager { - return mDelegate - } + protected override fun getDelegate(): ViewManagerDelegate = mDelegate companion object { const val REACT_CLASS = "RNSScreenStackHeaderSubview" diff --git a/android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/ScreenStackViewManager.kt b/android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/ScreenStackViewManager.kt similarity index 77% rename from android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/ScreenStackViewManager.kt rename to android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/ScreenStackViewManager.kt index c06512250104c..d1176a4d49ad3 100644 --- a/android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/ScreenStackViewManager.kt +++ b/android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/ScreenStackViewManager.kt @@ -1,4 +1,4 @@ -package versioned.host.exp.exponent.modules.api.screens +package com.swmansion.rnscreens import android.view.View import android.view.ViewGroup @@ -10,6 +10,7 @@ import com.facebook.react.uimanager.ViewGroupManager import com.facebook.react.uimanager.ViewManagerDelegate import com.facebook.react.viewmanagers.RNSScreenStackManagerDelegate import com.facebook.react.viewmanagers.RNSScreenStackManagerInterface +import com.swmansion.rnscreens.events.StackFinishTransitioningEvent @ReactModule(name = ScreenStackViewManager.REACT_CLASS) class ScreenStackViewManager : ViewGroupManager(), RNSScreenStackManagerInterface { @@ -19,13 +20,9 @@ class ScreenStackViewManager : ViewGroupManager(), RNSScreenStackMa mDelegate = RNSScreenStackManagerDelegate(this) } - override fun getName(): String { - return REACT_CLASS - } + override fun getName() = REACT_CLASS - override fun createViewInstance(reactContext: ThemedReactContext): ScreenStack { - return ScreenStack(reactContext) - } + override fun createViewInstance(reactContext: ThemedReactContext) = ScreenStack(reactContext) override fun addView(parent: ScreenStack, child: View, index: Int) { require(child is Screen) { "Attempt attach child that is not of type RNScreen" } @@ -42,10 +39,8 @@ class ScreenStackViewManager : ViewGroupManager(), RNSScreenStackMa } private fun startTransitionRecursive(parent: ViewGroup?) { - var i = 0 parent?.let { - val size = it.childCount - while (i < size) { + for (i in 0 until it.childCount) { val child = it.getChildAt(i) child?.let { view -> it.startViewTransition(view) } if (child is ScreenStackHeaderConfig) { @@ -56,30 +51,23 @@ class ScreenStackViewManager : ViewGroupManager(), RNSScreenStackMa if (child is ViewGroup) { startTransitionRecursive(child) } - i++ } } } - override fun getChildCount(parent: ScreenStack): Int { - return parent.screenCount - } + override fun getChildCount(parent: ScreenStack) = parent.screenCount - override fun getChildAt(parent: ScreenStack, index: Int): View { - return parent.getScreenAt(index) - } + override fun getChildAt(parent: ScreenStack, index: Int): View = parent.getScreenAt(index) - override fun createShadowNodeInstance(context: ReactApplicationContext): LayoutShadowNode { - return ScreensShadowNode(context) - } + override fun createShadowNodeInstance(context: ReactApplicationContext): LayoutShadowNode = ScreensShadowNode(context) - override fun needsCustomLayoutForChildren(): Boolean { - return true - } + override fun needsCustomLayoutForChildren() = true - protected override fun getDelegate(): ViewManagerDelegate { - return mDelegate - } + protected override fun getDelegate(): ViewManagerDelegate = mDelegate + + override fun getExportedCustomDirectEventTypeConstants(): MutableMap = mutableMapOf( + StackFinishTransitioningEvent.EVENT_NAME to mutableMapOf("registrationName" to "onFinishTransitioning") + ) companion object { const val REACT_CLASS = "RNSScreenStack" diff --git a/android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/ScreenViewManager.kt b/android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/ScreenViewManager.kt similarity index 84% rename from android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/ScreenViewManager.kt rename to android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/ScreenViewManager.kt index 0a330f8b6272e..736e06b652e4e 100644 --- a/android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/ScreenViewManager.kt +++ b/android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/ScreenViewManager.kt @@ -1,4 +1,4 @@ -package versioned.host.exp.exponent.modules.api.screens +package com.swmansion.rnscreens import com.facebook.react.bridge.JSApplicationIllegalArgumentException import com.facebook.react.bridge.ReadableMap @@ -10,14 +10,13 @@ import com.facebook.react.uimanager.ViewManagerDelegate import com.facebook.react.uimanager.annotations.ReactProp import com.facebook.react.viewmanagers.RNSScreenManagerDelegate import com.facebook.react.viewmanagers.RNSScreenManagerInterface -import versioned.host.exp.exponent.modules.api.screens.events.HeaderBackButtonClickedEvent -import versioned.host.exp.exponent.modules.api.screens.events.ScreenAppearEvent -import versioned.host.exp.exponent.modules.api.screens.events.ScreenDisappearEvent -import versioned.host.exp.exponent.modules.api.screens.events.ScreenDismissedEvent -import versioned.host.exp.exponent.modules.api.screens.events.ScreenTransitionProgressEvent -import versioned.host.exp.exponent.modules.api.screens.events.ScreenWillAppearEvent -import versioned.host.exp.exponent.modules.api.screens.events.ScreenWillDisappearEvent -import versioned.host.exp.exponent.modules.api.screens.events.StackFinishTransitioningEvent +import com.swmansion.rnscreens.events.HeaderBackButtonClickedEvent +import com.swmansion.rnscreens.events.ScreenAppearEvent +import com.swmansion.rnscreens.events.ScreenDisappearEvent +import com.swmansion.rnscreens.events.ScreenDismissedEvent +import com.swmansion.rnscreens.events.ScreenTransitionProgressEvent +import com.swmansion.rnscreens.events.ScreenWillAppearEvent +import com.swmansion.rnscreens.events.ScreenWillDisappearEvent @ReactModule(name = ScreenViewManager.REACT_CLASS) class ScreenViewManager : ViewGroupManager(), RNSScreenManagerInterface { @@ -27,13 +26,9 @@ class ScreenViewManager : ViewGroupManager(), RNSScreenManagerInterface< mDelegate = RNSScreenManagerDelegate(this) } - override fun getName(): String { - return REACT_CLASS - } + override fun getName() = REACT_CLASS - override fun createViewInstance(reactContext: ThemedReactContext): Screen { - return Screen(reactContext) - } + override fun createViewInstance(reactContext: ThemedReactContext) = Screen(reactContext) override fun setActivityState(view: Screen, activityState: Float) { setActivityState(view, activityState.toInt()) @@ -162,7 +157,7 @@ class ScreenViewManager : ViewGroupManager(), RNSScreenManagerInterface< override fun setSwipeDirection(view: Screen?, value: String?) = Unit override fun getExportedCustomDirectEventTypeConstants(): MutableMap { - val map: MutableMap = MapBuilder.of( + return MapBuilder.of( ScreenDismissedEvent.EVENT_NAME, MapBuilder.of("registrationName", "onDismissed"), ScreenWillAppearEvent.EVENT_NAME, @@ -173,19 +168,14 @@ class ScreenViewManager : ViewGroupManager(), RNSScreenManagerInterface< MapBuilder.of("registrationName", "onWillDisappear"), ScreenDisappearEvent.EVENT_NAME, MapBuilder.of("registrationName", "onDisappear"), - StackFinishTransitioningEvent.EVENT_NAME, - MapBuilder.of("registrationName", "onFinishTransitioning"), + HeaderBackButtonClickedEvent.EVENT_NAME, + MapBuilder.of("registrationName", "onHeaderBackButtonClicked"), ScreenTransitionProgressEvent.EVENT_NAME, MapBuilder.of("registrationName", "onTransitionProgress") ) - // there is no `MapBuilder.of` with more than 7 items - map[HeaderBackButtonClickedEvent.EVENT_NAME] = MapBuilder.of("registrationName", "onHeaderBackButtonClicked") - return map } - protected override fun getDelegate(): ViewManagerDelegate { - return mDelegate - } + protected override fun getDelegate(): ViewManagerDelegate = mDelegate companion object { const val REACT_CLASS = "RNSScreen" diff --git a/android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/ScreenWindowTraits.kt b/android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/ScreenWindowTraits.kt similarity index 97% rename from android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/ScreenWindowTraits.kt rename to android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/ScreenWindowTraits.kt index 33779c1813bac..56278236cd52a 100644 --- a/android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/ScreenWindowTraits.kt +++ b/android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/ScreenWindowTraits.kt @@ -1,4 +1,4 @@ -package versioned.host.exp.exponent.modules.api.screens +package com.swmansion.rnscreens import android.animation.ArgbEvaluator import android.animation.ValueAnimator @@ -16,7 +16,7 @@ import androidx.core.view.WindowInsetsControllerCompat import com.facebook.react.bridge.GuardedRunnable import com.facebook.react.bridge.ReactContext import com.facebook.react.bridge.UiThreadUtil -import versioned.host.exp.exponent.modules.api.screens.Screen.WindowTraits +import com.swmansion.rnscreens.Screen.WindowTraits object ScreenWindowTraits { // Methods concerning statusBar management were taken from `react-native`'s status bar module: @@ -25,6 +25,7 @@ object ScreenWindowTraits { private var mDidSetStatusBarAppearance = false private var mDidSetNavigationBarAppearance = false private var mDefaultStatusBarColor: Int? = null + internal fun applyDidSetOrientation() { mDidSetOrientation = true } @@ -48,7 +49,7 @@ object ScreenWindowTraits { @SuppressLint("ObsoleteSdkInt") // to be removed when support for < 0.64 is dropped internal fun setColor(screen: Screen, activity: Activity?, context: ReactContext?) { - if (activity == null || context == null || Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { + if (activity == null || context == null) { return } if (mDefaultStatusBarColor == null) { diff --git a/android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/ScreensShadowNode.kt b/android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/ScreensShadowNode.kt similarity index 93% rename from android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/ScreensShadowNode.kt rename to android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/ScreensShadowNode.kt index 6f06eb485d549..6893aa1a4a545 100644 --- a/android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/ScreensShadowNode.kt +++ b/android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/ScreensShadowNode.kt @@ -1,4 +1,4 @@ -package versioned.host.exp.exponent.modules.api.screens +package com.swmansion.rnscreens import com.facebook.react.bridge.ReactContext import com.facebook.react.uimanager.LayoutShadowNode diff --git a/android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/SearchBarManager.kt b/android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/SearchBarManager.kt similarity index 98% rename from android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/SearchBarManager.kt rename to android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/SearchBarManager.kt index 8294cf6a7cd27..79ef4991a6d4d 100644 --- a/android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/SearchBarManager.kt +++ b/android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/SearchBarManager.kt @@ -1,4 +1,4 @@ -package versioned.host.exp.exponent.modules.api.screens +package com.swmansion.rnscreens import com.facebook.react.bridge.JSApplicationIllegalArgumentException import com.facebook.react.common.MapBuilder diff --git a/android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/SearchBarView.kt b/android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/SearchBarView.kt similarity index 98% rename from android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/SearchBarView.kt rename to android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/SearchBarView.kt index 6e68cebf4fd8b..46b8fd45eaf07 100644 --- a/android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/SearchBarView.kt +++ b/android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/SearchBarView.kt @@ -1,4 +1,4 @@ -package versioned.host.exp.exponent.modules.api.screens +package com.swmansion.rnscreens import android.annotation.SuppressLint import android.text.InputType diff --git a/android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/SearchViewFormatter.kt b/android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/SearchViewFormatter.kt similarity index 97% rename from android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/SearchViewFormatter.kt rename to android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/SearchViewFormatter.kt index bca57c3776f3c..8289555aaf9b6 100644 --- a/android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/SearchViewFormatter.kt +++ b/android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/SearchViewFormatter.kt @@ -1,4 +1,4 @@ -package versioned.host.exp.exponent.modules.api.screens +package com.swmansion.rnscreens import android.graphics.drawable.Drawable import android.view.View diff --git a/android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/events/HeaderBackButtonClickedEvent.kt b/android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/events/HeaderBackButtonClickedEvent.kt similarity index 91% rename from android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/events/HeaderBackButtonClickedEvent.kt rename to android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/events/HeaderBackButtonClickedEvent.kt index 1d84b62f4ff93..1d1ffbaf8bb2d 100644 --- a/android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/events/HeaderBackButtonClickedEvent.kt +++ b/android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/events/HeaderBackButtonClickedEvent.kt @@ -1,4 +1,4 @@ -package versioned.host.exp.exponent.modules.api.screens.events +package com.swmansion.rnscreens.events import com.facebook.react.bridge.Arguments import com.facebook.react.uimanager.events.Event diff --git a/android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/events/ScreenAppearEvent.kt b/android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/events/ScreenAppearEvent.kt similarity index 90% rename from android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/events/ScreenAppearEvent.kt rename to android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/events/ScreenAppearEvent.kt index 3c16f6aea4e77..2c7ef2f7967c1 100644 --- a/android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/events/ScreenAppearEvent.kt +++ b/android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/events/ScreenAppearEvent.kt @@ -1,4 +1,4 @@ -package versioned.host.exp.exponent.modules.api.screens.events +package com.swmansion.rnscreens.events import com.facebook.react.bridge.Arguments import com.facebook.react.uimanager.events.Event diff --git a/android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/events/ScreenDisappearEvent.kt b/android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/events/ScreenDisappearEvent.kt similarity index 90% rename from android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/events/ScreenDisappearEvent.kt rename to android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/events/ScreenDisappearEvent.kt index a6424847f0fc1..a53b3096f5206 100644 --- a/android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/events/ScreenDisappearEvent.kt +++ b/android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/events/ScreenDisappearEvent.kt @@ -1,4 +1,4 @@ -package versioned.host.exp.exponent.modules.api.screens.events +package com.swmansion.rnscreens.events import com.facebook.react.bridge.Arguments import com.facebook.react.uimanager.events.Event diff --git a/android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/events/ScreenDismissedEvent.kt b/android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/events/ScreenDismissedEvent.kt similarity index 92% rename from android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/events/ScreenDismissedEvent.kt rename to android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/events/ScreenDismissedEvent.kt index ba34d7c1a56fa..533c3e4718de6 100644 --- a/android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/events/ScreenDismissedEvent.kt +++ b/android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/events/ScreenDismissedEvent.kt @@ -1,4 +1,4 @@ -package versioned.host.exp.exponent.modules.api.screens.events +package com.swmansion.rnscreens.events import com.facebook.react.bridge.Arguments import com.facebook.react.uimanager.events.Event diff --git a/android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/events/ScreenTransitionProgressEvent.kt b/android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/events/ScreenTransitionProgressEvent.kt similarity index 93% rename from android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/events/ScreenTransitionProgressEvent.kt rename to android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/events/ScreenTransitionProgressEvent.kt index f3766dc84b5a6..b047fccb525e8 100644 --- a/android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/events/ScreenTransitionProgressEvent.kt +++ b/android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/events/ScreenTransitionProgressEvent.kt @@ -1,4 +1,4 @@ -package versioned.host.exp.exponent.modules.api.screens.events +package com.swmansion.rnscreens.events import com.facebook.react.bridge.Arguments import com.facebook.react.uimanager.events.Event diff --git a/android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/events/ScreenWillAppearEvent.kt b/android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/events/ScreenWillAppearEvent.kt similarity index 90% rename from android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/events/ScreenWillAppearEvent.kt rename to android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/events/ScreenWillAppearEvent.kt index a6b00e77bd9fc..c29abc24148d4 100644 --- a/android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/events/ScreenWillAppearEvent.kt +++ b/android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/events/ScreenWillAppearEvent.kt @@ -1,4 +1,4 @@ -package versioned.host.exp.exponent.modules.api.screens.events +package com.swmansion.rnscreens.events import com.facebook.react.bridge.Arguments import com.facebook.react.uimanager.events.Event diff --git a/android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/events/ScreenWillDisappearEvent.kt b/android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/events/ScreenWillDisappearEvent.kt similarity index 90% rename from android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/events/ScreenWillDisappearEvent.kt rename to android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/events/ScreenWillDisappearEvent.kt index e9985f48fcd9c..4304a9da20fd7 100644 --- a/android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/events/ScreenWillDisappearEvent.kt +++ b/android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/events/ScreenWillDisappearEvent.kt @@ -1,4 +1,4 @@ -package versioned.host.exp.exponent.modules.api.screens.events +package com.swmansion.rnscreens.events import com.facebook.react.bridge.Arguments import com.facebook.react.uimanager.events.Event diff --git a/android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/events/StackFinishTransitioningEvent.kt b/android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/events/StackFinishTransitioningEvent.kt similarity index 90% rename from android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/events/StackFinishTransitioningEvent.kt rename to android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/events/StackFinishTransitioningEvent.kt index 8d9c25faf404c..af1d6de0f6fdf 100644 --- a/android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/events/StackFinishTransitioningEvent.kt +++ b/android/vendored/unversioned/react-native-screens/android/src/main/java/com/swmansion/rnscreens/events/StackFinishTransitioningEvent.kt @@ -1,4 +1,4 @@ -package versioned.host.exp.exponent.modules.api.screens.events +package com.swmansion.rnscreens.events import com.facebook.react.bridge.Arguments import com.facebook.react.uimanager.events.Event diff --git a/android/vendored/unversioned/react-native-screens/android/src/main/jni/CMakeLists.txt b/android/vendored/unversioned/react-native-screens/android/src/main/jni/CMakeLists.txt new file mode 100644 index 0000000000000..3b388b4d99482 --- /dev/null +++ b/android/vendored/unversioned/react-native-screens/android/src/main/jni/CMakeLists.txt @@ -0,0 +1,72 @@ +cmake_minimum_required(VERSION 3.13) +set(CMAKE_VERBOSE_MAKEFILE ON) + +set(LIB_LITERAL rnscreens) +set(LIB_TARGET_NAME react_codegen_${LIB_LITERAL}) + +set(LIB_ANDROID_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../..) +set(LIB_COMMON_DIR ${LIB_ANDROID_DIR}/../common/cpp) +set(LIB_ANDROID_GENERATED_JNI_DIR ${LIB_ANDROID_DIR}/build/generated/source/codegen/jni) +set(LIB_ANDROID_GENERATED_COMPONENTS_DIR ${LIB_ANDROID_GENERATED_JNI_DIR}/react/renderer/components/${LIB_LITERAL}) + +add_compile_options( + -fexceptions + -frtti + -std=c++17 + -Wall + -Wpedantic + -Wno-gnu-zero-variadic-macro-arguments +) + +file(GLOB LIB_CUSTOM_SRCS CONFIGURE_DEPENDS *.cpp ${LIB_COMMON_DIR}/react/renderer/components/${LIB_LITERAL}/*.cpp) +file(GLOB LIB_CODEGEN_SRCS CONFIGURE_DEPENDS ${LIB_ANDROID_GENERATED_COMPONENTS_DIR}/*.cpp) + +add_library( + ${LIB_TARGET_NAME} + SHARED + ${LIB_CUSTOM_SRCS} + ${LIB_CODEGEN_SRCS} +) + +target_include_directories( + ${LIB_TARGET_NAME} + PUBLIC + . + ${LIB_COMMON_DIR} + ${LIB_ANDROID_GENERATED_JNI_DIR} + ${LIB_ANDROID_GENERATED_COMPONENTS_DIR} +) + +target_link_libraries( + ${LIB_TARGET_NAME} + fbjni + folly_runtime + glog + jsi + react_codegen_rncore + react_debug + react_nativemodule_core + react_render_core + react_render_debug + react_render_graphics + react_render_mapbuffer + rrc_view + turbomodulejsijni + yoga +) + +target_compile_options( + ${LIB_TARGET_NAME} + PRIVATE + -DLOG_TAG=\"ReactNative\" + -fexceptions + -frtti + -std=c++17 + -Wall +) + +target_include_directories( + ${CMAKE_PROJECT_NAME} + PUBLIC + ${CMAKE_CURRENT_SOURCE_DIR} +) diff --git a/android/vendored/unversioned/react-native-screens/android/src/main/jni/rnscreens.cpp b/android/vendored/unversioned/react-native-screens/android/src/main/jni/rnscreens.cpp new file mode 100644 index 0000000000000..ce5c15084e2e8 --- /dev/null +++ b/android/vendored/unversioned/react-native-screens/android/src/main/jni/rnscreens.cpp @@ -0,0 +1,16 @@ +/** + * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen). + * @generated by codegen project: GenerateModuleJniCpp.js + */ +#include "rnscreens.h" + +namespace facebook { +namespace react { + + +std::shared_ptr rnscreens_ModuleProvider(const std::string &moduleName, const JavaTurboModule::InitParams ¶ms) { + return nullptr; +} + +} // namespace react +} // namespace facebook diff --git a/android/vendored/unversioned/react-native-screens/android/src/main/jni/rnscreens.h b/android/vendored/unversioned/react-native-screens/android/src/main/jni/rnscreens.h new file mode 100644 index 0000000000000..2d755a0092ad7 --- /dev/null +++ b/android/vendored/unversioned/react-native-screens/android/src/main/jni/rnscreens.h @@ -0,0 +1,28 @@ +#pragma once + +#include +#include +#include + +/** + * Note this import and that it is not present in autogenerated header file + * under android/build/generated/source/codegen/jni/rnscreens.h + * + * It is added here to make our custom symbols visible in autogenerated file with + * code responsible for registering component descriptor providers. See that rncli.cpp, + * located under /android/app/build/generated/rncli/src/main/jni/rncli.cpp, + * includes autogenerated rnscreens.h header by default. We change this behaviour + * by appropriate include path configuration so that this header file gets included. + * + * See: https://github.com/software-mansion/react-native-screens/pull/1585 + */ +#include + +namespace facebook { +namespace react { + +JSI_EXPORT +std::shared_ptr rnscreens_ModuleProvider(const std::string &moduleName, const JavaTurboModule::InitParams ¶ms); + +} // namespace react +} // namespace facebook diff --git a/android/expoview/src/main/res/anim/rns_default_enter_in.xml b/android/vendored/unversioned/react-native-screens/android/src/main/res/anim/rns_default_enter_in.xml similarity index 98% rename from android/expoview/src/main/res/anim/rns_default_enter_in.xml rename to android/vendored/unversioned/react-native-screens/android/src/main/res/anim/rns_default_enter_in.xml index 51b17bc6d5cee..4398c7efc09a2 100644 --- a/android/expoview/src/main/res/anim/rns_default_enter_in.xml +++ b/android/vendored/unversioned/react-native-screens/android/src/main/res/anim/rns_default_enter_in.xml @@ -15,4 +15,4 @@ android:pivotX="50%" android:pivotY="50%" android:duration="200"/> - \ No newline at end of file + diff --git a/android/expoview/src/main/res/anim/rns_default_enter_out.xml b/android/vendored/unversioned/react-native-screens/android/src/main/res/anim/rns_default_enter_out.xml similarity index 98% rename from android/expoview/src/main/res/anim/rns_default_enter_out.xml rename to android/vendored/unversioned/react-native-screens/android/src/main/res/anim/rns_default_enter_out.xml index 8f0b131f8cd85..84c91759fe65f 100644 --- a/android/expoview/src/main/res/anim/rns_default_enter_out.xml +++ b/android/vendored/unversioned/react-native-screens/android/src/main/res/anim/rns_default_enter_out.xml @@ -16,4 +16,4 @@ android:pivotX="50%" android:pivotY="50%" android:duration="200"/> - \ No newline at end of file + diff --git a/android/expoview/src/main/res/anim/rns_default_exit_in.xml b/android/vendored/unversioned/react-native-screens/android/src/main/res/anim/rns_default_exit_in.xml similarity index 98% rename from android/expoview/src/main/res/anim/rns_default_exit_in.xml rename to android/vendored/unversioned/react-native-screens/android/src/main/res/anim/rns_default_exit_in.xml index 9fdfc1dbab044..6d6fa02acd19e 100644 --- a/android/expoview/src/main/res/anim/rns_default_exit_in.xml +++ b/android/vendored/unversioned/react-native-screens/android/src/main/res/anim/rns_default_exit_in.xml @@ -14,4 +14,4 @@ android:pivotX="50%" android:pivotY="50%" android:duration="200"/> - \ No newline at end of file + diff --git a/android/expoview/src/main/res/anim/rns_default_exit_out.xml b/android/vendored/unversioned/react-native-screens/android/src/main/res/anim/rns_default_exit_out.xml similarity index 98% rename from android/expoview/src/main/res/anim/rns_default_exit_out.xml rename to android/vendored/unversioned/react-native-screens/android/src/main/res/anim/rns_default_exit_out.xml index cb1b41b9a3425..b20a184f8baeb 100644 --- a/android/expoview/src/main/res/anim/rns_default_exit_out.xml +++ b/android/vendored/unversioned/react-native-screens/android/src/main/res/anim/rns_default_exit_out.xml @@ -15,4 +15,4 @@ android:pivotX="50%" android:pivotY="50%" android:duration="200"/> - \ No newline at end of file + diff --git a/android/expoview/src/main/res/anim/rns_fade_from_bottom.xml b/android/vendored/unversioned/react-native-screens/android/src/main/res/anim/rns_fade_from_bottom.xml similarity index 99% rename from android/expoview/src/main/res/anim/rns_fade_from_bottom.xml rename to android/vendored/unversioned/react-native-screens/android/src/main/res/anim/rns_fade_from_bottom.xml index 2182290bf8c22..c7a8abc07570e 100644 --- a/android/expoview/src/main/res/anim/rns_fade_from_bottom.xml +++ b/android/vendored/unversioned/react-native-screens/android/src/main/res/anim/rns_fade_from_bottom.xml @@ -11,4 +11,4 @@ android:duration="350"/> - \ No newline at end of file + diff --git a/android/expoview/src/main/res/anim/rns_fade_in.xml b/android/vendored/unversioned/react-native-screens/android/src/main/res/anim/rns_fade_in.xml similarity index 93% rename from android/expoview/src/main/res/anim/rns_fade_in.xml rename to android/vendored/unversioned/react-native-screens/android/src/main/res/anim/rns_fade_in.xml index 78e8a972bc4a2..c78ea619df636 100644 --- a/android/expoview/src/main/res/anim/rns_fade_in.xml +++ b/android/vendored/unversioned/react-native-screens/android/src/main/res/anim/rns_fade_in.xml @@ -4,4 +4,4 @@ android:fromAlpha="0.0" android:toAlpha="1.0" android:duration="150" - /> \ No newline at end of file + /> diff --git a/android/expoview/src/main/res/anim/rns_fade_out.xml b/android/vendored/unversioned/react-native-screens/android/src/main/res/anim/rns_fade_out.xml similarity index 93% rename from android/expoview/src/main/res/anim/rns_fade_out.xml rename to android/vendored/unversioned/react-native-screens/android/src/main/res/anim/rns_fade_out.xml index f1db2ad979272..334e63f34ebed 100644 --- a/android/expoview/src/main/res/anim/rns_fade_out.xml +++ b/android/vendored/unversioned/react-native-screens/android/src/main/res/anim/rns_fade_out.xml @@ -4,4 +4,4 @@ android:fromAlpha="1.0" android:toAlpha="0.0" android:duration="150" - /> \ No newline at end of file + /> diff --git a/android/expoview/src/main/res/anim/rns_fade_to_bottom.xml b/android/vendored/unversioned/react-native-screens/android/src/main/res/anim/rns_fade_to_bottom.xml similarity index 99% rename from android/expoview/src/main/res/anim/rns_fade_to_bottom.xml rename to android/vendored/unversioned/react-native-screens/android/src/main/res/anim/rns_fade_to_bottom.xml index c498341b3faa0..23345211ffcf9 100644 --- a/android/expoview/src/main/res/anim/rns_fade_to_bottom.xml +++ b/android/vendored/unversioned/react-native-screens/android/src/main/res/anim/rns_fade_to_bottom.xml @@ -12,4 +12,4 @@ android:duration="250"/> - \ No newline at end of file + diff --git a/android/expoview/src/main/res/anim/rns_no_animation_20.xml b/android/vendored/unversioned/react-native-screens/android/src/main/res/anim/rns_no_animation_20.xml similarity index 92% rename from android/expoview/src/main/res/anim/rns_no_animation_20.xml rename to android/vendored/unversioned/react-native-screens/android/src/main/res/anim/rns_no_animation_20.xml index be8dc2123922c..5cc0d2385b1e2 100644 --- a/android/expoview/src/main/res/anim/rns_no_animation_20.xml +++ b/android/vendored/unversioned/react-native-screens/android/src/main/res/anim/rns_no_animation_20.xml @@ -3,4 +3,4 @@ android:fromAlpha="1.0" android:toAlpha="1.0" android:duration="20" - /> \ No newline at end of file + /> diff --git a/android/expoview/src/main/res/anim/rns_no_animation_250.xml b/android/vendored/unversioned/react-native-screens/android/src/main/res/anim/rns_no_animation_250.xml similarity index 98% rename from android/expoview/src/main/res/anim/rns_no_animation_250.xml rename to android/vendored/unversioned/react-native-screens/android/src/main/res/anim/rns_no_animation_250.xml index 2371704980d91..bd082a3e18e91 100644 --- a/android/expoview/src/main/res/anim/rns_no_animation_250.xml +++ b/android/vendored/unversioned/react-native-screens/android/src/main/res/anim/rns_no_animation_250.xml @@ -4,4 +4,4 @@ android:toAlpha="1.0" android:duration="250" /> - \ No newline at end of file + diff --git a/android/expoview/src/main/res/anim/rns_no_animation_350.xml b/android/vendored/unversioned/react-native-screens/android/src/main/res/anim/rns_no_animation_350.xml similarity index 91% rename from android/expoview/src/main/res/anim/rns_no_animation_350.xml rename to android/vendored/unversioned/react-native-screens/android/src/main/res/anim/rns_no_animation_350.xml index db4cdc5a18041..003dcd1f17d3f 100644 --- a/android/expoview/src/main/res/anim/rns_no_animation_350.xml +++ b/android/vendored/unversioned/react-native-screens/android/src/main/res/anim/rns_no_animation_350.xml @@ -3,4 +3,4 @@ android:fromAlpha="1.0" android:toAlpha="1.0" android:duration="350" - /> \ No newline at end of file + /> diff --git a/android/expoview/src/main/res/anim/rns_no_animation_medium.xml b/android/vendored/unversioned/react-native-screens/android/src/main/res/anim/rns_no_animation_medium.xml similarity index 98% rename from android/expoview/src/main/res/anim/rns_no_animation_medium.xml rename to android/vendored/unversioned/react-native-screens/android/src/main/res/anim/rns_no_animation_medium.xml index 4e30d7099b1f7..560eda670d2b8 100644 --- a/android/expoview/src/main/res/anim/rns_no_animation_medium.xml +++ b/android/vendored/unversioned/react-native-screens/android/src/main/res/anim/rns_no_animation_medium.xml @@ -4,4 +4,4 @@ android:toAlpha="1.0" android:duration="@android:integer/config_mediumAnimTime" /> - \ No newline at end of file + diff --git a/android/expoview/src/main/res/anim/rns_slide_in_from_bottom.xml b/android/vendored/unversioned/react-native-screens/android/src/main/res/anim/rns_slide_in_from_bottom.xml similarity index 91% rename from android/expoview/src/main/res/anim/rns_slide_in_from_bottom.xml rename to android/vendored/unversioned/react-native-screens/android/src/main/res/anim/rns_slide_in_from_bottom.xml index a4c293e2e1f4d..052fe150edea6 100644 --- a/android/expoview/src/main/res/anim/rns_slide_in_from_bottom.xml +++ b/android/vendored/unversioned/react-native-screens/android/src/main/res/anim/rns_slide_in_from_bottom.xml @@ -4,4 +4,4 @@ android:toYDelta="0%" android:duration="@android:integer/config_mediumAnimTime" /> \ No newline at end of file + them to end at the same time. Remember to change duration in both files when modifying it--> diff --git a/android/expoview/src/main/res/anim/rns_slide_in_from_left.xml b/android/vendored/unversioned/react-native-screens/android/src/main/res/anim/rns_slide_in_from_left.xml similarity index 100% rename from android/expoview/src/main/res/anim/rns_slide_in_from_left.xml rename to android/vendored/unversioned/react-native-screens/android/src/main/res/anim/rns_slide_in_from_left.xml diff --git a/android/expoview/src/main/res/anim/rns_slide_in_from_right.xml b/android/vendored/unversioned/react-native-screens/android/src/main/res/anim/rns_slide_in_from_right.xml similarity index 100% rename from android/expoview/src/main/res/anim/rns_slide_in_from_right.xml rename to android/vendored/unversioned/react-native-screens/android/src/main/res/anim/rns_slide_in_from_right.xml diff --git a/android/expoview/src/main/res/anim/rns_slide_out_to_bottom.xml b/android/vendored/unversioned/react-native-screens/android/src/main/res/anim/rns_slide_out_to_bottom.xml similarity index 91% rename from android/expoview/src/main/res/anim/rns_slide_out_to_bottom.xml rename to android/vendored/unversioned/react-native-screens/android/src/main/res/anim/rns_slide_out_to_bottom.xml index 197c27697766d..6b75d2562fe62 100644 --- a/android/expoview/src/main/res/anim/rns_slide_out_to_bottom.xml +++ b/android/vendored/unversioned/react-native-screens/android/src/main/res/anim/rns_slide_out_to_bottom.xml @@ -4,4 +4,4 @@ android:toYDelta="100%" android:duration="@android:integer/config_mediumAnimTime" /> \ No newline at end of file + them to end at the same time. Remember to change duration in both files when modifying it--> diff --git a/android/expoview/src/main/res/anim/rns_slide_out_to_left.xml b/android/vendored/unversioned/react-native-screens/android/src/main/res/anim/rns_slide_out_to_left.xml similarity index 100% rename from android/expoview/src/main/res/anim/rns_slide_out_to_left.xml rename to android/vendored/unversioned/react-native-screens/android/src/main/res/anim/rns_slide_out_to_left.xml diff --git a/android/expoview/src/main/res/anim/rns_slide_out_to_right.xml b/android/vendored/unversioned/react-native-screens/android/src/main/res/anim/rns_slide_out_to_right.xml similarity index 100% rename from android/expoview/src/main/res/anim/rns_slide_out_to_right.xml rename to android/vendored/unversioned/react-native-screens/android/src/main/res/anim/rns_slide_out_to_right.xml diff --git a/android/expoview/src/main/java/com/facebook/react/viewmanagers/RNSScreenManagerDelegate.java b/android/vendored/unversioned/react-native-screens/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenManagerDelegate.java similarity index 100% rename from android/expoview/src/main/java/com/facebook/react/viewmanagers/RNSScreenManagerDelegate.java rename to android/vendored/unversioned/react-native-screens/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenManagerDelegate.java diff --git a/android/expoview/src/main/java/com/facebook/react/viewmanagers/RNSScreenManagerInterface.java b/android/vendored/unversioned/react-native-screens/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenManagerInterface.java similarity index 100% rename from android/expoview/src/main/java/com/facebook/react/viewmanagers/RNSScreenManagerInterface.java rename to android/vendored/unversioned/react-native-screens/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenManagerInterface.java diff --git a/android/expoview/src/main/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderConfigManagerDelegate.java b/android/vendored/unversioned/react-native-screens/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderConfigManagerDelegate.java similarity index 100% rename from android/expoview/src/main/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderConfigManagerDelegate.java rename to android/vendored/unversioned/react-native-screens/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderConfigManagerDelegate.java diff --git a/android/expoview/src/main/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderConfigManagerInterface.java b/android/vendored/unversioned/react-native-screens/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderConfigManagerInterface.java similarity index 100% rename from android/expoview/src/main/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderConfigManagerInterface.java rename to android/vendored/unversioned/react-native-screens/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderConfigManagerInterface.java diff --git a/android/expoview/src/main/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderSubviewManagerDelegate.java b/android/vendored/unversioned/react-native-screens/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderSubviewManagerDelegate.java similarity index 100% rename from android/expoview/src/main/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderSubviewManagerDelegate.java rename to android/vendored/unversioned/react-native-screens/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderSubviewManagerDelegate.java diff --git a/android/expoview/src/main/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderSubviewManagerInterface.java b/android/vendored/unversioned/react-native-screens/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderSubviewManagerInterface.java similarity index 100% rename from android/expoview/src/main/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderSubviewManagerInterface.java rename to android/vendored/unversioned/react-native-screens/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderSubviewManagerInterface.java diff --git a/android/expoview/src/main/java/com/facebook/react/viewmanagers/RNSScreenStackManagerDelegate.java b/android/vendored/unversioned/react-native-screens/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackManagerDelegate.java similarity index 100% rename from android/expoview/src/main/java/com/facebook/react/viewmanagers/RNSScreenStackManagerDelegate.java rename to android/vendored/unversioned/react-native-screens/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackManagerDelegate.java diff --git a/android/expoview/src/main/java/com/facebook/react/viewmanagers/RNSScreenStackManagerInterface.java b/android/vendored/unversioned/react-native-screens/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackManagerInterface.java similarity index 100% rename from android/expoview/src/main/java/com/facebook/react/viewmanagers/RNSScreenStackManagerInterface.java rename to android/vendored/unversioned/react-native-screens/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackManagerInterface.java diff --git a/android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/FabricEnabledViewGroup.kt b/android/vendored/unversioned/react-native-screens/android/src/paper/java/com/swmansion/rnscreens/FabricEnabledViewGroup.kt similarity index 82% rename from android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/FabricEnabledViewGroup.kt rename to android/vendored/unversioned/react-native-screens/android/src/paper/java/com/swmansion/rnscreens/FabricEnabledViewGroup.kt index 3a52c45519f35..106638858dc9a 100644 --- a/android/expoview/src/main/java/versioned/host/exp/exponent/modules/api/screens/FabricEnabledViewGroup.kt +++ b/android/vendored/unversioned/react-native-screens/android/src/paper/java/com/swmansion/rnscreens/FabricEnabledViewGroup.kt @@ -1,4 +1,4 @@ -package versioned.host.exp.exponent.modules.api.screens +package com.swmansion.rnscreens import android.view.ViewGroup import com.facebook.react.bridge.ReactContext diff --git a/apps/bare-expo/ios/Podfile.lock b/apps/bare-expo/ios/Podfile.lock index dd95c364818b2..276a849973ea7 100644 --- a/apps/bare-expo/ios/Podfile.lock +++ b/apps/bare-expo/ios/Podfile.lock @@ -743,7 +743,7 @@ PODS: - React-RCTText - ReactCommon/turbomodule/core - Yoga - - RNScreens (3.15.0): + - RNScreens (3.18.0): - React-Core - React-RCTImage - RNSharedElement (0.8.4): @@ -1375,7 +1375,7 @@ SPEC CHECKSUMS: RNDateTimePicker: 30e6733efc179d1e49d6008ea5fce42cdc9aeeca RNGestureHandler: 7673697e7c0e9391adefae4faa087442bc04af33 RNReanimated: 60e291d42c77752a0f6d6f358387bdf225a87c6e - RNScreens: 4a1af06327774490d97342c00aee0c2bafb497b7 + RNScreens: f3230dd008a7d0ce5c0a8bc78ff12cf2315bda24 RNSharedElement: eb7d506733952d58634f34c82ec17e82f557e377 RNSVG: 302bfc9905bd8122f08966dc2ce2d07b7b52b9f8 SDWebImage: e5cc87bf736e60f49592f307bdf9e157189298a3 diff --git a/apps/bare-expo/package.json b/apps/bare-expo/package.json index 9f93a5710e0af..d6ca9ba2a7898 100644 --- a/apps/bare-expo/package.json +++ b/apps/bare-expo/package.json @@ -115,7 +115,7 @@ "react-native-gesture-handler": "~2.7.0", "react-native-reanimated": "~2.10.0", "react-native-safe-area-context": "4.3.1", - "react-native-screens": "~3.15.0", + "react-native-screens": "~3.18.0", "react-native-shared-element": "0.8.4", "react-native-svg": "12.3.0", "react-native-view-shot": "3.3.0", diff --git a/apps/bare-sandbox/package.json b/apps/bare-sandbox/package.json index d618fdbabc878..c6c8710fef1ca 100644 --- a/apps/bare-sandbox/package.json +++ b/apps/bare-sandbox/package.json @@ -20,7 +20,7 @@ "react-native": "0.70.2", "react-native-gesture-handler": "~2.7.0", "react-native-reanimated": "~2.10.0", - "react-native-screens": "~3.15.0", + "react-native-screens": "~3.18.0", "react-native-web": "~0.18.9" }, "devDependencies": { diff --git a/apps/native-component-list/package.json b/apps/native-component-list/package.json index 4cbdf3c1d95fa..b719f728955cf 100644 --- a/apps/native-component-list/package.json +++ b/apps/native-component-list/package.json @@ -152,7 +152,7 @@ "react-native-reanimated": "~2.10.0", "react-native-safe-area-context": "4.3.1", "react-native-safe-area-view": "^0.14.8", - "react-native-screens": "~3.15.0", + "react-native-screens": "~3.18.0", "react-native-shared-element": "0.8.4", "react-native-svg": "12.3.0", "react-native-view-shot": "3.3.0", diff --git a/home/package.json b/home/package.json index c5cfd11667a5e..e991d0e52d537 100644 --- a/home/package.json +++ b/home/package.json @@ -62,7 +62,7 @@ "react-native-paper": "^4.0.1", "react-native-reanimated": "~2.10.0", "react-native-safe-area-context": "4.3.1", - "react-native-screens": "~3.15.0", + "react-native-screens": "~3.18.0", "react-redux": "^7.2.0", "react-string-replace": "^0.4.4", "reanimated-bottom-sheet": "^1.0.0-alpha.18", diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 8f45fdfc8a706..9e71f67959f49 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -2043,7 +2043,7 @@ PODS: - React-RCTText - ReactCommon/turbomodule/core - Yoga - - RNScreens (3.15.0): + - RNScreens (3.18.0): - React-Core - React-RCTImage - Stripe (22.7.1): @@ -3511,7 +3511,7 @@ SPEC CHECKSUMS: RNFlashList: 5116f2de2f543f01bfc30b22d5942d5af84b43df RNGestureHandler: 7673697e7c0e9391adefae4faa087442bc04af33 RNReanimated: 5c8c17e26787fd8984cd5accdc70fef2ca70aafd - RNScreens: 4a1af06327774490d97342c00aee0c2bafb497b7 + RNScreens: f3230dd008a7d0ce5c0a8bc78ff12cf2315bda24 Stripe: fb29a476e4866fec4ef22fb76207363dd32795aa stripe-react-native: 5663bf9de94bff6b3d92c16d32784433b5e94cf7 StripeApplePay: 09955cdf3f49b367af2feadd9c5b3bddb35446c0 diff --git a/ios/vendored/unversioned/react-native-screens/RNScreens.podspec.json b/ios/vendored/unversioned/react-native-screens/RNScreens.podspec.json index 6bc8166758c43..ce966b8a9d7a3 100644 --- a/ios/vendored/unversioned/react-native-screens/RNScreens.podspec.json +++ b/ios/vendored/unversioned/react-native-screens/RNScreens.podspec.json @@ -1,6 +1,6 @@ { "name": "RNScreens", - "version": "3.15.0", + "version": "3.18.0", "summary": "Native navigation primitives for your React Native app.", "description": "RNScreens - first incomplete navigation solution for your React Native app", "homepage": "https://github.com/software-mansion/react-native-screens", @@ -14,7 +14,7 @@ }, "source": { "git": "https://github.com/software-mansion/react-native-screens.git", - "tag": "3.15.0" + "tag": "3.18.0" }, "source_files": "ios/**/*.{h,m,mm}", "requires_arc": true, diff --git a/ios/vendored/unversioned/react-native-screens/ios/RNSFullWindowOverlay.mm b/ios/vendored/unversioned/react-native-screens/ios/RNSFullWindowOverlay.mm index dff0b2fd9e437..e3fedbb24d927 100644 --- a/ios/vendored/unversioned/react-native-screens/ios/RNSFullWindowOverlay.mm +++ b/ios/vendored/unversioned/react-native-screens/ios/RNSFullWindowOverlay.mm @@ -4,11 +4,11 @@ #ifdef RN_FABRIC_ENABLED #import +#import #import #import #import #import -#import "RCTFabricComponentsPlugins.h" #else #import #endif // RN_FABRIC_ENABLED diff --git a/ios/vendored/unversioned/react-native-screens/ios/RNSScreen.h b/ios/vendored/unversioned/react-native-screens/ios/RNSScreen.h index 79a012592c758..a2195b531f4c5 100644 --- a/ios/vendored/unversioned/react-native-screens/ios/RNSScreen.h +++ b/ios/vendored/unversioned/react-native-screens/ios/RNSScreen.h @@ -103,6 +103,7 @@ NS_ASSUME_NONNULL_BEGIN #endif - (void)notifyTransitionProgress:(double)progress closing:(BOOL)closing goingForward:(BOOL)goingForward; +- (BOOL)isModal; @end diff --git a/ios/vendored/unversioned/react-native-screens/ios/RNSScreen.mm b/ios/vendored/unversioned/react-native-screens/ios/RNSScreen.mm index 066ba3ac81e51..337b32512790f 100644 --- a/ios/vendored/unversioned/react-native-screens/ios/RNSScreen.mm +++ b/ios/vendored/unversioned/react-native-screens/ios/RNSScreen.mm @@ -6,13 +6,13 @@ #ifdef RN_FABRIC_ENABLED #import +#import #import #import #import #import #import #import -#import "RCTFabricComponentsPlugins.h" #import "RNSConvert.h" #import "RNSScreenViewEvent.h" #else @@ -508,6 +508,11 @@ - (void)presentationControllerDidDismiss:(UIPresentationController *)presentatio } } +- (BOOL)isModal +{ + return self.stackPresentation != RNSScreenStackPresentationPush; +} + #pragma mark - Fabric specific #ifdef RN_FABRIC_ENABLED @@ -545,6 +550,17 @@ - (void)prepareForRecycle _dismissed = NO; _state.reset(); _touchHandler = nil; + + // We set this prop to default value here to workaround view-recycling. + // Let's assume the view has had _stackPresentation == set + // before below line was executed. Then, when instantiated again (with the same modal presentation) + // updateProps:oldProps: method would be called and setter for stack presentation would not be called. + // This is crucial as in that setter we register `self.controller` as a delegate + // (UIAdaptivePresentationControllerDelegate) to presentation controller and this leads to buggy modal behaviour as we + // rely on UIAdaptivePresentationControllerDelegate callbacks. Restoring the default value and then comparing against + // it in updateProps:oldProps: allows for setter to be called, however if there was some additional logic to execute + // when stackPresentation is set to "push" the setter would not be triggered. + _stackPresentation = RNSScreenStackPresentationPush; } - (void)updateProps:(facebook::react::Props::Shared const &)props @@ -598,9 +614,12 @@ - (void)updateProps:(facebook::react::Props::Shared const &)props } #endif - if (newScreenProps.stackPresentation != oldScreenProps.stackPresentation) { - [self - setStackPresentation:[RNSConvert RNSScreenStackPresentationFromCppEquivalent:newScreenProps.stackPresentation]]; + // Notice that we compare against _stackPresentation, not oldScreenProps.stackPresentation. + // See comment in prepareForRecycle method for explanation. + RNSScreenStackPresentation newStackPresentation = + [RNSConvert RNSScreenStackPresentationFromCppEquivalent:newScreenProps.stackPresentation]; + if (newStackPresentation != _stackPresentation) { + [self setStackPresentation:newStackPresentation]; } if (newScreenProps.stackAnimation != oldScreenProps.stackAnimation) { @@ -739,7 +758,8 @@ - (void)viewWillAppear:(BOOL)animated - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; - if (!self.transitionCoordinator.isInteractive) { + // self.navigationController might be null when we are dismissing a modal + if (!self.transitionCoordinator.isInteractive && self.navigationController != nil) { // user might have long pressed ios 14 back button item, // so he can go back more than one screen and we need to dismiss more screens in JS stack then. // We check it by calculating the difference between the index of currently displayed screen diff --git a/ios/vendored/unversioned/react-native-screens/ios/RNSScreenContainer.mm b/ios/vendored/unversioned/react-native-screens/ios/RNSScreenContainer.mm index fe83a272545a8..baea98c1a1f77 100644 --- a/ios/vendored/unversioned/react-native-screens/ios/RNSScreenContainer.mm +++ b/ios/vendored/unversioned/react-native-screens/ios/RNSScreenContainer.mm @@ -3,9 +3,9 @@ #ifdef RN_FABRIC_ENABLED #import +#import #import #import -#import "RCTFabricComponentsPlugins.h" #endif @implementation RNScreensViewController diff --git a/ios/vendored/unversioned/react-native-screens/ios/RNSScreenNavigationContainer.mm b/ios/vendored/unversioned/react-native-screens/ios/RNSScreenNavigationContainer.mm index c328064961554..b32546c9bb38f 100644 --- a/ios/vendored/unversioned/react-native-screens/ios/RNSScreenNavigationContainer.mm +++ b/ios/vendored/unversioned/react-native-screens/ios/RNSScreenNavigationContainer.mm @@ -3,9 +3,9 @@ #import "RNSScreenContainer.h" #ifdef RN_FABRIC_ENABLED +#import #import #import -#import "RCTFabricComponentsPlugins.h" #endif @implementation RNScreensContainerNavigationController diff --git a/ios/vendored/unversioned/react-native-screens/ios/RNSScreenStack.mm b/ios/vendored/unversioned/react-native-screens/ios/RNSScreenStack.mm index 81322b1e4aae1..8744a64f6a811 100644 --- a/ios/vendored/unversioned/react-native-screens/ios/RNSScreenStack.mm +++ b/ios/vendored/unversioned/react-native-screens/ios/RNSScreenStack.mm @@ -7,7 +7,7 @@ #import #import -#import "RCTFabricComponentsPlugins.h" +#import #else #import @@ -823,7 +823,7 @@ - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceive RNSScreenView *topScreen = _reactSubviews.lastObject; if (![topScreen isKindOfClass:[RNSScreenView class]] || !topScreen.gestureEnabled || - _controller.viewControllers.count < 2) { + _controller.viewControllers.count < 2 || [topScreen isModal]) { return NO; } @@ -969,7 +969,7 @@ - (void)takeSnapshot - (void)mountingTransactionWillMount:(facebook::react::MountingTransaction const &)transaction withSurfaceTelemetry:(facebook::react::SurfaceTelemetry const &)surfaceTelemetry { - for (auto mutation : transaction.getMutations()) { + for (auto &mutation : transaction.getMutations()) { if (mutation.type == facebook::react::ShadowViewMutation::Type::Remove && mutation.parentShadowView.componentName != nil && strcmp(mutation.parentShadowView.componentName, "RNSScreenStack") == 0) { diff --git a/ios/vendored/unversioned/react-native-screens/ios/RNSScreenStackHeaderConfig.mm b/ios/vendored/unversioned/react-native-screens/ios/RNSScreenStackHeaderConfig.mm index 01f1480675d5f..7c5fa1b01a1c9 100644 --- a/ios/vendored/unversioned/react-native-screens/ios/RNSScreenStackHeaderConfig.mm +++ b/ios/vendored/unversioned/react-native-screens/ios/RNSScreenStackHeaderConfig.mm @@ -1,11 +1,11 @@ #ifdef RN_FABRIC_ENABLED #import +#import #import #import #import #import #import -#import "RCTFabricComponentsPlugins.h" #else #import #import @@ -118,7 +118,7 @@ - (void)updateViewControllerIfNeeded } // we want updates sent to the VC below modal too since it is also visible - BOOL isPresentingVC = vc.presentedViewController == nextVC; + BOOL isPresentingVC = nextVC != nil && vc.presentedViewController == nextVC; BOOL isInFullScreenModal = nav == nil && _screenView.stackPresentation == RNSScreenStackPresentationFullScreenModal; // if nav is nil, it means we can be in a fullScreen modal, so there is no nextVC, but we still want to update @@ -459,7 +459,6 @@ + (void)updateViewController:(UIViewController *)vc return; } - navitem.title = config.title; #if !TARGET_OS_TV if (config.backTitle != nil || config.backTitleFontFamily || config.backTitleFontSize || config.disableBackButtonMenu) { @@ -580,13 +579,17 @@ + (void)updateViewController:(UIViewController *)vc } case RNSScreenStackHeaderSubviewTypeBackButton: { #ifdef RN_FABRIC_ENABLED - RCTLogWarn(@"Back button subivew is not yet Fabric compatible in react-native-screens"); + RCTLogWarn(@"Back button subview is not yet Fabric compatible in react-native-screens"); #endif break; } } } + // This assignment should be done after `navitem.titleView = ...` assignment (iOS 16.0 bug). + // See: https://github.com/software-mansion/react-native-screens/issues/1570 (comments) + navitem.title = config.title; + if (animated && vc.transitionCoordinator != nil && vc.transitionCoordinator.presentationStyle == UIModalPresentationNone && !wasHidden) { // when there is an ongoing transition we may need to update navbar setting in animation block diff --git a/ios/vendored/unversioned/react-native-screens/ios/RNSScreenStackHeaderSubview.mm b/ios/vendored/unversioned/react-native-screens/ios/RNSScreenStackHeaderSubview.mm index 5d0ead1f483a6..70a430b04062d 100644 --- a/ios/vendored/unversioned/react-native-screens/ios/RNSScreenStackHeaderSubview.mm +++ b/ios/vendored/unversioned/react-native-screens/ios/RNSScreenStackHeaderSubview.mm @@ -7,7 +7,7 @@ #import #import -#import "RCTFabricComponentsPlugins.h" +#import #endif @implementation RNSScreenStackHeaderSubview diff --git a/ios/vendored/unversioned/react-native-screens/ios/RNSSearchBar.mm b/ios/vendored/unversioned/react-native-screens/ios/RNSSearchBar.mm index 12b7dc2c272d1..ebd322406d628 100644 --- a/ios/vendored/unversioned/react-native-screens/ios/RNSSearchBar.mm +++ b/ios/vendored/unversioned/react-native-screens/ios/RNSSearchBar.mm @@ -8,11 +8,11 @@ #ifdef RN_FABRIC_ENABLED #import +#import #import #import #import #import -#import "RCTFabricComponentsPlugins.h" #import "RNSConvert.h" #endif diff --git a/packages/expo-stories/package.json b/packages/expo-stories/package.json index 7796b72d5a03b..113507fbd0653 100644 --- a/packages/expo-stories/package.json +++ b/packages/expo-stories/package.json @@ -32,7 +32,7 @@ "glob": "^7.1.7", "react-native-gesture-handler": "~2.7.0", "react-native-safe-area-context": "4.3.1", - "react-native-screens": "~3.15.0", + "react-native-screens": "~3.18.0", "react-native-svg": "12.3.0", "sane": "^5.0.1" } diff --git a/packages/expo/bundledNativeModules.json b/packages/expo/bundledNativeModules.json index 2247fa0ff7c76..c424e3ea16c3e 100644 --- a/packages/expo/bundledNativeModules.json +++ b/packages/expo/bundledNativeModules.json @@ -96,7 +96,7 @@ "react-native-pager-view": "5.4.24", "react-native-reanimated": "~2.10.0", "react-native-safe-area-context": "4.3.1", - "react-native-screens": "~3.15.0", + "react-native-screens": "~3.18.0", "react-native-shared-element": "0.8.4", "react-native-svg": "12.3.0", "react-native-view-shot": "3.3.0", diff --git a/tools/src/vendoring/config/expoGoConfig.ts b/tools/src/vendoring/config/expoGoConfig.ts index ac06e4239e4e3..8139cb76fd3b4 100644 --- a/tools/src/vendoring/config/expoGoConfig.ts +++ b/tools/src/vendoring/config/expoGoConfig.ts @@ -109,23 +109,13 @@ const config: VendoringTargetConfig = { source: 'https://github.com/software-mansion/react-native-screens.git', semverPrefix: '~', ios: {}, - // TODO: Uncomment once the new vendoring scripts supports Android - // android: { - // transforms: { - // content: [ - // { - // paths: 'ScreenStack.kt', - // find: /(?=^class ScreenStack\()/m, - // replaceWith: `import host.exp.expoview.R\n\n`, - // }, - // { - // paths: 'ScreenStackHeaderConfig.kt', - // find: /(?=^class ScreenStackHeaderConfig\()/m, - // replaceWith: `import host.exp.expoview.BuildConfig\nimport host.exp.expoview.R\n\n`, - // }, - // ], - // }, - // }, + android: { + excludeFiles: [ + 'android/gradle{/**,**}', + 'android/settings.gradle', + 'android/spotless.gradle', + ], + }, }, 'amazon-cognito-identity-js': { source: 'https://github.com/aws-amplify/amplify-js.git', diff --git a/yarn.lock b/yarn.lock index 938b0578c201f..b3d33289d4a3e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -17279,10 +17279,10 @@ react-native-safe-modules@^1.0.3: dependencies: dedent "^0.6.0" -react-native-screens@~3.15.0: - version "3.15.0" - resolved "https://registry.yarnpkg.com/react-native-screens/-/react-native-screens-3.15.0.tgz#78e42c8df72851b1ff235ddf5434b961ae123ca5" - integrity sha512-ezC5TibsUYyqPuuHpZoM3iEl6bRzCVBMJeGaFkn7xznuOt1VwkZVub0BvafIEYR/+AQC/RjxzMSQPs1qal0+wA== +react-native-screens@~3.18.0: + version "3.18.0" + resolved "https://registry.yarnpkg.com/react-native-screens/-/react-native-screens-3.18.0.tgz#e10ec54d8b158d47f66dc6c9a81e5a042e33037d" + integrity sha512-ndnz5JPLMLq/ThCYQzAOT65x6B4bdKFH1GKckUdbxKrwINGItPRSUiAoVI7YYyOQOa4VYL4hF37rrx+AjgjtRg== dependencies: react-freeze "^1.0.0" warn-once "^0.1.0"