[PM-21359] Migrate StringExtensions to ui module (#5202)

This commit is contained in:
Patrick Honkonen
2025-05-15 11:51:47 -04:00
committed by GitHub
parent c83bd8f4a8
commit c105c102a3
55 changed files with 115 additions and 194 deletions

View File

@@ -9,8 +9,8 @@ import androidx.compose.ui.text.AnnotatedString
import androidx.core.content.getSystemService
import androidx.core.os.persistableBundleOf
import com.bitwarden.authenticator.R
import com.bitwarden.ui.platform.base.util.toAnnotatedString
import com.bitwarden.ui.util.Text
import com.bitwarden.authenticator.ui.platform.base.util.toAnnotatedString
/**
* Default implementation of the [BitwardenClipboardManager] interface.

View File

@@ -14,10 +14,10 @@ import com.bitwarden.authenticator.data.authenticator.repository.model.CreateIte
import com.bitwarden.authenticator.ui.authenticator.feature.edititem.EditItemState.Companion.MAX_ALLOWED_CODE_DIGITS
import com.bitwarden.authenticator.ui.authenticator.feature.edititem.EditItemState.Companion.MIN_ALLOWED_CODE_DIGITS
import com.bitwarden.authenticator.ui.authenticator.feature.edititem.model.EditItemData
import com.bitwarden.authenticator.ui.platform.base.util.isBase32
import com.bitwarden.core.data.repository.model.DataState
import com.bitwarden.core.data.repository.util.takeUntilLoaded
import com.bitwarden.ui.platform.base.BaseViewModel
import com.bitwarden.ui.platform.base.util.isBase32
import com.bitwarden.ui.util.Text
import com.bitwarden.ui.util.asText
import com.bitwarden.ui.util.concat

View File

@@ -34,7 +34,6 @@ import androidx.compose.ui.unit.dp
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.bitwarden.authenticator.R
import com.bitwarden.authenticator.ui.platform.base.util.toAnnotatedString
import com.bitwarden.authenticator.ui.platform.components.appbar.BitwardenTopAppBar
import com.bitwarden.authenticator.ui.platform.components.dialog.BasicDialogState
import com.bitwarden.authenticator.ui.platform.components.dialog.BitwardenBasicDialog
@@ -49,6 +48,7 @@ import com.bitwarden.authenticator.ui.platform.composition.LocalPermissionsManag
import com.bitwarden.authenticator.ui.platform.manager.intent.IntentManager
import com.bitwarden.authenticator.ui.platform.manager.permissions.PermissionsManager
import com.bitwarden.ui.platform.base.util.EventsEffect
import com.bitwarden.ui.platform.base.util.toAnnotatedString
/**
* The screen to manually add a totp code.

View File

@@ -11,10 +11,10 @@ import com.bitwarden.authenticator.data.authenticator.repository.AuthenticatorRe
import com.bitwarden.authenticator.data.authenticator.repository.model.SharedVerificationCodesState
import com.bitwarden.authenticator.data.authenticator.repository.util.isSyncWithBitwardenEnabled
import com.bitwarden.authenticator.data.platform.repository.SettingsRepository
import com.bitwarden.authenticator.ui.platform.base.util.isBase32
import com.bitwarden.authenticator.ui.platform.feature.settings.data.model.DefaultSaveOption
import com.bitwarden.authenticatorbridge.manager.AuthenticatorBridgeManager
import com.bitwarden.ui.platform.base.BaseViewModel
import com.bitwarden.ui.platform.base.util.isBase32
import com.bitwarden.ui.util.Text
import com.bitwarden.ui.util.asText
import dagger.hilt.android.lifecycle.HiltViewModel

View File

@@ -9,10 +9,10 @@ import com.bitwarden.authenticator.data.authenticator.repository.AuthenticatorRe
import com.bitwarden.authenticator.data.authenticator.repository.model.TotpCodeResult
import com.bitwarden.authenticator.data.authenticator.repository.util.isSyncWithBitwardenEnabled
import com.bitwarden.authenticator.data.platform.repository.SettingsRepository
import com.bitwarden.authenticator.ui.platform.base.util.isBase32
import com.bitwarden.authenticator.ui.platform.feature.settings.data.model.DefaultSaveOption
import com.bitwarden.authenticatorbridge.manager.AuthenticatorBridgeManager
import com.bitwarden.ui.platform.base.BaseViewModel
import com.bitwarden.ui.platform.base.util.isBase32
import com.bitwarden.ui.util.Text
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.update

View File

@@ -9,11 +9,11 @@ import com.bitwarden.authenticator.data.authenticator.repository.AuthenticatorRe
import com.bitwarden.authenticator.data.authenticator.repository.model.SharedVerificationCodesState
import com.bitwarden.authenticator.data.authenticator.repository.util.itemsOrEmpty
import com.bitwarden.authenticator.data.platform.manager.clipboard.BitwardenClipboardManager
import com.bitwarden.authenticator.ui.platform.base.util.removeDiacritics
import com.bitwarden.authenticator.ui.platform.components.model.IconData
import com.bitwarden.core.data.repository.model.DataState
import com.bitwarden.core.data.repository.util.SpecialCharWithPrecedenceComparator
import com.bitwarden.ui.platform.base.BaseViewModel
import com.bitwarden.ui.platform.base.util.removeDiacritics
import com.bitwarden.ui.util.Text
import com.bitwarden.ui.util.asText
import dagger.hilt.android.lifecycle.HiltViewModel

View File

@@ -1,82 +0,0 @@
package com.bitwarden.authenticator.ui.platform.base.util
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.text.AnnotatedString
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.rememberTextMeasurer
import java.text.Normalizer
import kotlin.math.floor
/**
* This character takes up no space but can be used to ensure a string is not empty. It can also
* be used to insert "safe" line-break positions in a string.
*
* Note: Is a string only contains this charactor, it is _not_ considered blank.
*/
const val ZERO_WIDTH_CHARACTER: String = "\u200B"
/**
* Returns the original [String] only if:
*
* - it is non-null
* - it is not blank (where blank refers to empty strings of those containing only white space)
*
* Otherwise `null` is returned.
*/
fun String?.orNullIfBlank(): String? = this?.takeUnless { it.isBlank() }
/**
* Returns a new [String] that includes line breaks after [widthPx] worth of text. This is useful
* for long values that need to smoothly flow onto the next line without the OS inserting line
* breaks earlier at special characters.
*
* Note that the internal calculation used assumes that [monospacedTextStyle] is based on a
* monospaced font like Roboto Mono.
*/
@Composable
fun String.withLineBreaksAtWidth(
widthPx: Float,
monospacedTextStyle: TextStyle,
): String {
val measurer = rememberTextMeasurer()
return remember(this, widthPx, monospacedTextStyle) {
val characterSizePx = measurer
.measure("*", monospacedTextStyle)
.size
.width
val perLineCharacterLimit = floor(widthPx / characterSizePx).toInt()
if (widthPx > 0) {
this
.chunked(perLineCharacterLimit)
.joinToString(separator = "\n")
} else {
this
}
}
}
/**
* Returns the [String] as an [AnnotatedString].
*/
fun String.toAnnotatedString(): AnnotatedString = AnnotatedString(text = this)
/**
* Normalizes the [String] by removing diacritics, such as an umlaut.
*
* Example: áéíóů --> aeiou
*/
fun String.removeDiacritics(): String =
"\\p{InCombiningDiacriticalMarks}+"
.toRegex()
.replace(
Normalizer.normalize(this, Normalizer.Form.NFKD),
"",
)
/**
* Checks if a string is using base32 digits.
*/
fun String.isBase32(): Boolean {
val regex = ("^[A-Z2-7]+=*$").toRegex()
return regex.matches(this)
}

View File

@@ -18,9 +18,9 @@ import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.text.input.VisualTransformation
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import com.bitwarden.authenticator.ui.platform.base.util.withLineBreaksAtWidth
import com.bitwarden.authenticator.ui.platform.components.model.IconResource
import com.bitwarden.ui.platform.base.util.toPx
import com.bitwarden.ui.platform.base.util.withLineBreaksAtWidth
/**
* Component that allows the user to input text. This composable will manage the state of

View File

@@ -6,12 +6,12 @@ import androidx.compose.ui.semantics.semantics
import androidx.compose.ui.semantics.testTag
import androidx.compose.ui.text.input.KeyboardType
import com.bitwarden.authenticator.R
import com.bitwarden.authenticator.ui.platform.base.util.ZERO_WIDTH_CHARACTER
import com.bitwarden.authenticator.ui.platform.base.util.orNullIfBlank
import com.bitwarden.authenticator.ui.platform.components.field.BitwardenTextFieldWithActions
import com.bitwarden.authenticator.ui.platform.components.icon.BitwardenIconButtonWithResource
import com.bitwarden.authenticator.ui.platform.components.model.IconResource
import com.bitwarden.authenticator.ui.platform.components.util.rememberVectorPainter
import com.bitwarden.ui.platform.base.util.ZERO_WIDTH_CHARACTER
import com.bitwarden.ui.platform.base.util.orNullIfBlank
/**
* Displays a stepper that allows the user to increment and decrement an int value.