Skip to content

Commit 88a4dd4

Browse files
zielinskimzfacebook-github-bot
authored andcommitted
Ship TextInput fix
Summary: As per title, I've verified by running a QE that the fix works and doesn't cause any other regressions. Reviewed By: adityasharat Differential Revision: D77854287 fbshipit-source-id: 740d830b7bf35f0cbc4a97e65bdfa5be06ea2e85
1 parent f65292e commit 88a4dd4

2 files changed

Lines changed: 18 additions & 99 deletions

File tree

litho-core/src/main/java/com/facebook/litho/config/ComponentsConfiguration.kt

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -305,9 +305,6 @@ internal constructor(
305305
/** This flag is to enable usage of Primitive TextInput */
306306
@JvmField var usePrimitiveTextInput: Boolean = false
307307

308-
/** This flag is to enable usage of seqNumber to trigger remeasure in TextInput */
309-
@JvmField var useSeqNumberForRemeasuringTextInput: Boolean = false
310-
311308
/**
312309
* This flag is used to enable a fix for the issue where the text is not truncated correctly
313310
* when customEllipsisText is set.

litho-widget/src/main/java/com/facebook/litho/widget/ExperimentalTextInput.kt

Lines changed: 18 additions & 96 deletions
Original file line numberDiff line numberDiff line change
@@ -239,19 +239,7 @@ class ExperimentalTextInput(
239239
override fun PrimitiveComponentScope.render(): LithoPrimitive {
240240
val mountedView = useState { AtomicReference<EditTextWithEventHandlers?>() }
241241
val savedText = useState { AtomicReference(initialText) }
242-
val useSeqNumberForRemeasuringTextInput =
243-
useState { ComponentsConfiguration.useSeqNumberForRemeasuringTextInput }.value
244-
val savedTextWithoutSpans = useState {
245-
if (useSeqNumberForRemeasuringTextInput) {
246-
AtomicReference(initialText.toString() as CharSequence)
247-
} else {
248-
null
249-
}
250-
}
251-
252-
// control
253-
val textAndConstraintsForMeasure = useState { TextAndConstraints(initialText.toString(), null) }
254-
// test
242+
val savedTextWithoutSpans = useState { AtomicReference(initialText.toString() as CharSequence) }
255243
val measureSeqNumber = useState { 0 }
256244

257245
val resolvedHighlightColor = useCached {
@@ -306,8 +294,6 @@ class ExperimentalTextInput(
306294
savedText = savedText.value,
307295
savedTextWithoutSpans = savedTextWithoutSpans.value,
308296
measureSeqNumber = measureSeqNumber.value,
309-
useSeqNumberForRemeasuringTextInput = useSeqNumberForRemeasuringTextInput,
310-
textAndConstraintsForMeasure = textAndConstraintsForMeasure,
311297
),
312298
mountBehavior =
313299
MountBehavior(
@@ -328,17 +314,15 @@ class ExperimentalTextInput(
328314
savedText.value,
329315
savedTextWithoutSpans.value,
330316
measureSeqNumber.value,
331-
useSeqNumberForRemeasuringTextInput,
332-
textAndConstraintsForMeasure.value) { editText ->
333-
textInputController?.bind(
334-
editText,
335-
savedText.value,
336-
savedTextWithoutSpans.value,
337-
measureSeqNumber,
338-
useSeqNumberForRemeasuringTextInput,
339-
textAndConstraintsForMeasure)
340-
onUnbind { textInputController?.unbind() }
341-
}
317+
) { editText ->
318+
textInputController?.bind(
319+
editText,
320+
savedText.value,
321+
savedTextWithoutSpans.value,
322+
measureSeqNumber,
323+
)
324+
onUnbind { textInputController?.unbind() }
325+
}
342326
}
343327
// OnMount
344328
withDescription("text-input-equivalent-mount") {
@@ -457,9 +441,6 @@ class ExperimentalTextInput(
457441
editText.onInputConnection = onInputConnection
458442
editText.onTextPasted = onTextPasted
459443
editText.measureSeqNumber = measureSeqNumber
460-
editText.useSeqNumberForRemeasuringTextInput =
461-
useSeqNumberForRemeasuringTextInput
462-
editText.textAndConstraintsForMeasure = textAndConstraintsForMeasure
463444

464445
onUnbind {
465446
editText.detachWatchers()
@@ -475,8 +456,6 @@ class ExperimentalTextInput(
475456
editText.customInsertionActionModeCallback = null
476457
editText.onTextPasted = null
477458
editText.measureSeqNumber = null
478-
editText.useSeqNumberForRemeasuringTextInput = false
479-
editText.textAndConstraintsForMeasure = null
480459
}
481460
}
482461
}
@@ -520,11 +499,8 @@ internal class TextInputLayoutBehavior(
520499
private val disableAutofill: Boolean,
521500
private val movementMethod: MovementMethod,
522501
private val measureSeqNumber: Int,
523-
private val useSeqNumberForRemeasuringTextInput: Boolean,
524502
private val savedText: AtomicReference<CharSequence?>,
525503
private val savedTextWithoutSpans: AtomicReference<CharSequence?>?,
526-
// we're only reading it here in order to force remeasure if it gets updated
527-
private val textAndConstraintsForMeasure: State<TextAndConstraints>,
528504
) : LayoutBehavior {
529505
override fun LayoutScope.layout(sizeConstraints: SizeConstraints): PrimitiveLayoutResult {
530506
// When input type has NO_SUGGESTIONS flag set then suggestion spans are removed when
@@ -572,13 +548,8 @@ internal class TextInputLayoutBehavior(
572548
importantForAutofill,
573549
autofillHints,
574550
disableAutofill,
575-
// onMeasure happens:
576-
// 1. After initState before onMount: savedText = initText.
577-
// 2. After onMount before onUnmount: savedText preserved from underlying editText.
578-
savedText.get(),
579551
savedTextWithoutSpans?.get(),
580-
useSeqNumberForRemeasuringTextInput,
581-
textAndConstraintsForMeasure)
552+
)
582553

583554
return PrimitiveLayoutResult(
584555
height = forMeasure.measuredHeight,
@@ -647,25 +618,9 @@ internal fun createAndMeasureEditText(
647618
importantForAutofill: Int,
648619
autofillHints: Array<String?>?,
649620
disableAutofill: Boolean,
650-
text: CharSequence?,
651621
textWithoutSpans: CharSequence?,
652-
useSeqNumberForRemeasuringTextInput: Boolean,
653-
textAndConstraintsForMeasure: State<TextAndConstraints>,
654622
): EditText {
655-
val textToMeasure =
656-
if (useSeqNumberForRemeasuringTextInput) {
657-
textWithoutSpans
658-
} else {
659-
// The height should be the measured height of EditText with relevant params
660-
val constraints = textAndConstraintsForMeasure.value.constraints
661-
662-
if (sizeConstraints == constraints) {
663-
// If text contains Spans, we don't want it to be mutable for the measurement case
664-
textAndConstraintsForMeasure.value.text
665-
} else {
666-
text
667-
}
668-
}
623+
val textToMeasure = textWithoutSpans
669624

670625
val forMeasure = ForMeasureEditText(context)
671626

@@ -899,8 +854,6 @@ internal class EditTextWithEventHandlers(context: Context?) :
899854
var onInputConnection: ((InputConnection?, EditorInfo) -> InputConnection?)? = null
900855
var componentContext: ComponentContext? = null
901856
var measureSeqNumber: State<Int>? = null
902-
var useSeqNumberForRemeasuringTextInput: Boolean = false
903-
var textAndConstraintsForMeasure: State<TextAndConstraints>? = null
904857
private var textState: AtomicReference<CharSequence?>? = null
905858
private var textWithoutSpansState: AtomicReference<CharSequence?>? = null
906859
private var textLineCount = UNMEASURED_LINE_COUNT
@@ -910,9 +863,6 @@ internal class EditTextWithEventHandlers(context: Context?) :
910863
private var disableAutofill = false
911864
private var isTextPasted = false
912865

913-
private var lastWidthSpec: Int = -1
914-
private var lastHeightSpec: Int = -1
915-
916866
private var onWindowFocusChangeListener: ViewTreeObserver.OnWindowFocusChangeListener? = null
917867

918868
init {
@@ -924,9 +874,8 @@ internal class EditTextWithEventHandlers(context: Context?) :
924874
override fun onTextChanged(text: CharSequence, start: Int, lengthBefore: Int, lengthAfter: Int) {
925875
super.onTextChanged(text, start, lengthBefore, lengthAfter)
926876
textState?.set(text)
927-
if (useSeqNumberForRemeasuringTextInput) {
928-
textWithoutSpansState?.set(text.toString())
929-
}
877+
textWithoutSpansState?.set(text.toString())
878+
930879
onTextChanged?.invoke(this@EditTextWithEventHandlers, text.toString())
931880

932881
if (isTextPasted && onTextPasted != null) {
@@ -938,18 +887,7 @@ internal class EditTextWithEventHandlers(context: Context?) :
938887
if (this.textLineCount != UNMEASURED_LINE_COUNT &&
939888
(this.textLineCount != lineCount) &&
940889
(componentContext != null)) {
941-
942-
if (useSeqNumberForRemeasuringTextInput) {
943-
val constraints =
944-
if (lastWidthSpec != -1 && lastHeightSpec != -1) {
945-
SizeConstraints.fromMeasureSpecs(lastWidthSpec, lastHeightSpec)
946-
} else {
947-
null
948-
}
949-
textAndConstraintsForMeasure?.update(TextAndConstraints(text.toString(), constraints))
950-
} else {
951-
measureSeqNumber?.update { it + 1 }
952-
}
890+
measureSeqNumber?.update { it + 1 }
953891
}
954892
}
955893

@@ -962,8 +900,6 @@ internal class EditTextWithEventHandlers(context: Context?) :
962900

963901
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
964902
super.onMeasure(widthMeasureSpec, heightMeasureSpec)
965-
lastWidthSpec = widthMeasureSpec
966-
lastHeightSpec = heightMeasureSpec
967903
// Line count of the current text.
968904
textLineCount = lineCount
969905
}
@@ -1254,23 +1190,17 @@ class TextInputController internal constructor() {
12541190
private var savedText: AtomicReference<CharSequence?>? = null
12551191
private var savedTextWithoutSpans: AtomicReference<CharSequence?>? = null
12561192
private var measureSeqNumber: State<Int>? = null
1257-
private var useSeqNumberForRemeasuringTextInput: Boolean = false
1258-
private var createAndMeasureEditText: State<TextAndConstraints>? = null
12591193

12601194
internal fun bind(
12611195
editText: EditTextWithEventHandlers,
12621196
savedText: AtomicReference<CharSequence?>,
12631197
savedTextWithoutSpans: AtomicReference<CharSequence?>?,
12641198
measureSeqNumber: State<Int>?,
1265-
useSeqNumberForRemeasuringTextInput: Boolean,
1266-
createAndMeasureEditText: State<TextAndConstraints>?,
12671199
) {
12681200
this.editText = editText
12691201
this.savedText = savedText
12701202
this.savedTextWithoutSpans = savedTextWithoutSpans
12711203
this.measureSeqNumber = measureSeqNumber
1272-
this.useSeqNumberForRemeasuringTextInput = useSeqNumberForRemeasuringTextInput
1273-
this.createAndMeasureEditText = createAndMeasureEditText
12741204
}
12751205

12761206
internal fun unbind() {
@@ -1347,9 +1277,7 @@ class TextInputController internal constructor() {
13471277
.append(currentSavedText.subSequence(0, startIndex))
13481278
.append(text)
13491279
.append(currentSavedText.subSequence(endIndex, currentSavedText.length)))
1350-
if (useSeqNumberForRemeasuringTextInput) {
1351-
savedText?.get()?.let { savedTextWithoutSpans?.set(it.toString()) }
1352-
}
1280+
savedText?.get()?.let { savedTextWithoutSpans?.set(it.toString()) }
13531281

13541282
remeasureForUpdatedTextSync()
13551283
}
@@ -1400,9 +1328,7 @@ class TextInputController internal constructor() {
14001328
val view = editText
14011329
if (view == null) {
14021330
savedText?.set(text)
1403-
if (useSeqNumberForRemeasuringTextInput) {
1404-
savedTextWithoutSpans?.set(text.toString())
1405-
}
1331+
savedTextWithoutSpans?.set(text.toString())
14061332
return true
14071333
}
14081334

@@ -1415,11 +1341,7 @@ class TextInputController internal constructor() {
14151341
}
14161342

14171343
private fun remeasureForUpdatedTextSync() {
1418-
if (useSeqNumberForRemeasuringTextInput) {
1419-
createAndMeasureEditText?.updateSync(TextAndConstraints(savedText?.get().toString(), null))
1420-
} else {
1421-
measureSeqNumber?.updateSync { it + 1 }
1422-
}
1344+
measureSeqNumber?.updateSync { it + 1 }
14231345
}
14241346
}
14251347

0 commit comments

Comments
 (0)