The message text input is not displayed while typing. Only the keyboard's word suggestions are visible, so it is impossible to see the text being composed, and messages must be sent blindly.
The issue occurs only on the reporter's Android 15 device and only in Telegram. It is intermittent, with an approximate reproduction rate of 1 in 15 attempts. Restarting the app fixes the problem.
The reporter cannot provide a screen recording because the platform does not support video uploads.
Steps to reproduce
Launch Telegram.
Open a chat.
Try to type a message.
Observe that the typed text is not displayed in the message input field and only becomes visible in the chat after the message is sent.
Current result
The message input text is not displayed while typing, making it impossible to see the message before sending it.
Expected result
The message input text should be displayed while typing so that messages can be reviewed before sending.
Device info
Telegram Android 12.2.1 (62922), Vivo X200 Ultra, 15 (35)
Root cause found (vivo X300 V2509A, China OriginOS 7 / Android 17, Telegram 13.1.0 (72299), system language en-US; analysed over adb, no root).
Telegram draws the message field text through NoClipCanvas: EditTextEffects.onDraw() -> super.onDraw(wrappedCanvas), enabled by wrapCanvasToFixClipping = allowHackingTextCanvas(). NoClipCanvas forwards only the Canvas methods it overrides.
vivo's China firmware adds a text engine (android.graphics.text.TextLayoutHelper, "FLayout") and non-SDK Canvas methods drawTextRunUseTextLayoutHelper(...) / drawTextUseTextLayoutHelper(...). vivo's TextLine.drawTextRun() calls drawTextRunUseTextLayoutHelper() instead of drawTextRun() when TextLayoutHelper.isEnableLayout() && helper.isFzLayoutEnable(). NoClipCanvas does not forward that method, so the glyphs go to the wrapper's own bitmap-less canvas: the letters are invisible, while the cursor, emoji (drawBitmap, forwarded) and the hint (drawn on the real canvas by drawHint()) stay visible.
FLayout is enabled per TextView in TextView.updateFLayoutValidityStatus() (called from measure/layout) only when Locale.getDefault() is zh-CN or en-US. Telegram's English pack sets Locale("en") with no country, so FLayout is normally off. When the process default locale falls back to the system en-US, the bug appears in every chat until a configuration change (rotating the screen or toggling dark mode) makes LocaleController re-apply Telegram's locale and TextView null its layouts. This matches "restarting the app fixes it".
Evidence while the bug was visible: view dump shows the input with curTextColor #FFFFFFFF and alpha 1.0; 0 text-coloured pixels on screen; a full HWUI trim (render context destroyed, glyph cache 741 -> 18) did not help; Latin and monospace text were also invisible; the hint was visible.
Suggested fix: add "vivo" to the manufacturer exclusions in EditTextEffects.allowHackingTextCanvas(), like honor/huawei/alps.
Telegram draws the message field text through NoClipCanvas: EditTextEffects.onDraw() -> super.onDraw(wrappedCanvas), enabled by wrapCanvasToFixClipping = allowHackingTextCanvas(). NoClipCanvas forwards only the Canvas methods it overrides.
vivo's China firmware adds a text engine (android.graphics.text.TextLayoutHelper, "FLayout") and non-SDK Canvas methods drawTextRunUseTextLayoutHelper(...) / drawTextUseTextLayoutHelper(...). vivo's TextLine.drawTextRun() calls drawTextRunUseTextLayoutHelper() instead of drawTextRun() when TextLayoutHelper.isEnableLayout() && helper.isFzLayoutEnable(). NoClipCanvas does not forward that method, so the glyphs go to the wrapper's own bitmap-less canvas: the letters are invisible, while the cursor, emoji (drawBitmap, forwarded) and the hint (drawn on the real canvas by drawHint()) stay visible.
FLayout is enabled per TextView in TextView.updateFLayoutValidityStatus() (called from measure/layout) only when Locale.getDefault() is zh-CN or en-US. Telegram's English pack sets Locale("en") with no country, so FLayout is normally off. When the process default locale falls back to the system en-US, the bug appears in every chat until a configuration change (rotating the screen or toggling dark mode) makes LocaleController re-apply Telegram's locale and TextView null its layouts. This matches "restarting the app fixes it".
Evidence while the bug was visible: view dump shows the input with curTextColor #FFFFFFFF and alpha 1.0; 0 text-coloured pixels on screen; a full HWUI trim (render context destroyed, glyph cache 741 -> 18) did not help; Latin and monospace text were also invisible; the hint was visible.
Suggested fix: add "vivo" to the manufacturer exclusions in EditTextEffects.allowHackingTextCanvas(), like honor/huawei/alps.