diff --git a/android/src/main/java/com/swmansion/rnscreens/FullWindowOverlayViewManager.kt b/android/src/main/java/com/swmansion/rnscreens/FullWindowOverlayViewManager.kt new file mode 100644 index 0000000000..1d83b5c6cc --- /dev/null +++ b/android/src/main/java/com/swmansion/rnscreens/FullWindowOverlayViewManager.kt @@ -0,0 +1,83 @@ +package com.swmansion.rnscreens + +import android.content.Context +import android.graphics.PixelFormat +import android.view.MotionEvent +import android.view.View +import android.view.WindowManager +import com.facebook.react.bridge.ReactContext +import com.facebook.react.bridge.UiThreadUtil +import com.facebook.react.module.annotations.ReactModule +import com.facebook.react.uimanager.RootView +import com.facebook.react.uimanager.ThemedReactContext +import com.facebook.react.uimanager.ViewGroupManager +import com.facebook.react.views.view.ReactViewGroup + + +class FullWindowOverlayRootViewGroup(val reactContext: ThemedReactContext): ReactViewGroup(reactContext), RootView { + override fun onChildStartedNativeGesture(p0: View?, p1: MotionEvent?) { + TODO("Not yet implemented") + } + + override fun onChildEndedNativeGesture(p0: View?, p1: MotionEvent?) { + TODO("Not yet implemented") + } + + override fun handleException(t: Throwable) { + reactContext.reactApplicationContext.handleException(RuntimeException(t)) + } + + fun addToViewHierarchy() { + val windowManager = reactContext.getSystemService(Context.WINDOW_SERVICE) as WindowManager + val windowParams = WindowManager.LayoutParams( + WindowManager.LayoutParams.WRAP_CONTENT, + WindowManager.LayoutParams.WRAP_CONTENT, + WindowManager.LayoutParams.TYPE_APPLICATION, + (WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL + or WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE + or WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS + or WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN), + PixelFormat.TRANSLUCENT + ) + windowManager.addView(this, windowParams) + } +} + +class FullWindowOverlay(val reactContext: ThemedReactContext): ReactViewGroup(reactContext), RootView { + + private val fullWindowOverlayRootViewGroup = FullWindowOverlayRootViewGroup(reactContext) + + init { + fullWindowOverlayRootViewGroup.addToViewHierarchy() + } + + override fun onChildStartedNativeGesture(p0: View?, p1: MotionEvent?) { + TODO("Not yet implemented") + } + + override fun onChildEndedNativeGesture(p0: View?, p1: MotionEvent?) { + TODO("Not yet implemented") + } + + override fun handleException(throwable: Throwable?) { + TODO("Not yet implemented") + // reactContext.handleException(throwable) + } + + override fun addView(child: View?, index: Int) { + UiThreadUtil.assertOnUiThread() + fullWindowOverlayRootViewGroup.addView(child, index) + } + +} + +@ReactModule(name = FullWindowOverlayViewManager.REACT_CLASS) +class FullWindowOverlayViewManager: ViewGroupManager() { + companion object { + const val REACT_CLASS = "RNSFullWindowOverlay" + } + + override fun getName() = FullWindowOverlayViewManager.REACT_CLASS + + override fun createViewInstance(reactContext: ThemedReactContext) = FullWindowOverlay(reactContext) +} diff --git a/android/src/main/java/com/swmansion/rnscreens/RNScreensPackage.kt b/android/src/main/java/com/swmansion/rnscreens/RNScreensPackage.kt index 84124dd8ed..66d081871a 100644 --- a/android/src/main/java/com/swmansion/rnscreens/RNScreensPackage.kt +++ b/android/src/main/java/com/swmansion/rnscreens/RNScreensPackage.kt @@ -39,6 +39,7 @@ class RNScreensPackage : TurboReactPackage() { SearchBarManager(), ScreenFooterManager(), ScreenContentWrapperManager(), + FullWindowOverlayViewManager() ) } diff --git a/apps/src/tests/TestFullWindowOverlay.tsx b/apps/src/tests/TestFullWindowOverlay.tsx new file mode 100644 index 0000000000..7b5cda4fd4 --- /dev/null +++ b/apps/src/tests/TestFullWindowOverlay.tsx @@ -0,0 +1,30 @@ +import React from "react"; +import { View, Modal, Text } from "react-native"; +import { FullWindowOverlay } from "react-native-screens"; + +export default function TestFullScreenOverlay() { + return ( + + + + RNView + + + + + Modal + + + + + FullWindowOverlay #1 + + + + + FullWindowOverlay #2 + + + + ) +} diff --git a/apps/src/tests/index.ts b/apps/src/tests/index.ts index 979aecaae8..5fdbb4de0a 100644 --- a/apps/src/tests/index.ts +++ b/apps/src/tests/index.ts @@ -121,3 +121,4 @@ export { default as TestActivityStateProgression } from './TestActivityStateProg export { default as TestHeaderTitle } from './TestHeaderTitle'; export { default as TestModalNavigation } from './TestModalNavigation'; export { default as TestMemoryLeak } from './TestMemoryLeak'; +export { default as TestFullWindowOverlay } from './TestFullWindowOverlay'; diff --git a/guides/CONTRIBUTING.md b/guides/CONTRIBUTING.md index 0e8fd74494..ed1787d84e 100644 --- a/guides/CONTRIBUTING.md +++ b/guides/CONTRIBUTING.md @@ -91,7 +91,7 @@ To begin with, let install all dependencies: 1. `yarn` 2. `yarn submodules` -3. `(cd react-navigation && yarn prepare)` +3. `(cd react-navigation && yarn build)` 4. `cd Example` 5. `yarn` 6. `yarn start` – make sure to start metro bundler before building the app in Android Studio diff --git a/src/components/FullWindowOverlay.tsx b/src/components/FullWindowOverlay.tsx index bbe41b61f7..550d8e1c97 100644 --- a/src/components/FullWindowOverlay.tsx +++ b/src/components/FullWindowOverlay.tsx @@ -10,10 +10,6 @@ const NativeFullWindowOverlay: React.ComponentType< > = FullWindowOverlayNativeComponent as any; function FullWindowOverlay(props: { children: ReactNode }) { - if (Platform.OS !== 'ios') { - console.warn('Using FullWindowOverlay is only valid on iOS devices.'); - return ; - } return (