From 75117fc91af2606b23e38cc7f7ab2fc64b876f50 Mon Sep 17 00:00:00 2001 From: Ahmed El-Helw Date: Mon, 29 Feb 2016 16:42:21 -0800 Subject: [PATCH] Minor code improvements for RCTTextInput Summary: @public Expose hasUnseenUpdates in ReactShadowNode. Various text input cleanup and fixes. Differential Revision: D2975870 --- .../react/flat/FlatTextShadowNode.java | 5 ---- .../java/com/facebook/react/flat/RCTText.java | 11 --------- .../com/facebook/react/flat/RCTTextInput.java | 23 ++++++++----------- .../facebook/react/flat/RCTVirtualText.java | 11 +++++++++ .../com/facebook/react/flat/StateBuilder.java | 6 ++--- 5 files changed, 23 insertions(+), 33 deletions(-) diff --git a/ReactAndroid/src/main/java/com/facebook/react/flat/FlatTextShadowNode.java b/ReactAndroid/src/main/java/com/facebook/react/flat/FlatTextShadowNode.java index 883c667a9..11b834421 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/flat/FlatTextShadowNode.java +++ b/ReactAndroid/src/main/java/com/facebook/react/flat/FlatTextShadowNode.java @@ -30,11 +30,6 @@ import com.facebook.react.uimanager.ReactShadowNode; if (parent instanceof FlatTextShadowNode) { ((FlatTextShadowNode) parent).notifyChanged(shouldRemeasure); } - - if (this instanceof RCTTextInput) { - // needed to trigger onCollectExtraUpdates - markUpdated(); - } } @Override diff --git a/ReactAndroid/src/main/java/com/facebook/react/flat/RCTText.java b/ReactAndroid/src/main/java/com/facebook/react/flat/RCTText.java index 09c029a0c..223d4b8d2 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/flat/RCTText.java +++ b/ReactAndroid/src/main/java/com/facebook/react/flat/RCTText.java @@ -13,7 +13,6 @@ import javax.annotation.Nullable; import android.text.BoringLayout; import android.text.Layout; -import android.text.SpannableStringBuilder; import android.text.StaticLayout; import android.text.TextPaint; import android.text.TextUtils; @@ -275,16 +274,6 @@ import com.facebook.react.uimanager.annotations.ReactProp; notifyChanged(false); } - /** - * Returns a new CharSequence that includes all the text and styling information to create Layout. - */ - private CharSequence getText() { - SpannableStringBuilder sb = new SpannableStringBuilder(); - collectText(sb); - applySpans(sb); - return sb; - } - /** * Returns measured line height according to an includePadding flag. */ diff --git a/ReactAndroid/src/main/java/com/facebook/react/flat/RCTTextInput.java b/ReactAndroid/src/main/java/com/facebook/react/flat/RCTTextInput.java index cae296ded..076d4d61c 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/flat/RCTTextInput.java +++ b/ReactAndroid/src/main/java/com/facebook/react/flat/RCTTextInput.java @@ -44,6 +44,13 @@ public class RCTTextInput extends RCTVirtualText implements AndroidView, CSSNode setMeasureFunction(this); } + @Override + protected void notifyChanged(boolean shouldRemeasure) { + super.notifyChanged(shouldRemeasure); + // needed to trigger onCollectExtraUpdates + markUpdated(); + } + @Override public void setThemedContext(ThemedReactContext themedContext) { super.setThemedContext(themedContext); @@ -107,8 +114,7 @@ public class RCTTextInput extends RCTVirtualText implements AndroidView, CSSNode public void onCollectExtraUpdates(UIViewOperationQueue uiViewOperationQueue) { super.onCollectExtraUpdates(uiViewOperationQueue); if (mJsEventCount != UNSET) { - ReactTextUpdate reactTextUpdate = - new ReactTextUpdate(getText(), mJsEventCount, false); + ReactTextUpdate reactTextUpdate = new ReactTextUpdate(getText(), mJsEventCount, false); uiViewOperationQueue.enqueueUpdateExtraData(getReactTag(), reactTextUpdate); } } @@ -127,7 +133,7 @@ public class RCTTextInput extends RCTVirtualText implements AndroidView, CSSNode @ReactProp(name = PROP_TEXT) public void setText(@Nullable String text) { mText = text; - markUpdated(); + notifyChanged(true); } @Override @@ -153,6 +159,7 @@ public class RCTTextInput extends RCTVirtualText implements AndroidView, CSSNode return true; } + @Override protected void performCollectText(SpannableStringBuilder builder) { if (mText != null) { builder.append(mText); @@ -160,16 +167,6 @@ public class RCTTextInput extends RCTVirtualText implements AndroidView, CSSNode super.performCollectText(builder); } - /** - * Returns a new CharSequence that includes all the text and styling information to create Layout. - */ - SpannableStringBuilder getText() { - SpannableStringBuilder sb = new SpannableStringBuilder(); - collectText(sb); - applySpans(sb); - return sb; - } - @Override public boolean needsCustomLayoutForChildren() { return false; diff --git a/ReactAndroid/src/main/java/com/facebook/react/flat/RCTVirtualText.java b/ReactAndroid/src/main/java/com/facebook/react/flat/RCTVirtualText.java index bcfdeeb4d..051fd52d7 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/flat/RCTVirtualText.java +++ b/ReactAndroid/src/main/java/com/facebook/react/flat/RCTVirtualText.java @@ -238,6 +238,17 @@ import com.facebook.react.uimanager.ViewProps; return mFontStylingSpan; } + /** + * Returns a new SpannableStringBuilder that includes all the text and styling information to + * create the Layout. + */ + /* package */ final SpannableStringBuilder getText() { + SpannableStringBuilder sb = new SpannableStringBuilder(); + collectText(sb); + applySpans(sb); + return sb; + } + private final ShadowStyleSpan getShadowSpan() { if (mShadowStyleSpan.isFrozen()) { mShadowStyleSpan = mShadowStyleSpan.mutableCopy(); diff --git a/ReactAndroid/src/main/java/com/facebook/react/flat/StateBuilder.java b/ReactAndroid/src/main/java/com/facebook/react/flat/StateBuilder.java index 93aef1b50..dee6124cc 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/flat/StateBuilder.java +++ b/ReactAndroid/src/main/java/com/facebook/react/flat/StateBuilder.java @@ -239,9 +239,7 @@ import com.facebook.react.uimanager.events.EventDispatcher; float clipTop, float clipRight, float clipBottom) { - // Normally, this would be a node.hasNewLayout() check, but we also need to check if a node - // needs onCollectExtraUpdates() call. - boolean hasUpdates = node.hasUpdates(); + boolean hasUpdates = node.hasNewLayout(); boolean expectingUpdate = hasUpdates || node.isUpdated() || node.clipBoundsChanged(clipLeft, clipTop, clipRight, clipBottom); @@ -323,7 +321,7 @@ import com.facebook.react.uimanager.events.EventDispatcher; nodeRegions); } - if (hasUpdates) { + if (node.hasUnseenUpdates()) { node.onCollectExtraUpdates(mOperationsQueue); node.markUpdateSeen(); }