Skip to content

Commit

Permalink
Align logic in BaseTextInputShadowNode to getAttributedString with An…
Browse files Browse the repository at this point in the history
…droidTextInputShadowNode

Summary:
[Changelog] [Internal] - Align logic in BaseTextInputShadowNode to getAttributedString with AndroidTextInputShadowNode

As a preparation for #48165 this aligns the implementation of those 2 methods

Differential Revision: D68005037
  • Loading branch information
christophpurrer authored and facebook-github-bot committed Jan 10, 2025
1 parent 3a359fc commit 6009d5c
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 24 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -191,15 +191,21 @@ class BaseTextInputShadowNode : public ConcreteViewShadowNode<
props.getEffectiveTextAttributes(layoutContext.fontSizeMultiplier);

AttributedString attributedString;
attributedString.appendFragment(AttributedString::Fragment{
.string = props.text,
.textAttributes = textAttributes,
.parentShadowView = ShadowView(*this)});

auto attachments = BaseTextShadowNode::Attachments{};
// Use BaseTextShadowNode to get attributed string from children
BaseTextShadowNode::buildAttributedString(
textAttributes, *this, attributedString, attachments);
attributedString.setBaseTextAttributes(textAttributes);

// BaseTextShadowNode only gets children. We must detect and prepend text
// value attributes manually.
if (!props.text.empty()) {
attributedString.appendFragment(AttributedString::Fragment{
.string = props.text,
.textAttributes = textAttributes,
.parentShadowView = ShadowView(*this)});
}

return attributedString;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -155,34 +155,29 @@ void AndroidTextInputShadowNode::updateStateIfNeeded() {
}

AttributedString AndroidTextInputShadowNode::getAttributedString() const {
// Use BaseTextShadowNode to get attributed string from children
auto childTextAttributes = TextAttributes::defaultTextAttributes();
childTextAttributes.apply(getConcreteProps().textAttributes);
const auto& props = BaseShadowNode::getConcreteProps();

auto textAttributes = TextAttributes::defaultTextAttributes();
textAttributes.apply(props.textAttributes);
// Don't propagate the background color of the TextInput onto the attributed
// string. Android tries to render shadow of the background alongside the
// shadow of the text which results in weird artifacts.
childTextAttributes.backgroundColor = HostPlatformColor::UndefinedColor;
textAttributes.backgroundColor = clearColor();

auto attributedString = AttributedString{};
AttributedString attributedString;
auto attachments = BaseTextShadowNode::Attachments{};
// Use BaseTextShadowNode to get attributed string from children
BaseTextShadowNode::buildAttributedString(
childTextAttributes, *this, attributedString, attachments);
attributedString.setBaseTextAttributes(childTextAttributes);
textAttributes, *this, attributedString, attachments);
attributedString.setBaseTextAttributes(textAttributes);

// BaseTextShadowNode only gets children. We must detect and prepend text
// value attributes manually.
if (!getConcreteProps().text.empty()) {
auto textAttributes = TextAttributes::defaultTextAttributes();
textAttributes.apply(getConcreteProps().textAttributes);
auto fragment = AttributedString::Fragment{};
fragment.string = getConcreteProps().text;
fragment.textAttributes = textAttributes;
// If the TextInput opacity is 0 < n < 1, the opacity of the TextInput and
// text value's background will stack. This is a hack/workaround to prevent
// that effect.
fragment.textAttributes.backgroundColor = clearColor();
fragment.parentShadowView = ShadowView(*this);
attributedString.prependFragment(std::move(fragment));
if (!props.text.empty()) {
attributedString.appendFragment(AttributedString::Fragment{
.string = props.text,
.textAttributes = textAttributes,
.parentShadowView = ShadowView(*this)});
}

return attributedString;
Expand Down

0 comments on commit 6009d5c

Please sign in to comment.