From 04a21b55f3e66815924d3894129728deba80a027 Mon Sep 17 00:00:00 2001 From: Alex Hunt Date: Tue, 2 Jul 2024 04:31:33 -0700 Subject: [PATCH] Implement new HostTargetMetadata fields (Android Bridgeless) Summary: Follows D58288489, D58415181. Implements the remaining `HostTargetMetadata` fields, sent by the debugger on `ReactNativeApplication.metadataUpdated`, on **Android Bridgeless**. This will be used to display details such as the app name and React Native version in the debugger frontend. Changelog: [Internal] Differential Revision: D59271755 --- .../facebook/react/runtime/ReactHostImpl.java | 7 ++++++ .../runtime/jni/JReactHostInspectorTarget.cpp | 24 ++++++++++++++++++- .../runtime/jni/JReactHostInspectorTarget.h | 8 +++++++ 3 files changed, 38 insertions(+), 1 deletion(-) 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 aed42958adc7e3..7e86e7e17cae9c 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.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.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; @@ -486,6 +488,11 @@ public void onResume() { } } + @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 c1335b40a61403..beff2692308e36 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,31 @@ 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 mapClass = findClassLocal("java/util/Map"); + auto getMethod = mapClass->getMethod("get"); + + auto appIdentifier = + getMethod(javaMetadata, make_jstring("appIdentifier").get()); + auto deviceName = getMethod(javaMetadata, make_jstring("deviceName").get()); + auto platform = getMethod(javaMetadata, make_jstring("platform").get()); + auto reactNativeVersion = + getMethod(javaMetadata, make_jstring("reactNativeVersion").get()); + + metadata.appIdentifier = + appIdentifier ? appIdentifier->toString() : nullptr; + metadata.deviceName = deviceName ? deviceName->toString() : nullptr; + metadata.platform = platform ? platform->toString() : nullptr; + metadata.reactNativeVersion = + reactNativeVersion ? reactNativeVersion->toString() : nullptr; + } + + 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 b68ecd735ae032..6aa4bbea829d53 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