Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 0 additions & 9 deletions packages/react-native/ReactAndroid/api/ReactAndroid.api
Original file line number Diff line number Diff line change
Expand Up @@ -2233,15 +2233,6 @@ public abstract interface class com/facebook/react/devsupport/interfaces/StackFr
public abstract fun toJSON ()Lorg/json/JSONObject;
}

public final class com/facebook/react/devsupport/interfaces/TracingState : java/lang/Enum {
public static final field DISABLED Lcom/facebook/react/devsupport/interfaces/TracingState;
public static final field ENABLEDINBACKGROUNDMODE Lcom/facebook/react/devsupport/interfaces/TracingState;
public static final field ENABLEDINCDPMODE Lcom/facebook/react/devsupport/interfaces/TracingState;
public static fun getEntries ()Lkotlin/enums/EnumEntries;
public static fun valueOf (Ljava/lang/String;)Lcom/facebook/react/devsupport/interfaces/TracingState;
public static fun values ()[Lcom/facebook/react/devsupport/interfaces/TracingState;
}

public final class com/facebook/react/fabric/ComponentFactory {
public fun <init> ()V
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,12 @@ package com.facebook.react.devsupport
import android.content.Context
import com.facebook.react.bridge.UiThreadUtil
import com.facebook.react.common.SurfaceDelegateFactory
import com.facebook.react.devsupport.inspector.TracingState
import com.facebook.react.devsupport.interfaces.DevBundleDownloadListener
import com.facebook.react.devsupport.interfaces.DevLoadingViewManager
import com.facebook.react.devsupport.interfaces.DevSupportManager
import com.facebook.react.devsupport.interfaces.PausedInDebuggerOverlayManager
import com.facebook.react.devsupport.interfaces.RedBoxHandler
import com.facebook.react.devsupport.interfaces.TracingState
import com.facebook.react.packagerconnection.RequestHandler

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,8 @@ import com.facebook.react.devsupport.DevServerHelper.PackagerCommandListener
import com.facebook.react.devsupport.InspectorFlags.getFuseboxEnabled
import com.facebook.react.devsupport.StackTraceHelper.convertJavaStackTrace
import com.facebook.react.devsupport.StackTraceHelper.convertJsStackTrace
import com.facebook.react.devsupport.inspector.TracingState
import com.facebook.react.devsupport.inspector.TracingStateProvider
import com.facebook.react.devsupport.interfaces.BundleLoadCallback
import com.facebook.react.devsupport.interfaces.DebuggerFrontendPanelName
import com.facebook.react.devsupport.interfaces.DevBundleDownloadListener
Expand All @@ -66,8 +68,6 @@ import com.facebook.react.devsupport.interfaces.PackagerStatusCallback
import com.facebook.react.devsupport.interfaces.PausedInDebuggerOverlayManager
import com.facebook.react.devsupport.interfaces.RedBoxHandler
import com.facebook.react.devsupport.interfaces.StackFrame
import com.facebook.react.devsupport.interfaces.TracingState
import com.facebook.react.devsupport.interfaces.TracingStateProvider
import com.facebook.react.devsupport.perfmonitor.PerfMonitorDevHelper
import com.facebook.react.devsupport.perfmonitor.PerfMonitorOverlayManager
import com.facebook.react.internal.featureflags.ReactNativeFeatureFlags
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,12 @@
* LICENSE file in the root directory of this source tree.
*/

package com.facebook.react.devsupport.interfaces
package com.facebook.react.devsupport.inspector

import com.facebook.proguard.annotations.DoNotStripAny

// Keep in sync with `TracingState.h`
// JNI wrapper for `jsinspector_modern::Tracing::TracingState`.
@DoNotStripAny
public enum class TracingState {
internal enum class TracingState {
DISABLED, // There is no active trace
ENABLEDINBACKGROUNDMODE, // Trace is currently running in background mode
ENABLEDINCDPMODE, // Trace is currently running in CDP mode
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
/*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/

package com.facebook.react.devsupport.inspector

import com.facebook.proguard.annotations.DoNotStripAny

@DoNotStripAny
internal fun interface TracingStateListener {
public fun onStateChanged(state: TracingState, screenshotsEnabled: Boolean)
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
* LICENSE file in the root directory of this source tree.
*/

package com.facebook.react.devsupport.interfaces
package com.facebook.react.devsupport.inspector

internal interface TracingStateProvider {
fun getTracingState(): TracingState
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

package com.facebook.react.devsupport.perfmonitor

import com.facebook.react.devsupport.interfaces.TracingState
import com.facebook.react.devsupport.inspector.TracingState

/**
* [Experimental] Interface implemented by [com.facebook.react.runtime.ReactHostInspectorTarget]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ package com.facebook.react.devsupport.perfmonitor
import android.os.Handler
import android.os.Looper
import com.facebook.react.bridge.UiThreadUtil
import com.facebook.react.devsupport.interfaces.TracingState
import com.facebook.react.devsupport.inspector.TracingState

internal class PerfMonitorOverlayManager(
private val devHelper: PerfMonitorDevHelper,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ import android.widget.TextView
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import com.facebook.react.R
import com.facebook.react.devsupport.interfaces.TracingState
import com.facebook.react.devsupport.inspector.TracingState
import com.facebook.react.uimanager.DisplayMetricsHolder
import com.facebook.react.uimanager.PixelUtil

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

package com.facebook.react.devsupport.perfmonitor

import com.facebook.react.devsupport.interfaces.TracingState
import com.facebook.react.devsupport.inspector.TracingState

/** [Experimental] An interface for subscribing to updates for the V2 Perf Monitor. */
internal interface PerfMonitorUpdateListener {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@ import com.facebook.react.bridge.ReactContext
import com.facebook.react.common.annotations.FrameworkAPI
import com.facebook.react.common.annotations.UnstableReactNativeAPI
import com.facebook.react.devsupport.ReactInstanceDevHelper
import com.facebook.react.devsupport.interfaces.TracingState
import com.facebook.react.devsupport.interfaces.TracingStateProvider
import com.facebook.react.devsupport.inspector.TracingState
import com.facebook.react.devsupport.inspector.TracingStateProvider
import com.facebook.react.devsupport.perfmonitor.PerfMonitorDevHelper
import com.facebook.react.devsupport.perfmonitor.PerfMonitorInspectorTarget
import com.facebook.react.interfaces.TaskInterface
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@ import com.facebook.proguard.annotations.DoNotStripAny
import com.facebook.react.bridge.UiThreadUtil
import com.facebook.react.common.annotations.FrameworkAPI
import com.facebook.react.common.annotations.UnstableReactNativeAPI
import com.facebook.react.devsupport.interfaces.TracingState
import com.facebook.react.devsupport.inspector.TracingState
import com.facebook.react.devsupport.inspector.TracingStateListener
import com.facebook.react.devsupport.perfmonitor.PerfMonitorInspectorTarget
import com.facebook.react.devsupport.perfmonitor.PerfMonitorUpdateListener
import com.facebook.soloader.SoLoader
Expand Down Expand Up @@ -41,11 +42,11 @@ internal class ReactHostInspectorTarget(reactHostImpl: ReactHostImpl) :

external fun stopAndDiscardBackgroundTrace()

external fun tracingStateAsInt(): Int
external override fun getTracingState(): TracingState

override fun getTracingState(): TracingState {
return TracingState.entries[tracingStateAsInt()]
}
external fun registerTracingStateListener(listener: TracingStateListener): Long

external fun unregisterTracingStateListener(subscriptionId: Long)

override fun addPerfMonitorListener(listener: PerfMonitorUpdateListener) {
perfMonitorListeners.add(listener)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,36 @@ using namespace facebook::jni;
using namespace facebook::react::jsinspector_modern;

namespace facebook::react {

namespace {
jni::local_ref<JTracingState::javaobject> convertCPPTracingStateToJava(
TracingState tracingState) {
auto tracingStateClass = jni::findClassLocal(
"com/facebook/react/devsupport/inspector/TracingState");
auto valueOfMethod =
tracingStateClass->getStaticMethod<JTracingState(jstring)>("valueOf");

switch (tracingState) {
case TracingState::Disabled:
return valueOfMethod(
tracingStateClass, jni::make_jstring("DISABLED").get());

case TracingState::EnabledInBackgroundMode:
return valueOfMethod(
tracingStateClass,
jni::make_jstring("ENABLEDINBACKGROUNDMODE").get());

case TracingState::EnabledInCDPMode:
return valueOfMethod(
tracingStateClass, jni::make_jstring("ENABLEDINCDPMODE").get());

default:
jni::throwNewJavaException(
"java/lang/IllegalStateException", "Unexpected new TracingState.");
}
}
} // namespace

JReactHostInspectorTarget::JReactHostInspectorTarget(
alias_ref<JReactHostInspectorTarget::javaobject> jobj,
alias_ref<JReactHostImpl> reactHostImpl,
Expand All @@ -29,7 +59,8 @@ JReactHostInspectorTarget::JReactHostInspectorTarget(
std::function<void()>&& callback) mutable {
auto jrunnable = JNativeRunnable::newObjectCxxArgs(std::move(callback));
javaExecutor->execute(jrunnable);
}) {
}),
tracingDelegate_(std::make_unique<TracingDelegate>()) {
auto& inspectorFlags = InspectorFlags::getInstance();
if (inspectorFlags.getFuseboxEnabled()) {
inspectorTarget_ = HostTarget::create(*this, inspectorExecutor_);
Expand Down Expand Up @@ -215,13 +246,127 @@ void JReactHostInspectorTarget::registerNatives() {
"stopAndDiscardBackgroundTrace",
JReactHostInspectorTarget::stopAndDiscardBackgroundTrace),
makeNativeMethod(
"tracingStateAsInt", JReactHostInspectorTarget::tracingState),
"getTracingState", JReactHostInspectorTarget::getTracingState),
makeNativeMethod(
"registerTracingStateListener",
JReactHostInspectorTarget::registerTracingStateListener),
makeNativeMethod(
"unregisterTracingStateListener",
JReactHostInspectorTarget::unregisterTracingStateListener),
});
}

jint JReactHostInspectorTarget::tracingState() {
auto state = inspectorTarget_->tracingState();
return static_cast<jint>(state);
jni::local_ref<JTracingState::javaobject>
JReactHostInspectorTarget::getTracingState() {
return convertCPPTracingStateToJava(tracingDelegate_->getTracingState());
}

jlong JReactHostInspectorTarget::registerTracingStateListener(
jni::alias_ref<JTracingStateListener::javaobject> listener) {
auto cppListener = [globalRef = make_global(listener)](
TracingState state, bool screenshotsEnabled) {
static auto method =
globalRef->getClass()
->getMethod<void(
jni::local_ref<JTracingState::javaobject>, jboolean)>(
"onStateChanged");

method(
globalRef,
convertCPPTracingStateToJava(state),
static_cast<jboolean>(screenshotsEnabled));
};

return static_cast<jlong>(
tracingDelegate_->registerTracingStateListener(std::move(cppListener)));
}

void JReactHostInspectorTarget::unregisterTracingStateListener(
jlong subscriptionId) {
tracingDelegate_->unregisterTracingStateListener(subscriptionId);
}

HostTargetTracingDelegate* JReactHostInspectorTarget::getTracingDelegate() {
return tracingDelegate_.get();
}

void TracingDelegate::onTracingStarted(
tracing::Mode tracingMode,
bool screenshotsCategoryEnabled) {
TracingState nextState = TracingState::Disabled;
switch (tracingMode) {
case tracing::Mode::CDP:
nextState = TracingState::EnabledInCDPMode;
break;
case tracing::Mode::Background:
nextState = TracingState::EnabledInBackgroundMode;
break;
default:
throw std::logic_error("Unexpected new Tracing Mode");
}

std::vector<TracingStateListener> listeners;
{
std::lock_guard<std::mutex> lock(mutex_);

tracingState_ = nextState;
listeners = copySubscribedListeners();
}

notifyListeners(listeners, nextState, screenshotsCategoryEnabled);
}

void TracingDelegate::onTracingStopped() {
std::vector<TracingStateListener> listeners;
{
std::lock_guard<std::mutex> lock(mutex_);

tracingState_ = TracingState::Disabled;
listeners = copySubscribedListeners();
}

notifyListeners(listeners, TracingState::Disabled, false);
}

TracingState TracingDelegate::getTracingState() {
std::lock_guard<std::mutex> lock(mutex_);

return tracingState_;
}

size_t TracingDelegate::registerTracingStateListener(
TracingStateListener listener) {
std::lock_guard<std::mutex> lock(mutex_);

auto id = nextSubscriptionId_++;
subscriptions_[id] = std::move(listener);
return id;
}

void TracingDelegate::unregisterTracingStateListener(size_t subscriptionId) {
std::lock_guard<std::mutex> lock(mutex_);

subscriptions_.erase(subscriptionId);
}

std::vector<TracingStateListener> TracingDelegate::copySubscribedListeners() {
std::vector<TracingStateListener> listeners;
listeners.reserve(subscriptions_.size());

for (auto& [_, listener] : subscriptions_) {
listeners.push_back(listener);
}

return listeners;
}

void TracingDelegate::notifyListeners(
const std::vector<TracingStateListener>& listeners,
TracingState state,
bool screenshotsCategoryEnabled) {
for (const auto& listener : listeners) {
listener(state, screenshotsCategoryEnabled);
}
}

} // namespace facebook::react
Loading
Loading