From d7447fadeb1fb93d2c83a41e81d8db0021e09594 Mon Sep 17 00:00:00 2001 From: Joshua Gross Date: Wed, 8 May 2019 14:50:36 -0700 Subject: [PATCH] Core React/Litho support and Java codegen Summary: Core React/Litho support and Java codegen. View updating still in progress. Generated ViewManager code: ``` // Copyright 2004-present Facebook. All Rights Reserved. // // Autogenerated by ComponentsReactNativeSupportProcessor package com.facebook.catalyst.samples.componentsembedding; import com.facebook.litho.Component; import com.facebook.litho.ComponentContext; import com.facebook.litho.reactnative.ComponentsShadowNode; import com.facebook.litho.reactnative.ComponentsViewManager; import com.facebook.litho.reactnative.ReactLithoView; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.module.annotations.ReactModule; import com.facebook.react.uimanager.ReactStylesDiffMap; import com.facebook.react.uimanager.StateWrapper; import com.facebook.react.uimanager.ThemedReactContext; import java.util.HashMap; import java.util.Map; ReactModule( name = "SampleComponent" ) public class GeneratedSampleComponentViewManager extends ComponentsViewManager { Override public String getName() { return "SampleComponent"; } Override public ReactLithoView createViewInstanceWithProps(ThemedReactContext context, ReactStylesDiffMap props) { Map propsMap; if (props != null && props.toMap() != null) { propsMap = props.toMap(); } else { // Non-Fabric will always follow this path, initial props are never provided; return ReactLithoView.create(context, null, null); } Component component = createComponentInstanceWithPropsMap(new ComponentContext(context), propsMap); return ReactLithoView.create(context, component, propsMap); } Override public Component createComponentInstanceWithPropsMap(ComponentContext context, Map propsMap) { SampleComponent.Builder componentBuilder = SampleComponent.create(context); setComponentBuilderPropsWithMap(componentBuilder, propsMap); return componentBuilder.build(); } Override public void updateProperties(ReactLithoView view, ReactStylesDiffMap props) { super.updateProperties(view, props); Map propsMap = props.toMap(); Map oldProps = view.getProps(); if (oldProps == null) { // Non-Fabric RN will always terminate here; we do not store props, nor do we need to.; // Prop updating happens incrementally in non-Fabric RN.; return; } Map mergedProps = new HashMap<>(oldProps); mergedProps.putAll(propsMap); SampleComponent.Builder componentBuilder = SampleComponent.create(new ComponentContext(view.getComponentContext())); setComponentBuilderPropsWithMap(componentBuilder, mergedProps); view.setProps(mergedProps); view.setComponent(componentBuilder.build()); } private void setComponentBuilderPropsWithMap(SampleComponent.Builder componentBuilder, Map propsMap) { if (propsMap != null && propsMap.containsKey("title")) { componentBuilder.title((((String)propsMap.getOrDefault("title", null)))); } if (propsMap != null && propsMap.containsKey("imageUri")) { componentBuilder.imageUri(android.net.Uri.parse(((String)propsMap.getOrDefault("imageUri", null)))); } } Override public GeneratedSampleComponentShadowNode createShadowNodeInstance(ReactApplicationContext context) { return new GeneratedSampleComponentShadowNode(); } Override public Class getShadowNodeClass() { return GeneratedSampleComponentShadowNode.class; } Override public void updateState(ReactLithoView view, StateWrapper stateWrapper) { view.setStateWrapper(stateWrapper); } } ``` Reviewed By: shergin Differential Revision: D14846423 fbshipit-source-id: 4eeeb991f7e32c0cec5e9307d6175b81c8fd034e --- .../com/facebook/react/uimanager/ReactStylesDiffMap.java | 6 ++++++ .../java/com/facebook/react/uimanager/ViewManager.java | 9 ++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/ReactAndroid/src/main/java/com/facebook/react/uimanager/ReactStylesDiffMap.java b/ReactAndroid/src/main/java/com/facebook/react/uimanager/ReactStylesDiffMap.java index 733545bcf..3f7697477 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/uimanager/ReactStylesDiffMap.java +++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/ReactStylesDiffMap.java @@ -7,6 +7,8 @@ package com.facebook.react.uimanager; +import java.util.HashMap; +import java.util.Map; import javax.annotation.Nullable; import android.view.View; @@ -41,6 +43,10 @@ public class ReactStylesDiffMap { mBackingMap = props; } + public Map toMap () { + return mBackingMap.toHashMap(); + } + public boolean hasKey(String name) { return mBackingMap.hasKey(name); } diff --git a/ReactAndroid/src/main/java/com/facebook/react/uimanager/ViewManager.java b/ReactAndroid/src/main/java/com/facebook/react/uimanager/ViewManager.java index eecb4a4de..74dd612e5 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/uimanager/ViewManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/ViewManager.java @@ -35,7 +35,14 @@ import javax.annotation.Nullable; public abstract class ViewManager extends BaseJavaModule { - public final void updateProperties(@Nonnull T viewToUpdate, ReactStylesDiffMap props) { + /** + * For the vast majority of ViewManagers, you will not need to override this. Only + * override this if you really know what you're doing and have a very unique use-case. + * + * @param viewToUpdate + * @param props + */ + public void updateProperties(@Nonnull T viewToUpdate, ReactStylesDiffMap props) { ViewManagerPropertyUpdater.updateProps(this, viewToUpdate, props); onAfterUpdateTransaction(viewToUpdate); }