-
Notifications
You must be signed in to change notification settings - Fork 927
Force LTR text direction for passwords and TOTP codes #6309
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
Adds TextStyle extension to force left-to-right text direction with locale-aware alignment for sensitive alphanumeric content. This ensures passwords and TOTP codes read correctly in RTL locales while maintaining proper alignment. - Add TextStyle.withForcedLtr() extension in TypographyExtensions.kt - Refactor BitwardenPasswordField to use extension - Refactor VerificationCodeItem (app) to use extension - Refactor VaultVerificationCodeItem (authenticator) to use extension
|
Great job! No new security vulnerabilities introduced in this pull request |
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #6309 +/- ##
=======================================
Coverage 85.50% 85.50%
=======================================
Files 763 763
Lines 54601 54623 +22
Branches 7855 7855
=======================================
+ Hits 46684 46706 +22
Misses 5189 5189
Partials 2728 2728 ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
| @OmitFromCoverage | ||
| @Composable | ||
| fun TextStyle.withForcedLtr(): TextStyle { | ||
| val layoutDirection = LocalLayoutDirection.current |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can we pass this in?
fun TextStyle.withForcedLtr(
layoutDirection: LayoutDirection = LocalLayoutDirection.current,
): TextStyle {| textDirection = TextDirection.Ltr, | ||
| textAlign = when (layoutDirection) { | ||
| LayoutDirection.Rtl -> TextAlign.End | ||
| LayoutDirection.Ltr -> TextAlign.Start |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Does it make more sense to explicitly call out Left and Right instead End and Start?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yea, that's a little more concise. I'm for it.
| * - Password fields that should read "Pass123!" not "!321ssaP" in RTL locales | ||
| * - TOTP verification codes that should read "123 456" not "654 321" | ||
| * - Any alphanumeric content requiring LTR reading with locale-aware positioning | ||
| * |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Great docs!
| */ | ||
| @OmitFromCoverage | ||
| @Composable | ||
| fun TextStyle.withForcedLtr(): TextStyle { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What do you think about adding the word Direction in here? Like withForcedLtrDirection()?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Sounds good
- Rename extension to be more descriptive. - Use `Left` and `Right` text alignments instead of `Start` and `End`.

🎟️ Tracking
PM-20026
Relates to #4753
📔 Objective
Fixes text direction and alignment issues for passwords and TOTP verification codes in RTL (right-to-left) locales such as Persian and Hebrew.
When the system locale is set to an RTL language, passwords and TOTP codes were displaying incorrectly—reading right-to-left instead of left-to-right, and aligning to the wrong side of the field.
This PR introduces a reusable
TextStyle.withForcedLtr()extension that forces left-to-right text direction while maintaining locale-aware alignment, ensuring alphanumeric credentials display correctly across all locales.Based on work started by @codokie in #5012
📸 Screenshots
Coming soon!
⏰ Reminders before review
🦮 Reviewer guidelines
:+1:) or similar for great changes:memo:) or ℹ️ (:information_source:) for notes or general info:question:) for questions:thinking:) or 💭 (:thought_balloon:) for more open inquiry that's not quite a confirmed issue and could potentially benefit from discussion:art:) for suggestions / improvements:x:) or:warning:) for more significant problems or concerns needing attention:seedling:) or ♻️ (:recycle:) for future improvements or indications of technical debt:pick:) for minor or nitpick changes