mirror of
https://github.com/bitwarden/android.git
synced 2026-04-28 20:08:27 -05:00
[PM-21359] Migrate StringExtensions to ui module (#5202)
This commit is contained in:
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user