Support View Manager Commands

Summary: Supporting View Manager Commands on the new UIManager in Fabric. This is needed for things like scrollTo on ScrollView.

Reviewed By: JoshuaGross

Differential Revision: D16175575

fbshipit-source-id: a74effdf7e47b56a150a4e3fb6c4d787659e0250
This commit is contained in:
Eli White
2019-07-19 11:54:44 -07:00
committed by Facebook Github Bot
parent 5ca10c7caa
commit 6f09dc03bf
17 changed files with 173 additions and 6 deletions
@@ -248,6 +248,11 @@ inline local_ref<ReadableMap::javaobject> castReadableMap(
return make_local(reinterpret_cast<ReadableMap::javaobject>(nativeMap.get()));
}
inline local_ref<ReadableArray::javaobject> castReadableArray(
local_ref<ReadableNativeArray::javaobject> nativeArray) {
return make_local(reinterpret_cast<ReadableArray::javaobject>(nativeArray.get()));
}
// TODO: this method will be removed when binding for components are code-gen
local_ref<JString> getPlatformComponentName(const ShadowView &shadowView) {
local_ref<JString> componentName;
@@ -672,6 +677,31 @@ void Binding::schedulerDidRequestPreliminaryViewAllocation(
isLayoutableShadowNode);
}
void Binding::schedulerDidDispatchCommand(
const ShadowView &shadowView,
std::string const &commandName,
folly::dynamic const args) {
jni::global_ref<jobject> localJavaUIManager = getJavaUIManager();
if (!localJavaUIManager) {
LOG(ERROR) << "Binding::schedulerDidDispatchCommand: JavaUIManager disappeared";
return;
}
static auto dispatchCommand =
jni::findClassStatic(UIManagerJavaDescriptor)
->getMethod<void(
jint, jstring, ReadableArray::javaobject)>(
"dispatchCommand");
local_ref<JString> command = make_jstring(commandName);
local_ref<ReadableArray::javaobject> argsArray = castReadableArray(
ReadableNativeArray::newObjectCxxArgs(args));
dispatchCommand(localJavaUIManager, shadowView.tag, command.get(), argsArray.get());
}
void Binding::registerNatives() {
registerHybrid(
{makeNativeMethod("initHybrid", Binding::initHybrid),
@@ -82,6 +82,11 @@ class Binding : public jni::HybridClass<Binding>, public SchedulerDelegate {
const SurfaceId surfaceId,
const ShadowView &shadowView);
void schedulerDidDispatchCommand(
const ShadowView &shadowView,
std::string const &commandName,
folly::dynamic const args);
void setPixelDensity(float pointScaleFactor);
void uninstallFabricUIManager();