diff --git a/app/src/main/assets/fonts/MonoSpecial-Regular.otf b/app/src/main/assets/fonts/MonoSpecial-Regular.otf new file mode 100644 index 0000000000..314b20f5a8 Binary files /dev/null and b/app/src/main/assets/fonts/MonoSpecial-Regular.otf differ diff --git a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/subscription/MessageBackupsKeyRecordScreen.kt b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/subscription/MessageBackupsKeyRecordScreen.kt index 5a2a66b174..ba17c38ec3 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/subscription/MessageBackupsKeyRecordScreen.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/subscription/MessageBackupsKeyRecordScreen.kt @@ -25,7 +25,6 @@ import androidx.compose.ui.platform.testTag import androidx.compose.ui.res.dimensionResource import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource -import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp @@ -36,8 +35,7 @@ import org.signal.core.ui.compose.Scaffolds import org.signal.core.ui.compose.SignalPreview import org.signal.core.ui.compose.theme.SignalTheme import org.thoughtcrime.securesms.R -import kotlin.random.Random -import kotlin.random.nextInt +import org.thoughtcrime.securesms.fonts.MonoTypeface import org.signal.core.ui.R as CoreUiR /** @@ -120,7 +118,7 @@ fun MessageBackupsKeyRecordScreen( letterSpacing = 1.44.sp, lineHeight = 36.sp, textAlign = TextAlign.Center, - fontFamily = FontFamily.Monospace + fontFamily = MonoTypeface.fontFamily() ) ) } @@ -160,7 +158,7 @@ fun MessageBackupsKeyRecordScreen( private fun MessageBackupsKeyRecordScreenPreview() { Previews.Preview { MessageBackupsKeyRecordScreen( - backupKey = (0 until 64).map { Random.nextInt(97..122).toChar() }.joinToString("") + backupKey = (0 until 63).map { (('A'..'Z') + ('0'..'9')).random() }.joinToString("") + "0" ) } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/subscription/MessageBackupsKeyVerifyScreen.kt b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/subscription/MessageBackupsKeyVerifyScreen.kt index c3ad84f053..fff4f4d8cd 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/subscription/MessageBackupsKeyVerifyScreen.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/subscription/MessageBackupsKeyVerifyScreen.kt @@ -5,7 +5,6 @@ package org.thoughtcrime.securesms.backup.v2.ui.subscription -import android.graphics.Typeface import androidx.compose.foundation.Image import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column @@ -48,7 +47,6 @@ import androidx.compose.ui.platform.testTag import androidx.compose.ui.res.dimensionResource import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource -import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.KeyboardCapitalization import androidx.compose.ui.text.input.KeyboardType @@ -63,6 +61,7 @@ import org.signal.core.ui.compose.Scaffolds import org.signal.core.ui.compose.SignalPreview import org.signal.core.ui.compose.horizontalGutters import org.thoughtcrime.securesms.R +import org.thoughtcrime.securesms.fonts.MonoTypeface import org.thoughtcrime.securesms.registrationv3.ui.restore.BackupKeyVisualTransformation import org.thoughtcrime.securesms.registrationv3.ui.restore.attachBackupKeyAutoFillHelper import org.thoughtcrime.securesms.registrationv3.ui.restore.backupKeyAutoFillHelper @@ -141,7 +140,7 @@ fun MessageBackupsKeyVerifyScreen( Text(text = stringResource(id = R.string.MessageBackupsKeyVerifyScreen__backup_key)) }, textStyle = LocalTextStyle.current.copy( - fontFamily = FontFamily(typeface = Typeface.MONOSPACE), + fontFamily = MonoTypeface.fontFamily(), lineHeight = 36.sp ), keyboardOptions = KeyboardOptions( diff --git a/app/src/main/java/org/thoughtcrime/securesms/fonts/MonoTypeface.kt b/app/src/main/java/org/thoughtcrime/securesms/fonts/MonoTypeface.kt new file mode 100644 index 0000000000..3dda687067 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/fonts/MonoTypeface.kt @@ -0,0 +1,24 @@ +/* + * Copyright 2025 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.thoughtcrime.securesms.fonts + +import android.graphics.Typeface +import androidx.compose.runtime.Composable +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.text.font.FontFamily + +/** + * Special monospace font, primarily used for rendering AEPs. + */ +object MonoTypeface { + private var cached: Typeface? = null + + @Composable + fun fontFamily(): FontFamily { + val context = LocalContext.current + return FontFamily(cached ?: Typeface.createFromAsset(context.assets, "fonts/MonoSpecial-Regular.otf").also { cached = it }) + } +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/registrationv3/ui/restore/EnterBackupKeyScreen.kt b/app/src/main/java/org/thoughtcrime/securesms/registrationv3/ui/restore/EnterBackupKeyScreen.kt index 2f793d496d..4d4018481c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/registrationv3/ui/restore/EnterBackupKeyScreen.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/registrationv3/ui/restore/EnterBackupKeyScreen.kt @@ -5,7 +5,6 @@ package org.thoughtcrime.securesms.registrationv3.ui.restore -import android.graphics.Typeface import androidx.compose.animation.AnimatedContent import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement @@ -43,7 +42,6 @@ import androidx.compose.ui.layout.onGloballyPositioned import androidx.compose.ui.platform.LocalSoftwareKeyboardController import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource -import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.KeyboardCapitalization import androidx.compose.ui.text.input.KeyboardType @@ -58,6 +56,7 @@ import org.signal.core.ui.compose.SignalPreview import org.signal.core.ui.compose.horizontalGutters import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.backup.v2.ui.BackupsIconColors +import org.thoughtcrime.securesms.fonts.MonoTypeface import org.thoughtcrime.securesms.registrationv3.ui.shared.RegistrationScreen import org.whispersystems.signalservice.api.AccountEntropyPool @@ -143,7 +142,7 @@ fun EnterBackupKeyScreen( Text(text = stringResource(id = R.string.EnterBackupKey_backup_key)) }, textStyle = LocalTextStyle.current.copy( - fontFamily = FontFamily(typeface = Typeface.MONOSPACE), + fontFamily = MonoTypeface.fontFamily(), lineHeight = 36.sp ), keyboardOptions = KeyboardOptions( @@ -215,7 +214,7 @@ private fun AccountEntropyPoolVerification.AEPValidationError.ValidationErrorMes private fun EnterBackupKeyScreenPreview() { Previews.Preview { EnterBackupKeyScreen( - backupKey = "UY38jh2778hjjhj8lk19ga61s672jsj089r023s6a57809bap92j2yh5t326vv7t", + backupKey = "UY38jh2778hjjhj8lk19ga61s672jsj089r023s6a57809bap92j2yh5t326vv7t".uppercase(), isBackupKeyValid = true, inProgress = false, chunkLength = 4, @@ -229,7 +228,7 @@ private fun EnterBackupKeyScreenPreview() { private fun EnterBackupKeyScreenErrorPreview() { Previews.Preview { EnterBackupKeyScreen( - backupKey = "UY38jh2778hjjhj8lk19ga61s672jsj089r023s6a57809bap92j2yh5t326vv7t", + backupKey = "UY38jh2778hjjhj8lk19ga61s672jsj089r023s6a57809bap92j2yh5t326vv7t".uppercase(), isBackupKeyValid = true, inProgress = false, chunkLength = 4,