From c65267ca6ffdf68e9846c0cf912d23162e671758 Mon Sep 17 00:00:00 2001 From: David Vacca Date: Tue, 15 Oct 2019 18:50:31 -0700 Subject: [PATCH] Allow update of state to receive null objects Summary: This diff changes updateState method to support null stateWrappers, before this method would crash with a NullPointerException, now it allows the null object to reach the view manager. Changelog: Add support for update of nullable localState in Fabric Reviewed By: JoshuaGross Differential Revision: D17939651 fbshipit-source-id: c62555905e39f9e0db75b9e1d1b93f33d0560266 --- .../java/com/facebook/react/fabric/FabricUIManager.java | 2 +- .../facebook/react/fabric/mounting/MountingManager.java | 7 ++++--- .../fabric/mounting/mountitems/UpdateStateMountItem.java | 5 +++-- .../java/com/facebook/react/uimanager/ViewManager.java | 2 +- .../facebook/react/views/modal/ReactModalHostManager.java | 4 ++-- .../facebook/react/views/text/ReactTextViewManager.java | 3 ++- 6 files changed, 13 insertions(+), 10 deletions(-) diff --git a/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricUIManager.java b/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricUIManager.java index 7760b23ab2c..d374e0f145f 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricUIManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricUIManager.java @@ -339,7 +339,7 @@ public class FabricUIManager implements UIManager, LifecycleEventListener { @DoNotStrip @SuppressWarnings("unused") - private MountItem updateStateMountItem(int reactTag, Object stateWrapper) { + private MountItem updateStateMountItem(int reactTag, @Nullable Object stateWrapper) { return new UpdateStateMountItem(reactTag, (StateWrapper) stateWrapper); } diff --git a/ReactAndroid/src/main/java/com/facebook/react/fabric/mounting/MountingManager.java b/ReactAndroid/src/main/java/com/facebook/react/fabric/mounting/MountingManager.java index 70d02274270..0d3da058d9a 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/fabric/mounting/MountingManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/fabric/mounting/MountingManager.java @@ -369,11 +369,12 @@ public class MountingManager { } @UiThread - public void updateState(final int reactTag, StateWrapper stateWrapper) { + public void updateState(final int reactTag, @Nullable StateWrapper stateWrapper) { UiThreadUtil.assertOnUiThread(); ViewState viewState = getViewState(reactTag); - ReadableNativeMap newState = stateWrapper.getState(); - if (viewState.mCurrentState != null && viewState.mCurrentState.equals(newState)) { + @Nullable ReadableNativeMap newState = stateWrapper == null ? null : stateWrapper.getState(); + if ((viewState.mCurrentState != null && viewState.mCurrentState.equals(newState)) + || (viewState.mCurrentState == null && stateWrapper == null)) { return; } viewState.mCurrentState = newState; diff --git a/ReactAndroid/src/main/java/com/facebook/react/fabric/mounting/mountitems/UpdateStateMountItem.java b/ReactAndroid/src/main/java/com/facebook/react/fabric/mounting/mountitems/UpdateStateMountItem.java index e1dee17a1db..e6ec6fa5633 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/fabric/mounting/mountitems/UpdateStateMountItem.java +++ b/ReactAndroid/src/main/java/com/facebook/react/fabric/mounting/mountitems/UpdateStateMountItem.java @@ -6,15 +6,16 @@ */ package com.facebook.react.fabric.mounting.mountitems; +import androidx.annotation.Nullable; import com.facebook.react.fabric.mounting.MountingManager; import com.facebook.react.uimanager.StateWrapper; public class UpdateStateMountItem implements MountItem { private final int mReactTag; - private final StateWrapper mStateWrapper; + @Nullable private final StateWrapper mStateWrapper; - public UpdateStateMountItem(int reactTag, StateWrapper stateWrapper) { + public UpdateStateMountItem(int reactTag, @Nullable StateWrapper stateWrapper) { mReactTag = reactTag; mStateWrapper = stateWrapper; } 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 542fa452f6f..41b3e114f08 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/uimanager/ViewManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/ViewManager.java @@ -282,7 +282,7 @@ public abstract class ViewManager * this component type. */ public @Nullable Object updateState( - @NonNull T view, ReactStylesDiffMap props, StateWrapper stateWrapper) { + @NonNull T view, ReactStylesDiffMap props, @Nullable StateWrapper stateWrapper) { return null; } diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/modal/ReactModalHostManager.java b/ReactAndroid/src/main/java/com/facebook/react/views/modal/ReactModalHostManager.java index fcc94f04098..2d2ee110d9b 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/modal/ReactModalHostManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/modal/ReactModalHostManager.java @@ -84,7 +84,6 @@ public class ReactModalHostManager extends ViewGroupManager view.setStatusBarTranslucent(statusBarTranslucent); } - @Override @ReactProp(name = "hardwareAccelerated") public void setHardwareAccelerated(ReactModalHostView view, boolean hardwareAccelerated) { @@ -139,7 +138,8 @@ public class ReactModalHostManager extends ViewGroupManager @Override public Object updateState( - ReactModalHostView view, ReactStylesDiffMap props, StateWrapper stateWrapper) { + ReactModalHostView view, ReactStylesDiffMap props, @Nullable StateWrapper stateWrapper) { + // TODO T55794595: Add support for updating state with null stateWrapper Point modalSize = ModalHostHelper.getModalHostSize(view.getContext()); view.updateState(stateWrapper, modalSize.x, modalSize.y); return null; diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactTextViewManager.java b/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactTextViewManager.java index f498db2ef83..af76c9edb22 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactTextViewManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactTextViewManager.java @@ -74,7 +74,8 @@ public class ReactTextViewManager @Override public Object updateState( - ReactTextView view, ReactStylesDiffMap props, StateWrapper stateWrapper) { + ReactTextView view, ReactStylesDiffMap props, @Nullable StateWrapper stateWrapper) { + // TODO T55794595: Add support for updating state with null stateWrapper ReadableMap attributedString = stateWrapper.getState().getMap("attributedString"); Spannable spanned =