diff --git a/ReactAndroid/src/main/java/com/facebook/react/fabric/SurfaceHandler.java b/ReactAndroid/src/main/java/com/facebook/react/fabric/SurfaceHandler.java index 36e717ef325..8a2a482c379 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/fabric/SurfaceHandler.java +++ b/ReactAndroid/src/main/java/com/facebook/react/fabric/SurfaceHandler.java @@ -45,4 +45,6 @@ public interface SurfaceHandler { boolean doLeftAndRightSwapInRTL, boolean isRTL, float pixelDensity); + + void setMountable(boolean mountable); } diff --git a/ReactAndroid/src/main/java/com/facebook/react/fabric/SurfaceHandlerBinding.java b/ReactAndroid/src/main/java/com/facebook/react/fabric/SurfaceHandlerBinding.java index d5f4d889250..2683c5746db 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/fabric/SurfaceHandlerBinding.java +++ b/ReactAndroid/src/main/java/com/facebook/react/fabric/SurfaceHandlerBinding.java @@ -10,9 +10,12 @@ package com.facebook.react.fabric; import static com.facebook.react.fabric.mounting.LayoutMetricsConversions.getMaxSize; import static com.facebook.react.fabric.mounting.LayoutMetricsConversions.getMinSize; +import androidx.annotation.IntDef; import com.facebook.jni.HybridData; import com.facebook.proguard.annotations.DoNotStrip; import com.facebook.react.bridge.NativeMap; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; public class SurfaceHandlerBinding implements SurfaceHandler { static { @@ -21,6 +24,15 @@ public class SurfaceHandlerBinding implements SurfaceHandler { private static final int NO_SURFACE_ID = 0; + /* Keep in sync with SurfaceHandler.cpp */ + public static final int DISPLAY_MODE_VISIBLE = 0; + public static final int DISPLAY_MODE_SUSPENDED = 1; + public static final int DISPLAY_MODE_HIDDEN = 2; + + @Retention(RetentionPolicy.SOURCE) + @IntDef({DISPLAY_MODE_VISIBLE, DISPLAY_MODE_SUSPENDED, DISPLAY_MODE_HIDDEN}) + public @interface DisplayModeTypeDef {} + @DoNotStrip private final HybridData mHybridData; private static native HybridData initHybrid(int surfaceId, String moduleName); @@ -109,4 +121,11 @@ public class SurfaceHandlerBinding implements SurfaceHandler { } private native void setPropsNative(NativeMap props); + + @Override + public void setMountable(boolean mountable) { + setDisplayModeNative(mountable ? DISPLAY_MODE_VISIBLE : DISPLAY_MODE_SUSPENDED); + } + + private native void setDisplayModeNative(@DisplayModeTypeDef int mode); } diff --git a/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/SurfaceHandlerBinding.cpp b/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/SurfaceHandlerBinding.cpp index c8f9e31a65f..d4e49322f66 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/SurfaceHandlerBinding.cpp +++ b/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/SurfaceHandlerBinding.cpp @@ -16,6 +16,11 @@ SurfaceHandlerBinding::SurfaceHandlerBinding( std::string const &moduleName) : surfaceHandler_(moduleName, surfaceId) {} +void SurfaceHandlerBinding::setDisplayMode(jint mode) { + surfaceHandler_.setDisplayMode( + static_cast(mode)); +} + void SurfaceHandlerBinding::start() { std::unique_lock lock(lifecycleMutex_); @@ -116,6 +121,8 @@ void SurfaceHandlerBinding::registerNatives() { "setLayoutConstraintsNative", SurfaceHandlerBinding::setLayoutConstraints), makeNativeMethod("setPropsNative", SurfaceHandlerBinding::setProps), + makeNativeMethod( + "setDisplayModeNative", SurfaceHandlerBinding::setDisplayMode), }); } diff --git a/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/SurfaceHandlerBinding.h b/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/SurfaceHandlerBinding.h index 514fc11f529..24f41c950df 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/SurfaceHandlerBinding.h +++ b/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/SurfaceHandlerBinding.h @@ -26,6 +26,8 @@ class SurfaceHandlerBinding : public jni::HybridClass { void start(); void stop(); + void setDisplayMode(jint mode); + void registerScheduler(std::shared_ptr scheduler); void unregisterScheduler(std::shared_ptr scheduler);