Skip to content

Commit

Permalink
Fix rendering of FB emoji in RN Android
Browse files Browse the repository at this point in the history
Summary:
This diff ensures the measurement and rendering of FB emojis is correnct in RN Android.
Before this commit we were customizing Spannable object with FB emojis right before rendering the text into the TextView, this diff ensures that the Spannable is "customized" as soon as it is created, ensuring the measurement of the Text.

changelog: [internal]

Reviewed By: JoshuaGross

Differential Revision: D19354107

fbshipit-source-id: 92e07cf30503404f7820f25eaa9efdc02f6bddbd
  • Loading branch information
mdvacca authored and facebook-github-bot committed Jan 19, 2020
1 parent bef845f commit 475df06
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,8 @@ public class ReactTextShadowNode extends ReactBaseTextShadowNode {

private boolean mShouldNotifyOnTextLayout;

private @Nullable ReactTextViewManagerCallback mReactTextViewManagerCallback = null;

private final YogaMeasureFunction mTextMeasureFunction =
new YogaMeasureFunction() {
@Override
Expand Down Expand Up @@ -196,6 +198,10 @@ private void initMeasureFunction() {
}
}

public void setReactTextViewManagerCallback(ReactTextViewManagerCallback callback) {
mReactTextViewManagerCallback = callback;
}

// Return text alignment according to LTR or RTL style
private int getTextAlign() {
int textAlign = mTextAlign;
Expand All @@ -217,6 +223,9 @@ public void onBeforeLayout(NativeViewHierarchyOptimizer nativeViewHierarchyOptim
/* text (e.g. from `value` prop): */ null,
/* supportsInlineViews: */ true,
nativeViewHierarchyOptimizer);
if (mReactTextViewManagerCallback != null) {
mReactTextViewManagerCallback.onPostProcessSpannable(mPreparedSpannableText);
}
markUpdated();
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
/*
* Copyright (c) Facebook, Inc. and its 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.views.text;

import android.text.Spannable;

/**
* This interface allows clients of {@link ReactTextViewManager} to customize or prepare {@link
* Spannable} object that represent text that will be rendered on the screen.
*/
public interface ReactTextViewManagerCallback {

/**
* Callback executed right after the {@link Spannable} object is created by React.
*
* <p>This callback can be used by different implementations of ReactTextViewManager to customize
* Spannable or extend managed created by React.
*/
void onPostProcessSpannable(Spannable text);
}

0 comments on commit 475df06

Please sign in to comment.