From 97d6f9303bbd21218b9393480a5b4363cff31bfe Mon Sep 17 00:00:00 2001 From: Jason Ross <51939451+JMR-dev@users.noreply.github.com> Date: Thu, 2 Jul 2026 17:42:37 -0500 Subject: [PATCH 1/2] fix(accountsetup): show 2-Step Verification link before app-password link for Gmail (#166) 2-Step Verification is a prerequisite for Gmail's app-passwords page, so render the twoFactorHelpUrl button first when present, then the appPasswordHelpUrl button. Previously the prerequisite link rendered second, so a user without 2FA enabled would hit a dead end on the first button before noticing the second. No visible change for Yahoo/iCloud, which have no twoFactorHelpUrl. Closes #152 Co-authored-by: Claude Opus 4.8 Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .../ui/accountsetup/AppPasswordSetupScreen.kt | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/app/src/main/kotlin/org/libremail/ui/accountsetup/AppPasswordSetupScreen.kt b/app/src/main/kotlin/org/libremail/ui/accountsetup/AppPasswordSetupScreen.kt index 1a640ba..357d4fe 100644 --- a/app/src/main/kotlin/org/libremail/ui/accountsetup/AppPasswordSetupScreen.kt +++ b/app/src/main/kotlin/org/libremail/ui/accountsetup/AppPasswordSetupScreen.kt @@ -151,23 +151,23 @@ fun AppPasswordSetupScreen( ) Spacer(Modifier.height(12.dp)) - OutlinedButton( - onClick = { openUrl(provider.appPasswordHelpUrl) }, - modifier = Modifier.fillMaxWidth(), - ) { - Text(stringResource(R.string.app_password_open_page, provider.displayName)) - } // Only Gmail has a two-factor prerequisite (see MailProvider.twoFactorHelpUrl): its - // app-passwords page rejects accounts without 2-Step Verification, so give those users - // a way to set it up instead of a dead end. + // app-passwords page rejects accounts without 2-Step Verification, so point users + // there first instead of sending them to the app-passwords page's dead end. provider.twoFactorHelpUrl?.let { twoFactorHelpUrl -> - Spacer(Modifier.height(8.dp)) OutlinedButton( onClick = { openUrl(twoFactorHelpUrl) }, modifier = Modifier.fillMaxWidth(), ) { Text(stringResource(R.string.app_password_2fa_help)) } + Spacer(Modifier.height(8.dp)) + } + OutlinedButton( + onClick = { openUrl(provider.appPasswordHelpUrl) }, + modifier = Modifier.fillMaxWidth(), + ) { + Text(stringResource(R.string.app_password_open_page, provider.displayName)) } Spacer(Modifier.height(20.dp)) From e72a9b15c69238cc1abeb1acca257ddd7bbb611a Mon Sep 17 00:00:00 2001 From: Jason Ross <51939451+JMR-dev@users.noreply.github.com> Date: Thu, 2 Jul 2026 17:52:48 -0500 Subject: [PATCH 2/2] docs(compose): correct RichTextEditor toolbar accessibility KDoc (onClickLabel, not contentDescription) (#179) Co-authored-by: Claude Opus 4.8 --- app/src/main/kotlin/org/libremail/ui/compose/RichTextEditor.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/kotlin/org/libremail/ui/compose/RichTextEditor.kt b/app/src/main/kotlin/org/libremail/ui/compose/RichTextEditor.kt index 18f4804..942af0b 100644 --- a/app/src/main/kotlin/org/libremail/ui/compose/RichTextEditor.kt +++ b/app/src/main/kotlin/org/libremail/ui/compose/RichTextEditor.kt @@ -78,7 +78,8 @@ internal const val IMAGE_TAG = "libremail:image" * feels exactly like the old editor. * * The field is a normal Compose text field, so TalkBack, text selection, and large system fonts all - * work as usual; the toolbar buttons carry content descriptions and toggle state for accessibility. + * work as usual; each toolbar button exposes its accessible action label via `onClickLabel` on its + * [Modifier.clickable] (not a `contentDescription`), and still carries toggle state for accessibility. * * [resolveFont] maps a CSS font-family stack to a Compose [FontFamily] for display; the default * resolves nothing, leaving the system font (the model still round-trips the CSS value untouched).