diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/runtime/ReactHostImpl.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/runtime/ReactHostImpl.java index 2f580dafa99..da07ff09f44 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/runtime/ReactHostImpl.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/runtime/ReactHostImpl.java @@ -61,6 +61,7 @@ import com.facebook.react.internal.featureflags.ReactNativeFeatureFlags; import com.facebook.react.modules.appearance.AppearanceModule; import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler; import com.facebook.react.modules.core.DeviceEventManagerModule; +import com.facebook.react.modules.systeminfo.AndroidInfoHelpers; import com.facebook.react.runtime.internal.bolts.Task; import com.facebook.react.runtime.internal.bolts.TaskCompletionSource; import com.facebook.react.turbomodule.core.interfaces.CallInvokerHolder; @@ -73,6 +74,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Set; import java.util.concurrent.Executor; import java.util.concurrent.Executors; @@ -90,6 +92,7 @@ import kotlin.jvm.functions.Function0; * * @see Bolts Android */ +@DoNotStrip @ThreadSafe @Nullsafe(Nullsafe.Mode.LOCAL) public class ReactHostImpl implements ReactHost { @@ -498,6 +501,11 @@ public class ReactHostImpl implements ReactHost { } } + @DoNotStrip + private Map getHostMetadata() { + return AndroidInfoHelpers.getInspectorHostMetadata(mContext); + } + /** * Entrypoint to destroy the ReactInstance. If the ReactInstance is reloading, will wait until * reload is finished, before destroying. diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/runtime/jni/JReactHostInspectorTarget.cpp b/packages/react-native/ReactAndroid/src/main/jni/react/runtime/jni/JReactHostInspectorTarget.cpp index c1335b40a61..2ad9e1042b7 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/react/runtime/jni/JReactHostInspectorTarget.cpp +++ b/packages/react-native/ReactAndroid/src/main/jni/react/runtime/jni/JReactHostInspectorTarget.cpp @@ -88,9 +88,28 @@ void JReactHostInspectorTarget::registerNatives() { jsinspector_modern::HostTargetMetadata JReactHostInspectorTarget::getMetadata() { - return { + jsinspector_modern::HostTargetMetadata metadata = { .integrationName = "Android Bridgeless (ReactHostImpl)", }; + + if (auto javaReactHostImplStrong = javaReactHostImpl_->get()) { + auto javaMetadata = javaReactHostImplStrong->getHostMetadata(); + auto getMethod = jni::JMap::javaClassLocal() + ->getMethod("get"); + + auto getStringOptional = [&](const std::string& key) { + auto result = getMethod(javaMetadata, make_jstring(key).get()); + return result ? std::optional(result->toString()) + : std::nullopt; + }; + + metadata.appIdentifier = getStringOptional("appIdentifier"); + metadata.deviceName = getStringOptional("deviceName"); + metadata.platform = getStringOptional("platform"); + metadata.reactNativeVersion = getStringOptional("reactNativeVersion"); + } + + return metadata; } void JReactHostInspectorTarget::onReload(const PageReloadRequest& request) { diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/runtime/jni/JReactHostInspectorTarget.h b/packages/react-native/ReactAndroid/src/main/jni/react/runtime/jni/JReactHostInspectorTarget.h index b68ecd735ae..6aa4bbea829 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/react/runtime/jni/JReactHostInspectorTarget.h +++ b/packages/react-native/ReactAndroid/src/main/jni/react/runtime/jni/JReactHostInspectorTarget.h @@ -36,6 +36,14 @@ struct JReactHostImpl : public jni::JavaClass { "setPausedInDebuggerMessage"); method(self(), message ? jni::make_jstring(*message) : nullptr); } + + jni::local_ref> getHostMetadata() const { + static auto method = + javaClassStatic() + ->getMethod>()>( + "getHostMetadata"); + return method(self()); + } }; class JReactHostInspectorTarget