From 09bfb68a39aacc27ee8a54d70a17c8e69c5e44f3 Mon Sep 17 00:00:00 2001 From: Alex Hunt Date: Wed, 3 Jul 2024 11:12:31 -0700 Subject: [PATCH] Add appDisplayName to inspector host metadata (#45250) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/45250 Adds and implements a new `appDisplayName` field as part of `HostTargetMetadata` and the `ReactNativeApplication.metadataUpdated` CDP event. This will be used to display the app display name in the debugger frontend. Changelog: [Internal] Reviewed By: robhogan Differential Revision: D59273360 fbshipit-source-id: d770cccadb520b9c13c7288cd690df21683d2cc1 --- packages/react-native/React/Base/RCTBridge.mm | 1 + .../React/DevSupport/RCTInspectorUtils.h | 1 + .../React/DevSupport/RCTInspectorUtils.mm | 1 + .../systeminfo/AndroidInfoHelpers.java | 19 ++++++++++++++++++- .../ReactInstanceManagerInspectorTarget.cpp | 1 + .../runtime/jni/JReactHostInspectorTarget.cpp | 1 + .../jsinspector-modern/HostTarget.cpp | 3 +++ .../jsinspector-modern/HostTarget.h | 1 + .../platform/ios/ReactCommon/RCTHost.mm | 1 + 9 files changed, 28 insertions(+), 1 deletion(-) diff --git a/packages/react-native/React/Base/RCTBridge.mm b/packages/react-native/React/Base/RCTBridge.mm index 077a4b103ab..8183fbb9d55 100644 --- a/packages/react-native/React/Base/RCTBridge.mm +++ b/packages/react-native/React/Base/RCTBridge.mm @@ -191,6 +191,7 @@ class RCTBridgeHostTargetDelegate : public facebook::react::jsinspector_modern:: auto metadata = [RCTInspectorUtils getHostMetadata]; return { + .appDisplayName = [metadata.appDisplayName UTF8String], .appIdentifier = [metadata.appIdentifier UTF8String], .deviceName = [metadata.deviceName UTF8String], .integrationName = "iOS Bridge (RCTBridge)", diff --git a/packages/react-native/React/DevSupport/RCTInspectorUtils.h b/packages/react-native/React/DevSupport/RCTInspectorUtils.h index ce8bb9507c4..b1a977aef82 100644 --- a/packages/react-native/React/DevSupport/RCTInspectorUtils.h +++ b/packages/react-native/React/DevSupport/RCTInspectorUtils.h @@ -11,6 +11,7 @@ // containing the nonnull members implemented by getHostMetadata. @interface CommonHostMetadata : NSObject +@property (nonatomic, strong) NSString *appDisplayName; @property (nonatomic, strong) NSString *appIdentifier; @property (nonatomic, strong) NSString *deviceName; @property (nonatomic, strong) NSString *platform; diff --git a/packages/react-native/React/DevSupport/RCTInspectorUtils.mm b/packages/react-native/React/DevSupport/RCTInspectorUtils.mm index 6b0611dea53..77cf722b378 100644 --- a/packages/react-native/React/DevSupport/RCTInspectorUtils.mm +++ b/packages/react-native/React/DevSupport/RCTInspectorUtils.mm @@ -23,6 +23,7 @@ CommonHostMetadata *metadata = [[CommonHostMetadata alloc] init]; + metadata.appDisplayName = [[[NSBundle mainBundle] infoDictionary] objectForKey:(NSString *)kCFBundleNameKey]; metadata.appIdentifier = [[NSBundle mainBundle] bundleIdentifier]; metadata.platform = RCTPlatformName; metadata.deviceName = [device name]; diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/systeminfo/AndroidInfoHelpers.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/systeminfo/AndroidInfoHelpers.java index 76c40110840..68225d58a97 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/systeminfo/AndroidInfoHelpers.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/systeminfo/AndroidInfoHelpers.java @@ -8,6 +8,7 @@ package com.facebook.react.modules.systeminfo; import android.content.Context; +import android.content.pm.ApplicationInfo; import android.content.res.Resources; import android.os.Build; import com.facebook.common.logging.FLog; @@ -72,9 +73,25 @@ public class AndroidInfoHelpers { * jsinspector_modern::HostTargetMetadata}. */ public static Map getInspectorHostMetadata(@Nullable Context applicationContext) { + String appIdentifier = null; + String appDisplayName = null; + + if (applicationContext != null) { + ApplicationInfo applicationInfo = applicationContext.getApplicationInfo(); + int labelResourceId = applicationInfo.labelRes; + + appIdentifier = applicationContext.getPackageName(); + appDisplayName = + labelResourceId == 0 + ? applicationInfo.nonLocalizedLabel.toString() + : applicationContext.getString(labelResourceId); + } + return MapBuilder.of( + "appDisplayName", + appDisplayName, "appIdentifier", - applicationContext != null ? applicationContext.getPackageName() : null, + appIdentifier, "platform", "android", "deviceName", diff --git a/packages/react-native/ReactAndroid/src/main/jni/react/jni/ReactInstanceManagerInspectorTarget.cpp b/packages/react-native/ReactAndroid/src/main/jni/react/jni/ReactInstanceManagerInspectorTarget.cpp index a5e4a09766e..797ccc721d6 100644 --- a/packages/react-native/ReactAndroid/src/main/jni/react/jni/ReactInstanceManagerInspectorTarget.cpp +++ b/packages/react-native/ReactAndroid/src/main/jni/react/jni/ReactInstanceManagerInspectorTarget.cpp @@ -125,6 +125,7 @@ ReactInstanceManagerInspectorTarget::getMetadata() { }; return { + .appDisplayName = getStringOptional("appDisplayName"), .appIdentifier = getStringOptional("appIdentifier"), .deviceName = getStringOptional("deviceName"), .integrationName = "Android Bridge (ReactInstanceManagerInspectorTarget)", 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 2ad9e1042b7..c48165866dc 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 @@ -103,6 +103,7 @@ JReactHostInspectorTarget::getMetadata() { : std::nullopt; }; + metadata.appDisplayName = getStringOptional("appDisplayName"); metadata.appIdentifier = getStringOptional("appIdentifier"); metadata.deviceName = getStringOptional("deviceName"); metadata.platform = getStringOptional("platform"); diff --git a/packages/react-native/ReactCommon/jsinspector-modern/HostTarget.cpp b/packages/react-native/ReactCommon/jsinspector-modern/HostTarget.cpp index 6c74a7dd9c3..a29de13480e 100644 --- a/packages/react-native/ReactCommon/jsinspector-modern/HostTarget.cpp +++ b/packages/react-native/ReactCommon/jsinspector-modern/HostTarget.cpp @@ -223,6 +223,9 @@ bool HostTargetController::decrementPauseOverlayCounter() { folly::dynamic hostMetadataToDynamic(const HostTargetMetadata& metadata) { folly::dynamic result = folly::dynamic::object; + if (metadata.appDisplayName) { + result["appDisplayName"] = metadata.appDisplayName.value(); + } if (metadata.appIdentifier) { result["appIdentifier"] = metadata.appIdentifier.value(); } diff --git a/packages/react-native/ReactCommon/jsinspector-modern/HostTarget.h b/packages/react-native/ReactCommon/jsinspector-modern/HostTarget.h index 6a56ea24079..880b3df759b 100644 --- a/packages/react-native/ReactCommon/jsinspector-modern/HostTarget.h +++ b/packages/react-native/ReactCommon/jsinspector-modern/HostTarget.h @@ -37,6 +37,7 @@ class HostCommandSender; class HostTarget; struct HostTargetMetadata { + std::optional appDisplayName; std::optional appIdentifier; std::optional deviceName; std::optional integrationName; diff --git a/packages/react-native/ReactCommon/react/runtime/platform/ios/ReactCommon/RCTHost.mm b/packages/react-native/ReactCommon/react/runtime/platform/ios/ReactCommon/RCTHost.mm index f575d037aad..9fdac6566a5 100644 --- a/packages/react-native/ReactCommon/react/runtime/platform/ios/ReactCommon/RCTHost.mm +++ b/packages/react-native/ReactCommon/react/runtime/platform/ios/ReactCommon/RCTHost.mm @@ -46,6 +46,7 @@ class RCTHostHostTargetDelegate : public facebook::react::jsinspector_modern::Ho auto metadata = [RCTInspectorUtils getHostMetadata]; return { + .appDisplayName = [metadata.appDisplayName UTF8String], .appIdentifier = [metadata.appIdentifier UTF8String], .deviceName = [metadata.deviceName UTF8String], .integrationName = "iOS Bridgeless (RCTHost)",