From 65df2f30a5f20d2b1dbdc9b8cb7797c41b7f491e Mon Sep 17 00:00:00 2001 From: Andrei Shikov Date: Wed, 2 Feb 2022 09:16:25 -0800 Subject: [PATCH] Support view allocation counters with Venice Summary: Venice uses `SurfaceHandler` abstraction which start/stops surfaces independently from `Binding.cpp`, so previous `onSurfaceStart/Stop` callback would not be triggered. On Android, each surface is used exactly once at the time of writing, so we can use `register/unregister` callbacks to create/clear remembered views for the surface. Changelog: [Internal] Reviewed By: sammy-SC Differential Revision: D33845685 fbshipit-source-id: 8de4204c7498176fdbe8d44fbc5f2e4079212a1c --- .../com/facebook/react/fabric/jni/Binding.cpp | 28 +++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/Binding.cpp b/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/Binding.cpp index d22dfb384e2..26eacc5cae0 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/Binding.cpp +++ b/ReactAndroid/src/main/java/com/facebook/react/fabric/jni/Binding.cpp @@ -266,13 +266,37 @@ void Binding::stopSurface(jint surfaceId) { } void Binding::registerSurface(SurfaceHandlerBinding *surfaceHandlerBinding) { + auto const &surfaceHandler = surfaceHandlerBinding->getSurfaceHandler(); auto scheduler = getScheduler(); - scheduler->registerSurface(surfaceHandlerBinding->getSurfaceHandler()); + if (!scheduler) { + LOG(ERROR) << "Binding::registerSurface: scheduler disappeared"; + return; + } + scheduler->registerSurface(surfaceHandler); + + auto mountingManager = + verifyMountingManager("FabricUIManagerBinding::registerSurface"); + if (!mountingManager) { + return; + } + mountingManager->onSurfaceStart(surfaceHandler.getSurfaceId()); } void Binding::unregisterSurface(SurfaceHandlerBinding *surfaceHandlerBinding) { + auto const &surfaceHandler = surfaceHandlerBinding->getSurfaceHandler(); auto scheduler = getScheduler(); - scheduler->unregisterSurface(surfaceHandlerBinding->getSurfaceHandler()); + if (!scheduler) { + LOG(ERROR) << "Binding::unregisterSurface: scheduler disappeared"; + return; + } + scheduler->unregisterSurface(surfaceHandler); + + auto mountingManager = + verifyMountingManager("FabricUIManagerBinding::unregisterSurface"); + if (!mountingManager) { + return; + } + mountingManager->onSurfaceStop(surfaceHandler.getSurfaceId()); } void Binding::setConstraints(