diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/MainViewModel.kt b/app/src/main/kotlin/com/x8bit/bitwarden/MainViewModel.kt index 4e6d11ca59..de17074d38 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/MainViewModel.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/MainViewModel.kt @@ -6,6 +6,7 @@ import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.viewModelScope import com.bitwarden.ui.platform.base.BaseViewModel import com.bitwarden.ui.platform.feature.settings.appearance.model.AppTheme +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText import com.bitwarden.vault.CipherView @@ -452,7 +453,8 @@ class MainViewModel @Inject constructor( message = emailTokenResult .message ?.asText() - ?: R.string.there_was_an_issue_validating_the_registration_token + ?: BitwardenString + .there_was_an_issue_validating_the_registration_token .asText(), ), ) diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/auth/manager/AuthRequestNotificationManagerImpl.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/auth/manager/AuthRequestNotificationManagerImpl.kt index 2123d2e8ac..6831137017 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/auth/manager/AuthRequestNotificationManagerImpl.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/auth/manager/AuthRequestNotificationManagerImpl.kt @@ -10,7 +10,7 @@ import androidx.core.app.NotificationManagerCompat import com.bitwarden.annotation.OmitFromCoverage import com.bitwarden.data.manager.DispatcherManager import com.bitwarden.ui.platform.resource.BitwardenDrawable -import com.x8bit.bitwarden.R +import com.bitwarden.ui.platform.resource.BitwardenString import com.x8bit.bitwarden.data.auth.datasource.disk.AuthDiskSource import com.x8bit.bitwarden.data.auth.util.createPasswordlessRequestDataIntent import com.x8bit.bitwarden.data.autofill.util.toPendingIntentMutabilityFlag @@ -49,14 +49,14 @@ class AuthRequestNotificationManagerImpl( NOTIFICATION_CHANNEL_ID, NotificationManagerCompat.IMPORTANCE_DEFAULT, ) - .setName(context.getString(R.string.pending_log_in_requests)) + .setName(context.getString(BitwardenString.pending_log_in_requests)) .build(), ) if (!notificationManager.areNotificationsEnabled(NOTIFICATION_CHANNEL_ID)) return // Create the notification val builder = NotificationCompat.Builder(context, NOTIFICATION_CHANNEL_ID) .setContentIntent(createContentIntent(data)) - .setContentTitle(context.getString(R.string.log_in_requested)) + .setContentTitle(context.getString(BitwardenString.log_in_requested)) .setContentText( authDiskSource .userState @@ -64,8 +64,8 @@ class AuthRequestNotificationManagerImpl( ?.get(data.userId) ?.profile ?.email - ?.let { context.getString(R.string.confim_log_in_attemp_for_x, it) } - ?: context.getString(R.string.confirm_log_in), + ?.let { context.getString(BitwardenString.confim_log_in_attemp_for_x, it) } + ?: context.getString(BitwardenString.confirm_log_in), ) .setSmallIcon(BitwardenDrawable.ic_notification) .setColor(Color.White.value.toInt()) diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/auth/manager/UserLogoutManagerImpl.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/auth/manager/UserLogoutManagerImpl.kt index 92c2d952d5..361ab1282f 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/auth/manager/UserLogoutManagerImpl.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/auth/manager/UserLogoutManagerImpl.kt @@ -4,7 +4,7 @@ import androidx.annotation.StringRes import com.bitwarden.core.data.manager.toast.ToastManager import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow import com.bitwarden.data.manager.DispatcherManager -import com.x8bit.bitwarden.R +import com.bitwarden.ui.platform.resource.BitwardenString import com.x8bit.bitwarden.data.auth.datasource.disk.AuthDiskSource import com.x8bit.bitwarden.data.auth.manager.model.LogoutEvent import com.x8bit.bitwarden.data.auth.repository.model.LogoutReason @@ -48,7 +48,7 @@ class UserLogoutManagerImpl( Timber.d("logout reason=$reason") val isExpired = reason == LogoutReason.SecurityStamp if (isExpired) { - showToast(message = R.string.login_expired) + showToast(message = BitwardenString.login_expired) } val ableToSwitchToNewAccount = switchUserIfAvailable( @@ -70,7 +70,7 @@ class UserLogoutManagerImpl( Timber.d("softLogout reason=$reason") val isExpired = reason == LogoutReason.SecurityStamp if (isExpired) { - showToast(message = R.string.login_expired) + showToast(message = BitwardenString.login_expired) } authDiskSource.storeAccountTokens( userId = userId, @@ -140,7 +140,7 @@ class UserLogoutManagerImpl( // Check if there is a new active user return if (updatedAccounts.isNotEmpty()) { if (currentUserId == currentUserState.activeUserId && !isExpired) { - showToast(message = R.string.account_switched_automatically) + showToast(message = BitwardenString.account_switched_automatically) } // If we logged out a non-active user, we want to leave the active user unchanged. diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/autofill/accessibility/processor/BitwardenAccessibilityProcessorImpl.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/autofill/accessibility/processor/BitwardenAccessibilityProcessorImpl.kt index 0f51fcb89c..532d1531fb 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/autofill/accessibility/processor/BitwardenAccessibilityProcessorImpl.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/autofill/accessibility/processor/BitwardenAccessibilityProcessorImpl.kt @@ -6,7 +6,7 @@ import android.view.accessibility.AccessibilityEvent import android.view.accessibility.AccessibilityNodeInfo import android.widget.Toast import com.bitwarden.core.data.manager.toast.ToastManager -import com.x8bit.bitwarden.R +import com.bitwarden.ui.platform.resource.BitwardenString import com.x8bit.bitwarden.data.autofill.accessibility.manager.AccessibilityAutofillManager import com.x8bit.bitwarden.data.autofill.accessibility.manager.LauncherPackageNameManager import com.x8bit.bitwarden.data.autofill.accessibility.model.AccessibilityAction @@ -113,7 +113,7 @@ class BitwardenAccessibilityProcessorImpl( } ?: run { toastManager.show( - messageId = R.string.autofill_tile_uri_not_found, + messageId = BitwardenString.autofill_tile_uri_not_found, duration = Toast.LENGTH_LONG, ) } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/autofill/manager/AutofillTotpManagerImpl.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/autofill/manager/AutofillTotpManagerImpl.kt index bcad86dab9..197ab65613 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/autofill/manager/AutofillTotpManagerImpl.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/autofill/manager/AutofillTotpManagerImpl.kt @@ -1,8 +1,8 @@ package com.x8bit.bitwarden.data.autofill.manager +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.asText import com.bitwarden.vault.CipherView -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.auth.repository.AuthRepository import com.x8bit.bitwarden.data.platform.manager.clipboard.BitwardenClipboardManager import com.x8bit.bitwarden.data.platform.repository.SettingsRepository @@ -34,7 +34,7 @@ class AutofillTotpManagerImpl( if (totpResult is GenerateTotpResult.Success) { clipboardManager.setText( text = totpResult.code, - toastDescriptorOverride = R.string.verification_code_totp.asText(), + toastDescriptorOverride = BitwardenString.verification_code_totp.asText(), ) } } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/credentials/builder/CredentialEntryBuilderImpl.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/credentials/builder/CredentialEntryBuilderImpl.kt index e58691ce8f..7924ffbef5 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/credentials/builder/CredentialEntryBuilderImpl.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/credentials/builder/CredentialEntryBuilderImpl.kt @@ -9,8 +9,8 @@ import androidx.credentials.provider.PasswordCredentialEntry import androidx.credentials.provider.PublicKeyCredentialEntry import com.bitwarden.fido.Fido2CredentialAutofillView import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.vault.CipherListView -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.autofill.util.login import com.x8bit.bitwarden.data.credentials.processor.GET_PASSKEY_INTENT import com.x8bit.bitwarden.data.credentials.processor.GET_PASSWORD_INTENT @@ -71,7 +71,7 @@ class CredentialEntryBuilderImpl( .Builder( context = context, username = fido2AutofillView.userNameForUi - ?: context.getString(R.string.no_username), + ?: context.getString(BitwardenString.no_username), pendingIntent = intentManager .createFido2GetCredentialPendingIntent( action = GET_PASSKEY_INTENT, @@ -111,7 +111,7 @@ class CredentialEntryBuilderImpl( .Builder( context = context, username = cipherView.login?.username - ?: context.getString(R.string.no_username), + ?: context.getString(BitwardenString.no_username), pendingIntent = intentManager .createPasswordGetCredentialPendingIntent( action = GET_PASSWORD_INTENT, diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/credentials/processor/CredentialProviderProcessorImpl.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/credentials/processor/CredentialProviderProcessorImpl.kt index fbc4592114..4a10a0b8c9 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/credentials/processor/CredentialProviderProcessorImpl.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/credentials/processor/CredentialProviderProcessorImpl.kt @@ -27,7 +27,7 @@ import androidx.credentials.provider.CreateEntry import androidx.credentials.provider.ProviderClearCredentialStateRequest import com.bitwarden.core.util.isBuildVersionAtLeast import com.bitwarden.data.manager.DispatcherManager -import com.x8bit.bitwarden.R +import com.bitwarden.ui.platform.resource.BitwardenString import com.x8bit.bitwarden.data.auth.repository.AuthRepository import com.x8bit.bitwarden.data.auth.repository.model.UserState import com.x8bit.bitwarden.data.credentials.manager.BitwardenCredentialManager @@ -106,7 +106,7 @@ class CredentialProviderProcessorImpl( // Return an unlock action if the current account is locked. if (!userState.activeAccount.isVaultUnlocked) { val authenticationAction = AuthenticationAction( - title = context.getString(R.string.unlock), + title = context.getString(BitwardenString.unlock), pendingIntent = intentManager.createFido2UnlockPendingIntent( action = UNLOCK_ACCOUNT_INTENT, userId = userState.activeUserId, @@ -193,7 +193,7 @@ class CredentialProviderProcessorImpl( ) .setDescription( context.getString( - R.string.your_passkey_will_be_saved_to_your_bitwarden_vault_for_x, + BitwardenString.your_passkey_will_be_saved_to_your_bitwarden_vault_for_x, accountName, ), ) diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/manager/clipboard/BitwardenClipboardManagerImpl.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/manager/clipboard/BitwardenClipboardManagerImpl.kt index 79c19e51dd..25f6abc8c2 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/manager/clipboard/BitwardenClipboardManagerImpl.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/manager/clipboard/BitwardenClipboardManagerImpl.kt @@ -15,8 +15,8 @@ import com.bitwarden.annotation.OmitFromCoverage import com.bitwarden.core.data.manager.toast.ToastManager import com.bitwarden.core.util.isBuildVersionAtLeast import com.bitwarden.ui.platform.base.util.toAnnotatedString +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.platform.repository.SettingsRepository import java.util.concurrent.TimeUnit @@ -54,10 +54,10 @@ class BitwardenClipboardManagerImpl( ) if (!isBuildVersionAtLeast(version = Build.VERSION_CODES.TIRAMISU)) { val descriptor = toastDescriptorOverride - ?.let { context.resources.getString(R.string.value_has_been_copied, it) } + ?.let { context.resources.getString(BitwardenString.value_has_been_copied, it) } ?: context.resources.getString( - R.string.value_has_been_copied, - context.resources.getString(R.string.value), + BitwardenString.value_has_been_copied, + context.resources.getString(BitwardenString.value), ) toastManager.show(message = descriptor) } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/repository/util/ClearClipboardFrequencyUtils.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/repository/util/ClearClipboardFrequencyUtils.kt index d077788584..49ebd378f8 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/repository/util/ClearClipboardFrequencyUtils.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/repository/util/ClearClipboardFrequencyUtils.kt @@ -1,8 +1,8 @@ package com.x8bit.bitwarden.data.platform.repository.util +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.platform.repository.model.ClearClipboardFrequency /** @@ -10,12 +10,12 @@ import com.x8bit.bitwarden.data.platform.repository.model.ClearClipboardFrequenc */ val ClearClipboardFrequency.displayLabel: Text get() = when (this) { - ClearClipboardFrequency.NEVER -> R.string.never - ClearClipboardFrequency.TEN_SECONDS -> R.string.ten_seconds - ClearClipboardFrequency.TWENTY_SECONDS -> R.string.twenty_seconds - ClearClipboardFrequency.THIRTY_SECONDS -> R.string.thirty_seconds - ClearClipboardFrequency.ONE_MINUTE -> R.string.one_minute - ClearClipboardFrequency.TWO_MINUTES -> R.string.two_minutes - ClearClipboardFrequency.FIVE_MINUTES -> R.string.five_minutes + ClearClipboardFrequency.NEVER -> BitwardenString.never + ClearClipboardFrequency.TEN_SECONDS -> BitwardenString.ten_seconds + ClearClipboardFrequency.TWENTY_SECONDS -> BitwardenString.twenty_seconds + ClearClipboardFrequency.THIRTY_SECONDS -> BitwardenString.thirty_seconds + ClearClipboardFrequency.ONE_MINUTE -> BitwardenString.one_minute + ClearClipboardFrequency.TWO_MINUTES -> BitwardenString.two_minutes + ClearClipboardFrequency.FIVE_MINUTES -> BitwardenString.five_minutes } .asText() diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/tiles/BitwardenAutofillTileService.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/tiles/BitwardenAutofillTileService.kt index 3b87adcf21..e01f15cfee 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/tiles/BitwardenAutofillTileService.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/tiles/BitwardenAutofillTileService.kt @@ -10,8 +10,8 @@ import android.service.quicksettings.TileService import androidx.annotation.Keep import com.bitwarden.annotation.OmitFromCoverage import com.bitwarden.core.util.isBuildVersionAtLeast +import com.bitwarden.ui.platform.resource.BitwardenString import com.x8bit.bitwarden.AccessibilityActivity -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.autofill.accessibility.manager.AccessibilityAutofillManager import com.x8bit.bitwarden.data.autofill.accessibility.model.AccessibilityAction import com.x8bit.bitwarden.data.autofill.accessibility.util.isAccessibilityServiceEnabled @@ -62,8 +62,8 @@ class BitwardenAutofillTileService : TileService() { private fun getAccessibilityServiceRequiredDialog(): Dialog = AlertDialog.Builder(this) - .setMessage(R.string.autofill_tile_accessibility_required) + .setMessage(BitwardenString.autofill_tile_accessibility_required) .setCancelable(true) - .setPositiveButton(R.string.okay) { dialog, _ -> dialog.cancel() } + .setPositiveButton(BitwardenString.okay) { dialog, _ -> dialog.cancel() } .create() } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/accountsetup/SetupAutofillScreen.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/accountsetup/SetupAutofillScreen.kt index ab3b5bb446..9b808735d8 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/accountsetup/SetupAutofillScreen.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/accountsetup/SetupAutofillScreen.kt @@ -40,9 +40,9 @@ import com.bitwarden.ui.platform.components.toggle.BitwardenSwitch import com.bitwarden.ui.platform.components.util.rememberVectorPainter import com.bitwarden.ui.platform.model.WindowSize import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme import com.bitwarden.ui.platform.util.rememberWindowSize -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.auth.feature.accountsetup.handlers.rememberSetupAutoFillHandler import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenBasicDialog import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenTwoButtonDialog @@ -80,17 +80,19 @@ fun SetupAutoFillScreen( is SetupAutoFillDialogState.AutoFillFallbackDialog -> { BitwardenBasicDialog( title = null, - message = stringResource(id = R.string.bitwarden_autofill_go_to_settings), + message = stringResource(id = BitwardenString.bitwarden_autofill_go_to_settings), onDismissRequest = handler.onDismissDialog, ) } is SetupAutoFillDialogState.TurnOnLaterDialog -> { BitwardenTwoButtonDialog( - title = stringResource(R.string.turn_on_autofill_later), - message = stringResource(R.string.return_to_complete_this_step_anytime_in_settings), - confirmButtonText = stringResource(id = R.string.confirm), - dismissButtonText = stringResource(id = R.string.cancel), + title = stringResource(BitwardenString.turn_on_autofill_later), + message = stringResource( + id = BitwardenString.return_to_complete_this_step_anytime_in_settings, + ), + confirmButtonText = stringResource(id = BitwardenString.confirm), + dismissButtonText = stringResource(id = BitwardenString.cancel), onConfirmClick = handler.onConfirmTurnOnLaterClick, onDismissClick = handler.onDismissDialog, onDismissRequest = handler.onDismissDialog, @@ -109,9 +111,9 @@ fun SetupAutoFillScreen( BitwardenTopAppBar( title = stringResource( id = if (state.isInitialSetup) { - R.string.account_setup + BitwardenString.account_setup } else { - R.string.turn_on_autofill + BitwardenString.turn_on_autofill }, ), scrollBehavior = scrollBehavior, @@ -120,7 +122,9 @@ fun SetupAutoFillScreen( } else { NavigationIcon( navigationIcon = rememberVectorPainter(id = BitwardenDrawable.ic_close), - navigationIconContentDescription = stringResource(id = R.string.close), + navigationIconContentDescription = stringResource( + id = BitwardenString.close, + ), onNavigationIconClick = remember(viewModel) { { viewModel.trySendAction(SetupAutoFillAction.CloseClick) @@ -164,7 +168,7 @@ private fun SetupAutoFillContent( Spacer(modifier = Modifier.height(24.dp)) BitwardenSwitch( label = stringResource( - R.string.autofill_services, + BitwardenString.autofill_services, ), isChecked = state.autofillEnabled, onCheckedChange = onAutofillServiceChanged, @@ -175,7 +179,7 @@ private fun SetupAutoFillContent( ) Spacer(modifier = Modifier.height(24.dp)) BitwardenFilledButton( - label = stringResource(id = R.string.continue_text), + label = stringResource(id = BitwardenString.continue_text), onClick = onContinueClick, modifier = Modifier .fillMaxWidth() @@ -184,7 +188,7 @@ private fun SetupAutoFillContent( Spacer(modifier = Modifier.height(12.dp)) if (state.isInitialSetup) { BitwardenTextButton( - label = stringResource(R.string.turn_on_later), + label = stringResource(BitwardenString.turn_on_later), onClick = onTurnOnLaterClick, modifier = Modifier .fillMaxWidth() @@ -243,14 +247,14 @@ private fun OrderedHeaderContent() { horizontalAlignment = Alignment.CenterHorizontally, ) { Text( - text = stringResource(R.string.turn_on_autofill), + text = stringResource(BitwardenString.turn_on_autofill), style = BitwardenTheme.typography.titleMedium, color = BitwardenTheme.colorScheme.text.primary, textAlign = TextAlign.Center, ) Spacer(modifier = Modifier.height(8.dp)) Text( - text = stringResource(R.string.use_autofill_to_log_into_your_accounts), + text = stringResource(BitwardenString.use_autofill_to_log_into_your_accounts), style = BitwardenTheme.typography.bodyMedium, color = BitwardenTheme.colorScheme.text.primary, textAlign = TextAlign.Center, diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/accountsetup/SetupCompleteScreen.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/accountsetup/SetupCompleteScreen.kt index 8b45f241e1..efbee686da 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/accountsetup/SetupCompleteScreen.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/accountsetup/SetupCompleteScreen.kt @@ -29,8 +29,8 @@ import com.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar import com.bitwarden.ui.platform.components.button.BitwardenFilledButton import com.bitwarden.ui.platform.components.util.rememberVectorPainter import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.platform.components.scaffold.BitwardenScaffold /** @@ -55,7 +55,7 @@ fun SetupCompleteScreen( topBar = { BitwardenTopAppBar( scrollBehavior = scrollBehavior, - title = stringResource(R.string.account_setup), + title = stringResource(BitwardenString.account_setup), navigationIcon = null, ) }, @@ -89,7 +89,7 @@ private fun SetupCompleteContent( ) Spacer(Modifier.height(24.dp)) Text( - text = stringResource(R.string.youre_all_set), + text = stringResource(BitwardenString.youre_all_set), style = BitwardenTheme.typography.titleMedium, color = BitwardenTheme.colorScheme.text.primary, textAlign = TextAlign.Center, @@ -99,7 +99,7 @@ private fun SetupCompleteContent( ) Spacer(Modifier.height(8.dp)) Text( - text = stringResource(R.string.what_bitwarden_has_to_offer), + text = stringResource(BitwardenString.what_bitwarden_has_to_offer), style = BitwardenTheme.typography.bodyMedium, color = BitwardenTheme.colorScheme.text.primary, textAlign = TextAlign.Center, @@ -109,7 +109,7 @@ private fun SetupCompleteContent( ) Spacer(Modifier.height(24.dp)) BitwardenFilledButton( - label = stringResource(R.string.continue_text), + label = stringResource(BitwardenString.continue_text), onClick = onContinue, modifier = Modifier .fillMaxWidth() diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/accountsetup/SetupUnlockScreen.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/accountsetup/SetupUnlockScreen.kt index 41d2942afa..17d1c1d17a 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/accountsetup/SetupUnlockScreen.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/accountsetup/SetupUnlockScreen.kt @@ -43,9 +43,9 @@ import com.bitwarden.ui.platform.components.model.CardStyle import com.bitwarden.ui.platform.components.util.rememberVectorPainter import com.bitwarden.ui.platform.model.WindowSize import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme import com.bitwarden.ui.platform.util.rememberWindowSize -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.auth.feature.accountsetup.handlers.SetupUnlockHandler import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenBasicDialog import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenLoadingDialog @@ -107,9 +107,9 @@ fun SetupUnlockScreen( BitwardenTopAppBar( title = stringResource( id = if (state.isInitialSetup) { - R.string.account_setup + BitwardenString.account_setup } else { - R.string.set_up_unlock + BitwardenString.set_up_unlock }, ), scrollBehavior = scrollBehavior, @@ -118,7 +118,9 @@ fun SetupUnlockScreen( } else { NavigationIcon( navigationIcon = rememberVectorPainter(id = BitwardenDrawable.ic_close), - navigationIconContentDescription = stringResource(id = R.string.close), + navigationIconContentDescription = stringResource( + id = BitwardenString.close, + ), onNavigationIconClick = remember(viewModel) { { viewModel.trySendAction(SetupUnlockAction.CloseClick) @@ -185,7 +187,7 @@ private fun SetupUnlockScreenContent( Spacer(modifier = Modifier.height(height = 24.dp)) BitwardenFilledButton( - label = stringResource(id = R.string.continue_text), + label = stringResource(id = BitwardenString.continue_text), onClick = handler.onContinueClick, isEnabled = state.isContinueButtonEnabled, modifier = Modifier @@ -218,12 +220,12 @@ private fun SetUpLaterButton( if (displayConfirmation) { @Suppress("MaxLineLength") BitwardenTwoButtonDialog( - title = stringResource(id = R.string.set_up_unlock_later), + title = stringResource(id = BitwardenString.set_up_unlock_later), message = stringResource( - id = R.string.you_can_return_to_complete_this_step_anytime_from_account_security_in_settings, + id = BitwardenString.you_can_return_to_complete_this_step_anytime_from_account_security_in_settings, ), - confirmButtonText = stringResource(id = R.string.confirm), - dismissButtonText = stringResource(id = R.string.cancel), + confirmButtonText = stringResource(id = BitwardenString.confirm), + dismissButtonText = stringResource(id = BitwardenString.cancel), onConfirmClick = { onConfirmClick() displayConfirmation = false @@ -234,7 +236,7 @@ private fun SetUpLaterButton( } BitwardenTextButton( - label = stringResource(id = R.string.set_up_later), + label = stringResource(id = BitwardenString.set_up_later), onClick = { displayConfirmation = true }, modifier = modifier.testTag(tag = "SetUpLaterButton"), ) @@ -254,7 +256,7 @@ private fun ColumnScope.SetupUnlockHeaderCompact() { Spacer(modifier = Modifier.height(height = 24.dp)) Text( - text = stringResource(id = R.string.set_up_unlock), + text = stringResource(id = BitwardenString.set_up_unlock), style = BitwardenTheme.typography.titleMedium, color = BitwardenTheme.colorScheme.text.primary, textAlign = TextAlign.Center, @@ -267,7 +269,7 @@ private fun ColumnScope.SetupUnlockHeaderCompact() { @Suppress("MaxLineLength") Text( text = stringResource( - id = R.string.set_up_biometrics_or_choose_a_pin_code_to_quickly_access_your_vault_and_autofill_your_logins, + id = BitwardenString.set_up_biometrics_or_choose_a_pin_code_to_quickly_access_your_vault_and_autofill_your_logins, ), style = BitwardenTheme.typography.bodyMedium, color = BitwardenTheme.colorScheme.text.primary, @@ -300,7 +302,7 @@ private fun SetupUnlockHeaderMedium( modifier = Modifier.align(alignment = Alignment.CenterVertically), ) { Text( - text = stringResource(id = R.string.set_up_unlock), + text = stringResource(id = BitwardenString.set_up_unlock), style = BitwardenTheme.typography.titleMedium, color = BitwardenTheme.colorScheme.text.primary, textAlign = TextAlign.Center, @@ -311,7 +313,7 @@ private fun SetupUnlockHeaderMedium( @Suppress("MaxLineLength") Text( text = stringResource( - id = R.string.set_up_biometrics_or_choose_a_pin_code_to_quickly_access_your_vault_and_autofill_your_logins, + id = BitwardenString.set_up_biometrics_or_choose_a_pin_code_to_quickly_access_your_vault_and_autofill_your_logins, ), style = BitwardenTheme.typography.bodyMedium, color = BitwardenTheme.colorScheme.text.primary, diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/accountsetup/SetupUnlockViewModel.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/accountsetup/SetupUnlockViewModel.kt index cb59ceea2c..0911927b84 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/accountsetup/SetupUnlockViewModel.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/accountsetup/SetupUnlockViewModel.kt @@ -4,9 +4,9 @@ import android.os.Parcelable import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.viewModelScope import com.bitwarden.ui.platform.base.BaseViewModel +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.auth.datasource.disk.model.OnboardingStatus import com.x8bit.bitwarden.data.auth.repository.AuthRepository import com.x8bit.bitwarden.data.platform.manager.BiometricsEncryptionManager @@ -112,8 +112,8 @@ class SetupUnlockViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = SetupUnlockState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.generic_error_message.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.generic_error_message.asText(), ), ) } @@ -141,7 +141,7 @@ class SetupUnlockViewModel @Inject constructor( ) { mutableStateFlow.update { it.copy( - dialogState = SetupUnlockState.DialogState.Loading(R.string.saving.asText()), + dialogState = SetupUnlockState.DialogState.Loading(BitwardenString.saving.asText()), isUnlockWithBiometricsEnabled = true, ) } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/checkemail/CheckEmailScreen.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/checkemail/CheckEmailScreen.kt index 954da0b6c7..3666fbc048 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/checkemail/CheckEmailScreen.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/checkemail/CheckEmailScreen.kt @@ -38,8 +38,8 @@ import com.bitwarden.ui.platform.components.button.BitwardenFilledButton import com.bitwarden.ui.platform.components.button.BitwardenOutlinedButton import com.bitwarden.ui.platform.components.util.rememberVectorPainter import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.auth.feature.checkemail.handlers.rememberCheckEmailHandler import com.x8bit.bitwarden.ui.platform.components.scaffold.BitwardenScaffold import com.x8bit.bitwarden.ui.platform.composition.LocalIntentManager @@ -77,10 +77,10 @@ fun CheckEmailScreen( .nestedScroll(scrollBehavior.nestedScrollConnection), topBar = { BitwardenTopAppBar( - title = stringResource(id = R.string.create_account), + title = stringResource(id = BitwardenString.create_account), scrollBehavior = scrollBehavior, navigationIcon = rememberVectorPainter(id = BitwardenDrawable.ic_back), - navigationIconContentDescription = stringResource(id = R.string.back), + navigationIconContentDescription = stringResource(id = BitwardenString.back), onNavigationIconClick = handler.onBackClick, ) }, @@ -126,7 +126,7 @@ private fun CheckEmailContent( ) Spacer(modifier = Modifier.height(32.dp)) Text( - text = stringResource(id = R.string.check_your_email), + text = stringResource(id = BitwardenString.check_your_email), textAlign = TextAlign.Center, style = BitwardenTheme.typography.titleMedium, color = BitwardenTheme.colorScheme.text.primary, @@ -139,7 +139,7 @@ private fun CheckEmailContent( Text( text = annotatedStringResource( - id = R.string.we_sent_an_email_to, + id = BitwardenString.we_sent_an_email_to, args = arrayOf(email), emphasisHighlightStyle = SpanStyle( color = BitwardenTheme.colorScheme.text.primary, @@ -158,7 +158,7 @@ private fun CheckEmailContent( @Suppress("MaxLineLength") Text( text = stringResource( - R.string.select_the_link_in_the_email_to_verify_your_email_address_and_continue_creating_your_account, + BitwardenString.select_the_link_in_the_email_to_verify_your_email_address_and_continue_creating_your_account, ), style = BitwardenTheme.typography.bodyMedium, color = BitwardenTheme.colorScheme.text.primary, @@ -170,7 +170,7 @@ private fun CheckEmailContent( ) Spacer(modifier = Modifier.height(32.dp)) BitwardenFilledButton( - label = stringResource(id = R.string.open_email_app), + label = stringResource(id = BitwardenString.open_email_app), onClick = onOpenEmailAppClick, modifier = Modifier .testTag("OpenEmailApp") @@ -179,7 +179,7 @@ private fun CheckEmailContent( ) Spacer(modifier = Modifier.height(12.dp)) BitwardenOutlinedButton( - label = stringResource(R.string.change_email_address), + label = stringResource(BitwardenString.change_email_address), onClick = onChangeEmailClick, modifier = Modifier .fillMaxWidth() diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/completeregistration/CompleteRegistrationScreen.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/completeregistration/CompleteRegistrationScreen.kt index 305600db15..ebd1df19a6 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/completeregistration/CompleteRegistrationScreen.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/completeregistration/CompleteRegistrationScreen.kt @@ -44,9 +44,9 @@ import com.bitwarden.ui.platform.components.toggle.BitwardenSwitch import com.bitwarden.ui.platform.components.util.rememberVectorPainter import com.bitwarden.ui.platform.model.WindowSize import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme import com.bitwarden.ui.platform.util.rememberWindowSize -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.auth.feature.completeregistration.handlers.CompleteRegistrationHandler import com.x8bit.bitwarden.ui.auth.feature.completeregistration.handlers.rememberCompleteRegistrationHandler import com.x8bit.bitwarden.ui.platform.components.card.BitwardenActionCardSmall @@ -115,8 +115,8 @@ fun CompleteRegistrationScreen( BitwardenTwoButtonDialog( title = dialog.title(), message = dialog.message(), - confirmButtonText = stringResource(id = R.string.yes), - dismissButtonText = stringResource(id = R.string.no), + confirmButtonText = stringResource(id = BitwardenString.yes), + dismissButtonText = stringResource(id = BitwardenString.no), onConfirmClick = handler.onContinueWithBreachedPasswordClick, onDismissClick = handler.onDismissErrorDialog, onDismissRequest = handler.onDismissErrorDialog, @@ -124,7 +124,7 @@ fun CompleteRegistrationScreen( } CompleteRegistrationDialog.Loading -> { - BitwardenLoadingDialog(text = stringResource(id = R.string.create_account)) + BitwardenLoadingDialog(text = stringResource(id = BitwardenString.create_account)) } null -> Unit @@ -137,10 +137,10 @@ fun CompleteRegistrationScreen( .nestedScroll(scrollBehavior.nestedScrollConnection), topBar = { BitwardenTopAppBar( - title = stringResource(id = R.string.create_account), + title = stringResource(id = BitwardenString.create_account), scrollBehavior = scrollBehavior, navigationIcon = rememberVectorPainter(id = BitwardenDrawable.ic_back), - navigationIconContentDescription = stringResource(id = R.string.back), + navigationIconContentDescription = stringResource(id = BitwardenString.back), onNavigationIconClick = handler.onBackClick, ) }, @@ -159,7 +159,7 @@ fun CompleteRegistrationScreen( isCheckDataBreachesToggled = state.isCheckDataBreachesToggled, handler = handler, nextButtonEnabled = state.validSubmissionReady, - callToActionText = stringResource(R.string.next), + callToActionText = stringResource(BitwardenString.next), minimumPasswordLength = state.minimumPasswordLength, ) Spacer(modifier = Modifier.height(height = 16.dp)) @@ -194,8 +194,8 @@ private fun CompleteRegistrationContent( Spacer(modifier = Modifier.height(24.dp)) BitwardenActionCardSmall( actionIcon = rememberVectorPainter(id = BitwardenDrawable.ic_question_circle), - actionText = stringResource(id = R.string.what_makes_a_password_strong), - callToActionText = stringResource(id = R.string.learn_more), + actionText = stringResource(id = BitwardenString.what_makes_a_password_strong), + callToActionText = stringResource(id = BitwardenString.learn_more), callToActionTextColor = BitwardenTheme.colorScheme.text.interaction, colors = bitwardenCardColors( containerColor = BitwardenTheme.colorScheme.background.primary, @@ -209,7 +209,7 @@ private fun CompleteRegistrationContent( var showPassword by rememberSaveable { mutableStateOf(false) } BitwardenPasswordField( - label = stringResource(id = R.string.master_password_required), + label = stringResource(id = BitwardenString.master_password_required), showPassword = showPassword, showPasswordChange = { showPassword = it }, value = passwordInput, @@ -231,7 +231,7 @@ private fun CompleteRegistrationContent( .standardHorizontalMargin(), ) BitwardenPasswordField( - label = stringResource(id = R.string.retype_master_password_required), + label = stringResource(id = BitwardenString.retype_master_password_required), value = confirmPasswordInput, showPassword = showPassword, showPasswordChange = { showPassword = it }, @@ -245,14 +245,15 @@ private fun CompleteRegistrationContent( ) BitwardenTextField( label = stringResource( - id = R.string.master_password_hint_not_specified, + id = BitwardenString.master_password_hint_not_specified, ), value = passwordHintInput, onValueChange = handler.onPasswordHintChange, supportingContent = { Text( text = stringResource( - id = R.string.bitwarden_cannot_recover_a_lost_or_forgotten_master_password, + id = BitwardenString + .bitwarden_cannot_recover_a_lost_or_forgotten_master_password, ), style = BitwardenTheme.typography.bodySmall, color = BitwardenTheme.colorScheme.text.secondary, @@ -260,7 +261,7 @@ private fun CompleteRegistrationContent( ) BitwardenClickableText( label = stringResource( - id = R.string.learn_about_other_ways_to_prevent_account_lockout, + id = BitwardenString.learn_about_other_ways_to_prevent_account_lockout, ), onClick = handler.onLearnToPreventLockout, style = BitwardenTheme.typography.labelMedium, @@ -275,7 +276,9 @@ private fun CompleteRegistrationContent( ) Spacer(modifier = Modifier.height(height = 8.dp)) BitwardenSwitch( - label = stringResource(id = R.string.check_known_data_breaches_for_this_password), + label = stringResource( + id = BitwardenString.check_known_data_breaches_for_this_password, + ), isChecked = isCheckDataBreachesToggled, onCheckedChange = handler.onCheckDataBreachesToggle, cardStyle = CardStyle.Full, @@ -336,7 +339,7 @@ private fun OrderedHeaderContent() { horizontalAlignment = Alignment.CenterHorizontally, ) { Text( - text = stringResource(R.string.choose_your_master_password), + text = stringResource(BitwardenString.choose_your_master_password), style = BitwardenTheme.typography.titleMedium, color = BitwardenTheme.colorScheme.text.primary, textAlign = TextAlign.Center, @@ -344,7 +347,7 @@ private fun OrderedHeaderContent() { Spacer(modifier = Modifier.height(8.dp)) Text( text = stringResource( - R.string.choose_a_unique_and_strong_password_to_keep_your_information_safe, + BitwardenString.choose_a_unique_and_strong_password_to_keep_your_information_safe, ), style = BitwardenTheme.typography.bodyMedium, color = BitwardenTheme.colorScheme.text.primary, diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/completeregistration/CompleteRegistrationViewModel.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/completeregistration/CompleteRegistrationViewModel.kt index 585e442687..8302c4c086 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/completeregistration/CompleteRegistrationViewModel.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/completeregistration/CompleteRegistrationViewModel.kt @@ -5,9 +5,9 @@ import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.viewModelScope import com.bitwarden.ui.platform.base.BaseViewModel import com.bitwarden.ui.platform.base.util.isValidEmail +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.auth.datasource.disk.model.OnboardingStatus import com.x8bit.bitwarden.data.auth.datasource.sdk.model.PasswordStrength import com.x8bit.bitwarden.data.auth.repository.AuthRepository @@ -145,7 +145,7 @@ class CompleteRegistrationViewModel @Inject constructor( viewModelScope.launch { sendEvent( CompleteRegistrationEvent.ShowToast( - message = R.string.email_verified.asText(), + message = BitwardenString.email_verified.asText(), ), ) } @@ -188,9 +188,9 @@ class CompleteRegistrationViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialog = CompleteRegistrationDialog.Error( - title = R.string.an_error_has_occurred.asText(), + title = BitwardenString.an_error_has_occurred.asText(), message = registerAccountResult.errorMessage?.asText() - ?: R.string.generic_error_message.asText(), + ?: BitwardenString.generic_error_message.asText(), error = registerAccountResult.error, ), ) @@ -217,8 +217,8 @@ class CompleteRegistrationViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialog = CompleteRegistrationDialog.HaveIBeenPwned( - title = R.string.exposed_master_password.asText(), - message = R.string.password_found_in_a_data_breach_alert_description.asText(), + title = BitwardenString.exposed_master_password.asText(), + message = BitwardenString.password_found_in_a_data_breach_alert_description.asText(), ), ) } @@ -228,8 +228,8 @@ class CompleteRegistrationViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialog = CompleteRegistrationDialog.HaveIBeenPwned( - title = R.string.weak_and_exposed_master_password.asText(), - message = R.string.weak_password_identified_and_found_in_a_data_breach_alert_description.asText(), + title = BitwardenString.weak_and_exposed_master_password.asText(), + message = BitwardenString.weak_password_identified_and_found_in_a_data_breach_alert_description.asText(), ), ) } @@ -239,8 +239,8 @@ class CompleteRegistrationViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialog = CompleteRegistrationDialog.HaveIBeenPwned( - title = R.string.weak_master_password.asText(), - message = R.string.weak_password_identified_use_a_strong_password_to_protect_your_account.asText(), + title = BitwardenString.weak_master_password.asText(), + message = BitwardenString.weak_password_identified_use_a_strong_password_to_protect_your_account.asText(), ), ) } @@ -252,7 +252,7 @@ class CompleteRegistrationViewModel @Inject constructor( clearDialogState() sendEvent( CompleteRegistrationEvent.ShowToast( - message = R.string.account_created_success.asText(), + message = BitwardenString.account_created_success.asText(), ), ) @@ -307,9 +307,9 @@ class CompleteRegistrationViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialog = CompleteRegistrationDialog.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.validation_field_required - .asText(R.string.email_address.asText()), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.validation_field_required + .asText(BitwardenString.email_address.asText()), ), ) } @@ -319,8 +319,8 @@ class CompleteRegistrationViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialog = CompleteRegistrationDialog.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.invalid_email.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.invalid_email.asText(), ), ) } @@ -330,8 +330,8 @@ class CompleteRegistrationViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialog = CompleteRegistrationDialog.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.master_password_length_val_message_x + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.master_password_length_val_message_x .asText(MIN_PASSWORD_LENGTH), ), ) @@ -342,8 +342,8 @@ class CompleteRegistrationViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialog = CompleteRegistrationDialog.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.master_password_confirmation_val_message.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.master_password_confirmation_val_message.asText(), ), ) } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/completeregistration/PasswordStrengthIndicator.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/completeregistration/PasswordStrengthIndicator.kt index 3a1ae108db..015a64fc43 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/completeregistration/PasswordStrengthIndicator.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/completeregistration/PasswordStrengthIndicator.kt @@ -29,9 +29,9 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.bitwarden.ui.platform.components.util.rememberVectorPainter import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R /** * Draws a password indicator that displays password strength based on the given [state]. @@ -75,11 +75,11 @@ fun PasswordStrengthIndicator( ) val label = when (state) { PasswordStrengthState.NONE -> "".asText() - PasswordStrengthState.WEAK_1 -> R.string.weak.asText() - PasswordStrengthState.WEAK_2 -> R.string.weak.asText() - PasswordStrengthState.WEAK_3 -> R.string.weak.asText() - PasswordStrengthState.GOOD -> R.string.good.asText() - PasswordStrengthState.STRONG -> R.string.strong.asText() + PasswordStrengthState.WEAK_1 -> BitwardenString.weak.asText() + PasswordStrengthState.WEAK_2 -> BitwardenString.weak.asText() + PasswordStrengthState.WEAK_3 -> BitwardenString.weak.asText() + PasswordStrengthState.GOOD -> BitwardenString.good.asText() + PasswordStrengthState.STRONG -> BitwardenString.strong.asText() } Column( modifier = modifier, @@ -154,7 +154,7 @@ private fun MinimumCharacterCount( } Spacer(modifier = Modifier.width(2.dp)) Text( - text = stringResource(R.string.minimum_characters, minimumCharacterCount), + text = stringResource(BitwardenString.minimum_characters, minimumCharacterCount), color = BitwardenTheme.colorScheme.text.secondary, style = BitwardenTheme.typography.labelSmall, ) diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/createaccount/CreateAccountScreen.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/createaccount/CreateAccountScreen.kt index ebfbd08f1d..cad98ab98b 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/createaccount/CreateAccountScreen.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/createaccount/CreateAccountScreen.kt @@ -39,8 +39,8 @@ import com.bitwarden.ui.platform.components.model.CardStyle import com.bitwarden.ui.platform.components.toggle.BitwardenSwitch import com.bitwarden.ui.platform.components.util.rememberVectorPainter import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.auth.feature.completeregistration.PasswordStrengthIndicator import com.x8bit.bitwarden.ui.auth.feature.createaccount.CreateAccountAction.AcceptPoliciesToggle import com.x8bit.bitwarden.ui.auth.feature.createaccount.CreateAccountAction.CheckDataBreachesToggle @@ -120,8 +120,8 @@ fun CreateAccountScreen( BitwardenTwoButtonDialog( title = dialog.title(), message = dialog.message(), - confirmButtonText = stringResource(id = R.string.yes), - dismissButtonText = stringResource(id = R.string.no), + confirmButtonText = stringResource(id = BitwardenString.yes), + dismissButtonText = stringResource(id = BitwardenString.no), onConfirmClick = remember(viewModel) { { viewModel.trySendAction(ContinueWithBreachedPasswordClick) } }, @@ -135,7 +135,7 @@ fun CreateAccountScreen( } CreateAccountDialog.Loading -> { - BitwardenLoadingDialog(text = stringResource(id = R.string.create_account)) + BitwardenLoadingDialog(text = stringResource(id = BitwardenString.create_account)) } null -> Unit @@ -148,16 +148,16 @@ fun CreateAccountScreen( .nestedScroll(scrollBehavior.nestedScrollConnection), topBar = { BitwardenTopAppBar( - title = stringResource(id = R.string.create_account), + title = stringResource(id = BitwardenString.create_account), scrollBehavior = scrollBehavior, navigationIcon = rememberVectorPainter(id = BitwardenDrawable.ic_close), - navigationIconContentDescription = stringResource(id = R.string.close), + navigationIconContentDescription = stringResource(id = BitwardenString.close), onNavigationIconClick = remember(viewModel) { { viewModel.trySendAction(CloseClick) } }, actions = { BitwardenTextButton( - label = stringResource(id = R.string.submit), + label = stringResource(id = BitwardenString.submit), onClick = remember(viewModel) { { viewModel.trySendAction(SubmitClick) } }, @@ -174,7 +174,7 @@ fun CreateAccountScreen( ) { Spacer(modifier = Modifier.height(height = 12.dp)) BitwardenTextField( - label = stringResource(id = R.string.email_address), + label = stringResource(id = BitwardenString.email_address), value = state.emailInput, onValueChange = remember(viewModel) { { viewModel.trySendAction(EmailInputChange(it)) } @@ -189,7 +189,7 @@ fun CreateAccountScreen( Spacer(modifier = Modifier.height(height = 8.dp)) var showPassword by rememberSaveable { mutableStateOf(false) } BitwardenPasswordField( - label = stringResource(id = R.string.master_password), + label = stringResource(id = BitwardenString.master_password), showPassword = showPassword, showPasswordChange = { showPassword = it }, value = state.passwordInput, @@ -217,7 +217,7 @@ fun CreateAccountScreen( .standardHorizontalMargin(), ) BitwardenPasswordField( - label = stringResource(id = R.string.retype_master_password), + label = stringResource(id = BitwardenString.retype_master_password), value = state.confirmPasswordInput, showPassword = showPassword, showPasswordChange = { showPassword = it }, @@ -232,12 +232,13 @@ fun CreateAccountScreen( .standardHorizontalMargin(), ) BitwardenTextField( - label = stringResource(id = R.string.master_password_hint), + label = stringResource(id = BitwardenString.master_password_hint), value = state.passwordHintInput, onValueChange = remember(viewModel) { { viewModel.trySendAction(PasswordHintChange(it)) } }, - supportingText = stringResource(id = R.string.master_password_hint_description), + supportingText = stringResource( + id = BitwardenString.master_password_hint_description), textFieldTestTag = "MasterPasswordHintLabel", cardStyle = CardStyle.Bottom, modifier = Modifier @@ -246,7 +247,8 @@ fun CreateAccountScreen( ) Spacer(modifier = Modifier.height(height = 8.dp)) BitwardenSwitch( - label = stringResource(id = R.string.check_known_data_breaches_for_this_password), + label = stringResource( + id = BitwardenString.check_known_data_breaches_for_this_password), isChecked = state.isCheckDataBreachesToggled, onCheckedChange = remember(viewModel) { { newState -> @@ -288,8 +290,8 @@ private fun TermsAndPrivacySwitch( onPrivacyPolicyClick: () -> Unit, modifier: Modifier = Modifier, ) { - val strTerms = stringResource(id = R.string.terms_of_service) - val strPrivacy = stringResource(id = R.string.privacy_policy) + val strTerms = stringResource(id = BitwardenString.terms_of_service) + val strPrivacy = stringResource(id = BitwardenString.privacy_policy) BitwardenSwitch( modifier = modifier.semantics(mergeDescendants = true) { customActions = listOf( @@ -310,7 +312,7 @@ private fun TermsAndPrivacySwitch( ) }, label = annotatedStringResource( - id = R.string + id = BitwardenString .by_activating_this_switch_you_agree_to_the_terms_of_service_and_privacy_policy, onAnnotationClick = { when (it) { diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/createaccount/CreateAccountViewModel.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/createaccount/CreateAccountViewModel.kt index 55e9376db9..1fb393f3ce 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/createaccount/CreateAccountViewModel.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/createaccount/CreateAccountViewModel.kt @@ -6,10 +6,10 @@ import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.viewModelScope import com.bitwarden.ui.platform.base.BaseViewModel import com.bitwarden.ui.platform.base.util.isValidEmail +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText import com.bitwarden.ui.util.concat -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.auth.datasource.sdk.model.PasswordStrength import com.x8bit.bitwarden.data.auth.repository.AuthRepository import com.x8bit.bitwarden.data.auth.repository.model.PasswordStrengthResult @@ -142,8 +142,8 @@ class CreateAccountViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialog = CreateAccountDialog.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.captcha_failed.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.captcha_failed.asText(), ), ) } @@ -177,9 +177,9 @@ class CreateAccountViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialog = CreateAccountDialog.Error( - title = R.string.an_error_has_occurred.asText(), + title = BitwardenString.an_error_has_occurred.asText(), message = registerAccountResult.errorMessage?.asText() - ?: R.string.generic_error_message.asText(), + ?: BitwardenString.generic_error_message.asText(), error = registerAccountResult.error, ), ) @@ -200,8 +200,8 @@ class CreateAccountViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialog = CreateAccountDialog.HaveIBeenPwned( - title = R.string.exposed_master_password.asText(), - message = R.string.password_found_in_a_data_breach_alert_description.asText(), + title = BitwardenString.exposed_master_password.asText(), + message = BitwardenString.password_found_in_a_data_breach_alert_description.asText(), ), ) } @@ -211,8 +211,8 @@ class CreateAccountViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialog = CreateAccountDialog.HaveIBeenPwned( - title = R.string.weak_and_exposed_master_password.asText(), - message = R.string.weak_password_identified_and_found_in_a_data_breach_alert_description.asText(), + title = BitwardenString.weak_and_exposed_master_password.asText(), + message = BitwardenString.weak_password_identified_and_found_in_a_data_breach_alert_description.asText(), ), ) } @@ -222,8 +222,8 @@ class CreateAccountViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialog = CreateAccountDialog.HaveIBeenPwned( - title = R.string.weak_master_password.asText(), - message = R.string.weak_password_identified_use_a_strong_password_to_protect_your_account.asText(), + title = BitwardenString.weak_master_password.asText(), + message = BitwardenString.weak_password_identified_use_a_strong_password_to_protect_your_account.asText(), ), ) } @@ -295,9 +295,9 @@ class CreateAccountViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialog = CreateAccountDialog.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.validation_field_required - .asText(R.string.email_address.asText()), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.validation_field_required + .asText(BitwardenString.email_address.asText()), ), ) } @@ -307,8 +307,8 @@ class CreateAccountViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialog = CreateAccountDialog.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.invalid_email.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.invalid_email.asText(), ), ) } @@ -318,8 +318,8 @@ class CreateAccountViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialog = CreateAccountDialog.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.master_password_length_val_message_x + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.master_password_length_val_message_x .asText(MIN_PASSWORD_LENGTH), ), ) @@ -330,8 +330,8 @@ class CreateAccountViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialog = CreateAccountDialog.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.master_password_confirmation_val_message.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.master_password_confirmation_val_message.asText(), ), ) } @@ -341,8 +341,8 @@ class CreateAccountViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialog = CreateAccountDialog.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.accept_policies_error.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.accept_policies_error.asText(), ), ) } @@ -412,10 +412,10 @@ data class CreateAccountState( // Important: Your master password cannot be recovered if you forget it! 12 // characters minimum @Suppress("MaxLineLength") - get() = R.string.important.asText() + get() = BitwardenString.important.asText() .concat( ": ".asText(), - R.string.your_master_password_cannot_be_recovered_if_you_forget_it_x_characters_minimum + BitwardenString.your_master_password_cannot_be_recovered_if_you_forget_it_x_characters_minimum .asText(MIN_PASSWORD_LENGTH), ) diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/enterprisesignon/EnterpriseSignOnScreen.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/enterprisesignon/EnterpriseSignOnScreen.kt index 155edc1b95..9ff11fa02b 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/enterprisesignon/EnterpriseSignOnScreen.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/enterprisesignon/EnterpriseSignOnScreen.kt @@ -31,6 +31,7 @@ import com.bitwarden.ui.platform.components.button.BitwardenTextButton import com.bitwarden.ui.platform.components.model.CardStyle import com.bitwarden.ui.platform.components.util.rememberVectorPainter import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenBasicDialog @@ -100,13 +101,13 @@ fun EnterpriseSignOnScreen( title = stringResource(id = R.string.app_name), scrollBehavior = scrollBehavior, navigationIcon = rememberVectorPainter(id = BitwardenDrawable.ic_close), - navigationIconContentDescription = stringResource(id = R.string.close), + navigationIconContentDescription = stringResource(id = BitwardenString.close), onNavigationIconClick = remember(viewModel) { { viewModel.trySendAction(EnterpriseSignOnAction.CloseButtonClick) } }, actions = { BitwardenTextButton( - label = stringResource(id = R.string.log_in_verb), + label = stringResource(id = BitwardenString.log_in_verb), onClick = remember(viewModel) { { viewModel.trySendAction(EnterpriseSignOnAction.LogInClick) } }, @@ -140,7 +141,7 @@ private fun EnterpriseSignOnScreenContent( ) { Spacer(modifier = Modifier.height(height = 12.dp)) Text( - text = stringResource(id = R.string.log_in_sso_summary), + text = stringResource(id = BitwardenString.log_in_sso_summary), textAlign = TextAlign.Start, style = BitwardenTheme.typography.bodyMedium, color = BitwardenTheme.colorScheme.text.primary, @@ -157,7 +158,7 @@ private fun EnterpriseSignOnScreenContent( .fillMaxWidth(), value = state.orgIdentifierInput, onValueChange = onOrgIdentifierInputChange, - label = stringResource(id = R.string.org_identifier), + label = stringResource(id = BitwardenString.org_identifier), textFieldTestTag = "OrgSSOIdentifierEntry", cardStyle = CardStyle.Full, ) @@ -190,13 +191,13 @@ private fun EnterpriseSignOnDialogs( is EnterpriseSignOnState.DialogState.KeyConnectorDomain -> { BitwardenTwoButtonDialog( - title = stringResource(R.string.confirm_key_connector_domain), + title = stringResource(BitwardenString.confirm_key_connector_domain), message = stringResource( - R.string.please_confirm_domain_with_admin, + BitwardenString.please_confirm_domain_with_admin, dialogState.keyConnectorDomain, ), - confirmButtonText = stringResource(R.string.confirm), - dismissButtonText = stringResource(R.string.cancel), + confirmButtonText = stringResource(BitwardenString.confirm), + dismissButtonText = stringResource(BitwardenString.cancel), onConfirmClick = onConfirmKeyConnectorDomain, onDismissRequest = onDismissKeyConnectorDomain, onDismissClick = onDismissKeyConnectorDomain, diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/enterprisesignon/EnterpriseSignOnViewModel.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/enterprisesignon/EnterpriseSignOnViewModel.kt index 292f703a43..117eaa169a 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/enterprisesignon/EnterpriseSignOnViewModel.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/enterprisesignon/EnterpriseSignOnViewModel.kt @@ -7,9 +7,9 @@ import androidx.lifecycle.viewModelScope import com.bitwarden.data.repository.util.baseIdentityUrl import com.bitwarden.data.repository.util.baseWebVaultUrlOrDefault import com.bitwarden.ui.platform.base.BaseViewModel +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.auth.repository.AuthRepository import com.x8bit.bitwarden.data.auth.repository.model.LoginResult import com.x8bit.bitwarden.data.auth.repository.model.PrevalidateSsoResult @@ -163,7 +163,7 @@ class EnterpriseSignOnViewModel @Inject constructor( is LoginResult.Error -> { showError( message = loginResult.errorMessage?.asText() - ?: R.string.login_sso_error.asText(), + ?: BitwardenString.login_sso_error.asText(), error = loginResult.error, ) } @@ -171,7 +171,7 @@ class EnterpriseSignOnViewModel @Inject constructor( is LoginResult.UnofficialServerError -> { @Suppress("MaxLineLength") showError( - message = R.string + message = BitwardenString .this_is_not_a_recognized_bitwarden_server_you_may_need_to_check_with_your_provider_or_update_your_server .asText(), ) @@ -200,20 +200,22 @@ class EnterpriseSignOnViewModel @Inject constructor( .baseWebVaultUrlOrDefault showError( - message = R.string + message = BitwardenString .this_account_will_soon_be_deleted_log_in_at_x_to_continue_using_bitwarden .asText(vaultUrl.toUriOrNull()?.host ?: vaultUrl), ) } LoginResult.CertificateError -> { - showError(message = R.string.we_couldnt_verify_the_servers_certificate.asText()) + showError( + message = BitwardenString.we_couldnt_verify_the_servers_certificate.asText(), + ) } is LoginResult.NewDeviceVerification -> { showError( message = loginResult.errorMessage?.asText() - ?: R.string.login_sso_error.asText(), + ?: BitwardenString.login_sso_error.asText(), ) } @@ -236,7 +238,7 @@ class EnterpriseSignOnViewModel @Inject constructor( action: EnterpriseSignOnAction.Internal.OnSsoPrevalidationFailure, ) { showError( - message = action.message?.asText() ?: R.string.login_sso_error.asText(), + message = action.message?.asText() ?: BitwardenString.login_sso_error.asText(), error = action.error, ) } @@ -310,8 +312,8 @@ class EnterpriseSignOnViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = EnterpriseSignOnState.DialogState.Error( - title = R.string.log_in_denied.asText(), - message = R.string.captcha_failed.asText(), + title = BitwardenString.log_in_denied.asText(), + message = BitwardenString.captcha_failed.asText(), ), ) } @@ -331,8 +333,8 @@ class EnterpriseSignOnViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = EnterpriseSignOnState.DialogState.Error( - title = R.string.internet_connection_required_title.asText(), - message = R.string.internet_connection_required_message.asText(), + title = BitwardenString.internet_connection_required_title.asText(), + message = BitwardenString.internet_connection_required_message.asText(), ), ) } @@ -342,8 +344,8 @@ class EnterpriseSignOnViewModel @Inject constructor( val organizationIdentifier = state.orgIdentifierInput if (organizationIdentifier.isBlank()) { showError( - message = R.string.validation_field_required.asText( - R.string.org_identifier.asText(), + message = BitwardenString.validation_field_required.asText( + BitwardenString.org_identifier.asText(), ), ) return @@ -406,7 +408,9 @@ class EnterpriseSignOnViewModel @Inject constructor( private fun checkOrganizationDomainSsoDetails() { mutableStateFlow.update { it.copy( - dialogState = EnterpriseSignOnState.DialogState.Loading(R.string.loading.asText()), + dialogState = EnterpriseSignOnState.DialogState.Loading( + BitwardenString.loading.asText(), + ), ) } viewModelScope.launch { @@ -451,8 +455,8 @@ class EnterpriseSignOnViewModel @Inject constructor( } private fun showError( - title: Text = R.string.an_error_has_occurred.asText(), - message: Text = R.string.login_sso_error.asText(), + title: Text = BitwardenString.an_error_has_occurred.asText(), + message: Text = BitwardenString.login_sso_error.asText(), error: Throwable? = null, ) { mutableStateFlow.update { @@ -470,7 +474,7 @@ class EnterpriseSignOnViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = EnterpriseSignOnState.DialogState.Loading( - R.string.logging_in.asText(), + BitwardenString.logging_in.asText(), ), ) } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/environment/EnvironmentScreen.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/environment/EnvironmentScreen.kt index 48215d6adc..4a78485d4d 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/environment/EnvironmentScreen.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/environment/EnvironmentScreen.kt @@ -34,8 +34,8 @@ import com.bitwarden.ui.platform.components.button.BitwardenTextButton import com.bitwarden.ui.platform.components.model.CardStyle import com.bitwarden.ui.platform.components.util.rememberVectorPainter import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.x8bit.bitwarden.BuildConfig -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenBasicDialog import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenClientCertificateDialog import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenTwoButtonDialog @@ -99,7 +99,7 @@ fun EnvironmentScreen( when (val dialog = state.dialog) { is EnvironmentState.DialogState.Error -> { BitwardenBasicDialog( - title = stringResource(id = R.string.an_error_has_occurred), + title = stringResource(id = BitwardenString.an_error_has_occurred), message = dialog.message(), onDismissRequest = remember(viewModel) { { viewModel.trySendAction(EnvironmentAction.DialogDismiss) } @@ -134,15 +134,15 @@ fun EnvironmentScreen( is EnvironmentState.DialogState.SystemCertificateWarningDialog -> { @Suppress("MaxLineLength") BitwardenTwoButtonDialog( - title = stringResource(R.string.warning), + title = stringResource(BitwardenString.warning), message = stringResource( - R.string.system_certificates_are_not_as_secure_as_importing_certificates_to_bitwarden, + BitwardenString.system_certificates_are_not_as_secure_as_importing_certificates_to_bitwarden, ), - confirmButtonText = stringResource(R.string.continue_text), + confirmButtonText = stringResource(BitwardenString.continue_text), onConfirmClick = remember(viewModel) { { viewModel.trySendAction(EnvironmentAction.ConfirmChooseSystemCertificateClick) } }, - dismissButtonText = stringResource(R.string.cancel), + dismissButtonText = stringResource(BitwardenString.cancel), onDismissClick = remember(viewModel) { { viewModel.trySendAction(EnvironmentAction.DialogDismiss) } }, @@ -156,8 +156,8 @@ fun EnvironmentScreen( BitwardenTwoButtonDialog( title = dialog.title(), message = dialog.message(), - confirmButtonText = stringResource(R.string.replace_certificate), - dismissButtonText = stringResource(R.string.cancel), + confirmButtonText = stringResource(BitwardenString.replace_certificate), + dismissButtonText = stringResource(BitwardenString.cancel), onConfirmClick = remember(viewModel) { { viewModel.trySendAction( @@ -185,16 +185,16 @@ fun EnvironmentScreen( .nestedScroll(scrollBehavior.nestedScrollConnection), topBar = { BitwardenTopAppBar( - title = stringResource(id = R.string.settings), + title = stringResource(id = BitwardenString.settings), scrollBehavior = scrollBehavior, navigationIcon = rememberVectorPainter(id = BitwardenDrawable.ic_close), - navigationIconContentDescription = stringResource(id = R.string.close), + navigationIconContentDescription = stringResource(id = BitwardenString.close), onNavigationIconClick = remember(viewModel) { { viewModel.trySendAction(EnvironmentAction.CloseClick) } }, actions = { BitwardenTextButton( - label = stringResource(id = R.string.save), + label = stringResource(id = BitwardenString.save), onClick = remember(viewModel) { { viewModel.trySendAction(EnvironmentAction.SaveClick) } }, @@ -214,7 +214,7 @@ fun EnvironmentScreen( ) { Spacer(modifier = Modifier.height(height = 12.dp)) BitwardenListHeaderText( - label = stringResource(id = R.string.self_hosted_environment), + label = stringResource(id = BitwardenString.self_hosted_environment), modifier = Modifier .fillMaxWidth() .standardHorizontalMargin() @@ -224,10 +224,12 @@ fun EnvironmentScreen( Spacer(modifier = Modifier.height(height = 8.dp)) BitwardenTextField( - label = stringResource(id = R.string.server_url), + label = stringResource(id = BitwardenString.server_url), value = state.serverUrl, placeholder = "ex. https://bitwarden.company.com", - supportingText = stringResource(id = R.string.self_hosted_environment_footer), + supportingText = stringResource( + id = BitwardenString.self_hosted_environment_footer, + ), onValueChange = remember(viewModel) { { viewModel.trySendAction(EnvironmentAction.ServerUrlChange(it)) } }, @@ -251,7 +253,7 @@ fun EnvironmentScreen( Spacer(modifier = Modifier.height(16.dp)) BitwardenListHeaderText( - label = stringResource(id = R.string.custom_environment), + label = stringResource(id = BitwardenString.custom_environment), modifier = Modifier .fillMaxWidth() .standardHorizontalMargin() @@ -261,7 +263,7 @@ fun EnvironmentScreen( Spacer(modifier = Modifier.height(height = 8.dp)) BitwardenTextField( - label = stringResource(id = R.string.web_vault_url), + label = stringResource(id = BitwardenString.web_vault_url), value = state.webVaultServerUrl, onValueChange = remember(viewModel) { { viewModel.trySendAction(EnvironmentAction.WebVaultServerUrlChange(it)) } @@ -277,7 +279,7 @@ fun EnvironmentScreen( Spacer(modifier = Modifier.height(height = 8.dp)) BitwardenTextField( - label = stringResource(id = R.string.api_url), + label = stringResource(id = BitwardenString.api_url), value = state.apiServerUrl, onValueChange = remember(viewModel) { { viewModel.trySendAction(EnvironmentAction.ApiServerUrlChange(it)) } @@ -293,7 +295,7 @@ fun EnvironmentScreen( Spacer(modifier = Modifier.height(height = 8.dp)) BitwardenTextField( - label = stringResource(id = R.string.identity_url), + label = stringResource(id = BitwardenString.identity_url), value = state.identityServerUrl, onValueChange = remember(viewModel) { { viewModel.trySendAction(EnvironmentAction.IdentityServerUrlChange(it)) } @@ -309,12 +311,12 @@ fun EnvironmentScreen( Spacer(modifier = Modifier.height(height = 8.dp)) BitwardenTextField( - label = stringResource(id = R.string.icons_url), + label = stringResource(id = BitwardenString.icons_url), value = state.iconsServerUrl, onValueChange = remember(viewModel) { { viewModel.trySendAction(EnvironmentAction.IconsServerUrlChange(it)) } }, - supportingText = stringResource(id = R.string.custom_environment_footer), + supportingText = stringResource(id = BitwardenString.custom_environment_footer), keyboardType = KeyboardType.Uri, textFieldTestTag = "IconsUrlEntry", cardStyle = CardStyle.Full, @@ -326,7 +328,7 @@ fun EnvironmentScreen( Spacer(modifier = Modifier.height(height = 16.dp)) BitwardenListHeaderText( - label = stringResource(id = R.string.client_certificate_mtls), + label = stringResource(id = BitwardenString.client_certificate_mtls), modifier = Modifier .fillMaxWidth() .standardHorizontalMargin() @@ -335,10 +337,10 @@ fun EnvironmentScreen( Spacer(modifier = Modifier.height(height = 8.dp)) BitwardenTextField( - label = stringResource(id = R.string.certificate_alias), + label = stringResource(id = BitwardenString.certificate_alias), value = state.keyAlias, supportingText = stringResource( - id = R.string.certificate_used_for_client_authentication, + id = BitwardenString.certificate_used_for_client_authentication, ), onValueChange = {}, readOnly = true, @@ -352,7 +354,7 @@ fun EnvironmentScreen( Spacer(modifier = Modifier.height(height = 16.dp)) BitwardenFilledButton( - label = stringResource(id = R.string.import_certificate), + label = stringResource(id = BitwardenString.import_certificate), onClick = remember(viewModel) { { viewModel.trySendAction(EnvironmentAction.ImportCertificateClick) } }, @@ -365,7 +367,7 @@ fun EnvironmentScreen( Spacer(modifier = Modifier.height(height = 12.dp)) BitwardenOutlinedButton( - label = stringResource(id = R.string.choose_system_certificate), + label = stringResource(id = BitwardenString.choose_system_certificate), onClick = remember(viewModel) { { viewModel.trySendAction(EnvironmentAction.ChooseSystemCertificateClick) } }, @@ -374,7 +376,6 @@ fun EnvironmentScreen( .standardHorizontalMargin() .testTag("ChooseSystemCertificateButton"), ) - Spacer(modifier = Modifier.height(height = 16.dp)) Spacer(modifier = Modifier.navigationBarsPadding()) } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/environment/EnvironmentViewModel.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/environment/EnvironmentViewModel.kt index 94aba14aad..c34082cd14 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/environment/EnvironmentViewModel.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/environment/EnvironmentViewModel.kt @@ -11,9 +11,9 @@ import com.bitwarden.ui.platform.base.BaseViewModel import com.bitwarden.ui.platform.base.util.isValidUri import com.bitwarden.ui.platform.base.util.orNullIfBlank import com.bitwarden.ui.platform.base.util.prefixHttpsIfNecessaryOrNull +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.platform.datasource.disk.model.MutualTlsKeyHost import com.x8bit.bitwarden.data.platform.manager.CertificateManager import com.x8bit.bitwarden.data.platform.manager.model.ImportPrivateKeyResult @@ -139,7 +139,7 @@ class EnvironmentViewModel @Inject constructor( } if (!urlsAreAllNullOrValid) { - showErrorDialog(message = R.string.environment_page_urls_error.asText()) + showErrorDialog(message = BitwardenString.environment_page_urls_error.asText()) return } @@ -161,7 +161,7 @@ class EnvironmentViewModel @Inject constructor( ) snackbarRelayManager.sendSnackbarData( - data = BitwardenSnackbarData(message = R.string.environment_saved.asText()), + data = BitwardenSnackbarData(message = BitwardenString.environment_saved.asText()), relay = SnackbarRelay.ENVIRONMENT_SAVED, ) sendEvent(EnvironmentEvent.NavigateBack) @@ -184,9 +184,9 @@ class EnvironmentViewModel @Inject constructor( ) { showSnackbar( message = if (action.success) { - R.string.certificate_installed.asText() + BitwardenString.certificate_installed.asText() } else { - R.string.certificate_installation_failed.asText() + BitwardenString.certificate_installation_failed.asText() }, ) } @@ -271,8 +271,8 @@ class EnvironmentViewModel @Inject constructor( ) { if (action.password.isBlank()) { showErrorDialog( - message = R.string.validation_field_required.asText( - R.string.password.asText(), + message = BitwardenString.validation_field_required.asText( + BitwardenString.password.asText(), ), ) return @@ -280,8 +280,8 @@ class EnvironmentViewModel @Inject constructor( if (action.alias.isBlank()) { showErrorDialog( - message = R.string.validation_field_required.asText( - R.string.alias.asText(), + message = BitwardenString.validation_field_required.asText( + BitwardenString.alias.asText(), ), ) return @@ -292,9 +292,9 @@ class EnvironmentViewModel @Inject constructor( @Suppress("MaxLineLength") it.copy( dialog = EnvironmentState.DialogState.ConfirmOverwriteAlias( - title = R.string.replace_existing_certificate.asText(), + title = BitwardenString.replace_existing_certificate.asText(), message = - R.string.a_certificate_with_the_alias_x_already_exists_do_you_want_to_replace_it + BitwardenString.a_certificate_with_the_alias_x_already_exists_do_you_want_to_replace_it .asText(action.alias), triggeringAction = action, ), @@ -328,19 +328,19 @@ class EnvironmentViewModel @Inject constructor( } is ImportPrivateKeyResult.Error.UnsupportedKey -> { - showSnackbar(message = R.string.unsupported_certificate_type.asText()) + showSnackbar(message = BitwardenString.unsupported_certificate_type.asText()) } is ImportPrivateKeyResult.Error.KeyStoreOperationFailed -> { - showSnackbar(message = R.string.certificate_installation_failed.asText()) + showSnackbar(message = BitwardenString.certificate_installation_failed.asText()) } is ImportPrivateKeyResult.Error.UnrecoverableKey -> { - showSnackbar(message = R.string.certificate_password_incorrect.asText()) + showSnackbar(message = BitwardenString.certificate_password_incorrect.asText()) } is ImportPrivateKeyResult.Error.InvalidCertificateChain -> { - showSnackbar(message = R.string.invalid_certificate_chain.asText()) + showSnackbar(message = BitwardenString.invalid_certificate_chain.asText()) } } } @@ -369,7 +369,7 @@ class EnvironmentViewModel @Inject constructor( is PrivateKeyAliasSelectionResult.Error -> { sendEvent( EnvironmentEvent.ShowSnackbar( - message = R.string.error_loading_certificate.asText(), + message = BitwardenString.error_loading_certificate.asText(), ), ) } @@ -415,7 +415,7 @@ class EnvironmentViewModel @Inject constructor( .fold( onFailure = { EnvironmentAction.Internal.ShowErrorDialog( - message = R.string.unable_to_read_certificate.asText(), + message = BitwardenString.unable_to_read_certificate.asText(), throwable = it, ) }, diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/expiredregistrationlink/ExpiredRegistrationLinkScreen.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/expiredregistrationlink/ExpiredRegistrationLinkScreen.kt index f91baaa0ea..5bb086d7f3 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/expiredregistrationlink/ExpiredRegistrationLinkScreen.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/expiredregistrationlink/ExpiredRegistrationLinkScreen.kt @@ -28,8 +28,8 @@ import com.bitwarden.ui.platform.components.button.BitwardenFilledButton import com.bitwarden.ui.platform.components.button.BitwardenOutlinedButton import com.bitwarden.ui.platform.components.util.rememberVectorPainter import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.platform.components.scaffold.BitwardenScaffold /** @@ -63,11 +63,11 @@ fun ExpiredRegistrationLinkScreen( BitwardenScaffold( topBar = { BitwardenTopAppBar( - title = stringResource(id = R.string.create_account), + title = stringResource(id = BitwardenString.create_account), scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(), navigationIcon = NavigationIcon( navigationIcon = rememberVectorPainter(id = BitwardenDrawable.ic_close), - navigationIconContentDescription = stringResource(id = R.string.close), + navigationIconContentDescription = stringResource(id = BitwardenString.close), onNavigationIconClick = sendCloseClicked, ), ) @@ -104,7 +104,7 @@ private fun ExpiredRegistrationLinkContent( ) { Spacer(modifier = Modifier.height(8.dp)) Text( - text = stringResource(R.string.expired_link), + text = stringResource(BitwardenString.expired_link), style = BitwardenTheme.typography.titleMedium, color = BitwardenTheme.colorScheme.text.primary, textAlign = TextAlign.Center, @@ -114,7 +114,7 @@ private fun ExpiredRegistrationLinkContent( ) Spacer(modifier = Modifier.height(8.dp)) Text( - text = stringResource(R.string.please_restart_registration_or_try_logging_in), + text = stringResource(BitwardenString.please_restart_registration_or_try_logging_in), style = BitwardenTheme.typography.bodyMedium, color = BitwardenTheme.colorScheme.text.primary, textAlign = TextAlign.Center, @@ -124,7 +124,7 @@ private fun ExpiredRegistrationLinkContent( ) Spacer(modifier = Modifier.height(24.dp)) BitwardenFilledButton( - label = stringResource(R.string.restart_registration), + label = stringResource(BitwardenString.restart_registration), onClick = onNavigateToStartRegistration, modifier = Modifier .fillMaxWidth() @@ -132,7 +132,7 @@ private fun ExpiredRegistrationLinkContent( ) Spacer(modifier = Modifier.height(12.dp)) BitwardenOutlinedButton( - label = stringResource(id = R.string.log_in_verb), + label = stringResource(id = BitwardenString.log_in_verb), onClick = onNavigateToLogin, modifier = Modifier .fillMaxWidth() diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/landing/LandingScreen.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/landing/LandingScreen.kt index f7a84a6937..ee85ad7520 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/landing/LandingScreen.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/landing/LandingScreen.kt @@ -45,8 +45,8 @@ import com.bitwarden.ui.platform.components.model.CardStyle import com.bitwarden.ui.platform.components.toggle.BitwardenSwitch import com.bitwarden.ui.platform.components.util.rememberVectorPainter import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.platform.components.account.BitwardenAccountSwitcher import com.x8bit.bitwarden.ui.platform.components.account.BitwardenPlaceholderAccountActionItem import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenBasicDialog @@ -88,12 +88,12 @@ fun LandingScreen( when (val dialog = state.dialog) { is LandingState.DialogState.AccountAlreadyAdded -> { BitwardenTwoButtonDialog( - title = stringResource(id = R.string.account_already_added), + title = stringResource(id = BitwardenString.account_already_added), message = stringResource( - id = R.string.switch_to_already_added_account_confirmation, + id = BitwardenString.switch_to_already_added_account_confirmation, ), - confirmButtonText = stringResource(id = R.string.yes), - dismissButtonText = stringResource(id = R.string.cancel), + confirmButtonText = stringResource(id = BitwardenString.yes), + dismissButtonText = stringResource(id = BitwardenString.cancel), onConfirmClick = remember(viewModel) { { viewModel.trySendAction( @@ -114,7 +114,7 @@ fun LandingScreen( is LandingState.DialogState.Error -> { BitwardenBasicDialog( - title = stringResource(id = R.string.an_error_has_occurred), + title = stringResource(id = BitwardenString.an_error_has_occurred), message = dialog.message(), onDismissRequest = remember(viewModel) { { viewModel.trySendAction(LandingAction.DialogDismiss) } @@ -234,7 +234,7 @@ private fun LandingScreenContent( Spacer(modifier = Modifier.height(height = 12.dp)) Text( - text = stringResource(id = R.string.login_to_bitwarden), + text = stringResource(id = BitwardenString.login_to_bitwarden), textAlign = TextAlign.Center, style = BitwardenTheme.typography.headlineSmall, color = BitwardenTheme.colorScheme.text.primary, @@ -251,15 +251,15 @@ private fun LandingScreenContent( .fillMaxWidth(), value = state.emailInput, onValueChange = onEmailInputChange, - label = stringResource(id = R.string.email_address), + label = stringResource(id = BitwardenString.email_address), keyboardType = KeyboardType.Email, textFieldTestTag = "EmailAddressEntry", cardStyle = CardStyle.Full, supportingContentPadding = PaddingValues(), supportingContent = { EnvironmentSelector( - labelText = stringResource(id = R.string.logging_in_on_with_colon), - dialogTitle = stringResource(id = R.string.logging_in_on), + labelText = stringResource(id = BitwardenString.logging_in_on_with_colon), + dialogTitle = stringResource(id = BitwardenString.logging_in_on), selectedOption = state.selectedEnvironmentType, onOptionSelected = onEnvironmentTypeSelect, isHelpEnabled = false, @@ -274,7 +274,7 @@ private fun LandingScreenContent( Spacer(modifier = Modifier.height(height = 8.dp)) BitwardenSwitch( - label = stringResource(id = R.string.remember_email), + label = stringResource(id = BitwardenString.remember_email), isChecked = state.isRememberEmailEnabled, onCheckedChange = onRememberMeToggle, cardStyle = CardStyle.Full, @@ -287,7 +287,7 @@ private fun LandingScreenContent( Spacer(modifier = Modifier.height(height = 24.dp)) BitwardenFilledButton( - label = stringResource(id = R.string.continue_text), + label = stringResource(id = BitwardenString.continue_text), onClick = onContinueClick, isEnabled = state.isContinueButtonEnabled, modifier = Modifier @@ -307,13 +307,13 @@ private fun LandingScreenContent( .wrapContentHeight(), ) { Text( - text = stringResource(id = R.string.new_to_bitwarden), + text = stringResource(id = BitwardenString.new_to_bitwarden), style = BitwardenTheme.typography.bodyMedium, color = BitwardenTheme.colorScheme.text.secondary, ) BitwardenTextButton( - label = stringResource(id = R.string.create_an_account), + label = stringResource(id = BitwardenString.create_an_account), onClick = onCreateAccountClick, modifier = Modifier .testTag("CreateAccountLabel"), @@ -321,7 +321,7 @@ private fun LandingScreenContent( } Spacer(modifier = Modifier.height(height = 8.dp)) BitwardenTextButton( - label = stringResource(id = R.string.app_settings), + label = stringResource(id = BitwardenString.app_settings), onClick = onAppSettingsClick, icon = rememberVectorPainter(id = BitwardenDrawable.ic_cog), modifier = Modifier diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/landing/LandingViewModel.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/landing/LandingViewModel.kt index a4e631243d..336421b553 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/landing/LandingViewModel.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/landing/LandingViewModel.kt @@ -7,9 +7,9 @@ import com.bitwarden.data.repository.model.Environment import com.bitwarden.ui.platform.base.BackgroundEvent import com.bitwarden.ui.platform.base.BaseViewModel import com.bitwarden.ui.platform.base.util.isValidEmail +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.auth.repository.AuthRepository import com.x8bit.bitwarden.data.auth.repository.model.LogoutReason import com.x8bit.bitwarden.data.auth.repository.model.UserState @@ -187,7 +187,7 @@ class LandingViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialog = LandingState.DialogState.Error( - message = R.string.invalid_email.asText(), + message = BitwardenString.invalid_email.asText(), ), ) } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/login/LoginScreen.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/login/LoginScreen.kt index ba5d8a9e9a..f4cf3cc93b 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/login/LoginScreen.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/login/LoginScreen.kt @@ -40,6 +40,7 @@ import com.bitwarden.ui.platform.components.button.BitwardenOutlinedButton import com.bitwarden.ui.platform.components.model.CardStyle import com.bitwarden.ui.platform.components.util.rememberVectorPainter import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.platform.components.account.BitwardenAccountSwitcher @@ -119,7 +120,7 @@ fun LoginScreen( title = stringResource(id = R.string.app_name), scrollBehavior = scrollBehavior, navigationIcon = rememberVectorPainter(id = BitwardenDrawable.ic_close), - navigationIconContentDescription = stringResource(id = R.string.close), + navigationIconContentDescription = stringResource(id = BitwardenString.close), onNavigationIconClick = remember(viewModel) { { viewModel.trySendAction(LoginAction.CloseButtonClick) } }, @@ -130,10 +131,10 @@ fun LoginScreen( ) } BitwardenOverflowActionItem( - contentDescription = stringResource(R.string.more), + contentDescription = stringResource(BitwardenString.more), menuItemDataList = persistentListOf( OverflowMenuItemData( - text = stringResource(id = R.string.get_password_hint), + text = stringResource(id = BitwardenString.get_password_hint), onClick = remember(viewModel) { { viewModel.trySendAction(LoginAction.MasterPasswordHintClick) } }, @@ -235,12 +236,12 @@ private fun LoginScreenContent( autoFocus = true, value = state.passwordInput, onValueChange = onPasswordInputChanged, - label = stringResource(id = R.string.master_password), + label = stringResource(id = BitwardenString.master_password), showPasswordTestTag = "PasswordVisibilityToggle", supportingContentPadding = PaddingValues(), supportingContent = { BitwardenClickableText( - label = stringResource(id = R.string.get_master_passwordword_hint), + label = stringResource(id = BitwardenString.get_master_passwordword_hint), onClick = onMasterPasswordClick, style = BitwardenTheme.typography.labelMedium, innerPadding = PaddingValues(all = 16.dp), @@ -260,7 +261,7 @@ private fun LoginScreenContent( Spacer(modifier = Modifier.height(height = 24.dp)) BitwardenFilledButton( - label = stringResource(id = R.string.log_in_with_master_password), + label = stringResource(id = BitwardenString.log_in_with_master_password), onClick = onLoginButtonClick, isEnabled = state.isLoginButtonEnabled, modifier = Modifier @@ -273,7 +274,7 @@ private fun LoginScreenContent( if (state.shouldShowLoginWithDevice) { BitwardenOutlinedButton( - label = stringResource(id = R.string.log_in_with_device), + label = stringResource(id = BitwardenString.log_in_with_device), icon = rememberVectorPainter(id = BitwardenDrawable.ic_mobile_small), onClick = onLoginWithDeviceClick, modifier = Modifier @@ -286,7 +287,7 @@ private fun LoginScreenContent( } BitwardenOutlinedButton( - label = stringResource(id = R.string.log_in_sso), + label = stringResource(id = BitwardenString.log_in_sso), icon = rememberVectorPainter(id = BitwardenDrawable.ic_enterprise_small), onClick = onSingleSignOnClick, modifier = Modifier @@ -299,7 +300,7 @@ private fun LoginScreenContent( Text( text = stringResource( - id = R.string.logging_in_as_x_on_y, + id = BitwardenString.logging_in_as_x_on_y, state.emailAddress, state.environmentLabel, ), @@ -313,7 +314,7 @@ private fun LoginScreenContent( ) BitwardenClickableText( - label = stringResource(id = R.string.not_you), + label = stringResource(id = BitwardenString.not_you), onClick = onNotYouButtonClick, style = BitwardenTheme.typography.labelMedium, innerPadding = PaddingValues(vertical = 8.dp, horizontal = 16.dp), diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/login/LoginViewModel.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/login/LoginViewModel.kt index c22018a479..d4ad8aae0c 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/login/LoginViewModel.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/login/LoginViewModel.kt @@ -8,9 +8,9 @@ import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.viewModelScope import com.bitwarden.data.repository.util.baseWebVaultUrlOrDefault import com.bitwarden.ui.platform.base.BaseViewModel +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.auth.repository.AuthRepository import com.x8bit.bitwarden.data.auth.repository.model.KnownDeviceResult import com.x8bit.bitwarden.data.auth.repository.model.LoginResult @@ -52,7 +52,7 @@ class LoginViewModel @Inject constructor( isLoginButtonEnabled = false, passwordInput = "", environmentLabel = environmentRepository.environment.label, - dialogState = LoginState.DialogState.Loading(R.string.loading.asText()), + dialogState = LoginState.DialogState.Loading(BitwardenString.loading.asText()), captchaToken = args.captchaToken, accountSummaries = authRepository .userStateFlow @@ -178,8 +178,8 @@ class LoginViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = LoginState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString .this_account_will_soon_be_deleted_log_in_at_x_to_continue_using_bitwarden .asText(vaultUrl.toUriOrNull()?.host ?: vaultUrl), ), @@ -204,9 +204,9 @@ class LoginViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = LoginState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), + title = BitwardenString.an_error_has_occurred.asText(), message = loginResult.errorMessage?.asText() - ?: R.string.generic_error_message.asText(), + ?: BitwardenString.generic_error_message.asText(), error = loginResult.error, ), ) @@ -217,8 +217,8 @@ class LoginViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = LoginState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.this_is_not_a_recognized_bitwarden_server_you_may_need_to_check_with_your_provider_or_update_your_server.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.this_is_not_a_recognized_bitwarden_server_you_may_need_to_check_with_your_provider_or_update_your_server.asText(), ), ) } @@ -232,8 +232,8 @@ class LoginViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = LoginState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.we_couldnt_verify_the_servers_certificate.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.we_couldnt_verify_the_servers_certificate.asText(), ), ) } @@ -262,8 +262,8 @@ class LoginViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = LoginState.DialogState.Error( - title = R.string.log_in_denied.asText(), - message = R.string.captcha_failed.asText(), + title = BitwardenString.log_in_denied.asText(), + message = BitwardenString.captcha_failed.asText(), ), ) } @@ -294,7 +294,7 @@ class LoginViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = LoginState.DialogState.Loading( - message = R.string.logging_in.asText(), + message = BitwardenString.logging_in.asText(), ), ) } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/loginwithdevice/LoginWithDeviceScreen.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/loginwithdevice/LoginWithDeviceScreen.kt index 814a64b6ee..c15d668ab6 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/loginwithdevice/LoginWithDeviceScreen.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/loginwithdevice/LoginWithDeviceScreen.kt @@ -33,8 +33,8 @@ import com.bitwarden.ui.platform.base.util.EventsEffect import com.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar import com.bitwarden.ui.platform.components.util.rememberVectorPainter import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.platform.components.content.BitwardenLoadingContent import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenBasicDialog import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenLoadingDialog @@ -86,7 +86,7 @@ fun LoginWithDeviceScreen( title = state.toolbarTitle(), scrollBehavior = scrollBehavior, navigationIcon = rememberVectorPainter(id = BitwardenDrawable.ic_close), - navigationIconContentDescription = stringResource(id = R.string.close), + navigationIconContentDescription = stringResource(id = BitwardenString.close), onNavigationIconClick = remember(viewModel) { { viewModel.trySendAction(LoginWithDeviceAction.CloseButtonClick) } }, @@ -163,7 +163,7 @@ private fun LoginWithDeviceScreenContent( Spacer(modifier = Modifier.height(24.dp)) Text( - text = stringResource(id = R.string.fingerprint_phrase), + text = stringResource(id = BitwardenString.fingerprint_phrase), textAlign = TextAlign.Start, style = BitwardenTheme.typography.titleLarge, color = BitwardenTheme.colorScheme.text.primary, @@ -202,7 +202,7 @@ private fun LoginWithDeviceScreenContent( } else { BitwardenClickableText( modifier = Modifier.testTag("ResendNotificationButton"), - label = stringResource(id = R.string.resend_notification), + label = stringResource(id = BitwardenString.resend_notification), style = BitwardenTheme.typography.labelLarge, innerPadding = PaddingValues(vertical = 8.dp, horizontal = 16.dp), onClick = onResendNotificationClick, @@ -225,7 +225,7 @@ private fun LoginWithDeviceScreenContent( BitwardenClickableText( modifier = Modifier.testTag("ViewAllLoginOptionsButton"), - label = stringResource(id = R.string.view_all_login_options), + label = stringResource(id = BitwardenString.view_all_login_options), innerPadding = PaddingValues(vertical = 8.dp, horizontal = 16.dp), style = BitwardenTheme.typography.labelLarge, onClick = onViewAllLogInOptionsClick, diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/loginwithdevice/LoginWithDeviceViewModel.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/loginwithdevice/LoginWithDeviceViewModel.kt index 3e356b8c57..2c4acad807 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/loginwithdevice/LoginWithDeviceViewModel.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/loginwithdevice/LoginWithDeviceViewModel.kt @@ -5,9 +5,9 @@ import android.os.Parcelable import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.viewModelScope import com.bitwarden.ui.platform.base.BaseViewModel +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.auth.manager.model.CreateAuthRequestResult import com.x8bit.bitwarden.data.auth.repository.AuthRepository import com.x8bit.bitwarden.data.auth.repository.model.LoginResult @@ -154,8 +154,8 @@ class LoginWithDeviceViewModel @Inject constructor( isResendNotificationLoading = false, ), dialogState = LoginWithDeviceState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.generic_error_message.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.generic_error_message.asText(), error = result.error, ), ) @@ -175,7 +175,7 @@ class LoginWithDeviceViewModel @Inject constructor( ), dialogState = LoginWithDeviceState.DialogState.Error( title = null, - message = R.string.login_request_has_already_expired.asText(), + message = BitwardenString.login_request_has_already_expired.asText(), ), ) } @@ -191,8 +191,8 @@ class LoginWithDeviceViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = LoginWithDeviceState.DialogState.Error( - title = R.string.log_in_denied.asText(), - message = R.string.captcha_failed.asText(), + title = BitwardenString.log_in_denied.asText(), + message = BitwardenString.captcha_failed.asText(), ), ) } @@ -234,11 +234,11 @@ class LoginWithDeviceViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = LoginWithDeviceState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), + title = BitwardenString.an_error_has_occurred.asText(), message = loginResult .errorMessage ?.asText() - ?: R.string.generic_error_message.asText(), + ?: BitwardenString.generic_error_message.asText(), error = loginResult.error, ), ) @@ -249,8 +249,8 @@ class LoginWithDeviceViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = LoginWithDeviceState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.this_is_not_a_recognized_bitwarden_server_you_may_need_to_check_with_your_provider_or_update_your_server + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.this_is_not_a_recognized_bitwarden_server_you_may_need_to_check_with_your_provider_or_update_your_server .asText(), ), ) @@ -259,7 +259,7 @@ class LoginWithDeviceViewModel @Inject constructor( is LoginResult.Success -> { snackbarRelayManager.sendSnackbarData( - data = BitwardenSnackbarData(message = R.string.login_approved.asText()), + data = BitwardenSnackbarData(message = BitwardenString.login_approved.asText()), relay = SnackbarRelay.LOGIN_SUCCESS, ) mutableStateFlow.update { it.copy(dialogState = null) } @@ -269,8 +269,8 @@ class LoginWithDeviceViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = LoginWithDeviceState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.we_couldnt_verify_the_servers_certificate.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.we_couldnt_verify_the_servers_certificate.asText(), ), ) } @@ -280,11 +280,11 @@ class LoginWithDeviceViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = LoginWithDeviceState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), + title = BitwardenString.an_error_has_occurred.asText(), message = loginResult .errorMessage ?.asText() - ?: R.string.generic_error_message.asText(), + ?: BitwardenString.generic_error_message.asText(), ), ) } @@ -301,7 +301,7 @@ class LoginWithDeviceViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = LoginWithDeviceState.DialogState.Loading( - message = R.string.logging_in.asText(), + message = BitwardenString.logging_in.asText(), ), ) } @@ -381,9 +381,9 @@ data class LoginWithDeviceState( get() = when (loginWithDeviceType) { LoginWithDeviceType.OTHER_DEVICE, LoginWithDeviceType.SSO_OTHER_DEVICE, - -> R.string.log_in_with_device.asText() + -> BitwardenString.log_in_with_device.asText() - LoginWithDeviceType.SSO_ADMIN_APPROVAL -> R.string.log_in_initiated.asText() + LoginWithDeviceType.SSO_ADMIN_APPROVAL -> BitwardenString.log_in_initiated.asText() } /** @@ -418,10 +418,10 @@ data class LoginWithDeviceState( get() = when (loginWithDeviceType) { LoginWithDeviceType.OTHER_DEVICE, LoginWithDeviceType.SSO_OTHER_DEVICE, - -> R.string.log_in_initiated.asText() + -> BitwardenString.log_in_initiated.asText() LoginWithDeviceType.SSO_ADMIN_APPROVAL, - -> R.string.admin_approval_requested.asText() + -> BitwardenString.admin_approval_requested.asText() } /** @@ -431,10 +431,10 @@ data class LoginWithDeviceState( get() = when (loginWithDeviceType) { LoginWithDeviceType.OTHER_DEVICE, LoginWithDeviceType.SSO_OTHER_DEVICE, - -> R.string.a_notification_has_been_sent_to_your_device.asText() + -> BitwardenString.a_notification_has_been_sent_to_your_device.asText() LoginWithDeviceType.SSO_ADMIN_APPROVAL, - -> R.string.your_request_has_been_sent_to_your_admin.asText() + -> BitwardenString.your_request_has_been_sent_to_your_admin.asText() } /** @@ -445,10 +445,10 @@ data class LoginWithDeviceState( get() = when (loginWithDeviceType) { LoginWithDeviceType.OTHER_DEVICE, LoginWithDeviceType.SSO_OTHER_DEVICE, - -> R.string.please_make_sure_your_vault_is_unlocked_and_the_fingerprint_phrase_matches_on_the_other_device.asText() + -> BitwardenString.please_make_sure_your_vault_is_unlocked_and_the_fingerprint_phrase_matches_on_the_other_device.asText() LoginWithDeviceType.SSO_ADMIN_APPROVAL, - -> R.string.you_will_be_notified_once_approved.asText() + -> BitwardenString.you_will_be_notified_once_approved.asText() } /** @@ -459,9 +459,9 @@ data class LoginWithDeviceState( get() = when (loginWithDeviceType) { LoginWithDeviceType.OTHER_DEVICE, LoginWithDeviceType.SSO_OTHER_DEVICE, - -> R.string.log_in_with_device_must_be_set_up_in_the_settings_of_the_bitwarden_app_need_another_option.asText() + -> BitwardenString.log_in_with_device_must_be_set_up_in_the_settings_of_the_bitwarden_app_need_another_option.asText() - LoginWithDeviceType.SSO_ADMIN_APPROVAL -> R.string.trouble_logging_in.asText() + LoginWithDeviceType.SSO_ADMIN_APPROVAL -> BitwardenString.trouble_logging_in.asText() } /** diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/masterpasswordgenerator/MasterPasswordGeneratorScreen.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/masterpasswordgenerator/MasterPasswordGeneratorScreen.kt index 194129581d..307421ef49 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/masterpasswordgenerator/MasterPasswordGeneratorScreen.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/masterpasswordgenerator/MasterPasswordGeneratorScreen.kt @@ -34,8 +34,8 @@ import com.bitwarden.ui.platform.components.button.BitwardenTextButton import com.bitwarden.ui.platform.components.model.CardStyle import com.bitwarden.ui.platform.components.util.rememberVectorPainter import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.platform.components.field.BitwardenTextField import com.x8bit.bitwarden.ui.platform.components.scaffold.BitwardenScaffold import com.x8bit.bitwarden.ui.platform.components.snackbar.BitwardenSnackbarData @@ -155,19 +155,23 @@ private fun MasterPasswordGeneratorContent( Spacer(modifier = Modifier.height(12.dp)) BitwardenFilledButton( - label = stringResource(R.string.generate_button_label), + label = stringResource(BitwardenString.generate_button_label), onClick = onGenerateNewPassword, icon = rememberVectorPainter(id = BitwardenDrawable.ic_generate), modifier = Modifier.fillMaxWidth(), ) Spacer(modifier = Modifier.height(12.dp)) Text( - text = stringResource(R.string.write_this_password_down_and_keep_it_somewhere_safe), + text = stringResource( + BitwardenString.write_this_password_down_and_keep_it_somewhere_safe, + ), style = BitwardenTheme.typography.bodySmall, color = BitwardenTheme.colorScheme.text.primary, ) BitwardenClickableText( - label = stringResource(R.string.learn_about_other_ways_to_prevent_account_lockout), + label = stringResource( + BitwardenString.learn_about_other_ways_to_prevent_account_lockout, + ), style = BitwardenTheme.typography.labelMedium, onClick = onLearnToPreventLockout, innerPadding = PaddingValues(horizontal = 0.dp, vertical = 4.dp), @@ -183,14 +187,14 @@ private fun MasterPasswordGeneratorTopBar( onSaveClick: () -> Unit, ) { BitwardenTopAppBar( - title = stringResource(R.string.generate_master_password), + title = stringResource(BitwardenString.generate_master_password), scrollBehavior = scrollBehavior, navigationIcon = rememberVectorPainter(id = BitwardenDrawable.ic_back), - navigationIconContentDescription = stringResource(id = R.string.back), + navigationIconContentDescription = stringResource(id = BitwardenString.back), onNavigationIconClick = onBackClick, actions = { BitwardenTextButton( - label = stringResource(id = R.string.save), + label = stringResource(id = BitwardenString.save), onClick = onSaveClick, ) }, diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/masterpasswordgenerator/MasterPasswordGeneratorViewModel.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/masterpasswordgenerator/MasterPasswordGeneratorViewModel.kt index 850289d42f..a76363b11c 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/masterpasswordgenerator/MasterPasswordGeneratorViewModel.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/masterpasswordgenerator/MasterPasswordGeneratorViewModel.kt @@ -6,9 +6,9 @@ import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.viewModelScope import com.bitwarden.generators.PassphraseGeneratorRequest import com.bitwarden.ui.platform.base.BaseViewModel +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.auth.repository.model.PolicyInformation import com.x8bit.bitwarden.data.platform.manager.PolicyManager import com.x8bit.bitwarden.data.platform.manager.util.getActivePolicies @@ -94,7 +94,7 @@ class MasterPasswordGeneratorViewModel @Inject constructor( is GeneratedPassphraseResult.InvalidRequest -> { sendEvent( MasterPasswordGeneratorEvent.ShowSnackbar( - R.string.an_error_has_occurred.asText(), + BitwardenString.an_error_has_occurred.asText(), ), ) } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/masterpasswordguidance/MasterPasswordGuidanceScreen.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/masterpasswordguidance/MasterPasswordGuidanceScreen.kt index 394f3b4676..a11008f254 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/masterpasswordguidance/MasterPasswordGuidanceScreen.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/masterpasswordguidance/MasterPasswordGuidanceScreen.kt @@ -30,8 +30,8 @@ import com.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar import com.bitwarden.ui.platform.components.content.model.ContentBlockData import com.bitwarden.ui.platform.components.util.rememberVectorPainter import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.platform.components.card.BitwardenActionCard import com.x8bit.bitwarden.ui.platform.components.card.BitwardenContentCard import com.x8bit.bitwarden.ui.platform.components.scaffold.BitwardenScaffold @@ -63,10 +63,10 @@ fun MasterPasswordGuidanceScreen( .nestedScroll(scrollBehavior.nestedScrollConnection), topBar = { BitwardenTopAppBar( - title = stringResource(id = R.string.master_password), + title = stringResource(id = BitwardenString.master_password), scrollBehavior = scrollBehavior, navigationIcon = rememberVectorPainter(id = BitwardenDrawable.ic_close), - navigationIconContentDescription = stringResource(id = R.string.close), + navigationIconContentDescription = stringResource(id = BitwardenString.close), onNavigationIconClick = remember(viewModel) { { viewModel.trySendAction(MasterPasswordGuidanceAction.CloseAction) @@ -99,7 +99,7 @@ private fun MasterPasswordGuidanceContent( Column(modifier = modifier) { Spacer(modifier = Modifier.height(24.dp)) Text( - text = stringResource(R.string.a_secure_memorable_password), + text = stringResource(BitwardenString.a_secure_memorable_password), textAlign = TextAlign.Center, style = BitwardenTheme.typography.titleMedium, color = BitwardenTheme.colorScheme.text.primary, @@ -110,7 +110,7 @@ private fun MasterPasswordGuidanceContent( Spacer(modifier = Modifier.height(8.dp)) Text( text = stringResource( - R.string.one_of_the_best_ways_to_create_a_secure_and_memorable_password, + BitwardenString.one_of_the_best_ways_to_create_a_secure_and_memorable_password, ), textAlign = TextAlign.Center, style = BitwardenTheme.typography.bodyMedium, @@ -137,25 +137,25 @@ private fun MasterPasswordGuidanceContentBlocks(modifier: Modifier = Modifier) { BitwardenContentCard( contentItems = persistentListOf( ContentBlockData( - headerText = stringResource(R.string.choose_three_or_four_random_words) + headerText = stringResource(BitwardenString.choose_three_or_four_random_words) .toAnnotatedString(), subtitleText = annotatedStringResource( - id = R.string.pick_three_or_four_random_unrelated_words, + id = BitwardenString.pick_three_or_four_random_unrelated_words, ), iconVectorResource = BitwardenDrawable.ic_number1, ), ContentBlockData( - headerText = stringResource(R.string.combine_those_words_together) + headerText = stringResource(BitwardenString.combine_those_words_together) .toAnnotatedString(), subtitleText = annotatedStringResource( - id = R.string.put_the_words_together_in_any_order_to_form_your_passphrase, + id = BitwardenString.put_the_words_together_in_any_order_to_form_your_passphrase, ), iconVectorResource = BitwardenDrawable.ic_number2, ), ContentBlockData( - headerText = stringResource(R.string.make_it_yours).toAnnotatedString(), + headerText = stringResource(BitwardenString.make_it_yours).toAnnotatedString(), subtitleText = annotatedStringResource( - id = R.string.add_a_number_or_symbol_to_make_it_even_stronger, + id = BitwardenString.add_a_number_or_symbol_to_make_it_even_stronger, ), iconVectorResource = BitwardenDrawable.ic_number3, ), @@ -171,8 +171,8 @@ private fun NeedSomeInspirationCard( modifier: Modifier = Modifier, ) { BitwardenActionCard( - cardTitle = stringResource(R.string.need_some_inspiration), - actionText = stringResource(R.string.check_out_the_passphrase_generator), + cardTitle = stringResource(BitwardenString.need_some_inspiration), + actionText = stringResource(BitwardenString.check_out_the_passphrase_generator), onActionClick = onActionClicked, modifier = modifier.fillMaxWidth(), ) diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/masterpasswordhint/MasterPasswordHintScreen.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/masterpasswordhint/MasterPasswordHintScreen.kt index 696caa3b4c..b57a887730 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/masterpasswordhint/MasterPasswordHintScreen.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/masterpasswordhint/MasterPasswordHintScreen.kt @@ -27,7 +27,7 @@ import com.bitwarden.ui.platform.components.button.BitwardenTextButton import com.bitwarden.ui.platform.components.model.CardStyle import com.bitwarden.ui.platform.components.util.rememberVectorPainter import com.bitwarden.ui.platform.resource.BitwardenDrawable -import com.x8bit.bitwarden.R +import com.bitwarden.ui.platform.resource.BitwardenString import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenBasicDialog import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenLoadingDialog import com.x8bit.bitwarden.ui.platform.components.field.BitwardenTextField @@ -53,8 +53,8 @@ fun MasterPasswordHintScreen( when (val dialogState = state.dialog) { is MasterPasswordHintState.DialogState.PasswordHintSent -> { BitwardenBasicDialog( - title = stringResource(id = R.string.password_hint), - message = stringResource(id = R.string.password_hint_alert), + title = stringResource(id = BitwardenString.password_hint), + message = stringResource(id = BitwardenString.password_hint_alert), onDismissRequest = remember(viewModel) { { viewModel.trySendAction(MasterPasswordHintAction.DismissDialog) } }, @@ -70,7 +70,7 @@ fun MasterPasswordHintScreen( title = dialogState .title ?.invoke() - ?: stringResource(id = R.string.an_error_has_occurred), + ?: stringResource(id = BitwardenString.an_error_has_occurred), message = dialogState.message(), throwable = dialogState.error, onDismissRequest = remember(viewModel) { @@ -89,16 +89,16 @@ fun MasterPasswordHintScreen( .nestedScroll(scrollBehavior.nestedScrollConnection), topBar = { BitwardenTopAppBar( - title = stringResource(id = R.string.password_hint), + title = stringResource(id = BitwardenString.password_hint), scrollBehavior = scrollBehavior, navigationIcon = rememberVectorPainter(id = BitwardenDrawable.ic_close), - navigationIconContentDescription = stringResource(id = R.string.close), + navigationIconContentDescription = stringResource(id = BitwardenString.close), onNavigationIconClick = remember(viewModel) { { viewModel.trySendAction(MasterPasswordHintAction.CloseClick) } }, actions = { BitwardenTextButton( - label = stringResource(id = R.string.submit), + label = stringResource(id = BitwardenString.submit), onClick = remember(viewModel) { { viewModel.trySendAction(MasterPasswordHintAction.SubmitClick) } }, @@ -120,10 +120,10 @@ fun MasterPasswordHintScreen( onValueChange = remember(viewModel) { { viewModel.trySendAction(MasterPasswordHintAction.EmailInputChange(it)) } }, - label = stringResource(id = R.string.email_address), + label = stringResource(id = BitwardenString.email_address), keyboardType = KeyboardType.Email, textFieldTestTag = "MasterPasswordHintEmailField", - supportingText = stringResource(id = R.string.enter_email_for_hint), + supportingText = stringResource(id = BitwardenString.enter_email_for_hint), cardStyle = CardStyle.Full, ) Spacer(modifier = Modifier.height(height = 16.dp)) diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/masterpasswordhint/MasterPasswordHintViewModel.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/masterpasswordhint/MasterPasswordHintViewModel.kt index e98431f95d..c27eeb3fe5 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/masterpasswordhint/MasterPasswordHintViewModel.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/masterpasswordhint/MasterPasswordHintViewModel.kt @@ -4,9 +4,9 @@ import android.os.Parcelable import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.viewModelScope import com.bitwarden.ui.platform.base.BaseViewModel +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.auth.repository.AuthRepository import com.x8bit.bitwarden.data.auth.repository.model.PasswordHintResult import com.x8bit.bitwarden.data.platform.manager.network.NetworkConnectionManager @@ -68,8 +68,8 @@ class MasterPasswordHintViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialog = MasterPasswordHintState.DialogState.Error( - title = R.string.internet_connection_required_title.asText(), - message = R.string.internet_connection_required_message.asText(), + title = BitwardenString.internet_connection_required_title.asText(), + message = BitwardenString.internet_connection_required_message.asText(), ), ) } @@ -80,9 +80,9 @@ class MasterPasswordHintViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialog = MasterPasswordHintState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.validation_field_required - .asText(R.string.email_address.asText()), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.validation_field_required + .asText(BitwardenString.email_address.asText()), ), ) } @@ -90,11 +90,11 @@ class MasterPasswordHintViewModel @Inject constructor( } if (!email.contains("@")) { - val errorMessage = R.string.invalid_email.asText() + val errorMessage = BitwardenString.invalid_email.asText() mutableStateFlow.update { it.copy( dialog = MasterPasswordHintState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), + title = BitwardenString.an_error_has_occurred.asText(), message = errorMessage, ), ) @@ -105,7 +105,7 @@ class MasterPasswordHintViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialog = MasterPasswordHintState.DialogState.Loading( - R.string.submitting.asText(), + BitwardenString.submitting.asText(), ), ) } @@ -130,9 +130,9 @@ class MasterPasswordHintViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialog = MasterPasswordHintState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), + title = BitwardenString.an_error_has_occurred.asText(), message = result.message?.asText() - ?: R.string.generic_error_message.asText(), + ?: BitwardenString.generic_error_message.asText(), error = result.error, ), ) diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/preventaccountlockout/PreventAccountLockoutScreen.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/preventaccountlockout/PreventAccountLockoutScreen.kt index f3e72fc0b4..0575eeabc2 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/preventaccountlockout/PreventAccountLockoutScreen.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/preventaccountlockout/PreventAccountLockoutScreen.kt @@ -28,8 +28,8 @@ import com.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar import com.bitwarden.ui.platform.components.content.model.ContentBlockData import com.bitwarden.ui.platform.components.util.rememberVectorPainter import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.platform.components.card.BitwardenContentCard import com.x8bit.bitwarden.ui.platform.components.scaffold.BitwardenScaffold import kotlinx.collections.immutable.persistentListOf @@ -57,10 +57,10 @@ fun PreventAccountLockoutScreen( .nestedScroll(scrollBehavior.nestedScrollConnection), topBar = { BitwardenTopAppBar( - title = stringResource(R.string.prevent_account_lockout), + title = stringResource(BitwardenString.prevent_account_lockout), scrollBehavior = scrollBehavior, navigationIcon = rememberVectorPainter(id = BitwardenDrawable.ic_close), - navigationIconContentDescription = stringResource(id = R.string.close), + navigationIconContentDescription = stringResource(id = BitwardenString.close), onNavigationIconClick = remember(viewModel) { { viewModel.trySendAction(PreventAccountLockoutAction.CloseClickAction) @@ -83,7 +83,7 @@ private fun PreventAccountLockoutContent(modifier: Modifier = Modifier) { Column(modifier = modifier) { Spacer(modifier = Modifier.height(24.dp)) Text( - text = stringResource(R.string.never_lose_access_to_your_vault), + text = stringResource(BitwardenString.never_lose_access_to_your_vault), textAlign = TextAlign.Center, style = BitwardenTheme.typography.titleMedium, color = BitwardenTheme.colorScheme.text.primary, @@ -94,7 +94,7 @@ private fun PreventAccountLockoutContent(modifier: Modifier = Modifier) { Spacer(modifier = Modifier.height(8.dp)) Text( text = stringResource( - R.string.the_best_way_to_make_sure_you_can_always_access_your_vault, + BitwardenString.the_best_way_to_make_sure_you_can_always_access_your_vault, ), textAlign = TextAlign.Center, style = BitwardenTheme.typography.bodyMedium, @@ -105,15 +105,15 @@ private fun PreventAccountLockoutContent(modifier: Modifier = Modifier) { BitwardenContentCard( contentItems = persistentListOf( ContentBlockData( - headerText = stringResource(R.string.create_a_hint), + headerText = stringResource(BitwardenString.create_a_hint), subtitleText = stringResource( - R.string.your_hint_will_be_send_to_you_via_email_when_you_request_it, + BitwardenString.your_hint_will_be_send_to_you_via_email_when_you_request_it, ), iconVectorResource = BitwardenDrawable.ic_light_bulb, ), ContentBlockData( - headerText = stringResource(R.string.write_your_password_down), - subtitleText = stringResource(R.string.keep_it_secret_keep_it_safe), + headerText = stringResource(BitwardenString.write_your_password_down), + subtitleText = stringResource(BitwardenString.keep_it_secret_keep_it_safe), iconVectorResource = BitwardenDrawable.ic_pencil, ), ), diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/removepassword/RemovePasswordScreen.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/removepassword/RemovePasswordScreen.kt index 53e725f150..36f5db79a4 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/removepassword/RemovePasswordScreen.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/removepassword/RemovePasswordScreen.kt @@ -28,9 +28,9 @@ import com.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar import com.bitwarden.ui.platform.components.button.BitwardenFilledButton import com.bitwarden.ui.platform.components.button.BitwardenOutlinedButton import com.bitwarden.ui.platform.components.model.CardStyle +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenBasicDialog import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenLoadingDialog import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenTwoButtonDialog @@ -65,7 +65,7 @@ fun RemovePasswordScreen( .nestedScroll(scrollBehavior.nestedScrollConnection), topBar = { BitwardenTopAppBar( - title = stringResource(id = R.string.remove_master_password), + title = stringResource(id = BitwardenString.remove_master_password), scrollBehavior = scrollBehavior, navigationIcon = null, ) @@ -149,7 +149,7 @@ private fun RemovePasswordScreenContent( Spacer(modifier = Modifier.height(16.dp)) BitwardenPasswordField( - label = stringResource(id = R.string.master_password), + label = stringResource(id = BitwardenString.master_password), value = state.input, onValueChange = onInputChanged, showPasswordTestTag = "PasswordVisibilityToggle", @@ -163,7 +163,7 @@ private fun RemovePasswordScreenContent( Spacer(modifier = Modifier.height(24.dp)) BitwardenFilledButton( - label = stringResource(id = R.string.continue_text), + label = stringResource(id = BitwardenString.continue_text), onClick = onContinueClick, isEnabled = state.input.isNotEmpty(), modifier = Modifier @@ -175,7 +175,7 @@ private fun RemovePasswordScreenContent( Spacer(modifier = Modifier.height(12.dp)) BitwardenOutlinedButton( - label = stringResource(id = R.string.leave_organization), + label = stringResource(id = BitwardenString.leave_organization), onClick = onLeaveOrganizationClick, modifier = Modifier .testTag("LeaveOrganizationButton") @@ -209,10 +209,10 @@ private fun RemovePasswordDialogs( is RemovePasswordState.DialogState.LeaveConfirmationPrompt -> { BitwardenTwoButtonDialog( - title = stringResource(id = R.string.leave_organization), + title = stringResource(id = BitwardenString.leave_organization), message = dialogState.message.invoke(), - confirmButtonText = stringResource(id = R.string.confirm), - dismissButtonText = stringResource(id = R.string.cancel), + confirmButtonText = stringResource(id = BitwardenString.confirm), + dismissButtonText = stringResource(id = BitwardenString.cancel), onConfirmClick = onConfirmLeaveClick, onDismissClick = onDismissRequest, onDismissRequest = onDismissRequest, diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/removepassword/RemovePasswordViewModel.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/removepassword/RemovePasswordViewModel.kt index c9c21ac478..4cbdfff7a8 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/removepassword/RemovePasswordViewModel.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/removepassword/RemovePasswordViewModel.kt @@ -5,9 +5,9 @@ import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.viewModelScope import com.bitwarden.ui.platform.base.BaseViewModel import com.bitwarden.ui.platform.base.util.orNullIfBlank +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.auth.repository.AuthRepository import com.x8bit.bitwarden.data.auth.repository.model.LeaveOrganizationResult import com.x8bit.bitwarden.data.auth.repository.model.LogoutReason @@ -36,10 +36,10 @@ class RemovePasswordViewModel @Inject constructor( RemovePasswordState( input = "", - description = R.string.password_no_longer_required_confirm_domain.asText(), - labelOrg = R.string.key_connector_organization.asText(), + description = BitwardenString.password_no_longer_required_confirm_domain.asText(), + labelOrg = BitwardenString.key_connector_organization.asText(), orgName = org?.name?.asText(), - labelDomain = R.string.key_connector_domain.asText(), + labelDomain = BitwardenString.key_connector_domain.asText(), domainName = org?.keyConnectorUrl?.asText(), dialogState = null, organizationId = org?.id.orNullIfBlank(), @@ -71,7 +71,7 @@ class RemovePasswordViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = RemovePasswordState.DialogState.LeaveConfirmationPrompt( - message = R.string.leave_organization_name.asText(state.orgName ?: ""), + message = BitwardenString.leave_organization_name.asText(state.orgName ?: ""), ), ) } @@ -82,9 +82,9 @@ class RemovePasswordViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = RemovePasswordState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.validation_field_required - .asText(R.string.master_password.asText()), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.validation_field_required + .asText(BitwardenString.master_password.asText()), ), ) } @@ -93,7 +93,7 @@ class RemovePasswordViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = RemovePasswordState.DialogState.Loading( - title = R.string.deleting.asText(), + title = BitwardenString.deleting.asText(), ), ) } @@ -119,8 +119,8 @@ class RemovePasswordViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = RemovePasswordState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.generic_error_message.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.generic_error_message.asText(), error = result.error, ), ) @@ -131,8 +131,8 @@ class RemovePasswordViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = RemovePasswordState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.invalid_master_password.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.invalid_master_password.asText(), ), ) } @@ -149,7 +149,7 @@ class RemovePasswordViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = RemovePasswordState.DialogState.Loading( - title = R.string.loading.asText(), + title = BitwardenString.loading.asText(), ), ) } @@ -173,8 +173,8 @@ class RemovePasswordViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = RemovePasswordState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.generic_error_message.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.generic_error_message.asText(), error = result.error, ), ) diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/resetpassword/ResetPasswordScreen.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/resetpassword/ResetPasswordScreen.kt index 59e949aacf..01c3e8d597 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/resetpassword/ResetPasswordScreen.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/resetpassword/ResetPasswordScreen.kt @@ -35,8 +35,8 @@ import com.bitwarden.ui.platform.components.appbar.action.BitwardenOverflowActio import com.bitwarden.ui.platform.components.appbar.model.OverflowMenuItemData import com.bitwarden.ui.platform.components.button.BitwardenTextButton import com.bitwarden.ui.platform.components.model.CardStyle +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.auth.datasource.disk.model.ForcePasswordResetReason import com.x8bit.bitwarden.ui.auth.feature.completeregistration.PasswordStrengthIndicator import com.x8bit.bitwarden.ui.auth.feature.completeregistration.PasswordStrengthState @@ -94,10 +94,10 @@ fun ResetPasswordScreen( } if (shouldShowLogoutConfirmationDialog) { BitwardenTwoButtonDialog( - title = stringResource(id = R.string.log_out), - message = stringResource(id = R.string.logout_confirmation), - confirmButtonText = stringResource(id = R.string.yes), - dismissButtonText = stringResource(id = R.string.cancel), + title = stringResource(id = BitwardenString.log_out), + message = stringResource(id = BitwardenString.logout_confirmation), + confirmButtonText = stringResource(id = BitwardenString.yes), + dismissButtonText = stringResource(id = BitwardenString.cancel), onConfirmClick = { shouldShowLogoutConfirmationDialog = false onLogoutClicked() @@ -114,22 +114,22 @@ fun ResetPasswordScreen( .nestedScroll(scrollBehavior.nestedScrollConnection), topBar = { BitwardenTopAppBar( - title = stringResource(id = R.string.update_master_password), + title = stringResource(id = BitwardenString.update_master_password), navigationIcon = null, scrollBehavior = scrollBehavior, actions = { BitwardenTextButton( - label = stringResource(id = R.string.save), + label = stringResource(id = BitwardenString.save), onClick = remember(viewModel) { { viewModel.trySendAction(ResetPasswordAction.SaveClick) } }, modifier = Modifier.testTag("SaveButton"), ) BitwardenOverflowActionItem( - contentDescription = stringResource(R.string.more), + contentDescription = stringResource(BitwardenString.more), menuItemDataList = persistentListOf( OverflowMenuItemData( - text = stringResource(R.string.log_out), + text = stringResource(BitwardenString.log_out), onClick = { shouldShowLogoutConfirmationDialog = true }, ), ), @@ -179,9 +179,9 @@ private fun ResetPasswordScreenContent( Spacer(modifier = Modifier.height(height = 12.dp)) val instructionsTextId = if (state.resetReason == ForcePasswordResetReason.WEAK_MASTER_PASSWORD_ON_LOGIN) { - R.string.update_weak_master_password_warning + BitwardenString.update_weak_master_password_warning } else { - R.string.update_master_password_warning + BitwardenString.update_master_password_warning } BitwardenInfoCalloutCard( text = stringResource(id = instructionsTextId), @@ -194,7 +194,7 @@ private fun ResetPasswordScreenContent( if (state.resetReason == ForcePasswordResetReason.WEAK_MASTER_PASSWORD_ON_LOGIN) { val passwordPolicyContent = listOf( - stringResource(id = R.string.master_password_policy_in_effect), + stringResource(id = BitwardenString.master_password_policy_in_effect), ) .plus(state.policies.map { it() }) .joinToString("\n • ") @@ -207,7 +207,7 @@ private fun ResetPasswordScreenContent( Spacer(modifier = Modifier.height(16.dp)) BitwardenPasswordField( - label = stringResource(id = R.string.current_master_password_required), + label = stringResource(id = BitwardenString.current_master_password_required), value = state.currentPasswordInput, onValueChange = onCurrentPasswordInputChanged, passwordFieldTestTag = "MasterPasswordField", @@ -220,7 +220,7 @@ private fun ResetPasswordScreenContent( var isPasswordVisible by rememberSaveable { mutableStateOf(false) } BitwardenPasswordField( - label = stringResource(id = R.string.new_master_password_required), + label = stringResource(id = BitwardenString.new_master_password_required), value = state.passwordInput, onValueChange = onPasswordInputChanged, showPassword = isPasswordVisible, @@ -246,7 +246,7 @@ private fun ResetPasswordScreenContent( ) BitwardenPasswordField( - label = stringResource(id = R.string.retype_new_master_password_required), + label = stringResource(id = BitwardenString.retype_new_master_password_required), value = state.retypePasswordInput, onValueChange = onRetypePasswordInputChanged, showPassword = isPasswordVisible, @@ -259,24 +259,26 @@ private fun ResetPasswordScreenContent( ) BitwardenTextField( - label = stringResource(id = R.string.new_master_password_hint), + label = stringResource(id = BitwardenString.new_master_password_hint), value = state.passwordHintInput, onValueChange = onPasswordHintInputChanged, supportingContent = { Column { Text( text = stringResource( - R.string.bitwarden_cannot_reset_a_lost_or_forgotten_master_password, + BitwardenString + .bitwarden_cannot_reset_a_lost_or_forgotten_master_password, ), style = BitwardenTheme.typography.bodySmall, color = BitwardenTheme.colorScheme.text.secondary, modifier = Modifier.fillMaxWidth(), ) BitwardenHyperTextLink( - annotatedResId = R.string.learn_about_ways_to_prevent_account_lockout, + annotatedResId = + BitwardenString.learn_about_ways_to_prevent_account_lockout, annotationKey = "onPreventAccountLockout", accessibilityString = stringResource( - R.string.learn_about_ways_to_prevent_account_lockout, + BitwardenString.learn_about_ways_to_prevent_account_lockout, ), onClick = onLearnToPreventLockout, ) diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/resetpassword/ResetPasswordViewModel.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/resetpassword/ResetPasswordViewModel.kt index 0124c5b4bb..e64bea4cfa 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/resetpassword/ResetPasswordViewModel.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/resetpassword/ResetPasswordViewModel.kt @@ -5,9 +5,9 @@ import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.viewModelScope import com.bitwarden.ui.platform.base.BaseViewModel import com.bitwarden.ui.platform.base.util.orNullIfBlank +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.auth.datasource.disk.model.ForcePasswordResetReason import com.x8bit.bitwarden.data.auth.datasource.sdk.model.PasswordStrength import com.x8bit.bitwarden.data.auth.repository.AuthRepository @@ -173,9 +173,9 @@ class ResetPasswordViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = ResetPasswordState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.validation_field_required - .asText(R.string.master_password.asText()), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.validation_field_required + .asText(BitwardenString.master_password.asText()), ), ) } @@ -198,8 +198,8 @@ class ResetPasswordViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = ResetPasswordState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.master_password_length_val_message_x + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.master_password_length_val_message_x .asText(MIN_PASSWORD_LENGTH), ), ) @@ -291,8 +291,8 @@ class ResetPasswordViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = ResetPasswordState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.generic_error_message.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.generic_error_message.asText(), error = result.error, ), ) @@ -317,8 +317,8 @@ class ResetPasswordViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = ResetPasswordState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.generic_error_message.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.generic_error_message.asText(), error = result.error, ), ) @@ -331,8 +331,8 @@ class ResetPasswordViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = ResetPasswordState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.invalid_master_password.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.invalid_master_password.asText(), ), ) } @@ -355,8 +355,9 @@ class ResetPasswordViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = ResetPasswordState.DialogState.Error( - title = R.string.master_password_policy_validation_title.asText(), - message = R.string.master_password_policy_validation_message.asText(), + title = BitwardenString.master_password_policy_validation_title.asText(), + message = BitwardenString.master_password_policy_validation_message + .asText(), ), ) } @@ -384,8 +385,8 @@ class ResetPasswordViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = ResetPasswordState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.master_password_confirmation_val_message.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.master_password_confirmation_val_message.asText(), ), ) } @@ -400,7 +401,7 @@ class ResetPasswordViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = ResetPasswordState.DialogState.Loading( - message = R.string.updating_password.asText(), + message = BitwardenString.updating_password.asText(), ), ) } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/resetpassword/util/PolicyInformationMasterPasswordExtensions.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/resetpassword/util/PolicyInformationMasterPasswordExtensions.kt index e91e42ac8b..fcbbe5e878 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/resetpassword/util/PolicyInformationMasterPasswordExtensions.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/resetpassword/util/PolicyInformationMasterPasswordExtensions.kt @@ -1,8 +1,8 @@ package com.x8bit.bitwarden.ui.auth.feature.resetpassword.util +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.auth.repository.model.PolicyInformation /** @@ -13,27 +13,27 @@ fun List.toDisplayLabels(): List { val list = mutableListOf() mapNotNull { it.minLength }.maxOrNull()?.let { - list.add(R.string.policy_in_effect_min_length.asText(it)) + list.add(BitwardenString.policy_in_effect_min_length.asText(it)) } mapNotNull { it.minComplexity }.maxOrNull()?.let { - list.add(R.string.policy_in_effect_min_complexity.asText(it)) + list.add(BitwardenString.policy_in_effect_min_complexity.asText(it)) } if (mapNotNull { it.requireUpper }.any { it }) { - list.add(R.string.policy_in_effect_uppercase.asText()) + list.add(BitwardenString.policy_in_effect_uppercase.asText()) } if (mapNotNull { it.requireLower }.any { it }) { - list.add(R.string.policy_in_effect_lowercase.asText()) + list.add(BitwardenString.policy_in_effect_lowercase.asText()) } if (mapNotNull { it.requireNumbers }.any { it }) { - list.add(R.string.policy_in_effect_numbers.asText()) + list.add(BitwardenString.policy_in_effect_numbers.asText()) } if (mapNotNull { it.requireSpecial }.any { it }) { - list.add(R.string.policy_in_effect_special.asText()) + list.add(BitwardenString.policy_in_effect_special.asText()) } return list diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/setpassword/SetPasswordScreen.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/setpassword/SetPasswordScreen.kt index 9ab723d227..2b6ba62330 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/setpassword/SetPasswordScreen.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/setpassword/SetPasswordScreen.kt @@ -29,8 +29,8 @@ import com.bitwarden.ui.platform.base.util.standardHorizontalMargin import com.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar import com.bitwarden.ui.platform.components.button.BitwardenTextButton import com.bitwarden.ui.platform.components.model.CardStyle +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.platform.components.card.BitwardenInfoCalloutCard import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenBasicDialog import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenLoadingDialog @@ -61,19 +61,19 @@ fun SetPasswordScreen( .nestedScroll(scrollBehavior.nestedScrollConnection), topBar = { BitwardenTopAppBar( - title = stringResource(id = R.string.set_master_password), + title = stringResource(id = BitwardenString.set_master_password), navigationIcon = null, scrollBehavior = scrollBehavior, actions = { BitwardenTextButton( - label = stringResource(id = R.string.cancel), + label = stringResource(id = BitwardenString.cancel), onClick = remember(viewModel) { { viewModel.trySendAction(SetPasswordAction.CancelClick) } }, modifier = Modifier.testTag("CancelButton"), ) BitwardenTextButton( - label = stringResource(id = R.string.submit), + label = stringResource(id = BitwardenString.submit), onClick = remember(viewModel) { { viewModel.trySendAction(SetPasswordAction.SubmitClick) } }, @@ -116,7 +116,7 @@ private fun SetPasswordScreenContent( Spacer(modifier = Modifier.height(height = 12.dp)) Text( text = stringResource( - id = R.string.your_organization_requires_you_to_set_a_master_password, + id = BitwardenString.your_organization_requires_you_to_set_a_master_password, ), style = BitwardenTheme.typography.bodyMedium, color = BitwardenTheme.colorScheme.text.primary, @@ -128,7 +128,7 @@ private fun SetPasswordScreenContent( Spacer(modifier = Modifier.height(16.dp)) BitwardenInfoCalloutCard( - text = stringResource(id = R.string.reset_password_auto_enroll_invite_warning), + text = stringResource(id = BitwardenString.reset_password_auto_enroll_invite_warning), modifier = Modifier .standardHorizontalMargin() .fillMaxWidth(), @@ -138,12 +138,12 @@ private fun SetPasswordScreenContent( var isPasswordVisible by rememberSaveable { mutableStateOf(false) } BitwardenPasswordField( - label = stringResource(id = R.string.master_password), + label = stringResource(id = BitwardenString.master_password), value = state.passwordInput, onValueChange = onPasswordInputChanged, showPassword = isPasswordVisible, showPasswordChange = { isPasswordVisible = it }, - supportingText = stringResource(id = R.string.master_password_description), + supportingText = stringResource(id = BitwardenString.master_password_description), passwordFieldTestTag = "NewPasswordField", cardStyle = CardStyle.Top(dividerPadding = 0.dp), modifier = Modifier @@ -152,7 +152,7 @@ private fun SetPasswordScreenContent( ) BitwardenPasswordField( - label = stringResource(id = R.string.retype_master_password), + label = stringResource(id = BitwardenString.retype_master_password), value = state.retypePasswordInput, onValueChange = onRetypePasswordInputChanged, showPassword = isPasswordVisible, @@ -165,10 +165,10 @@ private fun SetPasswordScreenContent( ) BitwardenTextField( - label = stringResource(id = R.string.master_password_hint), + label = stringResource(id = BitwardenString.master_password_hint), value = state.passwordHintInput, onValueChange = onPasswordHintInputChanged, - supportingText = stringResource(id = R.string.master_password_hint_description), + supportingText = stringResource(id = BitwardenString.master_password_hint_description), textFieldTestTag = "MasterPasswordHintLabel", cardStyle = CardStyle.Bottom, modifier = Modifier diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/setpassword/SetPasswordViewModel.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/setpassword/SetPasswordViewModel.kt index c8daf0ff80..184052b7e0 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/setpassword/SetPasswordViewModel.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/setpassword/SetPasswordViewModel.kt @@ -4,9 +4,9 @@ import android.os.Parcelable import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.viewModelScope import com.bitwarden.ui.platform.base.BaseViewModel +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.auth.repository.AuthRepository import com.x8bit.bitwarden.data.auth.repository.model.LogoutReason import com.x8bit.bitwarden.data.auth.repository.model.SetPasswordResult @@ -88,9 +88,9 @@ class SetPasswordViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = SetPasswordState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.validation_field_required - .asText(R.string.master_password.asText()), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.validation_field_required + .asText(BitwardenString.master_password.asText()), ), ) } @@ -110,8 +110,8 @@ class SetPasswordViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = SetPasswordState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.master_password_length_val_message_x + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.master_password_length_val_message_x .asText(MIN_PASSWORD_LENGTH), ), ) @@ -122,8 +122,8 @@ class SetPasswordViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = SetPasswordState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.master_password_confirmation_val_message.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.master_password_confirmation_val_message.asText(), ), ) } @@ -189,8 +189,8 @@ class SetPasswordViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = SetPasswordState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.generic_error_message.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.generic_error_message.asText(), error = result.error, ), ) @@ -215,8 +215,9 @@ class SetPasswordViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = SetPasswordState.DialogState.Error( - title = R.string.master_password_policy_validation_title.asText(), - message = R.string.master_password_policy_validation_message.asText(), + title = BitwardenString.master_password_policy_validation_title.asText(), + message = + BitwardenString.master_password_policy_validation_message.asText(), ), ) } @@ -231,7 +232,7 @@ class SetPasswordViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = SetPasswordState.DialogState.Loading( - message = R.string.updating_password.asText(), + message = BitwardenString.updating_password.asText(), ), ) } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/startregistration/StartRegistrationScreen.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/startregistration/StartRegistrationScreen.kt index 71684bb7fa..4341af811c 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/startregistration/StartRegistrationScreen.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/startregistration/StartRegistrationScreen.kt @@ -48,8 +48,8 @@ import com.bitwarden.ui.platform.components.model.CardStyle import com.bitwarden.ui.platform.components.toggle.BitwardenSwitch import com.bitwarden.ui.platform.components.util.rememberVectorPainter import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.auth.feature.startregistration.StartRegistrationAction.ErrorDialogDismiss import com.x8bit.bitwarden.ui.auth.feature.startregistration.StartRegistrationEvent.NavigateToPrivacyPolicy import com.x8bit.bitwarden.ui.auth.feature.startregistration.StartRegistrationEvent.NavigateToTerms @@ -121,10 +121,10 @@ fun StartRegistrationScreen( .nestedScroll(scrollBehavior.nestedScrollConnection), topBar = { BitwardenTopAppBar( - title = stringResource(id = R.string.create_account), + title = stringResource(id = BitwardenString.create_account), scrollBehavior = scrollBehavior, navigationIcon = rememberVectorPainter(id = BitwardenDrawable.ic_close), - navigationIconContentDescription = stringResource(id = R.string.close), + navigationIconContentDescription = stringResource(id = BitwardenString.close), onNavigationIconClick = handler.onCloseClick, ) }, @@ -159,7 +159,7 @@ private fun StartRegistrationDialogs( } StartRegistrationDialog.Loading -> { - BitwardenLoadingDialog(text = stringResource(id = R.string.create_account)) + BitwardenLoadingDialog(text = stringResource(id = BitwardenString.create_account)) } null -> Unit @@ -199,7 +199,7 @@ private fun StartRegistrationContent( Spacer(modifier = Modifier.height(12.dp)) BitwardenTextField( - label = stringResource(id = R.string.email_address_required), + label = stringResource(id = BitwardenString.email_address_required), value = emailInput, onValueChange = handler.onEmailInputChange, keyboardType = KeyboardType.Email, @@ -207,8 +207,8 @@ private fun StartRegistrationContent( supportingContentPadding = PaddingValues(), supportingContent = { EnvironmentSelector( - labelText = stringResource(id = R.string.create_account_on_with_colon), - dialogTitle = stringResource(id = R.string.create_account_on), + labelText = stringResource(id = BitwardenString.create_account_on_with_colon), + dialogTitle = stringResource(id = BitwardenString.create_account_on), selectedOption = selectedEnvironmentType, onOptionSelected = handler.onEnvironmentTypeSelect, onHelpClick = handler.onServerGeologyHelpClick, @@ -226,7 +226,7 @@ private fun StartRegistrationContent( Spacer(modifier = Modifier.height(8.dp)) BitwardenTextField( - label = stringResource(id = R.string.name), + label = stringResource(id = BitwardenString.name), value = nameInput, onValueChange = handler.onNameInputChange, textFieldTestTag = "NameEntry", @@ -251,7 +251,7 @@ private fun StartRegistrationContent( Spacer(modifier = Modifier.height(24.dp)) BitwardenFilledButton( - label = stringResource(id = R.string.continue_text), + label = stringResource(id = BitwardenString.continue_text), onClick = handler.onContinueClick, isEnabled = isContinueButtonEnabled, modifier = Modifier @@ -279,8 +279,8 @@ private fun TermsAndPrivacyText( onPrivacyPolicyClick: () -> Unit, modifier: Modifier = Modifier, ) { - val strTerms = stringResource(id = R.string.terms_of_service) - val strPrivacy = stringResource(id = R.string.privacy_policy) + val strTerms = stringResource(id = BitwardenString.terms_of_service) + val strPrivacy = stringResource(id = BitwardenString.privacy_policy) Row( horizontalArrangement = Arrangement.Start, verticalAlignment = Alignment.CenterVertically, @@ -309,7 +309,8 @@ private fun TermsAndPrivacyText( ) { Text( text = annotatedStringResource( - id = R.string.by_continuing_you_agree_to_the_terms_of_service_and_privacy_policy, + id = BitwardenString + .by_continuing_you_agree_to_the_terms_of_service_and_privacy_policy, onAnnotationClick = { when (it) { "termsOfService" -> onTermsClick() @@ -331,7 +332,7 @@ private fun ReceiveMarketingEmailsSwitch( onUnsubscribeClick: () -> Unit, modifier: Modifier = Modifier, ) { - val unsubscribeString = stringResource(id = R.string.unsubscribe) + val unsubscribeString = stringResource(id = BitwardenString.unsubscribe) @Suppress("MaxLineLength") BitwardenSwitch( modifier = modifier @@ -348,7 +349,7 @@ private fun ReceiveMarketingEmailsSwitch( } .testTag(tag = "ReceiveMarketingEmailsToggle"), label = annotatedStringResource( - id = R.string.get_emails_from_bitwarden_for_announcements_advices_and_research_opportunities_unsubscribe_any_time, + id = BitwardenString.get_emails_from_bitwarden_for_announcements_advices_and_research_opportunities_unsubscribe_any_time, onAnnotationClick = { onUnsubscribeClick() }, ), isChecked = isChecked, diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/startregistration/StartRegistrationViewModel.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/startregistration/StartRegistrationViewModel.kt index 04e02e76f2..c9fee6a3cb 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/startregistration/StartRegistrationViewModel.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/startregistration/StartRegistrationViewModel.kt @@ -8,9 +8,9 @@ import com.bitwarden.data.repository.model.Environment.Type import com.bitwarden.ui.platform.base.BackgroundEvent import com.bitwarden.ui.platform.base.BaseViewModel import com.bitwarden.ui.platform.base.util.isValidEmail +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.auth.repository.AuthRepository import com.x8bit.bitwarden.data.auth.repository.model.RegisterResult import com.x8bit.bitwarden.data.auth.repository.model.SendVerificationEmailResult @@ -194,9 +194,9 @@ class StartRegistrationViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialog = StartRegistrationDialog.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.validation_field_required - .asText(R.string.email_address.asText()), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.validation_field_required + .asText(BitwardenString.email_address.asText()), ), ) } @@ -206,8 +206,8 @@ class StartRegistrationViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialog = StartRegistrationDialog.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.invalid_email.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.invalid_email.asText(), ), ) } @@ -244,11 +244,11 @@ class StartRegistrationViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialog = StartRegistrationDialog.Error( - title = R.string.an_error_has_occurred.asText(), + title = BitwardenString.an_error_has_occurred.asText(), message = sendVerificationEmailResult .errorMessage ?.asText() - ?: R.string.generic_error_message.asText(), + ?: BitwardenString.generic_error_message.asText(), error = sendVerificationEmailResult.error, ), ) diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/trusteddevice/TrustedDeviceScreen.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/trusteddevice/TrustedDeviceScreen.kt index b3cd5be823..e15328fee3 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/trusteddevice/TrustedDeviceScreen.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/trusteddevice/TrustedDeviceScreen.kt @@ -36,8 +36,8 @@ import com.bitwarden.ui.platform.components.model.CardStyle import com.bitwarden.ui.platform.components.toggle.BitwardenSwitch import com.bitwarden.ui.platform.components.util.rememberVectorPainter import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.auth.feature.trusteddevice.handlers.TrustedDeviceHandlers import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenBasicDialog import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenLoadingDialog @@ -98,11 +98,11 @@ private fun TrustedDeviceScaffold( .nestedScroll(scrollBehavior.nestedScrollConnection), topBar = { BitwardenTopAppBar( - title = stringResource(id = R.string.log_in_initiated), + title = stringResource(id = BitwardenString.log_in_initiated), scrollBehavior = scrollBehavior, navigationIcon = NavigationIcon( navigationIcon = rememberVectorPainter(id = BitwardenDrawable.ic_close), - navigationIconContentDescription = stringResource(id = R.string.close), + navigationIconContentDescription = stringResource(id = BitwardenString.close), onNavigationIconClick = handlers.onBackClick, ), ) @@ -115,8 +115,8 @@ private fun TrustedDeviceScaffold( ) { Spacer(modifier = Modifier.height(height = 12.dp)) BitwardenSwitch( - label = stringResource(id = R.string.remember_this_device), - supportingText = stringResource(id = R.string.turn_off_using_public_device), + label = stringResource(id = BitwardenString.remember_this_device), + supportingText = stringResource(id = BitwardenString.turn_off_using_public_device), isChecked = state.isRemembered, onCheckedChange = handlers.onRememberToggle, cardStyle = CardStyle.Full, @@ -129,7 +129,7 @@ private fun TrustedDeviceScaffold( if (state.showContinueButton) { BitwardenFilledButton( - label = stringResource(id = R.string.continue_text), + label = stringResource(id = BitwardenString.continue_text), onClick = handlers.onContinueClick, modifier = Modifier .standardHorizontalMargin() @@ -140,7 +140,7 @@ private fun TrustedDeviceScaffold( if (state.showOtherDeviceButton) { BitwardenFilledButton( - label = stringResource(id = R.string.approve_with_my_other_device), + label = stringResource(id = BitwardenString.approve_with_my_other_device), onClick = handlers.onApproveWithDeviceClick, modifier = Modifier .testTag("ApproveWithOtherDeviceButton") @@ -152,7 +152,7 @@ private fun TrustedDeviceScaffold( if (state.showRequestAdminButton) { BitwardenOutlinedButton( - label = stringResource(id = R.string.request_admin_approval), + label = stringResource(id = BitwardenString.request_admin_approval), onClick = handlers.onApproveWithAdminClick, modifier = Modifier .standardHorizontalMargin() @@ -164,7 +164,7 @@ private fun TrustedDeviceScaffold( if (state.showMasterPasswordButton) { BitwardenOutlinedButton( - label = stringResource(id = R.string.approve_with_master_password), + label = stringResource(id = BitwardenString.approve_with_master_password), onClick = handlers.onApproveWithPasswordClick, modifier = Modifier .testTag("ApproveWithMasterPasswordButton") @@ -177,7 +177,7 @@ private fun TrustedDeviceScaffold( Spacer(modifier = Modifier.height(12.dp)) Text( text = stringResource( - id = R.string.logging_in_as_x_on_y, + id = BitwardenString.logging_in_as_x_on_y, state.emailAddress, state.environmentLabel, ), @@ -191,7 +191,7 @@ private fun TrustedDeviceScaffold( ) BitwardenClickableText( - label = stringResource(id = R.string.not_you), + label = stringResource(id = BitwardenString.not_you), onClick = handlers.onNotYouButtonClick, style = BitwardenTheme.typography.labelLarge, innerPadding = PaddingValues(vertical = 8.dp, horizontal = 16.dp), diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/trusteddevice/TrustedDeviceViewModel.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/trusteddevice/TrustedDeviceViewModel.kt index c0540462ae..f7d364fee0 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/trusteddevice/TrustedDeviceViewModel.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/trusteddevice/TrustedDeviceViewModel.kt @@ -4,9 +4,9 @@ import android.os.Parcelable import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.viewModelScope import com.bitwarden.ui.platform.base.BaseViewModel +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.auth.repository.AuthRepository import com.x8bit.bitwarden.data.auth.repository.model.AuthState import com.x8bit.bitwarden.data.auth.repository.model.LogoutReason @@ -84,8 +84,8 @@ class TrustedDeviceViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = TrustedDeviceState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.generic_error_message.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.generic_error_message.asText(), error = result.error, ), ) @@ -114,7 +114,9 @@ class TrustedDeviceViewModel @Inject constructor( private fun handleContinueClick() { mutableStateFlow.update { it.copy( - dialogState = TrustedDeviceState.DialogState.Loading(R.string.loading.asText()), + dialogState = TrustedDeviceState.DialogState.Loading( + BitwardenString.loading.asText(), + ), ) } authRepository.shouldTrustDevice = state.isRemembered diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/twofactorlogin/TwoFactorLoginScreen.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/twofactorlogin/TwoFactorLoginScreen.kt index 9071197528..03f580fbb9 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/twofactorlogin/TwoFactorLoginScreen.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/twofactorlogin/TwoFactorLoginScreen.kt @@ -48,9 +48,9 @@ import com.bitwarden.ui.platform.components.model.CardStyle import com.bitwarden.ui.platform.components.toggle.BitwardenSwitch import com.bitwarden.ui.platform.components.util.rememberVectorPainter import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.auth.feature.twofactorlogin.util.description import com.x8bit.bitwarden.ui.auth.feature.twofactorlogin.util.title import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenBasicDialog @@ -129,7 +129,7 @@ fun TwoFactorLoginScreen( val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState()) val title = if (state.isNewDeviceVerification) { - R.string.verify_your_identity.asText() + BitwardenString.verify_your_identity.asText() } else { state.authMethod.title } @@ -142,14 +142,14 @@ fun TwoFactorLoginScreen( title = title(), scrollBehavior = scrollBehavior, navigationIcon = rememberVectorPainter(id = BitwardenDrawable.ic_close), - navigationIconContentDescription = stringResource(id = R.string.close), + navigationIconContentDescription = stringResource(id = BitwardenString.close), onNavigationIconClick = remember(viewModel) { { viewModel.trySendAction(TwoFactorLoginAction.CloseButtonClick) } }, actions = { if (!state.isNewDeviceVerification) { BitwardenOverflowActionItem( - contentDescription = stringResource(R.string.more), + contentDescription = stringResource(BitwardenString.more), menuItemDataList = state.availableAuthMethods .map { OverflowMenuItemData( @@ -202,7 +202,7 @@ private fun TwoFactorLoginDialogs( title = dialogState .title ?.invoke() - ?: stringResource(R.string.an_error_has_occurred), + ?: stringResource(BitwardenString.an_error_has_occurred), message = dialogState.message(), throwable = dialogState.error, onDismissRequest = onDismissRequest, @@ -247,7 +247,7 @@ private fun TwoFactorLoginScreenContent( Spacer(modifier = Modifier.height(height = 12.dp)) Text( text = if (state.isNewDeviceVerification) { - stringResource(R.string.enter_verification_code_new_device) + stringResource(BitwardenString.enter_verification_code_new_device) } else { state.authMethod.description( state.displayEmail, @@ -284,7 +284,7 @@ private fun TwoFactorLoginScreenContent( BitwardenPasswordField( value = state.codeInput, onValueChange = onCodeInputChange, - label = stringResource(id = R.string.verification_code), + label = stringResource(id = BitwardenString.verification_code), keyboardType = KeyboardType.Number, imeAction = ImeAction.Done, autoFocus = true, @@ -302,7 +302,7 @@ private fun TwoFactorLoginScreenContent( if (!state.isNewDeviceVerification) { BitwardenSwitch( - label = stringResource(id = R.string.remember), + label = stringResource(id = BitwardenString.remember), isChecked = state.isRememberEnabled, onCheckedChange = onRememberMeToggle, cardStyle = CardStyle.Full, @@ -327,7 +327,7 @@ private fun TwoFactorLoginScreenContent( Spacer(modifier = Modifier.height(12.dp)) BitwardenOutlinedButton( - label = stringResource(id = R.string.send_verification_code_again), + label = stringResource(id = BitwardenString.send_verification_code_again), onClick = onResendEmailButtonClick, modifier = Modifier .standardHorizontalMargin() diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/twofactorlogin/TwoFactorLoginViewModel.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/twofactorlogin/TwoFactorLoginViewModel.kt index 2a9139ea8b..e18ea51ce4 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/twofactorlogin/TwoFactorLoginViewModel.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/twofactorlogin/TwoFactorLoginViewModel.kt @@ -14,9 +14,9 @@ import com.bitwarden.network.util.preferredAuthMethod import com.bitwarden.network.util.twoFactorDisplayEmail import com.bitwarden.network.util.twoFactorDuoAuthUrl import com.bitwarden.ui.platform.base.BaseViewModel +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.auth.repository.AuthRepository import com.x8bit.bitwarden.data.auth.repository.model.LoginResult import com.x8bit.bitwarden.data.auth.repository.model.ResendEmailResult @@ -181,8 +181,8 @@ class TwoFactorLoginViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = TwoFactorLoginState.DialogState.Error( - title = R.string.log_in_denied.asText(), - message = R.string.captcha_failed.asText(), + title = BitwardenString.log_in_denied.asText(), + message = BitwardenString.captcha_failed.asText(), ), ) } @@ -227,8 +227,8 @@ class TwoFactorLoginViewModel @Inject constructor( ?: mutableStateFlow.update { it.copy( dialogState = TwoFactorLoginState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.error_connecting_with_the_duo_service_use_a_different_two_step_login_method_or_contact_duo_for_assistance.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.error_connecting_with_the_duo_service_use_a_different_two_step_login_method_or_contact_duo_for_assistance.asText(), ), ) } @@ -248,19 +248,19 @@ class TwoFactorLoginViewModel @Inject constructor( .baseWebVaultUrlOrDefault, data = it, headerText = resourceManager.getString( - resId = R.string.fido2_title, + resId = BitwardenString.fido2_title, ), buttonText = resourceManager.getString( - resId = R.string.fido2_authenticate_web_authn, + resId = BitwardenString.fido2_authenticate_web_authn, ), returnButtonText = resourceManager.getString( - resId = R.string.fido2_return_to_app, + resId = BitwardenString.fido2_return_to_app, ), ) TwoFactorLoginEvent.NavigateToWebAuth(uri = uri) } ?: TwoFactorLoginEvent.ShowSnackbar( - message = R.string.there_was_an_error_starting_web_authn_two_factor_authentication.asText(), + message = BitwardenString.there_was_an_error_starting_web_authn_two_factor_authentication.asText(), ), ) } @@ -315,9 +315,9 @@ class TwoFactorLoginViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = TwoFactorLoginState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), + title = BitwardenString.an_error_has_occurred.asText(), message = loginResult.errorMessage?.asText() - ?: R.string.invalid_verification_code.asText(), + ?: BitwardenString.invalid_verification_code.asText(), error = loginResult.error, ), ) @@ -328,8 +328,8 @@ class TwoFactorLoginViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = TwoFactorLoginState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.this_is_not_a_recognized_bitwarden_server_you_may_need_to_check_with_your_provider_or_update_your_server + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.this_is_not_a_recognized_bitwarden_server_you_may_need_to_check_with_your_provider_or_update_your_server .asText(), ), ) @@ -340,9 +340,9 @@ class TwoFactorLoginViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = TwoFactorLoginState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), + title = BitwardenString.an_error_has_occurred.asText(), message = loginResult.errorMessage?.asText() - ?: R.string.invalid_verification_code.asText(), + ?: BitwardenString.invalid_verification_code.asText(), ), ) } @@ -354,8 +354,8 @@ class TwoFactorLoginViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = TwoFactorLoginState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.we_couldnt_verify_the_servers_certificate.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.we_couldnt_verify_the_servers_certificate.asText(), ), ) } @@ -378,8 +378,8 @@ class TwoFactorLoginViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = TwoFactorLoginState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.generic_error_message.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.generic_error_message.asText(), ), ) } @@ -423,7 +423,7 @@ class TwoFactorLoginViewModel @Inject constructor( it.copy( dialogState = TwoFactorLoginState.DialogState.Error( message = result.message?.asText() - ?: R.string.generic_error_message.asText(), + ?: BitwardenString.generic_error_message.asText(), ), ) } @@ -451,8 +451,8 @@ class TwoFactorLoginViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = TwoFactorLoginState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.verification_email_not_sent.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.verification_email_not_sent.asText(), error = result.error, ), ) @@ -464,7 +464,7 @@ class TwoFactorLoginViewModel @Inject constructor( if (action.isUserInitiated) { sendEvent( TwoFactorLoginEvent.ShowSnackbar( - message = R.string.verification_email_sent.asText(), + message = BitwardenString.verification_email_sent.asText(), ), ) } @@ -510,7 +510,7 @@ class TwoFactorLoginViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = TwoFactorLoginState.DialogState.Loading( - message = R.string.submitting.asText(), + message = BitwardenString.submitting.asText(), ), ) } @@ -584,7 +584,7 @@ class TwoFactorLoginViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = TwoFactorLoginState.DialogState.Loading( - message = R.string.logging_in.asText(), + message = BitwardenString.logging_in.asText(), ), ) } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/twofactorlogin/util/TwoFactorAuthMethodExtensions.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/twofactorlogin/util/TwoFactorAuthMethodExtensions.kt index 08c316f549..1aea24a0bc 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/twofactorlogin/util/TwoFactorAuthMethodExtensions.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/twofactorlogin/util/TwoFactorAuthMethodExtensions.kt @@ -3,26 +3,26 @@ package com.x8bit.bitwarden.ui.auth.feature.twofactorlogin.util import androidx.annotation.DrawableRes import com.bitwarden.network.model.TwoFactorAuthMethod import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText import com.bitwarden.ui.util.concat -import com.x8bit.bitwarden.R /** * Get the title for the given auth method. */ val TwoFactorAuthMethod.title: Text get() = when (this) { - TwoFactorAuthMethod.AUTHENTICATOR_APP -> R.string.authenticator_app_title.asText() - TwoFactorAuthMethod.DUO -> R.string.duo_title.asText() - TwoFactorAuthMethod.DUO_ORGANIZATION -> R.string.duo_org_title.asText( - R.string.organization.asText(), + TwoFactorAuthMethod.AUTHENTICATOR_APP -> BitwardenString.authenticator_app_title.asText() + TwoFactorAuthMethod.DUO -> BitwardenString.duo_title.asText() + TwoFactorAuthMethod.DUO_ORGANIZATION -> BitwardenString.duo_org_title.asText( + BitwardenString.organization.asText(), ) - TwoFactorAuthMethod.EMAIL -> R.string.email.asText() - TwoFactorAuthMethod.RECOVERY_CODE -> R.string.recovery_code_title.asText() - TwoFactorAuthMethod.WEB_AUTH -> R.string.fido2_authenticate_web_authn.asText() - TwoFactorAuthMethod.YUBI_KEY -> R.string.yubi_key_title.asText() + TwoFactorAuthMethod.EMAIL -> BitwardenString.email.asText() + TwoFactorAuthMethod.RECOVERY_CODE -> BitwardenString.recovery_code_title.asText() + TwoFactorAuthMethod.WEB_AUTH -> BitwardenString.fido2_authenticate_web_authn.asText() + TwoFactorAuthMethod.YUBI_KEY -> BitwardenString.yubi_key_title.asText() else -> "".asText() } @@ -30,18 +30,22 @@ val TwoFactorAuthMethod.title: Text * Get the description for the given auth method. */ fun TwoFactorAuthMethod.description(email: String): Text = when (this) { - TwoFactorAuthMethod.AUTHENTICATOR_APP -> R.string.enter_verification_code_app.asText() - TwoFactorAuthMethod.DUO -> R.string.follow_the_steps_from_duo_to_finish_logging_in.asText() + TwoFactorAuthMethod.AUTHENTICATOR_APP -> BitwardenString.enter_verification_code_app.asText() + TwoFactorAuthMethod.DUO -> { + BitwardenString.follow_the_steps_from_duo_to_finish_logging_in.asText() + } TwoFactorAuthMethod.DUO_ORGANIZATION -> { - R.string.duo_two_step_login_is_required_for_your_account + BitwardenString.duo_two_step_login_is_required_for_your_account .asText() .concat(" ".asText()) - .concat(R.string.follow_the_steps_from_duo_to_finish_logging_in.asText()) + .concat(BitwardenString.follow_the_steps_from_duo_to_finish_logging_in.asText()) } - TwoFactorAuthMethod.EMAIL -> R.string.enter_verification_code_email.asText(email) - TwoFactorAuthMethod.WEB_AUTH -> R.string.continue_to_complete_web_authn_verification.asText() - TwoFactorAuthMethod.YUBI_KEY -> R.string.yubi_key_instruction.asText() + TwoFactorAuthMethod.EMAIL -> BitwardenString.enter_verification_code_email.asText(email) + TwoFactorAuthMethod.WEB_AUTH -> { + BitwardenString.continue_to_complete_web_authn_verification.asText() + } + TwoFactorAuthMethod.YUBI_KEY -> BitwardenString.yubi_key_instruction.asText() else -> "".asText() } @@ -52,7 +56,7 @@ val TwoFactorAuthMethod.button: Text get() = when (this) { TwoFactorAuthMethod.DUO, TwoFactorAuthMethod.DUO_ORGANIZATION, - -> R.string.launch_duo.asText() + -> BitwardenString.launch_duo.asText() TwoFactorAuthMethod.AUTHENTICATOR_APP, TwoFactorAuthMethod.EMAIL, @@ -60,9 +64,9 @@ val TwoFactorAuthMethod.button: Text TwoFactorAuthMethod.U2F, TwoFactorAuthMethod.REMEMBER, TwoFactorAuthMethod.RECOVERY_CODE, - -> R.string.continue_text.asText() + -> BitwardenString.continue_text.asText() - TwoFactorAuthMethod.WEB_AUTH -> R.string.launch_web_authn.asText() + TwoFactorAuthMethod.WEB_AUTH -> BitwardenString.launch_web_authn.asText() } /** diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/vaultunlock/VaultUnlockScreen.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/vaultunlock/VaultUnlockScreen.kt index 6c732b257d..0e62b4e86c 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/vaultunlock/VaultUnlockScreen.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/vaultunlock/VaultUnlockScreen.kt @@ -42,8 +42,8 @@ import com.bitwarden.ui.platform.components.appbar.model.OverflowMenuItemData import com.bitwarden.ui.platform.components.button.BitwardenFilledButton import com.bitwarden.ui.platform.components.button.BitwardenOutlinedButton import com.bitwarden.ui.platform.components.model.CardStyle +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.auth.feature.vaultunlock.util.inputFieldVisibilityToggleTestTag import com.x8bit.bitwarden.ui.auth.feature.vaultunlock.util.unlockScreenInputLabel import com.x8bit.bitwarden.ui.auth.feature.vaultunlock.util.unlockScreenInputTestTag @@ -152,13 +152,13 @@ fun VaultUnlockScreen( ) VaultUnlockState.VaultUnlockDialog.Loading -> BitwardenLoadingDialog( - text = stringResource(id = R.string.loading), + text = stringResource(id = BitwardenString.loading), ) VaultUnlockState.VaultUnlockDialog.BiometricsNoLongerSupported -> { BitwardenBasicDialog( - title = stringResource(id = R.string.biometrics_no_longer_supported_title), - message = stringResource(id = R.string.biometrics_no_longer_supported), + title = stringResource(id = BitwardenString.biometrics_no_longer_supported_title), + message = stringResource(id = BitwardenString.biometrics_no_longer_supported), onDismissRequest = remember { { viewModel.trySendAction( @@ -215,10 +215,10 @@ fun VaultUnlockScreen( ) } BitwardenOverflowActionItem( - contentDescription = stringResource(R.string.more), + contentDescription = stringResource(BitwardenString.more), menuItemDataList = persistentListOf( OverflowMenuItemData( - text = stringResource(id = R.string.log_out), + text = stringResource(id = BitwardenString.log_out), onClick = { showLogoutConfirmationDialog = true }, ), ), @@ -294,7 +294,7 @@ fun VaultUnlockScreen( } Text( text = stringResource( - id = R.string.logged_in_as_on, + id = BitwardenString.logged_in_as_on, state.email, state.environmentUrl, ), @@ -314,7 +314,7 @@ fun VaultUnlockScreen( Spacer(modifier = Modifier.height(24.dp)) if (state.showBiometricLogin && biometricsManager.isBiometricsSupported) { BitwardenOutlinedButton( - label = stringResource(id = R.string.use_biometrics_to_unlock), + label = stringResource(id = BitwardenString.use_biometrics_to_unlock), onClick = remember(viewModel) { { viewModel.trySendAction(VaultUnlockAction.BiometricsUnlockClick) } }, @@ -325,7 +325,7 @@ fun VaultUnlockScreen( Spacer(modifier = Modifier.height(12.dp)) } else if (state.showBiometricInvalidatedMessage) { Text( - text = stringResource(R.string.account_biometric_invalidated), + text = stringResource(BitwardenString.account_biometric_invalidated), textAlign = TextAlign.Start, style = BitwardenTheme.typography.bodyMedium, color = BitwardenTheme.colorScheme.status.error, @@ -335,7 +335,7 @@ fun VaultUnlockScreen( } if (!state.hideInput) { BitwardenFilledButton( - label = stringResource(id = R.string.unlock), + label = stringResource(id = BitwardenString.unlock), onClick = remember(viewModel) { { viewModel.trySendAction(VaultUnlockAction.UnlockClick) } }, diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/vaultunlock/VaultUnlockViewModel.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/vaultunlock/VaultUnlockViewModel.kt index 824920a89e..1c127278e1 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/vaultunlock/VaultUnlockViewModel.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/vaultunlock/VaultUnlockViewModel.kt @@ -7,9 +7,9 @@ import androidx.lifecycle.viewModelScope import com.bitwarden.ui.platform.base.BackgroundEvent import com.bitwarden.ui.platform.base.BaseViewModel import com.bitwarden.ui.platform.base.util.hexToColor +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.auth.repository.AuthRepository import com.x8bit.bitwarden.data.auth.repository.model.LogoutReason import com.x8bit.bitwarden.data.auth.repository.model.UserState @@ -193,7 +193,8 @@ class VaultUnlockViewModel @Inject constructor( state.getCredentialsRequest != null -> { sendEvent( VaultUnlockEvent.GetCredentialsError( - R.string.credential_operation_failed_because_user_could_not_be_verified + BitwardenString + .credential_operation_failed_because_user_could_not_be_verified .asText(), ), ) @@ -202,7 +203,7 @@ class VaultUnlockViewModel @Inject constructor( state.fido2CredentialAssertionRequest != null -> { sendEvent( VaultUnlockEvent.Fido2CredentialAssertionError( - R.string.passkey_operation_failed_because_user_could_not_be_verified + BitwardenString.passkey_operation_failed_because_user_could_not_be_verified .asText(), ), ) @@ -282,7 +283,7 @@ class VaultUnlockViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialog = VaultUnlockState.VaultUnlockDialog.Error( - title = R.string.an_error_has_occurred.asText(), + title = BitwardenString.an_error_has_occurred.asText(), message = it.vaultUnlockType.emptyInputDialogMessage, ), ) @@ -347,9 +348,9 @@ class VaultUnlockViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialog = VaultUnlockState.VaultUnlockDialog.Error( - title = R.string.an_error_has_occurred.asText(), + title = BitwardenString.an_error_has_occurred.asText(), message = if (action.isBiometricLogin) { - R.string.generic_error_message.asText() + BitwardenString.generic_error_message.asText() } else { state.vaultUnlockType.unlockScreenErrorMessage }, @@ -365,8 +366,8 @@ class VaultUnlockViewModel @Inject constructor( it.copy( isBiometricsValid = false, dialog = VaultUnlockState.VaultUnlockDialog.Error( - title = R.string.biometrics_failed.asText(), - message = R.string.biometrics_decoding_failure.asText(), + title = BitwardenString.biometrics_failed.asText(), + message = BitwardenString.biometrics_decoding_failure.asText(), ), ) } @@ -378,8 +379,8 @@ class VaultUnlockViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialog = VaultUnlockState.VaultUnlockDialog.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.generic_error_message.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.generic_error_message.asText(), throwable = (result as? VaultUnlockResult.InvalidStateError)?.error ?: (result as? VaultUnlockResult.GenericError)?.error, ), diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/vaultunlock/util/VaultUnlockTypeExtensions.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/vaultunlock/util/VaultUnlockTypeExtensions.kt index e37506dece..6dddee8124 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/vaultunlock/util/VaultUnlockTypeExtensions.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/vaultunlock/util/VaultUnlockTypeExtensions.kt @@ -1,9 +1,9 @@ package com.x8bit.bitwarden.ui.auth.feature.vaultunlock.util import androidx.compose.ui.text.input.KeyboardType +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.auth.repository.model.VaultUnlockType /** @@ -11,8 +11,8 @@ import com.x8bit.bitwarden.data.auth.repository.model.VaultUnlockType */ val VaultUnlockType.unlockScreenTitle: Text get() = when (this) { - VaultUnlockType.MASTER_PASSWORD -> R.string.verify_master_password - VaultUnlockType.PIN -> R.string.verify_pin + VaultUnlockType.MASTER_PASSWORD -> BitwardenString.verify_master_password + VaultUnlockType.PIN -> BitwardenString.verify_pin } .asText() @@ -21,8 +21,8 @@ val VaultUnlockType.unlockScreenTitle: Text */ val VaultUnlockType.unlockScreenMessage: Text get() = when (this) { - VaultUnlockType.MASTER_PASSWORD -> R.string.vault_locked_master_password - VaultUnlockType.PIN -> R.string.vault_locked_pin + VaultUnlockType.MASTER_PASSWORD -> BitwardenString.vault_locked_master_password + VaultUnlockType.PIN -> BitwardenString.vault_locked_pin } .asText() @@ -40,8 +40,8 @@ val VaultUnlockType.unlockScreenInputTestTag: String */ val VaultUnlockType.unlockScreenInputLabel: Text get() = when (this) { - VaultUnlockType.MASTER_PASSWORD -> R.string.master_password - VaultUnlockType.PIN -> R.string.pin + VaultUnlockType.MASTER_PASSWORD -> BitwardenString.master_password + VaultUnlockType.PIN -> BitwardenString.pin } .asText() @@ -59,8 +59,8 @@ val VaultUnlockType.inputFieldVisibilityToggleTestTag: String */ val VaultUnlockType.unlockScreenErrorMessage: Text get() = when (this) { - VaultUnlockType.MASTER_PASSWORD -> R.string.invalid_master_password - VaultUnlockType.PIN -> R.string.invalid_pin + VaultUnlockType.MASTER_PASSWORD -> BitwardenString.invalid_master_password + VaultUnlockType.PIN -> BitwardenString.invalid_pin } .asText() @@ -77,4 +77,4 @@ val VaultUnlockType.unlockScreenKeyboardType: KeyboardType * The message to show when user try to unlock vault with empty or blank input. */ val VaultUnlockType.emptyInputDialogMessage: Text - get() = R.string.validation_field_required.asText(unlockScreenInputLabel) + get() = BitwardenString.validation_field_required.asText(unlockScreenInputLabel) diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/welcome/WelcomeScreen.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/welcome/WelcomeScreen.kt index 725168f7da..cf54467c07 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/welcome/WelcomeScreen.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/welcome/WelcomeScreen.kt @@ -47,9 +47,9 @@ import com.bitwarden.ui.platform.components.button.BitwardenFilledButton import com.bitwarden.ui.platform.components.button.BitwardenOutlinedButton import com.bitwarden.ui.platform.components.util.rememberVectorPainter import com.bitwarden.ui.platform.model.WindowSize +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme import com.bitwarden.ui.platform.util.rememberWindowSize -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.platform.components.scaffold.BitwardenScaffold import kotlinx.coroutines.launch @@ -131,7 +131,7 @@ private fun WelcomeScreenContent( HorizontalPager(state = pagerState) { index -> val pageNumberContentDescription = - stringResource(R.string.page_number_x_of_y, index + 1, state.pages.size) + stringResource(BitwardenString.page_number_x_of_y, index + 1, state.pages.size) val pagerSemanticsModifier = Modifier.semantics(mergeDescendants = true) { contentDescription = pageNumberContentDescription } @@ -165,7 +165,7 @@ private fun WelcomeScreenContent( ) BitwardenFilledButton( - label = stringResource(id = R.string.create_account), + label = stringResource(id = BitwardenString.create_account), onClick = onCreateAccountClick, modifier = Modifier .standardHorizontalMargin(medium = HORIZONTAL_MARGIN_MEDIUM) @@ -174,7 +174,7 @@ private fun WelcomeScreenContent( ) BitwardenOutlinedButton( - label = stringResource(id = R.string.log_in_verb), + label = stringResource(id = BitwardenString.log_in_verb), onClick = onLoginClick, modifier = Modifier .standardHorizontalMargin(medium = HORIZONTAL_MARGIN_MEDIUM) diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/welcome/WelcomeViewModel.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/welcome/WelcomeViewModel.kt index 48a8fca572..8168f366f7 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/welcome/WelcomeViewModel.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/auth/feature/welcome/WelcomeViewModel.kt @@ -3,7 +3,7 @@ package com.x8bit.bitwarden.ui.auth.feature.welcome import android.os.Parcelable import com.bitwarden.ui.platform.base.BaseViewModel import com.bitwarden.ui.platform.resource.BitwardenDrawable -import com.x8bit.bitwarden.R +import com.bitwarden.ui.platform.resource.BitwardenString import com.x8bit.bitwarden.data.platform.manager.FeatureFlagManager import com.x8bit.bitwarden.data.platform.manager.model.FlagKey import dagger.hilt.android.lifecycle.HiltViewModel @@ -83,8 +83,8 @@ data class WelcomeState( @Parcelize data object CardOne : WelcomeCard() { override val imageRes: Int get() = BitwardenDrawable.img_vault_items - override val titleRes: Int get() = R.string.security_prioritized - override val messageRes: Int get() = R.string.welcome_message_1 + override val titleRes: Int get() = BitwardenString.security_prioritized + override val messageRes: Int get() = BitwardenString.welcome_message_1 } /** @@ -93,8 +93,8 @@ data class WelcomeState( @Parcelize data object CardTwo : WelcomeCard() { override val imageRes: Int get() = BitwardenDrawable.welcome_2 - override val titleRes: Int get() = R.string.quick_and_easy_login - override val messageRes: Int get() = R.string.welcome_message_2 + override val titleRes: Int get() = BitwardenString.quick_and_easy_login + override val messageRes: Int get() = BitwardenString.welcome_message_2 } /** @@ -103,8 +103,8 @@ data class WelcomeState( @Parcelize data object CardThree : WelcomeCard() { override val imageRes: Int get() = BitwardenDrawable.welcome_3 - override val titleRes: Int get() = R.string.level_up_your_logins - override val messageRes: Int get() = R.string.welcome_message_3 + override val titleRes: Int get() = BitwardenString.level_up_your_logins + override val messageRes: Int get() = BitwardenString.welcome_message_3 } /** @@ -113,8 +113,8 @@ data class WelcomeState( @Parcelize data object CardFour : WelcomeCard() { override val imageRes: Int get() = BitwardenDrawable.welcome_4 - override val titleRes: Int get() = R.string.your_data_when_and_where_you_need_it - override val messageRes: Int get() = R.string.welcome_message_4 + override val titleRes: Int get() = BitwardenString.your_data_when_and_where_you_need_it + override val messageRes: Int get() = BitwardenString.welcome_message_4 } } } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/autofill/BitwardenRemoteViews.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/autofill/BitwardenRemoteViews.kt index fc69a0b56a..81cdbd697f 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/autofill/BitwardenRemoteViews.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/autofill/BitwardenRemoteViews.kt @@ -6,6 +6,7 @@ import androidx.annotation.DrawableRes import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.toArgb import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.color.BitwardenColorScheme import com.bitwarden.ui.platform.theme.color.darkBitwardenColorScheme import com.bitwarden.ui.platform.theme.color.lightBitwardenColorScheme @@ -46,9 +47,9 @@ fun buildVaultItemAutofillRemoteViews( name = autofillAppInfo.context.getString(R.string.app_name), subtitle = autofillAppInfo.context.run { if (isLocked) { - getString(R.string.vault_is_locked) + getString(BitwardenString.vault_is_locked) } else { - getString(R.string.go_to_my_vault) + getString(BitwardenString.go_to_my_vault) } }, iconRes = BitwardenDrawable.icon, diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/autofill/util/AutofillUtils.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/autofill/util/AutofillUtils.kt index df37afe3c5..c8e0555394 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/autofill/util/AutofillUtils.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/autofill/util/AutofillUtils.kt @@ -1,7 +1,7 @@ package com.x8bit.bitwarden.ui.autofill.util import androidx.core.content.ContextCompat -import com.x8bit.bitwarden.R +import com.bitwarden.ui.platform.resource.BitwardenString import com.x8bit.bitwarden.data.autofill.model.AutofillAppInfo import com.x8bit.bitwarden.data.autofill.model.AutofillCipher @@ -15,7 +15,7 @@ fun getAutofillSuggestionContentDescription( ): String = String.format( "%s, %s, %s, %s", - ContextCompat.getString(autofillAppInfo.context, R.string.autofill_suggestion), + ContextCompat.getString(autofillAppInfo.context, BitwardenString.autofill_suggestion), getAutofillSuggestionCipherType( autofillCipher = autofillCipher, autofillAppInfo = autofillAppInfo, @@ -31,11 +31,11 @@ private fun getAutofillSuggestionCipherType( when (autofillCipher) { is AutofillCipher.Card -> ContextCompat.getString( autofillAppInfo.context, - R.string.type_card, + BitwardenString.type_card, ) is AutofillCipher.Login -> ContextCompat.getString( autofillAppInfo.context, - R.string.type_login, + BitwardenString.type_login, ) } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/autofill/util/InlinePresentationSpecExtensions.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/autofill/util/InlinePresentationSpecExtensions.kt index 1d100aaa21..6420159277 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/autofill/util/InlinePresentationSpecExtensions.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/autofill/util/InlinePresentationSpecExtensions.kt @@ -14,6 +14,7 @@ import androidx.autofill.inline.UiVersions import androidx.autofill.inline.v1.InlineSuggestionUi import androidx.compose.ui.graphics.toArgb import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.autofill.model.AutofillAppInfo import com.x8bit.bitwarden.data.autofill.model.AutofillCipher @@ -62,9 +63,9 @@ fun InlinePresentationSpec.createVaultItemInlinePresentationOrNull( autofillCipher = null, title = autofillAppInfo.context.getString(R.string.app_name), subtitle = if (isLocked) { - autofillAppInfo.context.getString(R.string.vault_is_locked) + autofillAppInfo.context.getString(BitwardenString.vault_is_locked) } else { - autofillAppInfo.context.getString(R.string.my_vault) + autofillAppInfo.context.getString(BitwardenString.my_vault) }, iconRes = BitwardenDrawable.icon, shouldTintIcon = false, diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/account/BitwardenAccountActionItem.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/account/BitwardenAccountActionItem.kt index a63bad8c35..4dfc8faeef 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/account/BitwardenAccountActionItem.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/account/BitwardenAccountActionItem.kt @@ -19,8 +19,8 @@ import com.bitwarden.ui.platform.base.util.toUnscaledTextUnit import com.bitwarden.ui.platform.components.button.color.bitwardenStandardIconButtonColors import com.bitwarden.ui.platform.components.util.rememberVectorPainter import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme -import com.x8bit.bitwarden.R /** * Displays an icon representing a Bitwarden account with the user's initials superimposed. @@ -37,7 +37,7 @@ fun BitwardenAccountActionItem( onClick: () -> Unit, ) { val iconPainter = rememberVectorPainter(id = BitwardenDrawable.ic_account_initials_container) - val contentDescription = stringResource(id = R.string.account) + val contentDescription = stringResource(id = BitwardenString.account) IconButton( onClick = onClick, diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/account/BitwardenAccountSwitcher.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/account/BitwardenAccountSwitcher.kt index 6b9c599091..f4b57205f2 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/account/BitwardenAccountSwitcher.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/account/BitwardenAccountSwitcher.kt @@ -56,8 +56,8 @@ import com.bitwarden.ui.platform.base.util.toUnscaledTextUnit import com.bitwarden.ui.platform.components.divider.BitwardenHorizontalDivider import com.bitwarden.ui.platform.components.util.rememberVectorPainter import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenLogoutConfirmationDialog import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenRemovalConfirmationDialog import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenSelectionDialog @@ -384,7 +384,7 @@ private fun LockOrLogoutDialog( selectionItems = { if (accountSummary.isVaultUnlocked) { BitwardenBasicDialogRow( - text = stringResource(id = R.string.lock), + text = stringResource(id = BitwardenString.lock), onClick = { onLockAccountClick(accountSummary) }, @@ -392,14 +392,14 @@ private fun LockOrLogoutDialog( } if (accountSummary.isLoggedIn) { BitwardenBasicDialogRow( - text = stringResource(id = R.string.log_out), + text = stringResource(id = BitwardenString.log_out), onClick = { onLogoutAccountClick(accountSummary) }, ) } else { BitwardenBasicDialogRow( - text = stringResource(id = R.string.remove_account), + text = stringResource(id = BitwardenString.remove_account), onClick = { onRemoveAccountClick(accountSummary) }, @@ -440,7 +440,7 @@ private fun AddAccountItem( Spacer(modifier = Modifier.width(16.dp)) Text( - text = stringResource(id = R.string.add_account), + text = stringResource(id = BitwardenString.add_account), style = BitwardenTheme.typography.labelMedium, color = BitwardenTheme.colorScheme.text.interaction, ) diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/account/BitwardenPlaceholderAccountItem.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/account/BitwardenPlaceholderAccountItem.kt index d492a4bfae..2d8703937d 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/account/BitwardenPlaceholderAccountItem.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/account/BitwardenPlaceholderAccountItem.kt @@ -12,8 +12,8 @@ import com.bitwarden.ui.platform.components.button.color.bitwardenStandardIconBu import com.bitwarden.ui.platform.components.util.rememberVectorPainter import com.bitwarden.ui.platform.feature.settings.appearance.model.AppTheme import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme -import com.x8bit.bitwarden.R /** * A placeholder item to be used to represent an account. @@ -37,7 +37,7 @@ fun BitwardenPlaceholderAccountActionItem( ) Icon( painter = rememberVectorPainter(id = BitwardenDrawable.ic_dots), - contentDescription = stringResource(id = R.string.account), + contentDescription = stringResource(id = BitwardenString.account), tint = BitwardenTheme.colorScheme.text.interaction, ) } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/bottomsheet/BitwardenModalBottomSheet.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/bottomsheet/BitwardenModalBottomSheet.kt index 7457a7584d..5d6613866e 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/bottomsheet/BitwardenModalBottomSheet.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/bottomsheet/BitwardenModalBottomSheet.kt @@ -18,8 +18,8 @@ import com.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar import com.bitwarden.ui.platform.components.appbar.NavigationIcon import com.bitwarden.ui.platform.components.util.rememberVectorPainter import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.platform.components.scaffold.BitwardenScaffold import kotlinx.coroutines.launch @@ -70,7 +70,7 @@ fun BitwardenModalBottomSheet( navigationIcon = NavigationIcon( navigationIcon = rememberVectorPainter(BitwardenDrawable.ic_close), onNavigationIconClick = animatedOnDismiss, - navigationIconContentDescription = stringResource(R.string.close), + navigationIconContentDescription = stringResource(BitwardenString.close), ), actions = { topBarActions(animatedOnDismiss) diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/card/BitwardenActionCard.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/card/BitwardenActionCard.kt index 5a3d1d04bb..d7f202c22b 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/card/BitwardenActionCard.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/card/BitwardenActionCard.kt @@ -24,8 +24,8 @@ import com.bitwarden.ui.platform.components.button.BitwardenFilledButton import com.bitwarden.ui.platform.components.button.BitwardenStandardIconButton import com.bitwarden.ui.platform.components.util.rememberVectorPainter import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.platform.components.card.color.bitwardenCardColors /** @@ -72,7 +72,7 @@ fun BitwardenActionCard( onDismissClick?.let { BitwardenStandardIconButton( painter = rememberVectorPainter(id = BitwardenDrawable.ic_close), - contentDescription = stringResource(id = R.string.close), + contentDescription = stringResource(id = BitwardenString.close), onClick = it, ) } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/coachmark/CoachMarkContainer.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/coachmark/CoachMarkContainer.kt index 074ec7955d..827129e5da 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/coachmark/CoachMarkContainer.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/coachmark/CoachMarkContainer.kt @@ -34,8 +34,8 @@ import androidx.compose.ui.unit.dp import com.bitwarden.ui.platform.components.button.BitwardenStandardIconButton import com.bitwarden.ui.platform.components.util.rememberVectorPainter import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.platform.components.coachmark.model.CoachMarkHighlightShape import com.x8bit.bitwarden.ui.platform.components.text.BitwardenClickableText import kotlinx.coroutines.launch @@ -203,7 +203,7 @@ private fun BitwardenCoachMarkContainer_preview() { ) { BitwardenStandardIconButton( painter = rememberVectorPainter(BitwardenDrawable.ic_puzzle), - contentDescription = stringResource(R.string.close), + contentDescription = stringResource(BitwardenString.close), onClick = {}, ) } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/content/BitwardenErrorContent.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/content/BitwardenErrorContent.kt index b16f448ae8..174cf16f19 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/content/BitwardenErrorContent.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/content/BitwardenErrorContent.kt @@ -16,8 +16,8 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import com.bitwarden.ui.platform.components.button.BitwardenTextButton +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme -import com.x8bit.bitwarden.R /** * A Bitwarden-themed, re-usable error state. @@ -47,7 +47,7 @@ fun BitwardenErrorContent( onTryAgainClick?.let { Spacer(modifier = Modifier.height(16.dp)) BitwardenTextButton( - label = stringResource(id = R.string.try_again), + label = stringResource(id = BitwardenString.try_again), onClick = it, modifier = Modifier.padding(horizontal = 16.dp), ) diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenBasicDialog.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenBasicDialog.kt index 59869b9c75..5e1e5a3c55 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenBasicDialog.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenBasicDialog.kt @@ -11,8 +11,8 @@ import androidx.compose.ui.semantics.testTag import androidx.compose.ui.semantics.testTagsAsResourceId import androidx.compose.ui.tooling.preview.Preview import com.bitwarden.ui.platform.components.button.BitwardenTextButton +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.platform.util.ciBuildInfo import com.x8bit.bitwarden.data.platform.util.deviceData import com.x8bit.bitwarden.data.platform.util.versionData @@ -41,7 +41,7 @@ fun BitwardenBasicDialog( onDismissRequest = onDismissRequest, confirmButton = { BitwardenTextButton( - label = stringResource(id = R.string.okay), + label = stringResource(id = BitwardenString.okay), onClick = onDismissRequest, modifier = Modifier.testTag(tag = "AcceptAlertButton"), ) @@ -50,7 +50,7 @@ fun BitwardenBasicDialog( ?.let { error -> { BitwardenTextButton( - label = stringResource(id = R.string.share_error_details), + label = stringResource(id = BitwardenString.share_error_details), onClick = { intentManager.shareText( text = StringBuilder() diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenClientCertificateInfoDialog.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenClientCertificateInfoDialog.kt index e3880673d2..1eef95bfaa 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenClientCertificateInfoDialog.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenClientCertificateInfoDialog.kt @@ -22,8 +22,8 @@ import androidx.compose.ui.tooling.preview.PreviewScreenSizes import androidx.compose.ui.unit.dp import com.bitwarden.ui.platform.components.button.BitwardenTextButton import com.bitwarden.ui.platform.components.model.CardStyle +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.platform.components.field.BitwardenPasswordField import com.x8bit.bitwarden.ui.platform.components.field.BitwardenTextField @@ -47,14 +47,14 @@ fun BitwardenClientCertificateDialog( onDismissRequest = onDismissRequest, dismissButton = { BitwardenTextButton( - label = stringResource(id = R.string.cancel), + label = stringResource(id = BitwardenString.cancel), onClick = onDismissRequest, modifier = Modifier.testTag("DismissAlertButton"), ) }, confirmButton = { BitwardenTextButton( - label = stringResource(id = R.string.submit), + label = stringResource(id = BitwardenString.submit), isEnabled = password.isNotEmpty(), onClick = { onConfirmClick(alias, password) }, modifier = Modifier.testTag("AcceptAlertButton"), @@ -62,7 +62,7 @@ fun BitwardenClientCertificateDialog( }, title = { Text( - text = stringResource(R.string.import_client_certificate), + text = stringResource(BitwardenString.import_client_certificate), style = BitwardenTheme.typography.headlineSmall, modifier = Modifier.testTag("AlertTitleText"), ) @@ -70,7 +70,9 @@ fun BitwardenClientCertificateDialog( text = { Column { Text( - text = stringResource(R.string.enter_the_client_certificate_password_and_alias), + text = stringResource( + BitwardenString.enter_the_client_certificate_password_and_alias, + ), style = BitwardenTheme.typography.bodyMedium, modifier = Modifier.testTag("AlertContentText"), ) @@ -78,7 +80,7 @@ fun BitwardenClientCertificateDialog( Spacer(modifier = Modifier.height(24.dp)) BitwardenTextField( - label = stringResource(R.string.alias), + label = stringResource(BitwardenString.alias), value = alias, onValueChange = { alias = it }, autoFocus = true, @@ -88,7 +90,7 @@ fun BitwardenClientCertificateDialog( ) BitwardenPasswordField( - label = stringResource(R.string.password), + label = stringResource(BitwardenString.password), value = password, onValueChange = { password = it }, cardStyle = CardStyle.Bottom, diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenLogoutConfirmationDialog.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenLogoutConfirmationDialog.kt index 34fa559bb2..41e6073805 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenLogoutConfirmationDialog.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenLogoutConfirmationDialog.kt @@ -2,7 +2,7 @@ package com.x8bit.bitwarden.ui.platform.components.dialog import androidx.compose.runtime.Composable import androidx.compose.ui.res.stringResource -import com.x8bit.bitwarden.R +import com.bitwarden.ui.platform.resource.BitwardenString import com.x8bit.bitwarden.ui.platform.components.model.AccountSummary /** @@ -19,16 +19,16 @@ fun BitwardenLogoutConfirmationDialog( onConfirmClick: () -> Unit, accountSummary: AccountSummary? = null, ) { - val baseConfirmationMessage = stringResource(id = R.string.logout_confirmation) + val baseConfirmationMessage = stringResource(id = BitwardenString.logout_confirmation) val message = accountSummary ?.let { "$baseConfirmationMessage\n\n${it.email}\n${it.environmentLabel}" } ?: baseConfirmationMessage BitwardenTwoButtonDialog( - title = stringResource(id = R.string.log_out), + title = stringResource(id = BitwardenString.log_out), message = message, - confirmButtonText = stringResource(id = R.string.yes), + confirmButtonText = stringResource(id = BitwardenString.yes), onConfirmClick = onConfirmClick, - dismissButtonText = stringResource(id = R.string.cancel), + dismissButtonText = stringResource(id = BitwardenString.cancel), onDismissClick = onDismissRequest, onDismissRequest = onDismissRequest, ) diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenMasterPasswordDialog.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenMasterPasswordDialog.kt index 3fd18df589..12c7f791cf 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenMasterPasswordDialog.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenMasterPasswordDialog.kt @@ -21,8 +21,8 @@ import androidx.compose.ui.semantics.testTagsAsResourceId import androidx.compose.ui.unit.dp import com.bitwarden.ui.platform.components.button.BitwardenTextButton import com.bitwarden.ui.platform.components.model.CardStyle +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.platform.components.field.BitwardenPasswordField /** @@ -42,14 +42,14 @@ fun BitwardenMasterPasswordDialog( onDismissRequest = onDismissRequest, dismissButton = { BitwardenTextButton( - label = stringResource(id = R.string.cancel), + label = stringResource(id = BitwardenString.cancel), onClick = onDismissRequest, modifier = Modifier.testTag("DismissAlertButton"), ) }, confirmButton = { BitwardenTextButton( - label = stringResource(id = R.string.submit), + label = stringResource(id = BitwardenString.submit), isEnabled = masterPassword.isNotEmpty(), onClick = { onConfirmClick(masterPassword) }, modifier = Modifier.testTag("AcceptAlertButton"), @@ -57,7 +57,7 @@ fun BitwardenMasterPasswordDialog( }, title = { Text( - text = stringResource(id = R.string.password_confirmation), + text = stringResource(id = BitwardenString.password_confirmation), style = BitwardenTheme.typography.headlineSmall, modifier = Modifier.testTag("AlertTitleText"), ) @@ -65,7 +65,7 @@ fun BitwardenMasterPasswordDialog( text = { Column { Text( - text = stringResource(id = R.string.password_confirmation_desc), + text = stringResource(id = BitwardenString.password_confirmation_desc), style = BitwardenTheme.typography.bodyMedium, modifier = Modifier.testTag("AlertContentText"), ) @@ -73,7 +73,7 @@ fun BitwardenMasterPasswordDialog( Spacer(modifier = Modifier.height(8.dp)) BitwardenPasswordField( - label = stringResource(id = R.string.master_password), + label = stringResource(id = BitwardenString.master_password), value = masterPassword, onValueChange = { masterPassword = it }, keyboardActions = KeyboardActions( diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenOverwritePasskeyConfirmationDialog.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenOverwritePasskeyConfirmationDialog.kt index 8c770ceb0b..09744ce6af 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenOverwritePasskeyConfirmationDialog.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenOverwritePasskeyConfirmationDialog.kt @@ -2,7 +2,7 @@ package com.x8bit.bitwarden.ui.platform.components.dialog import androidx.compose.runtime.Composable import androidx.compose.ui.res.stringResource -import com.x8bit.bitwarden.R +import com.bitwarden.ui.platform.resource.BitwardenString /** * A reusable dialog for confirming whether or not the user wants to overwrite an existing FIDO 2 @@ -18,10 +18,10 @@ fun BitwardenOverwritePasskeyConfirmationDialog( onDismissRequest: () -> Unit, ) { BitwardenTwoButtonDialog( - title = stringResource(id = R.string.overwrite_passkey), - message = stringResource(id = R.string.this_item_already_contains_a_passkey_are_you_sure_you_want_to_overwrite_the_current_passkey), - confirmButtonText = stringResource(id = R.string.okay), - dismissButtonText = stringResource(id = R.string.cancel), + title = stringResource(id = BitwardenString.overwrite_passkey), + message = stringResource(id = BitwardenString.this_item_already_contains_a_passkey_are_you_sure_you_want_to_overwrite_the_current_passkey), + confirmButtonText = stringResource(id = BitwardenString.okay), + dismissButtonText = stringResource(id = BitwardenString.cancel), onConfirmClick = onConfirmClick, onDismissClick = onDismissRequest, onDismissRequest = onDismissRequest, diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenPinDialog.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenPinDialog.kt index be612f7053..cebb292f27 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenPinDialog.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenPinDialog.kt @@ -16,8 +16,8 @@ import androidx.compose.ui.semantics.testTag import androidx.compose.ui.semantics.testTagsAsResourceId import com.bitwarden.ui.platform.components.button.BitwardenTextButton import com.bitwarden.ui.platform.components.model.CardStyle +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.platform.components.field.BitwardenPasswordField /** @@ -37,14 +37,14 @@ fun BitwardenPinDialog( onDismissRequest = onDismissRequest, dismissButton = { BitwardenTextButton( - label = stringResource(id = R.string.cancel), + label = stringResource(id = BitwardenString.cancel), onClick = onDismissRequest, modifier = Modifier.testTag("DismissAlertButton"), ) }, confirmButton = { BitwardenTextButton( - label = stringResource(id = R.string.submit), + label = stringResource(id = BitwardenString.submit), isEnabled = pin.isNotEmpty(), onClick = { onConfirmClick(pin) }, modifier = Modifier.testTag("AcceptAlertButton"), @@ -52,14 +52,14 @@ fun BitwardenPinDialog( }, title = { Text( - text = stringResource(id = R.string.verify_pin), + text = stringResource(id = BitwardenString.verify_pin), style = BitwardenTheme.typography.headlineSmall, modifier = Modifier.testTag("AlertTitleText"), ) }, text = { BitwardenPasswordField( - label = stringResource(id = R.string.pin), + label = stringResource(id = BitwardenString.pin), value = pin, onValueChange = { pin = it }, autoFocus = true, diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenRemovalConfirmationDialog.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenRemovalConfirmationDialog.kt index e5fd98a34e..ce9972732e 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenRemovalConfirmationDialog.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenRemovalConfirmationDialog.kt @@ -2,7 +2,7 @@ package com.x8bit.bitwarden.ui.platform.components.dialog import androidx.compose.runtime.Composable import androidx.compose.ui.res.stringResource -import com.x8bit.bitwarden.R +import com.bitwarden.ui.platform.resource.BitwardenString import com.x8bit.bitwarden.ui.platform.components.model.AccountSummary /** @@ -20,11 +20,11 @@ fun BitwardenRemovalConfirmationDialog( accountSummary: AccountSummary? = null, ) { BitwardenTwoButtonDialog( - title = stringResource(id = R.string.remove_account), + title = stringResource(id = BitwardenString.remove_account), message = removalConfirmationMessage(accountSummary = accountSummary), - confirmButtonText = stringResource(id = R.string.yes), + confirmButtonText = stringResource(id = BitwardenString.yes), onConfirmClick = onConfirmClick, - dismissButtonText = stringResource(id = R.string.cancel), + dismissButtonText = stringResource(id = BitwardenString.cancel), onDismissClick = onDismissRequest, onDismissRequest = onDismissRequest, ) @@ -32,7 +32,7 @@ fun BitwardenRemovalConfirmationDialog( @Composable private fun removalConfirmationMessage(accountSummary: AccountSummary?): String { - val baseConfirmationMessage = stringResource(id = R.string.remove_account_confirmation) + val baseConfirmationMessage = stringResource(id = BitwardenString.remove_account_confirmation) return accountSummary ?.let { "$baseConfirmationMessage\n\n${it.email}\n${it.environmentLabel}" } ?: baseConfirmationMessage diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenSelectionDialog.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenSelectionDialog.kt index 13594be3ec..ce98be568b 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenSelectionDialog.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenSelectionDialog.kt @@ -27,8 +27,8 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.window.Dialog import com.bitwarden.ui.platform.components.button.BitwardenTextButton import com.bitwarden.ui.platform.components.divider.BitwardenHorizontalDivider +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.platform.components.dialog.row.BitwardenSelectionRow import com.x8bit.bitwarden.ui.platform.components.util.maxDialogHeight @@ -99,7 +99,7 @@ fun BitwardenSelectionDialog( modifier = Modifier .testTag("DismissAlertButton") .padding(24.dp), - label = stringResource(id = R.string.cancel), + label = stringResource(id = BitwardenString.cancel), onClick = onDismissRequest, ) } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenTextEntryDialog.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenTextEntryDialog.kt index 51f2932559..b58b616664 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenTextEntryDialog.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenTextEntryDialog.kt @@ -20,8 +20,8 @@ import androidx.compose.ui.semantics.testTag import androidx.compose.ui.semantics.testTagsAsResourceId import com.bitwarden.ui.platform.components.button.BitwardenTextButton import com.bitwarden.ui.platform.components.model.CardStyle +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.platform.components.field.BitwardenTextField /** @@ -51,14 +51,14 @@ fun BitwardenTextEntryDialog( onDismissRequest = onDismissRequest, dismissButton = { BitwardenTextButton( - label = stringResource(id = R.string.cancel), + label = stringResource(id = BitwardenString.cancel), onClick = onDismissRequest, modifier = Modifier.testTag("DismissAlertButton"), ) }, confirmButton = { BitwardenTextButton( - label = stringResource(id = R.string.okay), + label = stringResource(id = BitwardenString.okay), onClick = { onConfirmClick(text) }, modifier = Modifier.testTag("AcceptAlertButton"), ) diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenTimePickerDialog.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenTimePickerDialog.kt index 2b3ba959b7..2e156d414a 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenTimePickerDialog.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenTimePickerDialog.kt @@ -34,8 +34,8 @@ import androidx.compose.ui.window.DialogProperties import com.bitwarden.ui.platform.components.button.BitwardenStandardIconButton import com.bitwarden.ui.platform.components.button.BitwardenTextButton import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme -import com.x8bit.bitwarden.R /** * A custom composable representing a dialog that displays the time picker dialog. @@ -68,21 +68,21 @@ fun BitwardenTimePickerDialog( confirmButton = { BitwardenTextButton( modifier = Modifier.testTag(tag = "AcceptAlertButton"), - label = stringResource(id = R.string.okay), + label = stringResource(id = BitwardenString.okay), onClick = { onTimeSelect(timePickerState.hour, timePickerState.minute) }, ) }, dismissButton = { BitwardenTextButton( modifier = Modifier.testTag(tag = "DismissAlertButton"), - label = stringResource(id = R.string.cancel), + label = stringResource(id = BitwardenString.cancel), onClick = onDismissRequest, ) }, inputToggleButton = { BitwardenStandardIconButton( vectorIconRes = BitwardenDrawable.ic_keyboard, - contentDescription = stringResource(id = R.string.switch_input_mode), + contentDescription = stringResource(id = BitwardenString.switch_input_mode), onClick = { showTimeInput = !showTimeInput }, ) }, @@ -159,7 +159,7 @@ private fun TimePickerDialog( .testTag("AlertTitleText") .fillMaxWidth() .padding(bottom = 20.dp), - text = stringResource(id = R.string.select_time), + text = stringResource(id = BitwardenString.select_time), color = BitwardenTheme.colorScheme.text.secondary, style = BitwardenTheme.typography.labelMedium, ) diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/dropdown/EnvironmentSelector.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/dropdown/EnvironmentSelector.kt index 62be3a065e..5b9649512e 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/dropdown/EnvironmentSelector.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/dropdown/EnvironmentSelector.kt @@ -24,8 +24,8 @@ import com.bitwarden.data.repository.model.Environment import com.bitwarden.ui.platform.components.button.BitwardenStandardIconButton import com.bitwarden.ui.platform.components.util.rememberVectorPainter import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenSelectionDialog import com.x8bit.bitwarden.ui.platform.components.dialog.row.BitwardenSelectionRow import com.x8bit.bitwarden.ui.platform.util.displayLabel @@ -89,7 +89,7 @@ fun EnvironmentSelector( ) Icon( painter = rememberVectorPainter(id = BitwardenDrawable.ic_chevron_down_small), - contentDescription = stringResource(id = R.string.region), + contentDescription = stringResource(id = BitwardenString.region), tint = BitwardenTheme.colorScheme.icon.secondary, ) } @@ -97,7 +97,7 @@ fun EnvironmentSelector( if (isHelpEnabled) { BitwardenStandardIconButton( vectorIconRes = BitwardenDrawable.ic_question_circle_small, - contentDescription = stringResource(R.string.help_with_server_geolocations), + contentDescription = stringResource(BitwardenString.help_with_server_geolocations), onClick = onHelpClick, contentColor = BitwardenTheme.colorScheme.icon.secondary, // Align with design but keep accessible touch target of IconButton. diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/field/BitwardenPasswordField.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/field/BitwardenPasswordField.kt index af799cac1a..3179c51587 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/field/BitwardenPasswordField.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/field/BitwardenPasswordField.kt @@ -54,8 +54,8 @@ import com.bitwarden.ui.platform.components.model.CardStyle import com.bitwarden.ui.platform.components.model.TooltipData import com.bitwarden.ui.platform.components.row.BitwardenRowOfActions import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.platform.components.field.toolbar.BitwardenCutCopyTextToolbar import com.x8bit.bitwarden.ui.platform.components.field.toolbar.BitwardenEmptyTextToolbar import com.x8bit.bitwarden.ui.platform.components.model.TextToolbarType @@ -215,7 +215,11 @@ fun BitwardenPasswordField( BitwardenDrawable.ic_eye }, contentDescription = stringResource( - id = if (showPassword) R.string.hide else R.string.show, + id = if (showPassword) { + BitwardenString.hide + } else { + BitwardenString.show + }, ), onClick = { showPasswordChange.invoke(!showPassword) }, ) diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/header/BitwardenExpandingHeader.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/header/BitwardenExpandingHeader.kt index 7c38a88a32..ea04bb0e22 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/header/BitwardenExpandingHeader.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/header/BitwardenExpandingHeader.kt @@ -22,8 +22,8 @@ import androidx.compose.ui.semantics.semantics import androidx.compose.ui.unit.dp import com.bitwarden.ui.platform.components.util.rememberVectorPainter import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme -import com.x8bit.bitwarden.R /** * Reusable header element that is clickable for expanding or collapsing content. @@ -32,12 +32,13 @@ import com.x8bit.bitwarden.R * @param expandedText Text to display when the content is expanded. * @param showExpansionIndicator Whether to show an indicator to expand or collapse the content. */ +@Suppress("LongMethod") @Composable fun BitwardenExpandingHeader( isExpanded: Boolean, onClick: () -> Unit, modifier: Modifier = Modifier, - collapsedText: String = stringResource(id = R.string.additional_options), + collapsedText: String = stringResource(id = BitwardenString.additional_options), expandedText: String = collapsedText, showExpansionIndicator: Boolean = true, shape: Shape = BitwardenTheme.shapes.content, @@ -48,7 +49,11 @@ fun BitwardenExpandingHeader( .clip(shape = shape) .clickable( onClickLabel = stringResource( - id = if (isExpanded) R.string.options_expanded else R.string.options_collapsed, + id = if (isExpanded) { + BitwardenString.options_expanded + } else { + BitwardenString.options_collapsed + }, ), onClick = onClick, ) diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/listitem/BitwardenListItem.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/listitem/BitwardenListItem.kt index fda9872b2b..93bc23c992 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/listitem/BitwardenListItem.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/listitem/BitwardenListItem.kt @@ -29,8 +29,8 @@ import com.bitwarden.ui.platform.components.icon.BitwardenIcon import com.bitwarden.ui.platform.components.icon.model.IconData import com.bitwarden.ui.platform.components.model.CardStyle import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenSelectionDialog import com.x8bit.bitwarden.ui.platform.components.dialog.row.BitwardenBasicDialogRow import kotlinx.collections.immutable.ImmutableList @@ -143,7 +143,7 @@ fun BitwardenListItem( if (selectionDataList.isNotEmpty()) { BitwardenStandardIconButton( vectorIconRes = BitwardenDrawable.ic_ellipsis_horizontal, - contentDescription = stringResource(id = R.string.options), + contentDescription = stringResource(id = BitwardenString.options), onClick = { shouldShowDialog = true }, modifier = Modifier.nullableTestTag(tag = optionsTestTag), ) diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/row/BitwardenExternalLinkRow.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/row/BitwardenExternalLinkRow.kt index dcf82a2101..4b6adc7aa7 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/row/BitwardenExternalLinkRow.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/row/BitwardenExternalLinkRow.kt @@ -13,8 +13,8 @@ import com.bitwarden.ui.platform.base.util.mirrorIfRtl import com.bitwarden.ui.platform.components.model.CardStyle import com.bitwarden.ui.platform.components.util.rememberVectorPainter import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenTwoButtonDialog /** @@ -45,8 +45,8 @@ fun BitwardenExternalLinkRow( withDivider: Boolean = true, dialogTitle: String, dialogMessage: String, - dialogConfirmButtonText: String = stringResource(id = R.string.continue_text), - dialogDismissButtonText: String = stringResource(id = R.string.cancel), + dialogConfirmButtonText: String = stringResource(id = BitwardenString.continue_text), + dialogDismissButtonText: String = stringResource(id = BitwardenString.cancel), ) { var shouldShowDialog by rememberSaveable { mutableStateOf(false) } BitwardenTextRow( diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/slider/BitwardenSlider.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/slider/BitwardenSlider.kt index da98dd1eeb..9c4ad25c40 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/slider/BitwardenSlider.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/slider/BitwardenSlider.kt @@ -40,8 +40,8 @@ import com.bitwarden.ui.platform.base.util.nullableTestTag import com.bitwarden.ui.platform.base.util.toDp import com.bitwarden.ui.platform.components.field.color.bitwardenTextFieldColors import com.bitwarden.ui.platform.components.model.CardStyle +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.platform.components.slider.color.bitwardenSliderColors /** @@ -85,7 +85,7 @@ fun BitwardenSlider( onValueChange = { }, label = { Text( - text = stringResource(id = R.string.length), + text = stringResource(id = BitwardenString.length), style = BitwardenTheme.typography.bodySmall, modifier = Modifier.onGloballyPositioned { layoutCoordinates -> if (labelTextWidth == Dp.Unspecified) { diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/snackbar/BitwardenSnackbar.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/snackbar/BitwardenSnackbar.kt index bf784e2c70..c5c547bb1d 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/snackbar/BitwardenSnackbar.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/snackbar/BitwardenSnackbar.kt @@ -29,9 +29,9 @@ import com.bitwarden.ui.platform.components.button.BitwardenOutlinedButton import com.bitwarden.ui.platform.components.button.BitwardenStandardIconButton import com.bitwarden.ui.platform.components.button.color.bitwardenOutlinedButtonColors import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R /** * Custom snackbar for Bitwarden. @@ -108,7 +108,7 @@ fun BitwardenSnackbar( BitwardenStandardIconButton( onClick = onDismiss, vectorIconRes = BitwardenDrawable.ic_close, - contentDescription = stringResource(R.string.close), + contentDescription = stringResource(BitwardenString.close), contentColor = BitwardenTheme.colorScheme.icon.reversed, modifier = Modifier.offset(x = 12.dp, y = (-12).dp), ) diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/toggle/BitwardenUnlockWithBiometricsSwitch.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/toggle/BitwardenUnlockWithBiometricsSwitch.kt index 213b303a68..231fcd6337 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/toggle/BitwardenUnlockWithBiometricsSwitch.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/toggle/BitwardenUnlockWithBiometricsSwitch.kt @@ -5,7 +5,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import com.bitwarden.ui.platform.components.model.CardStyle import com.bitwarden.ui.platform.components.toggle.BitwardenSwitch -import com.x8bit.bitwarden.R +import com.bitwarden.ui.platform.resource.BitwardenString import com.x8bit.bitwarden.ui.platform.manager.biometrics.BiometricSupportStatus /** @@ -28,11 +28,11 @@ fun BitwardenUnlockWithBiometricsSwitch( ) { val biometricsDescription: String = when (biometricSupportStatus) { BiometricSupportStatus.CLASS_3_SUPPORTED -> { - stringResource(R.string.class_3_biometrics_description) + stringResource(BitwardenString.class_3_biometrics_description) } BiometricSupportStatus.CLASS_2_SUPPORTED -> { - stringResource(R.string.class_2_biometrics_description) + stringResource(BitwardenString.class_2_biometrics_description) } BiometricSupportStatus.NOT_SUPPORTED -> return @@ -40,8 +40,8 @@ fun BitwardenUnlockWithBiometricsSwitch( BitwardenSwitch( modifier = modifier, label = stringResource( - id = R.string.unlock_with, - stringResource(id = R.string.biometrics), + id = BitwardenString.unlock_with, + stringResource(id = BitwardenString.biometrics), ), isChecked = isChecked, onCheckedChange = { toggled -> diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/toggle/BitwardenUnlockWithPinSwitch.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/toggle/BitwardenUnlockWithPinSwitch.kt index a91d84e4b3..958a833cee 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/toggle/BitwardenUnlockWithPinSwitch.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/toggle/BitwardenUnlockWithPinSwitch.kt @@ -10,7 +10,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import com.bitwarden.ui.platform.components.model.CardStyle import com.bitwarden.ui.platform.components.toggle.BitwardenSwitch -import com.x8bit.bitwarden.R +import com.bitwarden.ui.platform.resource.BitwardenString import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenTwoButtonDialog import com.x8bit.bitwarden.ui.platform.feature.settings.accountsecurity.PinInputDialog @@ -37,7 +37,7 @@ fun BitwardenUnlockWithPinSwitch( var shouldShowPinConfirmationDialog by rememberSaveable { mutableStateOf(value = false) } var pin by remember { mutableStateOf(value = "") } BitwardenSwitch( - label = stringResource(id = R.string.unlock_with_pin), + label = stringResource(id = BitwardenString.unlock_with_pin), isChecked = isUnlockWithPinEnabled, onCheckedChange = { isChecked -> if (isChecked) { @@ -90,10 +90,10 @@ fun BitwardenUnlockWithPinSwitch( shouldShowPinConfirmationDialog -> { BitwardenTwoButtonDialog( - title = stringResource(id = R.string.require_master_password_on_app_restart), - message = stringResource(id = R.string.pin_require_master_password_restart), - confirmButtonText = stringResource(id = R.string.yes), - dismissButtonText = stringResource(id = R.string.no), + title = stringResource(id = BitwardenString.require_master_password_on_app_restart), + message = stringResource(id = BitwardenString.pin_require_master_password_restart), + confirmButtonText = stringResource(id = BitwardenString.yes), + dismissButtonText = stringResource(id = BitwardenString.no), onConfirmClick = { shouldShowPinConfirmationDialog = false onUnlockWithPinToggleAction( diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/tooltip/BitwardenToolTip.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/tooltip/BitwardenToolTip.kt index 975589c2df..07f9dd9575 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/tooltip/BitwardenToolTip.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/tooltip/BitwardenToolTip.kt @@ -22,8 +22,8 @@ import androidx.compose.ui.unit.dp import com.bitwarden.ui.platform.components.button.BitwardenStandardIconButton import com.bitwarden.ui.platform.components.util.rememberVectorPainter import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme -import com.x8bit.bitwarden.R private val MIN_TOOLTIP_WIDTH = 312.dp @@ -69,7 +69,7 @@ fun TooltipScope.BitwardenToolTip( onDismiss?.let { BitwardenStandardIconButton( painter = rememberVectorPainter(BitwardenDrawable.ic_close_small), - contentDescription = stringResource(R.string.close), + contentDescription = stringResource(BitwardenString.close), onClick = it, modifier = Modifier.offset(x = 16.dp), ) diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/debugmenu/DebugMenuScreen.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/debugmenu/DebugMenuScreen.kt index 34fb97fa41..f7e489c820 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/debugmenu/DebugMenuScreen.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/debugmenu/DebugMenuScreen.kt @@ -33,8 +33,8 @@ import com.bitwarden.ui.platform.components.button.BitwardenFilledButton import com.bitwarden.ui.platform.components.divider.BitwardenHorizontalDivider import com.bitwarden.ui.platform.components.util.rememberVectorPainter import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.platform.manager.model.FlagKey import com.x8bit.bitwarden.ui.platform.components.header.BitwardenListHeaderText import com.x8bit.bitwarden.ui.platform.components.scaffold.BitwardenScaffold @@ -66,11 +66,11 @@ fun DebugMenuScreen( .nestedScroll(scrollBehavior.nestedScrollConnection), topBar = { BitwardenTopAppBar( - title = stringResource(R.string.debug_menu), + title = stringResource(BitwardenString.debug_menu), scrollBehavior = scrollBehavior, navigationIcon = NavigationIcon( navigationIcon = rememberVectorPainter(BitwardenDrawable.ic_back), - navigationIconContentDescription = stringResource(id = R.string.back), + navigationIconContentDescription = stringResource(id = BitwardenString.back), onNavigationIconClick = remember(viewModel) { { viewModel.trySendAction(DebugMenuAction.NavigateBack) @@ -114,7 +114,7 @@ fun DebugMenuScreen( ) Spacer(Modifier.height(16.dp)) BitwardenFilledButton( - label = stringResource(R.string.reset_coach_mark_tour_status), + label = stringResource(BitwardenString.reset_coach_mark_tour_status), onClick = remember(viewModel) { { viewModel.trySendAction(DebugMenuAction.ResetCoachMarkTourStatuses) @@ -129,14 +129,14 @@ fun DebugMenuScreen( BitwardenHorizontalDivider() Spacer(Modifier.height(height = 16.dp)) BitwardenListHeaderText( - label = stringResource(R.string.error_reports), + label = stringResource(BitwardenString.error_reports), modifier = Modifier .standardHorizontalMargin() .padding(horizontal = 16.dp), ) Spacer(modifier = Modifier.height(height = 8.dp)) BitwardenFilledButton( - label = stringResource(R.string.generate_error_report), + label = stringResource(BitwardenString.generate_error_report), onClick = remember(viewModel) { { viewModel.trySendAction(DebugMenuAction.GenerateErrorReportClick) } }, @@ -147,7 +147,7 @@ fun DebugMenuScreen( ) Spacer(modifier = Modifier.height(height = 8.dp)) BitwardenFilledButton( - label = stringResource(R.string.generate_crash), + label = stringResource(BitwardenString.generate_crash), onClick = remember(viewModel) { { viewModel.trySendAction(DebugMenuAction.GenerateCrashClick) } }, @@ -173,7 +173,7 @@ private fun FeatureFlagContent( modifier = modifier, ) { BitwardenListHeaderText( - label = stringResource(R.string.feature_flags), + label = stringResource(BitwardenString.feature_flags), modifier = Modifier .standardHorizontalMargin() .padding(horizontal = 16.dp), @@ -193,7 +193,7 @@ private fun FeatureFlagContent( } Spacer(modifier = Modifier.height(height = 16.dp)) BitwardenFilledButton( - label = stringResource(R.string.reset_values), + label = stringResource(BitwardenString.reset_values), onClick = onResetValues, modifier = Modifier .standardHorizontalMargin() @@ -213,14 +213,14 @@ private fun OnboardingOverrideContent( ) { Column(modifier) { BitwardenListHeaderText( - label = stringResource(R.string.onboarding_override), + label = stringResource(BitwardenString.onboarding_override), modifier = Modifier .standardHorizontalMargin() .padding(horizontal = 16.dp), ) Spacer(modifier = Modifier.height(8.dp)) BitwardenFilledButton( - label = stringResource(R.string.restart_onboarding_cta), + label = stringResource(BitwardenString.restart_onboarding_cta), onClick = onStartOnboarding, modifier = Modifier .fillMaxWidth() @@ -228,7 +228,7 @@ private fun OnboardingOverrideContent( ) Spacer(modifier = Modifier.height(4.dp)) Text( - text = stringResource(R.string.restart_onboarding_details), + text = stringResource(BitwardenString.restart_onboarding_details), modifier = Modifier .align(Alignment.CenterHorizontally) .standardHorizontalMargin(), @@ -238,7 +238,7 @@ private fun OnboardingOverrideContent( ) Spacer(Modifier.height(16.dp)) BitwardenFilledButton( - label = stringResource(R.string.restart_onboarding_carousel), + label = stringResource(BitwardenString.restart_onboarding_carousel), onClick = onStartOnboardingCarousel, modifier = Modifier .fillMaxWidth() @@ -246,7 +246,7 @@ private fun OnboardingOverrideContent( ) Spacer(modifier = Modifier.height(4.dp)) Text( - text = stringResource(R.string.restart_onboarding_carousel_details), + text = stringResource(BitwardenString.restart_onboarding_carousel_details), modifier = Modifier .align(Alignment.CenterHorizontally) .standardHorizontalMargin(), diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/debugmenu/components/FeatureFlagListItems.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/debugmenu/components/FeatureFlagListItems.kt index 02a0374aca..9c2ec0cdae 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/debugmenu/components/FeatureFlagListItems.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/debugmenu/components/FeatureFlagListItems.kt @@ -5,7 +5,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import com.bitwarden.ui.platform.components.model.CardStyle import com.bitwarden.ui.platform.components.toggle.BitwardenSwitch -import com.x8bit.bitwarden.R +import com.bitwarden.ui.platform.resource.BitwardenString import com.x8bit.bitwarden.data.platform.manager.model.FlagKey /** @@ -78,22 +78,24 @@ private fun FlagKey.getDisplayLabel(): String = when (this) { FlagKey.DummyString, -> this.keyName - FlagKey.EmailVerification -> stringResource(R.string.email_verification) - FlagKey.ImportLoginsFlow -> stringResource(R.string.import_logins_flow) - FlagKey.CredentialExchangeProtocolImport -> stringResource(R.string.cxp_import) - FlagKey.CredentialExchangeProtocolExport -> stringResource(R.string.cxp_export) - FlagKey.CipherKeyEncryption -> stringResource(R.string.cipher_key_encryption) - FlagKey.SingleTapPasskeyCreation -> stringResource(R.string.single_tap_passkey_creation) + FlagKey.EmailVerification -> stringResource(BitwardenString.email_verification) + FlagKey.ImportLoginsFlow -> stringResource(BitwardenString.import_logins_flow) + FlagKey.CredentialExchangeProtocolImport -> stringResource(BitwardenString.cxp_import) + FlagKey.CredentialExchangeProtocolExport -> stringResource(BitwardenString.cxp_export) + FlagKey.CipherKeyEncryption -> stringResource(BitwardenString.cipher_key_encryption) + FlagKey.SingleTapPasskeyCreation -> stringResource(BitwardenString.single_tap_passkey_creation) FlagKey.SingleTapPasskeyAuthentication -> { - stringResource(R.string.single_tap_passkey_authentication) + stringResource(BitwardenString.single_tap_passkey_authentication) } - FlagKey.AnonAddySelfHostAlias -> stringResource(R.string.anon_addy_self_hosted_aliases) - FlagKey.SimpleLoginSelfHostAlias -> stringResource(R.string.simple_login_self_hosted_aliases) - FlagKey.RestrictCipherItemDeletion -> stringResource(R.string.restrict_item_deletion) + FlagKey.AnonAddySelfHostAlias -> stringResource(BitwardenString.anon_addy_self_hosted_aliases) + FlagKey.SimpleLoginSelfHostAlias -> { + stringResource(BitwardenString.simple_login_self_hosted_aliases) + } + FlagKey.RestrictCipherItemDeletion -> stringResource(BitwardenString.restrict_item_deletion) FlagKey.UserManagedPrivilegedApps -> { - stringResource(R.string.user_trusted_privileged_app_management) + stringResource(BitwardenString.user_trusted_privileged_app_management) } - FlagKey.RemoveCardPolicy -> stringResource(R.string.remove_card_policy) + FlagKey.RemoveCardPolicy -> stringResource(BitwardenString.remove_card_policy) } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/search/SearchContent.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/search/SearchContent.kt index 1f28f49d82..9624bd2f8c 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/search/SearchContent.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/search/SearchContent.kt @@ -17,7 +17,7 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import com.bitwarden.ui.platform.base.util.standardHorizontalMargin import com.bitwarden.ui.platform.base.util.toListItemCardStyle -import com.x8bit.bitwarden.R +import com.bitwarden.ui.platform.resource.BitwardenString import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenMasterPasswordDialog import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenSelectionDialog import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenTwoButtonDialog @@ -47,10 +47,10 @@ fun SearchContent( when (val option = showConfirmationDialog) { is ListingItemOverflowAction.SendAction.DeleteClick -> { BitwardenTwoButtonDialog( - title = stringResource(id = R.string.delete), - message = stringResource(id = R.string.are_you_sure_delete_send), - confirmButtonText = stringResource(id = R.string.yes), - dismissButtonText = stringResource(id = R.string.cancel), + title = stringResource(id = BitwardenString.delete), + message = stringResource(id = BitwardenString.are_you_sure_delete_send), + confirmButtonText = stringResource(id = BitwardenString.yes), + dismissButtonText = stringResource(id = BitwardenString.cancel), onConfirmClick = { showConfirmationDialog = null searchHandlers.onOverflowItemClick(option) @@ -211,12 +211,12 @@ private fun AutofillSelectionDialog( } } BitwardenSelectionDialog( - title = stringResource(id = R.string.autofill_or_view), + title = stringResource(id = BitwardenString.autofill_or_view), onDismissRequest = onDismissRequest, selectionItems = { if (AutofillSelectionOption.AUTOFILL in displayItem.autofillSelectionOptions) { BitwardenBasicDialogRow( - text = stringResource(id = R.string.autofill), + text = stringResource(id = BitwardenString.autofill), onClick = { selectionCallback( displayItem, @@ -227,7 +227,7 @@ private fun AutofillSelectionDialog( } if (AutofillSelectionOption.AUTOFILL_AND_SAVE in displayItem.autofillSelectionOptions) { BitwardenBasicDialogRow( - text = stringResource(id = R.string.autofill_and_save), + text = stringResource(id = BitwardenString.autofill_and_save), onClick = { selectionCallback( displayItem, @@ -238,7 +238,7 @@ private fun AutofillSelectionDialog( } if (AutofillSelectionOption.VIEW in displayItem.autofillSelectionOptions) { BitwardenBasicDialogRow( - text = stringResource(id = R.string.view), + text = stringResource(id = BitwardenString.view), onClick = { onDismissRequest() onViewItemClick(displayItem.id, displayItem.itemType) diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/search/SearchScreen.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/search/SearchScreen.kt index 4df824f42e..59374fab38 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/search/SearchScreen.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/search/SearchScreen.kt @@ -21,7 +21,7 @@ import com.bitwarden.ui.platform.components.appbar.BitwardenSearchTopAppBar import com.bitwarden.ui.platform.components.appbar.NavigationIcon import com.bitwarden.ui.platform.components.util.rememberVectorPainter import com.bitwarden.ui.platform.resource.BitwardenDrawable -import com.x8bit.bitwarden.R +import com.bitwarden.ui.platform.resource.BitwardenString import com.x8bit.bitwarden.data.platform.manager.model.AppResumeScreenData import com.x8bit.bitwarden.data.platform.manager.util.AppResumeStateManager import com.x8bit.bitwarden.data.platform.manager.util.RegisterScreenDataOnLifecycleEffect @@ -130,10 +130,10 @@ fun SearchScreen( scrollBehavior = scrollBehavior, navigationIcon = NavigationIcon( navigationIcon = rememberVectorPainter(id = BitwardenDrawable.ic_back), - navigationIconContentDescription = stringResource(id = R.string.back), + navigationIconContentDescription = stringResource(id = BitwardenString.back), onNavigationIconClick = searchHandlers.onBackClick, ), - clearIconContentDescription = stringResource(id = R.string.clear), + clearIconContentDescription = stringResource(id = BitwardenString.clear), ) }, utilityBar = { diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/search/SearchViewModel.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/search/SearchViewModel.kt index e0a5e9b5e0..cd50601bae 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/search/SearchViewModel.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/search/SearchViewModel.kt @@ -12,13 +12,13 @@ import com.bitwarden.send.SendType import com.bitwarden.ui.platform.base.BackgroundEvent import com.bitwarden.ui.platform.base.BaseViewModel import com.bitwarden.ui.platform.components.icon.model.IconData +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText import com.bitwarden.ui.util.concat import com.bitwarden.vault.CipherType import com.bitwarden.vault.CipherView import com.bitwarden.vault.LoginUriView -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.auth.repository.AuthRepository import com.x8bit.bitwarden.data.auth.repository.model.ValidatePasswordResult import com.x8bit.bitwarden.data.autofill.accessibility.manager.AccessibilitySelectionManager @@ -251,7 +251,7 @@ class SearchViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = SearchState.DialogState.Loading( - message = R.string.loading.asText(), + message = BitwardenString.loading.asText(), ), ) } @@ -376,13 +376,15 @@ class SearchViewModel @Inject constructor( private fun handleCopyUrlClick(action: ListingItemOverflowAction.SendAction.CopyUrlClick) { clipboardManager.setText( text = action.sendUrl, - toastDescriptorOverride = R.string.link.asText(), + toastDescriptorOverride = BitwardenString.link.asText(), ) } private fun handleDeleteClick(action: ListingItemOverflowAction.SendAction.DeleteClick) { mutableStateFlow.update { - it.copy(dialogState = SearchState.DialogState.Loading(R.string.deleting.asText())) + it.copy( + dialogState = SearchState.DialogState.Loading(BitwardenString.deleting.asText()), + ) } viewModelScope.launch { val result = vaultRepo.deleteSend(action.sendId) @@ -423,7 +425,7 @@ class SearchViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = SearchState.DialogState.Loading( - message = R.string.removing_send_password.asText(), + message = BitwardenString.removing_send_password.asText(), ), ) } @@ -443,7 +445,7 @@ class SearchViewModel @Inject constructor( ?.let { clipboardManager.setText( text = it.notes.orEmpty(), - toastDescriptorOverride = R.string.notes.asText(), + toastDescriptorOverride = BitwardenString.notes.asText(), ) } } @@ -457,7 +459,7 @@ class SearchViewModel @Inject constructor( ?.let { clipboardManager.setText( text = it.card?.number.orEmpty(), - toastDescriptorOverride = R.string.number.asText(), + toastDescriptorOverride = BitwardenString.number.asText(), ) } } @@ -471,7 +473,7 @@ class SearchViewModel @Inject constructor( ?.let { cipherView -> clipboardManager.setText( text = cipherView.login?.password.orEmpty(), - toastDescriptorOverride = R.string.password.asText(), + toastDescriptorOverride = BitwardenString.password.asText(), ) organizationEventManager.trackEvent( event = OrganizationEvent.CipherClientCopiedPassword( @@ -490,7 +492,7 @@ class SearchViewModel @Inject constructor( ?.let { cipherView -> clipboardManager.setText( text = cipherView.card?.code.orEmpty(), - toastDescriptorOverride = R.string.security_code.asText(), + toastDescriptorOverride = BitwardenString.security_code.asText(), ) organizationEventManager.trackEvent( event = OrganizationEvent.CipherClientCopiedCardCode( @@ -506,7 +508,7 @@ class SearchViewModel @Inject constructor( ) { clipboardManager.setText( text = action.username, - toastDescriptorOverride = R.string.username.asText(), + toastDescriptorOverride = BitwardenString.username.asText(), ) } @@ -580,8 +582,8 @@ class SearchViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = SearchState.DialogState.Error( - title = R.string.decryption_error.asText(), - message = R.string.failed_to_decrypt_cipher_contact_support.asText(), + title = BitwardenString.decryption_error.asText(), + message = BitwardenString.failed_to_decrypt_cipher_contact_support.asText(), throwable = action.error, ), ) @@ -603,8 +605,8 @@ class SearchViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = SearchState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.generic_error_message.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.generic_error_message.asText(), throwable = result.error, ), ) @@ -613,7 +615,7 @@ class SearchViewModel @Inject constructor( DeleteSendResult.Success -> { mutableStateFlow.update { it.copy(dialogState = null) } - sendEvent(SearchEvent.ShowSnackbar(R.string.send_deleted.asText())) + sendEvent(SearchEvent.ShowSnackbar(BitwardenString.send_deleted.asText())) } } } @@ -626,7 +628,7 @@ class SearchViewModel @Inject constructor( is GenerateTotpResult.Success -> { clipboardManager.setText( text = result.code, - toastDescriptorOverride = R.string.totp.asText(), + toastDescriptorOverride = BitwardenString.totp.asText(), ) } } @@ -640,11 +642,11 @@ class SearchViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = SearchState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), + title = BitwardenString.an_error_has_occurred.asText(), message = result .errorMessage ?.asText() - ?: R.string.generic_error_message.asText(), + ?: BitwardenString.generic_error_message.asText(), ), ) } @@ -652,7 +654,7 @@ class SearchViewModel @Inject constructor( is RemovePasswordSendResult.Success -> { mutableStateFlow.update { it.copy(dialogState = null) } - sendEvent(SearchEvent.ShowSnackbar(R.string.password_removed.asText())) + sendEvent(SearchEvent.ShowSnackbar(BitwardenString.password_removed.asText())) } } } @@ -673,7 +675,7 @@ class SearchViewModel @Inject constructor( dialogState = SearchState.DialogState.Error( title = null, message = result.errorMessage?.asText() - ?: R.string.generic_error_message.asText(), + ?: BitwardenString.generic_error_message.asText(), throwable = result.error, ), ) @@ -696,7 +698,7 @@ class SearchViewModel @Inject constructor( it.copy( dialogState = SearchState.DialogState.Error( title = null, - message = R.string.generic_error_message.asText(), + message = BitwardenString.generic_error_message.asText(), throwable = result.error, ), ) @@ -709,7 +711,7 @@ class SearchViewModel @Inject constructor( it.copy( dialogState = SearchState.DialogState.Error( title = null, - message = R.string.invalid_master_password.asText(), + message = BitwardenString.invalid_master_password.asText(), ), ) } @@ -796,7 +798,7 @@ class SearchViewModel @Inject constructor( mutableStateFlow.update { it.copy( viewState = SearchState.ViewState.Error( - message = R.string.generic_error_message.asText(), + message = BitwardenString.generic_error_message.asText(), ), dialogState = null, ) @@ -820,11 +822,11 @@ class SearchViewModel @Inject constructor( mutableStateFlow.update { currentState -> currentState.copy( viewState = SearchState.ViewState.Error( - message = R.string.internet_connection_required_title + message = BitwardenString.internet_connection_required_title .asText() .concat( " ".asText(), - R.string.internet_connection_required_message.asText(), + BitwardenString.internet_connection_required_message.asText(), ), ), dialogState = null, @@ -1098,21 +1100,21 @@ sealed class SearchTypeData : Parcelable { * Indicates that we should be searching all sends. */ data object All : Sends() { - override val title: Text get() = R.string.search_sends.asText() + override val title: Text get() = BitwardenString.search_sends.asText() } /** * Indicates that we should be searching only text sends. */ data object Texts : Sends() { - override val title: Text get() = R.string.search_text_sends.asText() + override val title: Text get() = BitwardenString.search_text_sends.asText() } /** * Indicates that we should be searching only file sends. */ data object Files : Sends() { - override val title: Text get() = R.string.search_file_sends.asText() + override val title: Text get() = BitwardenString.search_file_sends.asText() } } @@ -1126,7 +1128,7 @@ sealed class SearchTypeData : Parcelable { * Indicates that we should be searching all vault items. */ data object All : Vault() { - override val title: Text get() = R.string.search_vault.asText() + override val title: Text get() = BitwardenString.search_vault.asText() } /** @@ -1134,9 +1136,9 @@ sealed class SearchTypeData : Parcelable { */ data object Logins : Vault() { override val title: Text - get() = R.string.search.asText() + get() = BitwardenString.search.asText() .concat(" ".asText()) - .concat(R.string.logins.asText()) + .concat(BitwardenString.logins.asText()) } /** @@ -1144,9 +1146,9 @@ sealed class SearchTypeData : Parcelable { */ data object Cards : Vault() { override val title: Text - get() = R.string.search.asText() + get() = BitwardenString.search.asText() .concat(" ".asText()) - .concat(R.string.cards.asText()) + .concat(BitwardenString.cards.asText()) } /** @@ -1154,9 +1156,9 @@ sealed class SearchTypeData : Parcelable { */ data object Identities : Vault() { override val title: Text - get() = R.string.search.asText() + get() = BitwardenString.search.asText() .concat(" ".asText()) - .concat(R.string.identities.asText()) + .concat(BitwardenString.identities.asText()) } /** @@ -1164,9 +1166,9 @@ sealed class SearchTypeData : Parcelable { */ data object SecureNotes : Vault() { override val title: Text - get() = R.string.search.asText() + get() = BitwardenString.search.asText() .concat(" ".asText()) - .concat(R.string.secure_notes.asText()) + .concat(BitwardenString.secure_notes.asText()) } /** @@ -1174,9 +1176,9 @@ sealed class SearchTypeData : Parcelable { */ data object SshKeys : Vault() { override val title: Text - get() = R.string.search.asText() + get() = BitwardenString.search.asText() .concat(" ".asText()) - .concat(R.string.ssh_keys.asText()) + .concat(BitwardenString.ssh_keys.asText()) } /** @@ -1187,7 +1189,7 @@ sealed class SearchTypeData : Parcelable { val collectionName: String = "", ) : Vault() { override val title: Text - get() = R.string.search.asText() + get() = BitwardenString.search.asText() .concat(" ".asText()) .concat(collectionName.asText()) } @@ -1197,9 +1199,9 @@ sealed class SearchTypeData : Parcelable { */ data object NoFolder : Vault() { override val title: Text - get() = R.string.search.asText() + get() = BitwardenString.search.asText() .concat(" ".asText()) - .concat(R.string.folder_none.asText()) + .concat(BitwardenString.folder_none.asText()) } /** @@ -1210,7 +1212,7 @@ sealed class SearchTypeData : Parcelable { val folderName: String = "", ) : Vault() { override val title: Text - get() = R.string.search.asText() + get() = BitwardenString.search.asText() .concat(" ".asText()) .concat(folderName.asText()) } @@ -1220,9 +1222,9 @@ sealed class SearchTypeData : Parcelable { */ data object Trash : Vault() { override val title: Text - get() = R.string.search.asText() + get() = BitwardenString.search.asText() .concat(" ".asText()) - .concat(R.string.trash.asText()) + .concat(BitwardenString.trash.asText()) } /** @@ -1230,9 +1232,9 @@ sealed class SearchTypeData : Parcelable { */ data object VerificationCodes : Vault() { override val title: Text - get() = R.string.search.asText() + get() = BitwardenString.search.asText() .concat(" ".asText()) - .concat(R.string.verification_codes.asText()) + .concat(BitwardenString.verification_codes.asText()) } } } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/search/util/SearchTypeDataExtensions.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/search/util/SearchTypeDataExtensions.kt index bec3d3fd52..98b9dcc63b 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/search/util/SearchTypeDataExtensions.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/search/util/SearchTypeDataExtensions.kt @@ -10,6 +10,7 @@ import com.bitwarden.send.SendView import com.bitwarden.ui.platform.base.util.removeDiacritics import com.bitwarden.ui.platform.components.icon.model.IconData import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.asText import com.bitwarden.vault.CipherListView import com.bitwarden.vault.CipherListViewType @@ -17,7 +18,6 @@ import com.bitwarden.vault.CipherRepromptType import com.bitwarden.vault.CipherView import com.bitwarden.vault.CollectionView import com.bitwarden.vault.FolderView -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.autofill.util.isActiveWithFido2Credentials import com.x8bit.bitwarden.data.autofill.util.login import com.x8bit.bitwarden.ui.platform.feature.search.SearchState @@ -182,7 +182,7 @@ fun List.toViewState( else -> { SearchState.ViewState.Empty( - message = R.string.there_are_no_items_that_match_the_search.asText(), + message = BitwardenString.there_are_no_items_that_match_the_search.asText(), ) } } @@ -341,7 +341,7 @@ fun List.toViewState( else -> { SearchState.ViewState.Empty( - message = R.string.there_are_no_items_that_match_the_search.asText(), + message = BitwardenString.there_are_no_items_that_match_the_search.asText(), ) } } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/SettingsScreen.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/SettingsScreen.kt index 1691674a4a..114575347b 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/SettingsScreen.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/SettingsScreen.kt @@ -29,7 +29,7 @@ import com.bitwarden.ui.platform.components.appbar.NavigationIcon import com.bitwarden.ui.platform.components.icon.model.IconData import com.bitwarden.ui.platform.components.util.rememberVectorPainter import com.bitwarden.ui.platform.resource.BitwardenDrawable -import com.x8bit.bitwarden.R +import com.bitwarden.ui.platform.resource.BitwardenString import com.x8bit.bitwarden.ui.platform.components.row.BitwardenPushRow import com.x8bit.bitwarden.ui.platform.components.scaffold.BitwardenScaffold @@ -67,12 +67,14 @@ fun SettingsScreen( BitwardenScaffold( topBar = { BitwardenMediumTopAppBar( - title = stringResource(id = R.string.settings), + title = stringResource(id = BitwardenString.settings), scrollBehavior = scrollBehavior, navigationIcon = if (state.shouldShowCloseButton) { NavigationIcon( navigationIcon = rememberVectorPainter(id = BitwardenDrawable.ic_close), - navigationIconContentDescription = stringResource(id = R.string.close), + navigationIconContentDescription = stringResource( + id = BitwardenString.close, + ), onNavigationIconClick = remember(viewModel) { { viewModel.trySendAction(SettingsAction.CloseClick) } }, diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/SettingsViewModel.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/SettingsViewModel.kt index 82587db3da..b0d8e65f43 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/SettingsViewModel.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/SettingsViewModel.kt @@ -7,9 +7,9 @@ import androidx.lifecycle.viewModelScope import com.bitwarden.ui.platform.base.BackgroundEvent import com.bitwarden.ui.platform.base.BaseViewModel import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.platform.manager.FirstTimeActionManager import com.x8bit.bitwarden.data.platform.manager.SpecialCircumstanceManager import com.x8bit.bitwarden.data.platform.manager.model.SpecialCircumstance @@ -236,32 +236,32 @@ enum class Settings( val testTag: String, ) { ACCOUNT_SECURITY( - text = R.string.account_security.asText(), + text = BitwardenString.account_security.asText(), vectorIconRes = BitwardenDrawable.ic_locked, testTag = "AccountSecuritySettingsButton", ), AUTO_FILL( - text = R.string.autofill.asText(), + text = BitwardenString.autofill.asText(), vectorIconRes = BitwardenDrawable.ic_check_mark, testTag = "AutofillSettingsButton", ), VAULT( - text = R.string.vault.asText(), + text = BitwardenString.vault.asText(), vectorIconRes = BitwardenDrawable.ic_vault_thin, testTag = "VaultSettingsButton", ), APPEARANCE( - text = R.string.appearance.asText(), + text = BitwardenString.appearance.asText(), vectorIconRes = BitwardenDrawable.ic_paintbrush, testTag = "AppearanceSettingsButton", ), OTHER( - text = R.string.other.asText(), + text = BitwardenString.other.asText(), vectorIconRes = BitwardenDrawable.ic_filter, testTag = "OtherSettingsButton", ), ABOUT( - text = R.string.about.asText(), + text = BitwardenString.about.asText(), vectorIconRes = BitwardenDrawable.ic_info_circle, testTag = "AboutSettingsButton", ), diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/about/AboutScreen.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/about/AboutScreen.kt index f47320c1bb..ce4e3903b3 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/about/AboutScreen.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/about/AboutScreen.kt @@ -39,10 +39,10 @@ import com.bitwarden.ui.platform.components.model.TooltipData import com.bitwarden.ui.platform.components.toggle.BitwardenSwitch import com.bitwarden.ui.platform.components.util.rememberVectorPainter import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.platform.components.row.BitwardenExternalLinkRow import com.x8bit.bitwarden.ui.platform.components.row.BitwardenPushRow import com.x8bit.bitwarden.ui.platform.components.row.BitwardenTextRow @@ -96,10 +96,10 @@ fun AboutScreen( .nestedScroll(scrollBehavior.nestedScrollConnection), topBar = { BitwardenTopAppBar( - title = stringResource(id = R.string.about), + title = stringResource(id = BitwardenString.about), scrollBehavior = scrollBehavior, navigationIcon = rememberVectorPainter(id = BitwardenDrawable.ic_back), - navigationIconContentDescription = stringResource(id = R.string.back), + navigationIconContentDescription = stringResource(id = BitwardenString.back), onNavigationIconClick = remember(viewModel) { { viewModel.trySendAction(AboutAction.BackClick) } }, @@ -173,11 +173,11 @@ private fun AboutScreenContent( onViewRecordedLogsClick = onViewRecordedLogsClick, ) BitwardenExternalLinkRow( - text = stringResource(id = R.string.bitwarden_help_center), + text = stringResource(id = BitwardenString.bitwarden_help_center), onConfirmClick = onHelpCenterClick, - dialogTitle = stringResource(id = R.string.continue_to_help_center), + dialogTitle = stringResource(id = BitwardenString.continue_to_help_center), dialogMessage = stringResource( - id = R.string.learn_more_about_how_to_use_bitwarden_on_the_help_center, + id = BitwardenString.learn_more_about_how_to_use_bitwarden_on_the_help_center, ), withDivider = false, cardStyle = CardStyle.Top(), @@ -187,11 +187,11 @@ private fun AboutScreenContent( .testTag(tag = "BitwardenHelpCenterRow"), ) BitwardenExternalLinkRow( - text = stringResource(id = R.string.privacy_policy), + text = stringResource(id = BitwardenString.privacy_policy), onConfirmClick = onPrivacyPolicyClick, - dialogTitle = stringResource(id = R.string.continue_to_privacy_policy), + dialogTitle = stringResource(id = BitwardenString.continue_to_privacy_policy), dialogMessage = stringResource( - id = R.string.privacy_policy_description_long, + id = BitwardenString.privacy_policy_description_long, ), withDivider = false, cardStyle = CardStyle.Middle(), @@ -201,11 +201,11 @@ private fun AboutScreenContent( .testTag(tag = "PrivacyPolicyRow"), ) BitwardenExternalLinkRow( - text = stringResource(id = R.string.web_vault), + text = stringResource(id = BitwardenString.web_vault), onConfirmClick = onWebVaultClick, - dialogTitle = stringResource(id = R.string.continue_to_web_app), + dialogTitle = stringResource(id = BitwardenString.continue_to_web_app), dialogMessage = stringResource( - id = R.string.explore_more_features_of_your_bitwarden_account_on_the_web_app, + id = BitwardenString.explore_more_features_of_your_bitwarden_account_on_the_web_app, ), withDivider = false, cardStyle = CardStyle.Middle(), @@ -215,11 +215,11 @@ private fun AboutScreenContent( .testTag(tag = "BitwardenWebVaultRow"), ) BitwardenExternalLinkRow( - text = stringResource(id = R.string.learn_org), + text = stringResource(id = BitwardenString.learn_org), onConfirmClick = onLearnAboutOrgsClick, - dialogTitle = stringResource(id = R.string.continue_to_x, "bitwarden.com"), + dialogTitle = stringResource(id = BitwardenString.continue_to_x, "bitwarden.com"), dialogMessage = stringResource( - id = R.string.learn_about_organizations_description_long, + id = BitwardenString.learn_about_organizations_description_long, ), withDivider = false, cardStyle = CardStyle.Middle(), @@ -263,8 +263,8 @@ private fun ColumnScope.CrashLogsCard( ) { if (!isVisible) return BitwardenSwitch( - label = stringResource(id = R.string.submit_crash_logs), - contentDescription = stringResource(id = R.string.submit_crash_logs), + label = stringResource(id = BitwardenString.submit_crash_logs), + contentDescription = stringResource(id = BitwardenString.submit_crash_logs), isChecked = isEnabled, onCheckedChange = onSubmitCrashLogsCheckedChange, cardStyle = CardStyle.Full, @@ -285,11 +285,11 @@ private fun ColumnScope.FlightRecorderCard( onViewRecordedLogsClick: () -> Unit, ) { BitwardenSwitch( - label = stringResource(id = R.string.flight_recorder), + label = stringResource(id = BitwardenString.flight_recorder), isChecked = isFlightRecorderEnabled, onCheckedChange = onFlightRecorderCheckedChange, tooltip = TooltipData( - contentDescription = stringResource(id = R.string.flight_recorder_help), + contentDescription = stringResource(id = BitwardenString.flight_recorder_help), onClick = onFlightRecorderTooltipClick, ), subtext = logExpiration?.invoke(), @@ -300,7 +300,7 @@ private fun ColumnScope.FlightRecorderCard( .standardHorizontalMargin(), ) BitwardenPushRow( - text = stringResource(id = R.string.view_recorded_logs), + text = stringResource(id = BitwardenString.view_recorded_logs), onClick = onViewRecordedLogsClick, cardStyle = CardStyle.Bottom, modifier = Modifier diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/about/util/FlightRecorderDataSetExtensions.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/about/util/FlightRecorderDataSetExtensions.kt index 2c0badec99..c006e59a30 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/about/util/FlightRecorderDataSetExtensions.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/about/util/FlightRecorderDataSetExtensions.kt @@ -2,9 +2,9 @@ package com.x8bit.bitwarden.ui.platform.feature.settings.about.util import com.bitwarden.core.data.util.toFormattedDateStyle import com.bitwarden.core.data.util.toFormattedTimeStyle +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.platform.datasource.disk.model.FlightRecorderDataSet import java.time.Clock import java.time.Instant @@ -33,5 +33,5 @@ private fun FlightRecorderDataSet.FlightRecorderData.getStopsLoggingString( timeStyle = FormatStyle.SHORT, clock = clock, ) - return R.string.stops_logging_on.asText(completionDate, completionTime) + return BitwardenString.stops_logging_on.asText(completionDate, completionTime) } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/AccountSecurityScreen.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/AccountSecurityScreen.kt index 1f22217342..d052518c7d 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/AccountSecurityScreen.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/AccountSecurityScreen.kt @@ -42,10 +42,10 @@ import com.bitwarden.ui.platform.components.model.CardStyle import com.bitwarden.ui.platform.components.toggle.BitwardenSwitch import com.bitwarden.ui.platform.components.util.rememberVectorPainter import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.platform.repository.model.VaultTimeout import com.x8bit.bitwarden.data.platform.repository.model.VaultTimeoutAction import com.x8bit.bitwarden.ui.platform.components.card.BitwardenActionCard @@ -161,10 +161,10 @@ fun AccountSecurityScreen( .nestedScroll(scrollBehavior.nestedScrollConnection), topBar = { BitwardenTopAppBar( - title = stringResource(id = R.string.account_security), + title = stringResource(id = BitwardenString.account_security), scrollBehavior = scrollBehavior, navigationIcon = rememberVectorPainter(id = BitwardenDrawable.ic_back), - navigationIconContentDescription = stringResource(id = R.string.back), + navigationIconContentDescription = stringResource(id = BitwardenString.back), onNavigationIconClick = remember(viewModel) { { viewModel.trySendAction(AccountSecurityAction.BackClick) } }, @@ -183,8 +183,8 @@ fun AccountSecurityScreen( exit = actionCardExitAnimation(), ) { BitwardenActionCard( - cardTitle = stringResource(id = R.string.set_up_unlock), - actionText = stringResource(R.string.get_started), + cardTitle = stringResource(id = BitwardenString.set_up_unlock), + actionText = stringResource(BitwardenString.get_started), onActionClick = remember(viewModel) { { viewModel.trySendAction(AccountSecurityAction.UnlockActionCardCtaClick) @@ -205,7 +205,7 @@ fun AccountSecurityScreen( } BitwardenListHeaderText( - label = stringResource(id = R.string.approve_login_requests), + label = stringResource(id = BitwardenString.approve_login_requests), modifier = Modifier .fillMaxWidth() .standardHorizontalMargin() @@ -213,7 +213,7 @@ fun AccountSecurityScreen( ) Spacer(modifier = Modifier.height(height = 8.dp)) BitwardenTextRow( - text = stringResource(id = R.string.pending_log_in_requests), + text = stringResource(id = BitwardenString.pending_log_in_requests), onClick = remember(viewModel) { { viewModel.trySendAction(AccountSecurityAction.PendingLoginRequestsClick) } }, @@ -231,7 +231,7 @@ fun AccountSecurityScreen( ) { Spacer(Modifier.height(16.dp)) BitwardenListHeaderText( - label = stringResource(id = R.string.unlock_options), + label = stringResource(id = BitwardenString.unlock_options), modifier = Modifier .fillMaxWidth() .standardHorizontalMargin() @@ -288,7 +288,7 @@ fun AccountSecurityScreen( Spacer(Modifier.height(16.dp)) } BitwardenListHeaderText( - label = stringResource(id = R.string.session_timeout), + label = stringResource(id = BitwardenString.session_timeout), modifier = Modifier .fillMaxWidth() .standardHorizontalMargin() @@ -344,7 +344,7 @@ fun AccountSecurityScreen( Spacer(Modifier.height(16.dp)) BitwardenListHeaderText( - label = stringResource(id = R.string.other), + label = stringResource(id = BitwardenString.other), modifier = Modifier .fillMaxWidth() .standardHorizontalMargin() @@ -352,7 +352,7 @@ fun AccountSecurityScreen( ) Spacer(modifier = Modifier.height(height = 8.dp)) BitwardenTextRow( - text = stringResource(id = R.string.account_fingerprint_phrase), + text = stringResource(id = BitwardenString.account_fingerprint_phrase), onClick = remember(viewModel) { { viewModel.trySendAction(AccountSecurityAction.AccountFingerprintPhraseClick) } }, @@ -363,13 +363,15 @@ fun AccountSecurityScreen( .fillMaxWidth(), ) BitwardenExternalLinkRow( - text = stringResource(id = R.string.two_step_login), + text = stringResource(id = BitwardenString.two_step_login), onConfirmClick = remember(viewModel) { { viewModel.trySendAction(AccountSecurityAction.TwoStepLoginClick) } }, withDivider = false, - dialogTitle = stringResource(id = R.string.continue_to_web_app), - dialogMessage = stringResource(id = R.string.two_step_login_description_long), + dialogTitle = stringResource(id = BitwardenString.continue_to_web_app), + dialogMessage = stringResource( + id = BitwardenString.two_step_login_description_long, + ), cardStyle = CardStyle.Middle(), modifier = Modifier .testTag("TwoStepLoginLinkItemView") @@ -378,14 +380,14 @@ fun AccountSecurityScreen( ) if (state.isUnlockWithPasswordEnabled) { BitwardenExternalLinkRow( - text = stringResource(id = R.string.change_master_password), + text = stringResource(id = BitwardenString.change_master_password), onConfirmClick = remember(viewModel) { { viewModel.trySendAction(AccountSecurityAction.ChangeMasterPasswordClick) } }, withDivider = false, - dialogTitle = stringResource(id = R.string.continue_to_web_app), + dialogTitle = stringResource(id = BitwardenString.continue_to_web_app), dialogMessage = stringResource( - id = R.string.change_master_password_description_long, + id = BitwardenString.change_master_password_description_long, ), cardStyle = CardStyle.Middle(), modifier = Modifier @@ -395,7 +397,7 @@ fun AccountSecurityScreen( } if (state.hasUnlockMechanism) { BitwardenTextRow( - text = stringResource(id = R.string.lock_now), + text = stringResource(id = BitwardenString.lock_now), onClick = remember(viewModel) { { viewModel.trySendAction(AccountSecurityAction.LockNowClick) } }, @@ -407,7 +409,7 @@ fun AccountSecurityScreen( ) } BitwardenTextRow( - text = stringResource(id = R.string.log_out), + text = stringResource(id = BitwardenString.log_out), onClick = remember(viewModel) { { viewModel.trySendAction(AccountSecurityAction.LogoutClick) } }, @@ -418,7 +420,7 @@ fun AccountSecurityScreen( .fillMaxWidth(), ) BitwardenTextRow( - text = stringResource(id = R.string.delete_account), + text = stringResource(id = BitwardenString.delete_account), onClick = remember(viewModel) { { viewModel.trySendAction(AccountSecurityAction.DeleteAccountClick) } }, @@ -481,17 +483,21 @@ private fun SessionTimeoutPolicyRow( // Get the localized version of the action. val action = if (vaultTimeoutPolicyAction == "lock") { - R.string.lock.asText() + BitwardenString.lock.asText() } else { - R.string.log_out.asText() + BitwardenString.log_out.asText() } val policyText = if (hours == null || minutes == null) { - R.string.vault_timeout_action_policy_in_effect.asText(action) + BitwardenString.vault_timeout_action_policy_in_effect.asText(action) } else if (vaultTimeoutPolicyAction.isNullOrBlank()) { - R.string.vault_timeout_policy_in_effect.asText(hours, minutes) + BitwardenString.vault_timeout_policy_in_effect.asText(hours, minutes) } else { - R.string.vault_timeout_policy_with_action_in_effect.asText(hours, minutes, action) + BitwardenString.vault_timeout_policy_with_action_in_effect.asText( + hours, + minutes, + action, + ) } BitwardenInfoCalloutCard( @@ -515,7 +521,7 @@ private fun SessionTimeoutRow( .entries .filter { it.minutes <= (vaultTimeoutPolicyMinutes ?: Int.MAX_VALUE) } BitwardenMultiSelectButton( - label = stringResource(id = R.string.session_timeout), + label = stringResource(id = BitwardenString.session_timeout), options = vaultTimeoutOptions.map { it.displayLabel() }.toImmutableList(), selectedOption = selectedVaultTimeoutType.displayLabel(), onOptionSelected = { selectedType -> @@ -535,10 +541,10 @@ private fun SessionTimeoutRow( if (shouldShowNeverTimeoutConfirmationDialog) { BitwardenTwoButtonDialog( - title = stringResource(id = R.string.warning), - message = stringResource(id = R.string.never_lock_warning), - confirmButtonText = stringResource(id = R.string.okay), - dismissButtonText = stringResource(id = R.string.cancel), + title = stringResource(id = BitwardenString.warning), + message = stringResource(id = BitwardenString.never_lock_warning), + confirmButtonText = stringResource(id = BitwardenString.okay), + dismissButtonText = stringResource(id = BitwardenString.cancel), onConfirmClick = { shouldShowNeverTimeoutConfirmationDialog = false onVaultTimeoutTypeSelect(VaultTimeout.Type.NEVER) @@ -561,7 +567,7 @@ private fun SessionCustomTimeoutRow( var shouldShowViolatesPoliciesDialog by remember { mutableStateOf(false) } val vaultTimeoutInMinutes = customVaultTimeout.vaultTimeoutInMinutes BitwardenTextRow( - text = stringResource(id = R.string.custom), + text = stringResource(id = BitwardenString.custom), onClick = { shouldShowTimePickerDialog = true }, cardStyle = CardStyle.Middle(), modifier = modifier, @@ -603,8 +609,8 @@ private fun SessionCustomTimeoutRow( if (shouldShowViolatesPoliciesDialog) { BitwardenBasicDialog( - title = stringResource(id = R.string.warning), - message = stringResource(id = R.string.vault_timeout_to_large), + title = stringResource(id = BitwardenString.warning), + message = stringResource(id = BitwardenString.vault_timeout_to_large), onDismissRequest = { shouldShowViolatesPoliciesDialog = false vaultTimeoutPolicyMinutes?.let { @@ -631,7 +637,7 @@ private fun SessionTimeoutActionRow( var shouldShowLogoutActionConfirmationDialog by rememberSaveable { mutableStateOf(false) } BitwardenMultiSelectButton( isEnabled = isEnabled, - label = stringResource(id = R.string.session_timeout_action), + label = stringResource(id = BitwardenString.session_timeout_action), options = VaultTimeoutAction.entries.map { it.displayLabel() }.toImmutableList(), selectedOption = selectedVaultTimeoutAction.displayLabel(), onOptionSelected = { action -> @@ -647,7 +653,7 @@ private fun SessionTimeoutActionRow( } }, supportingText = stringResource( - id = R.string.set_up_an_unlock_option_to_change_your_vault_timeout_action, + id = BitwardenString.set_up_an_unlock_option_to_change_your_vault_timeout_action, ) .takeUnless { isEnabled }, textFieldTestTag = "SessionTimeoutActionStatusLabel", @@ -657,10 +663,12 @@ private fun SessionTimeoutActionRow( if (shouldShowLogoutActionConfirmationDialog) { BitwardenTwoButtonDialog( - title = stringResource(id = R.string.vault_timeout_log_out_confirmation_title), - message = stringResource(id = R.string.vault_timeout_log_out_confirmation_message), - confirmButtonText = stringResource(id = R.string.yes), - dismissButtonText = stringResource(id = R.string.cancel), + title = stringResource(id = BitwardenString.vault_timeout_log_out_confirmation_title), + message = stringResource( + id = BitwardenString.vault_timeout_log_out_confirmation_message, + ), + confirmButtonText = stringResource(id = BitwardenString.yes), + dismissButtonText = stringResource(id = BitwardenString.cancel), onConfirmClick = { shouldShowLogoutActionConfirmationDialog = false onVaultTimeoutActionSelect(VaultTimeoutAction.LOGOUT) @@ -681,7 +689,7 @@ private fun ColumnScope.SyncWithAuthenticatorRow( onCheckedChange: (Boolean) -> Unit, ) { BitwardenListHeaderText( - label = stringResource(R.string.authenticator_sync), + label = stringResource(BitwardenString.authenticator_sync), modifier = Modifier .fillMaxWidth() .standardHorizontalMargin() @@ -689,7 +697,7 @@ private fun ColumnScope.SyncWithAuthenticatorRow( ) Spacer(modifier = Modifier.height(height = 8.dp)) BitwardenSwitch( - label = stringResource(R.string.allow_bitwarden_authenticator_syncing), + label = stringResource(BitwardenString.allow_bitwarden_authenticator_syncing), onCheckedChange = onCheckedChange, isChecked = isChecked, cardStyle = CardStyle.Full, @@ -709,19 +717,19 @@ private fun FingerPrintPhraseDialog( onDismissRequest = onDismissRequest, dismissButton = { BitwardenTextButton( - label = stringResource(id = R.string.close), + label = stringResource(id = BitwardenString.close), onClick = onDismissRequest, ) }, confirmButton = { BitwardenTextButton( - label = stringResource(id = R.string.learn_more), + label = stringResource(id = BitwardenString.learn_more), onClick = onLearnMore, ) }, title = { Text( - text = stringResource(id = R.string.fingerprint_phrase), + text = stringResource(id = BitwardenString.fingerprint_phrase), color = BitwardenTheme.colorScheme.text.primary, style = BitwardenTheme.typography.headlineSmall, modifier = Modifier.fillMaxWidth(), @@ -730,7 +738,7 @@ private fun FingerPrintPhraseDialog( text = { Column { Text( - text = "${stringResource(id = R.string.your_accounts_fingerprint)}:", + text = "${stringResource(id = BitwardenString.your_accounts_fingerprint)}:", color = BitwardenTheme.colorScheme.text.primary, style = BitwardenTheme.typography.bodyMedium, modifier = Modifier.fillMaxWidth(), diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/AccountSecurityViewModel.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/AccountSecurityViewModel.kt index b73e742b84..6a84751ad2 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/AccountSecurityViewModel.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/AccountSecurityViewModel.kt @@ -8,9 +8,9 @@ import com.bitwarden.core.util.isBuildVersionAtLeast import com.bitwarden.data.repository.util.baseWebVaultUrlOrDefault import com.bitwarden.network.model.PolicyTypeJson import com.bitwarden.ui.platform.base.BaseViewModel +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.auth.repository.AuthRepository import com.x8bit.bitwarden.data.auth.repository.model.LogoutReason import com.x8bit.bitwarden.data.auth.repository.model.PolicyInformation @@ -242,8 +242,8 @@ class AccountSecurityViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialog = AccountSecurityDialog.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.generic_error_message.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.generic_error_message.asText(), ), ) } @@ -327,7 +327,7 @@ class AccountSecurityViewModel @Inject constructor( ) { mutableStateFlow.update { it.copy( - dialog = AccountSecurityDialog.Loading(R.string.saving.asText()), + dialog = AccountSecurityDialog.Loading(BitwardenString.saving.asText()), isUnlockWithBiometricsEnabled = true, ) } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/PinInputDialog.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/PinInputDialog.kt index 42a289e8ff..b43df728a8 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/PinInputDialog.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/PinInputDialog.kt @@ -34,8 +34,8 @@ import com.bitwarden.ui.platform.components.button.BitwardenFilledButton import com.bitwarden.ui.platform.components.button.BitwardenTextButton import com.bitwarden.ui.platform.components.divider.BitwardenHorizontalDivider import com.bitwarden.ui.platform.components.model.CardStyle +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.platform.components.field.BitwardenTextField import com.x8bit.bitwarden.ui.platform.components.util.maxDialogHeight @@ -88,7 +88,7 @@ fun PinInputDialog( .testTag(tag = "AlertTitleText") .padding(horizontal = 24.dp) .fillMaxWidth(), - text = stringResource(id = R.string.enter_pin), + text = stringResource(id = BitwardenString.enter_pin), color = BitwardenTheme.colorScheme.text.primary, style = BitwardenTheme.typography.headlineSmall, ) @@ -106,13 +106,13 @@ fun PinInputDialog( modifier = Modifier .testTag(tag = "AlertContentText") .fillMaxWidth(), - text = stringResource(id = R.string.set_pin_description), + text = stringResource(id = BitwardenString.set_pin_description), color = BitwardenTheme.colorScheme.text.primary, style = BitwardenTheme.typography.bodyMedium, ) Spacer(modifier = Modifier.height(height = 16.dp)) BitwardenTextField( - label = stringResource(id = R.string.pin), + label = stringResource(id = BitwardenString.pin), value = pin, autoFocus = true, onValueChange = { newValue -> @@ -142,13 +142,13 @@ fun PinInputDialog( verticalAlignment = Alignment.CenterVertically, ) { BitwardenTextButton( - label = stringResource(id = R.string.cancel), + label = stringResource(id = BitwardenString.cancel), onClick = onCancelClick, modifier = Modifier.testTag(tag = "DismissAlertButton"), ) BitwardenFilledButton( - label = stringResource(id = R.string.submit), + label = stringResource(id = BitwardenString.submit), isEnabled = isDoneEnabled(), onClick = { onSubmitClick(pin) }, modifier = Modifier.testTag(tag = "AcceptAlertButton"), diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/deleteaccount/DeleteAccountScreen.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/deleteaccount/DeleteAccountScreen.kt index eed6b9107d..09d3e548b4 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/deleteaccount/DeleteAccountScreen.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/deleteaccount/DeleteAccountScreen.kt @@ -39,8 +39,8 @@ import com.bitwarden.ui.platform.components.button.BitwardenOutlinedErrorButton import com.bitwarden.ui.platform.components.model.CardStyle import com.bitwarden.ui.platform.components.util.rememberVectorPainter import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenBasicDialog import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenLoadingDialog import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenMasterPasswordDialog @@ -70,14 +70,16 @@ fun DeleteAccountScreen( when (val dialog = state.dialog) { DeleteAccountState.DeleteAccountDialog.DeleteSuccess -> BitwardenBasicDialog( title = null, - message = stringResource(id = R.string.your_account_has_been_permanently_deleted), + message = stringResource( + id = BitwardenString.your_account_has_been_permanently_deleted, + ), onDismissRequest = remember(viewModel) { { viewModel.trySendAction(DeleteAccountAction.AccountDeletionConfirm) } }, ) is DeleteAccountState.DeleteAccountDialog.Error -> BitwardenBasicDialog( - title = stringResource(id = R.string.an_error_has_occurred), + title = stringResource(id = BitwardenString.an_error_has_occurred), message = dialog.message(), throwable = dialog.error, onDismissRequest = remember(viewModel) { @@ -86,7 +88,7 @@ fun DeleteAccountScreen( ) DeleteAccountState.DeleteAccountDialog.Loading -> BitwardenLoadingDialog( - text = stringResource(id = R.string.loading), + text = stringResource(id = BitwardenString.loading), ) null -> Unit @@ -99,10 +101,10 @@ fun DeleteAccountScreen( .nestedScroll(scrollBehavior.nestedScrollConnection), topBar = { BitwardenTopAppBar( - title = stringResource(id = R.string.delete_account), + title = stringResource(id = BitwardenString.delete_account), scrollBehavior = scrollBehavior, navigationIcon = rememberVectorPainter(id = BitwardenDrawable.ic_close), - navigationIconContentDescription = stringResource(id = R.string.close), + navigationIconContentDescription = stringResource(id = BitwardenString.close), onNavigationIconClick = remember(viewModel) { { viewModel.trySendAction(DeleteAccountAction.CloseClick) } }, @@ -117,16 +119,18 @@ fun DeleteAccountScreen( Spacer(modifier = Modifier.height(16.dp)) if (state.isUserManagedByOrganization) { WarningMessageCard( - headerText = stringResource(id = R.string.cannot_delete_your_account), + headerText = stringResource(id = BitwardenString.cannot_delete_your_account), subtitleText = stringResource( - id = R.string.cannot_delete_your_account_explanation, + id = BitwardenString.cannot_delete_your_account_explanation, ), modifier = Modifier.standardHorizontalMargin(), ) } else { WarningMessageCard( - headerText = stringResource(id = R.string.deleting_your_account_is_permanent), - subtitleText = stringResource(id = R.string.delete_account_explanation), + headerText = stringResource( + id = BitwardenString.deleting_your_account_is_permanent, + ), + subtitleText = stringResource(id = BitwardenString.delete_account_explanation), modifier = Modifier.standardHorizontalMargin(), ) Spacer(modifier = Modifier.height(24.dp)) @@ -149,7 +153,7 @@ fun DeleteAccountScreen( ) Spacer(modifier = Modifier.height(12.dp)) BitwardenOutlinedErrorButton( - label = stringResource(id = R.string.cancel), + label = stringResource(id = BitwardenString.cancel), onClick = remember(viewModel) { { viewModel.trySendAction(DeleteAccountAction.CancelClick) } }, @@ -183,7 +187,7 @@ private fun DeleteAccountButton( } BitwardenFilledErrorButton( - label = stringResource(id = R.string.delete_account), + label = stringResource(id = BitwardenString.delete_account), onClick = { if (isUnlockWithPasswordEnabled) { showPasswordDialog = true @@ -237,7 +241,7 @@ private fun WarningMessageCard( @Composable private fun WarningMessageCard_preview() { WarningMessageCard( - headerText = stringResource(id = R.string.cannot_delete_your_account), - subtitleText = stringResource(id = R.string.cannot_delete_your_account_explanation), + headerText = stringResource(id = BitwardenString.cannot_delete_your_account), + subtitleText = stringResource(id = BitwardenString.cannot_delete_your_account_explanation), ) } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/deleteaccount/DeleteAccountViewModel.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/deleteaccount/DeleteAccountViewModel.kt index cfaa8c589b..2ec7505a00 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/deleteaccount/DeleteAccountViewModel.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/deleteaccount/DeleteAccountViewModel.kt @@ -4,9 +4,9 @@ import android.os.Parcelable import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.viewModelScope import com.bitwarden.ui.platform.base.BaseViewModel +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.auth.repository.AuthRepository import com.x8bit.bitwarden.data.auth.repository.model.DeleteAccountResult import com.x8bit.bitwarden.data.auth.repository.model.ValidatePasswordResult @@ -97,7 +97,7 @@ class DeleteAccountViewModel @Inject constructor( sendAction( DeleteAccountAction.Internal.UpdateDialogState( DeleteAccountState.DeleteAccountDialog.Error( - message = R.string.invalid_master_password.asText(), + message = BitwardenString.invalid_master_password.asText(), ), ), ) @@ -139,7 +139,7 @@ class DeleteAccountViewModel @Inject constructor( updateDialogState( DeleteAccountState.DeleteAccountDialog.Error( message = result.message?.asText() - ?: R.string.generic_error_message.asText(), + ?: BitwardenString.generic_error_message.asText(), error = result.error, ), ) diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/deleteaccountconfirmation/DeleteAccountConfirmationScreen.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/deleteaccountconfirmation/DeleteAccountConfirmationScreen.kt index c367faace6..e86ccb5f04 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/deleteaccountconfirmation/DeleteAccountConfirmationScreen.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/deleteaccountconfirmation/DeleteAccountConfirmationScreen.kt @@ -33,8 +33,8 @@ import com.bitwarden.ui.platform.components.button.BitwardenOutlinedButton import com.bitwarden.ui.platform.components.model.CardStyle import com.bitwarden.ui.platform.components.util.rememberVectorPainter import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenBasicDialog import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenLoadingDialog import com.x8bit.bitwarden.ui.platform.components.field.BitwardenPasswordField @@ -131,7 +131,7 @@ private fun DeleteAccountConfirmationContent( .verticalScroll(rememberScrollState()), ) { Text( - text = stringResource(id = R.string.a_verification_code_was_sent_to_your_email), + text = stringResource(id = BitwardenString.a_verification_code_was_sent_to_your_email), textAlign = TextAlign.Start, style = BitwardenTheme.typography.bodyMedium, color = BitwardenTheme.colorScheme.text.primary, @@ -143,7 +143,7 @@ private fun DeleteAccountConfirmationContent( BitwardenPasswordField( value = state.verificationCode, onValueChange = onVerificationCodeTextChange, - label = stringResource(id = R.string.verification_code), + label = stringResource(id = BitwardenString.verification_code), keyboardType = KeyboardType.Number, imeAction = ImeAction.Done, autoFocus = true, @@ -154,7 +154,7 @@ private fun DeleteAccountConfirmationContent( ) Spacer(modifier = Modifier.height(12.dp)) Text( - text = stringResource(id = R.string.confirm_your_identity), + text = stringResource(id = BitwardenString.confirm_your_identity), textAlign = TextAlign.Start, style = BitwardenTheme.typography.bodyMedium, color = BitwardenTheme.colorScheme.text.primary, @@ -164,7 +164,7 @@ private fun DeleteAccountConfirmationContent( ) Spacer(modifier = Modifier.height(12.dp)) BitwardenFilledErrorButton( - label = stringResource(id = R.string.delete_account), + label = stringResource(id = BitwardenString.delete_account), onClick = onDeleteAccountClick, isEnabled = state.verificationCode.isNotBlank(), modifier = Modifier @@ -173,7 +173,7 @@ private fun DeleteAccountConfirmationContent( ) Spacer(modifier = Modifier.height(12.dp)) BitwardenOutlinedButton( - label = stringResource(id = R.string.resend_code), + label = stringResource(id = BitwardenString.resend_code), onClick = onResendCodeClick, modifier = Modifier .padding(horizontal = 16.dp) @@ -199,10 +199,10 @@ private fun DeleteAccountConfirmationScaffold( .nestedScroll(scrollBehavior.nestedScrollConnection), topBar = { BitwardenTopAppBar( - title = stringResource(id = R.string.verification_code), + title = stringResource(id = BitwardenString.verification_code), scrollBehavior = scrollBehavior, navigationIcon = rememberVectorPainter(id = BitwardenDrawable.ic_close), - navigationIconContentDescription = stringResource(id = R.string.close), + navigationIconContentDescription = stringResource(id = BitwardenString.close), onNavigationIconClick = onCloseClick, ) }, diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/deleteaccountconfirmation/DeleteAccountConfirmationViewModel.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/deleteaccountconfirmation/DeleteAccountConfirmationViewModel.kt index c4e4b63948..03e5e8a44e 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/deleteaccountconfirmation/DeleteAccountConfirmationViewModel.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/deleteaccountconfirmation/DeleteAccountConfirmationViewModel.kt @@ -4,9 +4,9 @@ import android.os.Parcelable import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.viewModelScope import com.bitwarden.ui.platform.base.BaseViewModel +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.auth.repository.AuthRepository import com.x8bit.bitwarden.data.auth.repository.model.DeleteAccountResult import com.x8bit.bitwarden.data.auth.repository.model.RequestOtpResult @@ -135,7 +135,7 @@ class DeleteAccountConfirmationViewModel @Inject constructor( dialog = when (val result = action.requestOtpResult) { is RequestOtpResult.Error -> { DeleteAccountConfirmationState.DeleteAccountConfirmationDialog.Error( - message = R.string.generic_error_message.asText(), + message = BitwardenString.generic_error_message.asText(), error = result.error, ) } @@ -156,7 +156,7 @@ class DeleteAccountConfirmationViewModel @Inject constructor( is DeleteAccountResult.Error -> { DeleteAccountConfirmationState.DeleteAccountConfirmationDialog.Error( message = result.message?.asText() - ?: R.string.generic_error_message.asText(), + ?: BitwardenString.generic_error_message.asText(), error = result.error, ) } @@ -190,7 +190,7 @@ data class DeleteAccountConfirmationState( */ @Parcelize data class DeleteSuccess( - val message: Text = R.string.your_account_has_been_permanently_deleted.asText(), + val message: Text = BitwardenString.your_account_has_been_permanently_deleted.asText(), ) : DeleteAccountConfirmationDialog() /** @@ -201,7 +201,7 @@ data class DeleteAccountConfirmationState( */ @Parcelize data class Error( - val title: Text = R.string.an_error_has_occurred.asText(), + val title: Text = BitwardenString.an_error_has_occurred.asText(), val message: Text, val error: Throwable? = null, ) : DeleteAccountConfirmationDialog() @@ -213,7 +213,7 @@ data class DeleteAccountConfirmationState( */ @Parcelize data class Loading( - val title: Text = R.string.loading.asText(), + val title: Text = BitwardenString.loading.asText(), ) : DeleteAccountConfirmationDialog() } } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/loginapproval/LoginApprovalScreen.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/loginapproval/LoginApprovalScreen.kt index 9120604694..fd1b574623 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/loginapproval/LoginApprovalScreen.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/loginapproval/LoginApprovalScreen.kt @@ -33,8 +33,8 @@ import com.bitwarden.ui.platform.components.button.BitwardenFilledButton import com.bitwarden.ui.platform.components.button.BitwardenOutlinedButton import com.bitwarden.ui.platform.components.util.rememberVectorPainter import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.platform.components.content.BitwardenErrorContent import com.x8bit.bitwarden.ui.platform.components.content.BitwardenLoadingContent import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenBasicDialog @@ -87,10 +87,10 @@ fun LoginApprovalScreen( .nestedScroll(scrollBehavior.nestedScrollConnection), topBar = { BitwardenTopAppBar( - title = stringResource(id = R.string.log_in_requested), + title = stringResource(id = BitwardenString.log_in_requested), scrollBehavior = scrollBehavior, navigationIcon = rememberVectorPainter(id = BitwardenDrawable.ic_close), - navigationIconContentDescription = stringResource(id = R.string.close), + navigationIconContentDescription = stringResource(id = BitwardenString.close), onNavigationIconClick = remember(viewModel) { { viewModel.trySendAction(LoginApprovalAction.CloseClick) } }, @@ -113,7 +113,7 @@ fun LoginApprovalScreen( is LoginApprovalState.ViewState.Error -> { BitwardenErrorContent( - message = stringResource(id = R.string.generic_error_message), + message = stringResource(id = BitwardenString.generic_error_message), modifier = Modifier.fillMaxSize(), ) } @@ -141,7 +141,7 @@ private fun LoginApprovalContent( ) { Spacer(modifier = Modifier.height(8.dp)) Text( - text = stringResource(id = R.string.are_you_trying_to_log_in), + text = stringResource(id = BitwardenString.are_you_trying_to_log_in), style = BitwardenTheme.typography.headlineMedium, color = BitwardenTheme.colorScheme.text.primary, modifier = Modifier @@ -151,7 +151,7 @@ private fun LoginApprovalContent( Spacer(modifier = Modifier.height(24.dp)) Text( text = stringResource( - id = R.string.log_in_attempt_by_x_on_y, + id = BitwardenString.log_in_attempt_by_x_on_y, state.email, state.domainUrl, ), @@ -165,7 +165,7 @@ private fun LoginApprovalContent( Spacer(modifier = Modifier.height(24.dp)) Text( - text = stringResource(id = R.string.fingerprint_phrase), + text = stringResource(id = BitwardenString.fingerprint_phrase), style = BitwardenTheme.typography.titleLarge, color = BitwardenTheme.colorScheme.text.primary, modifier = Modifier @@ -188,25 +188,25 @@ private fun LoginApprovalContent( Spacer(modifier = Modifier.height(16.dp)) LoginApprovalInfoColumn( - label = stringResource(id = R.string.device_type), + label = stringResource(id = BitwardenString.device_type), value = state.deviceType, valueTestTag = "DeviceTypeValueLabel", ) LoginApprovalInfoColumn( - label = stringResource(id = R.string.ip_address), + label = stringResource(id = BitwardenString.ip_address), value = state.ipAddress, ) LoginApprovalInfoColumn( - label = stringResource(id = R.string.time), + label = stringResource(id = BitwardenString.time), value = state.time, ) Spacer(modifier = Modifier.height(24.dp)) BitwardenFilledButton( - label = stringResource(id = R.string.confirm_log_in), + label = stringResource(id = BitwardenString.confirm_log_in), onClick = onConfirmLoginClick, modifier = Modifier .fillMaxWidth() @@ -217,7 +217,7 @@ private fun LoginApprovalContent( Spacer(modifier = Modifier.height(8.dp)) BitwardenOutlinedButton( - label = stringResource(id = R.string.deny_log_in), + label = stringResource(id = BitwardenString.deny_log_in), onClick = onDeclineLoginClick, modifier = Modifier .fillMaxWidth() @@ -277,10 +277,10 @@ private fun LoginApprovalDialogs( ) { when (state) { is LoginApprovalState.DialogState.ChangeAccount -> BitwardenTwoButtonDialog( - title = stringResource(id = R.string.log_in_requested), + title = stringResource(id = BitwardenString.log_in_requested), message = state.message(), - confirmButtonText = stringResource(id = R.string.okay), - dismissButtonText = stringResource(id = R.string.cancel), + confirmButtonText = stringResource(id = BitwardenString.okay), + dismissButtonText = stringResource(id = BitwardenString.cancel), onConfirmClick = onConfirmChangeAccount, onDismissClick = onDismissChangeAccount, onDismissRequest = onDismissChangeAccount, diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/loginapproval/LoginApprovalViewModel.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/loginapproval/LoginApprovalViewModel.kt index 2486f6b9dd..2f5e0b9ac3 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/loginapproval/LoginApprovalViewModel.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/loginapproval/LoginApprovalViewModel.kt @@ -9,9 +9,9 @@ import androidx.lifecycle.viewModelScope import com.bitwarden.core.data.manager.toast.ToastManager import com.bitwarden.core.data.util.toFormattedDateTimeStyle import com.bitwarden.ui.platform.base.BaseViewModel +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.auth.manager.model.AuthRequestResult import com.x8bit.bitwarden.data.auth.manager.model.AuthRequestUpdatesResult import com.x8bit.bitwarden.data.auth.repository.AuthRepository @@ -71,7 +71,7 @@ class LoginApprovalViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = LoginApprovalState.DialogState.ChangeAccount( - message = R.string + message = BitwardenString .login_attempt_from_x_do_you_want_to_switch_to_this_account .asText( authRepository @@ -189,15 +189,15 @@ class LoginApprovalViewModel @Inject constructor( ) { when (val result = action.result) { is AuthRequestResult.Success -> { - sendClosingEvent(messageId = R.string.login_approved) + sendClosingEvent(messageId = BitwardenString.login_approved) } is AuthRequestResult.Error -> { mutableStateFlow.update { it.copy( dialogState = LoginApprovalState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.generic_error_message.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.generic_error_message.asText(), error = result.error, ), ) @@ -252,15 +252,15 @@ class LoginApprovalViewModel @Inject constructor( ) { when (val result = action.result) { is AuthRequestResult.Success -> { - sendClosingEvent(messageId = R.string.log_in_denied) + sendClosingEvent(messageId = BitwardenString.log_in_denied) } is AuthRequestResult.Error -> { mutableStateFlow.update { it.copy( dialogState = LoginApprovalState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.generic_error_message.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.generic_error_message.asText(), error = result.error, ), ) diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/pendingrequests/PendingRequestsScreen.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/pendingrequests/PendingRequestsScreen.kt index 7e65679067..030f6d548c 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/pendingrequests/PendingRequestsScreen.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/pendingrequests/PendingRequestsScreen.kt @@ -52,8 +52,8 @@ import com.bitwarden.ui.platform.components.button.BitwardenOutlinedButton import com.bitwarden.ui.platform.components.model.CardStyle import com.bitwarden.ui.platform.components.util.rememberVectorPainter import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.platform.util.isFdroid import com.x8bit.bitwarden.ui.platform.components.bottomsheet.BitwardenModalBottomSheet import com.x8bit.bitwarden.ui.platform.components.content.BitwardenErrorContent @@ -117,7 +117,7 @@ fun PendingRequestsScreen( ) BitwardenModalBottomSheet( showBottomSheet = !hideBottomSheet, - sheetTitle = stringResource(R.string.enable_notifications), + sheetTitle = stringResource(BitwardenString.enable_notifications), onDismiss = remember(viewModel) { { viewModel.trySendAction(PendingRequestsAction.HideBottomSheet) } }, @@ -137,10 +137,10 @@ fun PendingRequestsScreen( .nestedScroll(scrollBehavior.nestedScrollConnection), topBar = { BitwardenTopAppBar( - title = stringResource(id = R.string.pending_log_in_requests), + title = stringResource(id = BitwardenString.pending_log_in_requests), scrollBehavior = scrollBehavior, navigationIcon = rememberVectorPainter(id = BitwardenDrawable.ic_close), - navigationIconContentDescription = stringResource(id = R.string.close), + navigationIconContentDescription = stringResource(id = BitwardenString.close), onNavigationIconClick = remember(viewModel) { { viewModel.trySendAction(PendingRequestsAction.CloseClick) } }, @@ -178,7 +178,7 @@ fun PendingRequestsScreen( ) PendingRequestsState.ViewState.Error -> BitwardenErrorContent( - message = stringResource(R.string.generic_error_message), + message = stringResource(BitwardenString.generic_error_message), modifier = Modifier.fillMaxSize(), ) @@ -206,12 +206,13 @@ private fun PendingRequestsContent( if (shouldShowDeclineAllRequestsConfirm) { BitwardenTwoButtonDialog( - title = stringResource(R.string.decline_all_requests), + title = stringResource(BitwardenString.decline_all_requests), message = stringResource( - id = R.string.are_you_sure_you_want_to_decline_all_pending_log_in_requests, + id = BitwardenString + .are_you_sure_you_want_to_decline_all_pending_log_in_requests, ), - confirmButtonText = stringResource(R.string.yes), - dismissButtonText = stringResource(id = R.string.cancel), + confirmButtonText = stringResource(BitwardenString.yes), + dismissButtonText = stringResource(id = BitwardenString.cancel), onConfirmClick = { onDeclineAllRequestsConfirm() shouldShowDeclineAllRequestsConfirm = false @@ -247,7 +248,7 @@ private fun PendingRequestsContent( Spacer(modifier = Modifier.height(height = 24.dp)) BitwardenOutlinedButton( - label = stringResource(id = R.string.decline_all_requests), + label = stringResource(id = BitwardenString.decline_all_requests), icon = rememberVectorPainter(id = BitwardenDrawable.ic_trash), onClick = { shouldShowDeclineAllRequestsConfirm = true }, modifier = Modifier @@ -284,7 +285,7 @@ private fun PendingRequestItem( horizontalAlignment = Alignment.Start, ) { Text( - text = stringResource(id = R.string.fingerprint_phrase), + text = stringResource(id = BitwardenString.fingerprint_phrase), style = BitwardenTheme.typography.labelMedium, color = BitwardenTheme.colorScheme.text.primary, textAlign = TextAlign.Start, @@ -352,7 +353,7 @@ private fun PendingRequestsEmpty( Spacer(modifier = Modifier.height(24.dp)) Text( - text = stringResource(id = R.string.no_pending_requests), + text = stringResource(id = BitwardenString.no_pending_requests), style = BitwardenTheme.typography.bodyMedium, color = BitwardenTheme.colorScheme.text.primary, textAlign = TextAlign.Center, @@ -388,7 +389,7 @@ private fun PendingRequestsBottomSheetContent( ) Spacer(modifier = Modifier.height(height = 24.dp)) Text( - text = stringResource(id = R.string.log_in_quickly_and_easily_across_devices), + text = stringResource(id = BitwardenString.log_in_quickly_and_easily_across_devices), style = BitwardenTheme.typography.titleMedium, color = BitwardenTheme.colorScheme.text.primary, textAlign = TextAlign.Center, @@ -400,7 +401,7 @@ private fun PendingRequestsBottomSheetContent( @Suppress("MaxLineLength") Text( text = stringResource( - id = R.string.bitwarden_can_notify_you_each_time_you_receive_a_new_login_request_from_another_device, + id = BitwardenString.bitwarden_can_notify_you_each_time_you_receive_a_new_login_request_from_another_device, ), style = BitwardenTheme.typography.bodyMedium, color = BitwardenTheme.colorScheme.text.primary, @@ -411,7 +412,7 @@ private fun PendingRequestsBottomSheetContent( ) Spacer(modifier = Modifier.height(height = 24.dp)) BitwardenFilledButton( - label = stringResource(id = R.string.enable_notifications), + label = stringResource(id = BitwardenString.enable_notifications), onClick = { @SuppressLint("InlinedApi") notificationPermissionLauncher.launch(Manifest.permission.POST_NOTIFICATIONS) @@ -422,7 +423,7 @@ private fun PendingRequestsBottomSheetContent( ) Spacer(modifier = Modifier.height(height = 12.dp)) BitwardenOutlinedButton( - label = stringResource(id = R.string.skip_for_now), + label = stringResource(id = BitwardenString.skip_for_now), onClick = onDismiss, modifier = Modifier .fillMaxWidth() diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/appearance/AppearanceScreen.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/appearance/AppearanceScreen.kt index 9334b61e21..b07e27c3f1 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/appearance/AppearanceScreen.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/appearance/AppearanceScreen.kt @@ -33,7 +33,7 @@ import com.bitwarden.ui.platform.components.toggle.BitwardenSwitch import com.bitwarden.ui.platform.components.util.rememberVectorPainter import com.bitwarden.ui.platform.feature.settings.appearance.model.AppTheme import com.bitwarden.ui.platform.resource.BitwardenDrawable -import com.x8bit.bitwarden.R +import com.bitwarden.ui.platform.resource.BitwardenString import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenTwoButtonDialog import com.x8bit.bitwarden.ui.platform.components.dropdown.BitwardenMultiSelectButton import com.x8bit.bitwarden.ui.platform.components.scaffold.BitwardenScaffold @@ -81,10 +81,10 @@ fun AppearanceScreen( .nestedScroll(scrollBehavior.nestedScrollConnection), topBar = { BitwardenTopAppBar( - title = stringResource(id = R.string.appearance), + title = stringResource(id = BitwardenString.appearance), scrollBehavior = scrollBehavior, navigationIcon = rememberVectorPainter(id = BitwardenDrawable.ic_back), - navigationIconContentDescription = stringResource(id = R.string.back), + navigationIconContentDescription = stringResource(id = BitwardenString.back), onNavigationIconClick = remember(viewModel) { { viewModel.trySendAction(AppearanceAction.BackClick) } }, @@ -121,7 +121,7 @@ fun AppearanceScreen( Spacer(modifier = Modifier.height(height = 8.dp)) if (state.isDynamicColorsSupported) { BitwardenSwitch( - label = stringResource(id = R.string.use_dynamic_colors), + label = stringResource(id = BitwardenString.use_dynamic_colors), isChecked = state.isDynamicColorsEnabled, onCheckedChange = remember(viewModel) { { viewModel.trySendAction(AppearanceAction.DynamicColorsToggle(it)) } @@ -135,8 +135,10 @@ fun AppearanceScreen( Spacer(modifier = Modifier.height(height = 8.dp)) } BitwardenSwitch( - label = stringResource(id = R.string.show_website_icons), - supportingText = stringResource(id = R.string.show_website_icons_description), + label = stringResource(id = BitwardenString.show_website_icons), + supportingText = stringResource( + id = BitwardenString.show_website_icons_description, + ), isChecked = state.showWebsiteIcons, onCheckedChange = remember(viewModel) { { viewModel.trySendAction(AppearanceAction.ShowWebsiteIconsToggle(it)) } @@ -145,7 +147,9 @@ fun AppearanceScreen( onClick = remember(viewModel) { { viewModel.trySendAction(AppearanceAction.ShowWebsiteIconsTooltipClick) } }, - contentDescription = stringResource(id = R.string.show_website_icons_help), + contentDescription = stringResource( + id = BitwardenString.show_website_icons_help, + ), ), cardStyle = CardStyle.Full, modifier = Modifier @@ -168,12 +172,12 @@ private fun AppearanceDialogs( when (dialogState) { AppearanceState.DialogState.EnableDynamicColors -> { BitwardenTwoButtonDialog( - title = stringResource(id = R.string.use_dynamic_colors_question), + title = stringResource(id = BitwardenString.use_dynamic_colors_question), message = stringResource( - id = R.string.dynamic_colors_may_not_adhere_to_accessibility_guidelines, + id = BitwardenString.dynamic_colors_may_not_adhere_to_accessibility_guidelines, ), - confirmButtonText = stringResource(R.string.okay), - dismissButtonText = stringResource(R.string.cancel), + confirmButtonText = stringResource(BitwardenString.okay), + dismissButtonText = stringResource(BitwardenString.cancel), onConfirmClick = onConfirmEnableDynamicColorsClick, onDismissClick = onDismissDialog, onDismissRequest = onDismissDialog, @@ -192,7 +196,7 @@ private fun LanguageSelectionRow( resources: Resources = LocalContext.current.resources, ) { BitwardenMultiSelectButton( - label = stringResource(id = R.string.language), + label = stringResource(id = BitwardenString.language), options = AppLanguage.entries.map { it.text() }.toImmutableList(), selectedOption = currentSelection.text(), onOptionSelected = { selectedLanguage -> @@ -213,7 +217,7 @@ private fun ThemeSelectionRow( resources: Resources = LocalContext.current.resources, ) { BitwardenMultiSelectButton( - label = stringResource(id = R.string.theme), + label = stringResource(id = BitwardenString.theme), options = AppTheme.entries.map { it.displayLabel() }.toImmutableList(), selectedOption = currentSelection.displayLabel(), onOptionSelected = { selectedTheme -> @@ -221,7 +225,7 @@ private fun ThemeSelectionRow( AppTheme.entries.first { selectedTheme == it.displayLabel.toString(resources) }, ) }, - supportingText = stringResource(id = R.string.theme_description), + supportingText = stringResource(id = BitwardenString.theme_description), cardStyle = CardStyle.Full, modifier = modifier, ) diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/appearance/model/AppLanguage.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/appearance/model/AppLanguage.kt index 4f6e9e52e4..3aa49e6b1f 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/appearance/model/AppLanguage.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/appearance/model/AppLanguage.kt @@ -1,8 +1,8 @@ package com.x8bit.bitwarden.ui.platform.feature.settings.appearance.model +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R /** * Represents the languages supported by the app. @@ -13,7 +13,7 @@ enum class AppLanguage( ) { DEFAULT( localeName = null, - text = R.string.default_system.asText(), + text = BitwardenString.default_system.asText(), ), AFRIKAANS( localeName = "af", diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/autofill/AutoFillScreen.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/autofill/AutoFillScreen.kt index cde655ae9d..15e9fa8b80 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/autofill/AutoFillScreen.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/autofill/AutoFillScreen.kt @@ -37,7 +37,7 @@ import com.bitwarden.ui.platform.components.model.TooltipData import com.bitwarden.ui.platform.components.toggle.BitwardenSwitch import com.bitwarden.ui.platform.components.util.rememberVectorPainter import com.bitwarden.ui.platform.resource.BitwardenDrawable -import com.x8bit.bitwarden.R +import com.bitwarden.ui.platform.resource.BitwardenString import com.x8bit.bitwarden.data.platform.repository.model.UriMatchType import com.x8bit.bitwarden.ui.platform.components.card.BitwardenActionCard import com.x8bit.bitwarden.ui.platform.components.card.actionCardExitAnimation @@ -115,7 +115,7 @@ fun AutoFillScreen( if (shouldShowAutofillFallbackDialog) { BitwardenBasicDialog( title = null, - message = stringResource(id = R.string.bitwarden_autofill_go_to_settings), + message = stringResource(id = BitwardenString.bitwarden_autofill_go_to_settings), onDismissRequest = { shouldShowAutofillFallbackDialog = false }, ) } @@ -128,10 +128,10 @@ fun AutoFillScreen( .nestedScroll(scrollBehavior.nestedScrollConnection), topBar = { BitwardenTopAppBar( - title = stringResource(id = R.string.autofill), + title = stringResource(id = BitwardenString.autofill), scrollBehavior = scrollBehavior, navigationIcon = rememberVectorPainter(id = BitwardenDrawable.ic_back), - navigationIconContentDescription = stringResource(id = R.string.back), + navigationIconContentDescription = stringResource(id = BitwardenString.back), onNavigationIconClick = remember(viewModel) { { viewModel.trySendAction(AutoFillAction.BackClick) } }, @@ -163,8 +163,8 @@ private fun AutoFillScreenContent( exit = actionCardExitAnimation(), ) { BitwardenActionCard( - cardTitle = stringResource(R.string.turn_on_autofill), - actionText = stringResource(R.string.get_started), + cardTitle = stringResource(BitwardenString.turn_on_autofill), + actionText = stringResource(BitwardenString.get_started), onActionClick = autoFillHandlers.onAutofillActionCardClick, onDismissClick = autoFillHandlers.onAutofillActionCardDismissClick, leadingContent = { NotificationBadge(notificationCount = 1) }, @@ -174,7 +174,7 @@ private fun AutoFillScreenContent( ) } BitwardenListHeaderText( - label = stringResource(id = R.string.autofill), + label = stringResource(id = BitwardenString.autofill), modifier = Modifier .fillMaxWidth() .standardHorizontalMargin() @@ -182,8 +182,10 @@ private fun AutoFillScreenContent( ) Spacer(modifier = Modifier.height(height = 8.dp)) BitwardenSwitch( - label = stringResource(id = R.string.autofill_services), - supportingText = stringResource(id = R.string.autofill_services_explanation_long), + label = stringResource(id = BitwardenString.autofill_services), + supportingText = stringResource( + id = BitwardenString.autofill_services_explanation_long, + ), isChecked = state.isAutoFillServicesEnabled, onCheckedChange = autoFillHandlers.onAutofillServicesClick, cardStyle = CardStyle.Full, @@ -220,14 +222,14 @@ private fun AutoFillScreenContent( if (state.showPasskeyManagementRow) { BitwardenExternalLinkRow( - text = stringResource(id = R.string.passkey_management), + text = stringResource(id = BitwardenString.passkey_management), description = stringResource( - id = R.string.passkey_management_explanation_long, + id = BitwardenString.passkey_management_explanation_long, ), onConfirmClick = autoFillHandlers.onPasskeyManagementClick, - dialogTitle = stringResource(id = R.string.continue_to_device_settings), + dialogTitle = stringResource(id = BitwardenString.continue_to_device_settings), dialogMessage = stringResource( - id = R.string.set_bitwarden_as_passkey_manager_description, + id = BitwardenString.set_bitwarden_as_passkey_manager_description, ), withDivider = false, cardStyle = if (state.isUserManagedPrivilegedAppsEnabled) { @@ -241,11 +243,11 @@ private fun AutoFillScreenContent( ) if (state.isUserManagedPrivilegedAppsEnabled) { BitwardenTextRow( - text = stringResource(R.string.privileged_apps), + text = stringResource(BitwardenString.privileged_apps), onClick = autoFillHandlers.onPrivilegedAppsClick, tooltip = TooltipData( contentDescription = - stringResource(R.string.learn_more_about_privileged_apps), + stringResource(BitwardenString.learn_more_about_privileged_apps), onClick = autoFillHandlers.onPrivilegedAppsHelpLinkClick, ), cardStyle = CardStyle.Bottom, @@ -265,7 +267,7 @@ private fun AutoFillScreenContent( ) Spacer(modifier = Modifier.height(16.dp)) BitwardenListHeaderText( - label = stringResource(id = R.string.additional_options), + label = stringResource(id = BitwardenString.additional_options), modifier = Modifier .fillMaxWidth() .standardHorizontalMargin() @@ -273,8 +275,10 @@ private fun AutoFillScreenContent( ) Spacer(modifier = Modifier.height(8.dp)) BitwardenSwitch( - label = stringResource(id = R.string.copy_totp_automatically), - supportingText = stringResource(id = R.string.copy_totp_automatically_description), + label = stringResource(id = BitwardenString.copy_totp_automatically), + supportingText = stringResource( + id = BitwardenString.copy_totp_automatically_description, + ), isChecked = state.isCopyTotpAutomaticallyEnabled, onCheckedChange = autoFillHandlers.onCopyTotpAutomaticallyClick, cardStyle = CardStyle.Full, @@ -285,8 +289,8 @@ private fun AutoFillScreenContent( ) Spacer(modifier = Modifier.height(8.dp)) BitwardenSwitch( - label = stringResource(id = R.string.ask_to_add_login), - supportingText = stringResource(id = R.string.ask_to_add_login_description), + label = stringResource(id = BitwardenString.ask_to_add_login), + supportingText = stringResource(id = BitwardenString.ask_to_add_login_description), isChecked = state.isAskToAddLoginEnabled, onCheckedChange = autoFillHandlers.onAskToAddLoginClick, cardStyle = CardStyle.Full, @@ -306,9 +310,9 @@ private fun AutoFillScreenContent( ) Spacer(modifier = Modifier.height(8.dp)) BitwardenTextRow( - text = stringResource(id = R.string.block_auto_fill), + text = stringResource(id = BitwardenString.block_auto_fill), description = stringResource( - id = R.string.auto_fill_will_not_be_offered_for_these_ur_is, + id = BitwardenString.auto_fill_will_not_be_offered_for_these_ur_is, ), onClick = autoFillHandlers.onBlockAutoFillClick, cardStyle = CardStyle.Full, @@ -329,8 +333,8 @@ private fun FillStyleSelector( resources: Resources = LocalContext.current.resources, ) { BitwardenMultiSelectButton( - label = stringResource(id = R.string.display_autofill_suggestions), - supportingText = stringResource(id = R.string.use_inline_autofill_explanation_long), + label = stringResource(id = BitwardenString.display_autofill_suggestions), + supportingText = stringResource(id = BitwardenString.use_inline_autofill_explanation_long), options = AutofillStyle.entries.map { it.label() }.toImmutableList(), selectedOption = selectedStyle.label(), onOptionSelected = { @@ -349,8 +353,8 @@ private fun AccessibilityAutofillSwitch( ) { var shouldShowDialog by rememberSaveable { mutableStateOf(value = false) } BitwardenSwitch( - label = stringResource(id = R.string.accessibility), - supportingText = stringResource(id = R.string.accessibility_description5), + label = stringResource(id = BitwardenString.accessibility), + supportingText = stringResource(id = BitwardenString.accessibility_description5), isChecked = isAccessibilityAutoFillEnabled, onCheckedChange = { if (isAccessibilityAutoFillEnabled) { @@ -365,10 +369,10 @@ private fun AccessibilityAutofillSwitch( if (shouldShowDialog) { BitwardenTwoButtonDialog( - title = stringResource(id = R.string.accessibility_service_disclosure), - message = stringResource(id = R.string.accessibility_disclosure_text), - confirmButtonText = stringResource(id = R.string.accept), - dismissButtonText = stringResource(id = R.string.decline), + title = stringResource(id = BitwardenString.accessibility_service_disclosure), + message = stringResource(id = BitwardenString.accessibility_disclosure_text), + confirmButtonText = stringResource(id = BitwardenString.accept), + dismissButtonText = stringResource(id = BitwardenString.decline), onConfirmClick = { onCheckedChange() shouldShowDialog = false @@ -387,7 +391,7 @@ private fun DefaultUriMatchTypeRow( resources: Resources = LocalContext.current.resources, ) { BitwardenMultiSelectButton( - label = stringResource(id = R.string.default_uri_match_detection), + label = stringResource(id = BitwardenString.default_uri_match_detection), options = UriMatchType.entries.map { it.displayLabel() }.toImmutableList(), selectedOption = selectedUriMatchType.displayLabel(), onOptionSelected = { selectedOption -> @@ -397,7 +401,9 @@ private fun DefaultUriMatchTypeRow( .first { it.displayLabel.toString(resources) == selectedOption }, ) }, - supportingText = stringResource(id = R.string.default_uri_match_detection_description), + supportingText = stringResource( + id = BitwardenString.default_uri_match_detection_description, + ), cardStyle = CardStyle.Full, modifier = modifier, ) diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/autofill/AutoFillViewModel.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/autofill/AutoFillViewModel.kt index 3afad18210..bb03731d95 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/autofill/AutoFillViewModel.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/autofill/AutoFillViewModel.kt @@ -7,9 +7,9 @@ import androidx.lifecycle.viewModelScope import com.bitwarden.core.util.isBuildVersionAtLeast import com.bitwarden.core.util.persistentListOfNotNull import com.bitwarden.ui.platform.base.BaseViewModel +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.auth.repository.AuthRepository import com.x8bit.bitwarden.data.autofill.manager.browser.BrowserThirdPartyAutofillEnabledManager import com.x8bit.bitwarden.data.autofill.model.browser.BrowserPackage @@ -315,12 +315,12 @@ enum class AutofillStyle(val label: Text) { /** * Displays the autofill data in the keyboard. */ - INLINE(label = R.string.autofill_suggestions_inline.asText()), + INLINE(label = BitwardenString.autofill_suggestions_inline.asText()), /** * Displays the autofill data as a popup attached to the field you are filling. */ - POPUP(label = R.string.autofill_suggestions_popup.asText()), + POPUP(label = BitwardenString.autofill_suggestions_popup.asText()), } @Suppress("MaxLineLength") diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/autofill/blockautofill/AddEditBlockedUriDialog.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/autofill/blockautofill/AddEditBlockedUriDialog.kt index 36e314ab78..e3402b105c 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/autofill/blockautofill/AddEditBlockedUriDialog.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/autofill/blockautofill/AddEditBlockedUriDialog.kt @@ -25,8 +25,8 @@ import com.bitwarden.ui.platform.components.button.BitwardenFilledButton import com.bitwarden.ui.platform.components.button.BitwardenTextButton import com.bitwarden.ui.platform.components.divider.BitwardenHorizontalDivider import com.bitwarden.ui.platform.components.model.CardStyle +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.platform.components.field.BitwardenTextField import com.x8bit.bitwarden.ui.platform.components.util.maxDialogHeight @@ -66,7 +66,7 @@ fun AddEditBlockedUriDialog( modifier = Modifier .padding(top = 24.dp, start = 24.dp, end = 24.dp) .fillMaxWidth(), - text = stringResource(id = R.string.new_uri), + text = stringResource(id = BitwardenString.new_uri), color = BitwardenTheme.colorScheme.text.primary, style = BitwardenTheme.typography.headlineSmall, ) @@ -82,10 +82,10 @@ fun AddEditBlockedUriDialog( .verticalScroll(scrollState), ) { BitwardenTextField( - label = stringResource(id = R.string.enter_uri), + label = stringResource(id = BitwardenString.enter_uri), isError = errorMessage != null, supportingText = errorMessage ?: stringResource( - id = R.string.format_x_separate_multiple_ur_is_with_a_comma, + id = BitwardenString.format_x_separate_multiple_ur_is_with_a_comma, "http://domain.com", ), value = uri, @@ -106,18 +106,18 @@ fun AddEditBlockedUriDialog( ) { if (isEdit && onDeleteClick != null) { BitwardenTextButton( - label = stringResource(id = R.string.remove), + label = stringResource(id = BitwardenString.remove), onClick = onDeleteClick, ) } BitwardenTextButton( - label = stringResource(id = R.string.cancel), + label = stringResource(id = BitwardenString.cancel), onClick = onCancelClick, ) BitwardenFilledButton( - label = stringResource(id = R.string.save), + label = stringResource(id = BitwardenString.save), onClick = { onSaveClick(uri) }, ) } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/autofill/blockautofill/BlockAutoFillScreen.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/autofill/blockautofill/BlockAutoFillScreen.kt index 276d8bdb6a..883ab52ead 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/autofill/blockautofill/BlockAutoFillScreen.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/autofill/blockautofill/BlockAutoFillScreen.kt @@ -44,8 +44,8 @@ import com.bitwarden.ui.platform.components.button.BitwardenOutlinedButton import com.bitwarden.ui.platform.components.fab.BitwardenFloatingActionButton import com.bitwarden.ui.platform.components.util.rememberVectorPainter import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.platform.components.scaffold.BitwardenScaffold /** @@ -89,10 +89,10 @@ fun BlockAutoFillScreen( .nestedScroll(scrollBehavior.nestedScrollConnection), topBar = { BitwardenTopAppBar( - title = stringResource(id = R.string.block_auto_fill), + title = stringResource(id = BitwardenString.block_auto_fill), scrollBehavior = scrollBehavior, navigationIcon = rememberVectorPainter(id = BitwardenDrawable.ic_back), - navigationIconContentDescription = stringResource(id = R.string.back), + navigationIconContentDescription = stringResource(id = BitwardenString.back), onNavigationIconClick = remember(viewModel) { { viewModel.trySendAction(BlockAutoFillAction.BackClick) } }, @@ -109,7 +109,7 @@ fun BlockAutoFillScreen( { viewModel.trySendAction(BlockAutoFillAction.AddUriClick) } }, painter = rememberVectorPainter(id = BitwardenDrawable.ic_plus_large), - contentDescription = stringResource(id = R.string.add_item), + contentDescription = stringResource(id = BitwardenString.add_item), modifier = Modifier.testTag(tag = "AddItemButton"), ) } @@ -130,7 +130,8 @@ fun BlockAutoFillScreen( ) { Text( text = stringResource( - id = R.string.auto_fill_will_not_be_offered_for_these_ur_is, + id = BitwardenString + .auto_fill_will_not_be_offered_for_these_ur_is, ), color = BitwardenTheme.colorScheme.text.primary, style = BitwardenTheme.typography.bodyMedium, @@ -235,7 +236,9 @@ private fun BlockAutoFillNoItems( modifier = Modifier .fillMaxWidth() .padding(horizontal = 16.dp), - text = stringResource(id = R.string.auto_fill_will_not_be_offered_for_these_ur_is), + text = stringResource( + id = BitwardenString.auto_fill_will_not_be_offered_for_these_ur_is, + ), style = BitwardenTheme.typography.bodyMedium, ) @@ -245,7 +248,7 @@ private fun BlockAutoFillNoItems( modifier = Modifier .fillMaxWidth() .padding(horizontal = 16.dp), - label = stringResource(id = R.string.new_blocked_uri), + label = stringResource(id = BitwardenString.new_blocked_uri), onClick = addItemClickAction, ) } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/autofill/blockautofill/util/StringExtensions.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/autofill/blockautofill/util/StringExtensions.kt index 7079aac487..1cbbcf680c 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/autofill/blockautofill/util/StringExtensions.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/autofill/blockautofill/util/StringExtensions.kt @@ -1,8 +1,8 @@ package com.x8bit.bitwarden.ui.platform.feature.settings.autofill.blockautofill.util +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R /** * Validates the URI based on specific criteria. @@ -23,17 +23,17 @@ fun String.validateUri(existingUris: List): Text? { !startsWith("http://") && !startsWith("androidapp://") ) { - return R.string.invalid_format_use_https_http_or_android_app.asText() + return BitwardenString.invalid_format_use_https_http_or_android_app.asText() } // Check for specific invalid patterns. if (!isValidPattern()) { - return R.string.invalid_uri.asText() + return BitwardenString.invalid_uri.asText() } // Check for duplicates. if (this in existingUris) { - return R.string.the_urix_is_already_blocked.asText(this) + return BitwardenString.the_urix_is_already_blocked.asText(this) } // Return null to indicate no errors. diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/autofill/browser/BrowserAutofillSettingsCard.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/autofill/browser/BrowserAutofillSettingsCard.kt index c3e5f7f018..2bdf17ba88 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/autofill/browser/BrowserAutofillSettingsCard.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/autofill/browser/BrowserAutofillSettingsCard.kt @@ -12,10 +12,10 @@ import androidx.compose.ui.unit.dp import com.bitwarden.ui.platform.base.util.cardStyle import com.bitwarden.ui.platform.base.util.standardHorizontalMargin import com.bitwarden.ui.platform.components.model.CardStyle -import com.bitwarden.ui.platform.theme.BitwardenTheme -import com.x8bit.bitwarden.R -import com.x8bit.bitwarden.data.autofill.model.browser.BrowserPackage import com.bitwarden.ui.platform.components.toggle.BitwardenSwitch +import com.bitwarden.ui.platform.resource.BitwardenString +import com.bitwarden.ui.platform.theme.BitwardenTheme +import com.x8bit.bitwarden.data.autofill.model.browser.BrowserPackage import com.x8bit.bitwarden.ui.platform.feature.settings.autofill.browser.model.BrowserAutofillSettingsOption import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.persistentListOf @@ -62,7 +62,8 @@ fun BrowserAutofillSettingsCard( } Text( text = stringResource( - id = R.string.improves_login_filling_for_supported_websites_on_selected_browsers, + id = BitwardenString + .improves_login_filling_for_supported_websites_on_selected_browsers, ), style = BitwardenTheme.typography.bodyMedium, color = BitwardenTheme.colorScheme.text.secondary, diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/autofill/browser/model/BrowserAutofillSettingsOption.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/autofill/browser/model/BrowserAutofillSettingsOption.kt index 9c6c148516..dde15bfb39 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/autofill/browser/model/BrowserAutofillSettingsOption.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/autofill/browser/model/BrowserAutofillSettingsOption.kt @@ -1,9 +1,9 @@ package com.x8bit.bitwarden.ui.platform.feature.settings.autofill.browser.model import android.os.Parcelable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.autofill.model.browser.BrowserPackage import kotlinx.parcelize.Parcelize @@ -27,7 +27,7 @@ sealed class BrowserAutofillSettingsOption(val isEnabled: Boolean) : Parcelable override val browserPackage: BrowserPackage get() = BrowserPackage.BRAVE_RELEASE override val optionText: Text - get() = R.string.use_brave_autofill_integration.asText() + get() = BitwardenString.use_brave_autofill_integration.asText() } /** @@ -40,7 +40,7 @@ sealed class BrowserAutofillSettingsOption(val isEnabled: Boolean) : Parcelable override val browserPackage: BrowserPackage get() = BrowserPackage.CHROME_STABLE override val optionText: Text - get() = R.string.use_chrome_autofill_integration.asText() + get() = BitwardenString.use_chrome_autofill_integration.asText() } /** @@ -53,6 +53,6 @@ sealed class BrowserAutofillSettingsOption(val isEnabled: Boolean) : Parcelable override val browserPackage: BrowserPackage get() = BrowserPackage.CHROME_BETA override val optionText: Text - get() = R.string.use_chrome_beta_autofill_integration.asText() + get() = BitwardenString.use_chrome_beta_autofill_integration.asText() } } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/autofill/privilegedapps/about/AboutPrivilegedAppsScreen.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/autofill/privilegedapps/about/AboutPrivilegedAppsScreen.kt index a1f4355e87..23e43d19e7 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/autofill/privilegedapps/about/AboutPrivilegedAppsScreen.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/autofill/privilegedapps/about/AboutPrivilegedAppsScreen.kt @@ -24,8 +24,8 @@ import com.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar import com.bitwarden.ui.platform.components.content.model.ContentBlockData import com.bitwarden.ui.platform.components.util.rememberVectorPainter import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.platform.components.card.BitwardenContentCard import com.x8bit.bitwarden.ui.platform.components.scaffold.BitwardenScaffold import kotlinx.collections.immutable.persistentListOf @@ -42,10 +42,10 @@ fun AboutPrivilegedAppsScreen( BitwardenScaffold( topBar = { BitwardenTopAppBar( - title = stringResource(R.string.about_privileged_applications), + title = stringResource(BitwardenString.about_privileged_applications), scrollBehavior = scrollBehavior, navigationIcon = rememberVectorPainter(id = BitwardenDrawable.ic_close), - navigationIconContentDescription = stringResource(id = R.string.back), + navigationIconContentDescription = stringResource(id = BitwardenString.back), onNavigationIconClick = remember { onNavigateBack }, ) }, @@ -69,7 +69,7 @@ private fun AboutPrivilegedAppsContent( ) { Spacer(modifier = Modifier.height(24.dp)) Text( - text = stringResource(R.string.privileged_apps_description), + text = stringResource(BitwardenString.privileged_apps_description), textAlign = TextAlign.Center, style = BitwardenTheme.typography.bodyMedium, color = BitwardenTheme.colorScheme.text.primary, @@ -78,16 +78,16 @@ private fun AboutPrivilegedAppsContent( BitwardenContentCard( contentItems = persistentListOf( ContentBlockData( - headerText = stringResource(R.string.trusted_by_you), - subtitleText = stringResource(R.string.trusted_by_you_learn_more), + headerText = stringResource(BitwardenString.trusted_by_you), + subtitleText = stringResource(BitwardenString.trusted_by_you_learn_more), ), ContentBlockData( - headerText = stringResource(R.string.trusted_by_the_community), - subtitleText = stringResource(R.string.trusted_by_community_learn_more), + headerText = stringResource(BitwardenString.trusted_by_the_community), + subtitleText = stringResource(BitwardenString.trusted_by_community_learn_more), ), ContentBlockData( - headerText = stringResource(R.string.trusted_by_google), - subtitleText = stringResource(R.string.trusted_by_google_learn_more), + headerText = stringResource(BitwardenString.trusted_by_google), + subtitleText = stringResource(BitwardenString.trusted_by_google_learn_more), ), ), ) diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/autofill/privilegedapps/list/PrivilegedAppsListScreen.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/autofill/privilegedapps/list/PrivilegedAppsListScreen.kt index 4031870d5a..7f32c3d64a 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/autofill/privilegedapps/list/PrivilegedAppsListScreen.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/autofill/privilegedapps/list/PrivilegedAppsListScreen.kt @@ -32,7 +32,6 @@ import com.bitwarden.ui.platform.components.button.BitwardenStandardIconButton import com.bitwarden.ui.platform.components.util.rememberVectorPainter import com.bitwarden.ui.platform.resource.BitwardenDrawable import com.bitwarden.ui.platform.resource.BitwardenString -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenBasicDialog import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenLoadingDialog import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenTwoButtonDialog @@ -79,10 +78,10 @@ fun PrivilegedAppsListScreen( BitwardenScaffold( topBar = { BitwardenTopAppBar( - title = stringResource(R.string.privileged_apps), + title = stringResource(BitwardenString.privileged_apps), scrollBehavior = scrollBehavior, navigationIcon = rememberVectorPainter(id = BitwardenDrawable.ic_back), - navigationIconContentDescription = stringResource(id = R.string.back), + navigationIconContentDescription = stringResource(id = BitwardenString.back), onNavigationIconClick = remember(viewModel) { { viewModel.trySendAction(PrivilegedAppsListAction.BackClick) } }, @@ -112,18 +111,18 @@ private fun PrivilegedAppListDialogs( ) { when (val dialogState = state.dialogState) { is PrivilegedAppsListState.DialogState.Loading -> { - BitwardenLoadingDialog(stringResource(R.string.loading)) + BitwardenLoadingDialog(stringResource(BitwardenString.loading)) } is PrivilegedAppsListState.DialogState.ConfirmDeleteTrustedApp -> { BitwardenTwoButtonDialog( - title = stringResource(R.string.delete), + title = stringResource(BitwardenString.delete), message = stringResource( - R.string.are_you_sure_you_want_to_stop_trusting_x, + BitwardenString.are_you_sure_you_want_to_stop_trusting_x, dialogState.app.packageName, ), - confirmButtonText = stringResource(R.string.okay), - dismissButtonText = stringResource(R.string.cancel), + confirmButtonText = stringResource(BitwardenString.okay), + dismissButtonText = stringResource(BitwardenString.cancel), onConfirmClick = { onConfirmDeleteTrustedAppClick(dialogState.app) }, onDismissClick = onDismissDialogClick, onDismissRequest = onDismissDialogClick, @@ -133,7 +132,7 @@ private fun PrivilegedAppListDialogs( is PrivilegedAppsListState.DialogState.General -> { BitwardenBasicDialog( title = dialogState.title?.invoke() - ?: stringResource(R.string.an_error_has_occurred), + ?: stringResource(BitwardenString.an_error_has_occurred), message = dialogState.message.invoke(), onDismissRequest = onDismissDialogClick, ) @@ -162,7 +161,7 @@ private fun PrivilegedAppsListContent( .animateItem(), ) BitwardenListHeaderText( - label = stringResource(R.string.installed_apps), + label = stringResource(BitwardenString.installed_apps), supportingLabel = state.installedApps.size.toString(), modifier = Modifier .fillMaxWidth() @@ -208,7 +207,7 @@ private fun PrivilegedAppsListContent( if (state.notInstalledApps.isNotEmpty()) { item { BitwardenExpandingHeader( - collapsedText = stringResource(R.string.all_trusted_apps), + collapsedText = stringResource(BitwardenString.all_trusted_apps), isExpanded = showAllTrustedApps, onClick = remember(state) { { showAllTrustedApps = !showAllTrustedApps } @@ -229,7 +228,7 @@ private fun PrivilegedAppsListContent( .animateItem(), ) BitwardenListHeaderText( - label = stringResource(R.string.trusted_by_you), + label = stringResource(BitwardenString.trusted_by_you), supportingLabel = state.notInstalledUserTrustedApps.size.toString(), modifier = Modifier .fillMaxWidth() @@ -282,7 +281,7 @@ private fun PrivilegedAppsListContent( .animateItem(), ) BitwardenListHeaderText( - label = stringResource(R.string.trusted_by_the_community), + label = stringResource(BitwardenString.trusted_by_the_community), supportingLabel = state.notInstalledCommunityTrustedApps.size.toString(), modifier = Modifier .fillMaxWidth() @@ -316,7 +315,7 @@ private fun PrivilegedAppsListContent( item(key = "trusted_by_google") { Spacer(modifier = Modifier.height(16.dp)) BitwardenListHeaderText( - label = stringResource(R.string.trusted_by_google), + label = stringResource(BitwardenString.trusted_by_google), supportingLabel = state.notInstalledGoogleTrustedApps.size.toString(), modifier = Modifier .fillMaxWidth() diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/autofill/privilegedapps/list/PrivilegedAppsListViewModel.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/autofill/privilegedapps/list/PrivilegedAppsListViewModel.kt index 3b9780f429..dcfc838510 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/autofill/privilegedapps/list/PrivilegedAppsListViewModel.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/autofill/privilegedapps/list/PrivilegedAppsListViewModel.kt @@ -6,9 +6,9 @@ import androidx.lifecycle.viewModelScope import com.bitwarden.core.data.repository.model.DataState import com.bitwarden.data.manager.BitwardenPackageManager import com.bitwarden.ui.platform.base.BaseViewModel +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.credentials.model.PrivilegedAppAllowListJson import com.x8bit.bitwarden.data.credentials.repository.PrivilegedAppRepository import com.x8bit.bitwarden.data.credentials.repository.model.PrivilegedAppData @@ -105,7 +105,7 @@ class PrivilegedAppsListViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = PrivilegedAppsListState.DialogState.General( - message = R.string.generic_error_message.asText(), + message = BitwardenString.generic_error_message.asText(), ), ) } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/autofill/privilegedapps/list/model/PrivilegedAppListItem.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/autofill/privilegedapps/list/model/PrivilegedAppListItem.kt index b53e9aa808..691e719b56 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/autofill/privilegedapps/list/model/PrivilegedAppListItem.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/autofill/privilegedapps/list/model/PrivilegedAppListItem.kt @@ -2,7 +2,7 @@ package com.x8bit.bitwarden.ui.platform.feature.settings.autofill.privilegedapps import android.os.Parcelable import androidx.annotation.StringRes -import com.x8bit.bitwarden.R +import com.bitwarden.ui.platform.resource.BitwardenString import kotlinx.parcelize.Parcelize /** @@ -38,16 +38,16 @@ data class PrivilegedAppListItem( /** * The app is trusted by Google. */ - GOOGLE(description = R.string.trusted_by_google), + GOOGLE(description = BitwardenString.trusted_by_google), /** * The app is trusted by the Bitwarden community. */ - COMMUNITY(description = R.string.trusted_by_the_community), + COMMUNITY(description = BitwardenString.trusted_by_the_community), /** * The app is trusted by the user. */ - USER(description = R.string.trusted_by_you), + USER(description = BitwardenString.trusted_by_you), } } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/autofill/util/UriMatchTypeExtensions.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/autofill/util/UriMatchTypeExtensions.kt index 2bcd8c2ace..0ea84af57f 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/autofill/util/UriMatchTypeExtensions.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/autofill/util/UriMatchTypeExtensions.kt @@ -1,8 +1,8 @@ package com.x8bit.bitwarden.ui.platform.feature.settings.autofill.util +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.platform.repository.model.UriMatchType /** @@ -10,12 +10,12 @@ import com.x8bit.bitwarden.data.platform.repository.model.UriMatchType */ val UriMatchType.displayLabel: Text get() = when (this) { - UriMatchType.DOMAIN -> R.string.base_domain - UriMatchType.HOST -> R.string.host - UriMatchType.STARTS_WITH -> R.string.starts_with - UriMatchType.REGULAR_EXPRESSION -> R.string.reg_ex - UriMatchType.EXACT -> R.string.exact - UriMatchType.NEVER -> R.string.never + UriMatchType.DOMAIN -> BitwardenString.base_domain + UriMatchType.HOST -> BitwardenString.host + UriMatchType.STARTS_WITH -> BitwardenString.starts_with + UriMatchType.REGULAR_EXPRESSION -> BitwardenString.reg_ex + UriMatchType.EXACT -> BitwardenString.exact + UriMatchType.NEVER -> BitwardenString.never } .asText() diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/exportvault/ExportVaultScreen.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/exportvault/ExportVaultScreen.kt index 6b1c796c61..3f66252d80 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/exportvault/ExportVaultScreen.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/exportvault/ExportVaultScreen.kt @@ -36,8 +36,8 @@ import com.bitwarden.ui.platform.components.button.BitwardenOutlinedButton import com.bitwarden.ui.platform.components.model.CardStyle import com.bitwarden.ui.platform.components.util.rememberVectorPainter import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.auth.feature.completeregistration.PasswordStrengthIndicator import com.x8bit.bitwarden.ui.platform.components.card.BitwardenInfoCalloutCard import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenBasicDialog @@ -95,16 +95,16 @@ fun ExportVaultScreen( } if (shouldShowConfirmationDialog) { BitwardenTwoButtonDialog( - title = stringResource(id = R.string.export_vault_confirmation_title), + title = stringResource(id = BitwardenString.export_vault_confirmation_title), message = if (state.exportFormat == ExportVaultFormat.JSON_ENCRYPTED) { - stringResource(id = R.string.export_vault_file_pw_protect_info) + stringResource(id = BitwardenString.export_vault_file_pw_protect_info) } else { stringResource( - id = R.string.export_vault_warning, + id = BitwardenString.export_vault_warning, ) }, - confirmButtonText = stringResource(id = R.string.export_vault), - dismissButtonText = stringResource(id = R.string.cancel), + confirmButtonText = stringResource(id = BitwardenString.export_vault), + dismissButtonText = stringResource(id = BitwardenString.cancel), onConfirmClick = { shouldShowConfirmationDialog = false confirmExportVaultClicked() @@ -140,10 +140,10 @@ fun ExportVaultScreen( .nestedScroll(scrollBehavior.nestedScrollConnection), topBar = { BitwardenTopAppBar( - title = stringResource(id = R.string.export_vault), + title = stringResource(id = BitwardenString.export_vault), scrollBehavior = scrollBehavior, navigationIcon = rememberVectorPainter(id = BitwardenDrawable.ic_close), - navigationIconContentDescription = stringResource(id = R.string.close), + navigationIconContentDescription = stringResource(id = BitwardenString.close), onNavigationIconClick = remember(viewModel) { { viewModel.trySendAction(ExportVaultAction.CloseButtonClick) } }, @@ -196,7 +196,9 @@ private fun ExportVaultScreenContent( Spacer(modifier = Modifier.height(height = 12.dp)) if (state.policyPreventsExport) { BitwardenInfoCalloutCard( - text = stringResource(id = R.string.disable_personal_vault_export_policy_in_effect), + text = stringResource( + id = BitwardenString.disable_personal_vault_export_policy_in_effect, + ), modifier = Modifier .testTag("DisablePrivateVaultPolicyLabel") .standardHorizontalMargin() @@ -208,7 +210,7 @@ private fun ExportVaultScreenContent( val resources = LocalContext.current.resources BitwardenMultiSelectButton( - label = stringResource(id = R.string.file_format), + label = stringResource(id = BitwardenString.file_format), options = ExportVaultFormat.entries.map { it.displayLabel() }.toImmutableList(), selectedOption = state.exportFormat.displayLabel(), onOptionSelected = { selectedOptionLabel -> @@ -229,7 +231,7 @@ private fun ExportVaultScreenContent( Spacer(modifier = Modifier.height(8.dp)) var showPassword by rememberSaveable { mutableStateOf(false) } BitwardenPasswordField( - label = stringResource(id = R.string.file_password), + label = stringResource(id = BitwardenString.file_password), value = state.filePasswordInput, onValueChange = onFilePasswordInputChanged, showPassword = showPassword, @@ -241,7 +243,7 @@ private fun ExportVaultScreenContent( modifier = Modifier.fillMaxWidth(), ) Text( - text = stringResource(id = R.string.password_used_to_export), + text = stringResource(id = BitwardenString.password_used_to_export), style = BitwardenTheme.typography.bodySmall, color = BitwardenTheme.colorScheme.text.secondary, modifier = Modifier.fillMaxWidth(), @@ -257,7 +259,7 @@ private fun ExportVaultScreenContent( Spacer(modifier = Modifier.height(8.dp)) BitwardenPasswordField( - label = stringResource(id = R.string.confirm_file_password), + label = stringResource(id = BitwardenString.confirm_file_password), value = state.confirmFilePasswordInput, onValueChange = onConfirmFilePasswordInputChanged, showPassword = showPassword, @@ -274,7 +276,7 @@ private fun ExportVaultScreenContent( Spacer(modifier = Modifier.height(16.dp)) Text( - text = stringResource(id = R.string.send_verification_code_to_email), + text = stringResource(id = BitwardenString.send_verification_code_to_email), textAlign = TextAlign.Start, style = BitwardenTheme.typography.bodyMedium, color = BitwardenTheme.colorScheme.text.primary, @@ -286,7 +288,7 @@ private fun ExportVaultScreenContent( Spacer(modifier = Modifier.height(8.dp)) BitwardenOutlinedButton( - label = stringResource(R.string.send_code), + label = stringResource(BitwardenString.send_code), onClick = onSendCodeClicked, isEnabled = !state.policyPreventsExport, modifier = Modifier @@ -298,10 +300,10 @@ private fun ExportVaultScreenContent( Spacer(modifier = Modifier.height(16.dp)) BitwardenPasswordField( - label = stringResource(id = R.string.verification_code), + label = stringResource(id = BitwardenString.verification_code), value = state.passwordInput, readOnly = state.policyPreventsExport, - supportingText = stringResource(id = R.string.confirm_your_identity), + supportingText = stringResource(id = BitwardenString.confirm_your_identity), onValueChange = onPasswordInputChanged, keyboardType = KeyboardType.Number, cardStyle = CardStyle.Full, @@ -312,9 +314,9 @@ private fun ExportVaultScreenContent( } else { Spacer(modifier = Modifier.height(height = 8.dp)) BitwardenPasswordField( - label = stringResource(id = R.string.master_password), + label = stringResource(id = BitwardenString.master_password), supportingText = stringResource( - id = R.string.export_vault_master_password_description, + id = BitwardenString.export_vault_master_password_description, ), value = state.passwordInput, readOnly = state.policyPreventsExport, @@ -329,7 +331,7 @@ private fun ExportVaultScreenContent( Spacer(modifier = Modifier.height(height = 16.dp)) BitwardenOutlinedButton( - label = stringResource(id = R.string.export_vault), + label = stringResource(id = BitwardenString.export_vault), onClick = onExportVaultClick, isEnabled = !state.policyPreventsExport, modifier = Modifier diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/exportvault/ExportVaultViewModel.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/exportvault/ExportVaultViewModel.kt index b5c192eedc..0b0e52cf22 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/exportvault/ExportVaultViewModel.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/exportvault/ExportVaultViewModel.kt @@ -7,10 +7,10 @@ import androidx.lifecycle.viewModelScope import com.bitwarden.core.data.util.toFormattedPattern import com.bitwarden.network.model.PolicyTypeJson import com.bitwarden.ui.platform.base.BaseViewModel +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText import com.bitwarden.vault.CipherType -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.auth.datasource.sdk.model.PasswordStrength import com.x8bit.bitwarden.data.auth.repository.AuthRepository import com.x8bit.bitwarden.data.auth.repository.model.PasswordStrengthResult @@ -132,10 +132,10 @@ class ExportVaultViewModel @Inject constructor( } val message = when (val result = action.result) { is RequestOtpResult.Error -> { - result.message?.asText() ?: R.string.generic_error_message.asText() + result.message?.asText() ?: BitwardenString.generic_error_message.asText() } - RequestOtpResult.Success -> R.string.code_sent.asText() + RequestOtpResult.Success -> BitwardenString.code_sent.asText() } sendEvent(ExportVaultEvent.ShowSnackbar(message = message)) } @@ -154,8 +154,8 @@ class ExportVaultViewModel @Inject constructor( // Display an error alert if the user hasn't entered a password. if (state.passwordInput.isBlank()) { updateStateWithError( - message = R.string.validation_field_required.asText( - R.string.master_password.asText(), + message = BitwardenString.validation_field_required.asText( + BitwardenString.master_password.asText(), ), ) return @@ -163,23 +163,23 @@ class ExportVaultViewModel @Inject constructor( when { state.filePasswordInput.isBlank() -> { updateStateWithError( - message = R.string.validation_field_required - .asText(R.string.file_password.asText()), + message = BitwardenString.validation_field_required + .asText(BitwardenString.file_password.asText()), ) return } state.confirmFilePasswordInput.isBlank() -> { updateStateWithError( - message = R.string.validation_field_required - .asText(R.string.confirm_file_password.asText()), + message = BitwardenString.validation_field_required + .asText(BitwardenString.confirm_file_password.asText()), ) return } state.filePasswordInput != state.confirmFilePasswordInput -> { updateStateWithError( - message = R.string.master_password_confirmation_val_message.asText(), + message = BitwardenString.master_password_confirmation_val_message.asText(), ) return } @@ -239,7 +239,7 @@ class ExportVaultViewModel @Inject constructor( private fun handleExportLocationReceive(action: ExportVaultAction.ExportLocationReceive) { val exportData = state.exportData if (exportData == null) { - updateStateWithError(R.string.export_vault_failure.asText()) + updateStateWithError(BitwardenString.export_vault_failure.asText()) return } @@ -290,7 +290,7 @@ class ExportVaultViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = ExportVaultState.DialogState.Loading( - message = R.string.sending.asText(), + message = BitwardenString.sending.asText(), ), ) } @@ -312,7 +312,7 @@ class ExportVaultViewModel @Inject constructor( when (val result = action.result) { is ValidatePasswordResult.Error -> { updateStateWithError( - message = R.string.generic_error_message.asText(), + message = BitwardenString.generic_error_message.asText(), error = result.error, ) } @@ -320,7 +320,7 @@ class ExportVaultViewModel @Inject constructor( is ValidatePasswordResult.Success -> { // Display an error dialog if the password is invalid. if (!action.result.isValid) { - updateStateWithError(R.string.invalid_master_password.asText()) + updateStateWithError(BitwardenString.invalid_master_password.asText()) return } @@ -338,7 +338,7 @@ class ExportVaultViewModel @Inject constructor( when (val result = action.result) { is ExportVaultDataResult.Error -> { updateStateWithError( - message = R.string.export_vault_failure.asText(), + message = BitwardenString.export_vault_failure.asText(), error = result.error, ) } @@ -398,11 +398,11 @@ class ExportVaultViewModel @Inject constructor( action: ExportVaultAction.Internal.SaveExportDataToUriResultReceive, ) { if (!action.result) { - updateStateWithError(R.string.export_vault_failure.asText()) + updateStateWithError(BitwardenString.export_vault_failure.asText()) return } - sendEvent(ExportVaultEvent.ShowSnackbar(R.string.export_vault_success.asText())) + sendEvent(ExportVaultEvent.ShowSnackbar(BitwardenString.export_vault_success.asText())) } private fun handleReceiveVerifyOneTimePasscodeResult( @@ -413,7 +413,7 @@ class ExportVaultViewModel @Inject constructor( is VerifyOtpResult.NotVerified -> { updateStateWithError( - message = R.string.generic_error_message.asText(), + message = BitwardenString.generic_error_message.asText(), error = result.error, ) } @@ -452,7 +452,7 @@ class ExportVaultViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = ExportVaultState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), + title = BitwardenString.an_error_has_occurred.asText(), message = message, error = error, ), @@ -513,7 +513,7 @@ data class ExportVaultState( */ @Parcelize data class Loading( - val message: Text = R.string.loading.asText(), + val message: Text = BitwardenString.loading.asText(), ) : DialogState() } } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/flightrecorder/FlightRecorderScreen.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/flightrecorder/FlightRecorderScreen.kt index a38587f664..6a2bca2e62 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/flightrecorder/FlightRecorderScreen.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/flightrecorder/FlightRecorderScreen.kt @@ -31,8 +31,8 @@ import com.bitwarden.ui.platform.components.button.BitwardenTextButton import com.bitwarden.ui.platform.components.model.CardStyle import com.bitwarden.ui.platform.components.util.rememberVectorPainter import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.platform.repository.model.FlightRecorderDuration import com.x8bit.bitwarden.ui.platform.components.dropdown.BitwardenMultiSelectButton import com.x8bit.bitwarden.ui.platform.components.scaffold.BitwardenScaffold @@ -65,16 +65,16 @@ fun FlightRecorderScreen( BitwardenScaffold( topBar = { BitwardenTopAppBar( - title = stringResource(id = R.string.enable_flight_recorder_title), + title = stringResource(id = BitwardenString.enable_flight_recorder_title), navigationIcon = rememberVectorPainter(id = BitwardenDrawable.ic_close), - navigationIconContentDescription = stringResource(id = R.string.close), + navigationIconContentDescription = stringResource(id = BitwardenString.close), onNavigationIconClick = remember(viewModel) { { viewModel.trySendAction(FlightRecorderAction.BackClick) } }, scrollBehavior = scrollBehavior, actions = { BitwardenTextButton( - label = stringResource(id = R.string.save), + label = stringResource(id = BitwardenString.save), onClick = remember(viewModel) { { viewModel.trySendAction(FlightRecorderAction.SaveClick) } }, @@ -111,7 +111,7 @@ private fun FlightRecorderContent( ) { Spacer(modifier = Modifier.height(height = 24.dp)) Text( - text = stringResource(id = R.string.experiencing_an_issue), + text = stringResource(id = BitwardenString.experiencing_an_issue), color = BitwardenTheme.colorScheme.text.primary, style = BitwardenTheme.typography.titleMedium, textAlign = TextAlign.Center, @@ -122,7 +122,7 @@ private fun FlightRecorderContent( Spacer(modifier = Modifier.height(height = 12.dp)) Text( text = stringResource( - id = R.string.enable_temporary_logging_to_collect_and_inspect_logs_locally, + id = BitwardenString.enable_temporary_logging_to_collect_and_inspect_logs_locally, ), color = BitwardenTheme.colorScheme.text.primary, style = BitwardenTheme.typography.bodyMedium, @@ -133,7 +133,7 @@ private fun FlightRecorderContent( ) Spacer(modifier = Modifier.height(height = 12.dp)) Text( - text = stringResource(id = R.string.to_get_started_set_a_logging_duration), + text = stringResource(id = BitwardenString.to_get_started_set_a_logging_duration), color = BitwardenTheme.colorScheme.text.primary, style = BitwardenTheme.typography.bodyMedium, textAlign = TextAlign.Center, @@ -151,7 +151,9 @@ private fun FlightRecorderContent( ) Spacer(modifier = Modifier.height(height = 24.dp)) Text( - text = stringResource(id = R.string.logs_will_be_automatically_deleted_after_30_days), + text = stringResource( + id = BitwardenString.logs_will_be_automatically_deleted_after_30_days, + ), color = BitwardenTheme.colorScheme.text.secondary, style = BitwardenTheme.typography.bodySmall, textAlign = TextAlign.Center, @@ -161,9 +163,9 @@ private fun FlightRecorderContent( ) Spacer(modifier = Modifier.height(height = 8.dp)) BitwardenHyperTextLink( - annotatedResId = R.string.for_details_on_what_is_and_isnt_logged, + annotatedResId = BitwardenString.for_details_on_what_is_and_isnt_logged, annotationKey = "helpCenter", - accessibilityString = stringResource(id = R.string.bitwarden_help_center), + accessibilityString = stringResource(id = BitwardenString.bitwarden_help_center), onClick = onHelpCenterClick, color = BitwardenTheme.colorScheme.text.secondary, style = BitwardenTheme.typography.bodySmall, @@ -185,7 +187,7 @@ private fun DurationSelectButton( val resources = LocalContext.current.resources val options = FlightRecorderDuration.entries.map { it.displayText() }.toImmutableList() BitwardenMultiSelectButton( - label = stringResource(id = R.string.logging_duration), + label = stringResource(id = BitwardenString.logging_duration), options = options, selectedOption = selectedOption.displayText(), onOptionSelected = { selectedOption -> diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/flightrecorder/recordedLogs/RecordedLogsScreen.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/flightrecorder/recordedLogs/RecordedLogsScreen.kt index 633bb2120d..29b1b109b3 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/flightrecorder/recordedLogs/RecordedLogsScreen.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/flightrecorder/recordedLogs/RecordedLogsScreen.kt @@ -42,8 +42,8 @@ import com.bitwarden.ui.platform.components.icon.model.IconData import com.bitwarden.ui.platform.components.model.CardStyle import com.bitwarden.ui.platform.components.util.rememberVectorPainter import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.platform.components.content.BitwardenEmptyContent import com.x8bit.bitwarden.ui.platform.components.content.BitwardenLoadingContent import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenBasicDialog @@ -95,9 +95,9 @@ fun RecordedLogsScreen( BitwardenScaffold( topBar = { BitwardenTopAppBar( - title = stringResource(id = R.string.recorded_logs_title), + title = stringResource(id = BitwardenString.recorded_logs_title), navigationIcon = rememberVectorPainter(id = BitwardenDrawable.ic_close), - navigationIconContentDescription = stringResource(id = R.string.close), + navigationIconContentDescription = stringResource(id = BitwardenString.close), onNavigationIconClick = remember(viewModel) { { viewModel.trySendAction(RecordedLogsAction.BackClick) } }, @@ -133,7 +133,7 @@ fun RecordedLogsScreen( RecordedLogsState.ViewState.Empty -> { BitwardenEmptyContent( - text = stringResource(id = R.string.no_logs_recorded), + text = stringResource(id = BitwardenString.no_logs_recorded), illustrationData = IconData.Local( iconRes = BitwardenDrawable.il_secure_devices, ), @@ -158,10 +158,12 @@ private fun RecordedLogsOverflowMenu( var showDeletionDialog by rememberSaveable { mutableStateOf(value = false) } if (showDeletionDialog) { BitwardenTwoButtonDialog( - title = stringResource(id = R.string.delete_logs), - message = stringResource(id = R.string.do_you_really_want_to_delete_all_recorded_logs), - confirmButtonText = stringResource(id = R.string.yes), - dismissButtonText = stringResource(id = R.string.cancel), + title = stringResource(id = BitwardenString.delete_logs), + message = stringResource( + id = BitwardenString.do_you_really_want_to_delete_all_recorded_logs, + ), + confirmButtonText = stringResource(id = BitwardenString.yes), + dismissButtonText = stringResource(id = BitwardenString.cancel), onDismissRequest = { showDeletionDialog = false }, onDismissClick = { showDeletionDialog = false }, onConfirmClick = { @@ -171,16 +173,16 @@ private fun RecordedLogsOverflowMenu( ) } BitwardenOverflowActionItem( - contentDescription = stringResource(R.string.more), + contentDescription = stringResource(BitwardenString.more), modifier = modifier, menuItemDataList = persistentListOf( OverflowMenuItemData( - text = stringResource(id = R.string.share_all), + text = stringResource(id = BitwardenString.share_all), onClick = onShareAllClick, isEnabled = isOverflowEnabled, ), OverflowMenuItemData( - text = stringResource(id = R.string.delete_all), + text = stringResource(id = BitwardenString.delete_all), onClick = { showDeletionDialog = true }, isEnabled = isOverflowEnabled, color = BitwardenTheme.colorScheme.status.error, @@ -254,10 +256,10 @@ private fun LogRow( var showDeletionDialog by rememberSaveable { mutableStateOf(value = false) } if (showDeletionDialog) { BitwardenTwoButtonDialog( - title = stringResource(id = R.string.delete_log), - message = stringResource(id = R.string.do_you_really_want_to_delete_this_log), - confirmButtonText = stringResource(id = R.string.yes), - dismissButtonText = stringResource(id = R.string.cancel), + title = stringResource(id = BitwardenString.delete_log), + message = stringResource(id = BitwardenString.do_you_really_want_to_delete_this_log), + confirmButtonText = stringResource(id = BitwardenString.yes), + dismissButtonText = stringResource(id = BitwardenString.cancel), onDismissRequest = { showDeletionDialog = false }, onDismissClick = { showDeletionDialog = false }, onConfirmClick = { @@ -313,14 +315,14 @@ private fun LogRow( } Spacer(modifier = Modifier.width(width = 12.dp)) BitwardenOverflowActionItem( - contentDescription = stringResource(R.string.more), + contentDescription = stringResource(BitwardenString.more), menuItemDataList = persistentListOf( OverflowMenuItemData( - text = stringResource(id = R.string.share), + text = stringResource(id = BitwardenString.share), onClick = { onShareItemClick(displayableItem) }, ), OverflowMenuItemData( - text = stringResource(id = R.string.delete), + text = stringResource(id = BitwardenString.delete), onClick = { showDeletionDialog = true }, color = BitwardenTheme.colorScheme.status.error, isEnabled = displayableItem.isDeletedEnabled, diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/flightrecorder/recordedLogs/RecordedLogsViewModel.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/flightrecorder/recordedLogs/RecordedLogsViewModel.kt index 585dd0a876..be843e40c0 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/flightrecorder/recordedLogs/RecordedLogsViewModel.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/flightrecorder/recordedLogs/RecordedLogsViewModel.kt @@ -5,9 +5,9 @@ import androidx.core.net.toUri import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.viewModelScope import com.bitwarden.ui.platform.base.BaseViewModel +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.platform.datasource.disk.model.FlightRecorderDataSet import com.x8bit.bitwarden.data.platform.repository.SettingsRepository import com.x8bit.bitwarden.data.vault.manager.FileManager @@ -74,7 +74,7 @@ class RecordedLogsViewModel @Inject constructor( private fun handleDeleteAllClick() { settingsRepository.deleteAllLogs() - sendEvent(RecordedLogsEvent.ShowSnackbar(text = R.string.all_logs_deleted.asText())) + sendEvent(RecordedLogsEvent.ShowSnackbar(text = BitwardenString.all_logs_deleted.asText())) } private fun handleDeleteClick(action: RecordedLogsAction.DeleteClick) { @@ -84,7 +84,11 @@ class RecordedLogsViewModel @Inject constructor( .find { it.id == action.item.id } ?.let { settingsRepository.deleteLog(data = it) - sendEvent(RecordedLogsEvent.ShowSnackbar(text = R.string.log_deleted.asText())) + sendEvent( + RecordedLogsEvent.ShowSnackbar( + text = BitwardenString.log_deleted.asText(), + ), + ) } } @@ -143,8 +147,9 @@ class RecordedLogsViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = RecordedLogsState.DialogState.Error( - title = R.string.unable_to_share.asText(), - message = R.string.please_try_again_or_select_a_different_log.asText(), + title = BitwardenString.unable_to_share.asText(), + message = BitwardenString.please_try_again_or_select_a_different_log + .asText(), error = result.error, ), ) @@ -155,8 +160,8 @@ class RecordedLogsViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = RecordedLogsState.DialogState.Error( - title = R.string.unable_to_share.asText(), - message = R.string + title = BitwardenString.unable_to_share.asText(), + message = BitwardenString .the_log_file_you_are_trying_to_share_has_been_removed .asText(), error = null, diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/flightrecorder/recordedLogs/util/FlightRecorderDataSetExtensions.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/flightrecorder/recordedLogs/util/FlightRecorderDataSetExtensions.kt index c1d9faf3fa..9399497445 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/flightrecorder/recordedLogs/util/FlightRecorderDataSetExtensions.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/flightrecorder/recordedLogs/util/FlightRecorderDataSetExtensions.kt @@ -3,9 +3,9 @@ package com.x8bit.bitwarden.ui.platform.feature.settings.flightrecorder.recorded import com.bitwarden.core.data.util.toFormattedDateStyle import com.bitwarden.core.data.util.toFormattedPattern import com.bitwarden.core.data.util.toFormattedTimeStyle +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.platform.datasource.disk.model.FlightRecorderDataSet import com.x8bit.bitwarden.data.platform.util.fileOf import com.x8bit.bitwarden.ui.platform.feature.settings.flightrecorder.recordedLogs.RecordedLogsState @@ -67,24 +67,24 @@ private fun FlightRecorderDataSet.FlightRecorderData.expiresIn(clock: Clock): Te null } else if (now.isAfter(expirationTime)) { // We have passed expiration. This should never happen since the data should be deleted. - R.string.expired.asText() + BitwardenString.expired.asText() } else if (now.isAfter(expirationTime.minus(1, ChronoUnit.DAYS))) { // We are within 24 hours of expiration, so show the specific time. val expirationTime = expirationTime.toFormattedTimeStyle( timeStyle = FormatStyle.SHORT, clock = clock, ) - R.string.expires_at.asText(expirationTime) + BitwardenString.expires_at.asText(expirationTime) } else if (dayBeforeExpiration.dayOfYear == now.atZone(clock.zone).dayOfYear) { // We expire tomorrow based on the day of year. - R.string.expires_tomorrow.asText() + BitwardenString.expires_tomorrow.asText() } else { // Let them know the date it expires. val expirationDate = expirationTime.toFormattedDateStyle( dateStyle = FormatStyle.SHORT, clock = clock, ) - R.string.expires_on.asText(expirationDate) + BitwardenString.expires_on.asText(expirationDate) } } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/flightrecorder/util/FlightRecorderDurationExtensions.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/flightrecorder/util/FlightRecorderDurationExtensions.kt index bc172d3175..4014c4d5ba 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/flightrecorder/util/FlightRecorderDurationExtensions.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/flightrecorder/util/FlightRecorderDurationExtensions.kt @@ -1,8 +1,8 @@ package com.x8bit.bitwarden.ui.platform.feature.settings.flightrecorder.util +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.platform.repository.model.FlightRecorderDuration /** @@ -10,11 +10,11 @@ import com.x8bit.bitwarden.data.platform.repository.model.FlightRecorderDuration */ val FlightRecorderDuration.displayText: Text get() = when (this) { - FlightRecorderDuration.ONE_HOUR -> R.string.flight_recorder_one_hour.asText() - FlightRecorderDuration.EIGHT_HOURS -> R.string.flight_recorder_eight_hours.asText() + FlightRecorderDuration.ONE_HOUR -> BitwardenString.flight_recorder_one_hour.asText() + FlightRecorderDuration.EIGHT_HOURS -> BitwardenString.flight_recorder_eight_hours.asText() FlightRecorderDuration.TWENTY_FOUR_HOURS -> { - R.string.flight_recorder_twenty_four_hours.asText() + BitwardenString.flight_recorder_twenty_four_hours.asText() } - FlightRecorderDuration.ONE_WEEK -> R.string.flight_recorder_one_week.asText() + FlightRecorderDuration.ONE_WEEK -> BitwardenString.flight_recorder_one_week.asText() } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/folders/FoldersScreen.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/folders/FoldersScreen.kt index 5bbe39d9e3..8d19635f96 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/folders/FoldersScreen.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/folders/FoldersScreen.kt @@ -31,8 +31,8 @@ import com.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar import com.bitwarden.ui.platform.components.fab.BitwardenFloatingActionButton import com.bitwarden.ui.platform.components.util.rememberVectorPainter import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.platform.components.content.BitwardenErrorContent import com.x8bit.bitwarden.ui.platform.components.content.BitwardenLoadingContent import com.x8bit.bitwarden.ui.platform.components.row.BitwardenTextRow @@ -71,10 +71,10 @@ fun FoldersScreen( .nestedScroll(scrollBehavior.nestedScrollConnection), topBar = { BitwardenTopAppBar( - title = stringResource(id = R.string.folders), + title = stringResource(id = BitwardenString.folders), scrollBehavior = scrollBehavior, navigationIcon = rememberVectorPainter(id = BitwardenDrawable.ic_close), - navigationIconContentDescription = stringResource(id = R.string.close), + navigationIconContentDescription = stringResource(id = BitwardenString.close), onNavigationIconClick = remember(viewModel) { { viewModel.trySendAction(FoldersAction.CloseButtonClick) } }, @@ -86,7 +86,7 @@ fun FoldersScreen( { viewModel.trySendAction(FoldersAction.AddFolderButtonClick) } }, painter = rememberVectorPainter(id = BitwardenDrawable.ic_plus_large), - contentDescription = stringResource(id = R.string.add_item), + contentDescription = stringResource(id = BitwardenString.add_item), modifier = Modifier .testTag(tag = "AddItemButton") .navigationBarsPadding(), @@ -133,7 +133,7 @@ private fun FoldersContent( horizontalAlignment = Alignment.CenterHorizontally, ) { Text( - text = stringResource(id = R.string.no_folders_to_list), + text = stringResource(id = BitwardenString.no_folders_to_list), textAlign = TextAlign.Center, style = BitwardenTheme.typography.bodyMedium, color = BitwardenTheme.colorScheme.text.primary, diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/folders/FoldersViewModel.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/folders/FoldersViewModel.kt index 6d829a4e3a..142270a500 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/folders/FoldersViewModel.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/folders/FoldersViewModel.kt @@ -4,11 +4,11 @@ import android.os.Parcelable import androidx.lifecycle.viewModelScope import com.bitwarden.core.data.repository.model.DataState import com.bitwarden.ui.platform.base.BaseViewModel +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText import com.bitwarden.ui.util.concat import com.bitwarden.vault.FolderView -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.vault.repository.VaultRepository import com.x8bit.bitwarden.ui.platform.feature.settings.folders.model.FolderDisplayItem import dagger.hilt.android.lifecycle.HiltViewModel @@ -61,7 +61,7 @@ class FoldersViewModel @Inject constructor( mutableStateFlow.update { it.copy( viewState = FoldersState.ViewState.Error( - message = R.string.generic_error_message.asText(), + message = BitwardenString.generic_error_message.asText(), ), ) } @@ -95,11 +95,11 @@ class FoldersViewModel @Inject constructor( mutableStateFlow.update { it.copy( viewState = FoldersState.ViewState.Error( - message = R.string.internet_connection_required_title + message = BitwardenString.internet_connection_required_title .asText() .concat( " ".asText(), - R.string.internet_connection_required_message.asText(), + BitwardenString.internet_connection_required_message.asText(), ), ), ) diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/folders/addedit/FolderAddEditScreen.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/folders/addedit/FolderAddEditScreen.kt index f59bc93e0e..0c836591a7 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/folders/addedit/FolderAddEditScreen.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/folders/addedit/FolderAddEditScreen.kt @@ -33,8 +33,8 @@ import com.bitwarden.ui.platform.components.button.BitwardenTextButton import com.bitwarden.ui.platform.components.model.CardStyle import com.bitwarden.ui.platform.components.util.rememberVectorPainter import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.platform.components.content.BitwardenErrorContent import com.x8bit.bitwarden.ui.platform.components.content.BitwardenLoadingContent import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenBasicDialog @@ -78,9 +78,9 @@ fun FolderAddEditScreen( if (shouldShowConfirmationDialog) { BitwardenTwoButtonDialog( title = null, - message = stringResource(id = R.string.do_you_really_want_to_delete), - dismissButtonText = stringResource(id = R.string.cancel), - confirmButtonText = stringResource(id = R.string.delete), + message = stringResource(id = BitwardenString.do_you_really_want_to_delete), + dismissButtonText = stringResource(id = BitwardenString.cancel), + confirmButtonText = stringResource(id = BitwardenString.delete), onDismissClick = { shouldShowConfirmationDialog = false }, onConfirmClick = { shouldShowConfirmationDialog = false @@ -101,13 +101,13 @@ fun FolderAddEditScreen( title = state.screenDisplayName.invoke(), scrollBehavior = scrollBehavior, navigationIcon = rememberVectorPainter(id = BitwardenDrawable.ic_close), - navigationIconContentDescription = stringResource(id = R.string.close), + navigationIconContentDescription = stringResource(id = BitwardenString.close), onNavigationIconClick = remember(viewModel) { { viewModel.trySendAction(FolderAddEditAction.CloseClick) } }, actions = { BitwardenTextButton( - label = stringResource(id = R.string.save), + label = stringResource(id = BitwardenString.save), onClick = remember(viewModel) { { viewModel.trySendAction(FolderAddEditAction.SaveClick) } }, @@ -115,10 +115,10 @@ fun FolderAddEditScreen( ) if (state.shouldShowOverflowMenu) { BitwardenOverflowActionItem( - contentDescription = stringResource(R.string.more), + contentDescription = stringResource(BitwardenString.more), menuItemDataList = persistentListOf( OverflowMenuItemData( - text = stringResource(id = R.string.delete), + text = stringResource(id = BitwardenString.delete), onClick = { shouldShowConfirmationDialog = true }, ), ), @@ -135,7 +135,7 @@ fun FolderAddEditScreen( ) { Spacer(modifier = Modifier.height(height = 12.dp)) BitwardenTextField( - label = stringResource(id = R.string.name), + label = stringResource(id = BitwardenString.name), value = viewState.folderName, onValueChange = remember(viewModel) { { viewModel.trySendAction(FolderAddEditAction.NameTextChange(it)) } @@ -177,7 +177,7 @@ private fun FolderAddEditItemDialogs( } is FolderAddEditState.DialogState.Error -> BitwardenBasicDialog( - title = stringResource(id = R.string.an_error_has_occurred), + title = stringResource(id = BitwardenString.an_error_has_occurred), message = dialogState.message(), onDismissRequest = onDismissRequest, throwable = dialogState.throwable, diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/folders/addedit/FolderAddEditViewModel.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/folders/addedit/FolderAddEditViewModel.kt index 0f31fd7a67..5845b326b2 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/folders/addedit/FolderAddEditViewModel.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/folders/addedit/FolderAddEditViewModel.kt @@ -6,11 +6,11 @@ import androidx.lifecycle.viewModelScope import com.bitwarden.core.DateTime import com.bitwarden.core.data.repository.model.DataState import com.bitwarden.ui.platform.base.BaseViewModel +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText import com.bitwarden.ui.util.concat import com.bitwarden.vault.FolderView -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.vault.repository.VaultRepository import com.x8bit.bitwarden.data.vault.repository.model.CreateFolderResult import com.x8bit.bitwarden.data.vault.repository.model.DeleteFolderResult @@ -91,8 +91,8 @@ class FolderAddEditViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialog = FolderAddEditState.DialogState.Error( - message = R.string.validation_field_required - .asText(R.string.name.asText()), + message = BitwardenString.validation_field_required + .asText(BitwardenString.name.asText()), ), ) } @@ -102,7 +102,7 @@ class FolderAddEditViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialog = FolderAddEditState.DialogState.Loading( - R.string.saving.asText(), + BitwardenString.saving.asText(), ), ) } @@ -147,7 +147,7 @@ class FolderAddEditViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialog = FolderAddEditState.DialogState.Loading( - R.string.deleting.asText(), + BitwardenString.deleting.asText(), ), ) } @@ -180,7 +180,7 @@ class FolderAddEditViewModel @Inject constructor( mutableStateFlow.update { it.copy( viewState = FolderAddEditState.ViewState.Error( - message = R.string.generic_error_message.asText(), + message = BitwardenString.generic_error_message.asText(), ), ) } @@ -197,7 +197,7 @@ class FolderAddEditViewModel @Inject constructor( ) } ?: FolderAddEditState.ViewState.Error( - message = R.string.generic_error_message.asText(), + message = BitwardenString.generic_error_message.asText(), ), ) } @@ -213,11 +213,11 @@ class FolderAddEditViewModel @Inject constructor( mutableStateFlow.update { it.copy( viewState = FolderAddEditState.ViewState.Error( - message = R.string.internet_connection_required_title + message = BitwardenString.internet_connection_required_title .asText() .concat( " ".asText(), - R.string.internet_connection_required_message.asText(), + BitwardenString.internet_connection_required_message.asText(), ), ), ) @@ -235,7 +235,7 @@ class FolderAddEditViewModel @Inject constructor( ) } ?: FolderAddEditState.ViewState.Error( - message = R.string.generic_error_message.asText(), + message = BitwardenString.generic_error_message.asText(), ), ) } @@ -255,7 +255,7 @@ class FolderAddEditViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialog = FolderAddEditState.DialogState.Error( - message = R.string.generic_error_message.asText(), + message = BitwardenString.generic_error_message.asText(), throwable = result.error, ), ) @@ -263,7 +263,7 @@ class FolderAddEditViewModel @Inject constructor( } is UpdateFolderResult.Success -> { - sendEvent(FolderAddEditEvent.ShowToast(R.string.folder_updated.asText())) + sendEvent(FolderAddEditEvent.ShowToast(BitwardenString.folder_updated.asText())) sendEvent(FolderAddEditEvent.NavigateBack) } } @@ -281,7 +281,7 @@ class FolderAddEditViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialog = FolderAddEditState.DialogState.Error( - message = R.string.generic_error_message.asText(), + message = BitwardenString.generic_error_message.asText(), throwable = result.error, ), ) @@ -289,7 +289,7 @@ class FolderAddEditViewModel @Inject constructor( } is CreateFolderResult.Success -> { - sendEvent(FolderAddEditEvent.ShowToast(R.string.folder_created.asText())) + sendEvent(FolderAddEditEvent.ShowToast(BitwardenString.folder_created.asText())) sendEvent(FolderAddEditEvent.NavigateBack) } } @@ -303,7 +303,7 @@ class FolderAddEditViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialog = FolderAddEditState.DialogState.Error( - message = R.string.generic_error_message.asText(), + message = BitwardenString.generic_error_message.asText(), throwable = result.error, ), ) @@ -312,7 +312,7 @@ class FolderAddEditViewModel @Inject constructor( DeleteFolderResult.Success -> { mutableStateFlow.update { it.copy(dialog = null) } - sendEvent(FolderAddEditEvent.ShowToast(R.string.folder_deleted.asText())) + sendEvent(FolderAddEditEvent.ShowToast(BitwardenString.folder_deleted.asText())) sendEvent(event = FolderAddEditEvent.NavigateBack) } } @@ -351,8 +351,8 @@ data class FolderAddEditState( */ val screenDisplayName: Text get() = when (folderAddEditType) { - FolderAddEditType.AddItem -> R.string.add_folder.asText() - is FolderAddEditType.EditItem -> R.string.edit_folder.asText() + FolderAddEditType.AddItem -> BitwardenString.add_folder.asText() + is FolderAddEditType.EditItem -> BitwardenString.edit_folder.asText() } /** diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/other/OtherScreen.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/other/OtherScreen.kt index d3dbe4af19..df4b8cf173 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/other/OtherScreen.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/other/OtherScreen.kt @@ -38,8 +38,8 @@ import com.bitwarden.ui.platform.components.model.CardStyle import com.bitwarden.ui.platform.components.toggle.BitwardenSwitch import com.bitwarden.ui.platform.components.util.rememberVectorPainter import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.platform.repository.model.ClearClipboardFrequency import com.x8bit.bitwarden.data.platform.repository.util.displayLabel import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenBasicDialog @@ -83,10 +83,10 @@ fun OtherScreen( .nestedScroll(scrollBehavior.nestedScrollConnection), topBar = { BitwardenTopAppBar( - title = stringResource(id = R.string.other), + title = stringResource(id = BitwardenString.other), scrollBehavior = scrollBehavior, navigationIcon = rememberVectorPainter(id = BitwardenDrawable.ic_back), - navigationIconContentDescription = stringResource(id = R.string.back), + navigationIconContentDescription = stringResource(id = BitwardenString.back), onNavigationIconClick = remember(viewModel) { { viewModel.trySendAction(OtherAction.BackClick) } }, @@ -131,8 +131,10 @@ private fun OtherContent( Spacer(modifier = Modifier.height(height = 12.dp)) if (!state.isPreAuth) { BitwardenSwitch( - label = stringResource(id = R.string.enable_sync_on_refresh), - supportingText = stringResource(id = R.string.enable_sync_on_refresh_description), + label = stringResource(id = BitwardenString.enable_sync_on_refresh), + supportingText = stringResource( + id = BitwardenString.enable_sync_on_refresh_description, + ), isChecked = state.allowSyncOnRefresh, onCheckedChange = onEnableSyncCheckChange, cardStyle = CardStyle.Full, @@ -146,7 +148,7 @@ private fun OtherContent( BitwardenOutlinedButton( onClick = onSyncClick, - label = stringResource(id = R.string.sync_now), + label = stringResource(id = BitwardenString.sync_now), modifier = Modifier .fillMaxWidth() .testTag(tag = "SyncNowButton") @@ -165,7 +167,7 @@ private fun OtherContent( horizontalArrangement = Arrangement.Start, ) { Text( - text = stringResource(id = R.string.last_sync), + text = stringResource(id = BitwardenString.last_sync), style = BitwardenTheme.typography.bodySmall, color = BitwardenTheme.colorScheme.text.secondary, modifier = Modifier.padding(end = 2.dp), @@ -214,7 +216,7 @@ private fun ScreenCaptureRow( var shouldShowScreenCaptureConfirmDialog by remember { mutableStateOf(false) } BitwardenSwitch( - label = stringResource(id = R.string.allow_screen_capture), + label = stringResource(id = BitwardenString.allow_screen_capture), isChecked = currentValue, onCheckedChange = { if (currentValue) { @@ -229,10 +231,12 @@ private fun ScreenCaptureRow( if (shouldShowScreenCaptureConfirmDialog) { BitwardenTwoButtonDialog( - title = stringResource(R.string.allow_screen_capture), - message = stringResource(R.string.are_you_sure_you_want_to_enable_screen_capture), - confirmButtonText = stringResource(R.string.yes), - dismissButtonText = stringResource(id = R.string.cancel), + title = stringResource(BitwardenString.allow_screen_capture), + message = stringResource( + BitwardenString.are_you_sure_you_want_to_enable_screen_capture, + ), + confirmButtonText = stringResource(BitwardenString.yes), + dismissButtonText = stringResource(id = BitwardenString.cancel), onConfirmClick = { onValueChange(true) shouldShowScreenCaptureConfirmDialog = false @@ -251,8 +255,8 @@ private fun ClearClipboardFrequencyRow( resources: Resources = LocalContext.current.resources, ) { BitwardenMultiSelectButton( - label = stringResource(id = R.string.clear_clipboard), - supportingText = stringResource(id = R.string.clear_clipboard_description), + label = stringResource(id = BitwardenString.clear_clipboard), + supportingText = stringResource(id = BitwardenString.clear_clipboard_description), options = ClearClipboardFrequency.entries.map { it.displayLabel() }.toImmutableList(), selectedOption = currentSelection.displayLabel(), onOptionSelected = { selectedFrequency -> diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/other/OtherViewModel.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/other/OtherViewModel.kt index 1120e2761a..73d2d0f4d6 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/other/OtherViewModel.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/other/OtherViewModel.kt @@ -5,9 +5,9 @@ import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.viewModelScope import com.bitwarden.core.data.util.toFormattedDateTimeStyle import com.bitwarden.ui.platform.base.BaseViewModel +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.platform.manager.network.NetworkConnectionManager import com.x8bit.bitwarden.data.platform.repository.SettingsRepository import com.x8bit.bitwarden.data.platform.repository.model.ClearClipboardFrequency @@ -114,15 +114,19 @@ class OtherViewModel @Inject constructor( private fun handleSyncNowButtonClicked() { if (networkConnectionManager.isNetworkConnected) { mutableStateFlow.update { - it.copy(dialogState = OtherState.DialogState.Loading(R.string.syncing.asText())) + it.copy( + dialogState = OtherState.DialogState.Loading( + BitwardenString.syncing.asText(), + ), + ) } vaultRepo.sync(forced = true) } else { mutableStateFlow.update { it.copy( dialogState = OtherState.DialogState.Error( - R.string.internet_connection_required_title.asText(), - R.string.internet_connection_required_message.asText(), + BitwardenString.internet_connection_required_title.asText(), + BitwardenString.internet_connection_required_message.asText(), ), ) } @@ -153,7 +157,7 @@ class OtherViewModel @Inject constructor( } private fun handleManualVaultSyncReceive() { - sendEvent(OtherEvent.ShowSnackbar(R.string.syncing_complete.asText())) + sendEvent(OtherEvent.ShowSnackbar(BitwardenString.syncing_complete.asText())) } } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/vault/VaultSettingsScreen.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/vault/VaultSettingsScreen.kt index e1c8e5e568..84a431f3e3 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/vault/VaultSettingsScreen.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/vault/VaultSettingsScreen.kt @@ -31,7 +31,7 @@ import com.bitwarden.ui.platform.components.badge.NotificationBadge import com.bitwarden.ui.platform.components.model.CardStyle import com.bitwarden.ui.platform.components.util.rememberVectorPainter import com.bitwarden.ui.platform.resource.BitwardenDrawable -import com.x8bit.bitwarden.R +import com.bitwarden.ui.platform.resource.BitwardenString import com.x8bit.bitwarden.ui.platform.components.card.BitwardenActionCard import com.x8bit.bitwarden.ui.platform.components.card.actionCardExitAnimation import com.x8bit.bitwarden.ui.platform.components.row.BitwardenExternalLinkRow @@ -83,10 +83,10 @@ fun VaultSettingsScreen( .nestedScroll(scrollBehavior.nestedScrollConnection), topBar = { BitwardenTopAppBar( - title = stringResource(id = R.string.vault), + title = stringResource(id = BitwardenString.vault), scrollBehavior = scrollBehavior, navigationIcon = rememberVectorPainter(id = BitwardenDrawable.ic_back), - navigationIconContentDescription = stringResource(id = R.string.back), + navigationIconContentDescription = stringResource(id = BitwardenString.back), onNavigationIconClick = remember(viewModel) { { viewModel.trySendAction(VaultSettingsAction.BackClick) } }, @@ -110,9 +110,9 @@ fun VaultSettingsScreen( exit = actionCardExitAnimation(), ) { BitwardenActionCard( - cardTitle = stringResource(id = R.string.import_saved_logins), - actionText = stringResource(R.string.get_started), - cardSubtitle = stringResource(R.string.use_a_computer_to_import_logins), + cardTitle = stringResource(id = BitwardenString.import_saved_logins), + actionText = stringResource(BitwardenString.get_started), + cardSubtitle = stringResource(BitwardenString.use_a_computer_to_import_logins), onActionClick = remember(viewModel) { { viewModel.trySendAction(VaultSettingsAction.ImportLoginsCardCtaClick) @@ -134,7 +134,7 @@ fun VaultSettingsScreen( ) } BitwardenTextRow( - text = stringResource(R.string.folders), + text = stringResource(BitwardenString.folders), onClick = remember(viewModel) { { viewModel.trySendAction(VaultSettingsAction.FoldersButtonClick) } }, @@ -147,7 +147,7 @@ fun VaultSettingsScreen( ) BitwardenTextRow( - text = stringResource(R.string.export_vault), + text = stringResource(BitwardenString.export_vault), onClick = remember(viewModel) { { viewModel.trySendAction(VaultSettingsAction.ExportVaultClick) } }, @@ -161,7 +161,7 @@ fun VaultSettingsScreen( if (state.isNewImportLoginsFlowEnabled) { BitwardenTextRow( - text = stringResource(R.string.import_items), + text = stringResource(BitwardenString.import_items), onClick = remember(viewModel) { { viewModel.trySendAction(VaultSettingsAction.ImportItemsClick) } }, @@ -174,14 +174,14 @@ fun VaultSettingsScreen( ) } else { BitwardenExternalLinkRow( - text = stringResource(R.string.import_items), + text = stringResource(BitwardenString.import_items), onConfirmClick = remember(viewModel) { { viewModel.trySendAction(VaultSettingsAction.ImportItemsClick) } }, withDivider = false, - dialogTitle = stringResource(id = R.string.continue_to_web_app), + dialogTitle = stringResource(id = BitwardenString.continue_to_web_app), dialogMessage = stringResource( - id = R.string.you_can_import_data_to_your_vault_on_x, + id = BitwardenString.you_can_import_data_to_your_vault_on_x, state.importUrl, ), cardStyle = CardStyle.Bottom, diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/vaultunlockednavbar/VaultUnlockedNavBarViewModel.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/vaultunlockednavbar/VaultUnlockedNavBarViewModel.kt index 8491e3d6cc..23c07c0203 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/vaultunlockednavbar/VaultUnlockedNavBarViewModel.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/vaultunlockednavbar/VaultUnlockedNavBarViewModel.kt @@ -4,7 +4,7 @@ import androidx.annotation.StringRes import androidx.lifecycle.viewModelScope import com.bitwarden.ui.platform.base.BackgroundEvent import com.bitwarden.ui.platform.base.BaseViewModel -import com.x8bit.bitwarden.R +import com.bitwarden.ui.platform.resource.BitwardenString import com.x8bit.bitwarden.data.auth.repository.AuthRepository import com.x8bit.bitwarden.data.auth.repository.model.UserState import com.x8bit.bitwarden.data.platform.manager.FirstTimeActionManager @@ -27,8 +27,8 @@ class VaultUnlockedNavBarViewModel @Inject constructor( firstTimeActionManager: FirstTimeActionManager, ) : BaseViewModel( initialState = VaultUnlockedNavBarState( - vaultNavBarLabelRes = R.string.my_vault, - vaultNavBarContentDescriptionRes = R.string.my_vault, + vaultNavBarLabelRes = BitwardenString.my_vault, + vaultNavBarContentDescriptionRes = BitwardenString.my_vault, notificationState = VaultUnlockedNavBarNotificationState( settingsTabNotificationCount = firstTimeActionManager.allSettingsBadgeCountFlow.value, ), @@ -163,7 +163,7 @@ class VaultUnlockedNavBarViewModel @Inject constructor( ?.organizations ?.isNotEmpty() ?: false - val vaultRes = if (hasOrganizations) R.string.vaults else R.string.my_vault + val vaultRes = if (hasOrganizations) BitwardenString.vaults else BitwardenString.my_vault mutableStateFlow.update { it.copy( vaultNavBarLabelRes = vaultRes, diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/vaultunlockednavbar/model/VaultUnlockedNavBarTab.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/vaultunlockednavbar/model/VaultUnlockedNavBarTab.kt index 34028e1389..b2cc1be2d0 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/vaultunlockednavbar/model/VaultUnlockedNavBarTab.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/vaultunlockednavbar/model/VaultUnlockedNavBarTab.kt @@ -3,8 +3,8 @@ package com.x8bit.bitwarden.ui.platform.feature.vaultunlockednavbar.model import android.os.Parcelable import com.bitwarden.ui.platform.components.navigation.model.NavigationItem import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.util.toObjectNavigationRoute -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.platform.feature.settings.SettingsGraphRoute import com.x8bit.bitwarden.ui.platform.feature.settings.SettingsRoute import com.x8bit.bitwarden.ui.tools.feature.generator.GeneratorGraphRoute @@ -33,8 +33,8 @@ sealed class VaultUnlockedNavBarTab : NavigationItem, Parcelable { data object Generator : VaultUnlockedNavBarTab() { override val iconResSelected get() = BitwardenDrawable.ic_generator_filled override val iconRes get() = BitwardenDrawable.ic_generator - override val labelRes get() = R.string.generator - override val contentDescriptionRes get() = R.string.generator + override val labelRes get() = BitwardenString.generator + override val contentDescriptionRes get() = BitwardenString.generator override val graphRoute get() = GeneratorGraphRoute.toObjectNavigationRoute() override val startDestinationRoute get() = GeneratorRoute.Standard.toObjectNavigationRoute() override val testTag get() = "GeneratorTab" @@ -48,8 +48,8 @@ sealed class VaultUnlockedNavBarTab : NavigationItem, Parcelable { data object Send : VaultUnlockedNavBarTab() { override val iconResSelected get() = BitwardenDrawable.ic_send_filled override val iconRes get() = BitwardenDrawable.ic_send - override val labelRes get() = R.string.send - override val contentDescriptionRes get() = R.string.send + override val labelRes get() = BitwardenString.send + override val contentDescriptionRes get() = BitwardenString.send override val graphRoute get() = SendGraphRoute.toObjectNavigationRoute() override val startDestinationRoute get() = SendRoute.toObjectNavigationRoute() override val testTag get() = "SendTab" @@ -81,8 +81,8 @@ sealed class VaultUnlockedNavBarTab : NavigationItem, Parcelable { ) : VaultUnlockedNavBarTab() { override val iconResSelected get() = BitwardenDrawable.ic_settings_filled override val iconRes get() = BitwardenDrawable.ic_settings - override val labelRes get() = R.string.settings - override val contentDescriptionRes get() = R.string.settings + override val labelRes get() = BitwardenString.settings + override val contentDescriptionRes get() = BitwardenString.settings override val graphRoute get() = SettingsGraphRoute.toObjectNavigationRoute() override val startDestinationRoute get() = SettingsRoute.Standard.toObjectNavigationRoute() override val testTag get() = "SettingsTab" diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/manager/biometrics/BiometricsManagerImpl.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/manager/biometrics/BiometricsManagerImpl.kt index 89bca811df..0094e215ed 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/manager/biometrics/BiometricsManagerImpl.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/manager/biometrics/BiometricsManagerImpl.kt @@ -7,7 +7,7 @@ import androidx.biometric.BiometricPrompt import androidx.core.content.ContextCompat import androidx.fragment.app.FragmentActivity import com.bitwarden.annotation.OmitFromCoverage -import com.x8bit.bitwarden.R +import com.bitwarden.ui.platform.resource.BitwardenString import javax.crypto.Cipher /** @@ -137,15 +137,15 @@ class BiometricsManagerImpl( ) val promptInfoBuilder = BiometricPrompt.PromptInfo.Builder() - .setTitle(activity.getString(R.string.bitwarden)) + .setTitle(activity.getString(BitwardenString.bitwarden)) .setAllowedAuthenticators(Authenticators.BIOMETRIC_STRONG) cipher ?.let { promptInfoBuilder - .setDescription(activity.getString(R.string.biometrics_direction)) + .setDescription(activity.getString(BitwardenString.biometrics_direction)) .setAllowedAuthenticators(Authenticators.BIOMETRIC_STRONG) - .setNegativeButtonText(activity.getString(R.string.cancel)) + .setNegativeButtonText(activity.getString(BitwardenString.cancel)) .setConfirmationRequired(false) biometricPrompt.authenticate( promptInfoBuilder.build(), @@ -154,7 +154,7 @@ class BiometricsManagerImpl( } ?: run { promptInfoBuilder - .setDescription(activity.getString(R.string.user_verification_direction)) + .setDescription(activity.getString(BitwardenString.user_verification_direction)) .setAllowedAuthenticators( Authenticators.BIOMETRIC_STRONG or Authenticators.DEVICE_CREDENTIAL, ) diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/manager/intent/IntentManagerImpl.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/manager/intent/IntentManagerImpl.kt index 52b2b4cc94..1bfa404330 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/manager/intent/IntentManagerImpl.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/manager/intent/IntentManagerImpl.kt @@ -26,9 +26,9 @@ import androidx.credentials.CredentialManager import com.bitwarden.annotation.OmitFromCoverage import com.bitwarden.core.data.util.toFormattedPattern import com.bitwarden.core.util.isBuildVersionAtLeast +import com.bitwarden.ui.platform.resource.BitwardenString import com.x8bit.bitwarden.BuildConfig import com.x8bit.bitwarden.MainActivity -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.autofill.model.browser.BrowserPackage import com.x8bit.bitwarden.data.autofill.util.toPendingIntentMutabilityFlag import java.io.File @@ -251,7 +251,7 @@ class IntentManagerImpl( Intent(Intent.ACTION_OPEN_DOCUMENT) .addCategory(Intent.CATEGORY_OPENABLE) .setType("*/*"), - ContextCompat.getString(context, R.string.file_source), + ContextCompat.getString(context, BitwardenString.file_source), ) if (withCameraIntents) { diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/util/AppThemeExtensions.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/util/AppThemeExtensions.kt index 4f1c0c6346..4b23e8b632 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/util/AppThemeExtensions.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/util/AppThemeExtensions.kt @@ -1,16 +1,16 @@ package com.x8bit.bitwarden.ui.platform.util import com.bitwarden.ui.platform.feature.settings.appearance.model.AppTheme +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R /** * Returns a human-readable display label for the given [AppTheme]. */ val AppTheme.displayLabel: Text get() = when (this) { - AppTheme.DEFAULT -> R.string.default_system.asText() - AppTheme.DARK -> R.string.dark.asText() - AppTheme.LIGHT -> R.string.light.asText() + AppTheme.DEFAULT -> BitwardenString.default_system.asText() + AppTheme.DARK -> BitwardenString.dark.asText() + AppTheme.LIGHT -> BitwardenString.light.asText() } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/util/EnvironmentExtensions.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/util/EnvironmentExtensions.kt index 433b9b7718..87a78fcfe0 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/util/EnvironmentExtensions.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/util/EnvironmentExtensions.kt @@ -1,9 +1,9 @@ package com.x8bit.bitwarden.ui.platform.util import com.bitwarden.data.repository.model.Environment +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R /** * Returns a human-readable display label for the given [Environment.Type]. @@ -12,5 +12,5 @@ val Environment.Type.displayLabel: Text get() = when (this) { Environment.Type.US -> Environment.Us.label.asText() Environment.Type.EU -> Environment.Eu.label.asText() - Environment.Type.SELF_HOSTED -> R.string.self_hosted.asText() + Environment.Type.SELF_HOSTED -> BitwardenString.self_hosted.asText() } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/util/ExportVaultFormatExtensions.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/util/ExportVaultFormatExtensions.kt index 0b2b5a8861..37e5149c14 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/util/ExportVaultFormatExtensions.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/util/ExportVaultFormatExtensions.kt @@ -1,8 +1,8 @@ package com.x8bit.bitwarden.ui.platform.util +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.platform.feature.settings.exportvault.model.ExportVaultFormat /** @@ -10,10 +10,10 @@ import com.x8bit.bitwarden.ui.platform.feature.settings.exportvault.model.Export */ val ExportVaultFormat.displayLabel: Text get() = when (this) { - ExportVaultFormat.JSON -> R.string.json_extension.asText() - ExportVaultFormat.CSV -> R.string.csv_extension.asText() - ExportVaultFormat.JSON_ENCRYPTED -> R.string.json_extension_formatted.asText( - R.string.password_protected.asText(), + ExportVaultFormat.JSON -> BitwardenString.json_extension.asText() + ExportVaultFormat.CSV -> BitwardenString.csv_extension.asText() + ExportVaultFormat.JSON_ENCRYPTED -> BitwardenString.json_extension_formatted.asText( + BitwardenString.password_protected.asText(), ) } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/util/VaultTimeoutActionExtensions.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/util/VaultTimeoutActionExtensions.kt index f5a8ff0d1f..902c11b3b1 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/util/VaultTimeoutActionExtensions.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/util/VaultTimeoutActionExtensions.kt @@ -1,8 +1,8 @@ package com.x8bit.bitwarden.ui.platform.util +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.platform.repository.model.VaultTimeoutAction /** @@ -10,7 +10,7 @@ import com.x8bit.bitwarden.data.platform.repository.model.VaultTimeoutAction */ val VaultTimeoutAction.displayLabel: Text get() = when (this) { - VaultTimeoutAction.LOCK -> R.string.lock - VaultTimeoutAction.LOGOUT -> R.string.log_out + VaultTimeoutAction.LOCK -> BitwardenString.lock + VaultTimeoutAction.LOGOUT -> BitwardenString.log_out } .asText() diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/util/VaultTimeoutExtensions.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/util/VaultTimeoutExtensions.kt index 237fcd24cc..85553c35fa 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/util/VaultTimeoutExtensions.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/util/VaultTimeoutExtensions.kt @@ -1,8 +1,8 @@ package com.x8bit.bitwarden.ui.platform.util +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.platform.repository.model.VaultTimeout /** @@ -10,16 +10,16 @@ import com.x8bit.bitwarden.data.platform.repository.model.VaultTimeout */ val VaultTimeout.Type.displayLabel: Text get() = when (this) { - VaultTimeout.Type.IMMEDIATELY -> R.string.immediately - VaultTimeout.Type.ONE_MINUTE -> R.string.one_minute - VaultTimeout.Type.FIVE_MINUTES -> R.string.five_minutes - VaultTimeout.Type.FIFTEEN_MINUTES -> R.string.fifteen_minutes - VaultTimeout.Type.THIRTY_MINUTES -> R.string.thirty_minutes - VaultTimeout.Type.ONE_HOUR -> R.string.one_hour - VaultTimeout.Type.FOUR_HOURS -> R.string.four_hours - VaultTimeout.Type.ON_APP_RESTART -> R.string.on_restart - VaultTimeout.Type.NEVER -> R.string.never - VaultTimeout.Type.CUSTOM -> R.string.custom + VaultTimeout.Type.IMMEDIATELY -> BitwardenString.immediately + VaultTimeout.Type.ONE_MINUTE -> BitwardenString.one_minute + VaultTimeout.Type.FIVE_MINUTES -> BitwardenString.five_minutes + VaultTimeout.Type.FIFTEEN_MINUTES -> BitwardenString.fifteen_minutes + VaultTimeout.Type.THIRTY_MINUTES -> BitwardenString.thirty_minutes + VaultTimeout.Type.ONE_HOUR -> BitwardenString.one_hour + VaultTimeout.Type.FOUR_HOURS -> BitwardenString.four_hours + VaultTimeout.Type.ON_APP_RESTART -> BitwardenString.on_restart + VaultTimeout.Type.NEVER -> BitwardenString.never + VaultTimeout.Type.CUSTOM -> BitwardenString.custom } .asText() diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/generator/GeneratorScreen.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/generator/GeneratorScreen.kt index 22f129e645..c15468023a 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/generator/GeneratorScreen.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/generator/GeneratorScreen.kt @@ -54,9 +54,9 @@ import com.bitwarden.ui.platform.components.model.TopAppBarDividerStyle import com.bitwarden.ui.platform.components.toggle.BitwardenSwitch import com.bitwarden.ui.platform.components.util.rememberVectorPainter import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.platform.manager.model.AppResumeScreenData import com.x8bit.bitwarden.data.platform.manager.util.AppResumeStateManager import com.x8bit.bitwarden.data.platform.manager.util.RegisterScreenDataOnLifecycleEffect @@ -306,15 +306,15 @@ private fun DefaultAppBar( modifier: Modifier = Modifier, ) { BitwardenMediumTopAppBar( - title = stringResource(id = R.string.generator), + title = stringResource(id = BitwardenString.generator), scrollBehavior = scrollBehavior, dividerStyle = TopAppBarDividerStyle.NONE, actions = { BitwardenOverflowActionItem( - contentDescription = stringResource(R.string.more), + contentDescription = stringResource(BitwardenString.more), menuItemDataList = persistentListOf( OverflowMenuItemData( - text = stringResource(id = R.string.password_history), + text = stringResource(id = BitwardenString.password_history), onClick = onPasswordHistoryClick, ), ), @@ -334,9 +334,9 @@ private fun ModalAppBar( modifier: Modifier = Modifier, ) { BitwardenTopAppBar( - title = stringResource(id = R.string.generator), + title = stringResource(id = BitwardenString.generator), navigationIcon = rememberVectorPainter(id = BitwardenDrawable.ic_close), - navigationIconContentDescription = stringResource(id = R.string.close), + navigationIconContentDescription = stringResource(id = BitwardenString.close), onNavigationIconClick = onCloseClick, scrollBehavior = scrollBehavior, dividerStyle = when (generatorMode) { @@ -345,7 +345,7 @@ private fun ModalAppBar( }, actions = { BitwardenTextButton( - label = stringResource(id = R.string.save), + label = stringResource(id = BitwardenString.save), onClick = onSaveClick, modifier = Modifier.testTag("SaveButton"), ) @@ -392,7 +392,7 @@ private fun CoachMarkScope.ScrollContent( if (state.isUnderPolicy) { item { BitwardenInfoCalloutCard( - text = stringResource(id = R.string.password_generator_policy_in_effect), + text = stringResource(id = BitwardenString.password_generator_policy_in_effect), modifier = Modifier .testTag("PasswordGeneratorPolicyInEffectLabel") .standardHorizontalMargin() @@ -407,11 +407,11 @@ private fun CoachMarkScope.ScrollContent( item { @Suppress("MaxLineLength") BitwardenActionCard( - cardTitle = stringResource(R.string.explore_the_generator), + cardTitle = stringResource(BitwardenString.explore_the_generator), cardSubtitle = stringResource( - R.string.learn_more_about_generating_secure_login_credentials_with_guided_tour, + BitwardenString.learn_more_about_generating_secure_login_credentials_with_guided_tour, ), - actionText = stringResource(R.string.get_started), + actionText = stringResource(BitwardenString.get_started), onActionClick = passwordHandlers.onGeneratorActionCardClicked, onDismissClick = passwordHandlers.onGeneratorActionCardDismissed, modifier = Modifier @@ -440,29 +440,28 @@ private fun CoachMarkScope.ScrollContent( @Suppress("MaxLineLength") coachMarkHighlightItem( key = ExploreGeneratorCoachMark.COPY_PASSWORD_BUTTON, - title = R.string.coachmark_6_of_6.asText(), - description = R - .string + title = BitwardenString.coachmark_6_of_6.asText(), + description = BitwardenString .after_you_save_your_new_password_to_bitwarden_don_t_forget_to_update_it_on_your_account_website .asText(), shape = CoachMarkHighlightShape.RoundedRectangle(radius = 50f), onDismiss = onDismissCoachMark, leftAction = { CoachMarkActionText( - actionLabel = stringResource(R.string.back), + actionLabel = stringResource(BitwardenString.back), onActionClick = onShowPreviousCoachMark, ) }, rightAction = { CoachMarkActionText( - actionLabel = stringResource(R.string.done_text), + actionLabel = stringResource(BitwardenString.done_text), onActionClick = onCoachMarkComplete, ) }, modifier = Modifier.standardHorizontalMargin(windowAdaptiveInfo = windowAdaptiveInfo), ) { BitwardenFilledButton( - label = stringResource(id = R.string.copy), + label = stringResource(id = BitwardenString.copy), onClick = onCopyClick, modifier = Modifier .testTag(tag = "CopyValueButton") @@ -487,21 +486,20 @@ private fun CoachMarkScope.ScrollContent( is GeneratorState.MainType.Password -> { coachMarkHighlightItem( key = ExploreGeneratorCoachMark.PASSWORD_OPTIONS, - title = R.string.coachmark_4_of_6.asText(), - description = R - .string + title = BitwardenString.coachmark_4_of_6.asText(), + description = BitwardenString .use_these_options_to_adjust_your_password_to_your_account_requirements .asText(), onDismiss = onDismissCoachMark, leftAction = { CoachMarkActionText( - actionLabel = stringResource(R.string.back), + actionLabel = stringResource(BitwardenString.back), onActionClick = onShowPreviousCoachMark, ) }, rightAction = { CoachMarkActionText( - actionLabel = stringResource(R.string.next), + actionLabel = stringResource(BitwardenString.next), onActionClick = onShowNextCoachMark, ) }, @@ -558,28 +556,28 @@ private fun CoachMarkScope.GeneratedStringItem( actions = { CoachMarkHighlight( key = ExploreGeneratorCoachMark.GENERATE_BUTTON, - title = stringResource(R.string.coachmark_5_of_6), + title = stringResource(BitwardenString.coachmark_5_of_6), description = stringResource( - R.string.use_this_button_to_generate_a_new_unique_password, + BitwardenString.use_this_button_to_generate_a_new_unique_password, ), shape = CoachMarkHighlightShape.Oval, onDismiss = onDismissCoachMark, leftAction = { CoachMarkActionText( - actionLabel = stringResource(R.string.back), + actionLabel = stringResource(BitwardenString.back), onActionClick = onShowPreviousCoachMark, ) }, rightAction = { CoachMarkActionText( - actionLabel = stringResource(R.string.next), + actionLabel = stringResource(BitwardenString.next), onActionClick = onShowNextCoachMark, ) }, ) { BitwardenStandardIconButton( vectorIconRes = BitwardenDrawable.ic_generate, - contentDescription = stringResource(id = R.string.generate_password), + contentDescription = stringResource(id = BitwardenString.generate_password), onClick = onRegenerateClick, modifier = Modifier.testTag("RegenerateValueButton"), ) @@ -646,14 +644,14 @@ private fun CoachMarkScope.MainStateOptionsItem( 0 -> { CoachMarkHighlight( key = ExploreGeneratorCoachMark.PASSWORD_MODE, - title = stringResource(R.string.coachmark_1_of_6), + title = stringResource(BitwardenString.coachmark_1_of_6), description = stringResource( - R.string.use_the_generator_to_create_secure_passwords_passphrases_and_usernames, + BitwardenString.use_the_generator_to_create_secure_passwords_passphrases_and_usernames, ), onDismiss = onDismissCoachMark, rightAction = { CoachMarkActionText( - actionLabel = stringResource(R.string.next), + actionLabel = stringResource(BitwardenString.next), onActionClick = onShowNextCoachMark, ) }, @@ -672,20 +670,20 @@ private fun CoachMarkScope.MainStateOptionsItem( 1 -> { CoachMarkHighlight( key = ExploreGeneratorCoachMark.PASSPHRASE_MODE, - title = stringResource(R.string.coachmark_2_of_6), + title = stringResource(BitwardenString.coachmark_2_of_6), description = stringResource( - R.string.passphrases_are_strong_passwords_that_are_often_easier_to_remember_and_type_than_random_passwords, + BitwardenString.passphrases_are_strong_passwords_that_are_often_easier_to_remember_and_type_than_random_passwords, ), onDismiss = onDismissCoachMark, rightAction = { CoachMarkActionText( - actionLabel = stringResource(R.string.next), + actionLabel = stringResource(BitwardenString.next), onActionClick = onShowNextCoachMark, ) }, leftAction = { CoachMarkActionText( - actionLabel = stringResource(R.string.back), + actionLabel = stringResource(BitwardenString.back), onActionClick = onShowPreviousCoachMark, ) }, @@ -703,20 +701,20 @@ private fun CoachMarkScope.MainStateOptionsItem( 2 -> { CoachMarkHighlight( key = ExploreGeneratorCoachMark.USERNAME_MODE, - title = stringResource(R.string.coachmark_3_of_6), + title = stringResource(BitwardenString.coachmark_3_of_6), description = stringResource( - R.string.unique_usernames_add_an_extra_layer_of_security_and_can_help_prevent_hackers_from_finding_your_accounts, + BitwardenString.unique_usernames_add_an_extra_layer_of_security_and_can_help_prevent_hackers_from_finding_your_accounts, ), onDismiss = onDismissCoachMark, rightAction = { CoachMarkActionText( - actionLabel = stringResource(R.string.next), + actionLabel = stringResource(BitwardenString.next), onActionClick = onShowNextCoachMark, ) }, leftAction = { CoachMarkActionText( - actionLabel = stringResource(R.string.back), + actionLabel = stringResource(BitwardenString.back), onActionClick = onShowPreviousCoachMark, ) }, @@ -850,7 +848,7 @@ private fun PasswordCapitalLettersToggleItem( ) { BitwardenSwitch( label = "A—Z", - contentDescription = stringResource(id = R.string.uppercase_ato_z), + contentDescription = stringResource(id = BitwardenString.uppercase_ato_z), isChecked = useCapitals, onCheckedChange = onPasswordToggleCapitalLettersChange, enabled = enabled, @@ -868,7 +866,7 @@ private fun PasswordLowercaseLettersToggleItem( ) { BitwardenSwitch( label = "a—z", - contentDescription = stringResource(id = R.string.lowercase_ato_z), + contentDescription = stringResource(id = BitwardenString.lowercase_ato_z), isChecked = useLowercase, onCheckedChange = onPasswordToggleLowercaseLettersChange, enabled = enabled, @@ -886,7 +884,7 @@ private fun PasswordNumbersToggleItem( ) { BitwardenSwitch( label = "0-9", - contentDescription = stringResource(id = R.string.numbers_zero_to_nine), + contentDescription = stringResource(id = BitwardenString.numbers_zero_to_nine), isChecked = useNumbers, onCheckedChange = onPasswordToggleNumbersChange, enabled = enabled, @@ -904,7 +902,7 @@ private fun PasswordSpecialCharactersToggleItem( ) { BitwardenSwitch( label = "!@#$%^&*", - contentDescription = stringResource(id = R.string.special_characters), + contentDescription = stringResource(id = BitwardenString.special_characters), isChecked = useSpecialChars, onCheckedChange = onPasswordToggleSpecialCharactersChange, enabled = enabled, @@ -922,7 +920,7 @@ private fun PasswordMinNumbersCounterItem( modifier: Modifier = Modifier, ) { BitwardenStepper( - label = stringResource(id = R.string.min_numbers), + label = stringResource(id = BitwardenString.min_numbers), value = minNumbers.coerceIn(minValue, maxValue), range = minValue..maxValue, onValueChange = onPasswordMinNumbersCounterChange, @@ -940,7 +938,7 @@ private fun PasswordMinSpecialCharactersCounterItem( modifier: Modifier = Modifier, ) { BitwardenStepper( - label = stringResource(id = R.string.min_special), + label = stringResource(id = BitwardenString.min_special), value = minSpecial.coerceIn(minValue, maxValue), range = minValue..maxValue, onValueChange = onPasswordMinSpecialCharactersChange, @@ -957,7 +955,7 @@ private fun PasswordAvoidAmbiguousCharsToggleItem( enabled: Boolean = true, ) { BitwardenSwitch( - label = stringResource(id = R.string.avoid_ambiguous_characters), + label = stringResource(id = BitwardenString.avoid_ambiguous_characters), isChecked = avoidAmbiguousChars, enabled = enabled, onCheckedChange = onPasswordToggleAvoidAmbiguousCharsChange, @@ -1030,7 +1028,7 @@ private fun PassphraseNumWordsCounterItem( maxValue: Int = PASSPHRASE_MAX_NUMBER_OF_WORDS, ) { BitwardenStepper( - label = stringResource(id = R.string.number_of_words), + label = stringResource(id = BitwardenString.number_of_words), value = numWords.coerceIn(minimumValue = minValue, maximumValue = maxValue), range = minValue..maxValue, onValueChange = onPassphraseNumWordsCounterChange, @@ -1046,7 +1044,7 @@ private fun PassphraseWordSeparatorInputItem( modifier: Modifier = Modifier, ) { BitwardenTextField( - label = stringResource(id = R.string.word_separator), + label = stringResource(id = BitwardenString.word_separator), value = wordSeparator?.toString().orEmpty(), onValueChange = { // When onValueChange triggers and we don't update the value for whatever reason, @@ -1071,7 +1069,7 @@ private fun PassphraseCapitalizeToggleItem( enabled: Boolean = true, ) { BitwardenSwitch( - label = stringResource(id = R.string.capitalize), + label = stringResource(id = BitwardenString.capitalize), isChecked = capitalize, onCheckedChange = onPassphraseCapitalizeToggleChange, enabled = enabled, @@ -1088,7 +1086,7 @@ private fun PassphraseIncludeNumberToggleItem( modifier: Modifier = Modifier, ) { BitwardenSwitch( - label = stringResource(id = R.string.include_number), + label = stringResource(id = BitwardenString.include_number), isChecked = includeNumber, enabled = enabled, onCheckedChange = onPassphraseIncludeNumberToggleChange, @@ -1170,7 +1168,7 @@ private fun UsernameOptionsItem( val optionsWithStrings = possibleSubStates.associateWith { stringResource(id = it.labelRes) } BitwardenMultiSelectButton( - label = stringResource(id = R.string.username_type), + label = stringResource(id = BitwardenString.username_type), options = optionsWithStrings.values.toImmutableList(), selectedOption = stringResource(id = currentSubState.selectedType.displayStringResId), onOptionSelected = { selectedOption -> @@ -1183,7 +1181,7 @@ private fun UsernameOptionsItem( }, tooltip = TooltipData( onClick = usernameTypeHandlers.onUsernameTooltipClicked, - contentDescription = stringResource(id = R.string.learn_more), + contentDescription = stringResource(id = BitwardenString.learn_more), ), cardStyle = CardStyle.Full, modifier = modifier.testTag(tag = "UsernameTypePicker"), @@ -1219,7 +1217,9 @@ private fun ForwardedEmailAliasTypeContent( when (usernameTypeState.selectedServiceType) { is ServiceType.AddyIo -> { BitwardenPasswordField( - label = stringResource(id = R.string.api_access_token_required_parenthesis), + label = stringResource( + id = BitwardenString.api_access_token_required_parenthesis, + ), value = usernameTypeState.selectedServiceType.apiAccessToken, onValueChange = forwardedEmailAliasHandlers.onAddyIoAccessTokenTextChange, showPasswordTestTag = "ShowForwardedEmailApiSecretButton", @@ -1233,7 +1233,7 @@ private fun ForwardedEmailAliasTypeContent( Spacer(modifier = Modifier.height(8.dp)) BitwardenTextField( - label = stringResource(id = R.string.domain_name_required_parenthesis), + label = stringResource(id = BitwardenString.domain_name_required_parenthesis), value = usernameTypeState.selectedServiceType.domainName, onValueChange = forwardedEmailAliasHandlers.onAddyIoDomainNameTextChange, textFieldTestTag = "AnonAddyDomainNameEntry", @@ -1247,7 +1247,7 @@ private fun ForwardedEmailAliasTypeContent( Spacer(modifier = Modifier.height(8.dp)) BitwardenTextField( - label = stringResource(id = R.string.self_host_server_url), + label = stringResource(id = BitwardenString.self_host_server_url), value = usernameTypeState.selectedServiceType.selfHostServerUrl, onValueChange = forwardedEmailAliasHandlers.onAddyIoSelfHostServerUrlChange, textFieldTestTag = "AnonAddySelfHostUrlEntry", @@ -1261,7 +1261,7 @@ private fun ForwardedEmailAliasTypeContent( is ServiceType.DuckDuckGo -> { BitwardenPasswordField( - label = stringResource(id = R.string.api_key_required_parenthesis), + label = stringResource(id = BitwardenString.api_key_required_parenthesis), value = usernameTypeState.selectedServiceType.apiKey, onValueChange = forwardedEmailAliasHandlers.onDuckDuckGoApiKeyTextChange, showPasswordTestTag = "ShowForwardedEmailApiSecretButton", @@ -1275,7 +1275,7 @@ private fun ForwardedEmailAliasTypeContent( is ServiceType.FastMail -> { BitwardenPasswordField( - label = stringResource(id = R.string.api_key_required_parenthesis), + label = stringResource(id = BitwardenString.api_key_required_parenthesis), value = usernameTypeState.selectedServiceType.apiKey, onValueChange = forwardedEmailAliasHandlers.onFastMailApiKeyTextChange, showPasswordTestTag = "ShowForwardedEmailApiSecretButton", @@ -1289,7 +1289,9 @@ private fun ForwardedEmailAliasTypeContent( is ServiceType.FirefoxRelay -> { BitwardenPasswordField( - label = stringResource(id = R.string.api_access_token_required_parenthesis), + label = stringResource( + id = BitwardenString.api_access_token_required_parenthesis, + ), value = usernameTypeState.selectedServiceType.apiAccessToken, onValueChange = forwardedEmailAliasHandlers.onFirefoxRelayAccessTokenTextChange, showPasswordTestTag = "ShowForwardedEmailApiSecretButton", @@ -1303,7 +1305,7 @@ private fun ForwardedEmailAliasTypeContent( is ServiceType.ForwardEmail -> { BitwardenPasswordField( - label = stringResource(id = R.string.api_key_required_parenthesis), + label = stringResource(id = BitwardenString.api_key_required_parenthesis), value = usernameTypeState.selectedServiceType.apiKey, onValueChange = forwardedEmailAliasHandlers.onForwardEmailApiKeyTextChange, showPasswordTestTag = "ShowForwardedEmailApiSecretButton", @@ -1317,7 +1319,7 @@ private fun ForwardedEmailAliasTypeContent( Spacer(modifier = Modifier.height(8.dp)) BitwardenTextField( - label = stringResource(id = R.string.domain_name_required_parenthesis), + label = stringResource(id = BitwardenString.domain_name_required_parenthesis), value = usernameTypeState.selectedServiceType.domainName, onValueChange = forwardedEmailAliasHandlers.onForwardEmailDomainNameTextChange, textFieldTestTag = "ForwardedEmailDomainNameEntry", @@ -1330,7 +1332,7 @@ private fun ForwardedEmailAliasTypeContent( is ServiceType.SimpleLogin -> { BitwardenPasswordField( - label = stringResource(id = R.string.api_key_required_parenthesis), + label = stringResource(id = BitwardenString.api_key_required_parenthesis), value = usernameTypeState.selectedServiceType.apiKey, onValueChange = forwardedEmailAliasHandlers.onSimpleLoginApiKeyTextChange, showPasswordTestTag = "ShowForwardedEmailApiSecretButton", @@ -1345,7 +1347,7 @@ private fun ForwardedEmailAliasTypeContent( Spacer(modifier = Modifier.height(8.dp)) BitwardenTextField( - label = stringResource(id = R.string.self_host_server_url), + label = stringResource(id = BitwardenString.self_host_server_url), value = usernameTypeState.selectedServiceType.selfHostServerUrl, onValueChange = forwardedEmailAliasHandlers.onSimpleLoginSelfHostServerUrlChange, @@ -1386,7 +1388,7 @@ private fun ServiceTypeOptionsItem( val optionsWithStrings = possibleSubStates.associateWith { stringResource(id = it.labelRes) } BitwardenMultiSelectButton( - label = stringResource(id = R.string.service), + label = stringResource(id = BitwardenString.service), options = optionsWithStrings.values.toImmutableList(), selectedOption = (currentSubState.selectedServiceType?.displayStringResId)?.let { stringResource(id = it) @@ -1429,7 +1431,7 @@ private fun PlusAddressedEmailTextInputItem( modifier: Modifier = Modifier, ) { BitwardenTextField( - label = stringResource(id = R.string.email_required_parenthesis), + label = stringResource(id = BitwardenString.email_required_parenthesis), value = email, onValueChange = onPlusAddressedEmailTextChange, textFieldTestTag = "PlusAddressedEmailEntry", @@ -1468,7 +1470,7 @@ private fun CatchAllEmailTextInputItem( modifier: Modifier = Modifier, ) { BitwardenTextField( - label = stringResource(id = R.string.domain_name_required_parenthesis), + label = stringResource(id = BitwardenString.domain_name_required_parenthesis), value = domain, onValueChange = onDomainTextChange, textFieldTestTag = "CatchAllEmailDomainEntry", @@ -1515,7 +1517,7 @@ private fun RandomWordCapitalizeToggleItem( modifier: Modifier = Modifier, ) { BitwardenSwitch( - label = stringResource(id = R.string.capitalize), + label = stringResource(id = BitwardenString.capitalize), isChecked = capitalize, onCheckedChange = onRandomWordCapitalizeToggleChange, cardStyle = CardStyle.Top(), @@ -1530,7 +1532,7 @@ private fun RandomWordIncludeNumberToggleItem( modifier: Modifier = Modifier, ) { BitwardenSwitch( - label = stringResource(id = R.string.include_number), + label = stringResource(id = BitwardenString.include_number), isChecked = includeNumber, onCheckedChange = onRandomWordIncludeNumberToggleChange, cardStyle = CardStyle.Bottom, diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/generator/GeneratorViewModel.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/generator/GeneratorViewModel.kt index 9b35b6ebf1..2c6a24a2e0 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/generator/GeneratorViewModel.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/generator/GeneratorViewModel.kt @@ -11,9 +11,9 @@ import com.bitwarden.generators.PasswordGeneratorRequest import com.bitwarden.generators.UsernameGeneratorRequest import com.bitwarden.ui.platform.base.BaseViewModel import com.bitwarden.ui.platform.base.util.orNullIfBlank +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.auth.repository.AuthRepository import com.x8bit.bitwarden.data.auth.repository.model.PolicyInformation import com.x8bit.bitwarden.data.platform.manager.FeatureFlagManager @@ -741,7 +741,11 @@ class GeneratorViewModel @Inject constructor( } is GeneratedPasswordResult.InvalidRequest -> { - sendEvent(GeneratorEvent.ShowSnackbar(R.string.an_error_has_occurred.asText())) + sendEvent( + GeneratorEvent.ShowSnackbar( + BitwardenString.an_error_has_occurred.asText(), + ), + ) } } } @@ -757,7 +761,11 @@ class GeneratorViewModel @Inject constructor( } is GeneratedPassphraseResult.InvalidRequest -> { - sendEvent(GeneratorEvent.ShowSnackbar(R.string.an_error_has_occurred.asText())) + sendEvent( + GeneratorEvent.ShowSnackbar( + BitwardenString.an_error_has_occurred.asText(), + ), + ) } } } @@ -773,7 +781,11 @@ class GeneratorViewModel @Inject constructor( } is GeneratedPlusAddressedUsernameResult.InvalidRequest -> { - sendEvent(GeneratorEvent.ShowSnackbar(R.string.an_error_has_occurred.asText())) + sendEvent( + GeneratorEvent.ShowSnackbar( + BitwardenString.an_error_has_occurred.asText(), + ), + ) } } } @@ -789,7 +801,11 @@ class GeneratorViewModel @Inject constructor( } is GeneratedCatchAllUsernameResult.InvalidRequest -> { - sendEvent(GeneratorEvent.ShowSnackbar(R.string.an_error_has_occurred.asText())) + sendEvent( + GeneratorEvent.ShowSnackbar( + BitwardenString.an_error_has_occurred.asText(), + ), + ) } } } @@ -805,7 +821,8 @@ class GeneratorViewModel @Inject constructor( } is GeneratedRandomWordUsernameResult.InvalidRequest -> { - sendEvent(GeneratorEvent.ShowSnackbar(R.string.an_error_has_occurred.asText())) + sendEvent(GeneratorEvent.ShowSnackbar( + BitwardenString.an_error_has_occurred.asText())) } } } @@ -824,7 +841,7 @@ class GeneratorViewModel @Inject constructor( sendEvent( GeneratorEvent.ShowSnackbar( message = result.message?.asText() - ?: R.string.an_error_has_occurred.asText(), + ?: BitwardenString.an_error_has_occurred.asText(), ), ) } @@ -1612,7 +1629,8 @@ class GeneratorViewModel @Inject constructor( if (allowErrorsWhenMissingValues) { sendEvent( event = GeneratorEvent.ShowSnackbar( - message = R.string.validation_field_required.asText(request.fieldName), + message = BitwardenString.validation_field_required + .asText(request.fieldName), ), ) } @@ -1648,8 +1666,8 @@ class GeneratorViewModel @Inject constructor( if (allowErrorsWhenMissingValues) { sendEvent( event = GeneratorEvent.ShowSnackbar( - message = R.string.validation_field_required.asText( - R.string.domain_name.asText(), + message = BitwardenString.validation_field_required.asText( + BitwardenString.domain_name.asText(), ), ), ) @@ -1970,9 +1988,9 @@ data class GeneratorState( val labelRes: Int, val testTag: String, ) { - PASSWORD(labelRes = R.string.password, testTag = "password_option"), - PASSPHRASE(labelRes = R.string.passphrase, testTag = "passphrase_option"), - USERNAME(labelRes = R.string.username, testTag = "username_option"), + PASSWORD(labelRes = BitwardenString.password, testTag = "password_option"), + PASSPHRASE(labelRes = BitwardenString.passphrase, testTag = "passphrase_option"), + USERNAME(labelRes = BitwardenString.username, testTag = "username_option"), } /** @@ -2125,10 +2143,10 @@ data class GeneratorState( * @property labelRes The ID of the string that represents the label for each type. */ enum class UsernameTypeOption(val labelRes: Int) { - PLUS_ADDRESSED_EMAIL(R.string.plus_addressed_email), - CATCH_ALL_EMAIL(R.string.catch_all_email), - FORWARDED_EMAIL_ALIAS(R.string.forwarded_email_alias), - RANDOM_WORD(R.string.random_word), + PLUS_ADDRESSED_EMAIL(BitwardenString.plus_addressed_email), + CATCH_ALL_EMAIL(BitwardenString.catch_all_email), + FORWARDED_EMAIL_ALIAS(BitwardenString.forwarded_email_alias), + RANDOM_WORD(BitwardenString.random_word), } /** @@ -2163,7 +2181,7 @@ data class GeneratorState( get() = UsernameTypeOption.PLUS_ADDRESSED_EMAIL.labelRes override val supportingStringResId: Int - get() = R.string.plus_addressed_email_description + get() = BitwardenString.plus_addressed_email_description } /** @@ -2180,7 +2198,7 @@ data class GeneratorState( get() = UsernameTypeOption.CATCH_ALL_EMAIL.labelRes override val supportingStringResId: Int - get() = R.string.catch_all_email_description + get() = BitwardenString.catch_all_email_description } /** @@ -2217,7 +2235,7 @@ data class GeneratorState( get() = UsernameTypeOption.FORWARDED_EMAIL_ALIAS.labelRes override val supportingStringResId: Int - get() = R.string.forwarded_email_description + get() = BitwardenString.forwarded_email_description /** * Enum representing the types of services, @@ -2227,12 +2245,12 @@ data class GeneratorState( * the label for each type. */ enum class ServiceTypeOption(val labelRes: Int) { - ADDY_IO(R.string.addy_io), - DUCK_DUCK_GO(R.string.duck_duck_go), - FAST_MAIL(R.string.fastmail), - FIREFOX_RELAY(R.string.firefox_relay), - FORWARD_EMAIL(R.string.forward_email), - SIMPLE_LOGIN(R.string.simple_login), + ADDY_IO(BitwardenString.addy_io), + DUCK_DUCK_GO(BitwardenString.duck_duck_go), + FAST_MAIL(BitwardenString.fastmail), + FIREFOX_RELAY(BitwardenString.firefox_relay), + FORWARD_EMAIL(BitwardenString.forward_email), + SIMPLE_LOGIN(BitwardenString.simple_login), } /** diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/generator/passwordhistory/PasswordHistoryListItem.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/generator/passwordhistory/PasswordHistoryListItem.kt index 8e3dc93546..8cf3aac95e 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/generator/passwordhistory/PasswordHistoryListItem.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/generator/passwordhistory/PasswordHistoryListItem.kt @@ -23,8 +23,8 @@ import com.bitwarden.ui.platform.base.util.withVisualTransformation import com.bitwarden.ui.platform.components.button.BitwardenStandardIconButton import com.bitwarden.ui.platform.components.model.CardStyle import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.platform.components.util.nonLetterColorVisualTransformation /** @@ -81,7 +81,7 @@ fun PasswordHistoryListItem( BitwardenStandardIconButton( vectorIconRes = BitwardenDrawable.ic_copy, - contentDescription = stringResource(id = R.string.copy), + contentDescription = stringResource(id = BitwardenString.copy), onClick = onCopyClick, contentColor = BitwardenTheme.colorScheme.icon.primary, modifier = Modifier.testTag(tag = "CopyPasswordValueButton"), diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/generator/passwordhistory/PasswordHistoryScreen.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/generator/passwordhistory/PasswordHistoryScreen.kt index d62d76e58b..758b3c40da 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/generator/passwordhistory/PasswordHistoryScreen.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/generator/passwordhistory/PasswordHistoryScreen.kt @@ -33,8 +33,8 @@ import com.bitwarden.ui.platform.components.appbar.action.BitwardenOverflowActio import com.bitwarden.ui.platform.components.appbar.model.OverflowMenuItemData import com.bitwarden.ui.platform.components.util.rememberVectorPainter import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.platform.components.indicator.BitwardenCircularProgressIndicator import com.x8bit.bitwarden.ui.platform.components.scaffold.BitwardenScaffold import kotlinx.collections.immutable.persistentListOf @@ -63,20 +63,20 @@ fun PasswordHistoryScreen( .nestedScroll(scrollBehavior.nestedScrollConnection), topBar = { BitwardenTopAppBar( - title = stringResource(id = R.string.password_history), + title = stringResource(id = BitwardenString.password_history), scrollBehavior = scrollBehavior, navigationIcon = rememberVectorPainter(id = BitwardenDrawable.ic_back), - navigationIconContentDescription = stringResource(id = R.string.back), + navigationIconContentDescription = stringResource(id = BitwardenString.back), onNavigationIconClick = remember(viewModel) { { viewModel.trySendAction(PasswordHistoryAction.CloseClick) } }, actions = { if (state.menuEnabled) { BitwardenOverflowActionItem( - contentDescription = stringResource(R.string.more), + contentDescription = stringResource(BitwardenString.more), menuItemDataList = persistentListOf( OverflowMenuItemData( - text = stringResource(id = R.string.clear), + text = stringResource(id = BitwardenString.clear), onClick = remember(viewModel) { { viewModel.trySendAction( @@ -195,7 +195,7 @@ private fun PasswordHistoryEmpty(modifier: Modifier = Modifier) { ) { Text( modifier = Modifier.testTag("NoPasswordsDisplayedLabel"), - text = stringResource(id = R.string.no_passwords_to_list), + text = stringResource(id = BitwardenString.no_passwords_to_list), style = BitwardenTheme.typography.bodyMedium, ) Spacer(modifier = Modifier.navigationBarsPadding()) diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/generator/passwordhistory/PasswordHistoryViewModel.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/generator/passwordhistory/PasswordHistoryViewModel.kt index e201b6bf14..781e1e5c96 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/generator/passwordhistory/PasswordHistoryViewModel.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/generator/passwordhistory/PasswordHistoryViewModel.kt @@ -6,11 +6,11 @@ import androidx.lifecycle.viewModelScope import com.bitwarden.core.data.repository.model.DataState import com.bitwarden.core.data.util.toFormattedDateTimeStyle import com.bitwarden.ui.platform.base.BaseViewModel +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText import com.bitwarden.vault.CipherView import com.bitwarden.vault.PasswordHistoryView -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.platform.manager.clipboard.BitwardenClipboardManager import com.x8bit.bitwarden.data.platform.repository.model.LocalDataState import com.x8bit.bitwarden.data.tools.generator.repository.GeneratorRepository @@ -91,7 +91,7 @@ class PasswordHistoryViewModel @Inject constructor( is LocalDataState.Loading -> PasswordHistoryState.ViewState.Loading is LocalDataState.Error -> { - PasswordHistoryState.ViewState.Error(R.string.an_error_has_occurred.asText()) + PasswordHistoryState.ViewState.Error(BitwardenString.an_error_has_occurred.asText()) } is LocalDataState.Loaded -> state.data.toViewState() @@ -105,13 +105,13 @@ class PasswordHistoryViewModel @Inject constructor( private fun handleCipherDataReceive(action: PasswordHistoryAction.Internal.CipherDataReceive) { val newState: PasswordHistoryState.ViewState = when (action.state) { is DataState.Error -> { - PasswordHistoryState.ViewState.Error(R.string.an_error_has_occurred.asText()) + PasswordHistoryState.ViewState.Error(BitwardenString.an_error_has_occurred.asText()) } is DataState.Loaded -> action.state.data?.passwordHistory.toViewState() is DataState.Loading -> PasswordHistoryState.ViewState.Loading is DataState.NoNetwork -> { - PasswordHistoryState.ViewState.Error(R.string.an_error_has_occurred.asText()) + PasswordHistoryState.ViewState.Error(BitwardenString.an_error_has_occurred.asText()) } is DataState.Pending -> action.state.data?.passwordHistory.toViewState() @@ -134,7 +134,7 @@ class PasswordHistoryViewModel @Inject constructor( private fun handleCopyClick(password: GeneratedPassword) { clipboardManager.setText( text = password.password, - toastDescriptorOverride = R.string.password.asText(), + toastDescriptorOverride = BitwardenString.password.asText(), ) } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/generator/util/ServiceTypeExtensions.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/generator/util/ServiceTypeExtensions.kt index 962c8c4c41..b758c3dd43 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/generator/util/ServiceTypeExtensions.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/generator/util/ServiceTypeExtensions.kt @@ -4,9 +4,9 @@ import com.bitwarden.generators.ForwarderServiceType import com.bitwarden.generators.UsernameGeneratorRequest import com.bitwarden.ui.platform.base.util.orNullIfBlank import com.bitwarden.ui.platform.base.util.prefixHttpsIfNecessary +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.tools.feature.generator.GeneratorState.MainType.Username.UsernameType.ForwardedEmailAlias.ServiceType /** @@ -21,9 +21,11 @@ fun ServiceType.toUsernameGeneratorRequest( return when (this) { is ServiceType.AddyIo -> { val accessToken = this.apiAccessToken.orNullIfBlank() - ?: return GeneratorRequestResult.MissingField(R.string.api_access_token.asText()) + ?: return GeneratorRequestResult.MissingField( + BitwardenString.api_access_token.asText(), + ) val domain = this.domainName.orNullIfBlank() - ?: return GeneratorRequestResult.MissingField(R.string.domain_name.asText()) + ?: return GeneratorRequestResult.MissingField(BitwardenString.domain_name.asText()) val baseUrl = if (allowAddyIoSelfHostUrl && selfHostServerUrl.isNotBlank()) { selfHostServerUrl.prefixHttpsIfNecessary() } else { @@ -53,7 +55,7 @@ fun ServiceType.toUsernameGeneratorRequest( ), ) } - ?: GeneratorRequestResult.MissingField(R.string.api_key.asText()) + ?: GeneratorRequestResult.MissingField(BitwardenString.api_key.asText()) } is ServiceType.FirefoxRelay -> { @@ -68,7 +70,7 @@ fun ServiceType.toUsernameGeneratorRequest( ), ) } - ?: GeneratorRequestResult.MissingField(R.string.api_access_token.asText()) + ?: GeneratorRequestResult.MissingField(BitwardenString.api_access_token.asText()) } is ServiceType.FastMail -> { @@ -84,14 +86,14 @@ fun ServiceType.toUsernameGeneratorRequest( ), ) } - ?: GeneratorRequestResult.MissingField(R.string.api_key.asText()) + ?: GeneratorRequestResult.MissingField(BitwardenString.api_key.asText()) } is ServiceType.ForwardEmail -> { val apiKey = this.apiKey.orNullIfBlank() - ?: return GeneratorRequestResult.MissingField(R.string.api_key.asText()) + ?: return GeneratorRequestResult.MissingField(BitwardenString.api_key.asText()) val domainName = this.domainName.orNullIfBlank() - ?: return GeneratorRequestResult.MissingField(R.string.domain_name.asText()) + ?: return GeneratorRequestResult.MissingField(BitwardenString.domain_name.asText()) GeneratorRequestResult.Success( UsernameGeneratorRequest.Forwarded( service = ForwarderServiceType.ForwardEmail(apiKey, domainName), @@ -120,7 +122,7 @@ fun ServiceType.toUsernameGeneratorRequest( ), ) } - ?: GeneratorRequestResult.MissingField(R.string.api_key.asText()) + ?: GeneratorRequestResult.MissingField(BitwardenString.api_key.asText()) } } } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/SendContent.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/SendContent.kt index 3709ad4ded..4f6f23f455 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/SendContent.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/SendContent.kt @@ -18,7 +18,7 @@ import com.bitwarden.ui.platform.components.icon.model.IconData import com.bitwarden.ui.platform.components.model.CardStyle import com.bitwarden.ui.platform.components.util.rememberVectorPainter import com.bitwarden.ui.platform.resource.BitwardenDrawable -import com.x8bit.bitwarden.R +import com.bitwarden.ui.platform.resource.BitwardenString import com.x8bit.bitwarden.ui.platform.components.card.BitwardenInfoCalloutCard import com.x8bit.bitwarden.ui.platform.components.header.BitwardenListHeaderText import com.x8bit.bitwarden.ui.platform.components.listitem.BitwardenGroupItem @@ -44,7 +44,7 @@ fun SendContent( if (policyDisablesSend) { item { BitwardenInfoCalloutCard( - text = stringResource(id = R.string.send_disabled_warning), + text = stringResource(id = BitwardenString.send_disabled_warning), modifier = Modifier .testTag("SendOptionsPolicyInEffectLabel") .standardHorizontalMargin() @@ -56,7 +56,7 @@ fun SendContent( item { BitwardenListHeaderText( - label = stringResource(id = R.string.types), + label = stringResource(id = BitwardenString.types), supportingLabel = SEND_TYPES_COUNT.toString(), modifier = Modifier .fillMaxWidth() @@ -68,7 +68,7 @@ fun SendContent( item { BitwardenGroupItem( - label = stringResource(id = R.string.type_text), + label = stringResource(id = BitwardenString.type_text), supportingLabel = state.textTypeCount.toString(), startIcon = rememberVectorPainter(id = BitwardenDrawable.ic_file_text), onClick = sendHandlers.onTextTypeClick, @@ -82,7 +82,7 @@ fun SendContent( item { BitwardenGroupItem( - label = stringResource(id = R.string.type_file), + label = stringResource(id = BitwardenString.type_file), supportingLabel = state.fileTypeCount.toString(), startIcon = rememberVectorPainter(id = BitwardenDrawable.ic_file), onClick = sendHandlers.onFileTypeClick, @@ -97,7 +97,7 @@ fun SendContent( item { Spacer(modifier = Modifier.height(16.dp)) BitwardenListHeaderText( - label = stringResource(id = R.string.all_sends), + label = stringResource(id = BitwardenString.all_sends), supportingLabel = state.sendItems.size.toString(), modifier = Modifier .fillMaxWidth() diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/SendEmpty.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/SendEmpty.kt index 959d76cbb4..845e654d27 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/SendEmpty.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/SendEmpty.kt @@ -28,8 +28,8 @@ import com.bitwarden.ui.platform.base.util.toAnnotatedString import com.bitwarden.ui.platform.components.button.BitwardenFilledButton import com.bitwarden.ui.platform.components.util.rememberVectorPainter import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.platform.components.card.BitwardenInfoCalloutCard /** @@ -49,7 +49,7 @@ fun SendEmpty( if (policyDisablesSend) { Spacer(modifier = Modifier.height(12.dp)) BitwardenInfoCalloutCard( - text = stringResource(id = R.string.send_disabled_warning), + text = stringResource(id = BitwardenString.send_disabled_warning), modifier = Modifier .standardHorizontalMargin() .fillMaxWidth(), @@ -67,7 +67,7 @@ fun SendEmpty( Spacer(Modifier.height(24.dp)) Text( textAlign = TextAlign.Center, - text = stringResource(R.string.send_sensitive_information_safely), + text = stringResource(BitwardenString.send_sensitive_information_safely), style = BitwardenTheme.typography.titleMedium, color = BitwardenTheme.colorScheme.text.primary, modifier = Modifier @@ -78,7 +78,7 @@ fun SendEmpty( Text( textAlign = TextAlign.Center, text = stringResource( - R.string.share_files_and_data_securely_with_anyone_on_any_platform, + BitwardenString.share_files_and_data_securely_with_anyone_on_any_platform, ), style = BitwardenTheme.typography.bodyMedium, color = BitwardenTheme.colorScheme.text.primary, @@ -91,10 +91,10 @@ fun SendEmpty( Spacer(modifier = Modifier.height(24.dp)) // This button is hidden from accessibility to avoid duplicate voice over with the FAB - val newSendLabel = stringResource(id = R.string.add_a_send) + val newSendLabel = stringResource(id = BitwardenString.add_a_send) BitwardenFilledButton( onClick = onAddItemClick, - label = stringResource(id = R.string.add_a_send), + label = stringResource(id = BitwardenString.add_a_send), icon = rememberVectorPainter(BitwardenDrawable.ic_plus_small), modifier = Modifier .clearAndSetSemantics { diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/SendListItem.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/SendListItem.kt index b6b9b2da3c..24df16bf6b 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/SendListItem.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/SendListItem.kt @@ -13,8 +13,8 @@ import com.bitwarden.core.util.persistentListOfNotNull import com.bitwarden.ui.platform.components.icon.model.IconData import com.bitwarden.ui.platform.components.model.CardStyle import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenTwoButtonDialog import com.x8bit.bitwarden.ui.platform.components.listitem.BitwardenListItem import com.x8bit.bitwarden.ui.platform.components.listitem.SelectionItemData @@ -68,29 +68,29 @@ fun SendListItem( onClick = onClick, selectionDataList = persistentListOfNotNull( SelectionItemData( - text = stringResource(id = R.string.copy_link), + text = stringResource(id = BitwardenString.copy_link), onClick = onCopyClick, ), SelectionItemData( - text = stringResource(id = R.string.share_link), + text = stringResource(id = BitwardenString.share_link), onClick = onShareClick, ), SelectionItemData( - text = stringResource(id = R.string.view), + text = stringResource(id = BitwardenString.view), onClick = onViewClick, ), SelectionItemData( - text = stringResource(id = R.string.edit), + text = stringResource(id = BitwardenString.edit), onClick = onEditClick, ), onRemovePasswordClick?.let { SelectionItemData( - text = stringResource(id = R.string.remove_password), + text = stringResource(id = BitwardenString.remove_password), onClick = it, ) }, SelectionItemData( - text = stringResource(id = R.string.delete), + text = stringResource(id = BitwardenString.delete), onClick = { shouldShowDeleteConfirmationDialog = true }, ), ) @@ -103,10 +103,10 @@ fun SendListItem( ) if (shouldShowDeleteConfirmationDialog) { BitwardenTwoButtonDialog( - title = stringResource(id = R.string.delete), - message = stringResource(id = R.string.are_you_sure_delete_send), - confirmButtonText = stringResource(id = R.string.yes), - dismissButtonText = stringResource(id = R.string.cancel), + title = stringResource(id = BitwardenString.delete), + message = stringResource(id = BitwardenString.are_you_sure_delete_send), + confirmButtonText = stringResource(id = BitwardenString.yes), + dismissButtonText = stringResource(id = BitwardenString.cancel), onConfirmClick = { shouldShowDeleteConfirmationDialog = false onDeleteClick() diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/SendScreen.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/SendScreen.kt index 654c4432db..77e930fe62 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/SendScreen.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/SendScreen.kt @@ -25,7 +25,7 @@ import com.bitwarden.ui.platform.components.appbar.model.OverflowMenuItemData import com.bitwarden.ui.platform.components.fab.BitwardenFloatingActionButton import com.bitwarden.ui.platform.components.util.rememberVectorPainter import com.bitwarden.ui.platform.resource.BitwardenDrawable -import com.x8bit.bitwarden.R +import com.bitwarden.ui.platform.resource.BitwardenString import com.x8bit.bitwarden.data.platform.manager.model.AppResumeScreenData import com.x8bit.bitwarden.data.platform.manager.util.AppResumeStateManager import com.x8bit.bitwarden.data.platform.manager.util.RegisterScreenDataOnLifecycleEffect @@ -138,32 +138,32 @@ fun SendScreen( modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection), topBar = { BitwardenMediumTopAppBar( - title = stringResource(id = R.string.send), + title = stringResource(id = BitwardenString.send), scrollBehavior = scrollBehavior, actions = { BitwardenSearchActionItem( - contentDescription = stringResource(id = R.string.search_sends), + contentDescription = stringResource(id = BitwardenString.search_sends), onClick = remember(viewModel) { { viewModel.trySendAction(SendAction.SearchClick) } }, ) BitwardenOverflowActionItem( - contentDescription = stringResource(R.string.more), + contentDescription = stringResource(BitwardenString.more), menuItemDataList = persistentListOf( OverflowMenuItemData( - text = stringResource(id = R.string.sync), + text = stringResource(id = BitwardenString.sync), onClick = remember(viewModel) { { viewModel.trySendAction(SendAction.SyncClick) } }, ), OverflowMenuItemData( - text = stringResource(id = R.string.lock), + text = stringResource(id = BitwardenString.lock), onClick = remember(viewModel) { { viewModel.trySendAction(SendAction.LockClick) } }, ), OverflowMenuItemData( - text = stringResource(id = R.string.about_send), + text = stringResource(id = BitwardenString.about_send), onClick = remember(viewModel) { { viewModel.trySendAction(SendAction.AboutSendClick) } }, @@ -184,7 +184,7 @@ fun SendScreen( { viewModel.trySendAction(SendAction.AddSendClick) } }, painter = rememberVectorPainter(id = BitwardenDrawable.ic_plus_large), - contentDescription = stringResource(id = R.string.add_item), + contentDescription = stringResource(id = BitwardenString.add_item), modifier = Modifier.testTag(tag = "AddItemButton"), ) } @@ -242,7 +242,7 @@ private fun SendDialogs( ) SendState.DialogState.SelectSendAddType -> BitwardenSelectionDialog( - title = stringResource(id = R.string.type), + title = stringResource(id = BitwardenString.type), onDismissRequest = onDismissRequest, ) { SendItemType.entries.forEach { diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/SendViewModel.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/SendViewModel.kt index ff9ba9b6e4..bef4e3cdd8 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/SendViewModel.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/SendViewModel.kt @@ -11,9 +11,9 @@ import com.bitwarden.ui.platform.base.BackgroundEvent import com.bitwarden.ui.platform.base.BaseViewModel import com.bitwarden.ui.platform.components.icon.model.IconData import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.auth.repository.AuthRepository import com.x8bit.bitwarden.data.auth.repository.model.UserState import com.x8bit.bitwarden.data.platform.manager.PolicyManager @@ -151,8 +151,8 @@ class SendViewModel @Inject constructor( it.copy( isRefreshing = false, dialogState = SendState.DialogState.Error( - R.string.internet_connection_required_title.asText(), - R.string.internet_connection_required_message.asText(), + BitwardenString.internet_connection_required_title.asText(), + BitwardenString.internet_connection_required_message.asText(), ), ) } @@ -182,8 +182,8 @@ class SendViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = SendState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.generic_error_message.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.generic_error_message.asText(), throwable = result.error, ), ) @@ -192,7 +192,7 @@ class SendViewModel @Inject constructor( DeleteSendResult.Success -> { mutableStateFlow.update { it.copy(dialogState = null) } - sendEvent(SendEvent.ShowSnackbar(R.string.send_deleted.asText())) + sendEvent(SendEvent.ShowSnackbar(BitwardenString.send_deleted.asText())) } } } @@ -205,11 +205,11 @@ class SendViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = SendState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), + title = BitwardenString.an_error_has_occurred.asText(), message = result .errorMessage ?.asText() - ?: R.string.generic_error_message.asText(), + ?: BitwardenString.generic_error_message.asText(), ), ) } @@ -217,7 +217,11 @@ class SendViewModel @Inject constructor( is RemovePasswordSendResult.Success -> { mutableStateFlow.update { it.copy(dialogState = null) } - sendEvent(SendEvent.ShowSnackbar(message = R.string.password_removed.asText())) + sendEvent( + SendEvent.ShowSnackbar( + message = BitwardenString.password_removed.asText(), + ), + ) } } } @@ -229,7 +233,7 @@ class SendViewModel @Inject constructor( mutableStateFlow.update { it.copy( viewState = SendState.ViewState.Error( - message = R.string.generic_error_message.asText(), + message = BitwardenString.generic_error_message.asText(), ), dialogState = null, isRefreshing = false, @@ -303,7 +307,7 @@ class SendViewModel @Inject constructor( it.copy( dialogState = SendState.DialogState.Error( title = null, - message = R.string.send_disabled_warning.asText(), + message = BitwardenString.send_disabled_warning.asText(), ), ) } @@ -313,8 +317,8 @@ class SendViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = SendState.DialogState.Error( - title = R.string.send.asText(), - message = R.string.send_file_premium_required.asText(), + title = BitwardenString.send.asText(), + message = BitwardenString.send_file_premium_required.asText(), ), ) } @@ -343,7 +347,7 @@ class SendViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = SendState.DialogState.Loading( - message = R.string.syncing.asText(), + message = BitwardenString.syncing.asText(), ), ) } @@ -352,8 +356,8 @@ class SendViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = SendState.DialogState.Error( - R.string.internet_connection_required_title.asText(), - R.string.internet_connection_required_message.asText(), + BitwardenString.internet_connection_required_title.asText(), + BitwardenString.internet_connection_required_message.asText(), ), ) } @@ -363,7 +367,7 @@ class SendViewModel @Inject constructor( private fun handleCopyClick(action: SendAction.CopyClick) { clipboardManager.setText( text = action.sendItem.shareUrl, - toastDescriptorOverride = R.string.send_link.asText(), + toastDescriptorOverride = BitwardenString.send_link.asText(), ) } @@ -417,7 +421,7 @@ class SendViewModel @Inject constructor( private fun handleDeleteSendClick(action: SendAction.DeleteSendClick) { mutableStateFlow.update { - it.copy(dialogState = SendState.DialogState.Loading(R.string.deleting.asText())) + it.copy(dialogState = SendState.DialogState.Loading(BitwardenString.deleting.asText())) } viewModelScope.launch { val result = vaultRepo.deleteSend(action.sendItem.id) @@ -429,7 +433,7 @@ class SendViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = SendState.DialogState.Loading( - message = R.string.removing_send_password.asText(), + message = BitwardenString.removing_send_password.asText(), ), ) } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/addedit/AddEditSendContent.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/addedit/AddEditSendContent.kt index ed62606461..3559e8b229 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/addedit/AddEditSendContent.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/addedit/AddEditSendContent.kt @@ -41,8 +41,8 @@ import com.bitwarden.ui.platform.components.model.CardStyle import com.bitwarden.ui.platform.components.toggle.BitwardenSwitch import com.bitwarden.ui.platform.components.util.rememberVectorPainter import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.platform.components.card.BitwardenInfoCalloutCard import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenTwoButtonDialog import com.x8bit.bitwarden.ui.platform.components.field.BitwardenPasswordField @@ -76,7 +76,7 @@ fun AddEditSendContent( Spacer(modifier = Modifier.height(height = 12.dp)) if (policyDisablesSend) { BitwardenInfoCalloutCard( - text = stringResource(id = R.string.send_disabled_warning), + text = stringResource(id = BitwardenString.send_disabled_warning), modifier = Modifier .standardHorizontalMargin() .fillMaxWidth() @@ -87,7 +87,7 @@ fun AddEditSendContent( if (policySendOptionsInEffect) { BitwardenInfoCalloutCard( - text = stringResource(id = R.string.send_options_policy_in_effect), + text = stringResource(id = BitwardenString.send_options_policy_in_effect), modifier = Modifier .testTag(tag = "SendPolicyInEffectLabel") .standardHorizontalMargin() @@ -97,7 +97,7 @@ fun AddEditSendContent( } BitwardenListHeaderText( - label = stringResource(id = R.string.send_details), + label = stringResource(id = BitwardenString.send_details), modifier = Modifier .fillMaxWidth() .standardHorizontalMargin() @@ -108,7 +108,7 @@ fun AddEditSendContent( modifier = Modifier .fillMaxWidth() .standardHorizontalMargin(), - label = stringResource(id = R.string.send_name_required), + label = stringResource(id = BitwardenString.send_name_required), readOnly = policyDisablesSend, value = state.common.name, onValueChange = addSendHandlers.onNameChange, @@ -188,10 +188,10 @@ private fun DeleteButton( var shouldShowDeleteConfirmationDialog by rememberSaveable { mutableStateOf(value = false) } if (shouldShowDeleteConfirmationDialog) { BitwardenTwoButtonDialog( - title = stringResource(id = R.string.delete), - message = stringResource(id = R.string.are_you_sure_delete_send), - confirmButtonText = stringResource(id = R.string.yes), - dismissButtonText = stringResource(id = R.string.cancel), + title = stringResource(id = BitwardenString.delete), + message = stringResource(id = BitwardenString.are_you_sure_delete_send), + confirmButtonText = stringResource(id = BitwardenString.yes), + dismissButtonText = stringResource(id = BitwardenString.cancel), onConfirmClick = { onDeleteClick() shouldShowDeleteConfirmationDialog = false @@ -201,7 +201,7 @@ private fun DeleteButton( ) } BitwardenOutlinedErrorButton( - label = stringResource(id = R.string.delete_send), + label = stringResource(id = BitwardenString.delete_send), onClick = { shouldShowDeleteConfirmationDialog = true }, icon = rememberVectorPainter(id = BitwardenDrawable.ic_trash_small), modifier = modifier, @@ -216,7 +216,7 @@ private fun ColumnScope.TextTypeContent( ) { Spacer(modifier = Modifier.height(height = 8.dp)) BitwardenTextField( - label = stringResource(id = R.string.text_to_share), + label = stringResource(id = BitwardenString.text_to_share), readOnly = policyDisablesSend, value = textType.input, singleLine = false, @@ -229,7 +229,7 @@ private fun ColumnScope.TextTypeContent( ) Spacer(modifier = Modifier.height(height = 8.dp)) BitwardenSwitch( - label = stringResource(id = R.string.hide_text_by_default), + label = stringResource(id = BitwardenString.hide_text_by_default), isChecked = textType.isHideByDefaultChecked, onCheckedChange = addSendHandlers.onIsHideByDefaultToggle, readOnly = policyDisablesSend, @@ -266,7 +266,7 @@ private fun ColumnScope.FileTypeContent( ) Spacer(modifier = Modifier.height(height = 8.dp)) Text( - text = stringResource(id = R.string.required_max_file_size), + text = stringResource(id = BitwardenString.required_max_file_size), color = BitwardenTheme.colorScheme.text.secondary, style = BitwardenTheme.typography.bodySmall, modifier = Modifier @@ -298,7 +298,7 @@ private fun ColumnScope.FileTypeContent( Spacer(modifier = Modifier.height(height = 8.dp)) } BitwardenOutlinedButton( - label = stringResource(id = R.string.choose_file), + label = stringResource(id = BitwardenString.choose_file), onClick = { if (permissionsManager.checkPermission(permission = Manifest.permission.CAMERA)) { addSendHandlers.onChooseFileClick(true) @@ -313,7 +313,7 @@ private fun ColumnScope.FileTypeContent( ) Spacer(modifier = Modifier.height(height = 8.dp)) Text( - text = stringResource(id = R.string.required_max_file_size), + text = stringResource(id = BitwardenString.required_max_file_size), color = BitwardenTheme.colorScheme.text.secondary, style = BitwardenTheme.typography.bodySmall, modifier = Modifier @@ -383,10 +383,10 @@ private fun AddEditSendOptions( ) { Column { BitwardenStepper( - label = stringResource(id = R.string.maximum_access_count), + label = stringResource(id = BitwardenString.maximum_access_count), supportingContent = { Text( - text = stringResource(id = R.string.maximum_access_count_info), + text = stringResource(id = BitwardenString.maximum_access_count_info), style = BitwardenTheme.typography.bodySmall, color = BitwardenTheme.colorScheme.text.secondary, modifier = Modifier.fillMaxWidth(), @@ -403,7 +403,7 @@ private fun AddEditSendOptions( Spacer(modifier = Modifier.height(16.dp)) Text( text = stringResource( - id = R.string.current_access_count, + id = BitwardenString.current_access_count, formatArgs = arrayOf(it), ), style = BitwardenTheme.typography.bodySmall, @@ -427,8 +427,8 @@ private fun AddEditSendOptions( ) Spacer(modifier = Modifier.height(8.dp)) BitwardenPasswordField( - label = stringResource(id = R.string.new_password), - supportingText = stringResource(id = R.string.password_info), + label = stringResource(id = BitwardenString.new_password), + supportingText = stringResource(id = BitwardenString.password_info), readOnly = sendRestrictionPolicy, value = state.common.passwordInput, onValueChange = addSendHandlers.onPasswordChange, @@ -444,7 +444,7 @@ private fun AddEditSendOptions( .testTag("SendHideEmailSwitch") .fillMaxWidth() .standardHorizontalMargin(), - label = stringResource(id = R.string.hide_email), + label = stringResource(id = BitwardenString.hide_email), isChecked = state.common.isHideEmailChecked, onCheckedChange = addSendHandlers.onHideEmailToggle, readOnly = sendRestrictionPolicy, @@ -453,7 +453,7 @@ private fun AddEditSendOptions( ) Spacer(modifier = Modifier.height(8.dp)) BitwardenTextField( - label = stringResource(id = R.string.private_notes), + label = stringResource(id = BitwardenString.private_notes), readOnly = sendRestrictionPolicy, value = state.common.noteInput, singleLine = false, diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/addedit/AddEditSendScreen.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/addedit/AddEditSendScreen.kt index 48e8de8a25..4be7ee81cf 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/addedit/AddEditSendScreen.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/addedit/AddEditSendScreen.kt @@ -24,7 +24,7 @@ import com.bitwarden.ui.platform.components.button.BitwardenTextButton import com.bitwarden.ui.platform.components.model.TopAppBarDividerStyle import com.bitwarden.ui.platform.components.util.rememberVectorPainter import com.bitwarden.ui.platform.resource.BitwardenDrawable -import com.x8bit.bitwarden.R +import com.bitwarden.ui.platform.resource.BitwardenString import com.x8bit.bitwarden.ui.platform.components.content.BitwardenErrorContent import com.x8bit.bitwarden.ui.platform.components.content.BitwardenLoadingContent import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenBasicDialog @@ -106,7 +106,7 @@ fun AddEditSendScreen( title = state.screenDisplayName(), navigationIcon = NavigationIcon( navigationIcon = rememberVectorPainter(id = BitwardenDrawable.ic_close), - navigationIconContentDescription = stringResource(id = R.string.close), + navigationIconContentDescription = stringResource(id = BitwardenString.close), onNavigationIconClick = remember(viewModel) { { viewModel.trySendAction(AddEditSendAction.CloseClick) } }, @@ -116,7 +116,7 @@ fun AddEditSendScreen( scrollBehavior = scrollBehavior, actions = { BitwardenTextButton( - label = stringResource(id = R.string.save), + label = stringResource(id = BitwardenString.save), isEnabled = !state.policyDisablesSend, onClick = remember(viewModel) { { viewModel.trySendAction(AddEditSendAction.SaveClick) } @@ -125,10 +125,10 @@ fun AddEditSendScreen( ) if (!state.isAddMode) { BitwardenOverflowActionItem( - contentDescription = stringResource(R.string.more), + contentDescription = stringResource(BitwardenString.more), menuItemDataList = persistentListOfNotNull( OverflowMenuItemData( - text = stringResource(id = R.string.remove_password), + text = stringResource(id = BitwardenString.remove_password), onClick = remember(viewModel) { { viewModel.trySendAction( @@ -139,14 +139,14 @@ fun AddEditSendScreen( ) .takeIf { state.hasPassword && !state.policyDisablesSend }, OverflowMenuItemData( - text = stringResource(id = R.string.copy_link), + text = stringResource(id = BitwardenString.copy_link), onClick = remember(viewModel) { { viewModel.trySendAction(AddEditSendAction.CopyLinkClick) } }, ) .takeIf { !state.policyDisablesSend }, OverflowMenuItemData( - text = stringResource(id = R.string.share_link), + text = stringResource(id = BitwardenString.share_link), onClick = remember(viewModel) { { viewModel.trySendAction( diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/addedit/AddEditSendViewModel.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/addedit/AddEditSendViewModel.kt index 0a53d49c66..f67225bed8 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/addedit/AddEditSendViewModel.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/addedit/AddEditSendViewModel.kt @@ -11,10 +11,10 @@ import com.bitwarden.network.model.PolicyTypeJson import com.bitwarden.send.SendView import com.bitwarden.ui.platform.base.BackgroundEvent import com.bitwarden.ui.platform.base.BaseViewModel +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText import com.bitwarden.ui.util.concat -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.auth.repository.AuthRepository import com.x8bit.bitwarden.data.auth.repository.model.PolicyInformation import com.x8bit.bitwarden.data.platform.manager.PolicyManager @@ -203,9 +203,9 @@ class AddEditSendViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = AddEditSendState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), + title = BitwardenString.an_error_has_occurred.asText(), message = result.message?.asText() - ?: R.string.generic_error_message.asText(), + ?: BitwardenString.generic_error_message.asText(), throwable = result.error, ), ) @@ -232,11 +232,11 @@ class AddEditSendViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = AddEditSendState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), + title = BitwardenString.an_error_has_occurred.asText(), message = result .errorMessage ?.asText() - ?: R.string.generic_error_message.asText(), + ?: BitwardenString.generic_error_message.asText(), throwable = result.error, ), ) @@ -252,7 +252,7 @@ class AddEditSendViewModel @Inject constructor( ), ) snackbarRelayManager.sendSnackbarData( - data = BitwardenSnackbarData(message = R.string.send_updated.asText()), + data = BitwardenSnackbarData(message = BitwardenString.send_updated.asText()), relay = SnackbarRelay.SEND_UPDATED, ) } @@ -267,8 +267,8 @@ class AddEditSendViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = AddEditSendState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.generic_error_message.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.generic_error_message.asText(), throwable = result.error, ), ) @@ -279,7 +279,7 @@ class AddEditSendViewModel @Inject constructor( mutableStateFlow.update { it.copy(dialogState = null) } navigateBack(isDeleted = true) snackbarRelayManager.sendSnackbarData( - data = BitwardenSnackbarData(message = R.string.send_deleted.asText()), + data = BitwardenSnackbarData(message = BitwardenString.send_deleted.asText()), relay = SnackbarRelay.SEND_DELETED, ) } @@ -294,11 +294,11 @@ class AddEditSendViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = AddEditSendState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), + title = BitwardenString.an_error_has_occurred.asText(), message = result .errorMessage ?.asText() - ?: R.string.generic_error_message.asText(), + ?: BitwardenString.generic_error_message.asText(), result.error, ), ) @@ -310,7 +310,9 @@ class AddEditSendViewModel @Inject constructor( mutableStateFlow.update { it.copy(dialogState = null) } sendEvent( AddEditSendEvent.ShowSnackbar( - data = BitwardenSnackbarData(message = R.string.password_removed.asText()), + data = BitwardenSnackbarData( + message = BitwardenString.password_removed.asText(), + ), ), ) } @@ -324,7 +326,7 @@ class AddEditSendViewModel @Inject constructor( mutableStateFlow.update { it.copy( viewState = AddEditSendState.ViewState.Error( - message = R.string.generic_error_message.asText(), + message = BitwardenString.generic_error_message.asText(), ), ) } @@ -344,7 +346,7 @@ class AddEditSendViewModel @Inject constructor( isHideEmailAddressEnabled = isHideEmailAddressEnabled, ) ?: AddEditSendState.ViewState.Error( - message = R.string.generic_error_message.asText(), + message = BitwardenString.generic_error_message.asText(), ), ) } @@ -360,11 +362,11 @@ class AddEditSendViewModel @Inject constructor( mutableStateFlow.update { it.copy( viewState = AddEditSendState.ViewState.Error( - message = R.string.internet_connection_required_title + message = BitwardenString.internet_connection_required_title .asText() .concat( " ".asText(), - R.string.internet_connection_required_message.asText(), + BitwardenString.internet_connection_required_message.asText(), ), ), ) @@ -385,7 +387,7 @@ class AddEditSendViewModel @Inject constructor( isHideEmailAddressEnabled = isHideEmailAddressEnabled, ) ?: AddEditSendState.ViewState.Error( - message = R.string.generic_error_message.asText(), + message = BitwardenString.generic_error_message.asText(), ), ) } @@ -398,7 +400,7 @@ class AddEditSendViewModel @Inject constructor( it.common.sendUrl?.let { sendUrl -> clipboardManager.setText( text = sendUrl, - toastDescriptorOverride = R.string.send_link.asText(), + toastDescriptorOverride = BitwardenString.send_link.asText(), ) } } @@ -408,7 +410,9 @@ class AddEditSendViewModel @Inject constructor( onEdit { editItem -> mutableStateFlow.update { it.copy( - dialogState = AddEditSendState.DialogState.Loading(R.string.deleting.asText()), + dialogState = AddEditSendState.DialogState.Loading( + BitwardenString.deleting.asText(), + ), ) } viewModelScope.launch { @@ -433,7 +437,7 @@ class AddEditSendViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = AddEditSendState.DialogState.Loading( - message = R.string.removing_send_password.asText(), + message = BitwardenString.removing_send_password.asText(), ), ) } @@ -491,9 +495,9 @@ class AddEditSendViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = AddEditSendState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.validation_field_required.asText( - R.string.name.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.validation_field_required.asText( + BitwardenString.name.asText(), ), ), ) @@ -508,8 +512,8 @@ class AddEditSendViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = AddEditSendState.DialogState.Error( - title = R.string.send.asText(), - message = R.string.send_file_premium_required.asText(), + title = BitwardenString.send.asText(), + message = BitwardenString.send_file_premium_required.asText(), ), ) } @@ -519,8 +523,9 @@ class AddEditSendViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = AddEditSendState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.you_must_attach_a_file_to_save_this_send + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString + .you_must_attach_a_file_to_save_this_send .asText(), ), ) @@ -532,8 +537,8 @@ class AddEditSendViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = AddEditSendState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.max_file_size.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.max_file_size.asText(), ), ) } @@ -544,8 +549,8 @@ class AddEditSendViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = AddEditSendState.DialogState.Error( - title = R.string.internet_connection_required_title.asText(), - message = R.string.internet_connection_required_message.asText(), + title = BitwardenString.internet_connection_required_title.asText(), + message = BitwardenString.internet_connection_required_message.asText(), ), ) } @@ -554,7 +559,7 @@ class AddEditSendViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = AddEditSendState.DialogState.Loading( - message = R.string.saving.asText(), + message = BitwardenString.saving.asText(), ), ) } @@ -711,13 +716,13 @@ data class AddEditSendState( val screenDisplayName: Text get() = when (addEditSendType) { AddEditSendType.AddItem -> when (sendType) { - SendItemType.FILE -> R.string.add_file_send.asText() - SendItemType.TEXT -> R.string.add_text_send.asText() + SendItemType.FILE -> BitwardenString.add_file_send.asText() + SendItemType.TEXT -> BitwardenString.add_text_send.asText() } is AddEditSendType.EditItem -> when (sendType) { - SendItemType.FILE -> R.string.edit_file_send.asText() - SendItemType.TEXT -> R.string.edit_text_send.asText() + SendItemType.FILE -> BitwardenString.edit_file_send.asText() + SendItemType.TEXT -> BitwardenString.edit_text_send.asText() } } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/addedit/components/AddEditSendCustomDateChooser.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/addedit/components/AddEditSendCustomDateChooser.kt index a3ea5be334..0b2cd82530 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/addedit/components/AddEditSendCustomDateChooser.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/addedit/components/AddEditSendCustomDateChooser.kt @@ -12,9 +12,9 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import com.bitwarden.core.data.util.toFormattedDateTimeStyle import com.bitwarden.ui.platform.components.model.CardStyle +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.platform.components.dropdown.BitwardenMultiSelectButton import com.x8bit.bitwarden.ui.platform.composition.LocalClock import kotlinx.collections.immutable.persistentMapOf @@ -61,7 +61,7 @@ fun AddEditSendCustomDateChooser( mutableStateOf(value = originalSelectionOption) } BitwardenMultiSelectButton( - label = stringResource(id = R.string.deletion_date), + label = stringResource(id = BitwardenString.deletion_date), isEnabled = isEnabled, options = options.values.toImmutableList(), selectedOption = currentSelectionOption.getText(clock = clock).invoke(), @@ -75,7 +75,7 @@ fun AddEditSendCustomDateChooser( .plus(currentSelectionOption.offsetMillis, ChronoUnit.MILLIS), ) }, - supportingText = stringResource(id = R.string.deletion_date_info), + supportingText = stringResource(id = BitwardenString.deletion_date_info), insets = PaddingValues(top = 6.dp, bottom = 4.dp), cardStyle = CardStyle.Full, modifier = modifier, @@ -107,36 +107,36 @@ private sealed class CustomDeletionOption : Parcelable { @Parcelize data object OneHour : CustomDeletionOption() { override val offsetMillis: Long get() = 1.hours.inWholeMilliseconds - override fun getText(clock: Clock): Text = R.string.one_hour.asText() + override fun getText(clock: Clock): Text = BitwardenString.one_hour.asText() } @Parcelize data object OneDay : CustomDeletionOption() { override val offsetMillis: Long get() = 1.days.inWholeMilliseconds - override fun getText(clock: Clock): Text = R.string.one_day.asText() + override fun getText(clock: Clock): Text = BitwardenString.one_day.asText() } @Parcelize data object TwoDays : CustomDeletionOption() { override val offsetMillis: Long get() = 2.days.inWholeMilliseconds - override fun getText(clock: Clock): Text = R.string.two_days.asText() + override fun getText(clock: Clock): Text = BitwardenString.two_days.asText() } @Parcelize data object ThreeDays : CustomDeletionOption() { override val offsetMillis: Long get() = 3.days.inWholeMilliseconds - override fun getText(clock: Clock): Text = R.string.three_days.asText() + override fun getText(clock: Clock): Text = BitwardenString.three_days.asText() } @Parcelize data object SevenDays : CustomDeletionOption() { override val offsetMillis: Long get() = 7.days.inWholeMilliseconds - override fun getText(clock: Clock): Text = R.string.seven_days.asText() + override fun getText(clock: Clock): Text = BitwardenString.seven_days.asText() } @Parcelize data object ThirtyDays : CustomDeletionOption() { override val offsetMillis: Long get() = 30.days.inWholeMilliseconds - override fun getText(clock: Clock): Text = R.string.thirty_days.asText() + override fun getText(clock: Clock): Text = BitwardenString.thirty_days.asText() } } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/addedit/components/AddEditSendDeletionDateChooser.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/addedit/components/AddEditSendDeletionDateChooser.kt index 5291e28c0f..a77f174ffb 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/addedit/components/AddEditSendDeletionDateChooser.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/addedit/components/AddEditSendDeletionDateChooser.kt @@ -10,9 +10,9 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import com.bitwarden.ui.platform.components.model.CardStyle +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.platform.components.dropdown.BitwardenMultiSelectButton import com.x8bit.bitwarden.ui.platform.composition.LocalClock import kotlinx.collections.immutable.toImmutableList @@ -37,7 +37,7 @@ fun AddEditSendDeletionDateChooser( mutableStateOf(value = DeletionOption.SEVEN_DAYS) } BitwardenMultiSelectButton( - label = stringResource(id = R.string.deletion_date), + label = stringResource(id = BitwardenString.deletion_date), isEnabled = isEnabled, options = options.values.toImmutableList(), selectedOption = selectedOption.text(), @@ -47,7 +47,7 @@ fun AddEditSendDeletionDateChooser( ZonedDateTime.now(clock).plus(selectedOption.offsetMillis, ChronoUnit.MILLIS), ) }, - supportingText = stringResource(id = R.string.deletion_date_info), + supportingText = stringResource(id = BitwardenString.deletion_date_info), insets = PaddingValues(top = 6.dp, bottom = 4.dp), cardStyle = CardStyle.Full, modifier = modifier, @@ -59,27 +59,27 @@ private enum class DeletionOption( val offsetMillis: Long, ) { ONE_HOUR( - text = R.string.one_hour.asText(), + text = BitwardenString.one_hour.asText(), offsetMillis = 1.hours.inWholeMilliseconds, ), ONE_DAY( - text = R.string.one_day.asText(), + text = BitwardenString.one_day.asText(), offsetMillis = 1.days.inWholeMilliseconds, ), TWO_DAYS( - text = R.string.two_days.asText(), + text = BitwardenString.two_days.asText(), offsetMillis = 2.days.inWholeMilliseconds, ), THREE_DAYS( - text = R.string.three_days.asText(), + text = BitwardenString.three_days.asText(), offsetMillis = 3.days.inWholeMilliseconds, ), SEVEN_DAYS( - text = R.string.seven_days.asText(), + text = BitwardenString.seven_days.asText(), offsetMillis = 7.days.inWholeMilliseconds, ), THIRTY_DAYS( - text = R.string.thirty_days.asText(), + text = BitwardenString.thirty_days.asText(), offsetMillis = 30.days.inWholeMilliseconds, ), } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/model/SendStatusIcon.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/model/SendStatusIcon.kt index 7a34cf4104..e5cb8eb0be 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/model/SendStatusIcon.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/model/SendStatusIcon.kt @@ -2,9 +2,9 @@ package com.x8bit.bitwarden.ui.tools.feature.send.model import androidx.annotation.DrawableRes import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R /** * Represents the types of icons to be displayed with the send. @@ -16,27 +16,27 @@ enum class SendStatusIcon( ) { DISABLED( iconRes = BitwardenDrawable.ic_send_disabled, - contentDescription = R.string.disabled.asText(), + contentDescription = BitwardenString.disabled.asText(), testTag = "DisabledSendIcon", ), PASSWORD( iconRes = BitwardenDrawable.ic_key, - contentDescription = R.string.password.asText(), + contentDescription = BitwardenString.password.asText(), testTag = "PasswordProtectedSendIcon", ), EXPIRED( iconRes = BitwardenDrawable.ic_send_expired, - contentDescription = R.string.expired.asText(), + contentDescription = BitwardenString.expired.asText(), testTag = "ExpiredSendIcon", ), MAX_ACCESS_COUNT_REACHED( iconRes = BitwardenDrawable.ic_send_max_access_count_reached, - contentDescription = R.string.maximum_access_count_reached.asText(), + contentDescription = BitwardenString.maximum_access_count_reached.asText(), testTag = "MaxAccessSendIcon", ), PENDING_DELETE( iconRes = BitwardenDrawable.ic_send_pending_delete, - contentDescription = R.string.pending_delete.asText(), + contentDescription = BitwardenString.pending_delete.asText(), testTag = "PendingDeletionSendIcon", ), } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/util/SentItemTypeExtensions.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/util/SentItemTypeExtensions.kt index a5775bdffb..0923adbaf9 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/util/SentItemTypeExtensions.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/util/SentItemTypeExtensions.kt @@ -1,8 +1,8 @@ package com.x8bit.bitwarden.ui.tools.feature.send.util +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.tools.feature.send.model.SendItemType /** @@ -10,6 +10,6 @@ import com.x8bit.bitwarden.ui.tools.feature.send.model.SendItemType */ val SendItemType.selectionText: Text get() = when (this) { - SendItemType.FILE -> R.string.file.asText() - SendItemType.TEXT -> R.string.text.asText() + SendItemType.FILE -> BitwardenString.file.asText() + SendItemType.TEXT -> BitwardenString.text.asText() } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/viewsend/ViewSendScreen.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/viewsend/ViewSendScreen.kt index 1d6e769364..d04159d20d 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/viewsend/ViewSendScreen.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/viewsend/ViewSendScreen.kt @@ -55,9 +55,9 @@ import com.bitwarden.ui.platform.components.fab.BitwardenFloatingActionButton import com.bitwarden.ui.platform.components.model.CardStyle import com.bitwarden.ui.platform.components.util.rememberVectorPainter import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.platform.components.content.BitwardenErrorContent import com.x8bit.bitwarden.ui.platform.components.content.BitwardenLoadingContent import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenBasicDialog @@ -129,7 +129,7 @@ fun ViewSendScreen( title = state.screenDisplayName(), navigationIcon = NavigationIcon( navigationIcon = rememberVectorPainter(id = BitwardenDrawable.ic_close), - navigationIconContentDescription = stringResource(id = R.string.close), + navigationIconContentDescription = stringResource(id = BitwardenString.close), onNavigationIconClick = remember(viewModel) { { viewModel.trySendAction(ViewSendAction.CloseClick) } }, @@ -148,7 +148,7 @@ fun ViewSendScreen( { viewModel.trySendAction(ViewSendAction.EditClick) } }, painter = rememberVectorPainter(id = BitwardenDrawable.ic_pencil), - contentDescription = stringResource(id = R.string.edit_send), + contentDescription = stringResource(id = BitwardenString.edit_send), modifier = Modifier.testTag(tag = "EditItemButton"), ) } @@ -252,7 +252,7 @@ private fun ViewStateContent( .standardHorizontalMargin(), ) BitwardenFilledButton( - label = stringResource(id = R.string.copy), + label = stringResource(id = BitwardenString.copy), onClick = onCopyClick, icon = rememberVectorPainter(id = BitwardenDrawable.ic_copy_small), cardStyle = CardStyle.Middle(hasDivider = false), @@ -263,7 +263,7 @@ private fun ViewStateContent( .testTag(tag = "ViewSendCopyButton"), ) BitwardenOutlinedButton( - label = stringResource(id = R.string.share), + label = stringResource(id = BitwardenString.share), onClick = onShareClick, icon = rememberVectorPainter(id = BitwardenDrawable.ic_share_small), cardStyle = CardStyle.Bottom, @@ -276,7 +276,7 @@ private fun ViewStateContent( Spacer(modifier = Modifier.height(height = 16.dp)) BitwardenListHeaderText( - label = stringResource(id = R.string.send_details), + label = stringResource(id = BitwardenString.send_details), modifier = Modifier .fillMaxWidth() .standardHorizontalMargin() @@ -284,7 +284,7 @@ private fun ViewStateContent( ) Spacer(modifier = Modifier.height(height = 8.dp)) BitwardenTextField( - label = stringResource(id = R.string.send_name_required), + label = stringResource(id = BitwardenString.send_name_required), value = state.sendName, onValueChange = {}, readOnly = true, @@ -317,7 +317,7 @@ private fun ViewStateContent( Spacer(modifier = Modifier.height(height = 8.dp)) BitwardenTextField( - label = stringResource(id = R.string.deletion_date), + label = stringResource(id = BitwardenString.deletion_date), value = state.deletionDate, onValueChange = {}, readOnly = true, @@ -353,10 +353,10 @@ private fun DeleteButton( var shouldShowDeleteConfirmationDialog by rememberSaveable { mutableStateOf(value = false) } if (shouldShowDeleteConfirmationDialog) { BitwardenTwoButtonDialog( - title = stringResource(id = R.string.delete), - message = stringResource(id = R.string.are_you_sure_delete_send), - confirmButtonText = stringResource(id = R.string.yes), - dismissButtonText = stringResource(id = R.string.cancel), + title = stringResource(id = BitwardenString.delete), + message = stringResource(id = BitwardenString.are_you_sure_delete_send), + confirmButtonText = stringResource(id = BitwardenString.yes), + dismissButtonText = stringResource(id = BitwardenString.cancel), onConfirmClick = { onDeleteClick() shouldShowDeleteConfirmationDialog = false @@ -366,7 +366,7 @@ private fun DeleteButton( ) } BitwardenOutlinedErrorButton( - label = stringResource(id = R.string.delete_send), + label = stringResource(id = BitwardenString.delete_send), onClick = { shouldShowDeleteConfirmationDialog = true }, icon = rememberVectorPainter(id = BitwardenDrawable.ic_trash_small), modifier = modifier, @@ -391,7 +391,7 @@ private fun ShareLinkSection( ), ) { Text( - text = stringResource(id = R.string.send_link), + text = stringResource(id = BitwardenString.send_link), style = BitwardenTheme.typography.titleSmall, color = BitwardenTheme.colorScheme.text.primary, overflow = TextOverflow.Ellipsis, @@ -451,7 +451,7 @@ private fun TextSendContent( modifier: Modifier = Modifier, ) { BitwardenTextField( - label = stringResource(id = R.string.text_to_share), + label = stringResource(id = BitwardenString.text_to_share), value = textType.textToShare, onValueChange = {}, readOnly = true, @@ -490,9 +490,9 @@ private fun ColumnScope.AdditionalOptions( Column { state.maxAccessCount?.let { BitwardenStepper( - label = stringResource(id = R.string.maximum_access_count), + label = stringResource(id = BitwardenString.maximum_access_count), value = it, - supportingText = R.string.current_access_count + supportingText = BitwardenString.current_access_count .asText(state.currentAccessCount) .invoke(), onValueChange = {}, @@ -512,13 +512,13 @@ private fun ColumnScope.AdditionalOptions( Spacer(modifier = Modifier.height(height = 8.dp)) } BitwardenTextField( - label = stringResource(id = R.string.private_notes), + label = stringResource(id = BitwardenString.private_notes), readOnly = true, value = it, actions = { BitwardenStandardIconButton( vectorIconRes = BitwardenDrawable.ic_copy, - contentDescription = stringResource(id = R.string.copy_notes), + contentDescription = stringResource(id = BitwardenString.copy_notes), onClick = onCopyNotesClick, modifier = Modifier.testTag(tag = "ViewSendNotesCopyButton"), ) diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/viewsend/ViewSendViewModel.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/viewsend/ViewSendViewModel.kt index eb345d5dbf..d2c6fdf9f1 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/viewsend/ViewSendViewModel.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/viewsend/ViewSendViewModel.kt @@ -8,10 +8,10 @@ import com.bitwarden.data.repository.util.baseWebSendUrl import com.bitwarden.send.SendView import com.bitwarden.ui.platform.base.BackgroundEvent import com.bitwarden.ui.platform.base.BaseViewModel +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText import com.bitwarden.ui.util.concat -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.platform.manager.clipboard.BitwardenClipboardManager import com.x8bit.bitwarden.data.platform.repository.EnvironmentRepository import com.x8bit.bitwarden.data.vault.repository.VaultRepository @@ -106,7 +106,11 @@ class ViewSendViewModel @Inject constructor( private fun handleDeleteClick() { mutableStateFlow.update { - it.copy(dialogState = ViewSendState.DialogState.Loading(R.string.deleting.asText())) + it.copy( + dialogState = ViewSendState.DialogState.Loading( + BitwardenString.deleting.asText(), + ), + ) } viewModelScope.launch { val result = vaultRepository.deleteSend(sendId = state.sendId) @@ -134,8 +138,8 @@ class ViewSendViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = ViewSendState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.generic_error_message.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.generic_error_message.asText(), throwable = result.error, ), ) @@ -145,7 +149,7 @@ class ViewSendViewModel @Inject constructor( is DeleteSendResult.Success -> { mutableStateFlow.update { it.copy(dialogState = null) } snackbarRelayManager.sendSnackbarData( - data = BitwardenSnackbarData(message = R.string.send_deleted.asText()), + data = BitwardenSnackbarData(message = BitwardenString.send_deleted.asText()), relay = SnackbarRelay.SEND_DELETED, ) sendEvent(ViewSendEvent.NavigateBack) @@ -172,7 +176,7 @@ class ViewSendViewModel @Inject constructor( .data ?.let { updateStateWithSendView(sendView = it) } ?: updateStateWithErrorMessage( - message = R.string.missing_send_resync_your_vault.asText(), + message = BitwardenString.missing_send_resync_your_vault.asText(), ) } @@ -184,7 +188,7 @@ class ViewSendViewModel @Inject constructor( dataState .data ?.let { updateStateWithSendView(sendView = it) } - ?: updateStateWithErrorMessage(message = R.string.generic_error_message.asText()) + ?: updateStateWithErrorMessage(message = BitwardenString.generic_error_message.asText()) } private fun sendNoNetworkReceive(dataState: DataState.NoNetwork) { @@ -192,11 +196,11 @@ class ViewSendViewModel @Inject constructor( .data ?.let { updateStateWithSendView(sendView = it) } ?: updateStateWithErrorMessage( - message = R.string.internet_connection_required_title + message = BitwardenString.internet_connection_required_title .asText() .concat( " ".asText(), - R.string.internet_connection_required_message.asText(), + BitwardenString.internet_connection_required_message.asText(), ), ) } @@ -205,7 +209,7 @@ class ViewSendViewModel @Inject constructor( dataState .data ?.let { updateStateWithSendView(sendView = it) } - ?: updateStateWithErrorMessage(message = R.string.generic_error_message.asText()) + ?: updateStateWithErrorMessage(message = BitwardenString.generic_error_message.asText()) } private fun updateStateWithSendView(sendView: SendView) { @@ -246,8 +250,8 @@ data class ViewSendState( */ val screenDisplayName: Text get() = when (sendType) { - SendItemType.FILE -> R.string.view_file_send.asText() - SendItemType.TEXT -> R.string.view_text_send.asText() + SendItemType.FILE -> BitwardenString.view_file_send.asText() + SendItemType.TEXT -> BitwardenString.view_text_send.asText() } /** diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/components/CollectionItemSelector.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/components/CollectionItemSelector.kt index 0f1acc3b8f..83bf2f293a 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/components/CollectionItemSelector.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/components/CollectionItemSelector.kt @@ -16,10 +16,10 @@ import androidx.compose.ui.unit.dp import com.bitwarden.ui.platform.base.util.standardHorizontalMargin import com.bitwarden.ui.platform.base.util.toListItemCardStyle import com.bitwarden.ui.platform.components.model.CardStyle -import com.bitwarden.ui.platform.theme.BitwardenTheme -import com.x8bit.bitwarden.R -import com.x8bit.bitwarden.ui.platform.components.header.BitwardenListHeaderText import com.bitwarden.ui.platform.components.toggle.BitwardenSwitch +import com.bitwarden.ui.platform.resource.BitwardenString +import com.bitwarden.ui.platform.theme.BitwardenTheme +import com.x8bit.bitwarden.ui.platform.components.header.BitwardenListHeaderText import com.x8bit.bitwarden.ui.vault.model.VaultCollection /** @@ -33,7 +33,7 @@ fun LazyListScope.collectionItemsSelector( if (isCollectionsTitleVisible) { item { BitwardenListHeaderText( - label = stringResource(id = R.string.collections), + label = stringResource(id = BitwardenString.collections), modifier = Modifier .fillMaxWidth() .standardHorizontalMargin() @@ -76,7 +76,7 @@ fun LazyListScope.collectionItemsSelector( .standardHorizontalMargin(), ) { Text( - text = stringResource(id = R.string.no_collections_to_list), + text = stringResource(id = BitwardenString.no_collections_to_list), style = BitwardenTheme.typography.bodyMedium, color = BitwardenTheme.colorScheme.text.primary, ) diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/components/VaultItemSelectionDialog.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/components/VaultItemSelectionDialog.kt index ace700a238..dd7c5935cd 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/components/VaultItemSelectionDialog.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/components/VaultItemSelectionDialog.kt @@ -2,7 +2,7 @@ package com.x8bit.bitwarden.ui.vault.components import androidx.compose.runtime.Composable import androidx.compose.ui.res.stringResource -import com.x8bit.bitwarden.R +import com.bitwarden.ui.platform.resource.BitwardenString import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenSelectionDialog import com.x8bit.bitwarden.ui.platform.components.dialog.row.BitwardenBasicDialogRow import com.x8bit.bitwarden.ui.vault.components.model.CreateVaultItemType @@ -31,7 +31,7 @@ fun VaultItemSelectionDialog( .entries .filterNot { excludedOptions.contains(it) } BitwardenSelectionDialog( - title = stringResource(R.string.type), + title = stringResource(BitwardenString.type), onDismissRequest = onDismissRequest, ) { supportedEntries.forEach { diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/components/model/CreateVaultItemType.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/components/model/CreateVaultItemType.kt index 94c142f106..04324b5834 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/components/model/CreateVaultItemType.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/components/model/CreateVaultItemType.kt @@ -1,7 +1,7 @@ package com.x8bit.bitwarden.ui.vault.components.model import androidx.annotation.StringRes -import com.x8bit.bitwarden.R +import com.bitwarden.ui.platform.resource.BitwardenString /** * Enumerated values to represent a create vault item option. @@ -12,30 +12,30 @@ enum class CreateVaultItemType( /** * A login cipher. */ - LOGIN(R.string.log_in_noun), + LOGIN(BitwardenString.log_in_noun), /** * A card cipher. */ - CARD(R.string.type_card), + CARD(BitwardenString.type_card), /** * A identity cipher. */ - IDENTITY(R.string.type_identity), + IDENTITY(BitwardenString.type_identity), /** * A secure note cipher. */ - SECURE_NOTE(R.string.type_secure_note), + SECURE_NOTE(BitwardenString.type_secure_note), /** * A SSH key cipher. */ - SSH_KEY(R.string.type_ssh_key), + SSH_KEY(BitwardenString.type_ssh_key), /** * A cipher item folder */ - FOLDER(R.string.folder), + FOLDER(BitwardenString.folder), } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditAdditionalOptions.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditAdditionalOptions.kt index 80a6d6232a..59099073c5 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditAdditionalOptions.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditAdditionalOptions.kt @@ -16,7 +16,7 @@ import com.bitwarden.ui.platform.base.util.standardHorizontalMargin import com.bitwarden.ui.platform.components.model.CardStyle import com.bitwarden.ui.platform.components.model.TooltipData import com.bitwarden.ui.platform.components.toggle.BitwardenSwitch -import com.x8bit.bitwarden.R +import com.bitwarden.ui.platform.resource.BitwardenString import com.x8bit.bitwarden.ui.platform.components.field.BitwardenTextField import com.x8bit.bitwarden.ui.platform.components.header.BitwardenExpandingHeader import com.x8bit.bitwarden.ui.platform.components.header.BitwardenListHeaderText @@ -50,7 +50,7 @@ fun LazyListScope.vaultAddEditAdditionalOptions( item(key = "optionalNotes") { BitwardenTextField( singleLine = false, - label = stringResource(id = R.string.notes), + label = stringResource(id = BitwardenString.notes), value = commonState.notes, onValueChange = commonTypeHandlers.onNotesTextChange, textFieldTestTag = "ItemNotesEntry", @@ -75,13 +75,13 @@ fun LazyListScope.vaultAddEditAdditionalOptions( Spacer(modifier = Modifier.height(height = 8.dp)) } BitwardenSwitch( - label = stringResource(id = R.string.password_prompt), + label = stringResource(id = BitwardenString.password_prompt), isChecked = commonState.masterPasswordReprompt, onCheckedChange = commonTypeHandlers.onToggleMasterPasswordReprompt, tooltip = TooltipData( onClick = commonTypeHandlers.onTooltipClick, contentDescription = stringResource( - id = R.string.master_password_re_prompt_help, + id = BitwardenString.master_password_re_prompt_help, ), ), cardStyle = CardStyle.Full, @@ -102,7 +102,7 @@ fun LazyListScope.vaultAddEditAdditionalOptions( ) { Spacer(modifier = Modifier.height(height = 16.dp)) BitwardenListHeaderText( - label = stringResource(id = R.string.custom_fields), + label = stringResource(id = BitwardenString.custom_fields), modifier = Modifier .fillMaxWidth() .padding(horizontal = 16.dp), diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditCardItems.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditCardItems.kt index 1095e0217e..40a2893da6 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditCardItems.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditCardItems.kt @@ -17,7 +17,7 @@ import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.unit.dp import com.bitwarden.ui.platform.base.util.standardHorizontalMargin import com.bitwarden.ui.platform.components.model.CardStyle -import com.x8bit.bitwarden.R +import com.bitwarden.ui.platform.resource.BitwardenString import com.x8bit.bitwarden.ui.platform.components.dropdown.BitwardenMultiSelectButton import com.x8bit.bitwarden.ui.platform.components.field.BitwardenPasswordField import com.x8bit.bitwarden.ui.platform.components.field.BitwardenTextField @@ -39,7 +39,7 @@ fun LazyListScope.vaultAddEditCardItems( item { Spacer(modifier = Modifier.height(16.dp)) BitwardenListHeaderText( - label = stringResource(id = R.string.card_details), + label = stringResource(id = BitwardenString.card_details), modifier = Modifier .fillMaxWidth() .standardHorizontalMargin() @@ -50,7 +50,7 @@ fun LazyListScope.vaultAddEditCardItems( item { Spacer(modifier = Modifier.height(8.dp)) BitwardenTextField( - label = stringResource(id = R.string.cardholder_name), + label = stringResource(id = BitwardenString.cardholder_name), value = cardState.cardHolderName, onValueChange = cardHandlers.onCardHolderNameTextChange, textFieldTestTag = "CardholderNameEntry", @@ -63,7 +63,7 @@ fun LazyListScope.vaultAddEditCardItems( item { var showNumber by rememberSaveable { mutableStateOf(value = false) } BitwardenPasswordField( - label = stringResource(id = R.string.number), + label = stringResource(id = BitwardenString.number), value = cardState.number, onValueChange = cardHandlers.onNumberTextChange, showPassword = showNumber, @@ -82,7 +82,7 @@ fun LazyListScope.vaultAddEditCardItems( item { val resources = LocalContext.current.resources BitwardenMultiSelectButton( - label = stringResource(id = R.string.brand), + label = stringResource(id = BitwardenString.brand), options = VaultCardBrand .entries .map { it.longName() } @@ -105,7 +105,7 @@ fun LazyListScope.vaultAddEditCardItems( item { val resources = LocalContext.current.resources BitwardenMultiSelectButton( - label = stringResource(id = R.string.expiration_month), + label = stringResource(id = BitwardenString.expiration_month), options = VaultCardExpirationMonth .entries .map { it.value() } @@ -127,7 +127,7 @@ fun LazyListScope.vaultAddEditCardItems( } item { BitwardenTextField( - label = stringResource(id = R.string.expiration_year), + label = stringResource(id = BitwardenString.expiration_year), value = cardState.expirationYear, onValueChange = cardHandlers.onExpirationYearTextChange, keyboardType = KeyboardType.Number, @@ -141,7 +141,7 @@ fun LazyListScope.vaultAddEditCardItems( item { var showSecurityCode by rememberSaveable { mutableStateOf(value = false) } BitwardenPasswordField( - label = stringResource(id = R.string.security_code), + label = stringResource(id = BitwardenString.security_code), value = cardState.securityCode, onValueChange = cardHandlers.onSecurityCodeTextChange, showPassword = showSecurityCode, diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditCustomField.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditCustomField.kt index 33805e314d..a67604e3c6 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditCustomField.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditCustomField.kt @@ -15,7 +15,7 @@ import com.bitwarden.ui.platform.components.button.BitwardenStandardIconButton import com.bitwarden.ui.platform.components.model.CardStyle import com.bitwarden.ui.platform.components.toggle.BitwardenSwitch import com.bitwarden.ui.platform.resource.BitwardenDrawable -import com.x8bit.bitwarden.R +import com.bitwarden.ui.platform.resource.BitwardenString import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenSelectionDialog import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenTextEntryDialog import com.x8bit.bitwarden.ui.platform.components.dialog.row.BitwardenBasicDialogRow @@ -69,8 +69,8 @@ fun VaultAddEditCustomField( if (shouldShowEditDialog) { BitwardenTextEntryDialog( - title = stringResource(id = R.string.custom_field_name), - textFieldLabel = stringResource(id = R.string.name), + title = stringResource(id = BitwardenString.custom_field_name), + textFieldLabel = stringResource(id = BitwardenString.name), onDismissRequest = { shouldShowEditDialog = false }, autoFocus = true, initialText = customField.name, @@ -159,7 +159,7 @@ private fun CustomFieldBoolean( actions = { BitwardenStandardIconButton( vectorIconRes = BitwardenDrawable.ic_cog, - contentDescription = stringResource(id = R.string.edit), + contentDescription = stringResource(id = BitwardenString.edit), onClick = onEditValue, modifier = Modifier.testTag(tag = "CustomFieldSettingsButton"), ) @@ -196,7 +196,7 @@ private fun CustomFieldHiddenField( actions = { BitwardenStandardIconButton( vectorIconRes = BitwardenDrawable.ic_cog, - contentDescription = stringResource(id = R.string.edit), + contentDescription = stringResource(id = BitwardenString.edit), onClick = onEditValue, modifier = Modifier.testTag("CustomFieldSettingsButton"), ) @@ -227,7 +227,7 @@ private fun CustomFieldTextField( actions = { BitwardenStandardIconButton( vectorIconRes = BitwardenDrawable.ic_cog, - contentDescription = stringResource(id = R.string.edit), + contentDescription = stringResource(id = BitwardenString.edit), onClick = onEditValue, modifier = Modifier.testTag("CustomFieldSettingsButton"), ) @@ -266,7 +266,7 @@ private fun CustomFieldLinkedField( actions = { BitwardenStandardIconButton( vectorIconRes = BitwardenDrawable.ic_cog, - contentDescription = stringResource(id = R.string.edit), + contentDescription = stringResource(id = BitwardenString.edit), onClick = onEditValue, modifier = Modifier.testTag("CustomFieldSettingsButton"), ) @@ -286,7 +286,7 @@ private fun CustomFieldActionDialog( onDismissRequest: () -> Unit, ) { BitwardenSelectionDialog( - title = stringResource(id = R.string.options), + title = stringResource(id = BitwardenString.options), onDismissRequest = onDismissRequest, ) { CustomFieldAction diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditCustomFieldsButton.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditCustomFieldsButton.kt index 4c12afaa84..ba10fd70f7 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditCustomFieldsButton.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditCustomFieldsButton.kt @@ -10,7 +10,7 @@ import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.platform.testTag import androidx.compose.ui.res.stringResource import com.bitwarden.ui.platform.components.button.BitwardenOutlinedButton -import com.x8bit.bitwarden.R +import com.bitwarden.ui.platform.resource.BitwardenString import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenSelectionDialog import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenTextEntryDialog import com.x8bit.bitwarden.ui.platform.components.dialog.row.BitwardenBasicDialogRow @@ -37,7 +37,7 @@ fun VaultAddEditCustomFieldsButton( if (shouldShowChooserDialog) { BitwardenSelectionDialog( - title = stringResource(id = R.string.select_type_field), + title = stringResource(id = BitwardenString.select_type_field), onDismissRequest = { shouldShowChooserDialog = false }, ) { options.forEach { type -> @@ -55,8 +55,8 @@ fun VaultAddEditCustomFieldsButton( if (shouldShowNameDialog) { BitwardenTextEntryDialog( - title = stringResource(id = R.string.custom_field_name), - textFieldLabel = stringResource(id = R.string.name), + title = stringResource(id = BitwardenString.custom_field_name), + textFieldLabel = stringResource(id = BitwardenString.name), onDismissRequest = { shouldShowNameDialog = false }, onConfirmClick = { shouldShowNameDialog = false @@ -67,7 +67,7 @@ fun VaultAddEditCustomFieldsButton( } val focusManager = LocalFocusManager.current BitwardenOutlinedButton( - label = stringResource(id = R.string.add_field), + label = stringResource(id = BitwardenString.add_field), onClick = { // Clear any current focused item such as an unrelated text field. focusManager.clearFocus() diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditIdentityItems.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditIdentityItems.kt index bcd89b8547..1702af164e 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditIdentityItems.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditIdentityItems.kt @@ -13,7 +13,7 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import com.bitwarden.ui.platform.base.util.standardHorizontalMargin import com.bitwarden.ui.platform.components.model.CardStyle -import com.x8bit.bitwarden.R +import com.bitwarden.ui.platform.resource.BitwardenString import com.x8bit.bitwarden.ui.platform.components.dropdown.BitwardenMultiSelectButton import com.x8bit.bitwarden.ui.platform.components.field.BitwardenTextField import com.x8bit.bitwarden.ui.platform.components.header.BitwardenListHeaderText @@ -32,7 +32,7 @@ fun LazyListScope.vaultAddEditIdentityItems( item { Spacer(modifier = Modifier.height(16.dp)) BitwardenListHeaderText( - label = stringResource(id = R.string.personal_details), + label = stringResource(id = BitwardenString.personal_details), modifier = Modifier .fillMaxWidth() .standardHorizontalMargin() @@ -53,7 +53,7 @@ fun LazyListScope.vaultAddEditIdentityItems( } item { BitwardenTextField( - label = stringResource(id = R.string.first_name), + label = stringResource(id = BitwardenString.first_name), value = identityState.firstName, onValueChange = identityItemTypeHandlers.onFirstNameTextChange, textFieldTestTag = "IdentityFirstNameEntry", @@ -65,7 +65,7 @@ fun LazyListScope.vaultAddEditIdentityItems( } item { BitwardenTextField( - label = stringResource(id = R.string.middle_name), + label = stringResource(id = BitwardenString.middle_name), value = identityState.middleName, onValueChange = identityItemTypeHandlers.onMiddleNameTextChange, textFieldTestTag = "IdentityMiddleNameEntry", @@ -77,7 +77,7 @@ fun LazyListScope.vaultAddEditIdentityItems( } item { BitwardenTextField( - label = stringResource(id = R.string.last_name), + label = stringResource(id = BitwardenString.last_name), value = identityState.lastName, onValueChange = identityItemTypeHandlers.onLastNameTextChange, textFieldTestTag = "IdentityLastNameEntry", @@ -89,7 +89,7 @@ fun LazyListScope.vaultAddEditIdentityItems( } item { BitwardenTextField( - label = stringResource(id = R.string.username), + label = stringResource(id = BitwardenString.username), value = identityState.username, onValueChange = identityItemTypeHandlers.onUsernameTextChange, textFieldTestTag = "IdentityUsernameEntry", @@ -101,7 +101,7 @@ fun LazyListScope.vaultAddEditIdentityItems( } item { BitwardenTextField( - label = stringResource(id = R.string.company), + label = stringResource(id = BitwardenString.company), value = identityState.company, onValueChange = identityItemTypeHandlers.onCompanyTextChange, textFieldTestTag = "IdentityCompanyEntry", @@ -114,7 +114,7 @@ fun LazyListScope.vaultAddEditIdentityItems( item { Spacer(modifier = Modifier.height(height = 16.dp)) BitwardenListHeaderText( - label = stringResource(id = R.string.identification), + label = stringResource(id = BitwardenString.identification), modifier = Modifier .fillMaxWidth() .standardHorizontalMargin() @@ -124,7 +124,7 @@ fun LazyListScope.vaultAddEditIdentityItems( } item { BitwardenTextField( - label = stringResource(id = R.string.ssn), + label = stringResource(id = BitwardenString.ssn), value = identityState.ssn, onValueChange = identityItemTypeHandlers.onSsnTextChange, textFieldTestTag = "IdentitySsnEntry", @@ -136,7 +136,7 @@ fun LazyListScope.vaultAddEditIdentityItems( } item { BitwardenTextField( - label = stringResource(id = R.string.passport_number), + label = stringResource(id = BitwardenString.passport_number), value = identityState.passportNumber, onValueChange = identityItemTypeHandlers.onPassportNumberTextChange, textFieldTestTag = "IdentityPassportNumberEntry", @@ -148,7 +148,7 @@ fun LazyListScope.vaultAddEditIdentityItems( } item { BitwardenTextField( - label = stringResource(id = R.string.license_number), + label = stringResource(id = BitwardenString.license_number), value = identityState.licenseNumber, onValueChange = identityItemTypeHandlers.onLicenseNumberTextChange, textFieldTestTag = "IdentityLicenseNumberEntry", @@ -161,7 +161,7 @@ fun LazyListScope.vaultAddEditIdentityItems( item { Spacer(modifier = Modifier.height(height = 16.dp)) BitwardenListHeaderText( - label = stringResource(id = R.string.contact_info), + label = stringResource(id = BitwardenString.contact_info), modifier = Modifier .fillMaxWidth() .standardHorizontalMargin() @@ -171,7 +171,7 @@ fun LazyListScope.vaultAddEditIdentityItems( } item { BitwardenTextField( - label = stringResource(id = R.string.email), + label = stringResource(id = BitwardenString.email), value = identityState.email, onValueChange = identityItemTypeHandlers.onEmailTextChange, textFieldTestTag = "IdentityEmailEntry", @@ -183,7 +183,7 @@ fun LazyListScope.vaultAddEditIdentityItems( } item { BitwardenTextField( - label = stringResource(id = R.string.phone), + label = stringResource(id = BitwardenString.phone), value = identityState.phone, onValueChange = identityItemTypeHandlers.onPhoneTextChange, textFieldTestTag = "IdentityPhoneEntry", @@ -196,7 +196,7 @@ fun LazyListScope.vaultAddEditIdentityItems( item { Spacer(modifier = Modifier.height(height = 16.dp)) BitwardenListHeaderText( - label = stringResource(id = R.string.address), + label = stringResource(id = BitwardenString.address), modifier = Modifier .fillMaxWidth() .standardHorizontalMargin() @@ -206,7 +206,7 @@ fun LazyListScope.vaultAddEditIdentityItems( } item { BitwardenTextField( - label = stringResource(id = R.string.address1), + label = stringResource(id = BitwardenString.address1), value = identityState.address1, onValueChange = identityItemTypeHandlers.onAddress1TextChange, textFieldTestTag = "IdentityAddressOneEntry", @@ -218,7 +218,7 @@ fun LazyListScope.vaultAddEditIdentityItems( } item { BitwardenTextField( - label = stringResource(id = R.string.address2), + label = stringResource(id = BitwardenString.address2), value = identityState.address2, onValueChange = identityItemTypeHandlers.onAddress2TextChange, textFieldTestTag = "IdentityAddressTwoEntry", @@ -230,7 +230,7 @@ fun LazyListScope.vaultAddEditIdentityItems( } item { BitwardenTextField( - label = stringResource(id = R.string.address3), + label = stringResource(id = BitwardenString.address3), value = identityState.address3, onValueChange = identityItemTypeHandlers.onAddress3TextChange, textFieldTestTag = "IdentityAddressThreeEntry", @@ -242,7 +242,7 @@ fun LazyListScope.vaultAddEditIdentityItems( } item { BitwardenTextField( - label = stringResource(id = R.string.city_town), + label = stringResource(id = BitwardenString.city_town), value = identityState.city, onValueChange = identityItemTypeHandlers.onCityTextChange, textFieldTestTag = "IdentityCityEntry", @@ -254,7 +254,7 @@ fun LazyListScope.vaultAddEditIdentityItems( } item { BitwardenTextField( - label = stringResource(id = R.string.state_province), + label = stringResource(id = BitwardenString.state_province), value = identityState.state, onValueChange = identityItemTypeHandlers.onStateTextChange, textFieldTestTag = "IdentityStateEntry", @@ -266,7 +266,7 @@ fun LazyListScope.vaultAddEditIdentityItems( } item { BitwardenTextField( - label = stringResource(id = R.string.zip_postal_code), + label = stringResource(id = BitwardenString.zip_postal_code), value = identityState.zip, onValueChange = identityItemTypeHandlers.onZipTextChange, textFieldTestTag = "IdentityPostalCodeEntry", @@ -278,7 +278,7 @@ fun LazyListScope.vaultAddEditIdentityItems( } item { BitwardenTextField( - label = stringResource(id = R.string.country), + label = stringResource(id = BitwardenString.country), value = identityState.country, onValueChange = identityItemTypeHandlers.onCountryTextChange, textFieldTestTag = "IdentityCountryEntry", @@ -298,7 +298,7 @@ private fun TitleMultiSelectButton( ) { val resources = LocalContext.current.resources BitwardenMultiSelectButton( - label = stringResource(id = R.string.title), + label = stringResource(id = BitwardenString.title), options = VaultIdentityTitle .entries .map { it.value() } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditItemContent.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditItemContent.kt index 29f7e96d28..531141b5d6 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditItemContent.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditItemContent.kt @@ -21,7 +21,7 @@ import com.bitwarden.ui.platform.components.button.BitwardenStandardIconButton import com.bitwarden.ui.platform.components.button.BitwardenTextSelectionButton import com.bitwarden.ui.platform.components.model.CardStyle import com.bitwarden.ui.platform.resource.BitwardenDrawable -import com.x8bit.bitwarden.R +import com.bitwarden.ui.platform.resource.BitwardenString import com.x8bit.bitwarden.ui.platform.components.card.BitwardenActionCard import com.x8bit.bitwarden.ui.platform.components.card.BitwardenInfoCalloutCard import com.x8bit.bitwarden.ui.platform.components.coachmark.CoachMarkScope @@ -80,7 +80,7 @@ fun CoachMarkScope.VaultAddEditContent( if (state.isIndividualVaultDisabled && isAddItemMode) { item { BitwardenInfoCalloutCard( - text = stringResource(R.string.personal_ownership_policy_in_effect), + text = stringResource(BitwardenString.personal_ownership_policy_in_effect), modifier = Modifier .standardHorizontalMargin() .testTag("PersonalOwnershipPolicyLabel") @@ -93,11 +93,11 @@ fun CoachMarkScope.VaultAddEditContent( if (shouldShowLearnAboutLoginsCard) { item { BitwardenActionCard( - cardTitle = stringResource(R.string.learn_about_new_logins), + cardTitle = stringResource(BitwardenString.learn_about_new_logins), cardSubtitle = stringResource( - R.string.we_ll_walk_you_through_the_key_features_to_add_a_new_login, + BitwardenString.we_ll_walk_you_through_the_key_features_to_add_a_new_login, ), - actionText = stringResource(R.string.get_started), + actionText = stringResource(BitwardenString.get_started), onActionClick = loginItemTypeHandlers.onStartLoginCoachMarkTour, onDismissClick = loginItemTypeHandlers.onDismissLearnAboutLoginsCard, modifier = Modifier @@ -110,7 +110,7 @@ fun CoachMarkScope.VaultAddEditContent( if (isAddItemMode) { item { BitwardenListHeaderText( - label = stringResource(id = R.string.item_details), + label = stringResource(id = BitwardenString.item_details), modifier = Modifier .fillMaxWidth() .standardHorizontalMargin() @@ -122,7 +122,7 @@ fun CoachMarkScope.VaultAddEditContent( item { Spacer(modifier = Modifier.height(height = 8.dp)) BitwardenTextField( - label = stringResource(id = R.string.item_name_required), + label = stringResource(id = BitwardenString.item_name_required), value = state.common.name, onValueChange = commonTypeHandlers.onNameTextChange, actions = { @@ -133,9 +133,9 @@ fun CoachMarkScope.VaultAddEditContent( BitwardenDrawable.ic_favorite_empty }, contentDescription = if (state.common.favorite) { - stringResource(id = R.string.favorite) + stringResource(id = BitwardenString.favorite) } else { - stringResource(id = R.string.unfavorite) + stringResource(id = BitwardenString.unfavorite) }, onClick = { commonTypeHandlers.onToggleFavorite(!state.common.favorite) }, modifier = Modifier.testTag(tag = "ItemFavoriteToggle"), @@ -152,7 +152,7 @@ fun CoachMarkScope.VaultAddEditContent( item { Spacer(modifier = Modifier.height(height = 8.dp)) BitwardenTextSelectionButton( - label = stringResource(id = R.string.folder), + label = stringResource(id = BitwardenString.folder), selectedOption = state.common.selectedFolder?.name, onClick = commonTypeHandlers.onSelectOrAddFolderForItem, cardStyle = if (isAddItemMode && state.common.hasOrganizations) { @@ -171,7 +171,7 @@ fun CoachMarkScope.VaultAddEditContent( val collections = state.common.selectedOwner?.collections.orEmpty() item { BitwardenTextSelectionButton( - label = stringResource(id = R.string.owner), + label = stringResource(id = BitwardenString.owner), selectedOption = state.common.selectedOwner?.name, onClick = commonTypeHandlers.onPresentOwnerOptions, cardStyle = if (collections.isNotEmpty()) { diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditLoginItems.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditLoginItems.kt index e245a363db..5eb2953984 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditLoginItems.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditLoginItems.kt @@ -25,10 +25,10 @@ import com.bitwarden.ui.platform.components.button.BitwardenStandardIconButton import com.bitwarden.ui.platform.components.model.CardStyle import com.bitwarden.ui.platform.components.model.TooltipData import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.platform.components.coachmark.CoachMarkActionText import com.x8bit.bitwarden.ui.platform.components.coachmark.CoachMarkScope import com.x8bit.bitwarden.ui.platform.components.coachmark.model.CoachMarkHighlightShape @@ -58,7 +58,7 @@ fun LazyListScope.vaultAddEditLoginItems( item { Spacer(modifier = Modifier.height(height = 16.dp)) BitwardenListHeaderText( - label = stringResource(id = R.string.login_credentials), + label = stringResource(id = BitwardenString.login_credentials), modifier = Modifier .fillMaxWidth() .standardHorizontalMargin() @@ -110,18 +110,18 @@ fun LazyListScope.vaultAddEditLoginItems( coachMarkHighlightItem( key = AddEditItemCoachMark.TOTP, - title = R.string.coachmark_2_of_3.asText(), - description = R.string.you_ll_only_need_to_set_up_authenticator_key.asText(), + title = BitwardenString.coachmark_2_of_3.asText(), + description = BitwardenString.you_ll_only_need_to_set_up_authenticator_key.asText(), onDismiss = onCoachMarkDismissed, leftAction = { CoachMarkActionText( - actionLabel = stringResource(R.string.back), + actionLabel = stringResource(BitwardenString.back), onActionClick = onPreviousCoachMark, ) }, rightAction = { CoachMarkActionText( - actionLabel = stringResource(R.string.next), + actionLabel = stringResource(BitwardenString.next), onActionClick = onNextCoachMark, ) }, @@ -141,7 +141,7 @@ fun LazyListScope.vaultAddEditLoginItems( item { Spacer(modifier = Modifier.height(height = 16.dp)) BitwardenListHeaderText( - label = stringResource(id = R.string.autofill_options), + label = stringResource(id = BitwardenString.autofill_options), modifier = Modifier .fillMaxWidth() .standardHorizontalMargin() @@ -152,26 +152,27 @@ fun LazyListScope.vaultAddEditLoginItems( coachMarkHighlightItems( key = AddEditItemCoachMark.URI, - title = R.string.coachmark_3_of_3.asText(), - description = R.string.you_must_add_a_web_address_to_use_autofill_to_access_this_account + title = BitwardenString.coachmark_3_of_3.asText(), + description = BitwardenString + .you_must_add_a_web_address_to_use_autofill_to_access_this_account .asText(), leftAction = { CoachMarkActionText( - actionLabel = stringResource(R.string.back), + actionLabel = stringResource(BitwardenString.back), onActionClick = onPreviousCoachMark, ) }, onDismiss = onCoachMarkDismissed, rightAction = { CoachMarkActionText( - actionLabel = stringResource(R.string.done_text), + actionLabel = stringResource(BitwardenString.done_text), onActionClick = onCoachMarkTourComplete, ) }, trailingContentIsBottomCard = true, trailingStaticContent = { BitwardenClickableText( - label = stringResource(id = R.string.add_website), + label = stringResource(id = BitwardenString.add_website), onClick = loginItemTypeHandlers.onAddNewUriClick, leadingIcon = painterResource(id = BitwardenDrawable.ic_plus_small), style = BitwardenTheme.typography.labelMedium, @@ -207,13 +208,13 @@ private fun UsernameRow( var shouldShowDialog by rememberSaveable { mutableStateOf(false) } BitwardenTextField( - label = stringResource(id = R.string.username), + label = stringResource(id = BitwardenString.username), value = username, onValueChange = loginItemTypeHandlers.onUsernameTextChange, actions = { BitwardenStandardIconButton( vectorIconRes = BitwardenDrawable.ic_generate, - contentDescription = stringResource(id = R.string.generate_username), + contentDescription = stringResource(id = BitwardenString.generate_username), onClick = { if (username.isEmpty()) { loginItemTypeHandlers.onOpenUsernameGeneratorClick() @@ -231,12 +232,12 @@ private fun UsernameRow( if (shouldShowDialog) { BitwardenTwoButtonDialog( - title = stringResource(id = R.string.username), + title = stringResource(id = BitwardenString.username), message = stringResource( - id = R.string.are_you_sure_you_want_to_overwrite_the_current_username, + id = BitwardenString.are_you_sure_you_want_to_overwrite_the_current_username, ), - confirmButtonText = stringResource(id = R.string.yes), - dismissButtonText = stringResource(id = R.string.no), + confirmButtonText = stringResource(id = BitwardenString.yes), + dismissButtonText = stringResource(id = BitwardenString.no), onConfirmClick = { shouldShowDialog = false loginItemTypeHandlers.onOpenUsernameGeneratorClick() @@ -266,7 +267,7 @@ private fun CoachMarkScope.PasswordRow( if (canViewPassword) { var shouldShowPassword by remember { mutableStateOf(false) } BitwardenPasswordField( - label = stringResource(id = R.string.password), + label = stringResource(id = BitwardenString.password), value = password, onValueChange = loginItemTypeHandlers.onPasswordTextChange, showPassword = shouldShowPassword, @@ -279,7 +280,7 @@ private fun CoachMarkScope.PasswordRow( supportingContentPadding = PaddingValues(), supportingContent = { BitwardenClickableText( - label = stringResource(id = R.string.check_password_for_data_breaches), + label = stringResource(id = BitwardenString.check_password_for_data_breaches), style = BitwardenTheme.typography.labelMedium, onClick = loginItemTypeHandlers.onPasswordCheckerClick, innerPadding = PaddingValues(all = 16.dp), @@ -294,23 +295,23 @@ private fun CoachMarkScope.PasswordRow( ) { CoachMarkHighlight( key = AddEditItemCoachMark.GENERATE_PASSWORD, - title = stringResource(R.string.coachmark_1_of_3), + title = stringResource(BitwardenString.coachmark_1_of_3), description = stringResource( - R.string.use_this_button_to_generate_a_new_unique_password, + BitwardenString.use_this_button_to_generate_a_new_unique_password, ), shape = CoachMarkHighlightShape.Oval, onDismiss = onCoachMarkDismissed, leftAction = null, rightAction = { CoachMarkActionText( - actionLabel = stringResource(R.string.next), + actionLabel = stringResource(BitwardenString.next), onActionClick = onGenerateCoachMarkActionClick, ) }, ) { BitwardenStandardIconButton( vectorIconRes = BitwardenDrawable.ic_generate, - contentDescription = stringResource(id = R.string.generate_password), + contentDescription = stringResource(id = BitwardenString.generate_password), onClick = { if (password.isEmpty()) { loginItemTypeHandlers.onOpenPasswordGeneratorClick() @@ -324,10 +325,10 @@ private fun CoachMarkScope.PasswordRow( if (shouldShowDialog) { BitwardenTwoButtonDialog( - title = stringResource(id = R.string.password), - message = stringResource(id = R.string.password_override_alert), - confirmButtonText = stringResource(id = R.string.yes), - dismissButtonText = stringResource(id = R.string.no), + title = stringResource(id = BitwardenString.password), + message = stringResource(id = BitwardenString.password_override_alert), + confirmButtonText = stringResource(id = BitwardenString.yes), + dismissButtonText = stringResource(id = BitwardenString.no), onConfirmClick = { shouldShowDialog = false loginItemTypeHandlers.onOpenPasswordGeneratorClick() @@ -343,7 +344,7 @@ private fun CoachMarkScope.PasswordRow( } } else { BitwardenHiddenPasswordField( - label = stringResource(id = R.string.password), + label = stringResource(id = BitwardenString.password), value = password, passwordFieldTestTag = "LoginPasswordEntry", cardStyle = CardStyle.Bottom, @@ -362,7 +363,7 @@ private fun TotpRow( modifier: Modifier = Modifier, ) { BitwardenPasswordField( - label = stringResource(id = R.string.authenticator_key), + label = stringResource(id = BitwardenString.authenticator_key), value = totpKey.orEmpty(), onValueChange = {}, readOnly = true, @@ -371,24 +372,24 @@ private fun TotpRow( totpKey?.let { BitwardenStandardIconButton( vectorIconRes = BitwardenDrawable.ic_clear, - contentDescription = stringResource(id = R.string.delete), + contentDescription = stringResource(id = BitwardenString.delete), onClick = loginItemTypeHandlers.onClearTotpKeyClick, ) BitwardenStandardIconButton( vectorIconRes = BitwardenDrawable.ic_copy, - contentDescription = stringResource(id = R.string.copy_totp), + contentDescription = stringResource(id = BitwardenString.copy_totp), onClick = { loginItemTypeHandlers.onCopyTotpKeyClick(totpKey) }, ) } }, tooltip = TooltipData( onClick = loginItemTypeHandlers.onAuthenticatorHelpToolTipClick, - contentDescription = stringResource(id = R.string.authenticator_key_help), + contentDescription = stringResource(id = BitwardenString.authenticator_key_help), ), supportingContentPadding = PaddingValues(), supportingContent = { BitwardenClickableText( - label = stringResource(id = R.string.set_up_authenticator_key), + label = stringResource(id = BitwardenString.set_up_authenticator_key), onClick = onTotpSetupClick, leadingIcon = painterResource(id = BitwardenDrawable.ic_camera_small), style = BitwardenTheme.typography.labelMedium, @@ -416,7 +417,7 @@ private fun PasskeyField( modifier: Modifier = Modifier, ) { BitwardenTextField( - label = stringResource(id = R.string.passkey), + label = stringResource(id = BitwardenString.passkey), value = creationDateTime.invoke(), onValueChange = { }, readOnly = true, @@ -425,7 +426,7 @@ private fun PasskeyField( if (canRemovePasskey) { BitwardenStandardIconButton( vectorIconRes = BitwardenDrawable.ic_minus, - contentDescription = stringResource(id = R.string.remove_passkey), + contentDescription = stringResource(id = BitwardenString.remove_passkey), onClick = loginItemTypeHandlers.onClearFido2CredentialClick, modifier = Modifier.testTag(tag = "RemovePasskeyButton"), ) diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditScreen.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditScreen.kt index 3c778e9b81..5f96eb829c 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditScreen.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditScreen.kt @@ -50,9 +50,9 @@ import com.bitwarden.ui.platform.components.button.BitwardenTextButton import com.bitwarden.ui.platform.components.model.CardStyle import com.bitwarden.ui.platform.components.util.rememberVectorPainter import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme import com.bitwarden.ui.util.Text -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.credentials.manager.CredentialProviderCompletionManager import com.x8bit.bitwarden.ui.platform.components.bottomsheet.BitwardenModalBottomSheet import com.x8bit.bitwarden.ui.platform.components.coachmark.CoachMarkContainer @@ -298,10 +298,10 @@ fun VaultAddEditScreen( if (pendingDeleteCipher) { BitwardenTwoButtonDialog( - title = stringResource(id = R.string.delete), - message = stringResource(id = R.string.do_you_really_want_to_soft_delete_cipher), - confirmButtonText = stringResource(id = R.string.okay), - dismissButtonText = stringResource(id = R.string.cancel), + title = stringResource(id = BitwardenString.delete), + message = stringResource(id = BitwardenString.do_you_really_want_to_soft_delete_cipher), + confirmButtonText = stringResource(id = BitwardenString.okay), + dismissButtonText = stringResource(id = BitwardenString.cancel), onConfirmClick = { pendingDeleteCipher = false confirmDeleteClickAction() @@ -332,7 +332,9 @@ fun VaultAddEditScreen( title = state.screenDisplayName(), navigationIcon = NavigationIcon( navigationIcon = rememberVectorPainter(id = BitwardenDrawable.ic_close), - navigationIconContentDescription = stringResource(id = R.string.close), + navigationIconContentDescription = stringResource( + id = BitwardenString.close, + ), onNavigationIconClick = remember(viewModel) { { viewModel.trySendAction(VaultAddEditAction.Common.CloseClick) } }, @@ -341,17 +343,17 @@ fun VaultAddEditScreen( scrollBehavior = scrollBehavior, actions = { BitwardenTextButton( - label = stringResource(id = R.string.save), + label = stringResource(id = BitwardenString.save), onClick = remember(viewModel) { { viewModel.trySendAction(VaultAddEditAction.Common.SaveClick) } }, modifier = Modifier.testTag("SaveButton"), ) BitwardenOverflowActionItem( - contentDescription = stringResource(R.string.more), + contentDescription = stringResource(BitwardenString.more), menuItemDataList = persistentListOfNotNull( OverflowMenuItemData( - text = stringResource(id = R.string.attachments), + text = stringResource(id = BitwardenString.attachments), onClick = remember(viewModel) { { viewModel.trySendAction( @@ -362,7 +364,9 @@ fun VaultAddEditScreen( ) .takeUnless { state.isAddItemMode }, OverflowMenuItemData( - text = stringResource(id = R.string.move_to_organization), + text = stringResource( + id = BitwardenString.move_to_organization, + ), onClick = remember(viewModel) { { viewModel.trySendAction( @@ -375,7 +379,7 @@ fun VaultAddEditScreen( state.isAddItemMode || state.isCipherInCollection }, OverflowMenuItemData( - text = stringResource(id = R.string.collections), + text = stringResource(id = BitwardenString.collections), onClick = remember(viewModel) { { viewModel.trySendAction( @@ -390,7 +394,7 @@ fun VaultAddEditScreen( !state.canAssociateToCollections }, OverflowMenuItemData( - text = stringResource(id = R.string.delete), + text = stringResource(id = BitwardenString.delete), onClick = { pendingDeleteCipher = true }, ) .takeUnless { state.isAddItemMode || !state.canDelete }, @@ -490,15 +494,15 @@ private fun VaultAddEditItemDialogs( is VaultAddEditState.DialogState.InitialAutofillPrompt -> { BitwardenBasicDialog( - title = stringResource(id = R.string.bitwarden_autofill_service), - message = stringResource(id = R.string.bitwarden_autofill_service_alert2), + title = stringResource(id = BitwardenString.bitwarden_autofill_service), + message = stringResource(id = BitwardenString.bitwarden_autofill_service_alert2), onDismissRequest = onAutofillDismissRequest, ) } is VaultAddEditState.DialogState.Fido2Error -> { BitwardenBasicDialog( - title = stringResource(id = R.string.an_error_has_occurred), + title = stringResource(id = BitwardenString.an_error_has_occurred), message = dialogState.message(), onDismissRequest = { onFido2ErrorDismiss(dialogState.message) }, ) @@ -521,7 +525,7 @@ private fun VaultAddEditItemDialogs( is VaultAddEditState.DialogState.Fido2MasterPasswordError -> { BitwardenBasicDialog( title = null, - message = stringResource(id = R.string.invalid_master_password), + message = stringResource(id = BitwardenString.invalid_master_password), onDismissRequest = onRetryFido2PasswordVerification, ) } @@ -536,7 +540,7 @@ private fun VaultAddEditItemDialogs( is VaultAddEditState.DialogState.Fido2PinError -> { BitwardenBasicDialog( title = null, - message = stringResource(id = R.string.invalid_pin), + message = stringResource(id = BitwardenString.invalid_pin), onDismissRequest = onRetryFido2PinVerification, ) } @@ -553,8 +557,8 @@ private fun VaultAddEditItemDialogs( BitwardenBasicDialog( title = null, message = stringResource( - id = R.string.validation_field_required, - stringResource(id = R.string.pin), + id = BitwardenString.validation_field_required, + stringResource(id = BitwardenString.pin), ), onDismissRequest = onRetryPinSetUpFido2Verification, ) @@ -603,11 +607,11 @@ private fun FolderSelectionBottomSheet( mutableStateOf(state.selectedFolder?.name.orEmpty()) } BitwardenModalBottomSheet( - sheetTitle = stringResource(R.string.folders), + sheetTitle = stringResource(BitwardenString.folders), onDismiss = handlers.onDismissBottomSheet, topBarActions = { animatedOnDismiss -> BitwardenTextButton( - label = stringResource(R.string.save), + label = stringResource(BitwardenString.save), onClick = { handlers.onDismissBottomSheet() state @@ -697,7 +701,7 @@ private fun FolderSelectionBottomSheetContent( val cardStyle = if (options.isEmpty()) CardStyle.Full else CardStyle.Bottom if (inEditMode) { BitwardenTextField( - label = stringResource(R.string.add_folder), + label = stringResource(BitwardenString.add_folder), value = addFolderText, onValueChange = { addFolderText = it @@ -718,7 +722,7 @@ private fun FolderSelectionBottomSheetContent( ) } else { BitwardenClickableText( - label = stringResource(id = R.string.add_folder), + label = stringResource(id = BitwardenString.add_folder), onClick = { onOptionSelected(addFolderText) inEditMode = true @@ -754,11 +758,11 @@ private fun OwnerSelectionBottomSheet( mutableStateOf(state.selectedOwner?.name.orEmpty()) } BitwardenModalBottomSheet( - sheetTitle = stringResource(R.string.owner), + sheetTitle = stringResource(BitwardenString.owner), onDismiss = handlers.onDismissBottomSheet, topBarActions = { animatedOnDismiss -> BitwardenTextButton( - label = stringResource(R.string.save), + label = stringResource(BitwardenString.save), onClick = { handlers.onDismissBottomSheet() state diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditSecureNotesItems.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditSecureNotesItems.kt index 43d1657cce..cc22ead133 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditSecureNotesItems.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditSecureNotesItems.kt @@ -9,7 +9,7 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import com.bitwarden.ui.platform.base.util.standardHorizontalMargin import com.bitwarden.ui.platform.components.model.CardStyle -import com.x8bit.bitwarden.R +import com.bitwarden.ui.platform.resource.BitwardenString import com.x8bit.bitwarden.ui.platform.components.field.BitwardenTextField import com.x8bit.bitwarden.ui.vault.feature.addedit.handlers.VaultAddEditCommonHandlers @@ -24,7 +24,7 @@ fun LazyListScope.vaultAddEditSecureNotesItems( Spacer(modifier = Modifier.height(height = 8.dp)) BitwardenTextField( singleLine = false, - label = stringResource(id = R.string.notes), + label = stringResource(id = BitwardenString.notes), value = commonState.notes, onValueChange = commonTypeHandlers.onNotesTextChange, textFieldTestTag = "ItemNotesEntry", diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditSshKeyItems.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditSshKeyItems.kt index 98edeae616..469255af83 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditSshKeyItems.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditSshKeyItems.kt @@ -12,8 +12,8 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.bitwarden.ui.platform.base.util.standardHorizontalMargin import com.bitwarden.ui.platform.components.model.CardStyle +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.platform.components.field.BitwardenPasswordField import com.x8bit.bitwarden.ui.platform.components.field.BitwardenTextField import com.x8bit.bitwarden.ui.vault.feature.addedit.handlers.VaultAddEditSshKeyTypeHandlers @@ -28,7 +28,7 @@ fun LazyListScope.vaultAddEditSshKeyItems( item { Spacer(modifier = Modifier.height(8.dp)) BitwardenTextField( - label = stringResource(id = R.string.public_key), + label = stringResource(id = BitwardenString.public_key), value = sshKeyState.publicKey, readOnly = true, onValueChange = { }, @@ -42,7 +42,7 @@ fun LazyListScope.vaultAddEditSshKeyItems( item { BitwardenPasswordField( - label = stringResource(id = R.string.private_key), + label = stringResource(id = BitwardenString.private_key), value = sshKeyState.privateKey, readOnly = true, onValueChange = { /* no-op */ }, @@ -59,7 +59,7 @@ fun LazyListScope.vaultAddEditSshKeyItems( item { BitwardenTextField( - label = stringResource(id = R.string.fingerprint), + label = stringResource(id = BitwardenString.fingerprint), value = sshKeyState.fingerprint, readOnly = true, onValueChange = { /* no-op */ }, diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditUriItem.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditUriItem.kt index 09c8007d08..eaea58056e 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditUriItem.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditUriItem.kt @@ -11,7 +11,7 @@ import androidx.compose.ui.res.stringResource import com.bitwarden.ui.platform.components.button.BitwardenStandardIconButton import com.bitwarden.ui.platform.components.model.CardStyle import com.bitwarden.ui.platform.resource.BitwardenDrawable -import com.x8bit.bitwarden.R +import com.bitwarden.ui.platform.resource.BitwardenString import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenSelectionDialog import com.x8bit.bitwarden.ui.platform.components.dialog.row.BitwardenBasicDialogRow import com.x8bit.bitwarden.ui.platform.components.dialog.row.BitwardenSelectionRow @@ -37,13 +37,13 @@ fun VaultAddEditUriItem( var shouldShowMatchDialog by rememberSaveable { mutableStateOf(false) } BitwardenTextField( - label = stringResource(id = R.string.website_uri), + label = stringResource(id = BitwardenString.website_uri), value = uriItem.uri.orEmpty(), onValueChange = { onUriValueChange(uriItem.copy(uri = it)) }, actions = { BitwardenStandardIconButton( vectorIconRes = BitwardenDrawable.ic_cog, - contentDescription = stringResource(id = R.string.options), + contentDescription = stringResource(id = BitwardenString.options), onClick = { shouldShowOptionsDialog = true }, modifier = Modifier.testTag(tag = "LoginUriOptionsButton"), ) @@ -55,18 +55,18 @@ fun VaultAddEditUriItem( if (shouldShowOptionsDialog) { BitwardenSelectionDialog( - title = stringResource(id = R.string.options), + title = stringResource(id = BitwardenString.options), onDismissRequest = { shouldShowOptionsDialog = false }, ) { BitwardenBasicDialogRow( - text = stringResource(id = R.string.match_detection), + text = stringResource(id = BitwardenString.match_detection), onClick = { shouldShowOptionsDialog = false shouldShowMatchDialog = true }, ) BitwardenBasicDialogRow( - text = stringResource(id = R.string.remove), + text = stringResource(id = BitwardenString.remove), onClick = { shouldShowOptionsDialog = false onUriItemRemoved(uriItem) @@ -79,7 +79,7 @@ fun VaultAddEditUriItem( val selectedString = uriItem.match.toDisplayMatchType().text.invoke() BitwardenSelectionDialog( - title = stringResource(id = R.string.uri_match_detection), + title = stringResource(id = BitwardenString.uri_match_detection), onDismissRequest = { shouldShowMatchDialog = false }, ) { UriMatchDisplayType diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditViewModel.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditViewModel.kt index e7c7c5675a..6cb31e483f 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditViewModel.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditViewModel.kt @@ -12,12 +12,12 @@ import com.bitwarden.core.data.repository.util.takeUntilLoaded import com.bitwarden.network.model.PolicyTypeJson import com.bitwarden.ui.platform.base.BackgroundEvent import com.bitwarden.ui.platform.base.BaseViewModel +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText import com.bitwarden.vault.CipherView import com.bitwarden.vault.DecryptCipherListResult import com.bitwarden.vault.FolderView -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.auth.repository.AuthRepository import com.x8bit.bitwarden.data.auth.repository.model.BreachCountResult import com.x8bit.bitwarden.data.auth.repository.model.UserState @@ -400,7 +400,8 @@ class VaultAddEditViewModel @Inject constructor( private fun handleSaveClick() = onContent { content -> if (content.common.name.isBlank()) { showGenericErrorDialog( - message = R.string.validation_field_required.asText(R.string.name.asText()), + message = BitwardenString.validation_field_required + .asText(BitwardenString.name.asText()), ) return@onContent } else if ( @@ -408,7 +409,7 @@ class VaultAddEditViewModel @Inject constructor( content.common.selectedOwner?.collections?.all { !it.isSelected } == true ) { showGenericErrorDialog( - message = R.string.select_one_collection.asText(), + message = BitwardenString.select_one_collection.asText(), ) return@onContent } else if ( @@ -416,8 +417,8 @@ class VaultAddEditViewModel @Inject constructor( ) { showDialog( dialogState = VaultAddEditState.DialogState.Generic( - title = R.string.internet_connection_required_title.asText(), - message = R.string.internet_connection_required_message.asText(), + title = BitwardenString.internet_connection_required_title.asText(), + message = BitwardenString.internet_connection_required_message.asText(), ), ) return@onContent @@ -426,7 +427,7 @@ class VaultAddEditViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialog = VaultAddEditState.DialogState.Loading( - R.string.saving.asText(), + BitwardenString.saving.asText(), ), ) } @@ -517,7 +518,7 @@ class VaultAddEditViewModel @Inject constructor( val userId = authRepository.activeUserId ?: run { showFido2ErrorDialog( - R.string.passkey_operation_failed_because_user_could_not_be_verified + BitwardenString.passkey_operation_failed_because_user_could_not_be_verified .asText(), ) return@launch @@ -537,7 +538,7 @@ class VaultAddEditViewModel @Inject constructor( private fun handleUnsupportedProviderCreateCredentialRequest() { showFido2ErrorDialog( - R.string.passkey_operation_failed_because_the_request_is_unsupported.asText(), + BitwardenString.passkey_operation_failed_because_the_request_is_unsupported.asText(), ) } @@ -557,7 +558,7 @@ class VaultAddEditViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialog = VaultAddEditState.DialogState.Loading( - R.string.soft_deleting.asText(), + BitwardenString.soft_deleting.asText(), ), ) } @@ -619,14 +620,14 @@ class VaultAddEditViewModel @Inject constructor( } } ?: showFido2ErrorDialog( - R.string.passkey_operation_failed_because_the_request_is_invalid.asText(), + BitwardenString.passkey_operation_failed_because_the_request_is_invalid.asText(), ) } private fun handleUserVerificationLockOut() { bitwardenCredentialManager.isUserVerified = false showFido2ErrorDialog( - R.string.passkey_operation_failed_because_user_could_not_be_verified.asText(), + BitwardenString.passkey_operation_failed_because_user_could_not_be_verified.asText(), ) } @@ -647,13 +648,14 @@ class VaultAddEditViewModel @Inject constructor( } } ?: showFido2ErrorDialog( - R.string.passkey_operation_failed_because_the_request_is_unsupported.asText(), + BitwardenString.passkey_operation_failed_because_the_request_is_unsupported + .asText(), ) private fun handleUserVerificationFail() { bitwardenCredentialManager.isUserVerified = false showFido2ErrorDialog( - R.string.passkey_operation_failed_because_user_could_not_be_verified.asText(), + BitwardenString.passkey_operation_failed_because_user_could_not_be_verified.asText(), ) } @@ -688,7 +690,8 @@ class VaultAddEditViewModel @Inject constructor( ?.activeAccount ?: run { showFido2ErrorDialog( - R.string.passkey_operation_failed_because_user_could_not_be_verified.asText(), + BitwardenString.passkey_operation_failed_because_user_could_not_be_verified + .asText(), ) return } @@ -775,7 +778,7 @@ class VaultAddEditViewModel @Inject constructor( private fun handleDismissFido2VerificationDialogClick() { showFido2ErrorDialog( - R.string.passkey_operation_failed_because_user_could_not_be_verified + BitwardenString.passkey_operation_failed_because_user_could_not_be_verified .asText(), ) } @@ -807,7 +810,7 @@ class VaultAddEditViewModel @Inject constructor( private fun handleAddNewFolder(action: VaultAddEditAction.Common.AddNewFolder) { mutableStateFlow.update { it.copy( - dialog = VaultAddEditState.DialogState.Loading(R.string.saving.asText()), + dialog = VaultAddEditState.DialogState.Loading(BitwardenString.saving.asText()), ) } viewModelScope.launch { @@ -1135,7 +1138,11 @@ class VaultAddEditViewModel @Inject constructor( private fun handleLoginPasswordCheckerClick() { onLoginType { loginType -> mutableStateFlow.update { - it.copy(dialog = VaultAddEditState.DialogState.Loading(R.string.loading.asText())) + it.copy( + dialog = VaultAddEditState.DialogState.Loading( + BitwardenString.loading.asText(), + ), + ) } viewModelScope.launch { @@ -1164,7 +1171,7 @@ class VaultAddEditViewModel @Inject constructor( ) { clipboardManager.setText( text = action.totpKey, - toastDescriptorOverride = R.string.authenticator_key.asText(), + toastDescriptorOverride = BitwardenString.authenticator_key.asText(), ) } @@ -1178,7 +1185,7 @@ class VaultAddEditViewModel @Inject constructor( updateLoginContent { loginType -> loginType.copy(fido2CredentialCreationDateTime = null) } - sendEvent(event = VaultAddEditEvent.ShowToast(R.string.passkey_removed.asText())) + sendEvent(event = VaultAddEditEvent.ShowToast(BitwardenString.passkey_removed.asText())) } private fun handlePasswordVisibilityChange( @@ -1625,11 +1632,11 @@ class VaultAddEditViewModel @Inject constructor( is CreateCipherResult.Error -> { showDialog( dialogState = VaultAddEditState.DialogState.Generic( - title = R.string.an_error_has_occurred.asText(), + title = BitwardenString.an_error_has_occurred.asText(), message = result .errorMessage ?.asText() - ?: R.string.generic_error_message.asText(), + ?: BitwardenString.generic_error_message.asText(), error = result.error, ), ) @@ -1643,7 +1650,9 @@ class VaultAddEditViewModel @Inject constructor( sendEvent(event = VaultAddEditEvent.ExitApp) } else { sendEvent( - event = VaultAddEditEvent.ShowToast(R.string.new_item_created.asText()), + event = VaultAddEditEvent.ShowToast( + BitwardenString.new_item_created.asText(), + ), ) sendEvent(event = VaultAddEditEvent.NavigateBack) } @@ -1659,11 +1668,11 @@ class VaultAddEditViewModel @Inject constructor( is UpdateCipherResult.Error -> { showDialog( dialogState = VaultAddEditState.DialogState.Generic( - title = R.string.an_error_has_occurred.asText(), + title = BitwardenString.an_error_has_occurred.asText(), message = result .errorMessage ?.asText() - ?: R.string.generic_error_message.asText(), + ?: BitwardenString.generic_error_message.asText(), error = result.error, ), ) @@ -1674,7 +1683,11 @@ class VaultAddEditViewModel @Inject constructor( if (state.shouldExitOnSave) { sendEvent(event = VaultAddEditEvent.ExitApp) } else { - sendEvent(event = VaultAddEditEvent.ShowToast(R.string.item_updated.asText())) + sendEvent( + event = VaultAddEditEvent.ShowToast( + BitwardenString.item_updated.asText(), + ), + ) sendEvent(event = VaultAddEditEvent.NavigateBack) } } @@ -1686,7 +1699,7 @@ class VaultAddEditViewModel @Inject constructor( is DeleteCipherResult.Error -> { showDialog( dialogState = VaultAddEditState.DialogState.Generic( - message = R.string.generic_error_message.asText(), + message = BitwardenString.generic_error_message.asText(), error = result.error, ), ) @@ -1696,7 +1709,7 @@ class VaultAddEditViewModel @Inject constructor( clearDialogState() sendEvent( VaultAddEditEvent.ShowToast( - message = R.string.item_soft_deleted.asText(), + message = BitwardenString.item_soft_deleted.asText(), ), ) sendEvent(VaultAddEditEvent.NavigateBack) @@ -1710,7 +1723,7 @@ class VaultAddEditViewModel @Inject constructor( mutableStateFlow.update { it.copy( viewState = VaultAddEditState.ViewState.Error( - message = R.string.generic_error_message.asText(), + message = BitwardenString.generic_error_message.asText(), ), ) } @@ -1874,7 +1887,7 @@ class VaultAddEditViewModel @Inject constructor( is TotpCodeResult.Success -> { sendEvent( event = VaultAddEditEvent.ShowToast( - message = R.string.authenticator_key_added.asText(), + message = BitwardenString.authenticator_key_added.asText(), ), ) @@ -1886,8 +1899,8 @@ class VaultAddEditViewModel @Inject constructor( is TotpCodeResult.CodeScanningError -> { showDialog( dialogState = VaultAddEditState.DialogState.Generic( - title = R.string.an_error_has_occurred.asText(), - message = R.string.authenticator_key_read_error.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.authenticator_key_read_error.asText(), error = result.error, ), ) @@ -1924,7 +1937,7 @@ class VaultAddEditViewModel @Inject constructor( dialogState = when (val result = action.result) { is BreachCountResult.Error -> { VaultAddEditState.DialogState.Generic( - message = R.string.generic_error_message.asText(), + message = BitwardenString.generic_error_message.asText(), error = result.error, ) } @@ -1932,9 +1945,9 @@ class VaultAddEditViewModel @Inject constructor( is BreachCountResult.Success -> { VaultAddEditState.DialogState.Generic( message = if (result.breachCount > 0) { - R.string.password_exposed.asText(result.breachCount) + BitwardenString.password_exposed.asText(result.breachCount) } else { - R.string.password_safe.asText() + BitwardenString.password_safe.asText() }, ) } @@ -1948,7 +1961,11 @@ class VaultAddEditViewModel @Inject constructor( clearDialogState() when (action.result) { is Fido2RegisterCredentialResult.Error -> { - sendEvent(VaultAddEditEvent.ShowToast(R.string.an_error_has_occurred.asText())) + sendEvent( + VaultAddEditEvent.ShowToast( + BitwardenString.an_error_has_occurred.asText(), + ), + ) sendEvent( VaultAddEditEvent.CompleteFido2Registration( RegisterFido2CredentialResult.Error( @@ -1959,7 +1976,7 @@ class VaultAddEditViewModel @Inject constructor( } is Fido2RegisterCredentialResult.Success -> { - sendEvent(VaultAddEditEvent.ShowToast(R.string.item_updated.asText())) + sendEvent(VaultAddEditEvent.ShowToast(BitwardenString.item_updated.asText())) sendEvent( VaultAddEditEvent.CompleteFido2Registration( RegisterFido2CredentialResult.Success(action.result.responseJson), @@ -1977,7 +1994,7 @@ class VaultAddEditViewModel @Inject constructor( when (action.result) { is ValidatePasswordResult.Error -> { showFido2ErrorDialog( - R.string.passkey_operation_failed_because_user_could_not_be_verified + BitwardenString.passkey_operation_failed_because_user_could_not_be_verified .asText(), ) } @@ -2002,7 +2019,8 @@ class VaultAddEditViewModel @Inject constructor( when (action.result) { is ValidatePinResult.Error -> { showFido2ErrorDialog( - R.string.passkey_operation_failed_because_user_could_not_be_verified.asText(), + BitwardenString.passkey_operation_failed_because_user_could_not_be_verified + .asText(), ) } @@ -2026,7 +2044,8 @@ class VaultAddEditViewModel @Inject constructor( } } else { showFido2ErrorDialog( - R.string.passkey_operation_failed_because_user_could_not_be_verified.asText(), + BitwardenString.passkey_operation_failed_because_user_could_not_be_verified + .asText(), ) } } @@ -2058,11 +2077,11 @@ class VaultAddEditViewModel @Inject constructor( } private fun showGenericErrorDialog( - message: Text = R.string.generic_error_message.asText(), + message: Text = BitwardenString.generic_error_message.asText(), ) { showDialog( dialogState = VaultAddEditState.DialogState.Generic( - title = R.string.an_error_has_occurred.asText(), + title = BitwardenString.an_error_has_occurred.asText(), message = message, ), ) @@ -2231,19 +2250,19 @@ data class VaultAddEditState( is VaultAddEditType.AddItem, is VaultAddEditType.CloneItem, -> when (cipherType) { - VaultItemCipherType.LOGIN -> R.string.new_login.asText() - VaultItemCipherType.CARD -> R.string.new_card.asText() - VaultItemCipherType.IDENTITY -> R.string.new_identity.asText() - VaultItemCipherType.SECURE_NOTE -> R.string.new_note.asText() - VaultItemCipherType.SSH_KEY -> R.string.new_ssh_key.asText() + VaultItemCipherType.LOGIN -> BitwardenString.new_login.asText() + VaultItemCipherType.CARD -> BitwardenString.new_card.asText() + VaultItemCipherType.IDENTITY -> BitwardenString.new_identity.asText() + VaultItemCipherType.SECURE_NOTE -> BitwardenString.new_note.asText() + VaultItemCipherType.SSH_KEY -> BitwardenString.new_ssh_key.asText() } is VaultAddEditType.EditItem -> when (cipherType) { - VaultItemCipherType.LOGIN -> R.string.edit_login.asText() - VaultItemCipherType.CARD -> R.string.edit_card.asText() - VaultItemCipherType.IDENTITY -> R.string.edit_identity.asText() - VaultItemCipherType.SECURE_NOTE -> R.string.edit_note.asText() - VaultItemCipherType.SSH_KEY -> R.string.edit_ssh_key.asText() + VaultItemCipherType.LOGIN -> BitwardenString.edit_login.asText() + VaultItemCipherType.CARD -> BitwardenString.edit_card.asText() + VaultItemCipherType.IDENTITY -> BitwardenString.edit_identity.asText() + VaultItemCipherType.SECURE_NOTE -> BitwardenString.edit_note.asText() + VaultItemCipherType.SSH_KEY -> BitwardenString.edit_ssh_key.asText() } } @@ -2294,11 +2313,11 @@ data class VaultAddEditState( * @property labelRes The resource ID of the string that represents the label of each type. */ enum class ItemTypeOption(val labelRes: Int) { - LOGIN(R.string.type_login), - CARD(R.string.type_card), - IDENTITY(R.string.type_identity), - SECURE_NOTES(R.string.type_secure_note), - SSH_KEYS(R.string.type_ssh_key), + LOGIN(BitwardenString.type_login), + CARD(BitwardenString.type_card), + IDENTITY(BitwardenString.type_identity), + SECURE_NOTES(BitwardenString.type_secure_note), + SSH_KEYS(BitwardenString.type_ssh_key), } /** diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/model/CustomFieldAction.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/model/CustomFieldAction.kt index 9b053a68cd..d65f9a3a41 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/model/CustomFieldAction.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/model/CustomFieldAction.kt @@ -1,16 +1,16 @@ package com.x8bit.bitwarden.ui.vault.feature.addedit.model +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R /** * Represents the different actions that can be taken in a custom * item edit menu. */ enum class CustomFieldAction(val actionText: Text) { - EDIT(R.string.edit.asText()), - MOVE_UP(R.string.move_up.asText()), - MOVE_DOWN(R.string.move_down.asText()), - REMOVE(R.string.remove.asText()), + EDIT(BitwardenString.edit.asText()), + MOVE_UP(BitwardenString.move_up.asText()), + MOVE_DOWN(BitwardenString.move_down.asText()), + REMOVE(BitwardenString.remove.asText()), } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/model/CustomFieldType.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/model/CustomFieldType.kt index a5ef23cb8f..09c8959cb3 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/model/CustomFieldType.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/model/CustomFieldType.kt @@ -1,8 +1,8 @@ package com.x8bit.bitwarden.ui.vault.feature.addedit.model +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.vault.feature.addedit.VaultAddEditState import com.x8bit.bitwarden.ui.vault.model.VaultLinkedFieldType import java.util.UUID @@ -11,10 +11,10 @@ import java.util.UUID * The Enum representing the Custom Field type that is being added by the user. */ enum class CustomFieldType(val typeText: Text) { - LINKED(R.string.field_type_linked.asText()), - HIDDEN(R.string.field_type_hidden.asText()), - BOOLEAN(R.string.field_type_boolean.asText()), - TEXT(R.string.field_type_text.asText()), + LINKED(BitwardenString.field_type_linked.asText()), + HIDDEN(BitwardenString.field_type_hidden.asText()), + BOOLEAN(BitwardenString.field_type_boolean.asText()), + TEXT(BitwardenString.field_type_text.asText()), } /** diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/model/UriMatchDisplayType.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/model/UriMatchDisplayType.kt index 8dc1831f1b..dc3bcc54f3 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/model/UriMatchDisplayType.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/model/UriMatchDisplayType.kt @@ -1,8 +1,8 @@ package com.x8bit.bitwarden.ui.vault.feature.addedit.model +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R /** * The options displayed to the user when choosing a match type @@ -15,36 +15,36 @@ enum class UriMatchDisplayType( /** * the default option for when the user has not chosen one. */ - DEFAULT(R.string.default_text.asText()), + DEFAULT(BitwardenString.default_text.asText()), /** * The URIs match if their top-level and second-level domains match. */ - BASE_DOMAIN(R.string.base_domain.asText()), + BASE_DOMAIN(BitwardenString.base_domain.asText()), /** * The URIs match if their hostnames (and ports if specified) match. */ - HOST(R.string.host.asText()), + HOST(BitwardenString.host.asText()), /** * The URIs match if the "test" URI starts with the known URI. */ - STARTS_WITH(R.string.starts_with.asText()), + STARTS_WITH(BitwardenString.starts_with.asText()), /** * The URIs match if the "test" URI matches the known URI according to a specified regular * expression for the item. */ - REGULAR_EXPRESSION(R.string.reg_ex.asText()), + REGULAR_EXPRESSION(BitwardenString.reg_ex.asText()), /** * The URIs match if they are exactly the same. */ - EXACT(R.string.exact.asText()), + EXACT(BitwardenString.exact.asText()), /** * The URIs should never match. */ - NEVER(R.string.never.asText()), + NEVER(BitwardenString.never.asText()), } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/util/CipherViewExtensions.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/util/CipherViewExtensions.kt index d4f7f5392a..d56d2ca703 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/util/CipherViewExtensions.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/util/CipherViewExtensions.kt @@ -3,6 +3,7 @@ package com.x8bit.bitwarden.ui.vault.feature.addedit.util import com.bitwarden.core.data.util.toFormattedDateTimeStyle +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.asText import com.bitwarden.vault.CipherRepromptType import com.bitwarden.vault.CipherType @@ -13,7 +14,6 @@ import com.bitwarden.vault.FieldType import com.bitwarden.vault.FieldView import com.bitwarden.vault.FolderView import com.bitwarden.vault.LoginUriView -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.auth.repository.model.UserState import com.x8bit.bitwarden.ui.platform.manager.resource.ResourceManager import com.x8bit.bitwarden.ui.vault.feature.addedit.VaultAddEditState @@ -166,7 +166,7 @@ fun CipherView?.validateCipherOrReturnErrorState( if (currentAccount == null || (vaultAddEditType is VaultAddEditType.EditItem && this == null) ) { - VaultAddEditState.ViewState.Error(R.string.generic_error_message.asText()) + VaultAddEditState.ViewState.Error(BitwardenString.generic_error_message.asText()) } else { lambda(currentAccount, this) } @@ -186,7 +186,7 @@ fun List.toAvailableFolders( listOf( VaultAddEditState.Folder( id = null, - name = resourceManager.getString(R.string.folder_none), + name = resourceManager.getString(BitwardenString.folder_none), ), ) .plus( @@ -287,7 +287,7 @@ private fun String.appendCloneTextIfRequired( resourceManager: ResourceManager, ): String = if (isClone) { - plus(" - ${resourceManager.getString(R.string.clone)}") + plus(" - ${resourceManager.getString(BitwardenString.clone)}") } else { this } @@ -329,7 +329,7 @@ private fun List?.getPrimaryFido2CredentialOrNull( * Return the creation date and time of the primary FIDO2 credential, formatted as * "MMM d, yyyy, hh:mm a". */ -private fun Fido2Credential.getCreationDateTime(clock: Clock) = R.string.created_x.asText( +private fun Fido2Credential.getCreationDateTime(clock: Clock) = BitwardenString.created_x.asText( creationDate.toFormattedDateTimeStyle( dateStyle = FormatStyle.MEDIUM, timeStyle = FormatStyle.SHORT, diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/util/VaultAddEditExtensions.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/util/VaultAddEditExtensions.kt index 7d608fcfd5..5d4fc4968f 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/util/VaultAddEditExtensions.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/util/VaultAddEditExtensions.kt @@ -1,9 +1,9 @@ package com.x8bit.bitwarden.ui.vault.feature.addedit.util +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText import com.bitwarden.ui.util.concat -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.vault.feature.addedit.VaultAddEditState import com.x8bit.bitwarden.ui.vault.model.VaultItemCipherType @@ -13,7 +13,7 @@ import com.x8bit.bitwarden.ui.vault.model.VaultItemCipherType val SELECT_TEXT: Text get() = "-- " .asText() - .concat(R.string.select.asText()) + .concat(BitwardenString.select.asText()) .concat(" --".asText()) /** diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/attachments/AttachmentsContent.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/attachments/AttachmentsContent.kt index 4dac983f51..5ea95ef499 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/attachments/AttachmentsContent.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/attachments/AttachmentsContent.kt @@ -30,8 +30,8 @@ import com.bitwarden.ui.platform.components.button.BitwardenOutlinedButton import com.bitwarden.ui.platform.components.button.BitwardenStandardIconButton import com.bitwarden.ui.platform.components.model.CardStyle import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenTwoButtonDialog import com.x8bit.bitwarden.ui.platform.components.header.BitwardenListHeaderText import com.x8bit.bitwarden.ui.vault.feature.attachments.handlers.AttachmentsHandlers @@ -51,7 +51,7 @@ fun AttachmentsContent( item { Spacer(modifier = Modifier.height(8.dp)) Text( - text = stringResource(id = R.string.no_attachments), + text = stringResource(id = BitwardenString.no_attachments), style = BitwardenTheme.typography.bodyMedium, color = BitwardenTheme.colorScheme.text.primary, textAlign = TextAlign.Center, @@ -82,7 +82,7 @@ fun AttachmentsContent( item { Spacer(modifier = Modifier.height(height = 16.dp)) BitwardenListHeaderText( - label = stringResource(id = R.string.add_new_attachment), + label = stringResource(id = BitwardenString.add_new_attachment), modifier = Modifier .fillMaxWidth() .standardHorizontalMargin() @@ -96,7 +96,7 @@ fun AttachmentsContent( text = viewState .newAttachment ?.displayName - ?: stringResource(id = R.string.no_file_chosen), + ?: stringResource(id = BitwardenString.no_file_chosen), color = BitwardenTheme.colorScheme.text.secondary, style = BitwardenTheme.typography.bodySmall, textAlign = TextAlign.Center, @@ -110,7 +110,7 @@ fun AttachmentsContent( item { Spacer(modifier = Modifier.height(8.dp)) BitwardenOutlinedButton( - label = stringResource(id = R.string.choose_file), + label = stringResource(id = BitwardenString.choose_file), onClick = attachmentsHandlers.onChooseFileClick, modifier = Modifier .fillMaxWidth() @@ -119,7 +119,7 @@ fun AttachmentsContent( ) Spacer(modifier = Modifier.height(4.dp)) Text( - text = stringResource(id = R.string.max_file_size), + text = stringResource(id = BitwardenString.max_file_size), color = BitwardenTheme.colorScheme.text.secondary, style = BitwardenTheme.typography.bodySmall, modifier = Modifier @@ -146,10 +146,10 @@ private fun AttachmentListEntry( var shouldShowDeleteDialog by rememberSaveable { mutableStateOf(false) } if (shouldShowDeleteDialog) { BitwardenTwoButtonDialog( - title = stringResource(id = R.string.delete), - message = stringResource(id = R.string.do_you_really_want_to_delete), - confirmButtonText = stringResource(id = R.string.delete), - dismissButtonText = stringResource(id = R.string.cancel), + title = stringResource(id = BitwardenString.delete), + message = stringResource(id = BitwardenString.do_you_really_want_to_delete), + confirmButtonText = stringResource(id = BitwardenString.delete), + dismissButtonText = stringResource(id = BitwardenString.cancel), onConfirmClick = { shouldShowDeleteDialog = false onDeleteClick(attachmentItem.id) @@ -191,7 +191,7 @@ private fun AttachmentListEntry( BitwardenStandardIconButton( vectorIconRes = BitwardenDrawable.ic_trash, - contentDescription = stringResource(id = R.string.delete), + contentDescription = stringResource(id = BitwardenString.delete), onClick = { shouldShowDeleteDialog = true }, modifier = Modifier .testTag("AttachmentDeleteButton"), diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/attachments/AttachmentsScreen.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/attachments/AttachmentsScreen.kt index 9c50541d8f..79a2b78b74 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/attachments/AttachmentsScreen.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/attachments/AttachmentsScreen.kt @@ -19,7 +19,7 @@ import com.bitwarden.ui.platform.components.appbar.NavigationIcon import com.bitwarden.ui.platform.components.button.BitwardenTextButton import com.bitwarden.ui.platform.components.util.rememberVectorPainter import com.bitwarden.ui.platform.resource.BitwardenDrawable -import com.x8bit.bitwarden.R +import com.bitwarden.ui.platform.resource.BitwardenString import com.x8bit.bitwarden.ui.platform.components.content.BitwardenErrorContent import com.x8bit.bitwarden.ui.platform.components.content.BitwardenLoadingContent import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenBasicDialog @@ -76,16 +76,16 @@ fun AttachmentsScreen( .fillMaxSize(), topBar = { BitwardenTopAppBar( - title = stringResource(id = R.string.attachments), + title = stringResource(id = BitwardenString.attachments), scrollBehavior = scrollBehavior, navigationIcon = NavigationIcon( navigationIcon = rememberVectorPainter(id = BitwardenDrawable.ic_back), - navigationIconContentDescription = stringResource(id = R.string.back), + navigationIconContentDescription = stringResource(id = BitwardenString.back), onNavigationIconClick = attachmentsHandlers.onBackClick, ), actions = { BitwardenTextButton( - label = stringResource(id = R.string.save), + label = stringResource(id = BitwardenString.save), onClick = attachmentsHandlers.onSaveClick, modifier = Modifier.testTag("SaveButton"), ) diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/attachments/AttachmentsViewModel.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/attachments/AttachmentsViewModel.kt index be87b11c00..7531a9cb43 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/attachments/AttachmentsViewModel.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/attachments/AttachmentsViewModel.kt @@ -6,11 +6,11 @@ import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.viewModelScope import com.bitwarden.core.data.repository.model.DataState import com.bitwarden.ui.platform.base.BaseViewModel +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText import com.bitwarden.ui.util.concat import com.bitwarden.vault.CipherView -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.auth.repository.AuthRepository import com.x8bit.bitwarden.data.auth.repository.model.UserState import com.x8bit.bitwarden.data.vault.repository.VaultRepository @@ -55,7 +55,7 @@ class AttachmentsViewModel @Inject constructor( viewState = AttachmentsState.ViewState.Loading, dialogState = AttachmentsState.DialogState.Error( title = null, - message = R.string.premium_required.asText(), + message = BitwardenString.premium_required.asText(), ) .takeUnless { isPremiumUser }, isPremiumUser = isPremiumUser, @@ -98,8 +98,8 @@ class AttachmentsViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = AttachmentsState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.premium_required.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.premium_required.asText(), ), ) } @@ -109,9 +109,9 @@ class AttachmentsViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = AttachmentsState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.validation_field_required.asText( - R.string.file.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.validation_field_required.asText( + BitwardenString.file.asText(), ), ), ) @@ -123,8 +123,8 @@ class AttachmentsViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = AttachmentsState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.max_file_size.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.max_file_size.asText(), ), ) } @@ -134,7 +134,7 @@ class AttachmentsViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = AttachmentsState.DialogState.Loading( - message = R.string.saving.asText(), + message = BitwardenString.saving.asText(), ), ) } @@ -177,7 +177,7 @@ class AttachmentsViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = AttachmentsState.DialogState.Loading( - message = R.string.deleting.asText(), + message = BitwardenString.deleting.asText(), ), ) } @@ -210,7 +210,7 @@ class AttachmentsViewModel @Inject constructor( mutableStateFlow.update { it.copy( viewState = AttachmentsState.ViewState.Error( - message = R.string.generic_error_message.asText(), + message = BitwardenString.generic_error_message.asText(), ), ) } @@ -223,7 +223,7 @@ class AttachmentsViewModel @Inject constructor( .data ?.toViewState() ?: AttachmentsState.ViewState.Error( - message = R.string.generic_error_message.asText(), + message = BitwardenString.generic_error_message.asText(), ), ) } @@ -238,11 +238,11 @@ class AttachmentsViewModel @Inject constructor( is DataState.NoNetwork -> mutableStateFlow.update { it.copy( viewState = AttachmentsState.ViewState.Error( - message = R.string.internet_connection_required_title + message = BitwardenString.internet_connection_required_title .asText() .concat( " ".asText(), - R.string.internet_connection_required_message.asText(), + BitwardenString.internet_connection_required_message.asText(), ), ), ) @@ -255,7 +255,7 @@ class AttachmentsViewModel @Inject constructor( .data ?.toViewState() ?: AttachmentsState.ViewState.Error( - message = R.string.generic_error_message.asText(), + message = BitwardenString.generic_error_message.asText(), ), ) } @@ -271,9 +271,9 @@ class AttachmentsViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = AttachmentsState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), + title = BitwardenString.an_error_has_occurred.asText(), message = result.message?.asText() - ?: R.string.generic_error_message.asText(), + ?: BitwardenString.generic_error_message.asText(), throwable = result.error, ), ) @@ -282,7 +282,11 @@ class AttachmentsViewModel @Inject constructor( is CreateAttachmentResult.Success -> { mutableStateFlow.update { it.copy(dialogState = null) } - sendEvent(AttachmentsEvent.ShowSnackbar(R.string.save_attachment_success.asText())) + sendEvent( + AttachmentsEvent.ShowSnackbar( + BitwardenString.save_attachment_success.asText(), + ), + ) } } } @@ -293,8 +297,8 @@ class AttachmentsViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = AttachmentsState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.generic_error_message.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.generic_error_message.asText(), throwable = result.error, ), ) @@ -303,7 +307,11 @@ class AttachmentsViewModel @Inject constructor( DeleteAttachmentResult.Success -> { mutableStateFlow.update { it.copy(dialogState = null) } - sendEvent(AttachmentsEvent.ShowSnackbar(R.string.attachment_deleted.asText())) + sendEvent( + AttachmentsEvent.ShowSnackbar( + BitwardenString.attachment_deleted.asText(), + ), + ) } } } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/importlogins/ImportLoginsScreen.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/importlogins/ImportLoginsScreen.kt index 9dcc9eed7c..994d925aa5 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/importlogins/ImportLoginsScreen.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/importlogins/ImportLoginsScreen.kt @@ -50,8 +50,8 @@ import com.bitwarden.ui.platform.components.button.BitwardenOutlinedButton import com.bitwarden.ui.platform.components.content.model.ContentBlockData import com.bitwarden.ui.platform.components.util.rememberVectorPainter import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.platform.components.bottomsheet.BitwardenModalBottomSheet import com.x8bit.bitwarden.ui.platform.components.card.BitwardenContentCard import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenLoadingDialog @@ -99,7 +99,7 @@ fun ImportLoginsScreen( BitwardenModalBottomSheet( showBottomSheet = state.showBottomSheet, - sheetTitle = stringResource(R.string.bitwarden_tools), + sheetTitle = stringResource(BitwardenString.bitwarden_tools), onDismiss = handler.onSuccessfulSyncAcknowledged, sheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true), modifier = Modifier.statusBarsPadding(), @@ -117,11 +117,11 @@ fun ImportLoginsScreen( .nestedScroll(scrollBehavior.nestedScrollConnection), topBar = { BitwardenTopAppBar( - title = stringResource(R.string.import_logins), + title = stringResource(BitwardenString.import_logins), navigationIcon = NavigationIcon( navigationIcon = rememberVectorPainter(BitwardenDrawable.ic_close), onNavigationIconClick = handler.onCloseClick, - navigationIconContentDescription = stringResource(R.string.close), + navigationIconContentDescription = stringResource(BitwardenString.close), ), scrollBehavior = scrollBehavior, ) @@ -174,8 +174,8 @@ private fun ImportLoginsDialogContent( state: ImportLoginsState, handler: ImportLoginHandler, ) { - val confirmButtonText = stringResource(R.string.confirm) - val dismissButtonText = stringResource(R.string.cancel) + val confirmButtonText = stringResource(BitwardenString.confirm) + val dismissButtonText = stringResource(BitwardenString.cancel) when (val dialogState = state.dialogState) { ImportLoginsState.DialogState.GetStarted -> { BitwardenTwoButtonDialog( @@ -206,8 +206,8 @@ private fun ImportLoginsDialogContent( title = dialogState.title?.invoke(), message = dialogState.message(), onDismissRequest = handler.onDismissDialog, - confirmButtonText = stringResource(R.string.try_again), - dismissButtonText = stringResource(R.string.import_logins_later), + confirmButtonText = stringResource(BitwardenString.try_again), + dismissButtonText = stringResource(BitwardenString.import_logins_later), onConfirmClick = handler.onRetrySync, onDismissClick = handler.onFailedSyncAcknowledged, ) @@ -243,7 +243,7 @@ private fun InitialImportLoginsContent( ) Spacer(Modifier.height(24.dp)) Text( - text = stringResource(R.string.give_your_vault_a_head_start), + text = stringResource(BitwardenString.give_your_vault_a_head_start), style = BitwardenTheme.typography.titleMedium, color = BitwardenTheme.colorScheme.text.primary, textAlign = TextAlign.Center, @@ -252,7 +252,8 @@ private fun InitialImportLoginsContent( Spacer(Modifier.height(12.dp)) Text( text = stringResource( - R.string.from_your_computer_follow_these_instructions_to_export_saved_passwords, + BitwardenString + .from_your_computer_follow_these_instructions_to_export_saved_passwords, ), style = BitwardenTheme.typography.bodyMedium, color = BitwardenTheme.colorScheme.text.primary, @@ -261,7 +262,7 @@ private fun InitialImportLoginsContent( ) Spacer(Modifier.height(24.dp)) BitwardenFilledButton( - label = stringResource(R.string.get_started), + label = stringResource(BitwardenString.get_started), onClick = onGetStartedClick, modifier = Modifier .standardHorizontalMargin() @@ -269,7 +270,7 @@ private fun InitialImportLoginsContent( ) Spacer(Modifier.height(12.dp)) BitwardenOutlinedButton( - label = stringResource(R.string.import_logins_later), + label = stringResource(BitwardenString.import_logins_later), onClick = onImportLaterClick, modifier = Modifier .standardHorizontalMargin() @@ -288,17 +289,17 @@ private fun ImportLoginsStepOneContent( modifier: Modifier = Modifier, ) { val instruction1 = annotatedStringResource( - id = R.string.on_your_computer_log_in_to_your_current_browser_or_password_manager, + id = BitwardenString.on_your_computer_log_in_to_your_current_browser_or_password_manager, ) val instruction2 = annotatedStringResource( - id = R.string.export_your_passwords_this_option_is_usually_found_in_your_settings, + id = BitwardenString.export_your_passwords_this_option_is_usually_found_in_your_settings, ) val instruction3 = annotatedStringResource( - id = R.string.save_the_exported_file_somewhere_on_your_computer_you_can_find_easily, + id = BitwardenString.save_the_exported_file_somewhere_on_your_computer_you_can_find_easily, ) ImportLoginsInstructionStep( - stepText = stringResource(R.string.step_1_of_3), - stepTitle = stringResource(R.string.export_your_saved_logins), + stepText = stringResource(BitwardenString.step_1_of_3), + stepTitle = stringResource(BitwardenString.export_your_saved_logins), instructions = persistentListOf( ContentBlockData( iconVectorResource = BitwardenDrawable.ic_number1, @@ -313,7 +314,7 @@ private fun ImportLoginsStepOneContent( ContentBlockData( iconVectorResource = BitwardenDrawable.ic_number3, headerText = instruction3, - subtitleText = stringResource(R.string.delete_this_file_after_import_is_complete) + subtitleText = stringResource(BitwardenString.delete_this_file_after_import_is_complete) .toAnnotatedString(), ), ), @@ -333,18 +334,18 @@ private fun ImportLoginsStepTwoContent( modifier: Modifier = Modifier, ) { val instruction1 = annotatedStringResource( - id = R.string.on_your_computer_open_a_new_browser_tab_and_go_to_vault_bitwarden_com, + id = BitwardenString.on_your_computer_open_a_new_browser_tab_and_go_to_vault_bitwarden_com, args = arrayOf(vaultUrl), ) - val instruction2Text = stringResource(R.string.log_in_to_the_bitwarden_web_app) + val instruction2Text = stringResource(BitwardenString.log_in_to_the_bitwarden_web_app) val instruction2 = buildAnnotatedString { withStyle(bitwardenBoldSpanStyle) { append(instruction2Text) } } ImportLoginsInstructionStep( - stepText = stringResource(R.string.step_2_of_3), - stepTitle = stringResource(R.string.log_in_to_bitwarden), + stepText = stringResource(BitwardenString.step_2_of_3), + stepTitle = stringResource(BitwardenString.log_in_to_bitwarden), instructions = persistentListOf( ContentBlockData( iconVectorResource = BitwardenDrawable.ic_number1, @@ -373,20 +374,20 @@ private fun ImportLoginsStepThreeContent( modifier: Modifier = Modifier, ) { val instruction1 = annotatedStringResource( - id = R.string.in_the_bitwarden_navigation_find_the_tools_option_and_select_import_data, + id = BitwardenString.in_the_bitwarden_navigation_find_the_tools_option_and_select_import_data, ) val instruction2 = annotatedStringResource( - id = R.string.fill_out_the_form_and_import_your_saved_password_file, + id = BitwardenString.fill_out_the_form_and_import_your_saved_password_file, ) val instruction3 = annotatedStringResource( - id = R.string.select_import_data_in_the_web_app_then_done_to_finish_syncing, + id = BitwardenString.select_import_data_in_the_web_app_then_done_to_finish_syncing, ) val instruction4 = annotatedStringResource( - id = R.string.for_your_security_be_sure_to_delete_your_saved_password_file, + id = BitwardenString.for_your_security_be_sure_to_delete_your_saved_password_file, ) ImportLoginsInstructionStep( - stepText = stringResource(R.string.step_3_of_3), - stepTitle = stringResource(R.string.import_logins_to_bitwarden), + stepText = stringResource(BitwardenString.step_3_of_3), + stepTitle = stringResource(BitwardenString.import_logins_to_bitwarden), instructions = persistentListOf( ContentBlockData( iconVectorResource = BitwardenDrawable.ic_number1, @@ -410,7 +411,7 @@ private fun ImportLoginsStepThreeContent( ), ), onBackClick = onBackClick, - ctaText = stringResource(R.string.done_text), + ctaText = stringResource(BitwardenString.done_text), onContinueClick = onContinueClick, onHelpClick = onHelpClick, modifier = modifier, @@ -440,7 +441,7 @@ private fun ImportLoginsSuccessBottomSheetContent( ) Spacer(Modifier.height(24.dp)) Text( - text = stringResource(R.string.import_successful), + text = stringResource(BitwardenString.import_successful), style = BitwardenTheme.typography.titleMedium, textAlign = TextAlign.Center, modifier = Modifier.standardHorizontalMargin(), @@ -448,7 +449,7 @@ private fun ImportLoginsSuccessBottomSheetContent( Spacer(Modifier.height(12.dp)) Text( text = stringResource( - R.string.manage_your_logins_from_anywhere_with_bitwarden_tools, + BitwardenString.manage_your_logins_from_anywhere_with_bitwarden_tools, ), style = BitwardenTheme.typography.bodyMedium, textAlign = TextAlign.Center, @@ -458,22 +459,25 @@ private fun ImportLoginsSuccessBottomSheetContent( BitwardenContentCard( contentItems = persistentListOf( ContentBlockData( - headerText = stringResource(R.string.download_the_browser_extension), + headerText = stringResource(BitwardenString.download_the_browser_extension), subtitleText = stringResource( - R.string.go_to_bitwarden_com_download_to_integrate_bitwarden_into_browser, + BitwardenString + .go_to_bitwarden_com_download_to_integrate_bitwarden_into_browser, ), iconVectorResource = BitwardenDrawable.ic_puzzle, ), ContentBlockData( - headerText = stringResource(R.string.use_the_web_app), + headerText = stringResource(BitwardenString.use_the_web_app), subtitleText = stringResource( - R.string.log_in_at_bitwarden_com_to_easily_manage_your_account, + BitwardenString.log_in_at_bitwarden_com_to_easily_manage_your_account, ), iconVectorResource = BitwardenDrawable.ic_desktop, ), ContentBlockData( - headerText = stringResource(R.string.autofill_passwords), - subtitleText = stringResource(R.string.set_up_autofill_on_all_your_devices), + headerText = stringResource(BitwardenString.autofill_passwords), + subtitleText = stringResource( + BitwardenString.set_up_autofill_on_all_your_devices, + ), iconVectorResource = BitwardenDrawable.ic_shield, ), ), @@ -482,7 +486,7 @@ private fun ImportLoginsSuccessBottomSheetContent( ) Spacer(Modifier.height(24.dp)) BitwardenFilledButton( - label = stringResource(R.string.got_it), + label = stringResource(BitwardenString.got_it), onClick = onCompleteImportLogins, modifier = Modifier .standardHorizontalMargin() diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/importlogins/ImportLoginsViewModel.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/importlogins/ImportLoginsViewModel.kt index 9d29878078..4896b3db3a 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/importlogins/ImportLoginsViewModel.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/importlogins/ImportLoginsViewModel.kt @@ -2,9 +2,9 @@ package com.x8bit.bitwarden.ui.vault.feature.importlogins import androidx.lifecycle.viewModelScope import com.bitwarden.ui.platform.base.BaseViewModel +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.platform.manager.FirstTimeActionManager import com.x8bit.bitwarden.data.platform.repository.EnvironmentRepository import com.x8bit.bitwarden.data.platform.util.toUriOrNull @@ -74,8 +74,8 @@ class ImportLoginsViewModel @Inject constructor( } snackbarRelayManager.sendSnackbarData( data = BitwardenSnackbarData( - messageHeader = R.string.logins_imported.asText(), - message = R.string + messageHeader = BitwardenString.logins_imported.asText(), + message = BitwardenString .remember_to_delete_your_imported_password_file_from_your_computer .asText(), ), @@ -124,8 +124,8 @@ class ImportLoginsViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = ImportLoginsState.DialogState.Error( - message = R.string.no_logins_were_imported.asText(), - title = R.string.import_error.asText(), + message = BitwardenString.no_logins_were_imported.asText(), + title = BitwardenString.import_error.asText(), ), ) } @@ -232,8 +232,8 @@ data class ImportLoginsState( */ data object ImportLater : DialogState() { override val message: Text = - R.string.you_can_return_to_complete_this_step_anytime_from_settings.asText() - override val title: Text = R.string.import_logins_later_dialog_title.asText() + BitwardenString.you_can_return_to_complete_this_step_anytime_from_settings.asText() + override val title: Text = BitwardenString.import_logins_later_dialog_title.asText() } /** @@ -241,15 +241,16 @@ data class ImportLoginsState( */ data object GetStarted : DialogState() { override val message: Text = - R.string.the_following_instructions_will_guide_you_through_importing_logins.asText() - override val title: Text = R.string.do_you_have_a_computer_available.asText() + BitwardenString.the_following_instructions_will_guide_you_through_importing_logins + .asText() + override val title: Text = BitwardenString.do_you_have_a_computer_available.asText() } /** * Show a dialog with an error message. */ data class Error( - override val message: Text = R.string.generic_error_message.asText(), + override val message: Text = BitwardenString.generic_error_message.asText(), override val title: Text? = null, ) : DialogState() @@ -257,7 +258,7 @@ data class ImportLoginsState( * Represents a dialog indication and ongoing manual sync. */ data object Syncing : DialogState() { - override val message: Text = R.string.syncing_logins_loading_message.asText() + override val message: Text = BitwardenString.syncing_logins_loading_message.asText() override val title: Text? = null } } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/importlogins/components/ImportLoginsInstructionStep.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/importlogins/components/ImportLoginsInstructionStep.kt index b7555eb703..4ae490243f 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/importlogins/components/ImportLoginsInstructionStep.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/importlogins/components/ImportLoginsInstructionStep.kt @@ -26,8 +26,8 @@ import com.bitwarden.ui.platform.components.button.BitwardenFilledButton import com.bitwarden.ui.platform.components.button.BitwardenOutlinedButton import com.bitwarden.ui.platform.components.content.model.ContentBlockData import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.platform.components.card.BitwardenContentCard import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.persistentListOf @@ -40,7 +40,7 @@ import kotlinx.collections.immutable.persistentListOf fun ImportLoginsInstructionStep( stepText: String, stepTitle: String, - ctaText: String = stringResource(R.string.continue_text), + ctaText: String = stringResource(BitwardenString.continue_text), instructions: ImmutableList, onBackClick: () -> Unit, onContinueClick: () -> Unit, @@ -69,7 +69,7 @@ fun ImportLoginsInstructionStep( Spacer(Modifier.height(24.dp)) Text( text = annotatedStringResource( - id = R.string.need_help_check_out_import_help, + id = BitwardenString.need_help_check_out_import_help, onAnnotationClick = { onHelpClick() }, ), style = BitwardenTheme.typography.bodySmall, @@ -86,7 +86,7 @@ fun ImportLoginsInstructionStep( ) Spacer(Modifier.height(12.dp)) BitwardenOutlinedButton( - label = stringResource(R.string.back), + label = stringResource(BitwardenString.back), onClick = onBackClick, modifier = Modifier .fillMaxWidth() diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemAttachmentContent.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemAttachmentContent.kt index 87ede31599..7aa68db4e5 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemAttachmentContent.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemAttachmentContent.kt @@ -22,8 +22,8 @@ import com.bitwarden.ui.platform.components.button.BitwardenStandardIconButton import com.bitwarden.ui.platform.components.button.BitwardenTextButton import com.bitwarden.ui.platform.components.model.CardStyle import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenTwoButtonDialog /** @@ -71,7 +71,7 @@ fun AttachmentItemContent( BitwardenStandardIconButton( vectorIconRes = BitwardenDrawable.ic_download, - contentDescription = stringResource(id = R.string.download), + contentDescription = stringResource(id = BitwardenString.download), onClick = { if (!attachmentItem.isDownloadAllowed) { shouldShowPremiumWarningDialog = true @@ -95,13 +95,13 @@ fun AttachmentItemContent( onDismissRequest = { shouldShowPremiumWarningDialog = false }, confirmButton = { BitwardenTextButton( - label = stringResource(R.string.okay), + label = stringResource(BitwardenString.okay), onClick = { shouldShowPremiumWarningDialog = false }, ) }, text = { Text( - text = stringResource(R.string.premium_required), + text = stringResource(BitwardenString.premium_required), style = BitwardenTheme.typography.bodyMedium, ) }, @@ -115,9 +115,12 @@ fun AttachmentItemContent( if (shouldShowSizeWarningDialog) { BitwardenTwoButtonDialog( title = null, - message = stringResource(R.string.attachment_large_warning, attachmentItem.displaySize), - confirmButtonText = stringResource(R.string.yes), - dismissButtonText = stringResource(R.string.no), + message = stringResource( + BitwardenString.attachment_large_warning, + attachmentItem.displaySize, + ), + confirmButtonText = stringResource(BitwardenString.yes), + dismissButtonText = stringResource(BitwardenString.no), onConfirmClick = { shouldShowSizeWarningDialog = false onAttachmentDownloadClick(attachmentItem) diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemCardContent.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemCardContent.kt index 4b79591cd6..841ac2d403 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemCardContent.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemCardContent.kt @@ -23,8 +23,8 @@ import com.bitwarden.ui.platform.base.util.toListItemCardStyle import com.bitwarden.ui.platform.components.button.BitwardenStandardIconButton import com.bitwarden.ui.platform.components.model.CardStyle import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.platform.components.field.BitwardenPasswordField import com.x8bit.bitwarden.ui.platform.components.field.BitwardenTextField import com.x8bit.bitwarden.ui.platform.components.header.BitwardenListHeaderText @@ -71,7 +71,7 @@ fun VaultItemCardContent( cardState.cardholderName?.let { cardholderName -> item(key = "cardholderName") { BitwardenTextField( - label = stringResource(id = R.string.cardholder_name), + label = stringResource(id = BitwardenString.cardholder_name), value = cardholderName, onValueChange = {}, readOnly = true, @@ -93,7 +93,7 @@ fun VaultItemCardContent( cardState.number?.let { numberData -> item(key = "cardNumber") { BitwardenPasswordField( - label = stringResource(id = R.string.number), + label = stringResource(id = BitwardenString.number), value = numberData.number, onValueChange = {}, showPassword = numberData.isVisible, @@ -103,7 +103,7 @@ fun VaultItemCardContent( actions = { BitwardenStandardIconButton( vectorIconRes = BitwardenDrawable.ic_copy, - contentDescription = stringResource(id = R.string.copy_number), + contentDescription = stringResource(id = BitwardenString.copy_number), onClick = vaultCardItemTypeHandlers.onCopyNumberClick, modifier = Modifier.testTag(tag = "CardCopyNumberButton"), ) @@ -127,7 +127,7 @@ fun VaultItemCardContent( if (cardState.brand != null && cardState.brand != VaultCardBrand.SELECT) { item(key = "cardBrand") { BitwardenTextField( - label = stringResource(id = R.string.brand), + label = stringResource(id = BitwardenString.brand), value = cardState.brand.shortName(), onValueChange = {}, readOnly = true, @@ -150,7 +150,7 @@ fun VaultItemCardContent( cardState.expiration?.let { expiration -> item(key = "expiration") { BitwardenTextField( - label = stringResource(id = R.string.expiration), + label = stringResource(id = BitwardenString.expiration), value = expiration, onValueChange = {}, readOnly = true, @@ -173,7 +173,7 @@ fun VaultItemCardContent( cardState.securityCode?.let { securityCodeData -> item(key = "securityCode") { BitwardenPasswordField( - label = stringResource(id = R.string.security_code), + label = stringResource(id = BitwardenString.security_code), value = securityCodeData.code, onValueChange = {}, showPassword = securityCodeData.isVisible, @@ -184,7 +184,7 @@ fun VaultItemCardContent( BitwardenStandardIconButton( vectorIconRes = BitwardenDrawable.ic_copy, contentDescription = stringResource( - id = R.string.copy_security_code, + id = BitwardenString.copy_security_code, ), onClick = vaultCardItemTypeHandlers.onCopySecurityCodeClick, modifier = Modifier.testTag(tag = "CardCopySecurityCodeButton"), @@ -210,7 +210,7 @@ fun VaultItemCardContent( item(key = "notes") { Spacer(modifier = Modifier.height(height = 16.dp)) BitwardenListHeaderText( - label = stringResource(id = R.string.additional_options), + label = stringResource(id = BitwardenString.additional_options), modifier = Modifier .fillMaxWidth() .standardHorizontalMargin() @@ -219,7 +219,7 @@ fun VaultItemCardContent( ) Spacer(modifier = Modifier.height(8.dp)) BitwardenTextField( - label = stringResource(id = R.string.notes), + label = stringResource(id = BitwardenString.notes), value = notes, onValueChange = { }, readOnly = true, @@ -227,7 +227,7 @@ fun VaultItemCardContent( actions = { BitwardenStandardIconButton( vectorIconRes = BitwardenDrawable.ic_copy, - contentDescription = stringResource(id = R.string.copy_notes), + contentDescription = stringResource(id = BitwardenString.copy_notes), onClick = vaultCommonItemTypeHandlers.onCopyNotesClick, modifier = Modifier.testTag(tag = "CipherNotesCopyButton"), ) @@ -246,7 +246,7 @@ fun VaultItemCardContent( item(key = "customFieldsHeader") { Spacer(modifier = Modifier.height(height = 16.dp)) BitwardenListHeaderText( - label = stringResource(id = R.string.custom_fields), + label = stringResource(id = BitwardenString.custom_fields), modifier = Modifier .fillMaxWidth() .standardHorizontalMargin() @@ -277,7 +277,7 @@ fun VaultItemCardContent( item(key = "attachmentsHeader") { Spacer(modifier = Modifier.height(height = 16.dp)) BitwardenListHeaderText( - label = stringResource(id = R.string.attachments), + label = stringResource(id = BitwardenString.attachments), modifier = Modifier .fillMaxWidth() .standardHorizontalMargin() @@ -338,10 +338,10 @@ fun VaultItemCardContent( item(key = "passwordHistoryCount") { Spacer(modifier = Modifier.height(height = 4.dp)) BitwardenHyperTextLink( - annotatedResId = R.string.password_history_count, + annotatedResId = BitwardenString.password_history_count, args = arrayOf(passwordHistoryCount.toString()), annotationKey = "passwordHistory", - accessibilityString = stringResource(id = R.string.password_history), + accessibilityString = stringResource(id = BitwardenString.password_history), onClick = vaultCommonItemTypeHandlers.onPasswordHistoryClick, style = BitwardenTheme.typography.labelMedium, modifier = Modifier diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemIdentityContent.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemIdentityContent.kt index 667c779eae..96a0956222 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemIdentityContent.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemIdentityContent.kt @@ -25,8 +25,8 @@ import com.bitwarden.ui.platform.components.button.BitwardenStandardIconButton import com.bitwarden.ui.platform.components.icon.model.IconData import com.bitwarden.ui.platform.components.model.CardStyle import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.platform.components.field.BitwardenTextField import com.x8bit.bitwarden.ui.platform.components.header.BitwardenListHeaderText import com.x8bit.bitwarden.ui.platform.components.text.BitwardenHyperTextLink @@ -71,9 +71,9 @@ fun VaultItemIdentityContent( identityState.identityName?.let { identityName -> item(key = "identityName") { IdentityCopyField( - label = stringResource(id = R.string.identity_name), + label = stringResource(id = BitwardenString.identity_name), value = identityName, - copyContentDescription = stringResource(id = R.string.copy_identity_name), + copyContentDescription = stringResource(id = BitwardenString.copy_identity_name), textFieldTestTag = "IdentityNameEntry", copyActionTestTag = "IdentityCopyNameButton", onCopyClick = vaultIdentityItemTypeHandlers.onCopyIdentityNameClick, @@ -93,9 +93,9 @@ fun VaultItemIdentityContent( identityState.username?.let { username -> item(key = "username") { IdentityCopyField( - label = stringResource(id = R.string.username), + label = stringResource(id = BitwardenString.username), value = username, - copyContentDescription = stringResource(id = R.string.copy_username), + copyContentDescription = stringResource(id = BitwardenString.copy_username), textFieldTestTag = "IdentityUsernameEntry", copyActionTestTag = "IdentityCopyUsernameButton", onCopyClick = vaultIdentityItemTypeHandlers.onCopyUsernameClick, @@ -115,9 +115,9 @@ fun VaultItemIdentityContent( identityState.company?.let { company -> item(key = "company") { IdentityCopyField( - label = stringResource(id = R.string.company), + label = stringResource(id = BitwardenString.company), value = company, - copyContentDescription = stringResource(id = R.string.copy_company), + copyContentDescription = stringResource(id = BitwardenString.copy_company), textFieldTestTag = "IdentityCompanyEntry", copyActionTestTag = "IdentityCopyCompanyButton", onCopyClick = vaultIdentityItemTypeHandlers.onCopyCompanyClick, @@ -137,9 +137,9 @@ fun VaultItemIdentityContent( identityState.ssn?.let { ssn -> item(key = "ssn") { IdentityCopyField( - label = stringResource(id = R.string.ssn), + label = stringResource(id = BitwardenString.ssn), value = ssn, - copyContentDescription = stringResource(id = R.string.copy_ssn), + copyContentDescription = stringResource(id = BitwardenString.copy_ssn), textFieldTestTag = "IdentitySsnEntry", copyActionTestTag = "IdentityCopySsnButton", onCopyClick = vaultIdentityItemTypeHandlers.onCopySsnClick, @@ -159,9 +159,9 @@ fun VaultItemIdentityContent( identityState.passportNumber?.let { passportNumber -> item(key = "passportNumber") { IdentityCopyField( - label = stringResource(id = R.string.passport_number), + label = stringResource(id = BitwardenString.passport_number), value = passportNumber, - copyContentDescription = stringResource(id = R.string.copy_passport_number), + copyContentDescription = stringResource(id = BitwardenString.copy_passport_number), textFieldTestTag = "IdentityPassportNumberEntry", copyActionTestTag = "IdentityCopyPassportNumberButton", onCopyClick = vaultIdentityItemTypeHandlers.onCopyPassportNumberClick, @@ -181,9 +181,9 @@ fun VaultItemIdentityContent( identityState.licenseNumber?.let { licenseNumber -> item(key = "licenseNumber") { IdentityCopyField( - label = stringResource(id = R.string.license_number), + label = stringResource(id = BitwardenString.license_number), value = licenseNumber, - copyContentDescription = stringResource(id = R.string.copy_license_number), + copyContentDescription = stringResource(id = BitwardenString.copy_license_number), textFieldTestTag = "IdentityLicenseNumberEntry", copyActionTestTag = "IdentityCopyLicenseNumberButton", onCopyClick = vaultIdentityItemTypeHandlers.onCopyLicenseNumberClick, @@ -203,9 +203,9 @@ fun VaultItemIdentityContent( identityState.email?.let { email -> item(key = "email") { IdentityCopyField( - label = stringResource(id = R.string.email), + label = stringResource(id = BitwardenString.email), value = email, - copyContentDescription = stringResource(id = R.string.copy_email), + copyContentDescription = stringResource(id = BitwardenString.copy_email), textFieldTestTag = "IdentityEmailEntry", copyActionTestTag = "IdentityCopyEmailButton", onCopyClick = vaultIdentityItemTypeHandlers.onCopyEmailClick, @@ -225,9 +225,9 @@ fun VaultItemIdentityContent( identityState.phone?.let { phone -> item(key = "phone") { IdentityCopyField( - label = stringResource(id = R.string.phone), + label = stringResource(id = BitwardenString.phone), value = phone, - copyContentDescription = stringResource(id = R.string.copy_phone), + copyContentDescription = stringResource(id = BitwardenString.copy_phone), textFieldTestTag = "IdentityPhoneEntry", copyActionTestTag = "IdentityCopyPhoneButton", onCopyClick = vaultIdentityItemTypeHandlers.onCopyPhoneClick, @@ -247,9 +247,9 @@ fun VaultItemIdentityContent( identityState.address?.let { address -> item(key = "address") { IdentityCopyField( - label = stringResource(id = R.string.address), + label = stringResource(id = BitwardenString.address), value = address, - copyContentDescription = stringResource(id = R.string.copy_address), + copyContentDescription = stringResource(id = BitwardenString.copy_address), textFieldTestTag = "IdentityAddressEntry", copyActionTestTag = "IdentityCopyAddressButton", onCopyClick = vaultIdentityItemTypeHandlers.onCopyAddressClick, @@ -270,7 +270,7 @@ fun VaultItemIdentityContent( item(key = "notes") { Spacer(modifier = Modifier.height(height = 16.dp)) BitwardenListHeaderText( - label = stringResource(id = R.string.additional_options), + label = stringResource(id = BitwardenString.additional_options), modifier = Modifier .fillMaxWidth() .standardHorizontalMargin() @@ -279,9 +279,9 @@ fun VaultItemIdentityContent( ) Spacer(modifier = Modifier.height(8.dp)) IdentityCopyField( - label = stringResource(id = R.string.notes), + label = stringResource(id = BitwardenString.notes), value = notes, - copyContentDescription = stringResource(id = R.string.copy_notes), + copyContentDescription = stringResource(id = BitwardenString.copy_notes), textFieldTestTag = "CipherNotesLabel", copyActionTestTag = "CipherNotesCopyButton", onCopyClick = vaultCommonItemTypeHandlers.onCopyNotesClick, @@ -298,7 +298,7 @@ fun VaultItemIdentityContent( item(key = "customFieldsHeader") { Spacer(modifier = Modifier.height(height = 16.dp)) BitwardenListHeaderText( - label = stringResource(id = R.string.custom_fields), + label = stringResource(id = BitwardenString.custom_fields), modifier = Modifier .fillMaxWidth() .standardHorizontalMargin() @@ -329,7 +329,7 @@ fun VaultItemIdentityContent( item(key = "attachmentsHeader") { Spacer(modifier = Modifier.height(height = 16.dp)) BitwardenListHeaderText( - label = stringResource(id = R.string.attachments), + label = stringResource(id = BitwardenString.attachments), modifier = Modifier .fillMaxWidth() .standardHorizontalMargin() @@ -390,10 +390,10 @@ fun VaultItemIdentityContent( item(key = "passwordHistoryCount") { Spacer(modifier = Modifier.height(height = 4.dp)) BitwardenHyperTextLink( - annotatedResId = R.string.password_history_count, + annotatedResId = BitwardenString.password_history_count, args = arrayOf(passwordHistoryCount.toString()), annotationKey = "passwordHistory", - accessibilityString = stringResource(id = R.string.password_history), + accessibilityString = stringResource(id = BitwardenString.password_history), onClick = vaultCommonItemTypeHandlers.onPasswordHistoryClick, style = BitwardenTheme.typography.labelMedium, modifier = Modifier diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemLoginContent.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemLoginContent.kt index 3f6bce5a9e..daef521ee4 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemLoginContent.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemLoginContent.kt @@ -26,8 +26,8 @@ import com.bitwarden.ui.platform.components.icon.model.IconData import com.bitwarden.ui.platform.components.model.CardStyle import com.bitwarden.ui.platform.components.model.TooltipData import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.platform.components.field.BitwardenHiddenPasswordField import com.x8bit.bitwarden.ui.platform.components.field.BitwardenPasswordField import com.x8bit.bitwarden.ui.platform.components.field.BitwardenTextField @@ -77,7 +77,7 @@ fun VaultItemLoginContent( item(key = "loginCredentialsHeader") { Spacer(modifier = Modifier.height(height = 16.dp)) BitwardenListHeaderText( - label = stringResource(id = R.string.login_credentials), + label = stringResource(id = BitwardenString.login_credentials), modifier = Modifier .fillMaxWidth() .standardHorizontalMargin() @@ -158,7 +158,7 @@ fun VaultItemLoginContent( item(key = "urisHeader") { Spacer(modifier = Modifier.height(height = 16.dp)) BitwardenListHeaderText( - label = stringResource(id = R.string.autofill_options), + label = stringResource(id = BitwardenString.autofill_options), modifier = Modifier .fillMaxWidth() .standardHorizontalMargin() @@ -189,7 +189,7 @@ fun VaultItemLoginContent( item(key = "notes") { Spacer(modifier = Modifier.height(height = 16.dp)) BitwardenListHeaderText( - label = stringResource(id = R.string.additional_options), + label = stringResource(id = BitwardenString.additional_options), modifier = Modifier .standardHorizontalMargin() .padding(horizontal = 16.dp) @@ -212,7 +212,7 @@ fun VaultItemLoginContent( item(key = "customFieldsHeader") { Spacer(modifier = Modifier.height(height = 16.dp)) BitwardenListHeaderText( - label = stringResource(id = R.string.custom_fields), + label = stringResource(id = BitwardenString.custom_fields), modifier = Modifier .fillMaxWidth() .standardHorizontalMargin() @@ -243,7 +243,7 @@ fun VaultItemLoginContent( item(key = "attachmentsHeader") { Spacer(modifier = Modifier.height(height = 16.dp)) BitwardenListHeaderText( - label = stringResource(id = R.string.attachments), + label = stringResource(id = BitwardenString.attachments), modifier = Modifier .standardHorizontalMargin() .padding(horizontal = 16.dp) @@ -318,10 +318,10 @@ fun VaultItemLoginContent( item(key = "passwordHistoryCount") { Spacer(modifier = Modifier.height(height = 4.dp)) BitwardenHyperTextLink( - annotatedResId = R.string.password_history_count, + annotatedResId = BitwardenString.password_history_count, args = arrayOf(passwordHistoryCount.toString()), annotationKey = "passwordHistory", - accessibilityString = stringResource(id = R.string.password_history), + accessibilityString = stringResource(id = BitwardenString.password_history), onClick = vaultCommonItemTypeHandlers.onPasswordHistoryClick, style = BitwardenTheme.typography.labelMedium, modifier = Modifier @@ -346,7 +346,7 @@ private fun Fido2CredentialField( modifier: Modifier = Modifier, ) { BitwardenTextField( - label = stringResource(id = R.string.passkey), + label = stringResource(id = BitwardenString.passkey), value = creationDate, onValueChange = { }, readOnly = true, @@ -363,7 +363,7 @@ private fun NotesField( modifier: Modifier = Modifier, ) { BitwardenTextField( - label = stringResource(id = R.string.notes), + label = stringResource(id = BitwardenString.notes), value = notes, onValueChange = { }, readOnly = true, @@ -371,7 +371,7 @@ private fun NotesField( actions = { BitwardenStandardIconButton( vectorIconRes = BitwardenDrawable.ic_copy, - contentDescription = stringResource(id = R.string.copy_notes), + contentDescription = stringResource(id = BitwardenString.copy_notes), onClick = onCopyAction, modifier = Modifier.testTag(tag = "CipherNotesCopyButton"), ) @@ -393,7 +393,7 @@ private fun PasswordField( ) { if (passwordData.canViewPassword) { BitwardenPasswordField( - label = stringResource(id = R.string.password), + label = stringResource(id = BitwardenString.password), value = passwordData.password, showPasswordChange = { onShowPasswordClick(it) }, showPassword = passwordData.isVisible, @@ -403,7 +403,7 @@ private fun PasswordField( actions = { BitwardenStandardIconButton( vectorIconRes = BitwardenDrawable.ic_copy, - contentDescription = stringResource(id = R.string.copy_password), + contentDescription = stringResource(id = BitwardenString.copy_password), onClick = onCopyPasswordClick, modifier = Modifier.testTag(tag = "LoginCopyPasswordButton"), ) @@ -411,7 +411,7 @@ private fun PasswordField( supportingContentPadding = PaddingValues(), supportingContent = { BitwardenClickableText( - label = stringResource(id = R.string.check_password_for_data_breaches), + label = stringResource(id = BitwardenString.check_password_for_data_breaches), style = BitwardenTheme.typography.labelMedium, onClick = onCheckForBreachClick, innerPadding = PaddingValues(all = 16.dp), @@ -428,7 +428,7 @@ private fun PasswordField( ) } else { BitwardenHiddenPasswordField( - label = stringResource(id = R.string.password), + label = stringResource(id = BitwardenString.password), value = passwordData.password, passwordFieldTestTag = "LoginPasswordEntry", cardStyle = cardStyle, @@ -447,7 +447,7 @@ private fun TotpField( ) { if (enabled) { BitwardenTextField( - label = stringResource(id = R.string.authenticator_key), + label = stringResource(id = BitwardenString.authenticator_key), value = totpCodeItemData.verificationCode .chunked(AUTH_CODE_SPACING_INTERVAL) .joinToString(" "), @@ -457,7 +457,7 @@ private fun TotpField( singleLine = true, tooltip = TooltipData( onClick = onAuthenticatorHelpToolTipClick, - contentDescription = stringResource(id = R.string.authenticator_key_help), + contentDescription = stringResource(id = BitwardenString.authenticator_key_help), ), actions = { BitwardenCircularCountdownIndicator( @@ -466,7 +466,7 @@ private fun TotpField( ) BitwardenStandardIconButton( vectorIconRes = BitwardenDrawable.ic_copy, - contentDescription = stringResource(id = R.string.copy_totp), + contentDescription = stringResource(id = BitwardenString.copy_totp), onClick = onCopyTotpClick, modifier = Modifier.testTag(tag = "LoginCopyTotpButton"), ) @@ -477,13 +477,13 @@ private fun TotpField( ) } else { BitwardenTextField( - label = stringResource(id = R.string.authenticator_key), + label = stringResource(id = BitwardenString.authenticator_key), value = "", tooltip = TooltipData( onClick = onAuthenticatorHelpToolTipClick, - contentDescription = stringResource(id = R.string.authenticator_key_help), + contentDescription = stringResource(id = BitwardenString.authenticator_key_help), ), - supportingText = stringResource(id = R.string.premium_subscription_required), + supportingText = stringResource(id = BitwardenString.premium_subscription_required), enabled = false, singleLine = false, onValueChange = { }, @@ -503,7 +503,7 @@ private fun UriField( modifier: Modifier = Modifier, ) { BitwardenTextField( - label = stringResource(id = R.string.website_uri), + label = stringResource(id = BitwardenString.website_uri), value = uriData.uri, onValueChange = { }, readOnly = true, @@ -512,7 +512,7 @@ private fun UriField( if (uriData.isLaunchable) { BitwardenStandardIconButton( vectorIconRes = BitwardenDrawable.ic_external_link, - contentDescription = stringResource(id = R.string.launch), + contentDescription = stringResource(id = BitwardenString.launch), onClick = { onLaunchUriClick(uriData.uri) }, modifier = Modifier.testTag(tag = "LoginLaunchUriButton"), ) @@ -520,7 +520,7 @@ private fun UriField( if (uriData.isCopyable) { BitwardenStandardIconButton( vectorIconRes = BitwardenDrawable.ic_copy, - contentDescription = stringResource(id = R.string.copy), + contentDescription = stringResource(id = BitwardenString.copy), onClick = { onCopyUriClick(uriData.uri) }, modifier = Modifier.testTag(tag = "LoginCopyUriButton"), ) @@ -540,7 +540,7 @@ private fun UsernameField( modifier: Modifier = Modifier, ) { BitwardenTextField( - label = stringResource(id = R.string.username), + label = stringResource(id = BitwardenString.username), value = username, onValueChange = { }, readOnly = true, @@ -548,7 +548,7 @@ private fun UsernameField( actions = { BitwardenStandardIconButton( vectorIconRes = BitwardenDrawable.ic_copy, - contentDescription = stringResource(id = R.string.copy_username), + contentDescription = stringResource(id = BitwardenString.copy_username), onClick = onCopyUsernameClick, modifier = Modifier.testTag(tag = "LoginCopyUsernameButton"), ) diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemScreen.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemScreen.kt index a5cadf1033..eed66dba20 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemScreen.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemScreen.kt @@ -28,7 +28,7 @@ import com.bitwarden.ui.platform.components.button.BitwardenTextButton import com.bitwarden.ui.platform.components.fab.BitwardenFloatingActionButton import com.bitwarden.ui.platform.components.util.rememberVectorPainter import com.bitwarden.ui.platform.resource.BitwardenDrawable -import com.x8bit.bitwarden.R +import com.bitwarden.ui.platform.resource.BitwardenString import com.x8bit.bitwarden.ui.platform.components.content.BitwardenErrorContent import com.x8bit.bitwarden.ui.platform.components.content.BitwardenLoadingContent import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenBasicDialog @@ -146,14 +146,14 @@ fun VaultItemScreen( title = state.title(), scrollBehavior = scrollBehavior, navigationIcon = rememberVectorPainter(id = BitwardenDrawable.ic_close), - navigationIconContentDescription = stringResource(id = R.string.close), + navigationIconContentDescription = stringResource(id = BitwardenString.close), onNavigationIconClick = remember(viewModel) { { viewModel.trySendAction(VaultItemAction.Common.CloseClick) } }, actions = { if (state.canRestore) { BitwardenTextButton( - label = stringResource(id = R.string.restore), + label = stringResource(id = BitwardenString.restore), onClick = remember(viewModel) { { viewModel.trySendAction( @@ -165,10 +165,10 @@ fun VaultItemScreen( ) } BitwardenOverflowActionItem( - contentDescription = stringResource(R.string.more), + contentDescription = stringResource(BitwardenString.more), menuItemDataList = persistentListOfNotNull( OverflowMenuItemData( - text = stringResource(id = R.string.attachments), + text = stringResource(id = BitwardenString.attachments), onClick = remember(viewModel) { { viewModel.trySendAction( @@ -178,14 +178,14 @@ fun VaultItemScreen( }, ), OverflowMenuItemData( - text = stringResource(id = R.string.clone), + text = stringResource(id = BitwardenString.clone), onClick = remember(viewModel) { { viewModel.trySendAction(VaultItemAction.Common.CloneClick) } }, ) .takeUnless { state.isCipherInCollection }, OverflowMenuItemData( - text = stringResource(id = R.string.move_to_organization), + text = stringResource(id = BitwardenString.move_to_organization), onClick = remember(viewModel) { { viewModel.trySendAction( @@ -196,7 +196,7 @@ fun VaultItemScreen( ) .takeUnless { state.isCipherInCollection }, OverflowMenuItemData( - text = stringResource(id = R.string.collections), + text = stringResource(id = BitwardenString.collections), onClick = remember(viewModel) { { viewModel.trySendAction( @@ -210,7 +210,7 @@ fun VaultItemScreen( state.canAssignToCollections }, OverflowMenuItemData( - text = stringResource(id = R.string.delete), + text = stringResource(id = BitwardenString.delete), onClick = remember(viewModel) { { viewModel.trySendAction( @@ -236,7 +236,7 @@ fun VaultItemScreen( { viewModel.trySendAction(VaultItemAction.Common.EditClick) } }, painter = rememberVectorPainter(id = BitwardenDrawable.ic_pencil), - contentDescription = stringResource(id = R.string.edit_item), + contentDescription = stringResource(id = BitwardenString.edit_item), modifier = Modifier .testTag(tag = "EditItemButton") .padding(bottom = 16.dp), @@ -292,10 +292,10 @@ private fun VaultItemDialogs( is VaultItemState.DialogState.DeleteConfirmationPrompt -> { BitwardenTwoButtonDialog( - title = stringResource(id = R.string.delete), + title = stringResource(id = BitwardenString.delete), message = dialog.message.invoke(), - confirmButtonText = stringResource(id = R.string.okay), - dismissButtonText = stringResource(id = R.string.cancel), + confirmButtonText = stringResource(id = BitwardenString.okay), + dismissButtonText = stringResource(id = BitwardenString.cancel), onConfirmClick = onConfirmDeleteClick, onDismissClick = onDismissRequest, onDismissRequest = onDismissRequest, @@ -304,10 +304,10 @@ private fun VaultItemDialogs( is VaultItemState.DialogState.Fido2CredentialCannotBeCopiedConfirmationPrompt -> { BitwardenTwoButtonDialog( - title = stringResource(id = R.string.passkey_will_not_be_copied), + title = stringResource(id = BitwardenString.passkey_will_not_be_copied), message = dialog.message.invoke(), - confirmButtonText = stringResource(id = R.string.yes), - dismissButtonText = stringResource(id = R.string.no), + confirmButtonText = stringResource(id = BitwardenString.yes), + dismissButtonText = stringResource(id = BitwardenString.no), onConfirmClick = onConfirmCloneWithoutFido2Credential, onDismissClick = onDismissRequest, onDismissRequest = onDismissRequest, @@ -315,10 +315,10 @@ private fun VaultItemDialogs( } VaultItemState.DialogState.RestoreItemDialog -> BitwardenTwoButtonDialog( - title = stringResource(id = R.string.restore), - message = stringResource(id = R.string.do_you_really_want_to_restore_cipher), - confirmButtonText = stringResource(id = R.string.okay), - dismissButtonText = stringResource(id = R.string.cancel), + title = stringResource(id = BitwardenString.restore), + message = stringResource(id = BitwardenString.do_you_really_want_to_restore_cipher), + confirmButtonText = stringResource(id = BitwardenString.okay), + dismissButtonText = stringResource(id = BitwardenString.cancel), onConfirmClick = onConfirmRestoreAction, onDismissClick = onDismissRequest, onDismissRequest = onDismissRequest, diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemSecureNoteContent.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemSecureNoteContent.kt index 4479a32bfb..1bdeb088fa 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemSecureNoteContent.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemSecureNoteContent.kt @@ -24,8 +24,8 @@ import com.bitwarden.ui.platform.components.button.BitwardenStandardIconButton import com.bitwarden.ui.platform.components.icon.model.IconData import com.bitwarden.ui.platform.components.model.CardStyle import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.platform.components.field.BitwardenTextField import com.x8bit.bitwarden.ui.platform.components.header.BitwardenListHeaderText import com.x8bit.bitwarden.ui.platform.components.text.BitwardenHyperTextLink @@ -66,7 +66,7 @@ fun VaultItemSecureNoteContent( item(key = "notes") { Spacer(modifier = Modifier.height(8.dp)) BitwardenTextField( - label = stringResource(id = R.string.notes), + label = stringResource(id = BitwardenString.notes), value = notes, onValueChange = { }, readOnly = true, @@ -74,7 +74,7 @@ fun VaultItemSecureNoteContent( actions = { BitwardenStandardIconButton( vectorIconRes = BitwardenDrawable.ic_copy, - contentDescription = stringResource(id = R.string.copy_notes), + contentDescription = stringResource(id = BitwardenString.copy_notes), onClick = vaultCommonItemTypeHandlers.onCopyNotesClick, modifier = Modifier.testTag(tag = "CipherNotesCopyButton"), ) @@ -93,7 +93,7 @@ fun VaultItemSecureNoteContent( item(key = "customFieldsHeader") { Spacer(modifier = Modifier.height(height = 16.dp)) BitwardenListHeaderText( - label = stringResource(id = R.string.custom_fields), + label = stringResource(id = BitwardenString.custom_fields), modifier = Modifier .fillMaxWidth() .standardHorizontalMargin() @@ -125,7 +125,7 @@ fun VaultItemSecureNoteContent( item(key = "attachmentsHeader") { Spacer(modifier = Modifier.height(height = 16.dp)) BitwardenListHeaderText( - label = stringResource(id = R.string.attachments), + label = stringResource(id = BitwardenString.attachments), modifier = Modifier .fillMaxWidth() .standardHorizontalMargin() @@ -186,10 +186,10 @@ fun VaultItemSecureNoteContent( item(key = "passwordHistoryCount") { Spacer(modifier = Modifier.height(height = 4.dp)) BitwardenHyperTextLink( - annotatedResId = R.string.password_history_count, + annotatedResId = BitwardenString.password_history_count, args = arrayOf(passwordHistoryCount.toString()), annotationKey = "passwordHistory", - accessibilityString = stringResource(id = R.string.password_history), + accessibilityString = stringResource(id = BitwardenString.password_history), onClick = vaultCommonItemTypeHandlers.onPasswordHistoryClick, style = BitwardenTheme.typography.labelMedium, modifier = Modifier diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemSshKeyContent.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemSshKeyContent.kt index 9e845b4b1c..ac549d91d1 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemSshKeyContent.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemSshKeyContent.kt @@ -24,8 +24,8 @@ import com.bitwarden.ui.platform.components.button.BitwardenStandardIconButton import com.bitwarden.ui.platform.components.icon.model.IconData import com.bitwarden.ui.platform.components.model.CardStyle import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.platform.components.field.BitwardenPasswordField import com.x8bit.bitwarden.ui.platform.components.field.BitwardenTextField import com.x8bit.bitwarden.ui.platform.components.header.BitwardenListHeaderText @@ -66,7 +66,7 @@ fun VaultItemSshKeyContent( item(key = "publicKey") { Spacer(modifier = Modifier.height(8.dp)) BitwardenTextField( - label = stringResource(id = R.string.public_key), + label = stringResource(id = BitwardenString.public_key), value = sshKeyItemState.publicKey, onValueChange = { }, singleLine = false, @@ -74,7 +74,7 @@ fun VaultItemSshKeyContent( actions = { BitwardenStandardIconButton( vectorIconRes = BitwardenDrawable.ic_copy, - contentDescription = stringResource(id = R.string.copy_public_key), + contentDescription = stringResource(id = BitwardenString.copy_public_key), onClick = vaultSshKeyItemTypeHandlers.onCopyPublicKeyClick, modifier = Modifier.testTag(tag = "SshKeyCopyPublicKeyButton"), ) @@ -90,7 +90,7 @@ fun VaultItemSshKeyContent( item(key = "privateKey") { BitwardenPasswordField( - label = stringResource(id = R.string.private_key), + label = stringResource(id = BitwardenString.private_key), value = sshKeyItemState.privateKey, onValueChange = { }, singleLine = false, @@ -98,7 +98,7 @@ fun VaultItemSshKeyContent( actions = { BitwardenStandardIconButton( vectorIconRes = BitwardenDrawable.ic_copy, - contentDescription = stringResource(id = R.string.copy_private_key), + contentDescription = stringResource(id = BitwardenString.copy_private_key), onClick = vaultSshKeyItemTypeHandlers.onCopyPrivateKeyClick, modifier = Modifier.testTag(tag = "SshKeyCopyPrivateKeyButton"), ) @@ -117,7 +117,7 @@ fun VaultItemSshKeyContent( item(key = "fingerprint") { BitwardenTextField( - label = stringResource(id = R.string.fingerprint), + label = stringResource(id = BitwardenString.fingerprint), value = sshKeyItemState.fingerprint, onValueChange = { }, singleLine = false, @@ -125,7 +125,7 @@ fun VaultItemSshKeyContent( actions = { BitwardenStandardIconButton( vectorIconRes = BitwardenDrawable.ic_copy, - contentDescription = stringResource(id = R.string.copy_fingerprint), + contentDescription = stringResource(id = BitwardenString.copy_fingerprint), onClick = vaultSshKeyItemTypeHandlers.onCopyFingerprintClick, modifier = Modifier.testTag(tag = "SshKeyCopyFingerprintButton"), ) @@ -143,7 +143,7 @@ fun VaultItemSshKeyContent( item(key = "notes") { Spacer(modifier = Modifier.height(height = 16.dp)) BitwardenListHeaderText( - label = stringResource(id = R.string.additional_options), + label = stringResource(id = BitwardenString.additional_options), modifier = Modifier .fillMaxWidth() .standardHorizontalMargin() @@ -152,7 +152,7 @@ fun VaultItemSshKeyContent( ) Spacer(modifier = Modifier.height(8.dp)) BitwardenTextField( - label = stringResource(id = R.string.notes), + label = stringResource(id = BitwardenString.notes), value = notes, onValueChange = { }, readOnly = true, @@ -160,7 +160,7 @@ fun VaultItemSshKeyContent( actions = { BitwardenStandardIconButton( vectorIconRes = BitwardenDrawable.ic_copy, - contentDescription = stringResource(id = R.string.copy_notes), + contentDescription = stringResource(id = BitwardenString.copy_notes), onClick = vaultCommonItemTypeHandlers.onCopyNotesClick, modifier = Modifier.testTag(tag = "CipherNotesCopyButton"), ) @@ -179,7 +179,7 @@ fun VaultItemSshKeyContent( item(key = "customFieldsHeader") { Spacer(modifier = Modifier.height(height = 16.dp)) BitwardenListHeaderText( - label = stringResource(id = R.string.custom_fields), + label = stringResource(id = BitwardenString.custom_fields), modifier = Modifier .fillMaxWidth() .standardHorizontalMargin() @@ -210,7 +210,7 @@ fun VaultItemSshKeyContent( item(key = "attachmentsHeader") { Spacer(modifier = Modifier.height(height = 16.dp)) BitwardenListHeaderText( - label = stringResource(id = R.string.attachments), + label = stringResource(id = BitwardenString.attachments), modifier = Modifier .fillMaxWidth() .standardHorizontalMargin() @@ -270,10 +270,10 @@ fun VaultItemSshKeyContent( item(key = "passwordHistoryCount") { Spacer(modifier = Modifier.height(height = 4.dp)) BitwardenHyperTextLink( - annotatedResId = R.string.password_history_count, + annotatedResId = BitwardenString.password_history_count, args = arrayOf(passwordHistoryCount.toString()), annotationKey = "passwordHistory", - accessibilityString = stringResource(id = R.string.password_history), + accessibilityString = stringResource(id = BitwardenString.password_history), onClick = vaultCommonItemTypeHandlers.onPasswordHistoryClick, style = BitwardenTheme.typography.labelMedium, modifier = Modifier diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemViewModel.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemViewModel.kt index fe18723fa2..43781fefcb 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemViewModel.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemViewModel.kt @@ -12,11 +12,11 @@ import com.bitwarden.data.repository.util.baseIconUrl import com.bitwarden.ui.platform.base.BackgroundEvent import com.bitwarden.ui.platform.base.BaseViewModel import com.bitwarden.ui.platform.components.icon.model.IconData +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText import com.bitwarden.ui.util.concat import com.bitwarden.vault.CipherView -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.auth.repository.AuthRepository import com.x8bit.bitwarden.data.auth.repository.model.BreachCountResult import com.x8bit.bitwarden.data.auth.repository.model.UserState @@ -368,7 +368,9 @@ class VaultItemViewModel @Inject constructor( action: VaultItemAction.Common.AttachmentDownloadClick, ) { onContent { content -> - updateDialogState(VaultItemState.DialogState.Loading(R.string.downloading.asText())) + updateDialogState( + VaultItemState.DialogState.Loading(BitwardenString.downloading.asText()), + ) viewModelScope.launch { val result = vaultRepository @@ -415,7 +417,7 @@ class VaultItemViewModel @Inject constructor( updateDialogState( VaultItemState.DialogState.Generic( - R.string.unable_to_save_attachment.asText(), + BitwardenString.unable_to_save_attachment.asText(), ), ) } @@ -430,7 +432,7 @@ class VaultItemViewModel @Inject constructor( updateDialogState( @Suppress("MaxLineLength") VaultItemState.DialogState.Fido2CredentialCannotBeCopiedConfirmationPrompt( - message = R.string.the_passkey_will_not_be_copied_to_the_cloned_item_do_you_want_to_continue_cloning_this_item.asText(), + message = BitwardenString.the_passkey_will_not_be_copied_to_the_cloned_item_do_you_want_to_continue_cloning_this_item.asText(), ), ) return@onContent @@ -475,9 +477,9 @@ class VaultItemViewModel @Inject constructor( updateDialogState( VaultItemState.DialogState.Loading( if (state.isCipherDeleted) { - R.string.deleting.asText() + BitwardenString.deleting.asText() } else { - R.string.soft_deleting.asText() + BitwardenString.soft_deleting.asText() }, ), ) @@ -505,7 +507,7 @@ class VaultItemViewModel @Inject constructor( private fun handleConfirmRestoreClick() { updateDialogState( VaultItemState.DialogState.Loading( - R.string.restoring.asText(), + BitwardenString.restoring.asText(), ), ) onContent { content -> @@ -532,7 +534,7 @@ class VaultItemViewModel @Inject constructor( val notes = content.common.notes.orEmpty() clipboardManager.setText( text = notes, - toastDescriptorOverride = R.string.notes.asText(), + toastDescriptorOverride = BitwardenString.notes.asText(), ) } } @@ -588,7 +590,7 @@ class VaultItemViewModel @Inject constructor( private fun handleCheckForBreachClick() { onLoginContent { _, login -> val password = requireNotNull(login.passwordData?.password) - updateDialogState(VaultItemState.DialogState.Loading(R.string.loading.asText())) + updateDialogState(VaultItemState.DialogState.Loading(BitwardenString.loading.asText())) viewModelScope.launch { val result = authRepository.getPasswordBreachCount(password = password) sendAction(VaultItemAction.Internal.PasswordBreachReceive(result)) @@ -600,7 +602,7 @@ class VaultItemViewModel @Inject constructor( onLoginContent { content, login -> clipboardManager.setText( text = requireNotNull(login.passwordData).password, - toastDescriptorOverride = R.string.password.asText(), + toastDescriptorOverride = BitwardenString.password.asText(), ) organizationEventManager.trackEvent( event = OrganizationEvent.CipherClientCopiedPassword(cipherId = state.vaultItemId), @@ -613,7 +615,7 @@ class VaultItemViewModel @Inject constructor( val code = login.totpCodeItemData?.verificationCode ?: return@onLoginContent clipboardManager.setText( text = code, - toastDescriptorOverride = R.string.totp.asText(), + toastDescriptorOverride = BitwardenString.totp.asText(), ) } } @@ -621,7 +623,7 @@ class VaultItemViewModel @Inject constructor( private fun handleCopyUriClick(action: VaultItemAction.ItemType.Login.CopyUriClick) { clipboardManager.setText( text = action.uri, - toastDescriptorOverride = R.string.uri.asText(), + toastDescriptorOverride = BitwardenString.uri.asText(), ) } @@ -630,7 +632,7 @@ class VaultItemViewModel @Inject constructor( val username = requireNotNull(login.username) clipboardManager.setText( text = username, - toastDescriptorOverride = R.string.username.asText(), + toastDescriptorOverride = BitwardenString.username.asText(), ) } } @@ -717,7 +719,7 @@ class VaultItemViewModel @Inject constructor( onCardContent { content, card -> clipboardManager.setText( text = requireNotNull(card.number).number, - toastDescriptorOverride = R.string.number.asText(), + toastDescriptorOverride = BitwardenString.number.asText(), ) } } @@ -726,7 +728,7 @@ class VaultItemViewModel @Inject constructor( onCardContent { content, card -> clipboardManager.setText( text = requireNotNull(card.securityCode).code, - toastDescriptorOverride = R.string.security_code.asText(), + toastDescriptorOverride = BitwardenString.security_code.asText(), ) } } @@ -778,7 +780,7 @@ class VaultItemViewModel @Inject constructor( onSshKeyContent { _, sshKey -> clipboardManager.setText( text = sshKey.publicKey, - toastDescriptorOverride = R.string.public_key.asText(), + toastDescriptorOverride = BitwardenString.public_key.asText(), ) } } @@ -801,7 +803,7 @@ class VaultItemViewModel @Inject constructor( onSshKeyContent { content, sshKey -> clipboardManager.setText( text = sshKey.privateKey, - toastDescriptorOverride = R.string.private_key.asText(), + toastDescriptorOverride = BitwardenString.private_key.asText(), ) } } @@ -810,7 +812,7 @@ class VaultItemViewModel @Inject constructor( onSshKeyContent { _, sshKey -> clipboardManager.setText( text = sshKey.fingerprint, - toastDescriptorOverride = R.string.fingerprint.asText(), + toastDescriptorOverride = BitwardenString.fingerprint.asText(), ) } } @@ -850,7 +852,7 @@ class VaultItemViewModel @Inject constructor( val identityName = identity.identityName.orEmpty() clipboardManager.setText( text = identityName, - toastDescriptorOverride = R.string.identity_name.asText(), + toastDescriptorOverride = BitwardenString.identity_name.asText(), ) } } @@ -860,7 +862,7 @@ class VaultItemViewModel @Inject constructor( val username = identity.username.orEmpty() clipboardManager.setText( text = username, - toastDescriptorOverride = R.string.username.asText(), + toastDescriptorOverride = BitwardenString.username.asText(), ) } } @@ -870,7 +872,7 @@ class VaultItemViewModel @Inject constructor( val company = identity.company.orEmpty() clipboardManager.setText( text = company, - toastDescriptorOverride = R.string.company.asText(), + toastDescriptorOverride = BitwardenString.company.asText(), ) } } @@ -880,7 +882,7 @@ class VaultItemViewModel @Inject constructor( val ssn = identity.ssn.orEmpty() clipboardManager.setText( text = ssn, - toastDescriptorOverride = R.string.ssn.asText(), + toastDescriptorOverride = BitwardenString.ssn.asText(), ) } } @@ -890,7 +892,7 @@ class VaultItemViewModel @Inject constructor( val passportNumber = identity.passportNumber.orEmpty() clipboardManager.setText( text = passportNumber, - toastDescriptorOverride = R.string.passport_number.asText(), + toastDescriptorOverride = BitwardenString.passport_number.asText(), ) } } @@ -900,7 +902,7 @@ class VaultItemViewModel @Inject constructor( val licenseNumber = identity.licenseNumber.orEmpty() clipboardManager.setText( text = licenseNumber, - toastDescriptorOverride = R.string.license_number.asText(), + toastDescriptorOverride = BitwardenString.license_number.asText(), ) } } @@ -910,7 +912,7 @@ class VaultItemViewModel @Inject constructor( val email = identity.email.orEmpty() clipboardManager.setText( text = email, - toastDescriptorOverride = R.string.email.asText(), + toastDescriptorOverride = BitwardenString.email.asText(), ) } } @@ -920,7 +922,7 @@ class VaultItemViewModel @Inject constructor( val phone = identity.phone.orEmpty() clipboardManager.setText( text = phone, - toastDescriptorOverride = R.string.phone.asText(), + toastDescriptorOverride = BitwardenString.phone.asText(), ) } } @@ -930,7 +932,7 @@ class VaultItemViewModel @Inject constructor( val address = identity.address.orEmpty() clipboardManager.setText( text = address, - toastDescriptorOverride = R.string.address.asText(), + toastDescriptorOverride = BitwardenString.address.asText(), ) } } @@ -975,7 +977,7 @@ class VaultItemViewModel @Inject constructor( val dialogState = when (val result = action.result) { is BreachCountResult.Error -> { VaultItemState.DialogState.Generic( - message = R.string.generic_error_message.asText(), + message = BitwardenString.generic_error_message.asText(), error = result.error, ) } @@ -983,9 +985,9 @@ class VaultItemViewModel @Inject constructor( is BreachCountResult.Success -> { VaultItemState.DialogState.Generic( message = if (result.breachCount > 0) { - R.string.password_exposed.asText(result.breachCount) + BitwardenString.password_exposed.asText(result.breachCount) } else { - R.string.password_safe.asText() + BitwardenString.password_safe.asText() }, ) } @@ -1005,7 +1007,7 @@ class VaultItemViewModel @Inject constructor( it.copy( viewState = vaultDataState.toViewStateOrError( account = userState.activeAccount, - errorText = R.string.generic_error_message.asText(), + errorText = BitwardenString.generic_error_message.asText(), ), ) } @@ -1016,7 +1018,7 @@ class VaultItemViewModel @Inject constructor( it.copy( viewState = vaultDataState.toViewStateOrError( account = userState.activeAccount, - errorText = R.string.generic_error_message.asText(), + errorText = BitwardenString.generic_error_message.asText(), ), ) } @@ -1033,11 +1035,11 @@ class VaultItemViewModel @Inject constructor( it.copy( viewState = vaultDataState.toViewStateOrError( account = userState.activeAccount, - errorText = R.string.internet_connection_required_title + errorText = BitwardenString.internet_connection_required_title .asText() .concat( " ".asText(), - R.string.internet_connection_required_message.asText(), + BitwardenString.internet_connection_required_message.asText(), ), ), ) @@ -1049,7 +1051,7 @@ class VaultItemViewModel @Inject constructor( it.copy( viewState = vaultDataState.toViewStateOrError( account = userState.activeAccount, - errorText = R.string.generic_error_message.asText(), + errorText = BitwardenString.generic_error_message.asText(), ), ) } @@ -1082,7 +1084,7 @@ class VaultItemViewModel @Inject constructor( is DeleteCipherResult.Error -> { updateDialogState( VaultItemState.DialogState.Generic( - message = R.string.generic_error_message.asText(), + message = BitwardenString.generic_error_message.asText(), error = result.error, ), ) @@ -1093,9 +1095,9 @@ class VaultItemViewModel @Inject constructor( snackbarRelayManager.sendSnackbarData( data = BitwardenSnackbarData( message = if (state.isCipherDeleted) { - R.string.item_deleted.asText() + BitwardenString.item_deleted.asText() } else { - R.string.item_soft_deleted.asText() + BitwardenString.item_soft_deleted.asText() }, ), relay = SnackbarRelay.CIPHER_DELETED, @@ -1110,7 +1112,7 @@ class VaultItemViewModel @Inject constructor( is RestoreCipherResult.Error -> { updateDialogState( VaultItemState.DialogState.Generic( - message = R.string.generic_error_message.asText(), + message = BitwardenString.generic_error_message.asText(), error = result.error, ), ) @@ -1119,7 +1121,7 @@ class VaultItemViewModel @Inject constructor( RestoreCipherResult.Success -> { dismissDialog() snackbarRelayManager.sendSnackbarData( - data = BitwardenSnackbarData(message = R.string.item_restored.asText()), + data = BitwardenSnackbarData(message = BitwardenString.item_restored.asText()), relay = SnackbarRelay.CIPHER_RESTORED, ) sendEvent(VaultItemEvent.NavigateBack) @@ -1134,7 +1136,7 @@ class VaultItemViewModel @Inject constructor( is DownloadAttachmentResult.Failure -> { updateDialogState( VaultItemState.DialogState.Generic( - message = R.string.unable_to_download_file.asText(), + message = BitwardenString.unable_to_download_file.asText(), error = result.error, ), ) @@ -1159,11 +1161,11 @@ class VaultItemViewModel @Inject constructor( } if (action.isSaved) { - sendEvent(VaultItemEvent.ShowSnackbar(R.string.save_attachment_success.asText())) + sendEvent(VaultItemEvent.ShowSnackbar(BitwardenString.save_attachment_success.asText())) } else { updateDialogState( VaultItemState.DialogState.Generic( - R.string.unable_to_save_attachment.asText(), + BitwardenString.unable_to_save_attachment.asText(), ), ) } @@ -1276,11 +1278,11 @@ data class VaultItemState( */ val title: Text get() = when (cipherType) { - VaultItemCipherType.LOGIN -> R.string.view_login.asText() - VaultItemCipherType.CARD -> R.string.view_card.asText() - VaultItemCipherType.IDENTITY -> R.string.view_identity.asText() - VaultItemCipherType.SECURE_NOTE -> R.string.view_note.asText() - VaultItemCipherType.SSH_KEY -> R.string.view_ssh_key.asText() + VaultItemCipherType.LOGIN -> BitwardenString.view_login.asText() + VaultItemCipherType.CARD -> BitwardenString.view_card.asText() + VaultItemCipherType.IDENTITY -> BitwardenString.view_identity.asText() + VaultItemCipherType.SECURE_NOTE -> BitwardenString.view_note.asText() + VaultItemCipherType.SSH_KEY -> BitwardenString.view_ssh_key.asText() } /** @@ -1341,9 +1343,9 @@ data class VaultItemState( */ val deletionConfirmationText: Text get() = if (isCipherDeleted) { - R.string.do_you_really_want_to_permanently_delete_cipher + BitwardenString.do_you_really_want_to_permanently_delete_cipher } else { - R.string.do_you_really_want_to_soft_delete_cipher + BitwardenString.do_you_really_want_to_soft_delete_cipher } .asText() diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/component/ItemHeader.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/component/ItemHeader.kt index 2c26e35b73..b1e1492ae3 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/component/ItemHeader.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/component/ItemHeader.kt @@ -39,8 +39,8 @@ import com.bitwarden.ui.platform.components.icon.model.IconData import com.bitwarden.ui.platform.components.model.CardStyle import com.bitwarden.ui.platform.components.util.rememberVectorPainter import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.platform.components.field.BitwardenTextField import com.x8bit.bitwarden.ui.platform.components.header.BitwardenExpandingHeader import com.x8bit.bitwarden.ui.vault.feature.item.model.VaultItemLocation @@ -116,7 +116,11 @@ fun LazyListScope.itemHeader( }, ), contentDescription = stringResource( - id = if (isFavorite) R.string.favorite else R.string.unfavorite, + id = if (isFavorite) { + BitwardenString.favorite + } else { + BitwardenString.unfavorite + }, ), modifier = Modifier.padding(all = 12.dp), ) @@ -134,7 +138,7 @@ fun LazyListScope.itemHeader( item(key = "noFolder") { ItemLocationListItem( vectorPainter = rememberVectorPainter(BitwardenDrawable.ic_folder), - text = stringResource(R.string.no_folder), + text = stringResource(BitwardenString.no_folder), iconTestTag = "NoFolderIcon", modifier = Modifier .standardHorizontalMargin() @@ -234,7 +238,7 @@ fun LazyListScope.itemHeader( vectorPainter = rememberVectorPainter(it.icon), iconTestTag = "ItemLocationIcon", text = if (collectionLocations.size > 1 && !isExpanded) { - stringResource(R.string.x_ellipses, it.name) + stringResource(BitwardenString.x_ellipses, it.name) } else { it.name }, @@ -280,8 +284,8 @@ fun LazyListScope.itemHeader( if (collectionLocations.size > 1) { item(key = "expandableLocationsExpansionIndicator") { BitwardenExpandingHeader( - collapsedText = stringResource(R.string.show_more), - expandedText = stringResource(R.string.show_less), + collapsedText = stringResource(BitwardenString.show_more), + expandedText = stringResource(BitwardenString.show_less), isExpanded = isExpanded, onClick = onExpandClick, showExpansionIndicator = false, diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/component/VaultItemCustomField.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/component/VaultItemCustomField.kt index 2ab57afe39..b8d7aabedd 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/component/VaultItemCustomField.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/component/VaultItemCustomField.kt @@ -9,8 +9,8 @@ import com.bitwarden.ui.platform.components.icon.model.IconData import com.bitwarden.ui.platform.components.model.CardStyle import com.bitwarden.ui.platform.components.toggle.BitwardenSwitch import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.platform.components.field.BitwardenPasswordField import com.x8bit.bitwarden.ui.platform.components.field.BitwardenTextField import com.x8bit.bitwarden.ui.vault.feature.item.VaultItemState @@ -58,7 +58,7 @@ fun CustomField( actions = { BitwardenStandardIconButton( vectorIconRes = BitwardenDrawable.ic_copy, - contentDescription = stringResource(id = R.string.copy), + contentDescription = stringResource(id = BitwardenString.copy), onClick = { onCopyCustomHiddenField(customField.value) }, modifier = Modifier.testTag("CustomFieldCopyValueButton"), ) @@ -87,7 +87,7 @@ fun CustomField( value = customField.vaultLinkedFieldType.label.invoke(), leadingIconData = IconData.Local( iconRes = BitwardenDrawable.ic_linked, - contentDescription = R.string.field_type_linked.asText(), + contentDescription = BitwardenString.field_type_linked.asText(), ), onValueChange = { }, readOnly = true, @@ -110,7 +110,7 @@ fun CustomField( if (customField.isCopyable) { BitwardenStandardIconButton( vectorIconRes = BitwardenDrawable.ic_copy, - contentDescription = stringResource(id = R.string.copy), + contentDescription = stringResource(id = BitwardenString.copy), onClick = { onCopyCustomTextField(customField.value) }, modifier = Modifier.testTag("CustomFieldCopyValueButton"), ) diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/util/CipherViewExtensions.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/util/CipherViewExtensions.kt index 48c0163982..5d3e7a8da5 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/util/CipherViewExtensions.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/util/CipherViewExtensions.kt @@ -7,6 +7,7 @@ import com.bitwarden.ui.platform.base.util.orNullIfBlank import com.bitwarden.ui.platform.base.util.orZeroWidthSpace import com.bitwarden.ui.platform.components.icon.model.IconData import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText import com.bitwarden.vault.CardView @@ -17,7 +18,6 @@ import com.bitwarden.vault.FieldType import com.bitwarden.vault.FieldView import com.bitwarden.vault.IdentityView import com.bitwarden.vault.LoginUriView -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.vault.repository.model.VaultData import com.x8bit.bitwarden.ui.vault.feature.item.VaultItemState import com.x8bit.bitwarden.ui.vault.feature.item.model.TotpCodeItemData @@ -60,14 +60,14 @@ fun CipherView.toViewState( ?.find { it.id == fieldView.hashCode().toString() }, ) }, - created = R.string.created.asText( + created = BitwardenString.created.asText( creationDate.toFormattedDateTimeStyle( dateStyle = FormatStyle.MEDIUM, timeStyle = FormatStyle.SHORT, clock = clock, ), ), - lastUpdated = R.string.last_edited.asText( + lastUpdated = BitwardenString.last_edited.asText( revisionDate.toFormattedDateTimeStyle( dateStyle = FormatStyle.MEDIUM, timeStyle = FormatStyle.SHORT, @@ -137,7 +137,7 @@ fun CipherView.toViewState( timeStyle = FormatStyle.SHORT, clock = clock, ) - ?.let { R.string.password_last_updated.asText(it) }, + ?.let { BitwardenString.password_last_updated.asText(it) }, isPremiumUser = isPremiumUser, canViewTotpCode = isPremiumUser || this.organizationUseTotp, totpCodeItemData = totpCodeItemData, @@ -256,7 +256,7 @@ private fun LoginUriView.toUriData() = ) private fun Fido2Credential.getCreationDateText(clock: Clock): Text? = - R.string.created_x.asText( + BitwardenString.created_x.asText( this.creationDate.toFormattedDateTimeStyle( dateStyle = FormatStyle.MEDIUM, timeStyle = FormatStyle.SHORT, diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/itemlisting/VaultItemListingContent.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/itemlisting/VaultItemListingContent.kt index 4afbf27e98..99fcd73314 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/itemlisting/VaultItemListingContent.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/itemlisting/VaultItemListingContent.kt @@ -20,7 +20,7 @@ import com.bitwarden.ui.platform.base.util.standardHorizontalMargin import com.bitwarden.ui.platform.base.util.toListItemCardStyle import com.bitwarden.ui.platform.components.util.rememberVectorPainter import com.bitwarden.ui.platform.resource.BitwardenDrawable -import com.x8bit.bitwarden.R +import com.bitwarden.ui.platform.resource.BitwardenString import com.x8bit.bitwarden.ui.platform.components.card.BitwardenInfoCalloutCard import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenMasterPasswordDialog import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenTwoButtonDialog @@ -53,10 +53,10 @@ fun VaultItemListingContent( when (val option = showConfirmationDialog) { is ListingItemOverflowAction.SendAction.DeleteClick -> { BitwardenTwoButtonDialog( - title = stringResource(id = R.string.delete), - message = stringResource(id = R.string.are_you_sure_delete_send), - confirmButtonText = stringResource(id = R.string.yes), - dismissButtonText = stringResource(id = R.string.cancel), + title = stringResource(id = BitwardenString.delete), + message = stringResource(id = BitwardenString.are_you_sure_delete_send), + confirmButtonText = stringResource(id = BitwardenString.yes), + dismissButtonText = stringResource(id = BitwardenString.cancel), onConfirmClick = { showConfirmationDialog = null onOverflowItemClick(option) @@ -104,7 +104,9 @@ fun VaultItemListingContent( item { Spacer(modifier = Modifier.height(height = 12.dp)) BitwardenInfoCalloutCard( - text = stringResource(id = R.string.add_this_authenticator_key_to_a_login), + text = stringResource( + id = BitwardenString.add_this_authenticator_key_to_a_login, + ), modifier = Modifier .standardHorizontalMargin() .fillMaxWidth(), @@ -116,7 +118,7 @@ fun VaultItemListingContent( item { Spacer(modifier = Modifier.height(height = 12.dp)) BitwardenInfoCalloutCard( - text = stringResource(id = R.string.send_disabled_warning), + text = stringResource(id = BitwardenString.send_disabled_warning), modifier = Modifier .standardHorizontalMargin() .fillMaxWidth(), @@ -128,7 +130,7 @@ fun VaultItemListingContent( item { Spacer(modifier = Modifier.height(height = 12.dp)) BitwardenListHeaderText( - label = stringResource(id = R.string.collections), + label = stringResource(id = BitwardenString.collections), supportingLabel = state.displayCollectionList.count().toString(), modifier = Modifier .fillMaxWidth() @@ -159,7 +161,7 @@ fun VaultItemListingContent( item { Spacer(modifier = Modifier.height(height = 12.dp)) BitwardenListHeaderText( - label = stringResource(id = R.string.folders), + label = stringResource(id = BitwardenString.folders), supportingLabel = state.displayFolderList.count().toString(), modifier = Modifier .fillMaxWidth() @@ -190,7 +192,7 @@ fun VaultItemListingContent( item { Spacer(modifier = Modifier.height(height = 12.dp)) BitwardenListHeaderText( - label = stringResource(id = R.string.items), + label = stringResource(id = BitwardenString.items), supportingLabel = state.displayItemList.size.toString(), modifier = Modifier .fillMaxWidth() diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/itemlisting/VaultItemListingScreen.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/itemlisting/VaultItemListingScreen.kt index e88f5ed18b..9853f6c7ea 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/itemlisting/VaultItemListingScreen.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/itemlisting/VaultItemListingScreen.kt @@ -27,9 +27,9 @@ import com.bitwarden.ui.platform.components.appbar.model.OverflowMenuItemData import com.bitwarden.ui.platform.components.fab.BitwardenFloatingActionButton import com.bitwarden.ui.platform.components.util.rememberVectorPainter import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.credentials.manager.CredentialProviderCompletionManager import com.x8bit.bitwarden.ui.platform.components.account.BitwardenAccountActionItem import com.x8bit.bitwarden.ui.platform.components.account.BitwardenAccountSwitcher @@ -450,22 +450,22 @@ private fun VaultItemListingDialogs( is VaultItemListingState.DialogState.TrustPrivilegedAddPrompt -> { BitwardenTwoButtonDialog( - title = stringResource(R.string.unrecognized_browser), + title = stringResource(BitwardenString.unrecognized_browser), message = dialogState.message.invoke(), - confirmButtonText = stringResource(R.string.trust), - dismissButtonText = stringResource(R.string.cancel), + confirmButtonText = stringResource(BitwardenString.trust), + dismissButtonText = stringResource(BitwardenString.cancel), onConfirmClick = { onTrustPrivilegedAppClick(dialogState.selectedCipherId) }, onDismissClick = { onDismissCredentialManagerErrorDialog( - R.string.passkey_operation_failed_because_the_browser_is_not_trusted + BitwardenString.passkey_operation_failed_because_the_browser_is_not_trusted .asText(), ) }, onDismissRequest = { onDismissCredentialManagerErrorDialog( - R.string.passkey_operation_failed_because_the_browser_is_not_trusted + BitwardenString.passkey_operation_failed_because_the_browser_is_not_trusted .asText(), ) }, @@ -497,7 +497,7 @@ private fun VaultItemListingScaffold( scrollBehavior = scrollBehavior, navigationIcon = NavigationIcon( navigationIcon = rememberVectorPainter(id = BitwardenDrawable.ic_back), - navigationIconContentDescription = stringResource(id = R.string.back), + navigationIconContentDescription = stringResource(id = BitwardenString.back), onNavigationIconClick = vaultItemListingHandlers.backClick, ) .takeIf { state.shouldShowNavigationIcon }, @@ -510,19 +510,19 @@ private fun VaultItemListingScaffold( ) } BitwardenSearchActionItem( - contentDescription = stringResource(id = R.string.search_vault), + contentDescription = stringResource(id = BitwardenString.search_vault), onClick = vaultItemListingHandlers.searchIconClick, ) if (state.shouldShowOverflowMenu) { BitwardenOverflowActionItem( - contentDescription = stringResource(R.string.more), + contentDescription = stringResource(BitwardenString.more), menuItemDataList = persistentListOf( OverflowMenuItemData( - text = stringResource(id = R.string.sync), + text = stringResource(id = BitwardenString.sync), onClick = vaultItemListingHandlers.syncClick, ), OverflowMenuItemData( - text = stringResource(id = R.string.lock), + text = stringResource(id = BitwardenString.lock), onClick = vaultItemListingHandlers.lockClick, ), ), @@ -536,7 +536,7 @@ private fun VaultItemListingScaffold( BitwardenFloatingActionButton( onClick = vaultItemListingHandlers.addVaultItemClick, painter = rememberVectorPainter(id = BitwardenDrawable.ic_plus_large), - contentDescription = stringResource(id = R.string.add_item), + contentDescription = stringResource(id = BitwardenString.add_item), modifier = Modifier.testTag(tag = "AddItemButton"), ) } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/itemlisting/VaultItemListingViewModel.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/itemlisting/VaultItemListingViewModel.kt index 86da7bf6b2..a5562bca27 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/itemlisting/VaultItemListingViewModel.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/itemlisting/VaultItemListingViewModel.kt @@ -21,13 +21,13 @@ import com.bitwarden.ui.platform.base.BaseViewModel import com.bitwarden.ui.platform.base.util.toAndroidAppUriString import com.bitwarden.ui.platform.base.util.toHostOrPathOrNull import com.bitwarden.ui.platform.components.icon.model.IconData +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText import com.bitwarden.ui.util.concat import com.bitwarden.vault.CipherRepromptType import com.bitwarden.vault.CipherType import com.bitwarden.vault.CipherView -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.auth.repository.AuthRepository import com.x8bit.bitwarden.data.auth.repository.model.LogoutReason import com.x8bit.bitwarden.data.auth.repository.model.ValidatePasswordResult @@ -171,8 +171,9 @@ class VaultItemListingViewModel @Inject constructor( baseIconUrl = environmentRepository.environment.environmentUrlData.baseIconUrl, isIconLoadingDisabled = settingsRepository.isIconLoadingDisabled, isPullToRefreshSettingEnabled = settingsRepository.getPullToRefreshEnabledFlow().value, - dialogState = providerCreateCredentialRequest - ?.let { VaultItemListingState.DialogState.Loading(R.string.loading.asText()) }, + dialogState = providerCreateCredentialRequest?.let { + VaultItemListingState.DialogState.Loading(BitwardenString.loading.asText()) + }, policyDisablesSend = policyManager .getActivePolicies(type = PolicyTypeJson.DISABLE_SEND) .any(), @@ -398,14 +399,14 @@ class VaultItemListingViewModel @Inject constructor( clearDialogState() viewModelScope.launch { getCipherViewForCredentialOrNull(action.cipherViewId) - ?.let { cipherView -> registerFido2Credential(cipherView) } + ?.let { registerFido2Credential(it) } } } private fun handleUserVerificationLockOut() { bitwardenCredentialManager.isUserVerified = false showCredentialManagerErrorDialog( - R.string.credential_operation_failed_because_user_is_locked_out.asText(), + BitwardenString.credential_operation_failed_because_user_is_locked_out.asText(), ) } @@ -419,7 +420,7 @@ class VaultItemListingViewModel @Inject constructor( private fun handleUserVerificationFail() { bitwardenCredentialManager.isUserVerified = false showCredentialManagerErrorDialog( - R.string.credential_operation_failed_because_user_could_not_be_verified.asText(), + BitwardenString.credential_operation_failed_because_user_could_not_be_verified.asText(), ) } @@ -461,7 +462,7 @@ class VaultItemListingViewModel @Inject constructor( .selectedCipherId ?: run { showCredentialManagerErrorDialog( - R.string.credential_operation_failed_because_user_could_not_be_verified + BitwardenString.credential_operation_failed_because_user_could_not_be_verified .asText(), ) return @@ -473,7 +474,7 @@ class VaultItemListingViewModel @Inject constructor( ?.activeAccount ?: run { showCredentialManagerErrorDialog( - R.string.credential_operation_failed_because_user_could_not_be_verified + BitwardenString.credential_operation_failed_because_user_could_not_be_verified .asText(), ) return @@ -571,7 +572,8 @@ class VaultItemListingViewModel @Inject constructor( it.copy( dialogState = VaultItemListingState.DialogState.UserVerificationPinSetUpError( title = null, - message = R.string.validation_field_required.asText(R.string.pin.asText()), + message = BitwardenString.validation_field_required + .asText(BitwardenString.pin.asText()), selectedCipherId = action.selectedCipherId, ), ) @@ -606,14 +608,15 @@ class VaultItemListingViewModel @Inject constructor( private fun handleDismissUserVerificationDialogClick() { showCredentialManagerErrorDialog( - R.string.credential_operation_failed_because_user_verification_was_cancelled.asText(), + BitwardenString.credential_operation_failed_because_user_verification_was_cancelled + .asText(), ) } private fun handleCopySendUrlClick(action: ListingItemOverflowAction.SendAction.CopyUrlClick) { clipboardManager.setText( text = action.sendUrl, - toastDescriptorOverride = R.string.send_link.asText(), + toastDescriptorOverride = BitwardenString.send_link.asText(), ) } @@ -621,7 +624,7 @@ class VaultItemListingViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = VaultItemListingState.DialogState.Loading( - message = R.string.deleting.asText(), + message = BitwardenString.deleting.asText(), ), ) } @@ -643,7 +646,7 @@ class VaultItemListingViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = VaultItemListingState.DialogState.Loading( - message = R.string.removing_send_password.asText(), + message = BitwardenString.removing_send_password.asText(), ), ) } @@ -716,7 +719,7 @@ class VaultItemListingViewModel @Inject constructor( val signature = request.callingAppInfo.getSignatureFingerprintAsHexString() ?: run { showCredentialManagerErrorDialog( - R.string.passkey_operation_failed_because_the_request_is_invalid + BitwardenString.passkey_operation_failed_because_the_request_is_invalid .asText(), ) return @@ -735,7 +738,7 @@ class VaultItemListingViewModel @Inject constructor( val signature = callingAppInfo?.getSignatureFingerprintAsHexString() if (callingAppInfo == null || signature.isNullOrEmpty()) { showCredentialManagerErrorDialog( - R.string.passkey_operation_failed_because_the_request_is_invalid + BitwardenString.passkey_operation_failed_because_the_request_is_invalid .asText(), ) return @@ -765,7 +768,7 @@ class VaultItemListingViewModel @Inject constructor( .getSignatureFingerprintAsHexString() ?: run { showCredentialManagerErrorDialog( - R.string.passkey_operation_failed_because_the_request_is_invalid + BitwardenString.passkey_operation_failed_because_the_request_is_invalid .asText(), ) return @@ -773,7 +776,7 @@ class VaultItemListingViewModel @Inject constructor( selectedCipherId ?: run { showCredentialManagerErrorDialog( - R.string.passkey_operation_failed_because_no_item_was_selected.asText(), + BitwardenString.passkey_operation_failed_because_no_item_was_selected.asText(), ) return } @@ -857,8 +860,10 @@ class VaultItemListingViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = VaultItemListingState.DialogState.Error( - title = R.string.send.asText(), - message = R.string.send_file_premium_required.asText(), + title = BitwardenString.send.asText(), + message = BitwardenString + .send_file_premium_required + .asText(), ), ) } @@ -951,8 +956,8 @@ class VaultItemListingViewModel @Inject constructor( ?: run { sendAction( VaultItemListingsAction.Internal.CredentialOperationFailureReceive( - title = R.string.an_error_has_occurred.asText(), - message = R.string + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString .passkey_operation_failed_because_the_request_is_unsupported .asText(), error = null, @@ -986,7 +991,7 @@ class VaultItemListingViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = VaultItemListingState.DialogState.Loading( - message = R.string.saving.asText(), + message = BitwardenString.saving.asText(), ), ) } @@ -996,7 +1001,8 @@ class VaultItemListingViewModel @Inject constructor( ?.providerRequest ?: run { showCredentialManagerErrorDialog( - R.string.passkey_operation_failed_because_the_request_is_invalid.asText(), + BitwardenString.passkey_operation_failed_because_the_request_is_invalid + .asText(), ) return } @@ -1019,7 +1025,8 @@ class VaultItemListingViewModel @Inject constructor( ?.let { bitwardenCredentialManager.getUserVerificationRequirement(it) } ?: run { showCredentialManagerErrorDialog( - R.string.passkey_operation_failed_because_the_request_is_unsupported.asText(), + BitwardenString.passkey_operation_failed_because_the_request_is_unsupported + .asText(), ) return } @@ -1059,7 +1066,8 @@ class VaultItemListingViewModel @Inject constructor( val activeUserId = authRepository.activeUserId ?: run { showCredentialManagerErrorDialog( - R.string.passkey_operation_failed_because_user_could_not_be_verified.asText(), + BitwardenString.passkey_operation_failed_because_user_could_not_be_verified + .asText(), ) return } @@ -1068,7 +1076,8 @@ class VaultItemListingViewModel @Inject constructor( .getCreatePasskeyCredentialRequestOrNull() ?: run { showCredentialManagerErrorDialog( - R.string.passkey_operation_failed_because_the_request_is_invalid.asText(), + BitwardenString.passkey_operation_failed_because_the_request_is_invalid + .asText(), ) return } @@ -1095,7 +1104,8 @@ class VaultItemListingViewModel @Inject constructor( val activeUserId = authRepository.activeUserId ?: run { showCredentialManagerErrorDialog( - R.string.passkey_operation_failed_because_user_could_not_be_verified.asText(), + BitwardenString.passkey_operation_failed_because_user_could_not_be_verified + .asText(), ) return } @@ -1104,14 +1114,16 @@ class VaultItemListingViewModel @Inject constructor( .firstOrNull() ?: run { showCredentialManagerErrorDialog( - R.string.passkey_operation_failed_because_the_request_is_invalid.asText(), + BitwardenString.passkey_operation_failed_because_the_request_is_invalid + .asText(), ) return } val relyingPartyId = relyingPartyParser.parse(option) ?: run { showCredentialManagerErrorDialog( - R.string.passkey_operation_failed_because_relying_party_cannot_be_identified + BitwardenString + .passkey_operation_failed_because_relying_party_cannot_be_identified .asText(), ) return @@ -1168,7 +1180,7 @@ class VaultItemListingViewModel @Inject constructor( getCipherViewOrNull(action.cipherId)?.let { clipboardManager.setText( text = it.notes.orEmpty(), - toastDescriptorOverride = R.string.notes.asText(), + toastDescriptorOverride = BitwardenString.notes.asText(), ) } } @@ -1181,7 +1193,7 @@ class VaultItemListingViewModel @Inject constructor( getCipherViewOrNull(action.cipherId)?.let { clipboardManager.setText( text = it.card?.number.orEmpty(), - toastDescriptorOverride = R.string.number.asText(), + toastDescriptorOverride = BitwardenString.number.asText(), ) } } @@ -1194,7 +1206,7 @@ class VaultItemListingViewModel @Inject constructor( getCipherViewOrNull(action.cipherId)?.let { clipboardManager.setText( text = it.login?.password.orEmpty(), - toastDescriptorOverride = R.string.password.asText(), + toastDescriptorOverride = BitwardenString.password.asText(), ) organizationEventManager.trackEvent( event = OrganizationEvent.CipherClientCopiedPassword( @@ -1212,7 +1224,7 @@ class VaultItemListingViewModel @Inject constructor( getCipherViewOrNull(action.cipherId)?.let { clipboardManager.setText( text = it.card?.code.orEmpty(), - toastDescriptorOverride = R.string.security_code.asText(), + toastDescriptorOverride = BitwardenString.security_code.asText(), ) organizationEventManager.trackEvent( event = OrganizationEvent.CipherClientCopiedCardCode( @@ -1237,7 +1249,7 @@ class VaultItemListingViewModel @Inject constructor( ) { clipboardManager.setText( text = action.username, - toastDescriptorOverride = R.string.username.asText(), + toastDescriptorOverride = BitwardenString.username.asText(), ) } @@ -1328,7 +1340,7 @@ class VaultItemListingViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = VaultItemListingState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), + title = BitwardenString.an_error_has_occurred.asText(), message = action.message, ), ) @@ -1356,7 +1368,7 @@ class VaultItemListingViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = VaultItemListingState.DialogState.Loading( - message = R.string.syncing.asText(), + message = BitwardenString.syncing.asText(), ), ) } @@ -1365,8 +1377,8 @@ class VaultItemListingViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = VaultItemListingState.DialogState.Error( - R.string.internet_connection_required_title.asText(), - R.string.internet_connection_required_message.asText(), + BitwardenString.internet_connection_required_title.asText(), + BitwardenString.internet_connection_required_message.asText(), ), ) } @@ -1553,8 +1565,8 @@ class VaultItemListingViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = VaultItemListingState.DialogState.Error( - title = R.string.decryption_error.asText(), - message = R.string.failed_to_decrypt_cipher_contact_support.asText(), + title = BitwardenString.decryption_error.asText(), + message = BitwardenString.failed_to_decrypt_cipher_contact_support.asText(), throwable = action.error, ), ) @@ -1582,8 +1594,8 @@ class VaultItemListingViewModel @Inject constructor( it.copy( isRefreshing = false, dialogState = VaultItemListingState.DialogState.Error( - R.string.internet_connection_required_title.asText(), - R.string.internet_connection_required_message.asText(), + BitwardenString.internet_connection_required_title.asText(), + BitwardenString.internet_connection_required_message.asText(), ), ) } @@ -1605,8 +1617,8 @@ class VaultItemListingViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = VaultItemListingState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.generic_error_message.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.generic_error_message.asText(), throwable = result.error, ), ) @@ -1615,7 +1627,7 @@ class VaultItemListingViewModel @Inject constructor( DeleteSendResult.Success -> { clearDialogState() - sendEvent(VaultItemListingEvent.ShowSnackbar(R.string.send_deleted.asText())) + sendEvent(VaultItemListingEvent.ShowSnackbar(BitwardenString.send_deleted.asText())) } } } @@ -1628,11 +1640,11 @@ class VaultItemListingViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = VaultItemListingState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), + title = BitwardenString.an_error_has_occurred.asText(), message = result .errorMessage ?.asText() - ?: R.string.generic_error_message.asText(), + ?: BitwardenString.generic_error_message.asText(), throwable = result.error, ), ) @@ -1641,7 +1653,11 @@ class VaultItemListingViewModel @Inject constructor( is RemovePasswordSendResult.Success -> { clearDialogState() - sendEvent(VaultItemListingEvent.ShowSnackbar(R.string.password_removed.asText())) + sendEvent( + VaultItemListingEvent.ShowSnackbar( + BitwardenString.password_removed.asText(), + ), + ) } } } @@ -1654,7 +1670,7 @@ class VaultItemListingViewModel @Inject constructor( is GenerateTotpResult.Success -> { clipboardManager.setText( text = result.code, - toastDescriptorOverride = R.string.totp.asText(), + toastDescriptorOverride = BitwardenString.totp.asText(), ) } } @@ -1701,7 +1717,7 @@ class VaultItemListingViewModel @Inject constructor( it.copy( dialogState = VaultItemListingState.DialogState.Error( title = null, - message = R.string.generic_error_message.asText(), + message = BitwardenString.generic_error_message.asText(), throwable = result.error, ), ) @@ -1714,7 +1730,7 @@ class VaultItemListingViewModel @Inject constructor( it.copy( dialogState = VaultItemListingState.DialogState.Error( title = null, - message = R.string.invalid_master_password.asText(), + message = BitwardenString.invalid_master_password.asText(), ), ) } @@ -1770,7 +1786,7 @@ class VaultItemListingViewModel @Inject constructor( .DialogState .UserVerificationMasterPasswordError( title = null, - message = R.string.invalid_master_password.asText(), + message = BitwardenString.invalid_master_password.asText(), selectedCipherId = action.selectedCipherId, ), ) @@ -1798,7 +1814,7 @@ class VaultItemListingViewModel @Inject constructor( .DialogState .UserVerificationPinError( title = null, - message = R.string.invalid_pin.asText(), + message = BitwardenString.invalid_pin.asText(), selectedCipherId = action.selectedCipherId, ), ) @@ -1817,7 +1833,8 @@ class VaultItemListingViewModel @Inject constructor( } } else { showCredentialManagerErrorDialog( - R.string.credential_operation_failed_because_user_verification_attempts_exceeded + BitwardenString + .credential_operation_failed_because_user_verification_attempts_exceeded .asText(), ) } @@ -1879,7 +1896,8 @@ class VaultItemListingViewModel @Inject constructor( } ?: run { showCredentialManagerErrorDialog( - R.string.passkey_operation_failed_because_the_request_is_invalid.asText(), + BitwardenString.passkey_operation_failed_because_the_request_is_invalid + .asText(), ) } } @@ -1893,7 +1911,7 @@ class VaultItemListingViewModel @Inject constructor( mutableStateFlow.update { it.copy( viewState = VaultItemListingState.ViewState.Error( - message = R.string.generic_error_message.asText(), + message = BitwardenString.generic_error_message.asText(), ), dialogState = null, ) @@ -1940,11 +1958,11 @@ class VaultItemListingViewModel @Inject constructor( mutableStateFlow.update { currentState -> currentState.copy( viewState = VaultItemListingState.ViewState.Error( - message = R.string.internet_connection_required_title + message = BitwardenString.internet_connection_required_title .asText() .concat( " ".asText(), - R.string.internet_connection_required_message.asText(), + BitwardenString.internet_connection_required_message.asText(), ), ), dialogState = null, @@ -1976,7 +1994,8 @@ class VaultItemListingViewModel @Inject constructor( ?.let { relyingPartyParser.parse(it) } ?: run { showCredentialManagerErrorDialog( - R.string.passkey_operation_failed_because_relying_party_cannot_be_identified + BitwardenString + .passkey_operation_failed_because_relying_party_cannot_be_identified .asText(), ) return @@ -2015,7 +2034,7 @@ class VaultItemListingViewModel @Inject constructor( is Fido2RegisterCredentialResult.Success -> { // This must be a toast because we are finishing the activity and we want the // user to have time to see the message. - toastManager.show(messageId = R.string.item_updated) + toastManager.show(messageId = BitwardenString.item_updated) sendEvent( VaultItemListingEvent.CompleteFido2Registration( RegisterFido2CredentialResult.Success(action.result.responseJson), @@ -2030,7 +2049,7 @@ class VaultItemListingViewModel @Inject constructor( ) { // This must be a toast because we are finishing the activity and we want the // user to have time to see the message. - toastManager.show(messageId = R.string.an_error_has_occurred) + toastManager.show(messageId = BitwardenString.an_error_has_occurred) sendEvent( VaultItemListingEvent.CompleteFido2Registration( RegisterFido2CredentialResult.Error( @@ -2065,7 +2084,8 @@ class VaultItemListingViewModel @Inject constructor( val callingAppInfo = request.callingAppInfo ?: run { showCredentialManagerErrorDialog( - R.string.passkey_operation_failed_because_app_could_not_be_verified.asText(), + BitwardenString.passkey_operation_failed_because_app_could_not_be_verified + .asText(), ) return } @@ -2077,7 +2097,8 @@ class VaultItemListingViewModel @Inject constructor( .firstOrNull() ?: run { showCredentialManagerErrorDialog( - R.string.passkey_operation_failed_because_relying_party_cannot_be_identified + BitwardenString + .passkey_operation_failed_because_relying_party_cannot_be_identified .asText(), ) return @@ -2122,7 +2143,7 @@ class VaultItemListingViewModel @Inject constructor( dialogState = when { shouldShowTrustPrompt(error) -> { VaultItemListingState.DialogState.TrustPrivilegedAddPrompt( - message = R.string + message = BitwardenString .passkey_operation_failed_because_browser_x_is_not_trusted .asText(callingAppInfo.packageName), selectedCipherId = selectedCipherId, @@ -2131,7 +2152,7 @@ class VaultItemListingViewModel @Inject constructor( else -> { VaultItemListingState.DialogState.CredentialManagerOperationFail( - title = R.string.an_error_has_occurred.asText(), + title = BitwardenString.an_error_has_occurred.asText(), message = error.messageResourceId.asText(), ) } @@ -2150,7 +2171,7 @@ class VaultItemListingViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = VaultItemListingState.DialogState.Loading( - message = R.string.loading.asText(), + message = BitwardenString.loading.asText(), ), ) } @@ -2178,7 +2199,7 @@ class VaultItemListingViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = VaultItemListingState.DialogState.Loading( - message = R.string.loading.asText(), + message = BitwardenString.loading.asText(), ), ) } @@ -2214,8 +2235,8 @@ class VaultItemListingViewModel @Inject constructor( private suspend fun sendCredentialDecryptionError(throwable: Throwable?) { sendAction( VaultItemListingsAction.Internal.CredentialOperationFailureReceive( - title = R.string.decryption_error.asText(), - message = R.string.failed_to_decrypt_cipher_contact_support.asText(), + title = BitwardenString.decryption_error.asText(), + message = BitwardenString.failed_to_decrypt_cipher_contact_support.asText(), error = throwable, ), ) @@ -2224,8 +2245,8 @@ class VaultItemListingViewModel @Inject constructor( private fun sendCredentialItemNotFoundError() { trySendAction( VaultItemListingsAction.Internal.CredentialOperationFailureReceive( - title = R.string.an_error_has_occurred.asText(), - message = R.string + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString .credential_operation_failed_because_the_selected_item_does_not_exist .asText(), error = null, @@ -2293,7 +2314,7 @@ class VaultItemListingViewModel @Inject constructor( } ?: VaultItemListingEvent.CompleteProviderGetPasswordCredentialRequest( GetPasswordCredentialResult.Error( - message = R.string + message = BitwardenString .password_operation_failed_because_the_selected_item_does_not_exist .asText(), ), @@ -2337,7 +2358,7 @@ class VaultItemListingViewModel @Inject constructor( action.result .onFailure { showCredentialManagerErrorDialog( - message = R.string.generic_error_message.asText(), + message = BitwardenString.generic_error_message.asText(), ) } .onSuccess { credentialEntries -> @@ -2515,14 +2536,15 @@ class VaultItemListingViewModel @Inject constructor( private fun showUserVerificationErrorDialog() { showCredentialManagerErrorDialog( - message = R.string.credential_operation_failed_because_user_could_not_be_verified + message = BitwardenString + .credential_operation_failed_because_user_could_not_be_verified .asText(), ) } private fun showCredentialManagerErrorDialog( message: Text, - title: Text = R.string.an_error_has_occurred.asText(), + title: Text = BitwardenString.an_error_has_occurred.asText(), error: Throwable? = null, ) { bitwardenCredentialManager.authenticationAttempts = 0 @@ -2606,11 +2628,15 @@ data class VaultItemListingState( get() = autofillSelectionData ?.uri ?.toHostOrPathOrNull() - ?.let { R.string.items_for_uri.asText(it) } + ?.let { BitwardenString.items_for_uri.asText(it) } ?: createCredentialRequest ?.relyingPartyIdOrNull - ?.let { R.string.items_for_uri.asText(it) } - ?: totpData?.let { R.string.items_for_uri.asText(it.issuer ?: it.accountName ?: "--") } + ?.let { BitwardenString.items_for_uri.asText(it) } + ?: totpData?.let { + BitwardenString.items_for_uri.asText( + it.issuer ?: it.accountName ?: "--", + ) + } ?: itemListingType.titleText /** @@ -2916,7 +2942,7 @@ data class VaultItemListingState( * A Login item listing. */ data object Login : Vault() { - override val titleText: Text get() = R.string.logins.asText() + override val titleText: Text get() = BitwardenString.logins.asText() override val hasFab: Boolean get() = true } @@ -2924,7 +2950,7 @@ data class VaultItemListingState( * A Card item listing. */ data object Card : Vault() { - override val titleText: Text get() = R.string.cards.asText() + override val titleText: Text get() = BitwardenString.cards.asText() override val hasFab: Boolean get() = true } @@ -2932,7 +2958,7 @@ data class VaultItemListingState( * An Identity item listing. */ data object Identity : Vault() { - override val titleText: Text get() = R.string.identities.asText() + override val titleText: Text get() = BitwardenString.identities.asText() override val hasFab: Boolean get() = true } @@ -2940,7 +2966,7 @@ data class VaultItemListingState( * A Secure Note item listing. */ data object SecureNote : Vault() { - override val titleText: Text get() = R.string.secure_notes.asText() + override val titleText: Text get() = BitwardenString.secure_notes.asText() override val hasFab: Boolean get() = true } @@ -2948,7 +2974,7 @@ data class VaultItemListingState( * A SSH key item listing. */ data object SshKey : Vault() { - override val titleText: Text get() = R.string.ssh_keys.asText() + override val titleText: Text get() = BitwardenString.ssh_keys.asText() override val hasFab: Boolean get() = false } @@ -2956,7 +2982,7 @@ data class VaultItemListingState( * A Secure Trash item listing. */ data object Trash : Vault() { - override val titleText: Text get() = R.string.trash.asText() + override val titleText: Text get() = BitwardenString.trash.asText() override val hasFab: Boolean get() = false } @@ -2975,7 +3001,7 @@ data class VaultItemListingState( override val titleText: Text get() = folderId ?.let { folderName.asText() } - ?: R.string.folder_none.asText() + ?: BitwardenString.folder_none.asText() override val hasFab: Boolean get() = true } @@ -3003,7 +3029,7 @@ data class VaultItemListingState( * A Send File item listing. */ data object SendFile : Send() { - override val titleText: Text get() = R.string.file.asText() + override val titleText: Text get() = BitwardenString.file.asText() override val hasFab: Boolean get() = true } @@ -3011,7 +3037,7 @@ data class VaultItemListingState( * A Send Text item listing. */ data object SendText : Send() { - override val titleText: Text get() = R.string.text.asText() + override val titleText: Text get() = BitwardenString.text.asText() override val hasFab: Boolean get() = true } } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/itemlisting/model/ListingItemOverflowAction.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/itemlisting/model/ListingItemOverflowAction.kt index 004b866e0a..bda0d3b2d1 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/itemlisting/model/ListingItemOverflowAction.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/itemlisting/model/ListingItemOverflowAction.kt @@ -2,10 +2,10 @@ package com.x8bit.bitwarden.ui.vault.feature.itemlisting.model import android.os.Parcelable import com.bitwarden.send.SendType +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText import com.bitwarden.vault.CipherType -import com.x8bit.bitwarden.R import kotlinx.parcelize.Parcelize /** @@ -30,7 +30,7 @@ sealed class ListingItemOverflowAction : Parcelable { val sendId: String, val sendType: SendType, ) : SendAction() { - override val title: Text get() = R.string.view.asText() + override val title: Text get() = BitwardenString.view.asText() } /** @@ -41,7 +41,7 @@ sealed class ListingItemOverflowAction : Parcelable { val sendId: String, val sendType: SendType, ) : SendAction() { - override val title: Text get() = R.string.edit.asText() + override val title: Text get() = BitwardenString.edit.asText() } /** @@ -49,7 +49,7 @@ sealed class ListingItemOverflowAction : Parcelable { */ @Parcelize data class CopyUrlClick(val sendUrl: String) : SendAction() { - override val title: Text get() = R.string.copy_link.asText() + override val title: Text get() = BitwardenString.copy_link.asText() } /** @@ -57,7 +57,7 @@ sealed class ListingItemOverflowAction : Parcelable { */ @Parcelize data class ShareUrlClick(val sendUrl: String) : SendAction() { - override val title: Text get() = R.string.share_link.asText() + override val title: Text get() = BitwardenString.share_link.asText() } /** @@ -65,7 +65,7 @@ sealed class ListingItemOverflowAction : Parcelable { */ @Parcelize data class RemovePasswordClick(val sendId: String) : SendAction() { - override val title: Text get() = R.string.remove_password.asText() + override val title: Text get() = BitwardenString.remove_password.asText() } /** @@ -73,7 +73,7 @@ sealed class ListingItemOverflowAction : Parcelable { */ @Parcelize data class DeleteClick(val sendId: String) : SendAction() { - override val title: Text get() = R.string.delete.asText() + override val title: Text get() = BitwardenString.delete.asText() } } @@ -96,7 +96,7 @@ sealed class ListingItemOverflowAction : Parcelable { val cipherType: CipherType, override val requiresPasswordReprompt: Boolean, ) : VaultAction() { - override val title: Text get() = R.string.view.asText() + override val title: Text get() = BitwardenString.view.asText() } /** @@ -108,7 +108,7 @@ sealed class ListingItemOverflowAction : Parcelable { val cipherType: CipherType, override val requiresPasswordReprompt: Boolean, ) : VaultAction() { - override val title: Text get() = R.string.edit.asText() + override val title: Text get() = BitwardenString.edit.asText() } /** @@ -116,7 +116,7 @@ sealed class ListingItemOverflowAction : Parcelable { */ @Parcelize data class CopyUsernameClick(val username: String) : VaultAction() { - override val title: Text get() = R.string.copy_username.asText() + override val title: Text get() = BitwardenString.copy_username.asText() override val requiresPasswordReprompt: Boolean get() = false } @@ -128,7 +128,7 @@ sealed class ListingItemOverflowAction : Parcelable { val cipherId: String, override val requiresPasswordReprompt: Boolean, ) : VaultAction() { - override val title: Text get() = R.string.copy_password.asText() + override val title: Text get() = BitwardenString.copy_password.asText() } /** @@ -139,7 +139,7 @@ sealed class ListingItemOverflowAction : Parcelable { val totpCode: String, override val requiresPasswordReprompt: Boolean, ) : VaultAction() { - override val title: Text get() = R.string.copy_totp.asText() + override val title: Text get() = BitwardenString.copy_totp.asText() } /** @@ -150,7 +150,7 @@ sealed class ListingItemOverflowAction : Parcelable { val cipherId: String, override val requiresPasswordReprompt: Boolean, ) : VaultAction() { - override val title: Text get() = R.string.copy_number.asText() + override val title: Text get() = BitwardenString.copy_number.asText() } /** @@ -161,7 +161,7 @@ sealed class ListingItemOverflowAction : Parcelable { val cipherId: String, override val requiresPasswordReprompt: Boolean, ) : VaultAction() { - override val title: Text get() = R.string.copy_security_code.asText() + override val title: Text get() = BitwardenString.copy_security_code.asText() } /** @@ -172,7 +172,7 @@ sealed class ListingItemOverflowAction : Parcelable { val cipherId: String, override val requiresPasswordReprompt: Boolean, ) : VaultAction() { - override val title: Text get() = R.string.copy_notes.asText() + override val title: Text get() = BitwardenString.copy_notes.asText() } /** @@ -180,7 +180,7 @@ sealed class ListingItemOverflowAction : Parcelable { */ @Parcelize data class LaunchClick(val url: String) : VaultAction() { - override val title: Text get() = R.string.launch.asText() + override val title: Text get() = BitwardenString.launch.asText() override val requiresPasswordReprompt: Boolean get() = false } } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/itemlisting/util/Fido2CredentialAssertionResultExtensions.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/itemlisting/util/Fido2CredentialAssertionResultExtensions.kt index 0722eedc47..f10d22d2e9 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/itemlisting/util/Fido2CredentialAssertionResultExtensions.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/itemlisting/util/Fido2CredentialAssertionResultExtensions.kt @@ -1,7 +1,7 @@ package com.x8bit.bitwarden.ui.vault.feature.itemlisting.util import androidx.annotation.StringRes -import com.x8bit.bitwarden.R +import com.bitwarden.ui.platform.resource.BitwardenString import com.x8bit.bitwarden.data.credentials.model.Fido2CredentialAssertionResult /** @@ -12,14 +12,14 @@ val Fido2CredentialAssertionResult.Error.messageResourceId: Int @StringRes get() = when (this) { Fido2CredentialAssertionResult.Error.InternalError -> { - R.string.passkey_registration_failed_due_to_an_internal_error + BitwardenString.passkey_registration_failed_due_to_an_internal_error } Fido2CredentialAssertionResult.Error.MissingHostUrl -> { - R.string.passkey_operation_failed_because_host_url_is_not_present_in_request + BitwardenString.passkey_operation_failed_because_host_url_is_not_present_in_request } Fido2CredentialAssertionResult.Error.MissingRpId -> { - R.string.passkey_operation_failed_because_relying_party_cannot_be_identified + BitwardenString.passkey_operation_failed_because_relying_party_cannot_be_identified } } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/itemlisting/util/Fido2RegisterCredentialResultExtensions.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/itemlisting/util/Fido2RegisterCredentialResultExtensions.kt index a12e503d1d..d06cd60d39 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/itemlisting/util/Fido2RegisterCredentialResultExtensions.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/itemlisting/util/Fido2RegisterCredentialResultExtensions.kt @@ -1,7 +1,7 @@ package com.x8bit.bitwarden.ui.vault.feature.itemlisting.util import androidx.annotation.StringRes -import com.x8bit.bitwarden.R +import com.bitwarden.ui.platform.resource.BitwardenString import com.x8bit.bitwarden.data.credentials.model.Fido2RegisterCredentialResult /** @@ -12,14 +12,14 @@ val Fido2RegisterCredentialResult.Error.messageResourceId: Int @StringRes get() = when (this) { Fido2RegisterCredentialResult.Error.InternalError -> { - R.string.passkey_registration_failed_due_to_an_internal_error + BitwardenString.passkey_registration_failed_due_to_an_internal_error } Fido2RegisterCredentialResult.Error.InvalidAppSignature -> { - R.string.passkey_operation_failed_because_app_signature_is_invalid + BitwardenString.passkey_operation_failed_because_app_signature_is_invalid } Fido2RegisterCredentialResult.Error.MissingHostUrl -> { - R.string.passkey_operation_failed_because_host_url_is_not_present_in_request + BitwardenString.passkey_operation_failed_because_host_url_is_not_present_in_request } } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/itemlisting/util/Fido2ValidateOriginResultExtensions.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/itemlisting/util/Fido2ValidateOriginResultExtensions.kt index a98f6a4111..c5c8c2bc5d 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/itemlisting/util/Fido2ValidateOriginResultExtensions.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/itemlisting/util/Fido2ValidateOriginResultExtensions.kt @@ -1,7 +1,7 @@ package com.x8bit.bitwarden.ui.vault.feature.itemlisting.util import androidx.annotation.StringRes -import com.x8bit.bitwarden.R +import com.bitwarden.ui.platform.resource.BitwardenString import com.x8bit.bitwarden.data.credentials.model.ValidateOriginResult /** @@ -12,22 +12,22 @@ val ValidateOriginResult.Error.messageResourceId: Int @StringRes get() = when (this) { ValidateOriginResult.Error.AssetLinkNotFound -> { - R.string.passkey_operation_failed_because_of_missing_asset_links + BitwardenString.passkey_operation_failed_because_of_missing_asset_links } ValidateOriginResult.Error.PasskeyNotSupportedForApp -> { - R.string.passkeys_not_supported_for_this_app + BitwardenString.passkeys_not_supported_for_this_app } ValidateOriginResult.Error.PrivilegedAppNotAllowed -> { - R.string.passkey_operation_failed_because_browser_is_not_privileged + BitwardenString.passkey_operation_failed_because_browser_is_not_privileged } ValidateOriginResult.Error.PrivilegedAppSignatureNotFound -> { - R.string.passkey_operation_failed_because_browser_signature_does_not_match + BitwardenString.passkey_operation_failed_because_browser_signature_does_not_match } ValidateOriginResult.Error.Unknown -> { - R.string.generic_error_message + BitwardenString.generic_error_message } } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/itemlisting/util/VaultItemListingDataExtensions.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/itemlisting/util/VaultItemListingDataExtensions.kt index 83bfee0597..d62352bd3f 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/itemlisting/util/VaultItemListingDataExtensions.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/itemlisting/util/VaultItemListingDataExtensions.kt @@ -9,6 +9,7 @@ import com.bitwarden.send.SendView import com.bitwarden.ui.platform.base.util.toHostOrPathOrNull import com.bitwarden.ui.platform.components.icon.model.IconData import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.asText import com.bitwarden.vault.CipherListView import com.bitwarden.vault.CipherListViewType @@ -16,7 +17,6 @@ import com.bitwarden.vault.CipherRepromptType import com.bitwarden.vault.CipherView import com.bitwarden.vault.CollectionView import com.bitwarden.vault.FolderView -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.autofill.model.AutofillSelectionData import com.x8bit.bitwarden.data.autofill.util.isActiveWithFido2Credentials import com.x8bit.bitwarden.data.autofill.util.login @@ -177,44 +177,44 @@ fun VaultData.toViewState( val message = autofillSelectionData ?.uri ?.toHostOrPathOrNull() - ?.let { R.string.no_items_for_uri.asText(it) } + ?.let { BitwardenString.no_items_for_uri.asText(it) } ?: createCredentialRequestData ?.relyingPartyIdOrNull ?.toHostOrPathOrNull() - ?.let { R.string.no_items_for_uri.asText(it) } - ?: totpData?.let { R.string.search_for_a_login_or_add_a_new_login.asText() } + ?.let { BitwardenString.no_items_for_uri.asText(it) } + ?: totpData?.let { BitwardenString.search_for_a_login_or_add_a_new_login.asText() } ?: run { when (itemListingType) { is VaultItemListingState.ItemListingType.Vault.Folder -> { - R.string.no_items_folder + BitwardenString.no_items_folder } is VaultItemListingState.ItemListingType.Vault.Collection -> { - R.string.no_items_collection + BitwardenString.no_items_collection } VaultItemListingState.ItemListingType.Vault.Trash -> { - R.string.no_items_trash + BitwardenString.no_items_trash } VaultItemListingState.ItemListingType.Vault.Card -> { - R.string.no_cards + BitwardenString.no_cards } VaultItemListingState.ItemListingType.Vault.Identity -> { - R.string.no_identities + BitwardenString.no_identities } VaultItemListingState.ItemListingType.Vault.Login -> { - R.string.no_logins + BitwardenString.no_logins } VaultItemListingState.ItemListingType.Vault.SecureNote -> { - R.string.no_notes + BitwardenString.no_notes } VaultItemListingState.ItemListingType.Vault.SshKey -> { - R.string.no_ssh_keys + BitwardenString.no_ssh_keys } } .asText() @@ -227,34 +227,37 @@ fun VaultData.toViewState( VaultItemListingState.ViewState.NoItems( header = totpData - ?.let { R.string.no_items_for_vault.asText(it.issuer ?: it.accountName ?: "--") }, + ?.let { + BitwardenString.no_items_for_vault + .asText(it.issuer ?: it.accountName ?: "--") + }, message = message, shouldShowAddButton = shouldShowAddButton, buttonText = createCredentialRequestData - ?.let { R.string.save_passkey_as_new_login.asText() } + ?.let { BitwardenString.save_passkey_as_new_login.asText() } ?: run { when (itemListingType) { VaultItemListingState.ItemListingType.Vault.Card -> { - R.string.new_card + BitwardenString.new_card } VaultItemListingState.ItemListingType.Vault.Identity -> { - R.string.new_identity + BitwardenString.new_identity } VaultItemListingState.ItemListingType.Vault.Login -> { - R.string.new_login + BitwardenString.new_login } VaultItemListingState.ItemListingType.Vault.SecureNote -> { - R.string.new_note + BitwardenString.new_note } VaultItemListingState.ItemListingType.Vault.SshKey -> { - R.string.new_ssh_key + BitwardenString.new_ssh_key } - else -> R.string.new_item + else -> BitwardenString.new_item } .asText() }, @@ -284,14 +287,14 @@ fun List.toViewState( } else { VaultItemListingState.ViewState.NoItems( message = when (itemListingType) { - VaultItemListingState.ItemListingType.Send.SendFile -> R.string.no_file_sends - VaultItemListingState.ItemListingType.Send.SendText -> R.string.no_text_sends + VaultItemListingState.ItemListingType.Send.SendFile -> BitwardenString.no_file_sends + VaultItemListingState.ItemListingType.Send.SendText -> BitwardenString.no_text_sends } .asText(), shouldShowAddButton = true, buttonText = when (itemListingType) { - VaultItemListingState.ItemListingType.Send.SendFile -> R.string.new_file_send - VaultItemListingState.ItemListingType.Send.SendText -> R.string.new_text_send + VaultItemListingState.ItemListingType.Send.SendFile -> BitwardenString.new_file_send + VaultItemListingState.ItemListingType.Send.SendText -> BitwardenString.new_text_send } .asText(), ) diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/manualcodeentry/ManualCodeEntryScreen.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/manualcodeentry/ManualCodeEntryScreen.kt index 2b60859b92..8aa8ad922f 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/manualcodeentry/ManualCodeEntryScreen.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/manualcodeentry/ManualCodeEntryScreen.kt @@ -38,8 +38,8 @@ import com.bitwarden.ui.platform.components.button.BitwardenFilledButton import com.bitwarden.ui.platform.components.model.CardStyle import com.bitwarden.ui.platform.components.util.rememberVectorPainter import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenBasicDialog import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenTwoButtonDialog import com.x8bit.bitwarden.ui.platform.components.field.BitwardenTextField @@ -97,9 +97,11 @@ fun ManualCodeEntryScreen( if (shouldShowPermissionDialog) { BitwardenTwoButtonDialog( - message = stringResource(id = R.string.enable_camer_permission_to_use_the_scanner), - confirmButtonText = stringResource(id = R.string.settings), - dismissButtonText = stringResource(id = R.string.no_thanks), + message = stringResource( + id = BitwardenString.enable_camer_permission_to_use_the_scanner, + ), + confirmButtonText = stringResource(id = BitwardenString.settings), + dismissButtonText = stringResource(id = BitwardenString.no_thanks), onConfirmClick = remember(viewModel) { { viewModel.trySendAction(ManualCodeEntryAction.SettingsClick) } }, @@ -123,9 +125,9 @@ fun ManualCodeEntryScreen( .nestedScroll(scrollBehavior.nestedScrollConnection), topBar = { BitwardenTopAppBar( - title = stringResource(id = R.string.authenticator_key_scanner), + title = stringResource(id = BitwardenString.authenticator_key_scanner), navigationIcon = rememberVectorPainter(id = BitwardenDrawable.ic_close), - navigationIconContentDescription = stringResource(id = R.string.close), + navigationIconContentDescription = stringResource(id = BitwardenString.close), onNavigationIconClick = remember(viewModel) { { viewModel.trySendAction(ManualCodeEntryAction.CloseClick) } }, @@ -140,7 +142,7 @@ fun ManualCodeEntryScreen( ) { Spacer(modifier = Modifier.height(height = 24.dp)) Text( - text = stringResource(id = R.string.enter_key_manually), + text = stringResource(id = BitwardenString.enter_key_manually), style = BitwardenTheme.typography.titleMedium, textAlign = TextAlign.Center, modifier = Modifier @@ -151,7 +153,7 @@ fun ManualCodeEntryScreen( Spacer(modifier = Modifier.height(height = 12.dp)) Text( - text = stringResource(id = R.string.once_the_key_is_successfully_entered), + text = stringResource(id = BitwardenString.once_the_key_is_successfully_entered), style = BitwardenTheme.typography.bodyMedium, textAlign = TextAlign.Center, modifier = Modifier @@ -162,7 +164,7 @@ fun ManualCodeEntryScreen( Spacer(modifier = Modifier.height(height = 24.dp)) BitwardenTextField( singleLine = false, - label = stringResource(id = R.string.authenticator_key_scanner), + label = stringResource(id = BitwardenString.authenticator_key_scanner), value = state.code, onValueChange = remember(viewModel) { { viewModel.trySendAction(ManualCodeEntryAction.CodeTextChange(it)) } @@ -176,7 +178,7 @@ fun ManualCodeEntryScreen( Spacer(modifier = Modifier.height(height = 24.dp)) BitwardenFilledButton( - label = stringResource(id = R.string.add_totp), + label = stringResource(id = BitwardenString.add_totp), onClick = remember(viewModel) { { viewModel.trySendAction(ManualCodeEntryAction.CodeSubmit) } }, @@ -188,9 +190,9 @@ fun ManualCodeEntryScreen( Spacer(modifier = Modifier.height(height = 24.dp)) BitwardenHyperTextLink( - annotatedResId = R.string.cannot_add_authenticator_key_scan_qr_code, + annotatedResId = BitwardenString.cannot_add_authenticator_key_scan_qr_code, annotationKey = "scanQrCode", - accessibilityString = stringResource(id = R.string.scan_qr_code), + accessibilityString = stringResource(id = BitwardenString.scan_qr_code), onClick = remember(viewModel) { { if (permissionsManager.checkPermission(Manifest.permission.CAMERA)) { diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/manualcodeentry/ManualCodeEntryViewModel.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/manualcodeentry/ManualCodeEntryViewModel.kt index 312ebfac20..ab09ffd1e3 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/manualcodeentry/ManualCodeEntryViewModel.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/manualcodeentry/ManualCodeEntryViewModel.kt @@ -3,9 +3,9 @@ package com.x8bit.bitwarden.ui.vault.feature.manualcodeentry import android.os.Parcelable import androidx.lifecycle.SavedStateHandle import com.bitwarden.ui.platform.base.BaseViewModel +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.vault.repository.VaultRepository import com.x8bit.bitwarden.data.vault.repository.model.TotpCodeResult import dagger.hilt.android.lifecycle.HiltViewModel @@ -57,8 +57,8 @@ class ManualCodeEntryViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialog = ManualCodeEntryState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.authenticator_key_read_error.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.authenticator_key_read_error.asText(), ), ) } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/VaultMoveToOrganizationContent.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/VaultMoveToOrganizationContent.kt index ae4e636dff..254cfac1c0 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/VaultMoveToOrganizationContent.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/VaultMoveToOrganizationContent.kt @@ -12,7 +12,7 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import com.bitwarden.ui.platform.base.util.standardHorizontalMargin import com.bitwarden.ui.platform.components.model.CardStyle -import com.x8bit.bitwarden.R +import com.bitwarden.ui.platform.resource.BitwardenString import com.x8bit.bitwarden.ui.platform.components.dropdown.BitwardenMultiSelectButton import com.x8bit.bitwarden.ui.vault.components.collectionItemsSelector import com.x8bit.bitwarden.ui.vault.model.VaultCollection @@ -39,7 +39,7 @@ fun VaultMoveToOrganizationContent( if (!showOnlyCollections) { item { BitwardenMultiSelectButton( - label = stringResource(id = R.string.organization), + label = stringResource(id = BitwardenString.organization), options = state .organizations .map { it.name } @@ -52,7 +52,7 @@ fun VaultMoveToOrganizationContent( .first { it.name == selectedString }, ) }, - supportingText = stringResource(id = R.string.move_to_org_desc), + supportingText = stringResource(id = BitwardenString.move_to_org_desc), cardStyle = CardStyle.Full, modifier = Modifier .testTag("OrganizationListDropdown") diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/VaultMoveToOrganizationEmpty.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/VaultMoveToOrganizationEmpty.kt index 2dcc0f9569..bfc7bcde0f 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/VaultMoveToOrganizationEmpty.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/VaultMoveToOrganizationEmpty.kt @@ -12,8 +12,8 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme -import com.x8bit.bitwarden.R /** * Empty view for the [VaultMoveToOrganizationScreen]. @@ -26,7 +26,7 @@ fun VaultMoveToOrganizationEmpty(modifier: Modifier = Modifier) { ) { Spacer(modifier = Modifier.height(8.dp)) Text( - text = stringResource(id = R.string.no_orgs_to_list), + text = stringResource(id = BitwardenString.no_orgs_to_list), style = BitwardenTheme.typography.bodyMedium, color = BitwardenTheme.colorScheme.text.secondary, textAlign = TextAlign.Center, diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/VaultMoveToOrganizationScreen.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/VaultMoveToOrganizationScreen.kt index 271154d5d2..586258aa87 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/VaultMoveToOrganizationScreen.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/VaultMoveToOrganizationScreen.kt @@ -18,7 +18,7 @@ import com.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar import com.bitwarden.ui.platform.components.button.BitwardenTextButton import com.bitwarden.ui.platform.components.util.rememberVectorPainter import com.bitwarden.ui.platform.resource.BitwardenDrawable -import com.x8bit.bitwarden.R +import com.bitwarden.ui.platform.resource.BitwardenString import com.x8bit.bitwarden.ui.platform.components.content.BitwardenErrorContent import com.x8bit.bitwarden.ui.platform.components.content.BitwardenLoadingContent import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenBasicDialog @@ -75,7 +75,7 @@ private fun VaultMoveToOrganizationScaffold( when (val dialog = state.dialogState) { is VaultMoveToOrganizationState.DialogState.Error -> { BitwardenBasicDialog( - title = stringResource(id = R.string.an_error_has_occurred), + title = stringResource(id = BitwardenString.an_error_has_occurred), message = dialog.message(), onDismissRequest = dismissClick, throwable = dialog.throwable, @@ -97,7 +97,7 @@ private fun VaultMoveToOrganizationScaffold( title = state.appBarText(), scrollBehavior = scrollBehavior, navigationIcon = rememberVectorPainter(id = BitwardenDrawable.ic_close), - navigationIconContentDescription = stringResource(id = R.string.close), + navigationIconContentDescription = stringResource(id = BitwardenString.close), onNavigationIconClick = closeClick, actions = { BitwardenTextButton( diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/VaultMoveToOrganizationViewModel.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/VaultMoveToOrganizationViewModel.kt index 8919c683b5..2aed1c54b5 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/VaultMoveToOrganizationViewModel.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/VaultMoveToOrganizationViewModel.kt @@ -6,12 +6,12 @@ import androidx.lifecycle.viewModelScope import com.bitwarden.core.data.repository.model.DataState import com.bitwarden.core.data.repository.util.combineDataStates import com.bitwarden.ui.platform.base.BaseViewModel +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText import com.bitwarden.ui.util.concat import com.bitwarden.vault.CipherView import com.bitwarden.vault.CollectionView -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.auth.repository.AuthRepository import com.x8bit.bitwarden.data.auth.repository.model.UserState import com.x8bit.bitwarden.data.vault.repository.VaultRepository @@ -127,7 +127,7 @@ class VaultMoveToOrganizationViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = VaultMoveToOrganizationState.DialogState.Error( - message = R.string.select_one_collection.asText(), + message = BitwardenString.select_one_collection.asText(), ), ) } @@ -161,7 +161,7 @@ class VaultMoveToOrganizationViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = VaultMoveToOrganizationState.DialogState.Error( - message = R.string.generic_error_message.asText(), + message = BitwardenString.generic_error_message.asText(), throwable = result.error, ), ) @@ -187,13 +187,13 @@ class VaultMoveToOrganizationViewModel @Inject constructor( it.copy( viewState = data.toViewState(), dialogState = VaultMoveToOrganizationState.DialogState.Error( - message = R.string.generic_error_message.asText(), + message = BitwardenString.generic_error_message.asText(), ), ) } else { it.copy( viewState = VaultMoveToOrganizationState.ViewState.Error( - message = R.string.generic_error_message.asText(), + message = BitwardenString.generic_error_message.asText(), ), dialogState = null, ) @@ -230,22 +230,22 @@ class VaultMoveToOrganizationViewModel @Inject constructor( it.copy( viewState = data.toViewState(), dialogState = VaultMoveToOrganizationState.DialogState.Error( - message = R.string.internet_connection_required_title + message = BitwardenString.internet_connection_required_title .asText() .concat( " ".asText(), - R.string.internet_connection_required_message.asText(), + BitwardenString.internet_connection_required_message.asText(), ), ), ) } else { it.copy( viewState = VaultMoveToOrganizationState.ViewState.Error( - message = R.string.internet_connection_required_title + message = BitwardenString.internet_connection_required_title .asText() .concat( " ".asText(), - R.string.internet_connection_required_message.asText(), + BitwardenString.internet_connection_required_message.asText(), ), ), dialogState = null, @@ -296,7 +296,7 @@ class VaultMoveToOrganizationViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = VaultMoveToOrganizationState.DialogState.Loading( - message = R.string.saving.asText(), + message = BitwardenString.saving.asText(), ), ) } @@ -309,7 +309,7 @@ class VaultMoveToOrganizationViewModel @Inject constructor( cipherView = cipherView, collectionIds = collectionIds, ), - message = R.string.item_updated.asText(), + message = BitwardenString.item_updated.asText(), ) } else { VaultMoveToOrganizationAction.Internal.ShareCipherResultReceive( @@ -319,7 +319,7 @@ class VaultMoveToOrganizationViewModel @Inject constructor( cipherView = cipherView, collectionIds = collectionIds, ), - message = R.string.moved_item_to_org.asText( + message = BitwardenString.moved_item_to_org.asText( requireNotNull(contentState.cipherToMove).name, contentState.selectedOrganization.name, ), @@ -347,16 +347,16 @@ data class VaultMoveToOrganizationState( val appBarText: Text get() = if (onlyShowCollections) { - R.string.collections.asText() + BitwardenString.collections.asText() } else { - R.string.move_to_organization.asText() + BitwardenString.move_to_organization.asText() } val appBarButtonText: Text get() = if (onlyShowCollections) { - R.string.save.asText() + BitwardenString.save.asText() } else { - R.string.move.asText() + BitwardenString.move.asText() } /** diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/util/VaultMoveToOrganizationViewExtensions.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/util/VaultMoveToOrganizationViewExtensions.kt index df7b7eca16..fb375f2290 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/util/VaultMoveToOrganizationViewExtensions.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/util/VaultMoveToOrganizationViewExtensions.kt @@ -1,9 +1,9 @@ package com.x8bit.bitwarden.ui.vault.feature.movetoorganization.util +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.asText import com.bitwarden.vault.CipherView import com.bitwarden.vault.CollectionView -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.auth.repository.model.UserState import com.x8bit.bitwarden.ui.vault.feature.movetoorganization.VaultMoveToOrganizationState import com.x8bit.bitwarden.ui.vault.model.VaultCollection @@ -25,7 +25,9 @@ fun Triple, UserState?>.toViewState(): return when { (currentCipher == null) -> { - VaultMoveToOrganizationState.ViewState.Error(R.string.generic_error_message.asText()) + VaultMoveToOrganizationState.ViewState.Error( + BitwardenString.generic_error_message.asText(), + ) } (userOrganizations?.isNotEmpty() == true) -> { diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/qrcodescan/QrCodeScanScreen.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/qrcodescan/QrCodeScanScreen.kt index d2e2c639c9..aab3fb7b3b 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/qrcodescan/QrCodeScanScreen.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/qrcodescan/QrCodeScanScreen.kt @@ -56,11 +56,11 @@ import com.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar import com.bitwarden.ui.platform.components.util.rememberVectorPainter import com.bitwarden.ui.platform.model.WindowSize import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme import com.bitwarden.ui.platform.theme.LocalBitwardenColorScheme import com.bitwarden.ui.platform.theme.color.darkBitwardenColorScheme import com.bitwarden.ui.platform.util.rememberWindowSize -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.platform.components.scaffold.BitwardenScaffold import com.x8bit.bitwarden.ui.vault.feature.qrcodescan.util.QrCodeAnalyzer import com.x8bit.bitwarden.ui.vault.feature.qrcodescan.util.QrCodeAnalyzerImpl @@ -105,9 +105,9 @@ fun QrCodeScanScreen( modifier = Modifier.fillMaxSize(), topBar = { BitwardenTopAppBar( - title = stringResource(id = R.string.scan_qr_code), + title = stringResource(id = BitwardenString.scan_qr_code), navigationIcon = rememberVectorPainter(id = BitwardenDrawable.ic_close), - navigationIconContentDescription = stringResource(id = R.string.close), + navigationIconContentDescription = stringResource(id = BitwardenString.close), onNavigationIconClick = remember(viewModel) { { viewModel.trySendAction(QrCodeScanAction.CloseClick) } }, @@ -165,7 +165,7 @@ private fun QrCodeContentCompact( .verticalScroll(rememberScrollState()), ) { Text( - text = stringResource(id = R.string.point_your_camera_at_the_qr_code), + text = stringResource(id = BitwardenString.point_your_camera_at_the_qr_code), textAlign = TextAlign.Center, color = Color.White, style = BitwardenTheme.typography.bodyMedium, @@ -206,7 +206,7 @@ private fun QrCodeContentMedium( .verticalScroll(rememberScrollState()), ) { Text( - text = stringResource(id = R.string.point_your_camera_at_the_qr_code), + text = stringResource(id = BitwardenString.point_your_camera_at_the_qr_code), textAlign = TextAlign.Center, color = Color.White, style = BitwardenTheme.typography.bodySmall, @@ -402,10 +402,10 @@ private fun EnterKeyManuallyText( onEnterKeyManuallyClick: () -> Unit, modifier: Modifier = Modifier, ) { - val enterKeyManuallyString = stringResource(R.string.enter_key_manually) + val enterKeyManuallyString = stringResource(BitwardenString.enter_key_manually) Text( text = annotatedStringResource( - id = R.string.cannot_scan_qr_code_enter_key_manually, + id = BitwardenString.cannot_scan_qr_code_enter_key_manually, onAnnotationClick = { when (it) { "enterKeyManually" -> onEnterKeyManuallyClick() diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/vault/VaultContent.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/vault/VaultContent.kt index a73612a0f1..98b203b239 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/vault/VaultContent.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/vault/VaultContent.kt @@ -21,7 +21,7 @@ import com.bitwarden.ui.platform.base.util.toListItemCardStyle import com.bitwarden.ui.platform.components.model.CardStyle import com.bitwarden.ui.platform.components.util.rememberVectorPainter import com.bitwarden.ui.platform.resource.BitwardenDrawable -import com.x8bit.bitwarden.R +import com.bitwarden.ui.platform.resource.BitwardenString import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenMasterPasswordDialog import com.x8bit.bitwarden.ui.platform.components.header.BitwardenListHeaderText import com.x8bit.bitwarden.ui.platform.components.listitem.BitwardenGroupItem @@ -77,7 +77,7 @@ fun VaultContent( if (state.totpItemsCount > 0) { item { BitwardenListHeaderText( - label = stringResource(id = R.string.totp), + label = stringResource(id = BitwardenString.totp), supportingLabel = TOTP_TYPES_COUNT.toString(), modifier = Modifier .fillMaxWidth() @@ -90,7 +90,7 @@ fun VaultContent( item { BitwardenGroupItem( startIcon = rememberVectorPainter(id = BitwardenDrawable.ic_clock), - label = stringResource(id = R.string.verification_codes), + label = stringResource(id = BitwardenString.verification_codes), supportingLabel = state.totpItemsCount.toString(), onClick = vaultHandlers.verificationCodesClick, showDivider = false, @@ -107,7 +107,7 @@ fun VaultContent( if (state.favoriteItems.isNotEmpty()) { item { BitwardenListHeaderText( - label = stringResource(id = R.string.favorites), + label = stringResource(id = BitwardenString.favorites), supportingLabel = state.favoriteItems.count().toString(), modifier = Modifier .fillMaxWidth() @@ -157,7 +157,7 @@ fun VaultContent( item { BitwardenListHeaderText( - label = stringResource(id = R.string.types), + label = stringResource(id = BitwardenString.types), supportingLabel = state.itemTypesCount.toString(), modifier = Modifier .fillMaxWidth() @@ -171,7 +171,7 @@ fun VaultContent( BitwardenGroupItem( startIcon = rememberVectorPainter(id = BitwardenDrawable.ic_globe), startIconTestTag = "LoginCipherIcon", - label = stringResource(id = R.string.type_login), + label = stringResource(id = BitwardenString.type_login), supportingLabel = state.loginItemsCount.toString(), onClick = vaultHandlers.loginGroupClick, showDivider = false, @@ -188,7 +188,7 @@ fun VaultContent( BitwardenGroupItem( startIcon = rememberVectorPainter(id = BitwardenDrawable.ic_payment_card), startIconTestTag = "CardCipherIcon", - label = stringResource(id = R.string.type_card), + label = stringResource(id = BitwardenString.type_card), supportingLabel = state.cardItemsCount.toString(), onClick = vaultHandlers.cardGroupClick, showDivider = false, @@ -205,7 +205,7 @@ fun VaultContent( BitwardenGroupItem( startIcon = rememberVectorPainter(id = BitwardenDrawable.ic_id_card), startIconTestTag = "IdentityCipherIcon", - label = stringResource(id = R.string.type_identity), + label = stringResource(id = BitwardenString.type_identity), supportingLabel = state.identityItemsCount.toString(), onClick = vaultHandlers.identityGroupClick, showDivider = false, @@ -221,7 +221,7 @@ fun VaultContent( BitwardenGroupItem( startIcon = rememberVectorPainter(id = BitwardenDrawable.ic_note), startIconTestTag = "SecureNoteCipherIcon", - label = stringResource(id = R.string.type_secure_note), + label = stringResource(id = BitwardenString.type_secure_note), supportingLabel = state.secureNoteItemsCount.toString(), onClick = vaultHandlers.secureNoteGroupClick, showDivider = false, @@ -237,7 +237,7 @@ fun VaultContent( BitwardenGroupItem( startIcon = rememberVectorPainter(id = BitwardenDrawable.ic_ssh_key), startIconTestTag = "SshKeyCipherIcon", - label = stringResource(id = R.string.type_ssh_key), + label = stringResource(id = BitwardenString.type_ssh_key), supportingLabel = state.sshKeyItemsCount.toString(), onClick = vaultHandlers.sshKeyGroupClick, showDivider = false, @@ -256,7 +256,7 @@ fun VaultContent( if (state.folderItems.isNotEmpty()) { item { BitwardenListHeaderText( - label = stringResource(id = R.string.folders), + label = stringResource(id = BitwardenString.folders), supportingLabel = state.folderItems.count().toString(), modifier = Modifier .fillMaxWidth() @@ -290,7 +290,7 @@ fun VaultContent( if (state.noFolderItems.isNotEmpty()) { item { BitwardenListHeaderText( - label = stringResource(id = R.string.folder_none), + label = stringResource(id = BitwardenString.folder_none), supportingLabel = state.noFolderItems.count().toString(), modifier = Modifier .fillMaxWidth() @@ -340,7 +340,7 @@ fun VaultContent( if (state.collectionItems.isNotEmpty()) { item { BitwardenListHeaderText( - label = stringResource(id = R.string.collections), + label = stringResource(id = BitwardenString.collections), supportingLabel = state.collectionItems.count().toString(), modifier = Modifier .fillMaxWidth() @@ -373,7 +373,7 @@ fun VaultContent( item { BitwardenListHeaderText( - label = stringResource(id = R.string.trash), + label = stringResource(id = BitwardenString.trash), supportingLabel = TRASH_TYPES_COUNT.toString(), modifier = Modifier .fillMaxWidth() @@ -386,7 +386,7 @@ fun VaultContent( item { BitwardenGroupItem( startIcon = rememberVectorPainter(id = BitwardenDrawable.ic_trash), - label = stringResource(id = R.string.trash), + label = stringResource(id = BitwardenString.trash), supportingLabel = state.trashItemsCount.toString(), onClick = vaultHandlers.trashClick, showDivider = false, diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/vault/VaultFilter.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/vault/VaultFilter.kt index 3c3eb083f1..0939d2dbe2 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/vault/VaultFilter.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/vault/VaultFilter.kt @@ -28,8 +28,8 @@ import com.bitwarden.ui.platform.base.util.scrolledContainerBackground import com.bitwarden.ui.platform.base.util.scrolledContainerBottomDivider import com.bitwarden.ui.platform.components.button.BitwardenStandardIconButton import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenSelectionDialog import com.x8bit.bitwarden.ui.platform.components.dialog.row.BitwardenSelectionRow import com.x8bit.bitwarden.ui.vault.feature.vault.model.VaultFilterType @@ -63,7 +63,7 @@ fun VaultFilter( if (shouldShowSelectionDialog) { BitwardenSelectionDialog( - title = stringResource(id = R.string.filter_by_vault), + title = stringResource(id = BitwardenString.filter_by_vault), onDismissRequest = { shouldShowSelectionDialog = false }, ) { vaultFilterTypes.forEach { filterType -> @@ -91,7 +91,7 @@ fun VaultFilter( ) { Text( text = stringResource( - id = R.string.vault_filter_description, + id = BitwardenString.vault_filter_description, selectedVaultFilterType.name(), ), style = BitwardenTheme.typography.bodyLarge, @@ -105,7 +105,7 @@ fun VaultFilter( BitwardenStandardIconButton( vectorIconRes = BitwardenDrawable.ic_ellipsis_horizontal, - contentDescription = stringResource(id = R.string.filter_by_vault), + contentDescription = stringResource(id = BitwardenString.filter_by_vault), onClick = { shouldShowSelectionDialog = true }, modifier = Modifier.testTag(tag = "OpenOrgFilter"), ) diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/vault/VaultNoItems.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/vault/VaultNoItems.kt index b7f2e6a910..4913330b9b 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/vault/VaultNoItems.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/vault/VaultNoItems.kt @@ -24,8 +24,8 @@ import com.bitwarden.ui.platform.base.util.standardHorizontalMargin import com.bitwarden.ui.platform.components.button.BitwardenFilledButton import com.bitwarden.ui.platform.components.util.rememberVectorPainter import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.platform.components.card.BitwardenInfoCalloutCard /** @@ -47,7 +47,7 @@ fun VaultNoItems( ) { if (policyDisablesSend) { BitwardenInfoCalloutCard( - text = stringResource(id = R.string.send_disabled_warning), + text = stringResource(id = BitwardenString.send_disabled_warning), modifier = Modifier .standardHorizontalMargin() .fillMaxWidth(), @@ -113,11 +113,11 @@ private fun VaultNoItems_preview() { ) { VaultNoItems( vectorRes = BitwardenDrawable.img_vault_items, - headerText = stringResource(id = R.string.save_and_protect_your_data), + headerText = stringResource(id = BitwardenString.save_and_protect_your_data), message = stringResource( - R.string.the_vault_protects_more_than_just_passwords, + BitwardenString.the_vault_protects_more_than_just_passwords, ), - buttonText = stringResource(R.string.new_login), + buttonText = stringResource(BitwardenString.new_login), addItemClickAction = {}, policyDisablesSend = false, ) @@ -135,9 +135,9 @@ private fun VaultNoItemsPolicyDisabled_preview() { ) { VaultNoItems( message = stringResource( - R.string.the_vault_protects_more_than_just_passwords, + BitwardenString.the_vault_protects_more_than_just_passwords, ), - buttonText = stringResource(R.string.new_login), + buttonText = stringResource(BitwardenString.new_login), addItemClickAction = {}, policyDisablesSend = true, ) diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/vault/VaultScreen.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/vault/VaultScreen.kt index 8eb45f7b8d..4027aa2103 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/vault/VaultScreen.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/vault/VaultScreen.kt @@ -38,7 +38,7 @@ import com.bitwarden.ui.platform.components.fab.BitwardenFloatingActionButton import com.bitwarden.ui.platform.components.model.TopAppBarDividerStyle import com.bitwarden.ui.platform.components.util.rememberVectorPainter import com.bitwarden.ui.platform.resource.BitwardenDrawable -import com.x8bit.bitwarden.R +import com.bitwarden.ui.platform.resource.BitwardenString import com.x8bit.bitwarden.ui.platform.components.account.BitwardenAccountActionItem import com.x8bit.bitwarden.ui.platform.components.account.BitwardenAccountSwitcher import com.x8bit.bitwarden.ui.platform.components.card.BitwardenActionCard @@ -216,10 +216,10 @@ private fun VaultScreenScaffold( // Static dialogs if (shouldShowExitConfirmationDialog) { BitwardenTwoButtonDialog( - title = stringResource(id = R.string.exit), - message = stringResource(id = R.string.exit_confirmation), - confirmButtonText = stringResource(id = R.string.yes), - dismissButtonText = stringResource(id = R.string.cancel), + title = stringResource(id = BitwardenString.exit), + message = stringResource(id = BitwardenString.exit_confirmation), + confirmButtonText = stringResource(id = BitwardenString.yes), + dismissButtonText = stringResource(id = BitwardenString.cancel), onConfirmClick = { shouldShowExitConfirmationDialog = false vaultHandlers.exitConfirmationAction() @@ -247,22 +247,22 @@ private fun VaultScreenScaffold( }, ) BitwardenSearchActionItem( - contentDescription = stringResource(id = R.string.search_vault), + contentDescription = stringResource(id = BitwardenString.search_vault), onClick = vaultHandlers.searchIconClickAction, ) BitwardenOverflowActionItem( - contentDescription = stringResource(R.string.more), + contentDescription = stringResource(BitwardenString.more), menuItemDataList = persistentListOf( OverflowMenuItemData( - text = stringResource(id = R.string.sync), + text = stringResource(id = BitwardenString.sync), onClick = vaultHandlers.syncAction, ), OverflowMenuItemData( - text = stringResource(id = R.string.lock), + text = stringResource(id = BitwardenString.lock), onClick = vaultHandlers.lockAction, ), OverflowMenuItemData( - text = stringResource(id = R.string.exit), + text = stringResource(id = BitwardenString.exit), onClick = { shouldShowExitConfirmationDialog = true }, ), ), @@ -316,7 +316,7 @@ private fun VaultScreenScaffold( BitwardenFloatingActionButton( onClick = vaultHandlers.selectAddItemTypeClickAction, painter = rememberVectorPainter(id = BitwardenDrawable.ic_plus_large), - contentDescription = stringResource(id = R.string.add_item), + contentDescription = stringResource(id = BitwardenString.add_item), modifier = Modifier.testTag(tag = "AddItemButton"), ) } @@ -358,11 +358,11 @@ private fun VaultScreenScaffold( label = "VaultNoItemsActionCard", ) { BitwardenActionCard( - cardTitle = stringResource(R.string.import_saved_logins), + cardTitle = stringResource(BitwardenString.import_saved_logins), cardSubtitle = stringResource( - R.string.use_a_computer_to_import_logins, + BitwardenString.use_a_computer_to_import_logins, ), - actionText = stringResource(R.string.get_started), + actionText = stringResource(BitwardenString.get_started), onActionClick = vaultHandlers.importActionCardClick, onDismissClick = vaultHandlers.dismissImportActionCard, modifier = Modifier @@ -373,11 +373,13 @@ private fun VaultScreenScaffold( } VaultNoItems( vectorRes = BitwardenDrawable.img_vault_items, - headerText = stringResource(id = R.string.save_and_protect_your_data), - message = stringResource( - R.string.the_vault_protects_more_than_just_passwords, + headerText = stringResource( + id = BitwardenString.save_and_protect_your_data, ), - buttonText = stringResource(R.string.new_login), + message = stringResource( + BitwardenString.the_vault_protects_more_than_just_passwords, + ), + buttonText = stringResource(BitwardenString.new_login), policyDisablesSend = false, addItemClickAction = { vaultHandlers.addItemClickAction(CreateVaultItemType.LOGIN) @@ -403,7 +405,7 @@ private fun VaultDialogs( ) { when (dialogState) { is VaultState.DialogState.Syncing -> BitwardenLoadingDialog( - text = stringResource(id = R.string.syncing), + text = stringResource(id = BitwardenString.syncing), ) is VaultState.DialogState.Error -> BitwardenBasicDialog( diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/vault/VaultViewModel.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/vault/VaultViewModel.kt index ba34202c2b..7f10b68883 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/vault/VaultViewModel.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/vault/VaultViewModel.kt @@ -12,12 +12,12 @@ import com.bitwarden.ui.platform.base.BaseViewModel import com.bitwarden.ui.platform.base.util.hexToColor import com.bitwarden.ui.platform.components.icon.model.IconData import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText import com.bitwarden.ui.util.concat import com.bitwarden.vault.CipherView import com.bitwarden.vault.DecryptCipherListResult -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.auth.repository.AuthRepository import com.x8bit.bitwarden.data.auth.repository.model.LogoutReason import com.x8bit.bitwarden.data.auth.repository.model.SwitchAccountResult @@ -431,8 +431,8 @@ class VaultViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialog = VaultState.DialogState.Error( - R.string.internet_connection_required_title.asText(), - R.string.internet_connection_required_message.asText(), + BitwardenString.internet_connection_required_title.asText(), + BitwardenString.internet_connection_required_message.asText(), ), ) } @@ -582,7 +582,7 @@ class VaultViewModel @Inject constructor( getCipherForCopyOrNull(action.cipherId)?.let { clipboardManager.setText( text = it.notes.orEmpty(), - toastDescriptorOverride = R.string.notes.asText(), + toastDescriptorOverride = BitwardenString.notes.asText(), ) } } @@ -595,7 +595,7 @@ class VaultViewModel @Inject constructor( getCipherForCopyOrNull(cipherId = action.cipherId)?.let { clipboardManager.setText( text = it.card?.number.orEmpty(), - toastDescriptorOverride = R.string.number.asText(), + toastDescriptorOverride = BitwardenString.number.asText(), ) } } @@ -608,7 +608,7 @@ class VaultViewModel @Inject constructor( getCipherForCopyOrNull(cipherId = action.cipherId)?.let { clipboardManager.setText( text = it.login?.password.orEmpty(), - toastDescriptorOverride = R.string.password.asText(), + toastDescriptorOverride = BitwardenString.password.asText(), ) organizationEventManager.trackEvent( event = OrganizationEvent.CipherClientCopiedPassword( @@ -626,7 +626,7 @@ class VaultViewModel @Inject constructor( getCipherForCopyOrNull(cipherId = action.cipherId)?.let { clipboardManager.setText( text = it.card?.code.orEmpty(), - toastDescriptorOverride = R.string.security_code.asText(), + toastDescriptorOverride = BitwardenString.security_code.asText(), ) organizationEventManager.trackEvent( event = OrganizationEvent.CipherClientCopiedCardCode( @@ -651,7 +651,7 @@ class VaultViewModel @Inject constructor( ) { clipboardManager.setText( text = action.username, - toastDescriptorOverride = R.string.username.asText(), + toastDescriptorOverride = BitwardenString.username.asText(), ) } @@ -748,8 +748,8 @@ class VaultViewModel @Inject constructor( it.copy( isRefreshing = false, dialog = VaultState.DialogState.Error( - R.string.internet_connection_required_title.asText(), - R.string.internet_connection_required_message.asText(), + BitwardenString.internet_connection_required_title.asText(), + BitwardenString.internet_connection_required_message.asText(), ), ) } @@ -775,7 +775,7 @@ class VaultViewModel @Inject constructor( is GenerateTotpResult.Success -> { clipboardManager.setText( text = result.code, - toastDescriptorOverride = R.string.totp.asText(), + toastDescriptorOverride = BitwardenString.totp.asText(), ) } } @@ -857,8 +857,8 @@ class VaultViewModel @Inject constructor( isIconLoadingDisabled = state.isIconLoadingDisabled, isPremium = state.isPremium, hasMasterPassword = state.hasMasterPassword, - errorTitle = R.string.an_error_has_occurred.asText(), - errorMessage = R.string.generic_error_message.asText(), + errorTitle = BitwardenString.an_error_has_occurred.asText(), + errorMessage = BitwardenString.generic_error_message.asText(), isRefreshing = false, restrictItemTypesPolicyOrgIds = state.restrictItemTypesPolicyOrgIds, ) @@ -866,7 +866,7 @@ class VaultViewModel @Inject constructor( private fun vaultLoadedReceive(vaultData: DataState.Loaded) { if (state.dialog == VaultState.DialogState.Syncing) { - sendEvent(VaultEvent.ShowSnackbar(message = R.string.syncing_complete.asText())) + sendEvent(VaultEvent.ShowSnackbar(message = BitwardenString.syncing_complete.asText())) } updateVaultState(vaultData.data) } @@ -935,8 +935,8 @@ class VaultViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialog = VaultState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.generic_error_message.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.generic_error_message.asText(), error = result.error, ), ) @@ -948,8 +948,8 @@ class VaultViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialog = VaultState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.invalid_master_password.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.invalid_master_password.asText(), ), ) } @@ -969,8 +969,8 @@ class VaultViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialog = VaultState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.generic_error_message.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.generic_error_message.asText(), error = result.error, ), ) @@ -984,8 +984,8 @@ class VaultViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialog = VaultState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.invalid_master_password.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.invalid_master_password.asText(), ), ) } @@ -1000,8 +1000,8 @@ class VaultViewModel @Inject constructor( Timber.e("Cipher not found while copying number") sendAction( VaultAction.Internal.DecryptionErrorReceive( - title = R.string.an_error_has_occurred.asText(), - message = R.string.generic_error_message.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.generic_error_message.asText(), error = null, ), ) @@ -1012,8 +1012,8 @@ class VaultViewModel @Inject constructor( Timber.e(result.error, "Failed to decrypt cipher while copying number.") sendAction( VaultAction.Internal.DecryptionErrorReceive( - title = R.string.decryption_error.asText(), - message = R.string.failed_to_decrypt_cipher_contact_support.asText(), + title = BitwardenString.decryption_error.asText(), + message = BitwardenString.failed_to_decrypt_cipher_contact_support.asText(), error = result.error, ), ) diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/vault/model/VaultFilterType.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/vault/model/VaultFilterType.kt index d1c762b4af..202f1e874c 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/vault/model/VaultFilterType.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/vault/model/VaultFilterType.kt @@ -1,9 +1,9 @@ package com.x8bit.bitwarden.ui.vault.feature.vault.model import android.os.Parcelable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import kotlinx.parcelize.Parcelize /** @@ -26,8 +26,8 @@ sealed class VaultFilterType : Parcelable { */ @Parcelize data object AllVaults : VaultFilterType() { - override val name: Text get() = R.string.all.asText() - override val description: Text get() = R.string.all_vaults.asText() + override val name: Text get() = BitwardenString.all.asText() + override val description: Text get() = BitwardenString.all_vaults.asText() } /** @@ -35,8 +35,8 @@ sealed class VaultFilterType : Parcelable { */ @Parcelize data object MyVault : VaultFilterType() { - override val name: Text get() = R.string.my_vault.asText() - override val description: Text get() = R.string.my_vault.asText() + override val name: Text get() = BitwardenString.my_vault.asText() + override val description: Text get() = BitwardenString.my_vault.asText() } /** diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/vault/util/AccountSummaryExtensions.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/vault/util/AccountSummaryExtensions.kt index 299945e20a..07f1731be1 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/vault/util/AccountSummaryExtensions.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/vault/util/AccountSummaryExtensions.kt @@ -3,7 +3,7 @@ package com.x8bit.bitwarden.ui.vault.feature.vault.util import androidx.annotation.DrawableRes import androidx.annotation.StringRes import com.bitwarden.ui.platform.resource.BitwardenDrawable -import com.x8bit.bitwarden.R +import com.bitwarden.ui.platform.resource.BitwardenString import com.x8bit.bitwarden.ui.platform.components.model.AccountSummary import java.util.Locale @@ -61,7 +61,7 @@ val AccountSummary.iconTestTag: String val AccountSummary.supportingTextResOrNull: Int? get() = when (this.status) { AccountSummary.Status.ACTIVE -> null - AccountSummary.Status.LOCKED -> R.string.account_locked - AccountSummary.Status.LOGGED_OUT -> R.string.account_logged_out - AccountSummary.Status.UNLOCKED -> R.string.account_unlocked + AccountSummary.Status.LOCKED -> BitwardenString.account_locked + AccountSummary.Status.LOGGED_OUT -> BitwardenString.account_logged_out + AccountSummary.Status.UNLOCKED -> BitwardenString.account_unlocked } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/vault/util/FlightRecorderDataSetExtensions.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/vault/util/FlightRecorderDataSetExtensions.kt index 3bb2a5c5c6..93478e934e 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/vault/util/FlightRecorderDataSetExtensions.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/vault/util/FlightRecorderDataSetExtensions.kt @@ -2,8 +2,8 @@ package com.x8bit.bitwarden.ui.vault.feature.vault.util import com.bitwarden.core.data.util.toFormattedDateStyle import com.bitwarden.core.data.util.toFormattedTimeStyle +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.platform.datasource.disk.model.FlightRecorderDataSet import com.x8bit.bitwarden.ui.platform.components.snackbar.BitwardenSnackbarData import java.time.Clock @@ -22,12 +22,12 @@ fun FlightRecorderDataSet.toSnackbarData( ?.let { Instant.ofEpochMilli(it.startTimeMs + it.durationMs) } ?: return null return BitwardenSnackbarData( - message = R.string.flight_recorder_banner_message.asText( + message = BitwardenString.flight_recorder_banner_message.asText( expirationTime.toFormattedDateStyle(dateStyle = FormatStyle.SHORT, clock = clock), expirationTime.toFormattedTimeStyle(timeStyle = FormatStyle.SHORT, clock = clock), ), - messageHeader = R.string.flight_recorder_banner_title.asText(), - actionLabel = R.string.go_to_settings.asText(), + messageHeader = BitwardenString.flight_recorder_banner_title.asText(), + actionLabel = BitwardenString.go_to_settings.asText(), withDismissAction = true, ) } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/vault/util/VaultDataExtensions.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/vault/util/VaultDataExtensions.kt index 41fb5973b2..f3ae92769e 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/vault/util/VaultDataExtensions.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/vault/util/VaultDataExtensions.kt @@ -3,6 +3,7 @@ package com.x8bit.bitwarden.ui.vault.feature.vault.util import android.net.Uri import com.bitwarden.ui.platform.components.icon.model.IconData import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.asText import com.bitwarden.vault.CipherListView import com.bitwarden.vault.CipherListViewType @@ -11,7 +12,6 @@ import com.bitwarden.vault.CipherType import com.bitwarden.vault.CollectionView import com.bitwarden.vault.FolderView import com.bitwarden.vault.LoginUriView -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.autofill.util.card import com.x8bit.bitwarden.data.autofill.util.login import com.x8bit.bitwarden.data.vault.repository.model.VaultData @@ -121,7 +121,7 @@ fun VaultData.toViewState( folderItems.plus( VaultState.ViewState.FolderItem( id = null, - name = R.string.folder_none.asText(), + name = BitwardenString.folder_none.asText(), itemCount = noFolderItems.size, ), ) diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/vault/util/VaultFilterDataExtensions.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/vault/util/VaultFilterDataExtensions.kt index ce67ed7900..ebd4b95343 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/vault/util/VaultFilterDataExtensions.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/vault/util/VaultFilterDataExtensions.kt @@ -1,8 +1,8 @@ package com.x8bit.bitwarden.ui.vault.feature.vault.util +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.vault.feature.vault.model.VaultFilterData /** @@ -10,8 +10,8 @@ import com.x8bit.bitwarden.ui.vault.feature.vault.model.VaultFilterData */ fun VaultFilterData?.toAppBarTitle(): Text = if (this != null) { - R.string.vaults + BitwardenString.vaults } else { - R.string.my_vault + BitwardenString.my_vault } .asText() diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/verificationcode/VerificationCodeItem.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/verificationcode/VerificationCodeItem.kt index 6498400344..d8791214ba 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/verificationcode/VerificationCodeItem.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/verificationcode/VerificationCodeItem.kt @@ -21,8 +21,8 @@ import com.bitwarden.ui.platform.components.icon.BitwardenIcon import com.bitwarden.ui.platform.components.icon.model.IconData import com.bitwarden.ui.platform.components.model.CardStyle import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.platform.theme.BitwardenTheme -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.platform.components.indicator.BitwardenCircularCountdownIndicator /** @@ -115,7 +115,7 @@ fun VaultVerificationCodeItem( BitwardenStandardIconButton( vectorIconRes = BitwardenDrawable.ic_copy, - contentDescription = stringResource(id = R.string.copy), + contentDescription = stringResource(id = BitwardenString.copy), onClick = onCopyClick, contentColor = BitwardenTheme.colorScheme.icon.primary, ) diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/verificationcode/VerificationCodeScreen.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/verificationcode/VerificationCodeScreen.kt index 7a2e21e117..a20f861886 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/verificationcode/VerificationCodeScreen.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/verificationcode/VerificationCodeScreen.kt @@ -31,7 +31,7 @@ import com.bitwarden.ui.platform.components.appbar.action.BitwardenSearchActionI import com.bitwarden.ui.platform.components.appbar.model.OverflowMenuItemData import com.bitwarden.ui.platform.components.util.rememberVectorPainter import com.bitwarden.ui.platform.resource.BitwardenDrawable -import com.x8bit.bitwarden.R +import com.bitwarden.ui.platform.resource.BitwardenString import com.x8bit.bitwarden.data.platform.manager.model.AppResumeScreenData import com.x8bit.bitwarden.data.platform.manager.util.AppResumeStateManager import com.x8bit.bitwarden.data.platform.manager.util.RegisterScreenDataOnLifecycleEffect @@ -108,25 +108,25 @@ fun VerificationCodeScreen( .nestedScroll(scrollBehavior.nestedScrollConnection), topBar = { BitwardenTopAppBar( - title = stringResource(id = R.string.verification_codes), + title = stringResource(id = BitwardenString.verification_codes), scrollBehavior = scrollBehavior, navigationIcon = rememberVectorPainter(id = BitwardenDrawable.ic_back), - navigationIconContentDescription = stringResource(id = R.string.back), + navigationIconContentDescription = stringResource(id = BitwardenString.back), onNavigationIconClick = verificationCodeHandler.backClick, actions = { BitwardenSearchActionItem( - contentDescription = stringResource(id = R.string.search_vault), + contentDescription = stringResource(id = BitwardenString.search_vault), onClick = verificationCodeHandler.searchIconClick, ) BitwardenOverflowActionItem( - contentDescription = stringResource(R.string.more), + contentDescription = stringResource(BitwardenString.more), menuItemDataList = persistentListOf( OverflowMenuItemData( - text = stringResource(id = R.string.sync), + text = stringResource(id = BitwardenString.sync), onClick = verificationCodeHandler.syncClick, ), OverflowMenuItemData( - text = stringResource(id = R.string.lock), + text = stringResource(id = BitwardenString.lock), onClick = verificationCodeHandler.lockClick, ), ), @@ -212,7 +212,7 @@ private fun VerificationCodeContent( item { Spacer(modifier = Modifier.height(height = 12.dp)) BitwardenListHeaderText( - label = stringResource(id = R.string.items), + label = stringResource(id = BitwardenString.items), supportingLabel = items.size.toString(), modifier = Modifier .fillMaxWidth() diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/verificationcode/VerificationCodeViewModel.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/verificationcode/VerificationCodeViewModel.kt index dcf4335192..3c4c338c89 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/verificationcode/VerificationCodeViewModel.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/verificationcode/VerificationCodeViewModel.kt @@ -8,10 +8,10 @@ import com.bitwarden.data.repository.util.baseIconUrl import com.bitwarden.ui.platform.base.BaseViewModel import com.bitwarden.ui.platform.components.icon.model.IconData import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText import com.bitwarden.ui.util.concat -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.auth.repository.AuthRepository import com.x8bit.bitwarden.data.auth.repository.model.UserState import com.x8bit.bitwarden.data.auth.repository.model.ValidatePasswordResult @@ -120,7 +120,7 @@ class VerificationCodeViewModel @Inject constructor( private fun handleCopyClick(action: VerificationCodeAction.CopyClick) { clipboardManager.setText( text = action.text, - toastDescriptorOverride = R.string.verification_code_totp.asText(), + toastDescriptorOverride = BitwardenString.verification_code_totp.asText(), ) } @@ -171,7 +171,7 @@ class VerificationCodeViewModel @Inject constructor( mutableStateFlow.update { it.copy( dialogState = VerificationCodeState.DialogState.Loading( - message = R.string.syncing.asText(), + message = BitwardenString.syncing.asText(), ), ) } @@ -207,7 +207,7 @@ class VerificationCodeViewModel @Inject constructor( it.copy( dialogState = VerificationCodeState.DialogState.Error( title = null, - message = R.string.generic_error_message.asText(), + message = BitwardenString.generic_error_message.asText(), throwable = result.error, ), ) @@ -222,7 +222,7 @@ class VerificationCodeViewModel @Inject constructor( it.copy( dialogState = VerificationCodeState.DialogState.Error( title = null, - message = R.string.invalid_master_password.asText(), + message = BitwardenString.invalid_master_password.asText(), ), ) } @@ -288,11 +288,11 @@ class VerificationCodeViewModel @Inject constructor( mutableStateFlow.update { currentState -> currentState.copy( viewState = VerificationCodeState.ViewState.Error( - message = R.string.internet_connection_required_title + message = BitwardenString.internet_connection_required_title .asText() .concat( " ".asText(), - R.string.internet_connection_required_message.asText(), + BitwardenString.internet_connection_required_message.asText(), ), ), dialogState = null, @@ -328,7 +328,7 @@ class VerificationCodeViewModel @Inject constructor( mutableStateFlow.update { it.copy( viewState = VerificationCodeState.ViewState.Error( - message = R.string.generic_error_message.asText(), + message = BitwardenString.generic_error_message.asText(), ), dialogState = null, ) diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/model/VaultCardExpirationMonth.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/model/VaultCardExpirationMonth.kt index a1678fd78b..c2986cfdb0 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/model/VaultCardExpirationMonth.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/model/VaultCardExpirationMonth.kt @@ -1,10 +1,10 @@ package com.x8bit.bitwarden.ui.vault.model import androidx.annotation.StringRes +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText import com.bitwarden.ui.util.concat -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.vault.feature.addedit.util.SELECT_TEXT /** @@ -19,51 +19,51 @@ enum class VaultCardExpirationMonth( number = "0", ), JANUARY( - value = R.string.january.dateText("01 - "), + value = BitwardenString.january.dateText("01 - "), number = "1", ), FEBRUARY( - value = R.string.february.dateText("02 - "), + value = BitwardenString.february.dateText("02 - "), number = "2", ), MARCH( - value = R.string.march.dateText("03 - "), + value = BitwardenString.march.dateText("03 - "), number = "3", ), APRIL( - value = R.string.april.dateText("04 - "), + value = BitwardenString.april.dateText("04 - "), number = "4", ), MAY( - value = R.string.may.dateText("05 - "), + value = BitwardenString.may.dateText("05 - "), number = "5", ), JUNE( - value = R.string.june.dateText("06 - "), + value = BitwardenString.june.dateText("06 - "), number = "6", ), JULY( - value = R.string.july.dateText("07 - "), + value = BitwardenString.july.dateText("07 - "), number = "7", ), AUGUST( - value = R.string.august.dateText("08 - "), + value = BitwardenString.august.dateText("08 - "), number = "8", ), SEPTEMBER( - value = R.string.september.dateText("09 - "), + value = BitwardenString.september.dateText("09 - "), number = "9", ), OCTOBER( - value = R.string.october.dateText("10 - "), + value = BitwardenString.october.dateText("10 - "), number = "10", ), NOVEMBER( - value = R.string.november.dateText("11 - "), + value = BitwardenString.november.dateText("11 - "), number = "11", ), DECEMBER( - value = R.string.december.dateText("12 - "), + value = BitwardenString.december.dateText("12 - "), number = "12", ), } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/model/VaultIdentityTitle.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/model/VaultIdentityTitle.kt index f323817666..0c2ca2fa26 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/model/VaultIdentityTitle.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/model/VaultIdentityTitle.kt @@ -1,8 +1,8 @@ package com.x8bit.bitwarden.ui.vault.model +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.vault.feature.addedit.util.SELECT_TEXT /** @@ -10,9 +10,9 @@ import com.x8bit.bitwarden.ui.vault.feature.addedit.util.SELECT_TEXT */ enum class VaultIdentityTitle(val value: Text) { SELECT(value = SELECT_TEXT), - MR(value = R.string.mr.asText()), - MRS(value = R.string.mrs.asText()), - MS(value = R.string.ms.asText()), - MX(value = R.string.mx.asText()), - DR(value = R.string.dr.asText()), + MR(value = BitwardenString.mr.asText()), + MRS(value = BitwardenString.mrs.asText()), + MS(value = BitwardenString.ms.asText()), + MX(value = BitwardenString.mx.asText()), + DR(value = BitwardenString.dr.asText()), } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/model/VaultLinkedFieldType.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/model/VaultLinkedFieldType.kt index d52cd1bcad..4faad4d948 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/model/VaultLinkedFieldType.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/model/VaultLinkedFieldType.kt @@ -1,8 +1,8 @@ package com.x8bit.bitwarden.ui.vault.model +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R /** * Represents the types for linked fields. @@ -14,35 +14,35 @@ enum class VaultLinkedFieldType( val id: UInt, val label: Text, ) { - USERNAME(id = 100.toUInt(), label = R.string.username.asText()), - PASSWORD(id = 101.toUInt(), label = R.string.password.asText()), + USERNAME(id = 100.toUInt(), label = BitwardenString.username.asText()), + PASSWORD(id = 101.toUInt(), label = BitwardenString.password.asText()), - CARDHOLDER_NAME(id = 300.toUInt(), label = R.string.cardholder_name.asText()), - EXPIRATION_MONTH(id = 301.toUInt(), label = R.string.expiration_month.asText()), - EXPIRATION_YEAR(id = 302.toUInt(), label = R.string.expiration_year.asText()), - SECURITY_CODE(id = 303.toUInt(), label = R.string.security_code.asText()), - BRAND(id = 304.toUInt(), label = R.string.brand.asText()), - NUMBER(id = 305.toUInt(), label = R.string.number.asText()), + CARDHOLDER_NAME(id = 300.toUInt(), label = BitwardenString.cardholder_name.asText()), + EXPIRATION_MONTH(id = 301.toUInt(), label = BitwardenString.expiration_month.asText()), + EXPIRATION_YEAR(id = 302.toUInt(), label = BitwardenString.expiration_year.asText()), + SECURITY_CODE(id = 303.toUInt(), label = BitwardenString.security_code.asText()), + BRAND(id = 304.toUInt(), label = BitwardenString.brand.asText()), + NUMBER(id = 305.toUInt(), label = BitwardenString.number.asText()), - TITLE(id = 400.toUInt(), label = R.string.title.asText()), - MIDDLE_NAME(id = 401.toUInt(), label = R.string.middle_name.asText()), - ADDRESS_1(id = 402.toUInt(), label = R.string.address1.asText()), - ADDRESS_2(id = 403.toUInt(), label = R.string.address2.asText()), - ADDRESS_3(id = 404.toUInt(), label = R.string.address3.asText()), - CITY(id = 405.toUInt(), label = R.string.city_town.asText()), - STATE(id = 406.toUInt(), label = R.string.state_province.asText()), - POSTAL_CODE(id = 407.toUInt(), label = R.string.zip_postal_code.asText()), - COUNTRY(id = 408.toUInt(), label = R.string.country.asText()), - COMPANY(id = 409.toUInt(), label = R.string.company.asText()), - EMAIL(id = 410.toUInt(), label = R.string.email.asText()), - PHONE(id = 411.toUInt(), label = R.string.phone.asText()), - SSN(id = 412.toUInt(), label = R.string.ssn.asText()), - IDENTITY_USERNAME(id = 413.toUInt(), label = R.string.username.asText()), - PASSPORT_NUMBER(id = 414.toUInt(), label = R.string.passport_number.asText()), - LICENSE_NUMBER(id = 415.toUInt(), label = R.string.license_number.asText()), - FIRST_NAME(id = 416.toUInt(), label = R.string.first_name.asText()), - LAST_NAME(id = 417.toUInt(), label = R.string.last_name.asText()), - FULL_NAME(id = 418.toUInt(), label = R.string.full_name.asText()), + TITLE(id = 400.toUInt(), label = BitwardenString.title.asText()), + MIDDLE_NAME(id = 401.toUInt(), label = BitwardenString.middle_name.asText()), + ADDRESS_1(id = 402.toUInt(), label = BitwardenString.address1.asText()), + ADDRESS_2(id = 403.toUInt(), label = BitwardenString.address2.asText()), + ADDRESS_3(id = 404.toUInt(), label = BitwardenString.address3.asText()), + CITY(id = 405.toUInt(), label = BitwardenString.city_town.asText()), + STATE(id = 406.toUInt(), label = BitwardenString.state_province.asText()), + POSTAL_CODE(id = 407.toUInt(), label = BitwardenString.zip_postal_code.asText()), + COUNTRY(id = 408.toUInt(), label = BitwardenString.country.asText()), + COMPANY(id = 409.toUInt(), label = BitwardenString.company.asText()), + EMAIL(id = 410.toUInt(), label = BitwardenString.email.asText()), + PHONE(id = 411.toUInt(), label = BitwardenString.phone.asText()), + SSN(id = 412.toUInt(), label = BitwardenString.ssn.asText()), + IDENTITY_USERNAME(id = 413.toUInt(), label = BitwardenString.username.asText()), + PASSPORT_NUMBER(id = 414.toUInt(), label = BitwardenString.passport_number.asText()), + LICENSE_NUMBER(id = 415.toUInt(), label = BitwardenString.license_number.asText()), + FIRST_NAME(id = 416.toUInt(), label = BitwardenString.first_name.asText()), + LAST_NAME(id = 417.toUInt(), label = BitwardenString.last_name.asText()), + FULL_NAME(id = 418.toUInt(), label = BitwardenString.full_name.asText()), ; @Suppress("UndocumentedPublicClass") diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/model/VaultTrailingIcon.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/model/VaultTrailingIcon.kt index 31061b6470..46f847da1b 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/model/VaultTrailingIcon.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/model/VaultTrailingIcon.kt @@ -2,9 +2,9 @@ package com.x8bit.bitwarden.ui.vault.model import androidx.annotation.DrawableRes import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R /** * Represents the icons displayed after the cipher name. @@ -16,12 +16,12 @@ enum class VaultTrailingIcon( ) { COLLECTION( iconRes = BitwardenDrawable.ic_collections, - contentDescription = R.string.collections.asText(), + contentDescription = BitwardenString.collections.asText(), testTag = "CipherInCollectionIcon", ), ATTACHMENT( iconRes = BitwardenDrawable.ic_paperclip, - contentDescription = R.string.attachments.asText(), + contentDescription = BitwardenString.attachments.asText(), testTag = "CipherWithAttachmentsIcon", ), } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/util/VaultCardBrandExtensions.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/util/VaultCardBrandExtensions.kt index 1d934927df..bea4a6f812 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/util/VaultCardBrandExtensions.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/util/VaultCardBrandExtensions.kt @@ -1,8 +1,8 @@ package com.x8bit.bitwarden.ui.vault.util +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.vault.feature.addedit.util.SELECT_TEXT import com.x8bit.bitwarden.ui.vault.model.VaultCardBrand @@ -21,7 +21,7 @@ val VaultCardBrand.longName: Text VaultCardBrand.MAESTRO -> "Maestro".asText() VaultCardBrand.UNIONPAY -> "UnionPay".asText() VaultCardBrand.RUPAY -> "RuPay".asText() - VaultCardBrand.OTHER -> R.string.other.asText() + VaultCardBrand.OTHER -> BitwardenString.other.asText() } /** @@ -39,7 +39,7 @@ val VaultCardBrand.shortName: Text VaultCardBrand.MAESTRO -> "Maestro".asText() VaultCardBrand.UNIONPAY -> "UnionPay".asText() VaultCardBrand.RUPAY -> "RuPay".asText() - VaultCardBrand.OTHER -> R.string.other.asText() + VaultCardBrand.OTHER -> BitwardenString.other.asText() } /** diff --git a/app/src/standard/kotlin/com/x8bit/bitwarden/ui/platform/manager/review/AppReviewManagerImpl.kt b/app/src/standard/kotlin/com/x8bit/bitwarden/ui/platform/manager/review/AppReviewManagerImpl.kt index 084007b234..a79ef0f978 100644 --- a/app/src/standard/kotlin/com/x8bit/bitwarden/ui/platform/manager/review/AppReviewManagerImpl.kt +++ b/app/src/standard/kotlin/com/x8bit/bitwarden/ui/platform/manager/review/AppReviewManagerImpl.kt @@ -3,9 +3,9 @@ package com.x8bit.bitwarden.ui.platform.manager.review import android.app.Activity import android.widget.Toast import com.bitwarden.annotation.OmitFromCoverage +import com.bitwarden.ui.platform.resource.BitwardenString import com.google.android.play.core.review.ReviewManagerFactory import com.x8bit.bitwarden.BuildConfig -import com.x8bit.bitwarden.R import timber.log.Timber /** @@ -30,7 +30,7 @@ class AppReviewManagerImpl( Toast .makeText( activity, - activity.getString(R.string.review_flow_launched), + activity.getString(BitwardenString.review_flow_launched), Toast.LENGTH_SHORT, ) .show() diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/MainViewModelTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/MainViewModelTest.kt index 7c6e44394d..ed4d34e4aa 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/MainViewModelTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/MainViewModelTest.kt @@ -13,6 +13,7 @@ import com.bitwarden.data.datasource.disk.base.FakeDispatcherManager import com.bitwarden.data.repository.model.Environment import com.bitwarden.ui.platform.base.BaseViewModelTest import com.bitwarden.ui.platform.feature.settings.appearance.model.AppTheme +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.asText import com.bitwarden.vault.CipherView import com.x8bit.bitwarden.data.auth.datasource.disk.model.OnboardingStatus @@ -598,7 +599,10 @@ class MainViewModelTest : BaseViewModelTest() { viewModel.trySendAction(MainAction.ReceiveFirstIntent(intent = mockIntent)) assertEquals( - MainEvent.ShowToast(R.string.there_was_an_issue_validating_the_registration_token.asText()), + MainEvent.ShowToast( + BitwardenString.there_was_an_issue_validating_the_registration_token + .asText(), + ), awaitItem(), ) } diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/data/auth/manager/UserLogoutManagerTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/data/auth/manager/UserLogoutManagerTest.kt index 06cba18a16..87732e2bb6 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/data/auth/manager/UserLogoutManagerTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/data/auth/manager/UserLogoutManagerTest.kt @@ -4,7 +4,7 @@ import com.bitwarden.core.data.manager.toast.ToastManager import com.bitwarden.data.datasource.disk.base.FakeDispatcherManager import com.bitwarden.network.model.KdfTypeJson import com.bitwarden.ui.platform.base.MainDispatcherExtension -import com.x8bit.bitwarden.R +import com.bitwarden.ui.platform.resource.BitwardenString import com.x8bit.bitwarden.data.auth.datasource.disk.AuthDiskSource import com.x8bit.bitwarden.data.auth.datasource.disk.model.AccountJson import com.x8bit.bitwarden.data.auth.datasource.disk.model.AccountTokensJson @@ -95,7 +95,7 @@ class UserLogoutManagerTest { verify { authDiskSource.userState = SINGLE_USER_STATE_2 - toastManager.show(messageId = R.string.account_switched_automatically) + toastManager.show(messageId = BitwardenString.account_switched_automatically) } assertDataCleared(userId = userId) } @@ -145,7 +145,7 @@ class UserLogoutManagerTest { userId = userId, vaultTimeoutAction = vaultTimeoutAction, ) - toastManager.show(messageId = R.string.account_switched_automatically) + toastManager.show(messageId = BitwardenString.account_switched_automatically) settingsDiskSource.storeVaultTimeoutInMinutes( userId = userId, vaultTimeoutInMinutes = vaultTimeoutInMinutes, @@ -187,7 +187,7 @@ class UserLogoutManagerTest { activeUserId = USER_ID_2, accounts = MULTI_USER_STATE.accounts, ) - toastManager.show(messageId = R.string.account_switched_automatically) + toastManager.show(messageId = BitwardenString.account_switched_automatically) settingsDiskSource.storeVaultTimeoutInMinutes( userId = userId, vaultTimeoutInMinutes = vaultTimeoutInMinutes, @@ -230,7 +230,7 @@ class UserLogoutManagerTest { activeUserId = USER_ID_2, accounts = MULTI_USER_STATE.accounts, ) - toastManager.show(messageId = R.string.login_expired) + toastManager.show(messageId = BitwardenString.login_expired) settingsDiskSource.storeVaultTimeoutInMinutes( userId = userId, vaultTimeoutInMinutes = vaultTimeoutInMinutes, diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/data/autofill/accessibility/processor/BitwardenAccessibilityProcessorTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/data/autofill/accessibility/processor/BitwardenAccessibilityProcessorTest.kt index 075a047e27..77ae781206 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/data/autofill/accessibility/processor/BitwardenAccessibilityProcessorTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/data/autofill/accessibility/processor/BitwardenAccessibilityProcessorTest.kt @@ -7,9 +7,9 @@ import android.view.accessibility.AccessibilityEvent import android.view.accessibility.AccessibilityNodeInfo import android.widget.Toast import com.bitwarden.core.data.manager.toast.ToastManager +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.vault.CipherView import com.bitwarden.vault.LoginView -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.autofill.accessibility.manager.AccessibilityAutofillManager import com.x8bit.bitwarden.data.autofill.accessibility.manager.LauncherPackageNameManager import com.x8bit.bitwarden.data.autofill.accessibility.model.AccessibilityAction @@ -251,7 +251,7 @@ class BitwardenAccessibilityProcessorTest { accessibilityAutofillManager.accessibilityAction = null accessibilityParser.parseForUriOrPackageName(rootNode = node) toastManager.show( - messageId = R.string.autofill_tile_uri_not_found, + messageId = BitwardenString.autofill_tile_uri_not_found, duration = Toast.LENGTH_LONG, ) } @@ -305,7 +305,7 @@ class BitwardenAccessibilityProcessorTest { accessibilityParser.parseForUriOrPackageName(rootNode = node) accessibilityParser.parseForFillableFields(rootNode = node, uri = uri) toastManager.show( - messageId = R.string.autofill_tile_uri_not_found, + messageId = BitwardenString.autofill_tile_uri_not_found, duration = Toast.LENGTH_LONG, ) } diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/data/autofill/manager/AutofillTotpManagerTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/data/autofill/manager/AutofillTotpManagerTest.kt index 30a3ad8719..d4daf16210 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/data/autofill/manager/AutofillTotpManagerTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/data/autofill/manager/AutofillTotpManagerTest.kt @@ -1,10 +1,10 @@ package com.x8bit.bitwarden.data.autofill.manager +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText import com.bitwarden.vault.CipherView import com.bitwarden.vault.LoginView -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.auth.repository.AuthRepository import com.x8bit.bitwarden.data.auth.repository.model.UserState import com.x8bit.bitwarden.data.platform.manager.clipboard.BitwardenClipboardManager @@ -136,7 +136,7 @@ class AutofillTotpManagerTest { verify(exactly = 1) { clipboardManager.setText( text = TOTP_RESULT_VALUE, - toastDescriptorOverride = R.string.verification_code_totp.asText(), + toastDescriptorOverride = BitwardenString.verification_code_totp.asText(), ) settingsRepository.isAutoCopyTotpDisabled } diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/accountsetup/SetupUnlockViewModelTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/accountsetup/SetupUnlockViewModelTest.kt index d01450b2c1..5203204c32 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/accountsetup/SetupUnlockViewModelTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/accountsetup/SetupUnlockViewModelTest.kt @@ -4,8 +4,8 @@ import androidx.lifecycle.SavedStateHandle import app.cash.turbine.test import com.bitwarden.data.repository.model.Environment import com.bitwarden.ui.platform.base.BaseViewModelTest +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.auth.datasource.disk.model.OnboardingStatus import com.x8bit.bitwarden.data.auth.repository.AuthRepository import com.x8bit.bitwarden.data.auth.repository.model.UserState @@ -194,7 +194,7 @@ class SetupUnlockViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialogState = SetupUnlockState.DialogState.Loading( - title = R.string.saving.asText(), + title = BitwardenString.saving.asText(), ), isUnlockWithBiometricsEnabled = true, ), @@ -230,7 +230,7 @@ class SetupUnlockViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialogState = SetupUnlockState.DialogState.Loading( - title = R.string.saving.asText(), + title = BitwardenString.saving.asText(), ), isUnlockWithBiometricsEnabled = true, ), @@ -348,8 +348,8 @@ class SetupUnlockViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialogState = SetupUnlockState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.generic_error_message.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.generic_error_message.asText(), ), ), viewModel.stateFlow.value, diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/completeregistration/CompleteRegistrationTestUtil.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/completeregistration/CompleteRegistrationTestUtil.kt index 2a7cadf4f7..5b27ddf04f 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/completeregistration/CompleteRegistrationTestUtil.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/completeregistration/CompleteRegistrationTestUtil.kt @@ -1,15 +1,16 @@ package com.x8bit.bitwarden.ui.auth.feature.completeregistration +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R /** * Creates a mock [CompleteRegistrationDialog.HaveIBeenPwned]. */ fun createHaveIBeenPwned( - title: Text = R.string.weak_and_exposed_master_password.asText(), - message: Text = R.string.weak_password_identified_and_found_in_a_data_breach_alert_description + title: Text = BitwardenString.weak_and_exposed_master_password.asText(), + message: Text = BitwardenString + .weak_password_identified_and_found_in_a_data_breach_alert_description .asText(), ): CompleteRegistrationDialog.HaveIBeenPwned = CompleteRegistrationDialog.HaveIBeenPwned( diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/completeregistration/CompleteRegistrationViewModelTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/completeregistration/CompleteRegistrationViewModelTest.kt index 874c6cdc0a..8cf1efa223 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/completeregistration/CompleteRegistrationViewModelTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/completeregistration/CompleteRegistrationViewModelTest.kt @@ -5,8 +5,8 @@ import app.cash.turbine.test import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow import com.bitwarden.data.datasource.disk.base.FakeDispatcherManager import com.bitwarden.ui.platform.base.BaseViewModelTest +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.auth.datasource.disk.model.OnboardingStatus import com.x8bit.bitwarden.data.auth.datasource.sdk.model.PasswordStrength.LEVEL_0 import com.x8bit.bitwarden.data.auth.datasource.sdk.model.PasswordStrength.LEVEL_1 @@ -167,7 +167,9 @@ class CompleteRegistrationViewModelTest : BaseViewModelTest() { stateFlow.awaitItem(), ) assertEquals( - CompleteRegistrationEvent.ShowToast(R.string.account_created_success.asText()), + CompleteRegistrationEvent.ShowToast( + BitwardenString.account_created_success.asText(), + ), eventFlow.awaitItem(), ) // Make sure loading dialog is hidden: @@ -200,7 +202,7 @@ class CompleteRegistrationViewModelTest : BaseViewModelTest() { assertEquals( VALID_INPUT_STATE.copy( dialog = CompleteRegistrationDialog.Error( - title = R.string.an_error_has_occurred.asText(), + title = BitwardenString.an_error_has_occurred.asText(), message = "mock_error".asText(), error = error, ), @@ -317,8 +319,9 @@ class CompleteRegistrationViewModelTest : BaseViewModelTest() { assertEquals( initialState.copy( dialog = createHaveIBeenPwned( - title = R.string.exposed_master_password.asText(), - message = R.string.password_found_in_a_data_breach_alert_description + title = BitwardenString.exposed_master_password.asText(), + message = BitwardenString + .password_found_in_a_data_breach_alert_description .asText(), ), ), @@ -388,8 +391,8 @@ class CompleteRegistrationViewModelTest : BaseViewModelTest() { assertEquals( initialState.copy( dialog = createHaveIBeenPwned( - title = R.string.weak_master_password.asText(), - message = R.string.weak_password_identified_use_a_strong_password_to_protect_your_account.asText(), + title = BitwardenString.weak_master_password.asText(), + message = BitwardenString.weak_password_identified_use_a_strong_password_to_protect_your_account.asText(), ), ), awaitItem(), @@ -419,7 +422,7 @@ class CompleteRegistrationViewModelTest : BaseViewModelTest() { ) viewModel.eventFlow.test { assertEquals( - CompleteRegistrationEvent.ShowToast(R.string.email_verified.asText()), + CompleteRegistrationEvent.ShowToast(BitwardenString.email_verified.asText()), awaitItem(), ) } @@ -600,8 +603,8 @@ class CompleteRegistrationViewModelTest : BaseViewModelTest() { val expectedState = DEFAULT_STATE.copy( passwordInput = input, dialog = CompleteRegistrationDialog.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.master_password_length_val_message_x.asText(12), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.master_password_length_val_message_x.asText(12), ), ) viewModel.trySendAction(CompleteRegistrationAction.CallToActionClick) @@ -622,8 +625,8 @@ class CompleteRegistrationViewModelTest : BaseViewModelTest() { userEmail = EMAIL, passwordInput = PASSWORD, dialog = CompleteRegistrationDialog.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.master_password_confirmation_val_message.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.master_password_confirmation_val_message.asText(), ), ) viewModel.trySendAction(CompleteRegistrationAction.CallToActionClick) @@ -645,9 +648,9 @@ class CompleteRegistrationViewModelTest : BaseViewModelTest() { userEmail = "", passwordInput = PASSWORD, dialog = CompleteRegistrationDialog.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.validation_field_required.asText( - R.string.email_address.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.validation_field_required.asText( + BitwardenString.email_address.asText(), ), ), ) diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/createaccount/CreateAccountTestUtil.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/createaccount/CreateAccountTestUtil.kt index 49cfe95863..04e4331bb8 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/createaccount/CreateAccountTestUtil.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/createaccount/CreateAccountTestUtil.kt @@ -1,15 +1,16 @@ package com.x8bit.bitwarden.ui.auth.feature.createaccount +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R /** * Creates a mock [CreateAccountDialog.HaveIBeenPwned]. */ fun createHaveIBeenPwned( - title: Text = R.string.weak_and_exposed_master_password.asText(), - message: Text = R.string.weak_password_identified_and_found_in_a_data_breach_alert_description + title: Text = BitwardenString.weak_and_exposed_master_password.asText(), + message: Text = BitwardenString + .weak_password_identified_and_found_in_a_data_breach_alert_description .asText(), ): CreateAccountDialog.HaveIBeenPwned = CreateAccountDialog.HaveIBeenPwned( diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/createaccount/CreateAccountViewModelTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/createaccount/CreateAccountViewModelTest.kt index 3a6aa3019a..62387afe21 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/createaccount/CreateAccountViewModelTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/createaccount/CreateAccountViewModelTest.kt @@ -4,8 +4,8 @@ import android.net.Uri import androidx.lifecycle.SavedStateHandle import app.cash.turbine.test import com.bitwarden.ui.platform.base.BaseViewModelTest +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.auth.datasource.sdk.model.PasswordStrength.LEVEL_0 import com.x8bit.bitwarden.data.auth.datasource.sdk.model.PasswordStrength.LEVEL_1 import com.x8bit.bitwarden.data.auth.datasource.sdk.model.PasswordStrength.LEVEL_2 @@ -100,8 +100,8 @@ class CreateAccountViewModelTest : BaseViewModelTest() { val expectedState = DEFAULT_STATE.copy( emailInput = input, dialog = CreateAccountDialog.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.invalid_email.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.invalid_email.asText(), ), ) viewModel.trySendAction(CreateAccountAction.SubmitClick) @@ -121,9 +121,9 @@ class CreateAccountViewModelTest : BaseViewModelTest() { val expectedState = DEFAULT_STATE.copy( emailInput = input, dialog = CreateAccountDialog.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.validation_field_required - .asText(R.string.email_address.asText()), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.validation_field_required + .asText(BitwardenString.email_address.asText()), ), ) viewModel.trySendAction(CreateAccountAction.SubmitClick) @@ -148,8 +148,8 @@ class CreateAccountViewModelTest : BaseViewModelTest() { emailInput = EMAIL, passwordInput = input, dialog = CreateAccountDialog.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.master_password_length_val_message_x.asText(12), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.master_password_length_val_message_x.asText(12), ), ) viewModel.trySendAction(CreateAccountAction.SubmitClick) @@ -174,8 +174,8 @@ class CreateAccountViewModelTest : BaseViewModelTest() { emailInput = "test@test.com", passwordInput = input, dialog = CreateAccountDialog.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.master_password_confirmation_val_message.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.master_password_confirmation_val_message.asText(), ), ) viewModel.trySendAction(CreateAccountAction.SubmitClick) @@ -202,8 +202,8 @@ class CreateAccountViewModelTest : BaseViewModelTest() { passwordInput = password, confirmPasswordInput = password, dialog = CreateAccountDialog.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.accept_policies_error.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.accept_policies_error.asText(), ), ) viewModel.trySendAction(CreateAccountAction.SubmitClick) @@ -280,7 +280,7 @@ class CreateAccountViewModelTest : BaseViewModelTest() { assertEquals( VALID_INPUT_STATE.copy( dialog = CreateAccountDialog.Error( - title = R.string.an_error_has_occurred.asText(), + title = BitwardenString.an_error_has_occurred.asText(), message = "mock_error".asText(), error = error, ), @@ -414,8 +414,9 @@ class CreateAccountViewModelTest : BaseViewModelTest() { assertEquals( initialState.copy( dialog = createHaveIBeenPwned( - title = R.string.exposed_master_password.asText(), - message = R.string.password_found_in_a_data_breach_alert_description + title = BitwardenString.exposed_master_password.asText(), + message = BitwardenString + .password_found_in_a_data_breach_alert_description .asText(), ), ), @@ -484,8 +485,8 @@ class CreateAccountViewModelTest : BaseViewModelTest() { assertEquals( initialState.copy( dialog = createHaveIBeenPwned( - title = R.string.weak_master_password.asText(), - message = R.string.weak_password_identified_use_a_strong_password_to_protect_your_account.asText(), + title = BitwardenString.weak_master_password.asText(), + message = BitwardenString.weak_password_identified_use_a_strong_password_to_protect_your_account.asText(), ), ), awaitItem(), diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/enterprisesignon/EnterpriseSignOnViewModelTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/enterprisesignon/EnterpriseSignOnViewModelTest.kt index 8d7fd3bcc4..f8488200ad 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/enterprisesignon/EnterpriseSignOnViewModelTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/enterprisesignon/EnterpriseSignOnViewModelTest.kt @@ -8,8 +8,8 @@ import com.bitwarden.data.datasource.disk.model.EnvironmentUrlDataJson import com.bitwarden.data.repository.model.Environment import com.bitwarden.network.model.VerifiedOrganizationDomainSsoDetailsResponse import com.bitwarden.ui.platform.base.BaseViewModelTest +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.auth.repository.AuthRepository import com.x8bit.bitwarden.data.auth.repository.model.LoginResult import com.x8bit.bitwarden.data.auth.repository.model.PrevalidateSsoResult @@ -135,7 +135,7 @@ class EnterpriseSignOnViewModelTest : BaseViewModelTest() { assertEquals( state.copy( dialogState = EnterpriseSignOnState.DialogState.Loading( - R.string.logging_in.asText(), + BitwardenString.logging_in.asText(), ), ), awaitItem(), @@ -144,8 +144,8 @@ class EnterpriseSignOnViewModelTest : BaseViewModelTest() { assertEquals( state.copy( dialogState = EnterpriseSignOnState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.login_sso_error.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.login_sso_error.asText(), error = error, ), ), @@ -184,7 +184,7 @@ class EnterpriseSignOnViewModelTest : BaseViewModelTest() { assertEquals( state.copy( dialogState = EnterpriseSignOnState.DialogState.Loading( - R.string.logging_in.asText(), + BitwardenString.logging_in.asText(), ), ), awaitItem(), @@ -211,9 +211,9 @@ class EnterpriseSignOnViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialogState = EnterpriseSignOnState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.validation_field_required.asText( - R.string.org_identifier.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.validation_field_required.asText( + BitwardenString.org_identifier.asText(), ), ), ), @@ -229,8 +229,8 @@ class EnterpriseSignOnViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialogState = EnterpriseSignOnState.DialogState.Error( - title = R.string.internet_connection_required_title.asText(), - message = R.string.internet_connection_required_message.asText(), + title = BitwardenString.internet_connection_required_title.asText(), + message = BitwardenString.internet_connection_required_message.asText(), ), ), viewModel.stateFlow.value, @@ -258,8 +258,8 @@ class EnterpriseSignOnViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialogState = EnterpriseSignOnState.DialogState.Error( - title = R.string.internet_connection_required_title.asText(), - message = R.string.internet_connection_required_message.asText(), + title = BitwardenString.internet_connection_required_title.asText(), + message = BitwardenString.internet_connection_required_message.asText(), ), ), awaitItem(), @@ -284,7 +284,9 @@ class EnterpriseSignOnViewModelTest : BaseViewModelTest() { ) assertEquals( DEFAULT_STATE.copy( - dialogState = EnterpriseSignOnState.DialogState.Loading(R.string.loading.asText()), + dialogState = EnterpriseSignOnState.DialogState.Loading( + BitwardenString.loading.asText(), + ), ), viewModel.stateFlow.value, ) @@ -306,8 +308,8 @@ class EnterpriseSignOnViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialogState = EnterpriseSignOnState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.login_sso_error.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.login_sso_error.asText(), ), ), viewModel.stateFlow.value, @@ -324,8 +326,8 @@ class EnterpriseSignOnViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialogState = EnterpriseSignOnState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.login_sso_error.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.login_sso_error.asText(), ), ), viewModel.stateFlow.value, @@ -369,7 +371,7 @@ class EnterpriseSignOnViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialogState = EnterpriseSignOnState.DialogState.Loading( - R.string.logging_in.asText(), + BitwardenString.logging_in.asText(), ), orgIdentifierInput = orgIdentifier, ), @@ -379,8 +381,8 @@ class EnterpriseSignOnViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialogState = EnterpriseSignOnState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.login_sso_error.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.login_sso_error.asText(), error = error, ), orgIdentifierInput = orgIdentifier, @@ -437,7 +439,7 @@ class EnterpriseSignOnViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialogState = EnterpriseSignOnState.DialogState.Loading( - R.string.logging_in.asText(), + BitwardenString.logging_in.asText(), ), orgIdentifierInput = orgIdentifier, ), @@ -447,7 +449,7 @@ class EnterpriseSignOnViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialogState = EnterpriseSignOnState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), + title = BitwardenString.an_error_has_occurred.asText(), message = "new device verification required".asText(), ), orgIdentifierInput = orgIdentifier, @@ -511,7 +513,7 @@ class EnterpriseSignOnViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialogState = EnterpriseSignOnState.DialogState.Loading( - R.string.logging_in.asText(), + BitwardenString.logging_in.asText(), ), orgIdentifierInput = orgIdentifier, ), @@ -521,8 +523,8 @@ class EnterpriseSignOnViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialogState = EnterpriseSignOnState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.this_account_will_soon_be_deleted_log_in_at_x_to_continue_using_bitwarden + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.this_account_will_soon_be_deleted_log_in_at_x_to_continue_using_bitwarden .asText("vault.bitwarden.com"), ), orgIdentifierInput = orgIdentifier, @@ -586,7 +588,7 @@ class EnterpriseSignOnViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialogState = EnterpriseSignOnState.DialogState.Loading( - R.string.logging_in.asText(), + BitwardenString.logging_in.asText(), ), orgIdentifierInput = orgIdentifier, ), @@ -596,8 +598,8 @@ class EnterpriseSignOnViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialogState = EnterpriseSignOnState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.this_account_will_soon_be_deleted_log_in_at_x_to_continue_using_bitwarden + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.this_account_will_soon_be_deleted_log_in_at_x_to_continue_using_bitwarden .asText("base.bitwarden.com"), ), orgIdentifierInput = orgIdentifier, @@ -661,7 +663,7 @@ class EnterpriseSignOnViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialogState = EnterpriseSignOnState.DialogState.Loading( - R.string.logging_in.asText(), + BitwardenString.logging_in.asText(), ), orgIdentifierInput = orgIdentifier, ), @@ -671,8 +673,8 @@ class EnterpriseSignOnViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialogState = EnterpriseSignOnState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.this_account_will_soon_be_deleted_log_in_at_x_to_continue_using_bitwarden + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.this_account_will_soon_be_deleted_log_in_at_x_to_continue_using_bitwarden .asText("vault.bitwarden.com"), ), orgIdentifierInput = orgIdentifier, @@ -729,7 +731,7 @@ class EnterpriseSignOnViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialogState = EnterpriseSignOnState.DialogState.Loading( - R.string.logging_in.asText(), + BitwardenString.logging_in.asText(), ), orgIdentifierInput = orgIdentifier, ), @@ -739,8 +741,8 @@ class EnterpriseSignOnViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialogState = EnterpriseSignOnState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.we_couldnt_verify_the_servers_certificate.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.we_couldnt_verify_the_servers_certificate.asText(), ), orgIdentifierInput = orgIdentifier, ), @@ -789,7 +791,7 @@ class EnterpriseSignOnViewModelTest : BaseViewModelTest() { assertEquals( initialState.copy( dialogState = EnterpriseSignOnState.DialogState.Loading( - R.string.logging_in.asText(), + BitwardenString.logging_in.asText(), ), ), awaitItem(), @@ -846,7 +848,7 @@ class EnterpriseSignOnViewModelTest : BaseViewModelTest() { assertEquals( initialState.copy( dialogState = EnterpriseSignOnState.DialogState.Loading( - R.string.logging_in.asText(), + BitwardenString.logging_in.asText(), ), ), stateFlow.awaitItem(), @@ -900,7 +902,7 @@ class EnterpriseSignOnViewModelTest : BaseViewModelTest() { assertEquals( initialState.copy( dialogState = EnterpriseSignOnState.DialogState.Loading( - R.string.logging_in.asText(), + BitwardenString.logging_in.asText(), ), ), stateFlow.awaitItem(), @@ -964,7 +966,7 @@ class EnterpriseSignOnViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialogState = EnterpriseSignOnState.DialogState.Loading( - R.string.logging_in.asText(), + BitwardenString.logging_in.asText(), ), orgIdentifierInput = orgIdentifier, ), @@ -1005,8 +1007,8 @@ class EnterpriseSignOnViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialogState = EnterpriseSignOnState.DialogState.Error( - title = R.string.log_in_denied.asText(), - message = R.string.captcha_failed.asText(), + title = BitwardenString.log_in_denied.asText(), + message = BitwardenString.captcha_failed.asText(), ), ), awaitItem(), @@ -1044,7 +1046,7 @@ class EnterpriseSignOnViewModelTest : BaseViewModelTest() { initialState.copy( captchaToken = "token", dialogState = EnterpriseSignOnState.DialogState.Loading( - R.string.logging_in.asText(), + BitwardenString.logging_in.asText(), ), ), awaitItem(), @@ -1132,9 +1134,9 @@ class EnterpriseSignOnViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialogState = EnterpriseSignOnState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.validation_field_required.asText( - R.string.org_identifier.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.validation_field_required.asText( + BitwardenString.org_identifier.asText(), ), ), orgIdentifierInput = "", @@ -1176,7 +1178,7 @@ class EnterpriseSignOnViewModelTest : BaseViewModelTest() { DEFAULT_STATE.copy( orgIdentifierInput = "Bitwarden with SSO", dialogState = EnterpriseSignOnState.DialogState.Loading( - message = R.string.logging_in.asText(), + message = BitwardenString.logging_in.asText(), ), ), viewModel.stateFlow.value, @@ -1215,7 +1217,7 @@ class EnterpriseSignOnViewModelTest : BaseViewModelTest() { DEFAULT_STATE.copy( orgIdentifierInput = "Bitwarden with SSO", dialogState = EnterpriseSignOnState.DialogState.Loading( - message = R.string.logging_in.asText(), + message = BitwardenString.logging_in.asText(), ), ), viewModel.stateFlow.value, @@ -1306,7 +1308,7 @@ class EnterpriseSignOnViewModelTest : BaseViewModelTest() { assertEquals( initialState.copy( dialogState = EnterpriseSignOnState.DialogState.Loading( - R.string.logging_in.asText(), + BitwardenString.logging_in.asText(), ), ), awaitItem(), diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/environment/EnvironmentViewModelTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/environment/EnvironmentViewModelTest.kt index ea5d12f072..8719e5dd3e 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/environment/EnvironmentViewModelTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/environment/EnvironmentViewModelTest.kt @@ -7,8 +7,8 @@ import com.bitwarden.core.data.util.asSuccess import com.bitwarden.data.datasource.disk.model.EnvironmentUrlDataJson import com.bitwarden.data.repository.model.Environment import com.bitwarden.ui.platform.base.BaseViewModelTest +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.platform.datasource.disk.model.MutualTlsKeyHost import com.x8bit.bitwarden.data.platform.manager.CertificateManager import com.x8bit.bitwarden.data.platform.manager.model.ImportPrivateKeyResult @@ -146,7 +146,7 @@ class EnvironmentViewModelTest : BaseViewModelTest() { assertEquals( initialState.copy( dialog = EnvironmentState.DialogState.Error( - message = R.string.environment_page_urls_error.asText(), + message = BitwardenString.environment_page_urls_error.asText(), ), ), viewModel.stateFlow.value, @@ -219,7 +219,7 @@ class EnvironmentViewModelTest : BaseViewModelTest() { } verify(exactly = 1) { snackbarRelayManager.sendSnackbarData( - data = BitwardenSnackbarData(message = R.string.environment_saved.asText()), + data = BitwardenSnackbarData(message = BitwardenString.environment_saved.asText()), relay = SnackbarRelay.ENVIRONMENT_SAVED, ) } @@ -268,7 +268,7 @@ class EnvironmentViewModelTest : BaseViewModelTest() { } verify(exactly = 1) { snackbarRelayManager.sendSnackbarData( - data = BitwardenSnackbarData(message = R.string.environment_saved.asText()), + data = BitwardenSnackbarData(message = BitwardenString.environment_saved.asText()), relay = SnackbarRelay.ENVIRONMENT_SAVED, ) } @@ -379,7 +379,7 @@ class EnvironmentViewModelTest : BaseViewModelTest() { ) viewModel.eventFlow.test { assertEquals( - EnvironmentEvent.ShowSnackbar(R.string.error_loading_certificate.asText()), + EnvironmentEvent.ShowSnackbar(BitwardenString.error_loading_certificate.asText()), awaitItem(), ) } @@ -460,7 +460,7 @@ class EnvironmentViewModelTest : BaseViewModelTest() { ), ) assertEquals( - EnvironmentEvent.ShowSnackbar(R.string.certificate_installed.asText()), + EnvironmentEvent.ShowSnackbar(BitwardenString.certificate_installed.asText()), awaitItem(), ) @@ -470,7 +470,9 @@ class EnvironmentViewModelTest : BaseViewModelTest() { ), ) assertEquals( - EnvironmentEvent.ShowSnackbar(R.string.certificate_installation_failed.asText()), + EnvironmentEvent.ShowSnackbar( + BitwardenString.certificate_installation_failed.asText(), + ), awaitItem(), ) } @@ -531,7 +533,9 @@ class EnvironmentViewModelTest : BaseViewModelTest() { ), ) assertEquals( - EnvironmentEvent.ShowSnackbar(R.string.unsupported_certificate_type.asText()), + EnvironmentEvent.ShowSnackbar( + BitwardenString.unsupported_certificate_type.asText(), + ), awaitItem(), ) @@ -543,7 +547,9 @@ class EnvironmentViewModelTest : BaseViewModelTest() { ), ) assertEquals( - EnvironmentEvent.ShowSnackbar(R.string.certificate_installation_failed.asText()), + EnvironmentEvent.ShowSnackbar( + BitwardenString.certificate_installation_failed.asText(), + ), awaitItem(), ) @@ -555,7 +561,9 @@ class EnvironmentViewModelTest : BaseViewModelTest() { ), ) assertEquals( - EnvironmentEvent.ShowSnackbar(R.string.certificate_password_incorrect.asText()), + EnvironmentEvent.ShowSnackbar( + BitwardenString.certificate_password_incorrect.asText(), + ), awaitItem(), ) @@ -567,7 +575,7 @@ class EnvironmentViewModelTest : BaseViewModelTest() { ), ) assertEquals( - EnvironmentEvent.ShowSnackbar(R.string.invalid_certificate_chain.asText()), + EnvironmentEvent.ShowSnackbar(BitwardenString.invalid_certificate_chain.asText()), awaitItem(), ) } @@ -640,8 +648,8 @@ class EnvironmentViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialog = EnvironmentState.DialogState.ConfirmOverwriteAlias( - title = R.string.replace_existing_certificate.asText(), - message = R.string.a_certificate_with_the_alias_x_already_exists_do_you_want_to_replace_it + title = BitwardenString.replace_existing_certificate.asText(), + message = BitwardenString.a_certificate_with_the_alias_x_already_exists_do_you_want_to_replace_it .asText("mockAlias"), triggeringAction = action, ), @@ -668,8 +676,8 @@ class EnvironmentViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialog = EnvironmentState.DialogState.Error( - R.string.validation_field_required.asText( - R.string.password.asText(), + BitwardenString.validation_field_required.asText( + BitwardenString.password.asText(), ), ), ), @@ -686,8 +694,8 @@ class EnvironmentViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialog = EnvironmentState.DialogState.Error( - R.string.validation_field_required.asText( - R.string.alias.asText(), + BitwardenString.validation_field_required.asText( + BitwardenString.alias.asText(), ), ), ), @@ -720,7 +728,7 @@ class EnvironmentViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialog = EnvironmentState.DialogState.Error( - message = R.string.unable_to_read_certificate.asText(), + message = BitwardenString.unable_to_read_certificate.asText(), throwable = exception, ), ), @@ -783,7 +791,7 @@ class EnvironmentViewModelTest : BaseViewModelTest() { val exception = RuntimeException() viewModel.trySendAction( EnvironmentAction.Internal.ShowErrorDialog( - message = R.string.generic_error_message.asText(), + message = BitwardenString.generic_error_message.asText(), throwable = exception, ), ) @@ -791,7 +799,7 @@ class EnvironmentViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialog = EnvironmentState.DialogState.Error( - message = R.string.generic_error_message.asText(), + message = BitwardenString.generic_error_message.asText(), throwable = exception, ), ), diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/landing/LandingViewModelTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/landing/LandingViewModelTest.kt index a239bec8d2..faa1779d7c 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/landing/LandingViewModelTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/landing/LandingViewModelTest.kt @@ -5,8 +5,8 @@ import app.cash.turbine.test import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow import com.bitwarden.data.repository.model.Environment import com.bitwarden.ui.platform.base.BaseViewModelTest +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.auth.datasource.disk.model.OnboardingStatus import com.x8bit.bitwarden.data.auth.repository.AuthRepository import com.x8bit.bitwarden.data.auth.repository.model.LogoutReason @@ -213,7 +213,7 @@ class LandingViewModelTest : BaseViewModelTest() { assertEquals( initialState.copy( dialog = LandingState.DialogState.Error( - message = R.string.invalid_email.asText(), + message = BitwardenString.invalid_email.asText(), ), ), awaitItem(), diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/login/LoginViewModelTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/login/LoginViewModelTest.kt index cbe0988251..9985d33c53 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/login/LoginViewModelTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/login/LoginViewModelTest.kt @@ -7,8 +7,8 @@ import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow import com.bitwarden.data.datasource.disk.model.EnvironmentUrlDataJson import com.bitwarden.data.repository.model.Environment import com.bitwarden.ui.platform.base.BaseViewModelTest +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.auth.datasource.disk.model.OnboardingStatus import com.x8bit.bitwarden.data.auth.repository.AuthRepository import com.x8bit.bitwarden.data.auth.repository.model.KnownDeviceResult @@ -275,7 +275,7 @@ class LoginViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialogState = LoginState.DialogState.Loading( - message = R.string.logging_in.asText(), + message = BitwardenString.logging_in.asText(), ), ), awaitItem(), @@ -283,7 +283,7 @@ class LoginViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialogState = LoginState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), + title = BitwardenString.an_error_has_occurred.asText(), message = "mock_error".asText(), error = error, ), @@ -314,7 +314,7 @@ class LoginViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialogState = LoginState.DialogState.Loading( - message = R.string.logging_in.asText(), + message = BitwardenString.logging_in.asText(), ), ), awaitItem(), @@ -322,8 +322,8 @@ class LoginViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialogState = LoginState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.this_is_not_a_recognized_bitwarden_server_you_may_need_to_check_with_your_provider_or_update_your_server.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.this_is_not_a_recognized_bitwarden_server_you_may_need_to_check_with_your_provider_or_update_your_server.asText(), ), ), awaitItem(), @@ -360,7 +360,7 @@ class LoginViewModelTest : BaseViewModelTest() { defaultSelfHostedState.copy( environmentLabel = "", dialogState = LoginState.DialogState.Loading( - message = R.string.logging_in.asText(), + message = BitwardenString.logging_in.asText(), ), ), awaitItem(), @@ -369,8 +369,8 @@ class LoginViewModelTest : BaseViewModelTest() { defaultSelfHostedState.copy( environmentLabel = "", dialogState = LoginState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.this_account_will_soon_be_deleted_log_in_at_x_to_continue_using_bitwarden + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.this_account_will_soon_be_deleted_log_in_at_x_to_continue_using_bitwarden .asText("vault.bitwarden.com"), ), ), @@ -407,7 +407,7 @@ class LoginViewModelTest : BaseViewModelTest() { assertEquals( defaultSelfHostedState.copy( dialogState = LoginState.DialogState.Loading( - message = R.string.logging_in.asText(), + message = BitwardenString.logging_in.asText(), ), ), awaitItem(), @@ -415,8 +415,8 @@ class LoginViewModelTest : BaseViewModelTest() { assertEquals( defaultSelfHostedState.copy( dialogState = LoginState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.this_account_will_soon_be_deleted_log_in_at_x_to_continue_using_bitwarden + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.this_account_will_soon_be_deleted_log_in_at_x_to_continue_using_bitwarden .asText("base.bitwarden.com"), ), ), @@ -453,7 +453,7 @@ class LoginViewModelTest : BaseViewModelTest() { assertEquals( defaultSelfHostedState.copy( dialogState = LoginState.DialogState.Loading( - message = R.string.logging_in.asText(), + message = BitwardenString.logging_in.asText(), ), ), awaitItem(), @@ -461,8 +461,8 @@ class LoginViewModelTest : BaseViewModelTest() { assertEquals( defaultSelfHostedState.copy( dialogState = LoginState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.this_account_will_soon_be_deleted_log_in_at_x_to_continue_using_bitwarden + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.this_account_will_soon_be_deleted_log_in_at_x_to_continue_using_bitwarden .asText("vault.bitwarden.com"), ), ), @@ -492,7 +492,7 @@ class LoginViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialogState = LoginState.DialogState.Loading( - message = R.string.logging_in.asText(), + message = BitwardenString.logging_in.asText(), ), ), awaitItem(), @@ -500,8 +500,8 @@ class LoginViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialogState = LoginState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.we_couldnt_verify_the_servers_certificate.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.we_couldnt_verify_the_servers_certificate.asText(), ), ), awaitItem(), @@ -528,7 +528,7 @@ class LoginViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialogState = LoginState.DialogState.Loading( - message = R.string.logging_in.asText(), + message = BitwardenString.logging_in.asText(), ), ), awaitItem(), diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/loginwithdevice/LoginWithDeviceScreenTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/loginwithdevice/LoginWithDeviceScreenTest.kt index feb97c6ee3..d31f160772 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/loginwithdevice/LoginWithDeviceScreenTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/loginwithdevice/LoginWithDeviceScreenTest.kt @@ -11,10 +11,10 @@ import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.performClick import androidx.compose.ui.test.performScrollTo import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.asText import com.bitwarden.ui.util.assertNoDialogExists import com.bitwarden.ui.util.isProgressBar -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.auth.feature.loginwithdevice.model.LoginWithDeviceType import com.x8bit.bitwarden.ui.platform.base.BitwardenComposeTest import com.x8bit.bitwarden.ui.platform.manager.intent.IntentManager @@ -70,8 +70,8 @@ class LoginWithDeviceScreenTest : BitwardenComposeTest() { mutableStateFlow.update { it.copy( dialogState = LoginWithDeviceState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.generic_error_message.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.generic_error_message.asText(), ), ) } diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/loginwithdevice/LoginWithDeviceViewModelTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/loginwithdevice/LoginWithDeviceViewModelTest.kt index 90a7055179..3bb954a189 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/loginwithdevice/LoginWithDeviceViewModelTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/loginwithdevice/LoginWithDeviceViewModelTest.kt @@ -4,8 +4,8 @@ import androidx.lifecycle.SavedStateHandle import app.cash.turbine.test import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow import com.bitwarden.ui.platform.base.BaseViewModelTest +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.auth.manager.model.AuthRequest import com.x8bit.bitwarden.data.auth.manager.model.AuthRequestType import com.x8bit.bitwarden.data.auth.manager.model.CreateAuthRequestResult @@ -111,8 +111,8 @@ class LoginWithDeviceViewModelTest : BaseViewModelTest() { fun `DismissDialog should clear the dialog state`() { val initialState = DEFAULT_STATE.copy( dialogState = LoginWithDeviceState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.generic_error_message.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.generic_error_message.asText(), ), ) val viewModel = createViewModel(initialState) @@ -201,7 +201,7 @@ class LoginWithDeviceViewModelTest : BaseViewModelTest() { ), loginData = DEFAULT_LOGIN_DATA, dialogState = LoginWithDeviceState.DialogState.Loading( - message = R.string.logging_in.asText(), + message = BitwardenString.logging_in.asText(), ), ), awaitItem(), @@ -220,7 +220,7 @@ class LoginWithDeviceViewModelTest : BaseViewModelTest() { verify(exactly = 1) { snackbarRelayManager.sendSnackbarData( - data = BitwardenSnackbarData(message = R.string.login_approved.asText()), + data = BitwardenSnackbarData(message = BitwardenString.login_approved.asText()), relay = SnackbarRelay.LOGIN_SUCCESS, ) } @@ -271,7 +271,7 @@ class LoginWithDeviceViewModelTest : BaseViewModelTest() { fingerprintPhrase = "", ), dialogState = LoginWithDeviceState.DialogState.Loading( - message = R.string.logging_in.asText(), + message = BitwardenString.logging_in.asText(), ), loginData = DEFAULT_LOGIN_DATA, ), @@ -291,7 +291,7 @@ class LoginWithDeviceViewModelTest : BaseViewModelTest() { verify(exactly = 1) { snackbarRelayManager.sendSnackbarData( - data = BitwardenSnackbarData(message = R.string.login_approved.asText()), + data = BitwardenSnackbarData(message = BitwardenString.login_approved.asText()), relay = SnackbarRelay.LOGIN_SUCCESS, ) } @@ -379,7 +379,7 @@ class LoginWithDeviceViewModelTest : BaseViewModelTest() { ), loginData = DEFAULT_LOGIN_DATA, dialogState = LoginWithDeviceState.DialogState.Loading( - message = R.string.logging_in.asText(), + message = BitwardenString.logging_in.asText(), ), ), awaitItem(), @@ -390,8 +390,8 @@ class LoginWithDeviceViewModelTest : BaseViewModelTest() { fingerprintPhrase = "", ), dialogState = LoginWithDeviceState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.generic_error_message.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.generic_error_message.asText(), error = error, ), loginData = DEFAULT_LOGIN_DATA, @@ -447,7 +447,7 @@ class LoginWithDeviceViewModelTest : BaseViewModelTest() { ), loginData = DEFAULT_LOGIN_DATA, dialogState = LoginWithDeviceState.DialogState.Loading( - message = R.string.logging_in.asText(), + message = BitwardenString.logging_in.asText(), ), ), awaitItem(), @@ -458,8 +458,8 @@ class LoginWithDeviceViewModelTest : BaseViewModelTest() { fingerprintPhrase = "", ), dialogState = LoginWithDeviceState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.this_is_not_a_recognized_bitwarden_server_you_may_need_to_check_with_your_provider_or_update_your_server.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.this_is_not_a_recognized_bitwarden_server_you_may_need_to_check_with_your_provider_or_update_your_server.asText(), ), loginData = DEFAULT_LOGIN_DATA, ), @@ -514,7 +514,7 @@ class LoginWithDeviceViewModelTest : BaseViewModelTest() { ), loginData = DEFAULT_LOGIN_DATA, dialogState = LoginWithDeviceState.DialogState.Loading( - message = R.string.logging_in.asText(), + message = BitwardenString.logging_in.asText(), ), ), awaitItem(), @@ -525,8 +525,8 @@ class LoginWithDeviceViewModelTest : BaseViewModelTest() { fingerprintPhrase = "", ), dialogState = LoginWithDeviceState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.we_couldnt_verify_the_servers_certificate.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.we_couldnt_verify_the_servers_certificate.asText(), ), loginData = DEFAULT_LOGIN_DATA, ), @@ -581,7 +581,7 @@ class LoginWithDeviceViewModelTest : BaseViewModelTest() { ), loginData = DEFAULT_LOGIN_DATA, dialogState = LoginWithDeviceState.DialogState.Loading( - message = R.string.logging_in.asText(), + message = BitwardenString.logging_in.asText(), ), ), awaitItem(), @@ -592,7 +592,7 @@ class LoginWithDeviceViewModelTest : BaseViewModelTest() { fingerprintPhrase = "", ), dialogState = LoginWithDeviceState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), + title = BitwardenString.an_error_has_occurred.asText(), message = "new device verification required".asText(), ), loginData = DEFAULT_LOGIN_DATA, @@ -622,8 +622,8 @@ class LoginWithDeviceViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialogState = LoginWithDeviceState.DialogState.Error( - title = R.string.log_in_denied.asText(), - message = R.string.captcha_failed.asText(), + title = BitwardenString.log_in_denied.asText(), + message = BitwardenString.captcha_failed.asText(), ), ), viewModel.stateFlow.value, @@ -653,7 +653,7 @@ class LoginWithDeviceViewModelTest : BaseViewModelTest() { initialState.copy( loginData = DEFAULT_LOGIN_DATA.copy(captchaToken = captchaToken), dialogState = LoginWithDeviceState.DialogState.Loading( - message = R.string.logging_in.asText(), + message = BitwardenString.logging_in.asText(), ), ), awaitItem(), @@ -688,8 +688,8 @@ class LoginWithDeviceViewModelTest : BaseViewModelTest() { isResendNotificationLoading = false, ), dialogState = LoginWithDeviceState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.generic_error_message.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.generic_error_message.asText(), error = error, ), ), @@ -740,7 +740,7 @@ class LoginWithDeviceViewModelTest : BaseViewModelTest() { ), dialogState = LoginWithDeviceState.DialogState.Error( title = null, - message = R.string.login_request_has_already_expired.asText(), + message = BitwardenString.login_request_has_already_expired.asText(), ), ), viewModel.stateFlow.value, diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/masterpasswordgenerator/MasterPasswordGeneratorViewModelTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/masterpasswordgenerator/MasterPasswordGeneratorViewModelTest.kt index 3280558586..8cec4d1a35 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/masterpasswordgenerator/MasterPasswordGeneratorViewModelTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/masterpasswordgenerator/MasterPasswordGeneratorViewModelTest.kt @@ -4,8 +4,8 @@ import androidx.lifecycle.SavedStateHandle import app.cash.turbine.test import com.bitwarden.network.model.PolicyTypeJson import com.bitwarden.ui.platform.base.BaseViewModelTest +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.platform.manager.PolicyManager import com.x8bit.bitwarden.data.tools.generator.repository.model.GeneratedPassphraseResult import com.x8bit.bitwarden.data.tools.generator.repository.util.FakeGeneratorRepository @@ -97,7 +97,9 @@ class MasterPasswordGeneratorViewModelTest : BaseViewModelTest() { viewModel.eventFlow.test { viewModel.trySendAction(MasterPasswordGeneratorAction.GeneratePasswordClickAction) assertEquals( - MasterPasswordGeneratorEvent.ShowSnackbar(R.string.an_error_has_occurred.asText()), + MasterPasswordGeneratorEvent.ShowSnackbar( + BitwardenString.an_error_has_occurred.asText(), + ), awaitItem(), ) } diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/masterpasswordhint/MasterPasswordHintViewModelTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/masterpasswordhint/MasterPasswordHintViewModelTest.kt index 74bfa4c46a..7f02b9d60d 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/masterpasswordhint/MasterPasswordHintViewModelTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/masterpasswordhint/MasterPasswordHintViewModelTest.kt @@ -3,8 +3,8 @@ package com.x8bit.bitwarden.ui.auth.feature.masterpasswordhint import androidx.lifecycle.SavedStateHandle import app.cash.turbine.test import com.bitwarden.ui.platform.base.BaseViewModelTest +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.auth.repository.AuthRepository import com.x8bit.bitwarden.data.auth.repository.model.PasswordHintResult import com.x8bit.bitwarden.data.platform.manager.network.NetworkConnectionManager @@ -58,8 +58,8 @@ class MasterPasswordHintViewModelTest : BaseViewModelTest() { val expectedErrorState = MasterPasswordHintState( dialog = MasterPasswordHintState.DialogState.Error( - title = R.string.internet_connection_required_title.asText(), - message = R.string.internet_connection_required_message.asText(), + title = BitwardenString.internet_connection_required_title.asText(), + message = BitwardenString.internet_connection_required_message.asText(), ), emailInput = email, ) @@ -80,9 +80,9 @@ class MasterPasswordHintViewModelTest : BaseViewModelTest() { val expectedErrorState = MasterPasswordHintState( dialog = MasterPasswordHintState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.validation_field_required.asText( - R.string.email_address.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.validation_field_required.asText( + BitwardenString.email_address.asText(), ), ), emailInput = emptyEmail, @@ -104,8 +104,8 @@ class MasterPasswordHintViewModelTest : BaseViewModelTest() { val expectedErrorState = MasterPasswordHintState( dialog = MasterPasswordHintState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.invalid_email.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.invalid_email.asText(), ), emailInput = invalidEmail, ) diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/removepassword/RemovePasswordScreenTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/removepassword/RemovePasswordScreenTest.kt index 7c37cb0661..46ad9c5665 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/removepassword/RemovePasswordScreenTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/removepassword/RemovePasswordScreenTest.kt @@ -13,9 +13,9 @@ import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.performClick import androidx.compose.ui.test.performScrollTo import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.asText import com.bitwarden.ui.util.assertNoDialogExists -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.platform.base.BitwardenComposeTest import io.mockk.every import io.mockk.just @@ -138,7 +138,7 @@ class RemovePasswordScreenTest : BitwardenComposeTest() { it.copy( dialogState = RemovePasswordState.DialogState.LeaveConfirmationPrompt( - R.string.leave_organization.asText(), + BitwardenString.leave_organization.asText(), ), ) } @@ -158,7 +158,7 @@ class RemovePasswordScreenTest : BitwardenComposeTest() { mutableStateFlow.update { it.copy( dialogState = RemovePasswordState.DialogState.LeaveConfirmationPrompt( - R.string.leave_organization_name.asText( + BitwardenString.leave_organization_name.asText( "orgName", ), ), diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/removepassword/RemovePasswordViewModelTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/removepassword/RemovePasswordViewModelTest.kt index 48f60ba359..dab6cb2346 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/removepassword/RemovePasswordViewModelTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/removepassword/RemovePasswordViewModelTest.kt @@ -5,8 +5,8 @@ import app.cash.turbine.test import com.bitwarden.data.repository.model.Environment import com.bitwarden.network.model.OrganizationType import com.bitwarden.ui.platform.base.BaseViewModelTest +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.auth.datasource.disk.model.OnboardingStatus import com.x8bit.bitwarden.data.auth.repository.AuthRepository import com.x8bit.bitwarden.data.auth.repository.model.LeaveOrganizationResult @@ -39,9 +39,9 @@ class RemovePasswordViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialogState = RemovePasswordState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.validation_field_required - .asText(R.string.master_password.asText()), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.validation_field_required + .asText(BitwardenString.master_password.asText()), ), ), viewModel.stateFlow.value, @@ -64,7 +64,7 @@ class RemovePasswordViewModelTest : BaseViewModelTest() { assertEquals( initialState.copy( dialogState = RemovePasswordState.DialogState.Loading( - title = R.string.deleting.asText(), + title = BitwardenString.deleting.asText(), ), ), awaitItem(), @@ -72,8 +72,8 @@ class RemovePasswordViewModelTest : BaseViewModelTest() { assertEquals( initialState.copy( dialogState = RemovePasswordState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.generic_error_message.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.generic_error_message.asText(), error = error, ), ), @@ -98,7 +98,7 @@ class RemovePasswordViewModelTest : BaseViewModelTest() { assertEquals( initialState.copy( dialogState = RemovePasswordState.DialogState.Loading( - title = R.string.deleting.asText(), + title = BitwardenString.deleting.asText(), ), ), awaitItem(), @@ -106,8 +106,8 @@ class RemovePasswordViewModelTest : BaseViewModelTest() { assertEquals( initialState.copy( dialogState = RemovePasswordState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.invalid_master_password.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.invalid_master_password.asText(), ), ), awaitItem(), @@ -130,7 +130,7 @@ class RemovePasswordViewModelTest : BaseViewModelTest() { assertEquals( initialState.copy( dialogState = RemovePasswordState.DialogState.Loading( - title = R.string.deleting.asText(), + title = BitwardenString.deleting.asText(), ), ), awaitItem(), @@ -154,7 +154,7 @@ class RemovePasswordViewModelTest : BaseViewModelTest() { assertEquals( initialState.copy( dialogState = RemovePasswordState.DialogState.LeaveConfirmationPrompt( - R.string.leave_organization_name.asText("My org".asText()), + BitwardenString.leave_organization_name.asText("My org".asText()), ), ), awaitItem(), @@ -210,7 +210,7 @@ class RemovePasswordViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialogState = RemovePasswordState.DialogState.Loading( - title = R.string.loading.asText(), + title = BitwardenString.loading.asText(), ), ), awaitItem(), @@ -218,8 +218,8 @@ class RemovePasswordViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialogState = RemovePasswordState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.generic_error_message.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.generic_error_message.asText(), ), ), awaitItem(), @@ -266,11 +266,11 @@ private const val KEY_CONNECTOR_URL: String = "bitwarden.com" private val DEFAULT_STATE = RemovePasswordState( input = "", dialogState = null, - description = R.string + description = BitwardenString .password_no_longer_required_confirm_domain.asText(), - labelOrg = R.string.key_connector_organization.asText(), + labelOrg = BitwardenString.key_connector_organization.asText(), orgName = ORGANIZATION_NAME.asText(), - labelDomain = R.string.key_connector_domain.asText(), + labelDomain = BitwardenString.key_connector_domain.asText(), domainName = KEY_CONNECTOR_URL.asText(), organizationId = "mockId-1", ) diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/resetPassword/ResetPasswordViewModelTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/resetPassword/ResetPasswordViewModelTest.kt index f19b48f1b5..44c6706e00 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/resetPassword/ResetPasswordViewModelTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/resetPassword/ResetPasswordViewModelTest.kt @@ -3,8 +3,8 @@ package com.x8bit.bitwarden.ui.auth.feature.resetPassword import androidx.lifecycle.SavedStateHandle import app.cash.turbine.test import com.bitwarden.ui.platform.base.BaseViewModelTest +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.auth.datasource.disk.model.ForcePasswordResetReason import com.x8bit.bitwarden.data.auth.datasource.sdk.model.PasswordStrength import com.x8bit.bitwarden.data.auth.repository.AuthRepository @@ -71,9 +71,9 @@ class ResetPasswordViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialogState = ResetPasswordState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.validation_field_required - .asText(R.string.master_password.asText()), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.validation_field_required + .asText(BitwardenString.master_password.asText()), ), ), viewModel.stateFlow.value, @@ -104,8 +104,8 @@ class ResetPasswordViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialogState = ResetPasswordState.DialogState.Error( - title = R.string.master_password_policy_validation_title.asText(), - message = R.string.master_password_policy_validation_message.asText(), + title = BitwardenString.master_password_policy_validation_title.asText(), + message = BitwardenString.master_password_policy_validation_message.asText(), ), passwordInput = password, passwordStrengthState = PasswordStrengthState.WEAK_1, @@ -132,8 +132,8 @@ class ResetPasswordViewModelTest : BaseViewModelTest() { DEFAULT_STATE.copy( resetReason = ForcePasswordResetReason.ADMIN_FORCE_PASSWORD_RESET, dialogState = ResetPasswordState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.master_password_length_val_message_x + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.master_password_length_val_message_x .asText(MIN_PASSWORD_LENGTH), ), passwordInput = password, @@ -161,8 +161,8 @@ class ResetPasswordViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialogState = ResetPasswordState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.master_password_confirmation_val_message.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.master_password_confirmation_val_message.asText(), ), passwordInput = password, passwordStrengthState = PasswordStrengthState.WEAK_1, @@ -196,8 +196,8 @@ class ResetPasswordViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialogState = ResetPasswordState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.generic_error_message.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.generic_error_message.asText(), error = error, ), currentPasswordInput = currentPassword, @@ -233,8 +233,8 @@ class ResetPasswordViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialogState = ResetPasswordState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.invalid_master_password.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.invalid_master_password.asText(), ), currentPasswordInput = currentPassword, passwordInput = password, @@ -284,7 +284,7 @@ class ResetPasswordViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialogState = ResetPasswordState.DialogState.Loading( - message = R.string.updating_password.asText(), + message = BitwardenString.updating_password.asText(), ), currentPasswordInput = currentPassword, passwordInput = password, diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/resetPassword/util/PolicyInformationMasterPasswordExtensionsTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/resetPassword/util/PolicyInformationMasterPasswordExtensionsTest.kt index 68c190d59f..8c14e7bbf3 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/resetPassword/util/PolicyInformationMasterPasswordExtensionsTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/resetPassword/util/PolicyInformationMasterPasswordExtensionsTest.kt @@ -1,7 +1,7 @@ package com.x8bit.bitwarden.ui.auth.feature.resetPassword.util +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.auth.repository.model.createMockMasterPasswordPolicy import com.x8bit.bitwarden.ui.auth.feature.resetpassword.util.toDisplayLabels import org.junit.jupiter.api.Assertions.assertEquals @@ -16,7 +16,7 @@ class PolicyInformationMasterPasswordExtensionsTest { createMockMasterPasswordPolicy(minLength = 2), ) assertEquals( - listOf(R.string.policy_in_effect_min_length.asText(10)), + listOf(BitwardenString.policy_in_effect_min_length.asText(10)), policyList.toDisplayLabels(), ) } @@ -29,7 +29,7 @@ class PolicyInformationMasterPasswordExtensionsTest { createMockMasterPasswordPolicy(minComplexity = 2), ) assertEquals( - listOf(R.string.policy_in_effect_min_complexity.asText(2)), + listOf(BitwardenString.policy_in_effect_min_complexity.asText(2)), policyList.toDisplayLabels(), ) } @@ -44,10 +44,10 @@ class PolicyInformationMasterPasswordExtensionsTest { ) assertEquals( listOf( - R.string.policy_in_effect_uppercase.asText(), - R.string.policy_in_effect_lowercase.asText(), - R.string.policy_in_effect_numbers.asText(), - R.string.policy_in_effect_special.asText(), + BitwardenString.policy_in_effect_uppercase.asText(), + BitwardenString.policy_in_effect_lowercase.asText(), + BitwardenString.policy_in_effect_numbers.asText(), + BitwardenString.policy_in_effect_special.asText(), ), policyList.toDisplayLabels(), ) diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/setpassword/SetPasswordViewModelTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/setpassword/SetPasswordViewModelTest.kt index 2ba9ed7106..afe54beb1d 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/setpassword/SetPasswordViewModelTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/setpassword/SetPasswordViewModelTest.kt @@ -3,8 +3,8 @@ package com.x8bit.bitwarden.ui.auth.feature.setpassword import androidx.lifecycle.SavedStateHandle import app.cash.turbine.test import com.bitwarden.ui.platform.base.BaseViewModelTest +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.auth.repository.AuthRepository import com.x8bit.bitwarden.data.auth.repository.model.LogoutReason import com.x8bit.bitwarden.data.auth.repository.model.SetPasswordResult @@ -58,9 +58,9 @@ class SetPasswordViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialogState = SetPasswordState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.validation_field_required - .asText(R.string.master_password.asText()), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.validation_field_required + .asText(BitwardenString.master_password.asText()), ), ), viewModel.stateFlow.value, @@ -86,8 +86,8 @@ class SetPasswordViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialogState = SetPasswordState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.master_password_length_val_message_x + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.master_password_length_val_message_x .asText(MIN_PASSWORD_LENGTH), ), passwordInput = password, @@ -112,8 +112,8 @@ class SetPasswordViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialogState = SetPasswordState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.master_password_confirmation_val_message.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.master_password_confirmation_val_message.asText(), ), passwordInput = password, ), @@ -133,7 +133,7 @@ class SetPasswordViewModelTest : BaseViewModelTest() { state = SetPasswordState( organizationIdentifier = ORGANIZATION_IDENTIFIER, policies = listOf( - R.string.policy_in_effect_uppercase.asText(), + BitwardenString.policy_in_effect_uppercase.asText(), ), dialogState = null, passwordInput = "", @@ -149,13 +149,14 @@ class SetPasswordViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialogState = SetPasswordState.DialogState.Error( - title = R.string.master_password_policy_validation_title.asText(), - message = R.string.master_password_policy_validation_message.asText(), + title = BitwardenString.master_password_policy_validation_title.asText(), + message = + BitwardenString.master_password_policy_validation_message.asText(), ), passwordInput = password, retypePasswordInput = password, policies = listOf( - R.string.policy_in_effect_uppercase.asText(), + BitwardenString.policy_in_effect_uppercase.asText(), ), ), viewModel.stateFlow.value, @@ -195,7 +196,7 @@ class SetPasswordViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialogState = SetPasswordState.DialogState.Loading( - message = R.string.updating_password.asText(), + message = BitwardenString.updating_password.asText(), ), passwordInput = password, retypePasswordInput = password, diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/startregistration/StartRegistrationViewModelTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/startregistration/StartRegistrationViewModelTest.kt index de89ccab34..3349b3aa6f 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/startregistration/StartRegistrationViewModelTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/startregistration/StartRegistrationViewModelTest.kt @@ -6,8 +6,8 @@ import app.cash.turbine.test import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow import com.bitwarden.data.repository.model.Environment import com.bitwarden.ui.platform.base.BaseViewModelTest +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.auth.repository.AuthRepository import com.x8bit.bitwarden.data.auth.repository.model.SendVerificationEmailResult import com.x8bit.bitwarden.data.auth.repository.util.generateUriForCaptcha @@ -94,8 +94,8 @@ class StartRegistrationViewModelTest : BaseViewModelTest() { emailInput = input, isContinueButtonEnabled = true, dialog = StartRegistrationDialog.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.invalid_email.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.invalid_email.asText(), ), ) viewModel.trySendAction(ContinueClick) @@ -112,9 +112,9 @@ class StartRegistrationViewModelTest : BaseViewModelTest() { val expectedState = DEFAULT_STATE.copy( emailInput = input, dialog = StartRegistrationDialog.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.validation_field_required - .asText(R.string.email_address.asText()), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.validation_field_required + .asText(BitwardenString.email_address.asText()), ), ) viewModel.trySendAction(ContinueClick) @@ -172,7 +172,7 @@ class StartRegistrationViewModelTest : BaseViewModelTest() { assertEquals( VALID_INPUT_STATE.copy( dialog = StartRegistrationDialog.Error( - title = R.string.an_error_has_occurred.asText(), + title = BitwardenString.an_error_has_occurred.asText(), message = "mock_error".asText(), error = error, ), diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/trusteddevice/TrustedDeviceViewModelTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/trusteddevice/TrustedDeviceViewModelTest.kt index df457accf3..ffd355ca49 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/trusteddevice/TrustedDeviceViewModelTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/trusteddevice/TrustedDeviceViewModelTest.kt @@ -4,8 +4,8 @@ import androidx.lifecycle.SavedStateHandle import app.cash.turbine.test import com.bitwarden.data.repository.model.Environment import com.bitwarden.ui.platform.base.BaseViewModelTest +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.auth.datasource.disk.model.OnboardingStatus import com.x8bit.bitwarden.data.auth.repository.AuthRepository import com.x8bit.bitwarden.data.auth.repository.model.AuthState @@ -131,7 +131,7 @@ class TrustedDeviceViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialogState = TrustedDeviceState.DialogState.Loading( - message = R.string.loading.asText(), + message = BitwardenString.loading.asText(), ), ), awaitItem(), @@ -139,8 +139,8 @@ class TrustedDeviceViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialogState = TrustedDeviceState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.generic_error_message.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.generic_error_message.asText(), error = error, ), ), @@ -168,7 +168,7 @@ class TrustedDeviceViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialogState = TrustedDeviceState.DialogState.Loading( - message = R.string.loading.asText(), + message = BitwardenString.loading.asText(), ), ), awaitItem(), diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/twofactorlogin/TwoFactorLoginViewModelTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/twofactorlogin/TwoFactorLoginViewModelTest.kt index 185a35a7b1..997dbeae33 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/twofactorlogin/TwoFactorLoginViewModelTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/twofactorlogin/TwoFactorLoginViewModelTest.kt @@ -11,8 +11,8 @@ import com.bitwarden.network.model.GetTokenResponseJson import com.bitwarden.network.model.TwoFactorAuthMethod import com.bitwarden.network.model.TwoFactorDataModel import com.bitwarden.ui.platform.base.BaseViewModelTest +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.auth.repository.AuthRepository import com.x8bit.bitwarden.data.auth.repository.model.LoginResult import com.x8bit.bitwarden.data.auth.repository.model.ResendEmailResult @@ -231,7 +231,7 @@ class TwoFactorLoginViewModelTest : BaseViewModelTest() { assertEquals( initialState.copy( dialogState = TwoFactorLoginState.DialogState.Error( - message = R.string.generic_error_message.asText(), + message = BitwardenString.generic_error_message.asText(), ), ), viewModel.stateFlow.value, @@ -424,7 +424,7 @@ class TwoFactorLoginViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialogState = TwoFactorLoginState.DialogState.Loading( - message = R.string.logging_in.asText(), + message = BitwardenString.logging_in.asText(), ), ), awaitItem(), @@ -515,8 +515,8 @@ class TwoFactorLoginViewModelTest : BaseViewModelTest() { assertEquals( state.copy( dialogState = TwoFactorLoginState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.error_connecting_with_the_duo_service_use_a_different_two_step_login_method_or_contact_duo_for_assistance.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.error_connecting_with_the_duo_service_use_a_different_two_step_login_method_or_contact_duo_for_assistance.asText(), ), ), awaitItem(), @@ -539,12 +539,12 @@ class TwoFactorLoginViewModelTest : BaseViewModelTest() { val headerText = "header" val buttonText = "button" val returnButtonText = "return" - every { resourceManager.getString(R.string.fido2_title) } returns headerText + every { resourceManager.getString(BitwardenString.fido2_title) } returns headerText every { - resourceManager.getString(R.string.fido2_authenticate_web_authn) + resourceManager.getString(BitwardenString.fido2_authenticate_web_authn) } returns buttonText every { - resourceManager.getString(R.string.fido2_return_to_app) + resourceManager.getString(BitwardenString.fido2_return_to_app) } returns returnButtonText every { authRepository.twoFactorResponse } returns response every { @@ -586,7 +586,7 @@ class TwoFactorLoginViewModelTest : BaseViewModelTest() { viewModel.trySendAction(TwoFactorLoginAction.ContinueButtonClick) assertEquals( TwoFactorLoginEvent.ShowSnackbar( - message = R.string + message = BitwardenString .there_was_an_error_starting_web_authn_two_factor_authentication .asText(), ), @@ -669,7 +669,7 @@ class TwoFactorLoginViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialogState = TwoFactorLoginState.DialogState.Loading( - message = R.string.logging_in.asText(), + message = BitwardenString.logging_in.asText(), ), ), awaitItem(), @@ -678,8 +678,8 @@ class TwoFactorLoginViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialogState = TwoFactorLoginState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.invalid_verification_code.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.invalid_verification_code.asText(), error = error, ), ), @@ -730,7 +730,7 @@ class TwoFactorLoginViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialogState = TwoFactorLoginState.DialogState.Loading( - message = R.string.logging_in.asText(), + message = BitwardenString.logging_in.asText(), ), ), awaitItem(), @@ -739,7 +739,7 @@ class TwoFactorLoginViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialogState = TwoFactorLoginState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), + title = BitwardenString.an_error_has_occurred.asText(), message = "Mock error message".asText(), error = error, ), @@ -791,7 +791,7 @@ class TwoFactorLoginViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialogState = TwoFactorLoginState.DialogState.Loading( - message = R.string.logging_in.asText(), + message = BitwardenString.logging_in.asText(), ), ), awaitItem(), @@ -800,8 +800,8 @@ class TwoFactorLoginViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialogState = TwoFactorLoginState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.this_is_not_a_recognized_bitwarden_server_you_may_need_to_check_with_your_provider_or_update_your_server.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.this_is_not_a_recognized_bitwarden_server_you_may_need_to_check_with_your_provider_or_update_your_server.asText(), ), ), awaitItem(), @@ -851,7 +851,7 @@ class TwoFactorLoginViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialogState = TwoFactorLoginState.DialogState.Loading( - message = R.string.logging_in.asText(), + message = BitwardenString.logging_in.asText(), ), ), awaitItem(), @@ -860,8 +860,8 @@ class TwoFactorLoginViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialogState = TwoFactorLoginState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.we_couldnt_verify_the_servers_certificate.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.we_couldnt_verify_the_servers_certificate.asText(), ), ), awaitItem(), @@ -911,7 +911,7 @@ class TwoFactorLoginViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialogState = TwoFactorLoginState.DialogState.Loading( - message = R.string.logging_in.asText(), + message = BitwardenString.logging_in.asText(), ), ), awaitItem(), @@ -920,7 +920,7 @@ class TwoFactorLoginViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialogState = TwoFactorLoginState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), + title = BitwardenString.an_error_has_occurred.asText(), message = "new device verification required".asText(), ), ), @@ -1005,7 +1005,7 @@ class TwoFactorLoginViewModelTest : BaseViewModelTest() { assertEquals( TwoFactorLoginEvent.ShowSnackbar( - message = R.string.verification_email_sent.asText(), + message = BitwardenString.verification_email_sent.asText(), ), awaitItem(), ) @@ -1038,8 +1038,8 @@ class TwoFactorLoginViewModelTest : BaseViewModelTest() { DEFAULT_STATE.copy( authMethod = TwoFactorAuthMethod.EMAIL, dialogState = TwoFactorLoginState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.verification_email_not_sent.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.verification_email_not_sent.asText(), error = error, ), ), @@ -1052,7 +1052,7 @@ class TwoFactorLoginViewModelTest : BaseViewModelTest() { DEFAULT_STATE.copy( authMethod = TwoFactorAuthMethod.EMAIL, dialogState = TwoFactorLoginState.DialogState.Loading( - message = R.string.submitting.asText(), + message = BitwardenString.submitting.asText(), ), ), awaitItem(), @@ -1061,8 +1061,8 @@ class TwoFactorLoginViewModelTest : BaseViewModelTest() { DEFAULT_STATE.copy( authMethod = TwoFactorAuthMethod.EMAIL, dialogState = TwoFactorLoginState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.verification_email_not_sent.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.verification_email_not_sent.asText(), error = error, ), ), @@ -1144,7 +1144,7 @@ class TwoFactorLoginViewModelTest : BaseViewModelTest() { ) assertEquals( TwoFactorLoginEvent.ShowSnackbar( - message = R.string.verification_email_sent.asText(), + message = BitwardenString.verification_email_sent.asText(), ), awaitItem(), ) @@ -1183,8 +1183,8 @@ class TwoFactorLoginViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialogState = TwoFactorLoginState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.verification_email_not_sent.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.verification_email_not_sent.asText(), error = error, ), ), @@ -1290,7 +1290,7 @@ class TwoFactorLoginViewModelTest : BaseViewModelTest() { ) assertEquals( TwoFactorLoginEvent.ShowSnackbar( - message = R.string.verification_email_sent.asText(), + message = BitwardenString.verification_email_sent.asText(), ), awaitItem(), ) diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/twofactorlogin/util/TwoFactorAuthMethodExtensionTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/twofactorlogin/util/TwoFactorAuthMethodExtensionTest.kt index 6ac3882dbe..481a0d67fb 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/twofactorlogin/util/TwoFactorAuthMethodExtensionTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/twofactorlogin/util/TwoFactorAuthMethodExtensionTest.kt @@ -2,9 +2,9 @@ package com.x8bit.bitwarden.ui.auth.feature.twofactorlogin.util import com.bitwarden.network.model.TwoFactorAuthMethod import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.asText import com.bitwarden.ui.util.concat -import com.x8bit.bitwarden.R import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Test @@ -12,17 +12,18 @@ class TwoFactorAuthMethodExtensionTest { @Test fun `title returns the expected value`() { mapOf( - TwoFactorAuthMethod.AUTHENTICATOR_APP to R.string.authenticator_app_title.asText(), - TwoFactorAuthMethod.EMAIL to R.string.email.asText(), - TwoFactorAuthMethod.DUO to R.string.duo_title.asText(), - TwoFactorAuthMethod.YUBI_KEY to R.string.yubi_key_title.asText(), + TwoFactorAuthMethod.AUTHENTICATOR_APP to BitwardenString.authenticator_app_title + .asText(), + TwoFactorAuthMethod.EMAIL to BitwardenString.email.asText(), + TwoFactorAuthMethod.DUO to BitwardenString.duo_title.asText(), + TwoFactorAuthMethod.YUBI_KEY to BitwardenString.yubi_key_title.asText(), TwoFactorAuthMethod.U2F to "".asText(), TwoFactorAuthMethod.REMEMBER to "".asText(), - TwoFactorAuthMethod.DUO_ORGANIZATION to R.string.duo_org_title.asText( - R.string.organization.asText(), + TwoFactorAuthMethod.DUO_ORGANIZATION to BitwardenString.duo_org_title.asText( + BitwardenString.organization.asText(), ), - TwoFactorAuthMethod.WEB_AUTH to R.string.fido2_authenticate_web_authn.asText(), - TwoFactorAuthMethod.RECOVERY_CODE to R.string.recovery_code_title.asText(), + TwoFactorAuthMethod.WEB_AUTH to BitwardenString.fido2_authenticate_web_authn.asText(), + TwoFactorAuthMethod.RECOVERY_CODE to BitwardenString.recovery_code_title.asText(), ) .forEach { (type, title) -> assertEquals( @@ -36,21 +37,23 @@ class TwoFactorAuthMethodExtensionTest { fun `description returns the expected value`() { mapOf( TwoFactorAuthMethod.AUTHENTICATOR_APP to - R.string.enter_verification_code_app.asText(), + BitwardenString.enter_verification_code_app.asText(), TwoFactorAuthMethod.EMAIL to - R.string.enter_verification_code_email.asText("ex***@email.com"), + BitwardenString.enter_verification_code_email.asText("ex***@email.com"), TwoFactorAuthMethod.DUO to - R.string.follow_the_steps_from_duo_to_finish_logging_in.asText(), - TwoFactorAuthMethod.YUBI_KEY to R.string.yubi_key_instruction.asText(), + BitwardenString.follow_the_steps_from_duo_to_finish_logging_in.asText(), + TwoFactorAuthMethod.YUBI_KEY to BitwardenString.yubi_key_instruction.asText(), TwoFactorAuthMethod.U2F to "".asText(), TwoFactorAuthMethod.REMEMBER to "".asText(), TwoFactorAuthMethod.DUO_ORGANIZATION to - R.string.duo_two_step_login_is_required_for_your_account + BitwardenString.duo_two_step_login_is_required_for_your_account .asText() .concat(" ".asText()) - .concat(R.string.follow_the_steps_from_duo_to_finish_logging_in.asText()), + .concat( + BitwardenString.follow_the_steps_from_duo_to_finish_logging_in.asText(), + ), TwoFactorAuthMethod.WEB_AUTH to - R.string.continue_to_complete_web_authn_verification.asText(), + BitwardenString.continue_to_complete_web_authn_verification.asText(), TwoFactorAuthMethod.RECOVERY_CODE to "".asText(), ) .forEach { (type, title) -> @@ -64,15 +67,15 @@ class TwoFactorAuthMethodExtensionTest { @Test fun `button returns the expected value`() { mapOf( - TwoFactorAuthMethod.AUTHENTICATOR_APP to R.string.continue_text.asText(), - TwoFactorAuthMethod.EMAIL to R.string.continue_text.asText(), - TwoFactorAuthMethod.DUO to R.string.launch_duo.asText(), - TwoFactorAuthMethod.YUBI_KEY to R.string.continue_text.asText(), - TwoFactorAuthMethod.U2F to R.string.continue_text.asText(), - TwoFactorAuthMethod.REMEMBER to R.string.continue_text.asText(), - TwoFactorAuthMethod.DUO_ORGANIZATION to R.string.launch_duo.asText(), - TwoFactorAuthMethod.WEB_AUTH to R.string.launch_web_authn.asText(), - TwoFactorAuthMethod.RECOVERY_CODE to R.string.continue_text.asText(), + TwoFactorAuthMethod.AUTHENTICATOR_APP to BitwardenString.continue_text.asText(), + TwoFactorAuthMethod.EMAIL to BitwardenString.continue_text.asText(), + TwoFactorAuthMethod.DUO to BitwardenString.launch_duo.asText(), + TwoFactorAuthMethod.YUBI_KEY to BitwardenString.continue_text.asText(), + TwoFactorAuthMethod.U2F to BitwardenString.continue_text.asText(), + TwoFactorAuthMethod.REMEMBER to BitwardenString.continue_text.asText(), + TwoFactorAuthMethod.DUO_ORGANIZATION to BitwardenString.launch_duo.asText(), + TwoFactorAuthMethod.WEB_AUTH to BitwardenString.launch_web_authn.asText(), + TwoFactorAuthMethod.RECOVERY_CODE to BitwardenString.continue_text.asText(), ) .forEach { (type, buttonLabel) -> assertEquals(buttonLabel, type.button) diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/vaultunlock/VaultUnlockScreenTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/vaultunlock/VaultUnlockScreenTest.kt index 3dfaaf217a..f55ad3b218 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/vaultunlock/VaultUnlockScreenTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/vaultunlock/VaultUnlockScreenTest.kt @@ -19,9 +19,9 @@ import androidx.compose.ui.test.performScrollTo import androidx.compose.ui.test.performTextInput import androidx.compose.ui.test.requestFocus import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.asText import com.bitwarden.ui.util.assertNoDialogExists -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.auth.repository.model.VaultUnlockType import com.x8bit.bitwarden.data.util.advanceTimeByAndRunCurrent import com.x8bit.bitwarden.ui.credentials.manager.CredentialProviderCompletionManager @@ -132,13 +132,17 @@ class VaultUnlockScreenTest : BitwardenComposeTest() { fun `on GetCredentialsError should call completeProviderGetCredentialsRequest on CredentialProviderCompletionManager`() { mutableEventFlow.tryEmit( VaultUnlockEvent.GetCredentialsError( - R.string.credential_operation_failed_because_user_could_not_be_verified.asText(), + BitwardenString + .credential_operation_failed_because_user_could_not_be_verified + .asText(), ), ) verify(exactly = 1) { credentialProviderCompletionManager.completeProviderGetCredentialsRequest( result = GetCredentialsResult.Error( - R.string.credential_operation_failed_because_user_could_not_be_verified.asText(), + BitwardenString + .credential_operation_failed_because_user_could_not_be_verified + .asText(), ), ) } diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/vaultunlock/VaultUnlockViewModelTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/vaultunlock/VaultUnlockViewModelTest.kt index c52fb52fd2..bc033b8751 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/vaultunlock/VaultUnlockViewModelTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/vaultunlock/VaultUnlockViewModelTest.kt @@ -6,8 +6,8 @@ import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow import com.bitwarden.data.datasource.disk.model.EnvironmentUrlDataJson import com.bitwarden.data.repository.model.Environment import com.bitwarden.ui.platform.base.BaseViewModelTest +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.auth.datasource.disk.model.OnboardingStatus import com.x8bit.bitwarden.data.auth.repository.AuthRepository import com.x8bit.bitwarden.data.auth.repository.model.LogoutReason @@ -613,7 +613,9 @@ class VaultUnlockViewModelTest : BaseViewModelTest() { viewModel.eventFlow.test { assertEquals( VaultUnlockEvent.GetCredentialsError( - R.string.credential_operation_failed_because_user_could_not_be_verified.asText(), + BitwardenString + .credential_operation_failed_because_user_could_not_be_verified + .asText(), ), awaitItem(), ) @@ -634,7 +636,7 @@ class VaultUnlockViewModelTest : BaseViewModelTest() { viewModel.eventFlow.test { assertEquals( VaultUnlockEvent.Fido2CredentialAssertionError( - R.string.passkey_operation_failed_because_user_could_not_be_verified + BitwardenString.passkey_operation_failed_because_user_could_not_be_verified .asText(), ), awaitItem(), @@ -775,8 +777,8 @@ class VaultUnlockViewModelTest : BaseViewModelTest() { assertEquals( initialState.copy( dialog = VaultUnlockState.VaultUnlockDialog.Error( - R.string.an_error_has_occurred.asText(), - R.string.validation_field_required.asText( + BitwardenString.an_error_has_occurred.asText(), + BitwardenString.validation_field_required.asText( initialState.vaultUnlockType.unlockScreenInputLabel, ), ), @@ -801,8 +803,8 @@ class VaultUnlockViewModelTest : BaseViewModelTest() { assertEquals( initialState.copy( dialog = VaultUnlockState.VaultUnlockDialog.Error( - R.string.an_error_has_occurred.asText(), - R.string.invalid_master_password.asText(), + BitwardenString.an_error_has_occurred.asText(), + BitwardenString.invalid_master_password.asText(), ), ), viewModel.stateFlow.value, @@ -829,8 +831,8 @@ class VaultUnlockViewModelTest : BaseViewModelTest() { assertEquals( initialState.copy( dialog = VaultUnlockState.VaultUnlockDialog.Error( - R.string.an_error_has_occurred.asText(), - R.string.generic_error_message.asText(), + BitwardenString.an_error_has_occurred.asText(), + BitwardenString.generic_error_message.asText(), throwable = error, ), ), @@ -858,8 +860,8 @@ class VaultUnlockViewModelTest : BaseViewModelTest() { assertEquals( initialState.copy( dialog = VaultUnlockState.VaultUnlockDialog.Error( - R.string.an_error_has_occurred.asText(), - R.string.generic_error_message.asText(), + BitwardenString.an_error_has_occurred.asText(), + BitwardenString.generic_error_message.asText(), throwable = error, ), ), @@ -943,8 +945,8 @@ class VaultUnlockViewModelTest : BaseViewModelTest() { assertEquals( initialState.copy( dialog = VaultUnlockState.VaultUnlockDialog.Error( - R.string.an_error_has_occurred.asText(), - R.string.validation_field_required.asText( + BitwardenString.an_error_has_occurred.asText(), + BitwardenString.validation_field_required.asText( initialState.vaultUnlockType.unlockScreenInputLabel, ), ), @@ -969,8 +971,8 @@ class VaultUnlockViewModelTest : BaseViewModelTest() { assertEquals( initialState.copy( dialog = VaultUnlockState.VaultUnlockDialog.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.invalid_pin.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.invalid_pin.asText(), ), ), viewModel.stateFlow.value, @@ -997,8 +999,8 @@ class VaultUnlockViewModelTest : BaseViewModelTest() { assertEquals( initialState.copy( dialog = VaultUnlockState.VaultUnlockDialog.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.generic_error_message.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.generic_error_message.asText(), throwable = error, ), ), @@ -1026,8 +1028,8 @@ class VaultUnlockViewModelTest : BaseViewModelTest() { assertEquals( initialState.copy( dialog = VaultUnlockState.VaultUnlockDialog.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.generic_error_message.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.generic_error_message.asText(), throwable = error, ), ), @@ -1128,8 +1130,8 @@ class VaultUnlockViewModelTest : BaseViewModelTest() { assertEquals( initialState.copy( dialog = VaultUnlockState.VaultUnlockDialog.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.generic_error_message.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.generic_error_message.asText(), throwable = error, ), ), @@ -1158,8 +1160,8 @@ class VaultUnlockViewModelTest : BaseViewModelTest() { assertEquals( initialState.copy( dialog = VaultUnlockState.VaultUnlockDialog.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.generic_error_message.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.generic_error_message.asText(), throwable = error, ), ), @@ -1189,8 +1191,8 @@ class VaultUnlockViewModelTest : BaseViewModelTest() { initialState.copy( isBiometricsValid = false, dialog = VaultUnlockState.VaultUnlockDialog.Error( - title = R.string.biometrics_failed.asText(), - message = R.string.biometrics_decoding_failure.asText(), + title = BitwardenString.biometrics_failed.asText(), + message = BitwardenString.biometrics_decoding_failure.asText(), ), ), viewModel.stateFlow.value, @@ -1219,8 +1221,8 @@ class VaultUnlockViewModelTest : BaseViewModelTest() { assertEquals( initialState.copy( dialog = VaultUnlockState.VaultUnlockDialog.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.generic_error_message.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.generic_error_message.asText(), throwable = error, ), ), diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/vaultunlock/util/VaultUnlockTypeExtensionsTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/vaultunlock/util/VaultUnlockTypeExtensionsTest.kt index befc68c9d3..555eda8534 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/vaultunlock/util/VaultUnlockTypeExtensionsTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/vaultunlock/util/VaultUnlockTypeExtensionsTest.kt @@ -1,8 +1,8 @@ package com.x8bit.bitwarden.ui.auth.feature.vaultunlock.util import androidx.compose.ui.text.input.KeyboardType +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.auth.repository.model.VaultUnlockType import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Test @@ -11,8 +11,8 @@ class VaultUnlockTypeExtensionsTest { @Test fun `unlockScreenTitle should return the correct title for each type`() { mapOf( - VaultUnlockType.MASTER_PASSWORD to R.string.verify_master_password.asText(), - VaultUnlockType.PIN to R.string.verify_pin.asText(), + VaultUnlockType.MASTER_PASSWORD to BitwardenString.verify_master_password.asText(), + VaultUnlockType.PIN to BitwardenString.verify_pin.asText(), ) .forEach { (type, expected) -> assertEquals( @@ -25,8 +25,9 @@ class VaultUnlockTypeExtensionsTest { @Test fun `unlockScreenMessage should return the correct title for each type`() { mapOf( - VaultUnlockType.MASTER_PASSWORD to R.string.vault_locked_master_password.asText(), - VaultUnlockType.PIN to R.string.vault_locked_pin.asText(), + VaultUnlockType.MASTER_PASSWORD to + BitwardenString.vault_locked_master_password.asText(), + VaultUnlockType.PIN to BitwardenString.vault_locked_pin.asText(), ) .forEach { (type, expected) -> assertEquals( @@ -39,8 +40,8 @@ class VaultUnlockTypeExtensionsTest { @Test fun `unlockScreenInputLabel should return the correct title for each type`() { mapOf( - VaultUnlockType.MASTER_PASSWORD to R.string.master_password.asText(), - VaultUnlockType.PIN to R.string.pin.asText(), + VaultUnlockType.MASTER_PASSWORD to BitwardenString.master_password.asText(), + VaultUnlockType.PIN to BitwardenString.pin.asText(), ) .forEach { (type, expected) -> assertEquals( @@ -53,8 +54,8 @@ class VaultUnlockTypeExtensionsTest { @Test fun `unlockScreenErrorMessage should return the correct title for each type`() { mapOf( - VaultUnlockType.MASTER_PASSWORD to R.string.invalid_master_password.asText(), - VaultUnlockType.PIN to R.string.invalid_pin.asText(), + VaultUnlockType.MASTER_PASSWORD to BitwardenString.invalid_master_password.asText(), + VaultUnlockType.PIN to BitwardenString.invalid_pin.asText(), ) .forEach { (type, expected) -> assertEquals( @@ -81,10 +82,11 @@ class VaultUnlockTypeExtensionsTest { @Test fun `emptyInputDialogMessage should return the correct title for each type`() { mapOf( - VaultUnlockType.MASTER_PASSWORD to R.string.validation_field_required.asText( - R.string.master_password.asText(), + VaultUnlockType.MASTER_PASSWORD to BitwardenString.validation_field_required.asText( + BitwardenString.master_password.asText(), ), - VaultUnlockType.PIN to R.string.validation_field_required.asText(R.string.pin.asText()), + VaultUnlockType.PIN to + BitwardenString.validation_field_required.asText(BitwardenString.pin.asText()), ) .forEach { (type, expected) -> assertEquals( diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/autofill/BitwardenRemoteViewsTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/autofill/BitwardenRemoteViewsTest.kt index 01ad565856..27e85639db 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/autofill/BitwardenRemoteViewsTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/autofill/BitwardenRemoteViewsTest.kt @@ -4,6 +4,7 @@ import android.content.Context import android.widget.RemoteViews import androidx.core.content.ContextCompat import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.autofill.model.AutofillAppInfo import com.x8bit.bitwarden.data.autofill.model.AutofillCipher @@ -24,8 +25,8 @@ import org.junit.jupiter.api.Test class BitwardenRemoteViewsTest { private val testContext: Context = mockk { every { this@mockk.getString(R.string.app_name) } returns APP_NAME - every { this@mockk.getString(R.string.go_to_my_vault) } returns GO_TO_MY_VAULT - every { this@mockk.getString(R.string.vault_is_locked) } returns VAULT_IS_LOCKED + every { this@mockk.getString(BitwardenString.go_to_my_vault) } returns GO_TO_MY_VAULT + every { this@mockk.getString(BitwardenString.vault_is_locked) } returns VAULT_IS_LOCKED } private val autofillAppInfo: AutofillAppInfo = mockk { every { this@mockk.context } returns testContext @@ -56,13 +57,13 @@ class BitwardenRemoteViewsTest { // Setup every { testContext.isSystemDarkMode } returns false every { - ContextCompat.getString(testContext, R.string.autofill_suggestion) + ContextCompat.getString(testContext, BitwardenString.autofill_suggestion) } returns "Autofill suggestion" every { - ContextCompat.getString(testContext, R.string.type_card) + ContextCompat.getString(testContext, BitwardenString.type_card) } returns "Card" every { - ContextCompat.getString(testContext, R.string.type_login) + ContextCompat.getString(testContext, BitwardenString.type_login) } returns "Login" prepareRemoteViews( name = NAME, @@ -129,13 +130,13 @@ class BitwardenRemoteViewsTest { // Setup every { testContext.isSystemDarkMode } returns true every { - ContextCompat.getString(testContext, R.string.autofill_suggestion) + ContextCompat.getString(testContext, BitwardenString.autofill_suggestion) } returns "Autofill suggestion" every { - ContextCompat.getString(testContext, R.string.type_card) + ContextCompat.getString(testContext, BitwardenString.type_card) } returns "Card" every { - ContextCompat.getString(testContext, R.string.type_login) + ContextCompat.getString(testContext, BitwardenString.type_login) } returns "Login" prepareRemoteViews( name = NAME, diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/autofill/util/AutofillUtilsTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/autofill/util/AutofillUtilsTest.kt index 9450c447b5..ff04683835 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/autofill/util/AutofillUtilsTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/autofill/util/AutofillUtilsTest.kt @@ -2,7 +2,7 @@ package com.x8bit.bitwarden.ui.autofill.util import android.content.Context import androidx.core.content.ContextCompat -import com.x8bit.bitwarden.R +import com.bitwarden.ui.platform.resource.BitwardenString import com.x8bit.bitwarden.data.autofill.model.AutofillAppInfo import com.x8bit.bitwarden.data.autofill.model.AutofillCipher import io.mockk.every @@ -21,13 +21,13 @@ class AutofillUtilsTest { fun setup() { mockkStatic(ContextCompat::getString) every { - ContextCompat.getString(context, R.string.autofill_suggestion) + ContextCompat.getString(context, BitwardenString.autofill_suggestion) } returns "Autofill suggestion" every { - ContextCompat.getString(context, R.string.type_card) + ContextCompat.getString(context, BitwardenString.type_card) } returns "Card" every { - ContextCompat.getString(context, R.string.type_login) + ContextCompat.getString(context, BitwardenString.type_login) } returns "Login" } diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/autofill/util/InlinePresentationSpecExtensionsTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/autofill/util/InlinePresentationSpecExtensionsTest.kt index b3f1065def..57e026a480 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/autofill/util/InlinePresentationSpecExtensionsTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/autofill/util/InlinePresentationSpecExtensionsTest.kt @@ -12,6 +12,7 @@ import androidx.autofill.inline.UiVersions import androidx.autofill.inline.v1.InlineSuggestionUi import androidx.core.content.ContextCompat import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.autofill.model.AutofillAppInfo import com.x8bit.bitwarden.data.autofill.model.AutofillCipher @@ -146,13 +147,13 @@ class InlinePresentationSpecExtensionsTest { fun `createCipherInlinePresentationOrNull should return presentation with login icon when login cipher and compatible`() { // Setup every { - ContextCompat.getString(testContext, R.string.autofill_suggestion) + ContextCompat.getString(testContext, BitwardenString.autofill_suggestion) } returns AUTOFILL_SUGGESTION every { - ContextCompat.getString(testContext, R.string.type_card) + ContextCompat.getString(testContext, BitwardenString.type_card) } returns CARD every { - ContextCompat.getString(testContext, R.string.type_login) + ContextCompat.getString(testContext, BitwardenString.type_login) } returns LOGIN val icon: Icon = mockk() val iconRes = BitwardenDrawable.ic_globe @@ -210,8 +211,8 @@ class InlinePresentationSpecExtensionsTest { } returns emptyList() every { testContext.getString(R.string.app_name) } returns APP_NAME - every { testContext.getString(R.string.vault_is_locked) } returns VAULT_IS_LOCKED - every { testContext.getString(R.string.my_vault) } returns MY_VAULT + every { testContext.getString(BitwardenString.vault_is_locked) } returns VAULT_IS_LOCKED + every { testContext.getString(BitwardenString.my_vault) } returns MY_VAULT // Test val actual = inlinePresentationSpec.createVaultItemInlinePresentationOrNull( @@ -256,7 +257,7 @@ class InlinePresentationSpecExtensionsTest { ) .setTintBlendMode(BlendMode.DST) testContext.getString(R.string.app_name) - testContext.getString(R.string.vault_is_locked) + testContext.getString(BitwardenString.vault_is_locked) InlineSuggestionUi.newContentBuilder(pendingIntent) .setTitle(APP_NAME) .setSubtitle(VAULT_IS_LOCKED) @@ -295,7 +296,7 @@ class InlinePresentationSpecExtensionsTest { ) .setTintBlendMode(BlendMode.DST) testContext.getString(R.string.app_name) - testContext.getString(R.string.my_vault) + testContext.getString(BitwardenString.my_vault) InlineSuggestionUi.newContentBuilder(pendingIntent) .setTitle(APP_NAME) .setSubtitle(MY_VAULT) @@ -313,13 +314,13 @@ class InlinePresentationSpecExtensionsTest { cipherType: String = LOGIN, ) { every { - ContextCompat.getString(testContext, R.string.autofill_suggestion) + ContextCompat.getString(testContext, BitwardenString.autofill_suggestion) } returns AUTOFILL_SUGGESTION every { - ContextCompat.getString(testContext, R.string.type_card) + ContextCompat.getString(testContext, BitwardenString.type_card) } returns CARD every { - ContextCompat.getString(testContext, R.string.type_login) + ContextCompat.getString(testContext, BitwardenString.type_login) } returns LOGIN @Suppress("DEPRECATION") val slice: Slice = mockk() @@ -411,8 +412,8 @@ class InlinePresentationSpecExtensionsTest { .slice } returns slice every { testContext.getString(R.string.app_name) } returns APP_NAME - every { testContext.getString(R.string.vault_is_locked) } returns VAULT_IS_LOCKED - every { testContext.getString(R.string.my_vault) } returns MY_VAULT + every { testContext.getString(BitwardenString.vault_is_locked) } returns VAULT_IS_LOCKED + every { testContext.getString(BitwardenString.my_vault) } returns MY_VAULT } } diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/search/SearchViewModelTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/search/SearchViewModelTest.kt index 11116bb7be..615f033592 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/search/SearchViewModelTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/search/SearchViewModelTest.kt @@ -12,6 +12,7 @@ import com.bitwarden.network.model.PolicyTypeJson import com.bitwarden.network.model.SyncResponseJson import com.bitwarden.send.SendType import com.bitwarden.ui.platform.base.BaseViewModelTest +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText import com.bitwarden.ui.util.concat @@ -19,7 +20,6 @@ import com.bitwarden.vault.CipherListView import com.bitwarden.vault.CipherType import com.bitwarden.vault.CipherView import com.bitwarden.vault.LoginUriView -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.auth.datasource.disk.model.OnboardingStatus import com.x8bit.bitwarden.data.auth.repository.AuthRepository import com.x8bit.bitwarden.data.auth.repository.model.UserState @@ -358,7 +358,7 @@ class SearchViewModelTest : BaseViewModelTest() { INITIAL_STATE_FOR_AUTOFILL .copy( dialogState = SearchState.DialogState.Loading( - message = R.string.loading.asText(), + message = BitwardenString.loading.asText(), ), ), awaitItem(), @@ -423,7 +423,7 @@ class SearchViewModelTest : BaseViewModelTest() { assertEquals( initialState.copy( dialogState = SearchState.DialogState.Loading( - message = R.string.loading.asText(), + message = BitwardenString.loading.asText(), ), ), stateTurbine.awaitItem(), @@ -476,7 +476,7 @@ class SearchViewModelTest : BaseViewModelTest() { INITIAL_STATE_FOR_AUTOFILL .copy( dialogState = SearchState.DialogState.Loading( - message = R.string.loading.asText(), + message = BitwardenString.loading.asText(), ), ), stateTurbine.awaitItem(), @@ -522,7 +522,7 @@ class SearchViewModelTest : BaseViewModelTest() { INITIAL_STATE_FOR_AUTOFILL.copy( dialogState = SearchState.DialogState.Error( title = null, - message = R.string.generic_error_message.asText(), + message = BitwardenString.generic_error_message.asText(), throwable = error, ), ), @@ -560,7 +560,7 @@ class SearchViewModelTest : BaseViewModelTest() { INITIAL_STATE_FOR_AUTOFILL.copy( dialogState = SearchState.DialogState.Error( title = null, - message = R.string.invalid_master_password.asText(), + message = BitwardenString.invalid_master_password.asText(), ), ), viewModel.stateFlow.value, @@ -795,7 +795,7 @@ class SearchViewModelTest : BaseViewModelTest() { verify(exactly = 1) { clipboardManager.setText( text = sendUrl, - toastDescriptorOverride = R.string.link.asText(), + toastDescriptorOverride = BitwardenString.link.asText(), ) } } @@ -820,7 +820,7 @@ class SearchViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialogState = SearchState.DialogState.Loading( - message = R.string.deleting.asText(), + message = BitwardenString.deleting.asText(), ), ), awaitItem(), @@ -828,8 +828,8 @@ class SearchViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialogState = SearchState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.generic_error_message.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.generic_error_message.asText(), throwable = error, ), ), @@ -852,7 +852,7 @@ class SearchViewModelTest : BaseViewModelTest() { ), ) assertEquals( - SearchEvent.ShowSnackbar(R.string.send_deleted.asText()), + SearchEvent.ShowSnackbar(BitwardenString.send_deleted.asText()), awaitItem(), ) } @@ -892,7 +892,7 @@ class SearchViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialogState = SearchState.DialogState.Loading( - message = R.string.removing_send_password.asText(), + message = BitwardenString.removing_send_password.asText(), ), ), awaitItem(), @@ -900,8 +900,8 @@ class SearchViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialogState = SearchState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.generic_error_message.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.generic_error_message.asText(), ), ), awaitItem(), @@ -926,7 +926,7 @@ class SearchViewModelTest : BaseViewModelTest() { ), ) assertEquals( - SearchEvent.ShowSnackbar(R.string.password_removed.asText()), + SearchEvent.ShowSnackbar(BitwardenString.password_removed.asText()), awaitItem(), ) } @@ -956,7 +956,7 @@ class SearchViewModelTest : BaseViewModelTest() { verify(exactly = 1) { clipboardManager.setText( text = notes, - toastDescriptorOverride = R.string.notes.asText(), + toastDescriptorOverride = BitwardenString.notes.asText(), ) } } @@ -987,7 +987,7 @@ class SearchViewModelTest : BaseViewModelTest() { verify(exactly = 1) { clipboardManager.setText( text = cardNumber, - toastDescriptorOverride = R.string.number.asText(), + toastDescriptorOverride = BitwardenString.number.asText(), ) } } @@ -1016,7 +1016,7 @@ class SearchViewModelTest : BaseViewModelTest() { verify(exactly = 1) { clipboardManager.setText( text = code, - toastDescriptorOverride = R.string.totp.asText(), + toastDescriptorOverride = BitwardenString.totp.asText(), ) } } @@ -1075,7 +1075,7 @@ class SearchViewModelTest : BaseViewModelTest() { verify(exactly = 1) { clipboardManager.setText( text = password, - toastDescriptorOverride = R.string.password.asText(), + toastDescriptorOverride = BitwardenString.password.asText(), ) organizationEventManager.trackEvent( event = OrganizationEvent.CipherClientCopiedPassword(cipherId = cipherId), @@ -1109,7 +1109,7 @@ class SearchViewModelTest : BaseViewModelTest() { verify(exactly = 1) { clipboardManager.setText( text = securityCode, - toastDescriptorOverride = R.string.security_code.asText(), + toastDescriptorOverride = BitwardenString.security_code.asText(), ) organizationEventManager.trackEvent( event = OrganizationEvent.CipherClientCopiedCardCode(cipherId = cipherId), @@ -1133,7 +1133,7 @@ class SearchViewModelTest : BaseViewModelTest() { verify(exactly = 1) { clipboardManager.setText( text = username, - toastDescriptorOverride = R.string.username.asText(), + toastDescriptorOverride = BitwardenString.username.asText(), ) } } @@ -1422,7 +1422,7 @@ class SearchViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( viewState = SearchState.ViewState.Error( - message = R.string.generic_error_message.asText(), + message = BitwardenString.generic_error_message.asText(), ), ), viewModel.stateFlow.value, @@ -1538,11 +1538,11 @@ class SearchViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( viewState = SearchState.ViewState.Error( - message = R.string.internet_connection_required_title + message = BitwardenString.internet_connection_required_title .asText() .concat( " ".asText(), - R.string.internet_connection_required_message.asText(), + BitwardenString.internet_connection_required_message.asText(), ), ), ), @@ -1744,8 +1744,8 @@ class SearchViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialogState = SearchState.DialogState.Error( - title = R.string.decryption_error.asText(), - message = R.string.failed_to_decrypt_cipher_contact_support.asText(), + title = BitwardenString.decryption_error.asText(), + message = BitwardenString.failed_to_decrypt_cipher_contact_support.asText(), throwable = throwable, ), ), diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/search/util/SearchTypeDataExtensionsTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/search/util/SearchTypeDataExtensionsTest.kt index 08b5bf5445..bdd6ae201d 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/search/util/SearchTypeDataExtensionsTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/search/util/SearchTypeDataExtensionsTest.kt @@ -4,6 +4,7 @@ import android.net.Uri import com.bitwarden.core.data.util.toFormattedDateTimeStyle import com.bitwarden.send.SendView import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.asText import com.bitwarden.vault.CipherListView import com.bitwarden.vault.CipherListViewType @@ -12,7 +13,6 @@ import com.bitwarden.vault.CipherType import com.bitwarden.vault.CollectionView import com.bitwarden.vault.CopyableCipherFields import com.bitwarden.vault.FolderView -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockCardListView import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockCipherListView import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockLoginListView @@ -456,7 +456,7 @@ class SearchTypeDataExtensionsTest { assertEquals( SearchState.ViewState.Empty( - message = R.string.there_are_no_items_that_match_the_search.asText(), + message = BitwardenString.there_are_no_items_that_match_the_search.asText(), ), result, ) @@ -611,7 +611,7 @@ class SearchTypeDataExtensionsTest { assertEquals( SearchState.ViewState.Empty( - message = R.string.there_are_no_items_that_match_the_search.asText(), + message = BitwardenString.there_are_no_items_that_match_the_search.asText(), ), result, ) diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/search/util/SearchUtil.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/search/util/SearchUtil.kt index 5a07a938b7..0cf1105285 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/search/util/SearchUtil.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/search/util/SearchUtil.kt @@ -4,9 +4,9 @@ import androidx.annotation.DrawableRes import com.bitwarden.send.SendType import com.bitwarden.ui.platform.components.icon.model.IconData import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.asText import com.bitwarden.vault.CipherType -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.platform.feature.search.SearchState import com.x8bit.bitwarden.ui.vault.feature.itemlisting.model.ListingItemOverflowAction import kotlinx.collections.immutable.persistentListOf @@ -34,12 +34,12 @@ fun createMockDisplayItemForCipher( extraIconList = persistentListOf( IconData.Local( iconRes = BitwardenDrawable.ic_collections, - contentDescription = R.string.collections.asText(), + contentDescription = BitwardenString.collections.asText(), testTag = "CipherInCollectionIcon", ), IconData.Local( iconRes = BitwardenDrawable.ic_paperclip, - contentDescription = R.string.attachments.asText(), + contentDescription = BitwardenString.attachments.asText(), testTag = "CipherWithAttachmentsIcon", ), ), @@ -88,12 +88,12 @@ fun createMockDisplayItemForCipher( extraIconList = persistentListOf( IconData.Local( iconRes = BitwardenDrawable.ic_collections, - contentDescription = R.string.collections.asText(), + contentDescription = BitwardenString.collections.asText(), testTag = "CipherInCollectionIcon", ), IconData.Local( iconRes = BitwardenDrawable.ic_paperclip, - contentDescription = R.string.attachments.asText(), + contentDescription = BitwardenString.attachments.asText(), testTag = "CipherWithAttachmentsIcon", ), ), @@ -132,12 +132,12 @@ fun createMockDisplayItemForCipher( extraIconList = persistentListOf( IconData.Local( iconRes = BitwardenDrawable.ic_collections, - contentDescription = R.string.collections.asText(), + contentDescription = BitwardenString.collections.asText(), testTag = "CipherInCollectionIcon", ), IconData.Local( iconRes = BitwardenDrawable.ic_paperclip, - contentDescription = R.string.attachments.asText(), + contentDescription = BitwardenString.attachments.asText(), testTag = "CipherWithAttachmentsIcon", ), ), @@ -180,12 +180,12 @@ fun createMockDisplayItemForCipher( extraIconList = persistentListOf( IconData.Local( iconRes = BitwardenDrawable.ic_collections, - contentDescription = R.string.collections.asText(), + contentDescription = BitwardenString.collections.asText(), testTag = "CipherInCollectionIcon", ), IconData.Local( iconRes = BitwardenDrawable.ic_paperclip, - contentDescription = R.string.attachments.asText(), + contentDescription = BitwardenString.attachments.asText(), testTag = "CipherWithAttachmentsIcon", ), ), @@ -220,7 +220,7 @@ fun createMockDisplayItemForCipher( extraIconList = persistentListOf( IconData.Local( iconRes = BitwardenDrawable.ic_collections, - contentDescription = R.string.collections.asText(), + contentDescription = BitwardenString.collections.asText(), testTag = "CipherInCollectionIcon", ), ), @@ -265,12 +265,12 @@ fun createMockDisplayItemForSend( extraIconList = persistentListOf( IconData.Local( iconRes = BitwardenDrawable.ic_key, - contentDescription = R.string.password.asText(), + contentDescription = BitwardenString.password.asText(), testTag = "PasswordProtectedSendIcon", ), IconData.Local( iconRes = BitwardenDrawable.ic_send_max_access_count_reached, - contentDescription = R.string.maximum_access_count_reached.asText(), + contentDescription = BitwardenString.maximum_access_count_reached.asText(), testTag = "MaxAccessSendIcon", ), ), @@ -311,12 +311,12 @@ fun createMockDisplayItemForSend( extraIconList = persistentListOf( IconData.Local( iconRes = BitwardenDrawable.ic_key, - contentDescription = R.string.password.asText(), + contentDescription = BitwardenString.password.asText(), testTag = "PasswordProtectedSendIcon", ), IconData.Local( iconRes = BitwardenDrawable.ic_send_max_access_count_reached, - contentDescription = R.string.maximum_access_count_reached.asText(), + contentDescription = BitwardenString.maximum_access_count_reached.asText(), testTag = "MaxAccessSendIcon", ), ), diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/about/util/FlightRecorderDataSetExtensionsTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/about/util/FlightRecorderDataSetExtensionsTest.kt index 58ecc0335b..70b364c082 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/about/util/FlightRecorderDataSetExtensionsTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/about/util/FlightRecorderDataSetExtensionsTest.kt @@ -1,7 +1,7 @@ package com.x8bit.bitwarden.ui.platform.feature.settings.about.util +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.platform.datasource.disk.model.FlightRecorderDataSet import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Test @@ -46,7 +46,7 @@ class FlightRecorderDataSetExtensionsTest { ), ) val result = dataset.getStopsLoggingStringForActiveLog(clock = FIXED_CLOCK) - assertEquals(R.string.stops_logging_on.asText("1/21/70", "4:27 AM"), result) + assertEquals(BitwardenString.stops_logging_on.asText("1/21/70", "4:27 AM"), result) } } diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/AccountSecurityViewModelTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/AccountSecurityViewModelTest.kt index 7a4f02110a..9a959d6320 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/AccountSecurityViewModelTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/AccountSecurityViewModelTest.kt @@ -11,8 +11,8 @@ import com.bitwarden.network.model.PolicyTypeJson import com.bitwarden.network.model.SyncResponseJson.Policy import com.bitwarden.network.model.createMockPolicy import com.bitwarden.ui.platform.base.BaseViewModelTest +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.auth.datasource.disk.model.OnboardingStatus import com.x8bit.bitwarden.data.auth.repository.AuthRepository import com.x8bit.bitwarden.data.auth.repository.model.LogoutReason @@ -516,8 +516,8 @@ class AccountSecurityViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialog = AccountSecurityDialog.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.generic_error_message.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.generic_error_message.asText(), ), ), viewModel.stateFlow.value, @@ -594,7 +594,7 @@ class AccountSecurityViewModelTest : BaseViewModelTest() { ) assertEquals( DEFAULT_STATE.copy( - dialog = AccountSecurityDialog.Loading(R.string.saving.asText()), + dialog = AccountSecurityDialog.Loading(BitwardenString.saving.asText()), isUnlockWithBiometricsEnabled = true, ), awaitItem(), @@ -628,7 +628,7 @@ class AccountSecurityViewModelTest : BaseViewModelTest() { ) assertEquals( DEFAULT_STATE.copy( - dialog = AccountSecurityDialog.Loading(R.string.saving.asText()), + dialog = AccountSecurityDialog.Loading(BitwardenString.saving.asText()), isUnlockWithBiometricsEnabled = true, ), awaitItem(), diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/deleteaccount/DeleteAccountViewModelTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/deleteaccount/DeleteAccountViewModelTest.kt index 9f512cb381..3838d7aca8 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/deleteaccount/DeleteAccountViewModelTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/deleteaccount/DeleteAccountViewModelTest.kt @@ -4,8 +4,8 @@ import androidx.lifecycle.SavedStateHandle import app.cash.turbine.test import com.bitwarden.data.repository.model.Environment import com.bitwarden.ui.platform.base.BaseViewModelTest +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.auth.datasource.disk.model.OnboardingStatus import com.x8bit.bitwarden.data.auth.repository.AuthRepository import com.x8bit.bitwarden.data.auth.repository.model.DeleteAccountResult @@ -144,7 +144,7 @@ class DeleteAccountViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialog = DeleteAccountState.DeleteAccountDialog.Error( - message = R.string.generic_error_message.asText(), + message = BitwardenString.generic_error_message.asText(), error = error, ), ), @@ -172,7 +172,7 @@ class DeleteAccountViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialog = DeleteAccountState.DeleteAccountDialog.Error( - message = R.string.invalid_master_password.asText(), + message = BitwardenString.invalid_master_password.asText(), ), ), viewModel.stateFlow.value, diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/deleteaccountconfirmation/DeleteAccountConfirmationViewModelTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/deleteaccountconfirmation/DeleteAccountConfirmationViewModelTest.kt index cc19c8c5a7..4c11c8de41 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/deleteaccountconfirmation/DeleteAccountConfirmationViewModelTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/deleteaccountconfirmation/DeleteAccountConfirmationViewModelTest.kt @@ -3,8 +3,8 @@ package com.x8bit.bitwarden.ui.platform.feature.settings.accountsecurity.deletea import androidx.lifecycle.SavedStateHandle import app.cash.turbine.test import com.bitwarden.ui.platform.base.BaseViewModelTest +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.auth.repository.AuthRepository import com.x8bit.bitwarden.data.auth.repository.model.DeleteAccountResult import com.x8bit.bitwarden.data.auth.repository.model.RequestOtpResult @@ -202,7 +202,7 @@ class DeleteAccountConfirmationViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialog = DeleteAccountConfirmationState.DeleteAccountConfirmationDialog.Error( - message = R.string.generic_error_message.asText(), + message = BitwardenString.generic_error_message.asText(), error = error, ), ), diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/loginapproval/LoginApprovalViewModelTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/loginapproval/LoginApprovalViewModelTest.kt index a56ef4992e..aa9240cad6 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/loginapproval/LoginApprovalViewModelTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/loginapproval/LoginApprovalViewModelTest.kt @@ -6,8 +6,8 @@ import com.bitwarden.core.data.manager.toast.ToastManager import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow import com.bitwarden.data.repository.model.Environment import com.bitwarden.ui.platform.base.BaseViewModelTest +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.auth.datasource.disk.model.OnboardingStatus import com.x8bit.bitwarden.data.auth.manager.model.AuthRequest import com.x8bit.bitwarden.data.auth.manager.model.AuthRequestResult @@ -135,7 +135,7 @@ class LoginApprovalViewModelTest : BaseViewModelTest() { requestId = "", viewState = LoginApprovalState.ViewState.Loading, dialogState = LoginApprovalState.DialogState.ChangeAccount( - message = R.string.login_attempt_from_x_do_you_want_to_switch_to_this_account + message = BitwardenString.login_attempt_from_x_do_you_want_to_switch_to_this_account .asText(EMAIL_2), ), ), @@ -159,7 +159,7 @@ class LoginApprovalViewModelTest : BaseViewModelTest() { state = DEFAULT_STATE.copy( specialCircumstance = specialCircumstance, dialogState = LoginApprovalState.DialogState.ChangeAccount( - message = R.string.login_attempt_from_x_do_you_want_to_switch_to_this_account + message = BitwardenString.login_attempt_from_x_do_you_want_to_switch_to_this_account .asText(EMAIL_2), ), ), @@ -287,7 +287,7 @@ class LoginApprovalViewModelTest : BaseViewModelTest() { verify { snackbarRelayManager.sendSnackbarData( - data = BitwardenSnackbarData(message = R.string.login_approved.asText()), + data = BitwardenSnackbarData(message = BitwardenString.login_approved.asText()), relay = SnackbarRelay.LOGIN_APPROVAL, ) } @@ -334,7 +334,7 @@ class LoginApprovalViewModelTest : BaseViewModelTest() { assertEquals(LoginApprovalEvent.ExitApp, awaitItem()) } verify { - toastManager.show(messageId = R.string.login_approved) + toastManager.show(messageId = BitwardenString.login_approved) } } @@ -356,7 +356,7 @@ class LoginApprovalViewModelTest : BaseViewModelTest() { } verify { snackbarRelayManager.sendSnackbarData( - data = BitwardenSnackbarData(message = R.string.log_in_denied.asText()), + data = BitwardenSnackbarData(message = BitwardenString.log_in_denied.asText()), relay = SnackbarRelay.LOGIN_APPROVAL, ) } @@ -403,7 +403,7 @@ class LoginApprovalViewModelTest : BaseViewModelTest() { assertEquals(LoginApprovalEvent.ExitApp, awaitItem()) } verify { - toastManager.show(messageId = R.string.log_in_denied) + toastManager.show(messageId = BitwardenString.log_in_denied) } } @@ -425,8 +425,8 @@ class LoginApprovalViewModelTest : BaseViewModelTest() { viewModel.stateFlow.value, DEFAULT_STATE.copy( dialogState = LoginApprovalState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.generic_error_message.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.generic_error_message.asText(), error = error, ), ), diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/autofill/privilegedapps/list/PrivilegedAppsListViewModelTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/autofill/privilegedapps/list/PrivilegedAppsListViewModelTest.kt index c91823143d..1ab25d641e 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/autofill/privilegedapps/list/PrivilegedAppsListViewModelTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/autofill/privilegedapps/list/PrivilegedAppsListViewModelTest.kt @@ -5,8 +5,8 @@ import app.cash.turbine.test import com.bitwarden.core.data.repository.model.DataState import com.bitwarden.data.manager.BitwardenPackageManager import com.bitwarden.ui.platform.base.BaseViewModelTest +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.credentials.model.PrivilegedAppAllowListJson import com.x8bit.bitwarden.data.credentials.repository.PrivilegedAppRepository import com.x8bit.bitwarden.data.credentials.repository.model.PrivilegedAppData @@ -251,7 +251,7 @@ class PrivilegedAppsListViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialogState = PrivilegedAppsListState.DialogState.General( - message = R.string.generic_error_message.asText(), + message = BitwardenString.generic_error_message.asText(), ), ), viewModel.stateFlow.value, diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/autofill/util/UriMatchTypeExtensionsTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/autofill/util/UriMatchTypeExtensionsTest.kt index db17c9ebf1..adb38d6b64 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/autofill/util/UriMatchTypeExtensionsTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/autofill/util/UriMatchTypeExtensionsTest.kt @@ -1,7 +1,7 @@ package com.x8bit.bitwarden.ui.platform.feature.settings.autofill.util +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.platform.repository.model.UriMatchType import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Test @@ -10,12 +10,12 @@ class UriMatchTypeExtensionsTest { @Test fun `displayLabel should return the correct value for each type`() { mapOf( - UriMatchType.DOMAIN to R.string.base_domain.asText(), - UriMatchType.HOST to R.string.host.asText(), - UriMatchType.STARTS_WITH to R.string.starts_with.asText(), - UriMatchType.REGULAR_EXPRESSION to R.string.reg_ex.asText(), - UriMatchType.EXACT to R.string.exact.asText(), - UriMatchType.NEVER to R.string.never.asText(), + UriMatchType.DOMAIN to BitwardenString.base_domain.asText(), + UriMatchType.HOST to BitwardenString.host.asText(), + UriMatchType.STARTS_WITH to BitwardenString.starts_with.asText(), + UriMatchType.REGULAR_EXPRESSION to BitwardenString.reg_ex.asText(), + UriMatchType.EXACT to BitwardenString.exact.asText(), + UriMatchType.NEVER to BitwardenString.never.asText(), ) .forEach { (type, label) -> assertEquals( diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/exportvault/ExportVaultViewModelTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/exportvault/ExportVaultViewModelTest.kt index 4ddb129e24..ec7329ce32 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/exportvault/ExportVaultViewModelTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/exportvault/ExportVaultViewModelTest.kt @@ -8,9 +8,9 @@ import com.bitwarden.exporters.ExportFormat import com.bitwarden.network.model.PolicyTypeJson import com.bitwarden.network.model.createMockPolicy import com.bitwarden.ui.platform.base.BaseViewModelTest +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.asText import com.bitwarden.vault.CipherType -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.auth.datasource.disk.model.OnboardingStatus import com.x8bit.bitwarden.data.auth.datasource.sdk.model.PasswordStrength import com.x8bit.bitwarden.data.auth.repository.AuthRepository @@ -238,8 +238,8 @@ class ExportVaultViewModelTest : BaseViewModelTest() { assertEquals( initialState.copy( dialogState = ExportVaultState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.generic_error_message.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.generic_error_message.asText(), error = error, ), ), @@ -304,9 +304,9 @@ class ExportVaultViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialogState = ExportVaultState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.validation_field_required.asText( - R.string.master_password.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.validation_field_required.asText( + BitwardenString.master_password.asText(), ), ), ), @@ -333,9 +333,9 @@ class ExportVaultViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialogState = ExportVaultState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.validation_field_required.asText( - R.string.file_password.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.validation_field_required.asText( + BitwardenString.file_password.asText(), ), ), exportFormat = ExportVaultFormat.JSON_ENCRYPTED, @@ -375,9 +375,9 @@ class ExportVaultViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialogState = ExportVaultState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.validation_field_required.asText( - R.string.confirm_file_password.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.validation_field_required.asText( + BitwardenString.confirm_file_password.asText(), ), ), exportFormat = ExportVaultFormat.JSON_ENCRYPTED, @@ -425,8 +425,8 @@ class ExportVaultViewModelTest : BaseViewModelTest() { assertEquals( initialState.copy( dialogState = ExportVaultState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.master_password_confirmation_val_message.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.master_password_confirmation_val_message.asText(), ), ), viewModel.stateFlow.value, @@ -449,8 +449,8 @@ class ExportVaultViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialogState = ExportVaultState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.invalid_master_password.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.invalid_master_password.asText(), ), passwordInput = password, ), @@ -480,8 +480,8 @@ class ExportVaultViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialogState = ExportVaultState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.generic_error_message.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.generic_error_message.asText(), error = error, ), passwordInput = password, @@ -570,14 +570,14 @@ class ExportVaultViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialogState = ExportVaultState.DialogState.Loading( - message = R.string.sending.asText(), + message = BitwardenString.sending.asText(), ), ), stateTurbine.awaitItem(), ) assertEquals(DEFAULT_STATE, stateTurbine.awaitItem()) assertEquals( - ExportVaultEvent.ShowSnackbar(message = R.string.code_sent.asText()), + ExportVaultEvent.ShowSnackbar(message = BitwardenString.code_sent.asText()), eventTurbine.awaitItem(), ) } @@ -599,7 +599,7 @@ class ExportVaultViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialogState = ExportVaultState.DialogState.Loading( - message = R.string.sending.asText(), + message = BitwardenString.sending.asText(), ), ), stateTurbine.awaitItem(), @@ -607,7 +607,7 @@ class ExportVaultViewModelTest : BaseViewModelTest() { assertEquals(DEFAULT_STATE, stateTurbine.awaitItem()) assertEquals( ExportVaultEvent.ShowSnackbar( - message = R.string.generic_error_message.asText(), + message = BitwardenString.generic_error_message.asText(), ), eventTurbine.awaitItem(), ) @@ -628,8 +628,8 @@ class ExportVaultViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialogState = ExportVaultState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.export_vault_failure.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.export_vault_failure.asText(), error = error, ), ), @@ -752,8 +752,8 @@ class ExportVaultViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialogState = ExportVaultState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.export_vault_failure.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.export_vault_failure.asText(), ), ), viewModel.stateFlow.value, @@ -783,8 +783,8 @@ class ExportVaultViewModelTest : BaseViewModelTest() { DEFAULT_STATE.copy( exportData = exportData, dialogState = ExportVaultState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.export_vault_failure.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.export_vault_failure.asText(), ), ), viewModel.stateFlow.value, @@ -808,7 +808,7 @@ class ExportVaultViewModelTest : BaseViewModelTest() { coVerify { fileManager.stringToUri(fileUri = any(), dataString = exportData) } assertEquals( - ExportVaultEvent.ShowSnackbar(R.string.export_vault_success.asText()), + ExportVaultEvent.ShowSnackbar(BitwardenString.export_vault_success.asText()), awaitItem(), ) } diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/flightrecorder/recordedlogs/RecordedLogsScreenTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/flightrecorder/recordedlogs/RecordedLogsScreenTest.kt index f6d74a3bd8..023b83ab16 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/flightrecorder/recordedlogs/RecordedLogsScreenTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/flightrecorder/recordedlogs/RecordedLogsScreenTest.kt @@ -16,10 +16,10 @@ import androidx.compose.ui.test.performClick import androidx.compose.ui.test.performScrollTo import androidx.core.net.toUri import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.asText import com.bitwarden.ui.util.assertNoDialogExists import com.bitwarden.ui.util.isProgressBar -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.platform.base.BitwardenComposeTest import com.x8bit.bitwarden.ui.platform.feature.settings.flightrecorder.recordedLogs.RecordedLogsAction import com.x8bit.bitwarden.ui.platform.feature.settings.flightrecorder.recordedLogs.RecordedLogsEvent @@ -124,7 +124,7 @@ class RecordedLogsScreenTest : BitwardenComposeTest() { id = "52", title = "2025-04-12T03:15:00 – 2025-04-12T04:15:00".asText(), subtextStart = "1.00 KB".asText(), - subtextEnd = R.string.expires_on.asText("4/12/25"), + subtextEnd = BitwardenString.expires_on.asText("4/12/25"), isDeletedEnabled = true, ), ), diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/flightrecorder/recordedlogs/RecordedLogsViewModelTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/flightrecorder/recordedlogs/RecordedLogsViewModelTest.kt index 2e80428d89..2b9a3d7eb3 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/flightrecorder/recordedlogs/RecordedLogsViewModelTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/flightrecorder/recordedlogs/RecordedLogsViewModelTest.kt @@ -4,8 +4,8 @@ import android.net.Uri import androidx.lifecycle.SavedStateHandle import app.cash.turbine.test import com.bitwarden.ui.platform.base.BaseViewModelTest +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.platform.datasource.disk.model.FlightRecorderDataSet import com.x8bit.bitwarden.data.platform.repository.SettingsRepository import com.x8bit.bitwarden.data.vault.manager.FileManager @@ -128,8 +128,8 @@ class RecordedLogsViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialogState = RecordedLogsState.DialogState.Error( - title = R.string.unable_to_share.asText(), - message = R.string.please_try_again_or_select_a_different_log.asText(), + title = BitwardenString.unable_to_share.asText(), + message = BitwardenString.please_try_again_or_select_a_different_log.asText(), error = error, ), ), @@ -151,8 +151,8 @@ class RecordedLogsViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialogState = RecordedLogsState.DialogState.Error( - title = R.string.unable_to_share.asText(), - message = R.string.the_log_file_you_are_trying_to_share_has_been_removed + title = BitwardenString.unable_to_share.asText(), + message = BitwardenString.the_log_file_you_are_trying_to_share_has_been_removed .asText(), error = null, ), @@ -212,8 +212,8 @@ class RecordedLogsViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialogState = RecordedLogsState.DialogState.Error( - title = R.string.unable_to_share.asText(), - message = R.string.please_try_again_or_select_a_different_log.asText(), + title = BitwardenString.unable_to_share.asText(), + message = BitwardenString.please_try_again_or_select_a_different_log.asText(), error = error, ), ), @@ -243,8 +243,8 @@ class RecordedLogsViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialogState = RecordedLogsState.DialogState.Error( - title = R.string.unable_to_share.asText(), - message = R.string.the_log_file_you_are_trying_to_share_has_been_removed + title = BitwardenString.unable_to_share.asText(), + message = BitwardenString.the_log_file_you_are_trying_to_share_has_been_removed .asText(), error = null, ), @@ -262,7 +262,7 @@ class RecordedLogsViewModelTest : BaseViewModelTest() { viewModel.eventFlow.test { viewModel.trySendAction(RecordedLogsAction.DeleteAllClick) assertEquals( - RecordedLogsEvent.ShowSnackbar(R.string.all_logs_deleted.asText()), + RecordedLogsEvent.ShowSnackbar(BitwardenString.all_logs_deleted.asText()), awaitItem(), ) } @@ -285,7 +285,7 @@ class RecordedLogsViewModelTest : BaseViewModelTest() { viewModel.eventFlow.test { viewModel.trySendAction(RecordedLogsAction.DeleteClick(item = item)) assertEquals( - RecordedLogsEvent.ShowSnackbar(R.string.log_deleted.asText()), + RecordedLogsEvent.ShowSnackbar(BitwardenString.log_deleted.asText()), awaitItem(), ) } diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/flightrecorder/recordedlogs/util/FlightRecorderDataSetExtensionsTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/flightrecorder/recordedlogs/util/FlightRecorderDataSetExtensionsTest.kt index 16ca80dcef..bd80f315aa 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/flightrecorder/recordedlogs/util/FlightRecorderDataSetExtensionsTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/flightrecorder/recordedlogs/util/FlightRecorderDataSetExtensionsTest.kt @@ -1,7 +1,7 @@ package com.x8bit.bitwarden.ui.platform.feature.settings.flightrecorder.recordedlogs.util +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.platform.datasource.disk.model.FlightRecorderDataSet import com.x8bit.bitwarden.data.platform.util.fileOf import com.x8bit.bitwarden.ui.platform.feature.settings.flightrecorder.recordedLogs.RecordedLogsState @@ -117,21 +117,21 @@ class FlightRecorderDataSetExtensionsTest { id = "52", title = "2025-04-12T08:15:00 – 2025-04-12T09:15:00".asText(), subtextStart = "1.00 KB".asText(), - subtextEnd = R.string.expires_on.asText("5/11/25"), + subtextEnd = BitwardenString.expires_on.asText("5/11/25"), isDeletedEnabled = true, ), RecordedLogsState.DisplayItem( id = "51", title = "2015-10-10T02:55:52 – 2015-10-10T03:55:52".asText(), subtextStart = "1.00 KB".asText(), - subtextEnd = R.string.expires_at.asText("10:15 PM"), + subtextEnd = BitwardenString.expires_at.asText("10:15 PM"), isDeletedEnabled = true, ), RecordedLogsState.DisplayItem( id = "53", title = "2015-10-10T02:55:52 – 2015-10-10T03:55:52".asText(), subtextStart = "1.00 KB".asText(), - subtextEnd = R.string.expires_tomorrow.asText(), + subtextEnd = BitwardenString.expires_tomorrow.asText(), isDeletedEnabled = true, ), ), diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/flightrecorder/util/FlightRecorderDurationTests.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/flightrecorder/util/FlightRecorderDurationTests.kt index dde59b5c70..8dc38419b8 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/flightrecorder/util/FlightRecorderDurationTests.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/flightrecorder/util/FlightRecorderDurationTests.kt @@ -1,7 +1,7 @@ package com.x8bit.bitwarden.ui.platform.feature.settings.flightrecorder.util +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.platform.repository.model.FlightRecorderDuration import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Test @@ -10,11 +10,12 @@ class FlightRecorderDurationTests { @Test fun `displayText should return appropriate text`() { mapOf( - FlightRecorderDuration.ONE_HOUR to R.string.flight_recorder_one_hour.asText(), - FlightRecorderDuration.EIGHT_HOURS to R.string.flight_recorder_eight_hours.asText(), + FlightRecorderDuration.ONE_HOUR to BitwardenString.flight_recorder_one_hour.asText(), + FlightRecorderDuration.EIGHT_HOURS to + BitwardenString.flight_recorder_eight_hours.asText(), FlightRecorderDuration.TWENTY_FOUR_HOURS to - R.string.flight_recorder_twenty_four_hours.asText(), - FlightRecorderDuration.ONE_WEEK to R.string.flight_recorder_one_week.asText(), + BitwardenString.flight_recorder_twenty_four_hours.asText(), + FlightRecorderDuration.ONE_WEEK to BitwardenString.flight_recorder_one_week.asText(), ) .forEach { assertEquals(it.value, it.key.displayText) diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/folders/FoldersViewModelTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/folders/FoldersViewModelTest.kt index d2a7b33e10..92f4a3d6e6 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/folders/FoldersViewModelTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/folders/FoldersViewModelTest.kt @@ -4,10 +4,10 @@ import app.cash.turbine.test import com.bitwarden.core.DateTime import com.bitwarden.core.data.repository.model.DataState import com.bitwarden.ui.platform.base.BaseViewModelTest +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.asText import com.bitwarden.ui.util.concat import com.bitwarden.vault.FolderView -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.vault.repository.VaultRepository import com.x8bit.bitwarden.ui.platform.feature.settings.folders.model.FolderDisplayItem import io.mockk.every @@ -74,7 +74,7 @@ class FoldersViewModelTest : BaseViewModelTest() { assertEquals( createFolderState( viewState = FoldersState.ViewState.Error( - R.string.generic_error_message.asText(), + BitwardenString.generic_error_message.asText(), ), ), viewModel.stateFlow.value, @@ -127,11 +127,11 @@ class FoldersViewModelTest : BaseViewModelTest() { assertEquals( createFolderState( viewState = FoldersState.ViewState.Error( - R.string.internet_connection_required_title + BitwardenString.internet_connection_required_title .asText() .concat( " ".asText(), - R.string.internet_connection_required_message.asText(), + BitwardenString.internet_connection_required_message.asText(), ), ), ), diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/folders/addedit/FolderAddEditViewModelTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/folders/addedit/FolderAddEditViewModelTest.kt index 7fecf366bc..ad086fe3c3 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/folders/addedit/FolderAddEditViewModelTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/folders/addedit/FolderAddEditViewModelTest.kt @@ -5,10 +5,10 @@ import app.cash.turbine.test import com.bitwarden.core.DateTime import com.bitwarden.core.data.repository.model.DataState import com.bitwarden.ui.platform.base.BaseViewModelTest +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.asText import com.bitwarden.ui.util.concat import com.bitwarden.vault.FolderView -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.vault.repository.VaultRepository import com.x8bit.bitwarden.data.vault.repository.model.CreateFolderResult import com.x8bit.bitwarden.data.vault.repository.model.DeleteFolderResult @@ -126,7 +126,7 @@ class FolderAddEditViewModelTest : BaseViewModelTest() { viewModel.eventFlow.test { assertEquals( - FolderAddEditEvent.ShowToast(R.string.folder_deleted.asText()), + FolderAddEditEvent.ShowToast(BitwardenString.folder_deleted.asText()), awaitItem(), ) assertEquals( @@ -143,7 +143,7 @@ class FolderAddEditViewModelTest : BaseViewModelTest() { val stateWithDialog = FolderAddEditState( folderAddEditType = FolderAddEditType.EditItem((DEFAULT_EDIT_ITEM_ID)), dialog = FolderAddEditState.DialogState.Loading( - R.string.deleting.asText(), + BitwardenString.deleting.asText(), ), viewState = FolderAddEditState.ViewState.Content( folderName = DEFAULT_FOLDER_NAME, @@ -190,7 +190,7 @@ class FolderAddEditViewModelTest : BaseViewModelTest() { folderAddEditType = FolderAddEditType.AddItem, dialog = null, viewState = FolderAddEditState.ViewState.Error( - R.string.generic_error_message.asText(), + BitwardenString.generic_error_message.asText(), ), parentFolderName = null, ) @@ -215,7 +215,7 @@ class FolderAddEditViewModelTest : BaseViewModelTest() { val stateWithDialog = FolderAddEditState( folderAddEditType = FolderAddEditType.EditItem((DEFAULT_EDIT_ITEM_ID)), dialog = FolderAddEditState.DialogState.Error( - R.string.generic_error_message.asText(), + BitwardenString.generic_error_message.asText(), throwable = error, ), viewState = FolderAddEditState.ViewState.Content( @@ -269,8 +269,8 @@ class FolderAddEditViewModelTest : BaseViewModelTest() { val stateWithDialog = stateWithoutName.copy( dialog = FolderAddEditState.DialogState.Error( - R.string.validation_field_required - .asText(R.string.name.asText()), + BitwardenString.validation_field_required + .asText(BitwardenString.name.asText()), ), ) @@ -294,7 +294,7 @@ class FolderAddEditViewModelTest : BaseViewModelTest() { val stateWithDialog = FolderAddEditState( folderAddEditType = FolderAddEditType.AddItem, dialog = FolderAddEditState.DialogState.Loading( - R.string.saving.asText(), + BitwardenString.saving.asText(), ), viewState = FolderAddEditState.ViewState.Content( folderName = DEFAULT_FOLDER_NAME, @@ -428,7 +428,7 @@ class FolderAddEditViewModelTest : BaseViewModelTest() { assertEquals( state.copy( dialog = FolderAddEditState.DialogState.Error( - R.string.generic_error_message.asText(), + BitwardenString.generic_error_message.asText(), throwable = error, ), ), @@ -442,7 +442,7 @@ class FolderAddEditViewModelTest : BaseViewModelTest() { val stateWithDialog = FolderAddEditState( folderAddEditType = FolderAddEditType.EditItem(DEFAULT_EDIT_ITEM_ID), dialog = FolderAddEditState.DialogState.Loading( - R.string.saving.asText(), + BitwardenString.saving.asText(), ), viewState = FolderAddEditState.ViewState.Content( folderName = DEFAULT_FOLDER_NAME, @@ -521,7 +521,7 @@ class FolderAddEditViewModelTest : BaseViewModelTest() { assertEquals( state.copy( dialog = FolderAddEditState.DialogState.Error( - message = R.string.generic_error_message.asText(), + message = BitwardenString.generic_error_message.asText(), throwable = error, ), ), @@ -584,7 +584,7 @@ class FolderAddEditViewModelTest : BaseViewModelTest() { DEFAULT_STATE.copy( folderAddEditType = FolderAddEditType.EditItem(DEFAULT_EDIT_ITEM_ID), viewState = FolderAddEditState.ViewState.Error( - R.string.generic_error_message.asText(), + BitwardenString.generic_error_message.asText(), ), ), viewModel.stateFlow.value, @@ -636,7 +636,7 @@ class FolderAddEditViewModelTest : BaseViewModelTest() { DEFAULT_STATE.copy( folderAddEditType = FolderAddEditType.EditItem(DEFAULT_EDIT_ITEM_ID), viewState = FolderAddEditState.ViewState.Error( - message = R.string.generic_error_message.asText(), + message = BitwardenString.generic_error_message.asText(), ), ), viewModel.stateFlow.value, @@ -677,11 +677,11 @@ class FolderAddEditViewModelTest : BaseViewModelTest() { DEFAULT_STATE.copy( folderAddEditType = FolderAddEditType.EditItem(DEFAULT_EDIT_ITEM_ID), viewState = FolderAddEditState.ViewState.Error( - R.string.internet_connection_required_title + BitwardenString.internet_connection_required_title .asText() .concat( " ".asText(), - R.string.internet_connection_required_message.asText(), + BitwardenString.internet_connection_required_message.asText(), ), ), ), @@ -735,7 +735,7 @@ class FolderAddEditViewModelTest : BaseViewModelTest() { DEFAULT_STATE.copy( folderAddEditType = FolderAddEditType.EditItem(DEFAULT_EDIT_ITEM_ID), viewState = FolderAddEditState.ViewState.Error( - message = R.string.generic_error_message.asText(), + message = BitwardenString.generic_error_message.asText(), ), ), viewModel.stateFlow.value, diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/other/OtherViewModelTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/other/OtherViewModelTest.kt index 16d14a8aa5..d38ffe0c59 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/other/OtherViewModelTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/other/OtherViewModelTest.kt @@ -3,8 +3,8 @@ package com.x8bit.bitwarden.ui.platform.feature.settings.other import androidx.lifecycle.SavedStateHandle import app.cash.turbine.test import com.bitwarden.ui.platform.base.BaseViewModelTest +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.platform.manager.network.NetworkConnectionManager import com.x8bit.bitwarden.data.platform.repository.SettingsRepository import com.x8bit.bitwarden.data.platform.repository.model.ClearClipboardFrequency @@ -175,7 +175,7 @@ class OtherViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialogState = OtherState.DialogState.Loading( - message = R.string.syncing.asText(), + message = BitwardenString.syncing.asText(), ), ), awaitItem(), @@ -191,7 +191,7 @@ class OtherViewModelTest : BaseViewModelTest() { viewModel.eventFlow.test { mutableVaultLastSyncStateFlow.tryEmit(newSyncTime) assertEquals( - OtherEvent.ShowSnackbar(R.string.syncing_complete.asText()), + OtherEvent.ShowSnackbar(BitwardenString.syncing_complete.asText()), awaitItem(), ) } @@ -207,8 +207,8 @@ class OtherViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialogState = OtherState.DialogState.Error( - title = R.string.internet_connection_required_title.asText(), - message = R.string.internet_connection_required_message.asText(), + title = BitwardenString.internet_connection_required_title.asText(), + message = BitwardenString.internet_connection_required_message.asText(), ), ), awaitItem(), diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/vaultunlockednavbar/VaultUnlockedNavBarScreenTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/vaultunlockednavbar/VaultUnlockedNavBarScreenTest.kt index 83d7a60672..083773e877 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/vaultunlockednavbar/VaultUnlockedNavBarScreenTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/vaultunlockednavbar/VaultUnlockedNavBarScreenTest.kt @@ -5,7 +5,7 @@ import androidx.compose.ui.test.performClick import androidx.navigation.navOptions import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow import com.bitwarden.ui.platform.base.createMockNavHostController -import com.x8bit.bitwarden.R +import com.bitwarden.ui.platform.resource.BitwardenString import com.x8bit.bitwarden.ui.platform.base.BitwardenComposeTest import com.x8bit.bitwarden.ui.platform.feature.settings.SettingsGraphRoute import com.x8bit.bitwarden.ui.tools.feature.generator.GeneratorGraphRoute @@ -77,8 +77,8 @@ class VaultUnlockedNavBarScreenTest : BitwardenComposeTest() { fun `NavigateToVaultScreen should navigate to VaultScreen`() { mutableEventFlow.tryEmit( VaultUnlockedNavBarEvent.NavigateToVaultScreen( - labelRes = R.string.my_vault, - contentDescRes = R.string.my_vault, + labelRes = BitwardenString.my_vault, + contentDescRes = BitwardenString.my_vault, ), ) composeTestRule.runOnIdle { @@ -95,8 +95,8 @@ class VaultUnlockedNavBarScreenTest : BitwardenComposeTest() { fun `NavigateToVaultScreen shortcut event should navigate to VaultScreen`() { mutableEventFlow.tryEmit( VaultUnlockedNavBarEvent.Shortcut.NavigateToVaultScreen( - labelRes = R.string.my_vault, - contentDescRes = R.string.my_vault, + labelRes = BitwardenString.my_vault, + contentDescRes = BitwardenString.my_vault, ), ) composeTestRule.runOnIdle { @@ -189,8 +189,8 @@ class VaultUnlockedNavBarScreenTest : BitwardenComposeTest() { mutableStateFlow.tryEmit( VaultUnlockedNavBarState( - vaultNavBarLabelRes = R.string.vaults, - vaultNavBarContentDescriptionRes = R.string.vaults, + vaultNavBarLabelRes = BitwardenString.vaults, + vaultNavBarContentDescriptionRes = BitwardenString.vaults, notificationState = VaultUnlockedNavBarNotificationState( settingsTabNotificationCount = 0, ), @@ -229,8 +229,8 @@ class VaultUnlockedNavBarScreenTest : BitwardenComposeTest() { } private val DEFAULT_STATE = VaultUnlockedNavBarState( - vaultNavBarLabelRes = R.string.my_vault, - vaultNavBarContentDescriptionRes = R.string.my_vault, + vaultNavBarLabelRes = BitwardenString.my_vault, + vaultNavBarContentDescriptionRes = BitwardenString.my_vault, notificationState = VaultUnlockedNavBarNotificationState( settingsTabNotificationCount = 0, ), diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/vaultunlockednavbar/VaultUnlockedNavBarViewModelTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/vaultunlockednavbar/VaultUnlockedNavBarViewModelTest.kt index d1c024fac2..b7239e103f 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/vaultunlockednavbar/VaultUnlockedNavBarViewModelTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/vaultunlockednavbar/VaultUnlockedNavBarViewModelTest.kt @@ -2,7 +2,7 @@ package com.x8bit.bitwarden.ui.platform.feature.vaultunlockednavbar import app.cash.turbine.test import com.bitwarden.ui.platform.base.BaseViewModelTest -import com.x8bit.bitwarden.R +import com.bitwarden.ui.platform.resource.BitwardenString import com.x8bit.bitwarden.data.auth.repository.AuthRepository import com.x8bit.bitwarden.data.auth.repository.model.UserState import com.x8bit.bitwarden.data.platform.manager.FirstTimeActionManager @@ -68,8 +68,8 @@ class VaultUnlockedNavBarViewModelTest : BaseViewModelTest() { viewModel.eventFlow.test { assertEquals( VaultUnlockedNavBarEvent.Shortcut.NavigateToVaultScreen( - labelRes = R.string.my_vault, - contentDescRes = R.string.my_vault, + labelRes = BitwardenString.my_vault, + contentDescRes = BitwardenString.my_vault, ), awaitItem(), ) @@ -126,8 +126,8 @@ class VaultUnlockedNavBarViewModelTest : BaseViewModelTest() { every { organizations } returns listOf(mockk()) } val expectedWithOrganizations = VaultUnlockedNavBarState( - vaultNavBarLabelRes = R.string.vaults, - vaultNavBarContentDescriptionRes = R.string.vaults, + vaultNavBarLabelRes = BitwardenString.vaults, + vaultNavBarContentDescriptionRes = BitwardenString.vaults, notificationState = DEFAULT_NOTIFICATION_STATE, ) val accountWithoutOrganizations: UserState.Account = mockk { @@ -135,8 +135,8 @@ class VaultUnlockedNavBarViewModelTest : BaseViewModelTest() { every { organizations } returns emptyList() } val expectedWithoutOrganizations = VaultUnlockedNavBarState( - vaultNavBarLabelRes = R.string.my_vault, - vaultNavBarContentDescriptionRes = R.string.my_vault, + vaultNavBarLabelRes = BitwardenString.my_vault, + vaultNavBarContentDescriptionRes = BitwardenString.my_vault, notificationState = DEFAULT_NOTIFICATION_STATE, ) @@ -179,8 +179,8 @@ class VaultUnlockedNavBarViewModelTest : BaseViewModelTest() { viewModel.trySendAction(VaultUnlockedNavBarAction.VaultTabClick) assertEquals( VaultUnlockedNavBarEvent.NavigateToVaultScreen( - labelRes = R.string.my_vault, - contentDescRes = R.string.my_vault, + labelRes = BitwardenString.my_vault, + contentDescRes = BitwardenString.my_vault, ), awaitItem(), ) @@ -284,8 +284,8 @@ class VaultUnlockedNavBarViewModelTest : BaseViewModelTest() { viewModel.eventFlow.test { assertEquals( VaultUnlockedNavBarEvent.Shortcut.NavigateToVaultScreen( - labelRes = R.string.my_vault, - contentDescRes = R.string.my_vault, + labelRes = BitwardenString.my_vault, + contentDescRes = BitwardenString.my_vault, ), awaitItem(), ) @@ -308,8 +308,8 @@ class VaultUnlockedNavBarViewModelTest : BaseViewModelTest() { viewModel.eventFlow.test { assertEquals( VaultUnlockedNavBarEvent.Shortcut.NavigateToVaultScreen( - labelRes = R.string.my_vault, - contentDescRes = R.string.my_vault, + labelRes = BitwardenString.my_vault, + contentDescRes = BitwardenString.my_vault, ), awaitItem(), ) @@ -332,7 +332,7 @@ private val DEFAULT_NOTIFICATION_STATE = VaultUnlockedNavBarNotificationState( ) private val DEFAULT_STATE = VaultUnlockedNavBarState( - vaultNavBarLabelRes = R.string.my_vault, - vaultNavBarContentDescriptionRes = R.string.my_vault, + vaultNavBarLabelRes = BitwardenString.my_vault, + vaultNavBarContentDescriptionRes = BitwardenString.my_vault, notificationState = DEFAULT_NOTIFICATION_STATE, ) diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/util/AppThemeExtensionsTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/util/AppThemeExtensionsTest.kt index 360350c6b7..b65935d771 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/util/AppThemeExtensionsTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/util/AppThemeExtensionsTest.kt @@ -1,8 +1,8 @@ package com.x8bit.bitwarden.ui.platform.util import com.bitwarden.ui.platform.feature.settings.appearance.model.AppTheme +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Test @@ -10,9 +10,9 @@ class AppThemeExtensionsTest { @Test fun `displayLabel should return the correct value for each type`() { mapOf( - AppTheme.DEFAULT to R.string.default_system.asText(), - AppTheme.DARK to R.string.dark.asText(), - AppTheme.LIGHT to R.string.light.asText(), + AppTheme.DEFAULT to BitwardenString.default_system.asText(), + AppTheme.DARK to BitwardenString.dark.asText(), + AppTheme.LIGHT to BitwardenString.light.asText(), ) .forEach { (type, label) -> assertEquals( diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/util/EnvironmentExtensionsTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/util/EnvironmentExtensionsTest.kt index cb0c3b980c..9633ddad38 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/util/EnvironmentExtensionsTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/util/EnvironmentExtensionsTest.kt @@ -1,8 +1,8 @@ package com.x8bit.bitwarden.ui.platform.util import com.bitwarden.data.repository.model.Environment +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Test @@ -26,7 +26,7 @@ class EnvironmentExtensionsTest { @Test fun `displayLabel for SELF_HOSTED type should return the correct value`() { assertEquals( - R.string.self_hosted.asText(), + BitwardenString.self_hosted.asText(), Environment.Type.SELF_HOSTED.displayLabel, ) } diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/util/ExportVaultFormatExtensionTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/util/ExportVaultFormatExtensionTest.kt index 0fd2e8343d..68eefdff67 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/util/ExportVaultFormatExtensionTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/util/ExportVaultFormatExtensionTest.kt @@ -1,7 +1,7 @@ package com.x8bit.bitwarden.ui.platform.util +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.platform.feature.settings.exportvault.model.ExportVaultFormat import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Test @@ -10,10 +10,10 @@ class ExportVaultFormatExtensionTest { @Test fun `displayLabel should return the correct value for each type`() { mapOf( - ExportVaultFormat.JSON to R.string.json_extension.asText(), - ExportVaultFormat.CSV to R.string.csv_extension.asText(), - ExportVaultFormat.JSON_ENCRYPTED to R.string.json_extension_formatted.asText( - R.string.password_protected.asText(), + ExportVaultFormat.JSON to BitwardenString.json_extension.asText(), + ExportVaultFormat.CSV to BitwardenString.csv_extension.asText(), + ExportVaultFormat.JSON_ENCRYPTED to BitwardenString.json_extension_formatted.asText( + BitwardenString.password_protected.asText(), ), ) .forEach { (type, label) -> diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/util/VaultTimeoutActionExtensionsTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/util/VaultTimeoutActionExtensionsTest.kt index 2e7c030533..62dc83d846 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/util/VaultTimeoutActionExtensionsTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/util/VaultTimeoutActionExtensionsTest.kt @@ -1,7 +1,7 @@ package com.x8bit.bitwarden.ui.platform.util +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.platform.repository.model.VaultTimeoutAction import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Test @@ -10,8 +10,8 @@ class VaultTimeoutActionExtensionsTest { @Test fun `displayLabel should return the correct value for each type`() { mapOf( - VaultTimeoutAction.LOCK to R.string.lock.asText(), - VaultTimeoutAction.LOGOUT to R.string.log_out.asText(), + VaultTimeoutAction.LOCK to BitwardenString.lock.asText(), + VaultTimeoutAction.LOGOUT to BitwardenString.log_out.asText(), ) .forEach { (type, label) -> assertEquals( diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/util/VaultTimeoutExtensionsTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/util/VaultTimeoutExtensionsTest.kt index 7634057cbf..b444446e26 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/util/VaultTimeoutExtensionsTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/util/VaultTimeoutExtensionsTest.kt @@ -1,7 +1,7 @@ package com.x8bit.bitwarden.ui.platform.util +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.platform.repository.model.VaultTimeout import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Test @@ -10,16 +10,16 @@ class VaultTimeoutExtensionsTest { @Test fun `displayLabel should return the correct value for each type`() { mapOf( - VaultTimeout.Type.IMMEDIATELY to R.string.immediately.asText(), - VaultTimeout.Type.ONE_MINUTE to R.string.one_minute.asText(), - VaultTimeout.Type.FIVE_MINUTES to R.string.five_minutes.asText(), - VaultTimeout.Type.FIFTEEN_MINUTES to R.string.fifteen_minutes.asText(), - VaultTimeout.Type.THIRTY_MINUTES to R.string.thirty_minutes.asText(), - VaultTimeout.Type.ONE_HOUR to R.string.one_hour.asText(), - VaultTimeout.Type.FOUR_HOURS to R.string.four_hours.asText(), - VaultTimeout.Type.ON_APP_RESTART to R.string.on_restart.asText(), - VaultTimeout.Type.NEVER to R.string.never.asText(), - VaultTimeout.Type.CUSTOM to R.string.custom.asText(), + VaultTimeout.Type.IMMEDIATELY to BitwardenString.immediately.asText(), + VaultTimeout.Type.ONE_MINUTE to BitwardenString.one_minute.asText(), + VaultTimeout.Type.FIVE_MINUTES to BitwardenString.five_minutes.asText(), + VaultTimeout.Type.FIFTEEN_MINUTES to BitwardenString.fifteen_minutes.asText(), + VaultTimeout.Type.THIRTY_MINUTES to BitwardenString.thirty_minutes.asText(), + VaultTimeout.Type.ONE_HOUR to BitwardenString.one_hour.asText(), + VaultTimeout.Type.FOUR_HOURS to BitwardenString.four_hours.asText(), + VaultTimeout.Type.ON_APP_RESTART to BitwardenString.on_restart.asText(), + VaultTimeout.Type.NEVER to BitwardenString.never.asText(), + VaultTimeout.Type.CUSTOM to BitwardenString.custom.asText(), ) .forEach { (type, label) -> assertEquals( diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/tools/feature/generator/GeneratorViewModelTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/tools/feature/generator/GeneratorViewModelTest.kt index a63371fe9b..d697e0bbfa 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/tools/feature/generator/GeneratorViewModelTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/tools/feature/generator/GeneratorViewModelTest.kt @@ -10,8 +10,8 @@ import com.bitwarden.network.model.PolicyTypeJson import com.bitwarden.network.model.SyncResponseJson import com.bitwarden.network.model.createMockPolicy import com.bitwarden.ui.platform.base.BaseViewModelTest +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.auth.datasource.disk.model.OnboardingStatus import com.x8bit.bitwarden.data.auth.repository.AuthRepository import com.x8bit.bitwarden.data.auth.repository.model.UserState @@ -422,7 +422,7 @@ class GeneratorViewModelTest : BaseViewModelTest() { viewModel.eventFlow.test { assertEquals( - GeneratorEvent.ShowSnackbar(R.string.an_error_has_occurred.asText()), + GeneratorEvent.ShowSnackbar(BitwardenString.an_error_has_occurred.asText()), awaitItem(), ) } @@ -484,7 +484,7 @@ class GeneratorViewModelTest : BaseViewModelTest() { viewModel.eventFlow.test { assertEquals( - GeneratorEvent.ShowSnackbar(R.string.an_error_has_occurred.asText()), + GeneratorEvent.ShowSnackbar(BitwardenString.an_error_has_occurred.asText()), awaitItem(), ) } @@ -549,8 +549,8 @@ class GeneratorViewModelTest : BaseViewModelTest() { viewModel.trySendAction(GeneratorAction.RegenerateClick) assertEquals( GeneratorEvent.ShowSnackbar( - message = R.string.validation_field_required.asText( - R.string.domain_name.asText(), + message = BitwardenString.validation_field_required.asText( + BitwardenString.domain_name.asText(), ), ), awaitItem(), diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/tools/feature/generator/passwordhistory/PasswordHistoryViewModelTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/tools/feature/generator/passwordhistory/PasswordHistoryViewModelTest.kt index a6947c41be..85ddd0a2db 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/tools/feature/generator/passwordhistory/PasswordHistoryViewModelTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/tools/feature/generator/passwordhistory/PasswordHistoryViewModelTest.kt @@ -5,11 +5,11 @@ import app.cash.turbine.test import com.bitwarden.core.data.repository.model.DataState import com.bitwarden.core.data.util.toFormattedDateTimeStyle import com.bitwarden.ui.platform.base.BaseViewModelTest +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText import com.bitwarden.vault.CipherView import com.bitwarden.vault.PasswordHistoryView -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.platform.manager.clipboard.BitwardenClipboardManager import com.x8bit.bitwarden.data.platform.repository.model.LocalDataState import com.x8bit.bitwarden.data.tools.generator.repository.util.FakeGeneratorRepository @@ -78,7 +78,7 @@ class PasswordHistoryViewModelTest : BaseViewModelTest() { viewModel.stateFlow.test { val expectedState = createPasswordHistoryState( viewState = PasswordHistoryState.ViewState.Error( - message = R.string.an_error_has_occurred.asText(), + message = BitwardenString.an_error_has_occurred.asText(), ), ) val actualState = awaitItem() @@ -129,7 +129,7 @@ class PasswordHistoryViewModelTest : BaseViewModelTest() { viewModel.stateFlow.test { val expectedState = createPasswordHistoryState( viewState = PasswordHistoryState.ViewState.Error( - message = R.string.an_error_has_occurred.asText(), + message = BitwardenString.an_error_has_occurred.asText(), ), passwordHistoryMode = GeneratorPasswordHistoryMode.Item(itemId = "mockId-1"), ) @@ -232,7 +232,7 @@ class PasswordHistoryViewModelTest : BaseViewModelTest() { verify(exactly = 1) { clipboardManager.setText( text = generatedPassword.password, - toastDescriptorOverride = R.string.password.asText(), + toastDescriptorOverride = BitwardenString.password.asText(), ) } } diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/tools/feature/generator/util/ServiceTypeExtensionsTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/tools/feature/generator/util/ServiceTypeExtensionsTest.kt index f412475151..b3ff80bd06 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/tools/feature/generator/util/ServiceTypeExtensionsTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/tools/feature/generator/util/ServiceTypeExtensionsTest.kt @@ -2,8 +2,8 @@ package com.x8bit.bitwarden.ui.tools.feature.generator.util import com.bitwarden.generators.ForwarderServiceType import com.bitwarden.generators.UsernameGeneratorRequest +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.tools.feature.generator.GeneratorState.MainType.Username.UsernameType.ForwardedEmailAlias.ServiceType import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Test @@ -23,7 +23,7 @@ internal class ServiceTypeExtensionsTest { ) assertEquals( - GeneratorRequestResult.MissingField(R.string.api_access_token.asText()), + GeneratorRequestResult.MissingField(BitwardenString.api_access_token.asText()), request, ) } @@ -41,7 +41,7 @@ internal class ServiceTypeExtensionsTest { ) assertEquals( - GeneratorRequestResult.MissingField(R.string.domain_name.asText()), + GeneratorRequestResult.MissingField(BitwardenString.domain_name.asText()), request, ) } @@ -132,7 +132,7 @@ internal class ServiceTypeExtensionsTest { ) assertEquals( - GeneratorRequestResult.MissingField(R.string.api_key.asText()), + GeneratorRequestResult.MissingField(BitwardenString.api_key.asText()), request, ) } @@ -168,7 +168,7 @@ internal class ServiceTypeExtensionsTest { ) assertEquals( - GeneratorRequestResult.MissingField(R.string.api_access_token.asText()), + GeneratorRequestResult.MissingField(BitwardenString.api_access_token.asText()), request, ) } @@ -204,7 +204,7 @@ internal class ServiceTypeExtensionsTest { ) assertEquals( - GeneratorRequestResult.MissingField(R.string.api_key.asText()), + GeneratorRequestResult.MissingField(BitwardenString.api_key.asText()), request, ) } @@ -245,7 +245,7 @@ internal class ServiceTypeExtensionsTest { ) assertEquals( - GeneratorRequestResult.MissingField(R.string.api_key.asText()), + GeneratorRequestResult.MissingField(BitwardenString.api_key.asText()), request, ) } @@ -263,7 +263,7 @@ internal class ServiceTypeExtensionsTest { ) assertEquals( - GeneratorRequestResult.MissingField(R.string.domain_name.asText()), + GeneratorRequestResult.MissingField(BitwardenString.domain_name.asText()), request, ) } @@ -305,7 +305,7 @@ internal class ServiceTypeExtensionsTest { ) assertEquals( - GeneratorRequestResult.MissingField(R.string.api_key.asText()), + GeneratorRequestResult.MissingField(BitwardenString.api_key.asText()), request, ) } diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/SendViewModelTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/SendViewModelTest.kt index ec859781e6..a78a8d59c7 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/SendViewModelTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/SendViewModelTest.kt @@ -8,9 +8,9 @@ import com.bitwarden.data.repository.model.Environment import com.bitwarden.data.repository.util.baseWebSendUrl import com.bitwarden.network.model.PolicyTypeJson import com.bitwarden.ui.platform.base.BaseViewModelTest +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.auth.datasource.disk.model.OnboardingStatus import com.x8bit.bitwarden.data.auth.repository.AuthRepository import com.x8bit.bitwarden.data.auth.repository.model.UserState @@ -138,7 +138,7 @@ class SendViewModelTest : BaseViewModelTest() { state.copy( dialogState = SendState.DialogState.Error( title = null, - message = R.string.send_disabled_warning.asText(), + message = BitwardenString.send_disabled_warning.asText(), ), ), viewModel.stateFlow.value, @@ -153,8 +153,8 @@ class SendViewModelTest : BaseViewModelTest() { assertEquals( state.copy( dialogState = SendState.DialogState.Error( - title = R.string.send.asText(), - message = R.string.send_file_premium_required.asText(), + title = BitwardenString.send.asText(), + message = BitwardenString.send_file_premium_required.asText(), ), ), viewModel.stateFlow.value, @@ -221,15 +221,15 @@ class SendViewModelTest : BaseViewModelTest() { viewModel.trySendAction(SendAction.DeleteSendClick(sendItem)) assertEquals( DEFAULT_STATE.copy( - dialogState = SendState.DialogState.Loading(R.string.deleting.asText()), + dialogState = SendState.DialogState.Loading(BitwardenString.deleting.asText()), ), awaitItem(), ) assertEquals( DEFAULT_STATE.copy( dialogState = SendState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.generic_error_message.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.generic_error_message.asText(), throwable = error, ), ), @@ -249,7 +249,7 @@ class SendViewModelTest : BaseViewModelTest() { val viewModel = createViewModel() viewModel.eventFlow.test { viewModel.trySendAction(SendAction.DeleteSendClick(sendItem)) - assertEquals(SendEvent.ShowSnackbar(R.string.send_deleted.asText()), awaitItem()) + assertEquals(SendEvent.ShowSnackbar(BitwardenString.send_deleted.asText()), awaitItem()) } } @@ -271,7 +271,7 @@ class SendViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialogState = SendState.DialogState.Loading( - message = R.string.removing_send_password.asText(), + message = BitwardenString.removing_send_password.asText(), ), ), awaitItem(), @@ -279,8 +279,8 @@ class SendViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialogState = SendState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.generic_error_message.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.generic_error_message.asText(), ), ), awaitItem(), @@ -301,7 +301,12 @@ class SendViewModelTest : BaseViewModelTest() { val viewModel = createViewModel() viewModel.eventFlow.test { viewModel.trySendAction(SendAction.RemovePasswordClick(sendItem)) - assertEquals(SendEvent.ShowSnackbar(R.string.password_removed.asText()), awaitItem()) + assertEquals( + SendEvent.ShowSnackbar( + BitwardenString.password_removed.asText(), + ), + awaitItem(), + ) } } @@ -314,7 +319,7 @@ class SendViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( - dialogState = SendState.DialogState.Loading(R.string.syncing.asText()), + dialogState = SendState.DialogState.Loading(BitwardenString.syncing.asText()), ), viewModel.stateFlow.value, ) @@ -333,8 +338,8 @@ class SendViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialogState = SendState.DialogState.Error( - R.string.internet_connection_required_title.asText(), - R.string.internet_connection_required_message.asText(), + BitwardenString.internet_connection_required_title.asText(), + BitwardenString.internet_connection_required_message.asText(), ), ), viewModel.stateFlow.value, @@ -355,7 +360,7 @@ class SendViewModelTest : BaseViewModelTest() { verify(exactly = 1) { clipboardManager.setText( text = testUrl, - toastDescriptorOverride = R.string.send_link.asText(), + toastDescriptorOverride = BitwardenString.send_link.asText(), ) } } @@ -479,7 +484,7 @@ class SendViewModelTest : BaseViewModelTest() { @Test fun `VaultRepository SendData Error should update view state to Error`() = runTest { - val dialogState = SendState.DialogState.Loading(R.string.syncing.asText()) + val dialogState = SendState.DialogState.Loading(BitwardenString.syncing.asText()) val viewModel = createViewModel(state = DEFAULT_STATE.copy(dialogState = dialogState)) viewModel.eventFlow.test { @@ -489,7 +494,7 @@ class SendViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( viewState = SendState.ViewState.Error( - message = R.string.generic_error_message.asText(), + message = BitwardenString.generic_error_message.asText(), ), dialogState = null, isRefreshing = false, @@ -500,7 +505,7 @@ class SendViewModelTest : BaseViewModelTest() { @Test fun `VaultRepository SendData Loaded should update view state`() = runTest { - val dialogState = SendState.DialogState.Loading(R.string.syncing.asText()) + val dialogState = SendState.DialogState.Loading(BitwardenString.syncing.asText()) val viewModel = createViewModel(state = DEFAULT_STATE.copy(dialogState = dialogState)) val viewState = mockk() val sendData = mockk { @@ -525,7 +530,7 @@ class SendViewModelTest : BaseViewModelTest() { @Test fun `VaultRepository SendData Loading should update view state to Loading`() { - val dialogState = SendState.DialogState.Loading(R.string.syncing.asText()) + val dialogState = SendState.DialogState.Loading(BitwardenString.syncing.asText()) val viewModel = createViewModel(state = DEFAULT_STATE.copy(dialogState = dialogState)) mutableSendDataFlow.value = DataState.Loading @@ -540,7 +545,7 @@ class SendViewModelTest : BaseViewModelTest() { @Test fun `VaultRepository SendData NoNetwork should update view state to Empty when there is no data`() = runTest { - val dialogState = SendState.DialogState.Loading(R.string.syncing.asText()) + val dialogState = SendState.DialogState.Loading(BitwardenString.syncing.asText()) val viewModel = createViewModel(state = DEFAULT_STATE.copy(dialogState = dialogState)) viewModel.eventFlow.test { @@ -559,7 +564,7 @@ class SendViewModelTest : BaseViewModelTest() { @Test fun `VaultRepository SendData Pending should update view state`() { - val dialogState = SendState.DialogState.Loading(R.string.syncing.asText()) + val dialogState = SendState.DialogState.Loading(BitwardenString.syncing.asText()) val viewModel = createViewModel(state = DEFAULT_STATE.copy(dialogState = dialogState)) val viewState = mockk() val sendData = mockk { @@ -603,8 +608,8 @@ class SendViewModelTest : BaseViewModelTest() { DEFAULT_STATE.copy( isRefreshing = false, dialogState = SendState.DialogState.Error( - R.string.internet_connection_required_title.asText(), - R.string.internet_connection_required_message.asText(), + BitwardenString.internet_connection_required_title.asText(), + BitwardenString.internet_connection_required_message.asText(), ), ), viewModel.stateFlow.value, diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/addedit/AddEditSendViewModelTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/addedit/AddEditSendViewModelTest.kt index 7e43ebeb71..8feb6b5985 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/addedit/AddEditSendViewModelTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/addedit/AddEditSendViewModelTest.kt @@ -9,9 +9,9 @@ import com.bitwarden.network.model.PolicyTypeJson import com.bitwarden.network.model.SyncResponseJson import com.bitwarden.send.SendView import com.bitwarden.ui.platform.base.BaseViewModelTest +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.auth.datasource.disk.model.OnboardingStatus import com.x8bit.bitwarden.data.auth.repository.AuthRepository import com.x8bit.bitwarden.data.auth.repository.model.PolicyInformation @@ -259,7 +259,7 @@ class AddEditSendViewModelTest : BaseViewModelTest() { assertEquals( initialState.copy( dialogState = AddEditSendState.DialogState.Loading( - message = R.string.saving.asText(), + message = BitwardenString.saving.asText(), ), ), awaitItem(), @@ -267,7 +267,7 @@ class AddEditSendViewModelTest : BaseViewModelTest() { assertEquals( initialState.copy( dialogState = AddEditSendState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), + title = BitwardenString.an_error_has_occurred.asText(), message = "Fail".asText(), ), ), @@ -355,7 +355,7 @@ class AddEditSendViewModelTest : BaseViewModelTest() { assertEquals( initialState.copy( dialogState = AddEditSendState.DialogState.Loading( - message = R.string.saving.asText(), + message = BitwardenString.saving.asText(), ), ), awaitItem(), @@ -363,7 +363,7 @@ class AddEditSendViewModelTest : BaseViewModelTest() { assertEquals( initialState.copy( dialogState = AddEditSendState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), + title = BitwardenString.an_error_has_occurred.asText(), message = errorMessage.asText(), ), ), @@ -384,9 +384,9 @@ class AddEditSendViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialogState = AddEditSendState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.validation_field_required.asText( - R.string.name.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.validation_field_required.asText( + BitwardenString.name.asText(), ), ), ), @@ -418,8 +418,8 @@ class AddEditSendViewModelTest : BaseViewModelTest() { assertEquals( initialState.copy( dialogState = AddEditSendState.DialogState.Error( - title = R.string.send.asText(), - message = R.string.send_file_premium_required.asText(), + title = BitwardenString.send.asText(), + message = BitwardenString.send_file_premium_required.asText(), ), ), viewModel.stateFlow.value, @@ -446,8 +446,8 @@ class AddEditSendViewModelTest : BaseViewModelTest() { assertEquals( initialState.copy( dialogState = AddEditSendState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.you_must_attach_a_file_to_save_this_send.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.you_must_attach_a_file_to_save_this_send.asText(), ), ), viewModel.stateFlow.value, @@ -475,8 +475,8 @@ class AddEditSendViewModelTest : BaseViewModelTest() { assertEquals( initialState.copy( dialogState = AddEditSendState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.max_file_size.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.max_file_size.asText(), ), ), viewModel.stateFlow.value, @@ -511,7 +511,7 @@ class AddEditSendViewModelTest : BaseViewModelTest() { verify(exactly = 1) { clipboardManager.setText( text = sendUrl, - toastDescriptorOverride = R.string.send_link.asText(), + toastDescriptorOverride = BitwardenString.send_link.asText(), ) } } @@ -557,7 +557,7 @@ class AddEditSendViewModelTest : BaseViewModelTest() { assertEquals( initialState.copy( dialogState = AddEditSendState.DialogState.Loading( - message = R.string.removing_send_password.asText(), + message = BitwardenString.removing_send_password.asText(), ), ), awaitItem(), @@ -565,8 +565,8 @@ class AddEditSendViewModelTest : BaseViewModelTest() { assertEquals( initialState.copy( dialogState = AddEditSendState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.generic_error_message.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.generic_error_message.asText(), ), ), awaitItem(), @@ -606,7 +606,7 @@ class AddEditSendViewModelTest : BaseViewModelTest() { assertEquals( initialState.copy( dialogState = AddEditSendState.DialogState.Loading( - message = R.string.removing_send_password.asText(), + message = BitwardenString.removing_send_password.asText(), ), ), awaitItem(), @@ -614,7 +614,7 @@ class AddEditSendViewModelTest : BaseViewModelTest() { assertEquals( initialState.copy( dialogState = AddEditSendState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), + title = BitwardenString.an_error_has_occurred.asText(), message = errorMessage.asText(), ), ), @@ -641,7 +641,7 @@ class AddEditSendViewModelTest : BaseViewModelTest() { viewModel.trySendAction(AddEditSendAction.RemovePasswordClick) assertEquals( AddEditSendEvent.ShowSnackbar( - data = BitwardenSnackbarData(message = R.string.password_removed.asText()), + data = BitwardenSnackbarData(message = BitwardenString.password_removed.asText()), ), awaitItem(), ) @@ -678,7 +678,7 @@ class AddEditSendViewModelTest : BaseViewModelTest() { assertEquals( initialState.copy( dialogState = AddEditSendState.DialogState.Loading( - message = R.string.deleting.asText(), + message = BitwardenString.deleting.asText(), ), ), awaitItem(), @@ -686,8 +686,8 @@ class AddEditSendViewModelTest : BaseViewModelTest() { assertEquals( initialState.copy( dialogState = AddEditSendState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.generic_error_message.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.generic_error_message.asText(), throwable = error, ), ), @@ -714,7 +714,7 @@ class AddEditSendViewModelTest : BaseViewModelTest() { } verify(exactly = 1) { snackbarRelayManager.sendSnackbarData( - data = BitwardenSnackbarData(message = R.string.send_deleted.asText()), + data = BitwardenSnackbarData(message = BitwardenString.send_deleted.asText()), relay = SnackbarRelay.SEND_DELETED, ) } @@ -979,8 +979,8 @@ class AddEditSendViewModelTest : BaseViewModelTest() { assertEquals( initialState.copy( dialogState = AddEditSendState.DialogState.Error( - title = R.string.internet_connection_required_title.asText(), - message = R.string.internet_connection_required_message.asText(), + title = BitwardenString.internet_connection_required_title.asText(), + message = BitwardenString.internet_connection_required_message.asText(), ), ), viewModel.stateFlow.value, diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/viewsend/ViewSendViewModelTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/viewsend/ViewSendViewModelTest.kt index cc98019d22..0944f13a1f 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/viewsend/ViewSendViewModelTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/viewsend/ViewSendViewModelTest.kt @@ -7,9 +7,9 @@ import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow import com.bitwarden.data.repository.model.Environment import com.bitwarden.send.SendView import com.bitwarden.ui.platform.base.BaseViewModelTest +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.asText import com.bitwarden.ui.util.concat -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.platform.manager.clipboard.BitwardenClipboardManager import com.x8bit.bitwarden.data.platform.repository.EnvironmentRepository import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockSendView @@ -143,7 +143,7 @@ class ViewSendViewModelTest : BaseViewModelTest() { assertEquals( initialState.copy( dialogState = ViewSendState.DialogState.Loading( - message = R.string.deleting.asText(), + message = BitwardenString.deleting.asText(), ), ), awaitItem(), @@ -151,8 +151,8 @@ class ViewSendViewModelTest : BaseViewModelTest() { assertEquals( initialState.copy( dialogState = ViewSendState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.generic_error_message.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.generic_error_message.asText(), throwable = throwable, ), ), @@ -179,7 +179,7 @@ class ViewSendViewModelTest : BaseViewModelTest() { assertEquals( initialState.copy( dialogState = ViewSendState.DialogState.Loading( - message = R.string.deleting.asText(), + message = BitwardenString.deleting.asText(), ), ), stateFlow.awaitItem(), @@ -195,7 +195,7 @@ class ViewSendViewModelTest : BaseViewModelTest() { } verify(exactly = 1) { snackbarRelayManager.sendSnackbarData( - data = BitwardenSnackbarData(message = R.string.send_deleted.asText()), + data = BitwardenSnackbarData(message = BitwardenString.send_deleted.asText()), relay = SnackbarRelay.SEND_DELETED, ) } @@ -270,7 +270,7 @@ class ViewSendViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( viewState = ViewSendState.ViewState.Error( - message = R.string.generic_error_message.asText(), + message = BitwardenString.generic_error_message.asText(), ), ), awaitItem(), @@ -307,11 +307,11 @@ class ViewSendViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( viewState = ViewSendState.ViewState.Error( - message = R.string.internet_connection_required_title + message = BitwardenString.internet_connection_required_title .asText() .concat( " ".asText(), - R.string.internet_connection_required_message.asText(), + BitwardenString.internet_connection_required_message.asText(), ), ), ), @@ -346,7 +346,7 @@ class ViewSendViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( viewState = ViewSendState.ViewState.Error( - message = R.string.generic_error_message.asText(), + message = BitwardenString.generic_error_message.asText(), ), ), awaitItem(), @@ -380,7 +380,7 @@ class ViewSendViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( viewState = ViewSendState.ViewState.Error( - message = R.string.missing_send_resync_your_vault.asText(), + message = BitwardenString.missing_send_resync_your_vault.asText(), ), ), awaitItem(), diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditViewModelTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditViewModelTest.kt index 983b0cff75..9c766f7214 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditViewModelTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditViewModelTest.kt @@ -17,6 +17,7 @@ import com.bitwarden.network.model.PolicyTypeJson import com.bitwarden.network.model.SyncResponseJson import com.bitwarden.send.SendView import com.bitwarden.ui.platform.base.BaseViewModelTest +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText import com.bitwarden.vault.CipherListView @@ -24,7 +25,6 @@ import com.bitwarden.vault.CipherView import com.bitwarden.vault.CollectionView import com.bitwarden.vault.FolderView import com.bitwarden.vault.UriMatchType -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.auth.datasource.disk.model.OnboardingStatus import com.x8bit.bitwarden.data.auth.repository.AuthRepository import com.x8bit.bitwarden.data.auth.repository.model.BreachCountResult @@ -156,7 +156,7 @@ class VaultAddEditViewModelTest : BaseViewModelTest() { DataState.Loading, ) private val resourceManager: ResourceManager = mockk { - every { getString(R.string.folder_none) } returns "No Folder" + every { getString(BitwardenString.folder_none) } returns "No Folder" } private val clipboardManager: BitwardenClipboardManager = mockk { every { setText(text = any(), toastDescriptorOverride = any()) } just runs @@ -619,7 +619,7 @@ class VaultAddEditViewModelTest : BaseViewModelTest() { viewModel.eventFlow.test { assertEquals( - VaultAddEditEvent.ShowToast(R.string.item_soft_deleted.asText()), + VaultAddEditEvent.ShowToast(BitwardenString.item_soft_deleted.asText()), awaitItem(), ) assertEquals( @@ -662,7 +662,7 @@ class VaultAddEditViewModelTest : BaseViewModelTest() { createVaultAddItemState( vaultAddEditType = vaultAddEditType, dialogState = VaultAddEditState.DialogState.Generic( - message = R.string.generic_error_message.asText(), + message = BitwardenString.generic_error_message.asText(), error = error, ), commonContentViewState = createCommonContentViewState( @@ -704,7 +704,7 @@ class VaultAddEditViewModelTest : BaseViewModelTest() { runTest { val stateWithDialog = createVaultAddItemState( dialogState = VaultAddEditState.DialogState.Loading( - R.string.saving.asText(), + BitwardenString.saving.asText(), ), commonContentViewState = createCommonContentViewState( name = "mockName-1", @@ -738,7 +738,7 @@ class VaultAddEditViewModelTest : BaseViewModelTest() { assertEquals( VaultAddEditEvent.ShowToast( - R.string.new_item_created.asText(), + BitwardenString.new_item_created.asText(), ), eventFlow.awaitItem(), ) @@ -767,7 +767,7 @@ class VaultAddEditViewModelTest : BaseViewModelTest() { ) val stateWithDialog = createVaultAddItemState( dialogState = VaultAddEditState.DialogState.Loading( - R.string.saving.asText(), + BitwardenString.saving.asText(), ), commonContentViewState = createCommonContentViewState( name = "mockName-1", @@ -828,7 +828,7 @@ class VaultAddEditViewModelTest : BaseViewModelTest() { specialCircumstanceManager.specialCircumstance = SpecialCircumstance.AddTotpLoginItem(data = totpData) val stateWithDialog = createVaultAddItemState( - dialogState = VaultAddEditState.DialogState.Loading(R.string.saving.asText()), + dialogState = VaultAddEditState.DialogState.Loading(BitwardenString.saving.asText()), commonContentViewState = createCommonContentViewState(name = "issuer"), totpData = totpData, shouldExitOnSave = true, @@ -880,7 +880,7 @@ class VaultAddEditViewModelTest : BaseViewModelTest() { shouldFinishWhenComplete = true, ) val stateWithDialog = createVaultAddItemState( - dialogState = VaultAddEditState.DialogState.Loading(R.string.saving.asText()), + dialogState = VaultAddEditState.DialogState.Loading(BitwardenString.saving.asText()), commonContentViewState = createCommonContentViewState(name = "issuer"), shouldExitOnSave = false, shouldClearSpecialCircumstance = false, @@ -909,7 +909,7 @@ class VaultAddEditViewModelTest : BaseViewModelTest() { assertEquals(stateWithDialog, stateTurbine.awaitItem()) assertEquals(stateWithName, stateTurbine.awaitItem()) assertEquals( - VaultAddEditEvent.ShowToast(R.string.new_item_created.asText()), + VaultAddEditEvent.ShowToast(BitwardenString.new_item_created.asText()), eventTurbine.awaitItem(), ) assertEquals(VaultAddEditEvent.NavigateBack, eventTurbine.awaitItem()) @@ -935,7 +935,7 @@ class VaultAddEditViewModelTest : BaseViewModelTest() { ) val stateWithSavingDialog = createVaultAddItemState( dialogState = VaultAddEditState.DialogState.Loading( - R.string.saving.asText(), + BitwardenString.saving.asText(), ), commonContentViewState = createCommonContentViewState( name = "mockName-1", @@ -1015,7 +1015,7 @@ class VaultAddEditViewModelTest : BaseViewModelTest() { ) val stateWithSavingDialog = createVaultAddItemState( dialogState = VaultAddEditState.DialogState.Loading( - R.string.saving.asText(), + BitwardenString.saving.asText(), ), commonContentViewState = createCommonContentViewState( name = "mockName-1", @@ -1073,7 +1073,7 @@ class VaultAddEditViewModelTest : BaseViewModelTest() { assertEquals(stateWithName, stateFlow.awaitItem()) assertEquals(stateWithSavingDialog, stateFlow.awaitItem()) assertEquals( - VaultAddEditEvent.ShowToast(R.string.item_updated.asText()), + VaultAddEditEvent.ShowToast(BitwardenString.item_updated.asText()), eventFlow.awaitItem(), ) assertEquals(stateWithName, stateFlow.awaitItem()) @@ -1215,7 +1215,7 @@ class VaultAddEditViewModelTest : BaseViewModelTest() { assertEquals( VaultAddEditState.DialogState.Fido2Error( - message = R.string.passkey_operation_failed_because_the_request_is_unsupported + message = BitwardenString.passkey_operation_failed_because_the_request_is_unsupported .asText(), ), viewModel.stateFlow.value.dialog, @@ -1341,7 +1341,7 @@ class VaultAddEditViewModelTest : BaseViewModelTest() { viewModel.trySendAction(VaultAddEditAction.Common.SaveClick) assertEquals( VaultAddEditEvent.ShowToast( - R.string.new_item_created.asText(), + BitwardenString.new_item_created.asText(), ), awaitItem(), ) @@ -1911,7 +1911,7 @@ class VaultAddEditViewModelTest : BaseViewModelTest() { viewModel.trySendAction(VaultAddEditAction.Common.SaveClick) assertEquals( VaultAddEditEvent.ShowToast( - R.string.item_updated.asText(), + BitwardenString.item_updated.asText(), ), awaitItem(), ) @@ -1946,8 +1946,8 @@ class VaultAddEditViewModelTest : BaseViewModelTest() { assertEquals( stateWithName.copy( dialog = VaultAddEditState.DialogState.Generic( - title = R.string.internet_connection_required_title.asText(), - message = R.string.internet_connection_required_message.asText(), + title = BitwardenString.internet_connection_required_title.asText(), + message = BitwardenString.internet_connection_required_message.asText(), ), ), viewModel.stateFlow.value, @@ -1983,7 +1983,7 @@ class VaultAddEditViewModelTest : BaseViewModelTest() { assertEquals( stateWithName.copy( dialog = VaultAddEditState.DialogState.Generic( - title = R.string.an_error_has_occurred.asText(), + title = BitwardenString.an_error_has_occurred.asText(), message = "Network error message".asText(), ), ), @@ -2001,8 +2001,8 @@ class VaultAddEditViewModelTest : BaseViewModelTest() { assertEquals( stateWithName.copy( dialog = VaultAddEditState.DialogState.Generic( - title = R.string.an_error_has_occurred.asText(), - message = R.string.generic_error_message.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.generic_error_message.asText(), ), ), viewModel.stateFlow.value, @@ -2018,7 +2018,7 @@ class VaultAddEditViewModelTest : BaseViewModelTest() { val stateWithDialog = createVaultAddItemState( vaultAddEditType = vaultAddEditType, dialogState = VaultAddEditState.DialogState.Loading( - R.string.saving.asText(), + BitwardenString.saving.asText(), ), commonContentViewState = createCommonContentViewState( name = "mockName-1", @@ -2152,8 +2152,8 @@ class VaultAddEditViewModelTest : BaseViewModelTest() { assertEquals( stateWithName.copy( dialog = VaultAddEditState.DialogState.Generic( - title = R.string.an_error_has_occurred.asText(), - message = R.string.generic_error_message.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.generic_error_message.asText(), error = error, ), ), @@ -2219,7 +2219,7 @@ class VaultAddEditViewModelTest : BaseViewModelTest() { assertEquals( stateWithName.copy( dialog = VaultAddEditState.DialogState.Generic( - title = R.string.an_error_has_occurred.asText(), + title = BitwardenString.an_error_has_occurred.asText(), message = errorMessage.asText(), ), ), @@ -2247,7 +2247,7 @@ class VaultAddEditViewModelTest : BaseViewModelTest() { originalCipher = cipherView, ), typeContentViewState = createLoginTypeContentViewState( - fido2CredentialCreationDateTime = R.string.created_x.asText( + fido2CredentialCreationDateTime = BitwardenString.created_x.asText( "May 08, 2024, 4:30 PM", ), ), @@ -2450,8 +2450,9 @@ class VaultAddEditViewModelTest : BaseViewModelTest() { val stateWithNoNameAndDialog = createVaultAddItemState( commonContentViewState = createCommonContentViewState(name = ""), dialogState = VaultAddEditState.DialogState.Generic( - title = R.string.an_error_has_occurred.asText(), - message = R.string.validation_field_required.asText(R.string.name.asText()), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.validation_field_required + .asText(BitwardenString.name.asText()), ), ) @@ -2477,8 +2478,9 @@ class VaultAddEditViewModelTest : BaseViewModelTest() { ) val errorState = createVaultAddItemState( dialogState = VaultAddEditState.DialogState.Generic( - title = R.string.an_error_has_occurred.asText(), - message = R.string.validation_field_required.asText(R.string.name.asText()), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.validation_field_required + .asText(BitwardenString.name.asText()), ), ) @@ -2504,7 +2506,7 @@ class VaultAddEditViewModelTest : BaseViewModelTest() { runTest { val errorState = createVaultAddItemState( dialogState = VaultAddEditState.DialogState.Fido2Error( - message = R.string.passkey_operation_failed_because_user_could_not_be_verified.asText(), + message = BitwardenString.passkey_operation_failed_because_user_could_not_be_verified.asText(), ), ) val viewModel = createAddVaultItemViewModel( @@ -2516,7 +2518,7 @@ class VaultAddEditViewModelTest : BaseViewModelTest() { ) viewModel.trySendAction( VaultAddEditAction.Common.Fido2ErrorDialogDismissed( - R.string.passkey_operation_failed_because_user_could_not_be_verified.asText(), + BitwardenString.passkey_operation_failed_because_user_could_not_be_verified.asText(), ), ) viewModel.eventFlow.test { @@ -2524,7 +2526,7 @@ class VaultAddEditViewModelTest : BaseViewModelTest() { assertEquals( VaultAddEditEvent.CompleteFido2Registration( result = RegisterFido2CredentialResult.Error( - R.string.passkey_operation_failed_because_user_could_not_be_verified + BitwardenString.passkey_operation_failed_because_user_could_not_be_verified .asText(), ), ), @@ -2659,7 +2661,7 @@ class VaultAddEditViewModelTest : BaseViewModelTest() { assertEquals( loginState.copy( dialog = VaultAddEditState.DialogState.Loading( - label = R.string.loading.asText(), + label = BitwardenString.loading.asText(), ), ), awaitItem(), @@ -2668,7 +2670,7 @@ class VaultAddEditViewModelTest : BaseViewModelTest() { assertEquals( loginState.copy( dialog = VaultAddEditState.DialogState.Generic( - message = R.string.password_exposed.asText(breachCount), + message = BitwardenString.password_exposed.asText(breachCount), ), ), awaitItem(), @@ -2743,7 +2745,7 @@ class VaultAddEditViewModelTest : BaseViewModelTest() { verify(exactly = 1) { clipboardManager.setText( text = testKey, - toastDescriptorOverride = R.string.authenticator_key.asText(), + toastDescriptorOverride = BitwardenString.authenticator_key.asText(), ) } } @@ -2818,7 +2820,7 @@ class VaultAddEditViewModelTest : BaseViewModelTest() { ) assertEquals( - VaultAddEditEvent.ShowToast(R.string.authenticator_key_added.asText()), + VaultAddEditEvent.ShowToast(BitwardenString.authenticator_key_added.asText()), awaitItem(), ) @@ -2928,7 +2930,7 @@ class VaultAddEditViewModelTest : BaseViewModelTest() { savedStateHandle = createSavedStateHandleWithState( state = createVaultAddItemState( typeContentViewState = createLoginTypeContentViewState( - fido2CredentialCreationDateTime = R.string.created_x.asText( + fido2CredentialCreationDateTime = BitwardenString.created_x.asText( "May 08, 2024, 4:30 PM", ), ), @@ -3677,7 +3679,9 @@ class VaultAddEditViewModelTest : BaseViewModelTest() { viewModel.trySendAction(VaultAddEditAction.Common.AddNewFolder(folderName)) assertEquals( vaultAddItemInitialState.copy( - dialog = VaultAddEditState.DialogState.Loading(R.string.saving.asText()), + dialog = VaultAddEditState.DialogState.Loading( + BitwardenString.saving.asText(), + ), ), awaitItem(), ) @@ -4260,7 +4264,7 @@ class VaultAddEditViewModelTest : BaseViewModelTest() { verify { bitwardenCredentialManager.isUserVerified = false } assertEquals( VaultAddEditState.DialogState.Fido2Error( - message = R.string.passkey_operation_failed_because_user_could_not_be_verified.asText(), + message = BitwardenString.passkey_operation_failed_because_user_could_not_be_verified.asText(), ), viewModel.stateFlow.value.dialog, ) @@ -4292,7 +4296,7 @@ class VaultAddEditViewModelTest : BaseViewModelTest() { verify { bitwardenCredentialManager.isUserVerified = false } assertEquals( VaultAddEditState.DialogState.Fido2Error( - message = R.string.passkey_operation_failed_because_user_could_not_be_verified.asText(), + message = BitwardenString.passkey_operation_failed_because_user_could_not_be_verified.asText(), ), viewModel.stateFlow.value.dialog, ) @@ -4306,7 +4310,7 @@ class VaultAddEditViewModelTest : BaseViewModelTest() { verify { bitwardenCredentialManager.isUserVerified = false } assertEquals( VaultAddEditState.DialogState.Fido2Error( - message = R.string.passkey_operation_failed_because_user_could_not_be_verified.asText(), + message = BitwardenString.passkey_operation_failed_because_user_could_not_be_verified.asText(), ), viewModel.stateFlow.value.dialog, ) @@ -4415,7 +4419,7 @@ class VaultAddEditViewModelTest : BaseViewModelTest() { assertEquals( VaultAddEditState.DialogState.Fido2Error( - message = R.string.passkey_operation_failed_because_user_could_not_be_verified + message = BitwardenString.passkey_operation_failed_because_user_could_not_be_verified .asText(), ), viewModel.stateFlow.value.dialog, @@ -4465,7 +4469,7 @@ class VaultAddEditViewModelTest : BaseViewModelTest() { assertEquals( VaultAddEditState.DialogState.Fido2Error( - message = R.string.passkey_operation_failed_because_user_could_not_be_verified + message = BitwardenString.passkey_operation_failed_because_user_could_not_be_verified .asText(), ), viewModel.stateFlow.value.dialog, @@ -4520,7 +4524,7 @@ class VaultAddEditViewModelTest : BaseViewModelTest() { assertEquals( VaultAddEditState.DialogState.Fido2Error( - message = R.string.passkey_operation_failed_because_user_could_not_be_verified + message = BitwardenString.passkey_operation_failed_because_user_could_not_be_verified .asText(), ), viewModel.stateFlow.value.dialog, @@ -4570,7 +4574,7 @@ class VaultAddEditViewModelTest : BaseViewModelTest() { assertEquals( VaultAddEditState.DialogState.Fido2Error( - message = R.string.passkey_operation_failed_because_user_could_not_be_verified + message = BitwardenString.passkey_operation_failed_because_user_could_not_be_verified .asText(), ), viewModel.stateFlow.value.dialog, @@ -4657,7 +4661,8 @@ class VaultAddEditViewModelTest : BaseViewModelTest() { assertEquals( VaultAddEditState.DialogState.Fido2Error( - message = R.string.passkey_operation_failed_because_user_could_not_be_verified + message = BitwardenString + .passkey_operation_failed_because_user_could_not_be_verified .asText(), ), viewModel.stateFlow.value.dialog, @@ -4679,7 +4684,7 @@ class VaultAddEditViewModelTest : BaseViewModelTest() { assertEquals( VaultAddEditState.DialogState.Fido2Error( - message = R.string.passkey_operation_failed_because_the_request_is_unsupported + message = BitwardenString.passkey_operation_failed_because_the_request_is_unsupported .asText(), ), viewModel.stateFlow.value.dialog, @@ -4746,14 +4751,14 @@ class VaultAddEditViewModelTest : BaseViewModelTest() { viewModel.eventFlow.test { assertEquals( - VaultAddEditEvent.ShowToast(R.string.an_error_has_occurred.asText()), + VaultAddEditEvent.ShowToast(BitwardenString.an_error_has_occurred.asText()), awaitItem(), ) assertEquals( VaultAddEditEvent.CompleteFido2Registration( RegisterFido2CredentialResult.Error( - R.string.passkey_registration_failed_due_to_an_internal_error + BitwardenString.passkey_registration_failed_due_to_an_internal_error .asText(), ), ), @@ -4793,7 +4798,7 @@ class VaultAddEditViewModelTest : BaseViewModelTest() { viewModel.eventFlow.test { assertEquals( - VaultAddEditEvent.ShowToast(R.string.item_updated.asText()), + VaultAddEditEvent.ShowToast(BitwardenString.item_updated.asText()), awaitItem(), ) diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/util/CipherViewExtensionsTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/util/CipherViewExtensionsTest.kt index d0bfa254ce..4c0809d167 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/util/CipherViewExtensionsTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/util/CipherViewExtensionsTest.kt @@ -2,6 +2,7 @@ package com.x8bit.bitwarden.ui.vault.feature.addedit.util import com.bitwarden.data.repository.model.Environment import com.bitwarden.network.model.OrganizationType +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.asText import com.bitwarden.vault.CardView import com.bitwarden.vault.CipherRepromptType @@ -16,7 +17,6 @@ import com.bitwarden.vault.PasswordHistoryView import com.bitwarden.vault.SecureNoteType import com.bitwarden.vault.SecureNoteView import com.bitwarden.vault.SshKeyView -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.auth.datasource.disk.model.OnboardingStatus import com.x8bit.bitwarden.data.auth.repository.model.Organization import com.x8bit.bitwarden.data.auth.repository.model.UserState @@ -50,8 +50,8 @@ import java.util.UUID class CipherViewExtensionsTest { private val resourceManager: ResourceManager = mockk { - every { getString(R.string.clone) } returns "Clone" - every { getString(R.string.folder_none) } returns "No Folder" + every { getString(BitwardenString.clone) } returns "Clone" + every { getString(BitwardenString.folder_none) } returns "No Folder" } @BeforeEach @@ -215,7 +215,7 @@ class CipherViewExtensionsTest { ), totp = "otpauth://totp/Example:alice@google.com?secret=JBSWY3DPEHPK3PXP&issuer=Example", canViewPassword = false, - fido2CredentialCreationDateTime = R.string.created_x.asText( + fido2CredentialCreationDateTime = BitwardenString.created_x.asText( "Oct 27, 2023, 12:00 PM", ), ), @@ -276,7 +276,7 @@ class CipherViewExtensionsTest { ), totp = totp, canViewPassword = false, - fido2CredentialCreationDateTime = R.string.created_x.asText( + fido2CredentialCreationDateTime = BitwardenString.created_x.asText( "Oct 27, 2023, 12:00 PM", ), ), @@ -429,7 +429,7 @@ class CipherViewExtensionsTest { ) { _, _ -> providedState } assertEquals( - VaultAddEditState.ViewState.Error(R.string.generic_error_message.asText()), + VaultAddEditState.ViewState.Error(BitwardenString.generic_error_message.asText()), result, ) } @@ -445,7 +445,7 @@ class CipherViewExtensionsTest { ) { _, _ -> providedState } assertEquals( - VaultAddEditState.ViewState.Error(R.string.generic_error_message.asText()), + VaultAddEditState.ViewState.Error(BitwardenString.generic_error_message.asText()), result, ) } diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/attachments/AttachmentsViewModelTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/attachments/AttachmentsViewModelTest.kt index d807bab263..8fd8152f35 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/attachments/AttachmentsViewModelTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/attachments/AttachmentsViewModelTest.kt @@ -6,10 +6,10 @@ import app.cash.turbine.test import com.bitwarden.core.data.repository.model.DataState import com.bitwarden.data.repository.model.Environment import com.bitwarden.ui.platform.base.BaseViewModelTest +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.asText import com.bitwarden.ui.util.concat import com.bitwarden.vault.CipherView -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.auth.datasource.disk.model.OnboardingStatus import com.x8bit.bitwarden.data.auth.repository.AuthRepository import com.x8bit.bitwarden.data.auth.repository.model.UserState @@ -92,7 +92,7 @@ class AttachmentsViewModelTest : BaseViewModelTest() { viewState = DEFAULT_CONTENT_WITH_ATTACHMENTS, dialogState = AttachmentsState.DialogState.Error( title = null, - message = R.string.premium_required.asText(), + message = BitwardenString.premium_required.asText(), throwable = null, ), isPremiumUser = false, @@ -106,8 +106,8 @@ class AttachmentsViewModelTest : BaseViewModelTest() { assertEquals( state.copy( dialogState = AttachmentsState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.premium_required.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.premium_required.asText(), throwable = null, ), ), @@ -132,8 +132,9 @@ class AttachmentsViewModelTest : BaseViewModelTest() { assertEquals( state.copy( dialogState = AttachmentsState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.validation_field_required.asText(R.string.file.asText()), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.validation_field_required + .asText(BitwardenString.file.asText()), throwable = null, ), ), @@ -176,8 +177,8 @@ class AttachmentsViewModelTest : BaseViewModelTest() { assertEquals( state.copy( dialogState = AttachmentsState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.max_file_size.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.max_file_size.asText(), throwable = null, ), ), @@ -234,7 +235,7 @@ class AttachmentsViewModelTest : BaseViewModelTest() { assertEquals( state.copy( dialogState = AttachmentsState.DialogState.Loading( - message = R.string.saving.asText(), + message = BitwardenString.saving.asText(), ), ), awaitItem(), @@ -242,7 +243,7 @@ class AttachmentsViewModelTest : BaseViewModelTest() { assertEquals( state.copy( dialogState = AttachmentsState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), + title = BitwardenString.an_error_has_occurred.asText(), message = error.message!!.asText(), throwable = error, ), @@ -306,7 +307,7 @@ class AttachmentsViewModelTest : BaseViewModelTest() { assertEquals( state.copy( dialogState = AttachmentsState.DialogState.Loading( - message = R.string.saving.asText(), + message = BitwardenString.saving.asText(), ), ), awaitItem(), @@ -314,8 +315,8 @@ class AttachmentsViewModelTest : BaseViewModelTest() { assertEquals( state.copy( dialogState = AttachmentsState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.generic_error_message.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.generic_error_message.asText(), throwable = error, ), ), @@ -373,7 +374,7 @@ class AttachmentsViewModelTest : BaseViewModelTest() { viewModel.eventFlow.test { viewModel.trySendAction(AttachmentsAction.SaveClick) assertEquals( - AttachmentsEvent.ShowSnackbar(R.string.save_attachment_success.asText()), + AttachmentsEvent.ShowSnackbar(BitwardenString.save_attachment_success.asText()), awaitItem(), ) } @@ -461,7 +462,7 @@ class AttachmentsViewModelTest : BaseViewModelTest() { assertEquals( initialState.copy( dialogState = AttachmentsState.DialogState.Loading( - message = R.string.deleting.asText(), + message = BitwardenString.deleting.asText(), ), ), awaitItem(), @@ -469,8 +470,8 @@ class AttachmentsViewModelTest : BaseViewModelTest() { assertEquals( initialState.copy( dialogState = AttachmentsState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.generic_error_message.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.generic_error_message.asText(), throwable = error, ), ), @@ -497,7 +498,7 @@ class AttachmentsViewModelTest : BaseViewModelTest() { viewModel.eventFlow.test { viewModel.trySendAction(AttachmentsAction.DeleteClick(cipherId)) assertEquals( - AttachmentsEvent.ShowSnackbar(R.string.attachment_deleted.asText()), + AttachmentsEvent.ShowSnackbar(BitwardenString.attachment_deleted.asText()), awaitItem(), ) } @@ -512,7 +513,7 @@ class AttachmentsViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( viewState = AttachmentsState.ViewState.Error( - message = R.string.generic_error_message.asText(), + message = BitwardenString.generic_error_message.asText(), ), ), viewModel.stateFlow.value, @@ -542,7 +543,7 @@ class AttachmentsViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( viewState = AttachmentsState.ViewState.Error( - message = R.string.generic_error_message.asText(), + message = BitwardenString.generic_error_message.asText(), ), ), viewModel.stateFlow.value, @@ -570,11 +571,11 @@ class AttachmentsViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( viewState = AttachmentsState.ViewState.Error( - message = R.string.internet_connection_required_title + message = BitwardenString.internet_connection_required_title .asText() .concat( " ".asText(), - R.string.internet_connection_required_message.asText(), + BitwardenString.internet_connection_required_message.asText(), ), ), ), @@ -605,7 +606,7 @@ class AttachmentsViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( viewState = AttachmentsState.ViewState.Error( - message = R.string.generic_error_message.asText(), + message = BitwardenString.generic_error_message.asText(), ), ), viewModel.stateFlow.value, diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/importlogins/ImportLoginsScreenTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/importlogins/ImportLoginsScreenTest.kt index 14ceda671f..faa59b9bc6 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/importlogins/ImportLoginsScreenTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/importlogins/ImportLoginsScreenTest.kt @@ -17,9 +17,9 @@ import androidx.compose.ui.test.performScrollTo import androidx.compose.ui.test.performSemanticsAction import androidx.core.net.toUri import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.asText import com.bitwarden.ui.util.assertNoDialogExists -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.util.advanceTimeByAndRunCurrent import com.x8bit.bitwarden.ui.platform.base.BitwardenComposeTest import com.x8bit.bitwarden.ui.platform.manager.intent.IntentManager @@ -397,7 +397,7 @@ class ImportLoginsScreenTest : BitwardenComposeTest() { mutableImportLoginsStateFlow.tryEmit( DEFAULT_STATE.copy( dialogState = ImportLoginsState.DialogState.Error( - message = R.string.no_logins_were_imported.asText(), + message = BitwardenString.no_logins_were_imported.asText(), ), ), ) diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/importlogins/ImportLoginsViewModelTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/importlogins/ImportLoginsViewModelTest.kt index 3bd636c39a..1b86195dac 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/importlogins/ImportLoginsViewModelTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/importlogins/ImportLoginsViewModelTest.kt @@ -4,8 +4,8 @@ import android.net.Uri import app.cash.turbine.test import com.bitwarden.data.repository.model.Environment import com.bitwarden.ui.platform.base.BaseViewModelTest +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.platform.manager.FirstTimeActionManager import com.x8bit.bitwarden.data.platform.repository.EnvironmentRepository import com.x8bit.bitwarden.data.vault.repository.VaultRepository @@ -388,8 +388,8 @@ class ImportLoginsViewModelTest : BaseViewModelTest() { assertEquals( ImportLoginsState( dialogState = ImportLoginsState.DialogState.Error( - message = R.string.no_logins_were_imported.asText(), - title = R.string.import_error.asText(), + message = BitwardenString.no_logins_were_imported.asText(), + title = BitwardenString.import_error.asText(), ), viewState = ImportLoginsState.ViewState.InitialContent, showBottomSheet = false, @@ -483,8 +483,8 @@ class ImportLoginsViewModelTest : BaseViewModelTest() { assertEquals(ImportLoginsEvent.NavigateBack, eventFlow.awaitItem()) } val expectedSnackbarData = BitwardenSnackbarData( - messageHeader = R.string.logins_imported.asText(), - message = R.string.remember_to_delete_your_imported_password_file_from_your_computer + messageHeader = BitwardenString.logins_imported.asText(), + message = BitwardenString.remember_to_delete_your_imported_password_file_from_your_computer .asText(), ) verify { diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemScreenTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemScreenTest.kt index c268c2ef1a..917527df0e 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemScreenTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemScreenTest.kt @@ -28,6 +28,7 @@ import androidx.core.net.toUri import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow import com.bitwarden.ui.platform.components.icon.model.IconData import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.asText import com.bitwarden.ui.util.assertNoDialogExists import com.bitwarden.ui.util.assertScrollableNodeDoesNotExist @@ -35,7 +36,6 @@ import com.bitwarden.ui.util.isProgressBar import com.bitwarden.ui.util.onFirstNodeWithTextAfterScroll import com.bitwarden.ui.util.onNodeWithContentDescriptionAfterScroll import com.bitwarden.ui.util.onNodeWithTextAfterScroll -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockCipherView import com.x8bit.bitwarden.ui.platform.base.BitwardenComposeTest import com.x8bit.bitwarden.ui.platform.components.snackbar.BitwardenSnackbarData @@ -222,7 +222,7 @@ class VaultItemScreenTest : BitwardenComposeTest() { composeTestRule.onNodeWithText("Loading").assertDoesNotExist() mutableStateFlow.update { - it.copy(dialog = VaultItemState.DialogState.Loading(R.string.loading.asText())) + it.copy(dialog = VaultItemState.DialogState.Loading(BitwardenString.loading.asText())) } composeTestRule @@ -511,7 +511,7 @@ class VaultItemScreenTest : BitwardenComposeTest() { mutableStateFlow.update { currentState -> updateCommonContent(currentState) { - copy(lastUpdated = R.string.created.asText("Feb 21, 1970, 1:30 AM")) + copy(lastUpdated = BitwardenString.created.asText("Feb 21, 1970, 1:30 AM")) } } @@ -533,7 +533,10 @@ class VaultItemScreenTest : BitwardenComposeTest() { mutableStateFlow.update { currentState -> updateCommonContent(currentState) { - copy(lastUpdated = R.string.last_edited.asText("Dec 31, 1969, 06:20 PM")) + copy( + lastUpdated = BitwardenString.last_edited + .asText("Dec 31, 1969, 06:20 PM"), + ) } } @@ -3158,8 +3161,8 @@ private val DEFAULT_STATE: VaultItemState = VaultItemState( private val DEFAULT_COMMON: VaultItemState.ViewState.Content.Common = VaultItemState.ViewState.Content.Common( name = "cipher", - created = R.string.created.asText(""), - lastUpdated = R.string.last_edited.asText("Dec 31, 1969, 06:16 PM"), + created = BitwardenString.created.asText(""), + lastUpdated = BitwardenString.last_edited.asText("Dec 31, 1969, 06:16 PM"), notes = "Lots of notes", customFields = listOf( VaultItemState.ViewState.Content.Common.Custom.TextField( @@ -3202,7 +3205,7 @@ private val DEFAULT_COMMON: VaultItemState.ViewState.Content.Common = relatedLocations = persistentListOf(), ) -private val DEFAULT_PASSKEY = R.string.created_x.asText("Mar 13, 2024, 3:56 PM") +private val DEFAULT_PASSKEY = BitwardenString.created_x.asText("Mar 13, 2024, 3:56 PM") private val DEFAULT_LOGIN: VaultItemState.ViewState.Content.ItemType.Login = VaultItemState.ViewState.Content.ItemType.Login( @@ -3219,7 +3222,7 @@ private val DEFAULT_LOGIN: VaultItemState.ViewState.Content.ItemType.Login = isLaunchable = true, ), ), - passwordRevisionDate = R.string.password_last_updated.asText("Apr 14, 1983 3:56 PM"), + passwordRevisionDate = BitwardenString.password_last_updated.asText("Apr 14, 1983 3:56 PM"), isPremiumUser = true, totpCodeItemData = TotpCodeItemData( periodSeconds = 30, @@ -3271,8 +3274,8 @@ private val DEFAULT_SSH_KEY: VaultItemState.ViewState.Content.ItemType.SshKey = private val EMPTY_COMMON: VaultItemState.ViewState.Content.Common = VaultItemState.ViewState.Content.Common( name = "cipher", - created = R.string.created.asText("Dec 1, 1969, 05:20 PM"), - lastUpdated = R.string.last_edited.asText("Dec 31, 1969, 06:16 PM"), + created = BitwardenString.created.asText("Dec 1, 1969, 05:20 PM"), + lastUpdated = BitwardenString.last_edited.asText("Dec 31, 1969, 06:16 PM"), notes = null, customFields = emptyList(), requiresCloneConfirmation = false, diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemViewModelTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemViewModelTest.kt index 945eb5c01b..f7c8c08161 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemViewModelTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemViewModelTest.kt @@ -11,13 +11,13 @@ import com.bitwarden.network.model.OrganizationType import com.bitwarden.ui.platform.base.BaseViewModelTest import com.bitwarden.ui.platform.components.icon.model.IconData import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText import com.bitwarden.ui.util.concat import com.bitwarden.vault.CipherView import com.bitwarden.vault.CollectionView import com.bitwarden.vault.FolderView -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.auth.datasource.disk.model.OnboardingStatus import com.x8bit.bitwarden.data.auth.repository.AuthRepository import com.x8bit.bitwarden.data.auth.repository.model.BreachCountResult @@ -214,7 +214,7 @@ class VaultItemViewModelTest : BaseViewModelTest() { fun `on DismissDialogClick should clear the dialog state`() = runTest { val initialState = DEFAULT_STATE.copy( dialog = VaultItemState.DialogState.Loading( - message = R.string.loading.asText(), + message = BitwardenString.loading.asText(), ), ) val viewModel = createViewModel(state = initialState) @@ -245,7 +245,7 @@ class VaultItemViewModelTest : BaseViewModelTest() { val expected = DEFAULT_STATE.copy( viewState = DEFAULT_VIEW_STATE, dialog = VaultItemState.DialogState.DeleteConfirmationPrompt( - R.string.do_you_really_want_to_soft_delete_cipher.asText(), + BitwardenString.do_you_really_want_to_soft_delete_cipher.asText(), ), ) @@ -287,7 +287,7 @@ class VaultItemViewModelTest : BaseViewModelTest() { val expected = DEFAULT_STATE.copy( viewState = loginState, dialog = VaultItemState.DialogState.DeleteConfirmationPrompt( - R.string.do_you_really_want_to_permanently_delete_cipher.asText(), + BitwardenString.do_you_really_want_to_permanently_delete_cipher.asText(), ), ) @@ -342,7 +342,7 @@ class VaultItemViewModelTest : BaseViewModelTest() { } verify { snackbarRelayManager.sendSnackbarData( - data = BitwardenSnackbarData(message = R.string.item_soft_deleted.asText()), + data = BitwardenSnackbarData(message = BitwardenString.item_soft_deleted.asText()), relay = SnackbarRelay.CIPHER_DELETED, ) } @@ -386,7 +386,7 @@ class VaultItemViewModelTest : BaseViewModelTest() { DEFAULT_STATE.copy( viewState = DEFAULT_VIEW_STATE, dialog = VaultItemState.DialogState.Generic( - message = R.string.generic_error_message.asText(), + message = BitwardenString.generic_error_message.asText(), error = error, ), ), @@ -442,7 +442,9 @@ class VaultItemViewModelTest : BaseViewModelTest() { } verify { snackbarRelayManager.sendSnackbarData( - data = BitwardenSnackbarData(message = R.string.item_deleted.asText()), + data = BitwardenSnackbarData( + message = BitwardenString.item_deleted.asText(), + ), relay = SnackbarRelay.CIPHER_DELETED, ) } @@ -536,7 +538,7 @@ class VaultItemViewModelTest : BaseViewModelTest() { } verify { snackbarRelayManager.sendSnackbarData( - data = BitwardenSnackbarData(message = R.string.item_restored.asText()), + data = BitwardenSnackbarData(message = BitwardenString.item_restored.asText()), relay = SnackbarRelay.CIPHER_RESTORED, ) } @@ -579,7 +581,7 @@ class VaultItemViewModelTest : BaseViewModelTest() { DEFAULT_STATE.copy( viewState = DEFAULT_VIEW_STATE, dialog = VaultItemState.DialogState.Generic( - message = R.string.generic_error_message.asText(), + message = BitwardenString.generic_error_message.asText(), error = error, ), ), @@ -856,7 +858,7 @@ class VaultItemViewModelTest : BaseViewModelTest() { assertEquals( loginState.copy( dialog = VaultItemState.DialogState.Fido2CredentialCannotBeCopiedConfirmationPrompt( - message = R.string.the_passkey_will_not_be_copied_to_the_cloned_item_do_you_want_to_continue_cloning_this_item.asText(), + message = BitwardenString.the_passkey_will_not_be_copied_to_the_cloned_item_do_you_want_to_continue_cloning_this_item.asText(), ), ), viewModel.stateFlow.value, @@ -1010,14 +1012,14 @@ class VaultItemViewModelTest : BaseViewModelTest() { ) assertEquals( - loginState.copy(dialog = VaultItemState.DialogState.Loading(R.string.downloading.asText())), + loginState.copy(dialog = VaultItemState.DialogState.Loading(BitwardenString.downloading.asText())), awaitItem(), ) assertEquals( loginState.copy( dialog = VaultItemState.DialogState.Generic( - R.string.unable_to_download_file.asText(), + BitwardenString.unable_to_download_file.asText(), error = error, ), ), @@ -1083,7 +1085,7 @@ class VaultItemViewModelTest : BaseViewModelTest() { assertEquals( loginState.copy( dialog = VaultItemState.DialogState.Loading( - R.string.downloading.asText(), + BitwardenString.downloading.asText(), ), ), awaitItem(), @@ -1129,7 +1131,7 @@ class VaultItemViewModelTest : BaseViewModelTest() { viewModel.eventFlow.test { assertEquals( - VaultItemEvent.ShowSnackbar(R.string.save_attachment_success.asText()), + VaultItemEvent.ShowSnackbar(BitwardenString.save_attachment_success.asText()), awaitItem(), ) } @@ -1169,7 +1171,7 @@ class VaultItemViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialog = VaultItemState.DialogState.Generic( - R.string.unable_to_save_attachment.asText(), + BitwardenString.unable_to_save_attachment.asText(), ), ), awaitItem(), @@ -1196,7 +1198,7 @@ class VaultItemViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialog = VaultItemState.DialogState.Generic( - R.string.unable_to_save_attachment.asText(), + BitwardenString.unable_to_save_attachment.asText(), ), ), viewModel.stateFlow.value, @@ -1234,7 +1236,7 @@ class VaultItemViewModelTest : BaseViewModelTest() { verify(exactly = 1) { clipboardManager.setText( text = notes, - toastDescriptorOverride = R.string.notes.asText(), + toastDescriptorOverride = BitwardenString.notes.asText(), ) } } @@ -1284,7 +1286,7 @@ class VaultItemViewModelTest : BaseViewModelTest() { assertEquals( loginState.copy( dialog = VaultItemState.DialogState.Loading( - message = R.string.loading.asText(), + message = BitwardenString.loading.asText(), ), ), awaitItem(), @@ -1292,7 +1294,7 @@ class VaultItemViewModelTest : BaseViewModelTest() { assertEquals( loginState.copy( dialog = VaultItemState.DialogState.Generic( - message = R.string.password_exposed.asText(breachCount), + message = BitwardenString.password_exposed.asText(breachCount), ), ), awaitItem(), @@ -1345,7 +1347,7 @@ class VaultItemViewModelTest : BaseViewModelTest() { verify(exactly = 1) { clipboardManager.setText( text = DEFAULT_LOGIN_PASSWORD, - toastDescriptorOverride = R.string.password.asText(), + toastDescriptorOverride = BitwardenString.password.asText(), ) mockCipherView.toViewState( previousState = null, @@ -1383,7 +1385,7 @@ class VaultItemViewModelTest : BaseViewModelTest() { verify(exactly = 1) { clipboardManager.setText( text = "123456", - toastDescriptorOverride = R.string.totp.asText(), + toastDescriptorOverride = BitwardenString.totp.asText(), ) } } @@ -1395,7 +1397,7 @@ class VaultItemViewModelTest : BaseViewModelTest() { verify(exactly = 1) { clipboardManager.setText( text = uri, - toastDescriptorOverride = R.string.uri.asText(), + toastDescriptorOverride = BitwardenString.uri.asText(), ) } } @@ -1427,7 +1429,7 @@ class VaultItemViewModelTest : BaseViewModelTest() { verify(exactly = 1) { clipboardManager.setText( text = DEFAULT_LOGIN_USERNAME, - toastDescriptorOverride = R.string.username.asText(), + toastDescriptorOverride = BitwardenString.username.asText(), ) mockCipherView.toViewState( previousState = null, @@ -1614,7 +1616,7 @@ class VaultItemViewModelTest : BaseViewModelTest() { verify(exactly = 1) { clipboardManager.setText( text = "12345436", - toastDescriptorOverride = R.string.number.asText(), + toastDescriptorOverride = BitwardenString.number.asText(), ) mockCipherView.toViewState( previousState = null, @@ -1705,7 +1707,7 @@ class VaultItemViewModelTest : BaseViewModelTest() { verify(exactly = 1) { clipboardManager.setText( text = "987", - toastDescriptorOverride = R.string.security_code.asText(), + toastDescriptorOverride = BitwardenString.security_code.asText(), ) mockCipherView.toViewState( previousState = null, @@ -1809,7 +1811,7 @@ class VaultItemViewModelTest : BaseViewModelTest() { verify(exactly = 1) { clipboardManager.setText( text = DEFAULT_SSH_KEY_TYPE.publicKey, - toastDescriptorOverride = R.string.public_key.asText(), + toastDescriptorOverride = BitwardenString.public_key.asText(), ) } } @@ -1893,7 +1895,7 @@ class VaultItemViewModelTest : BaseViewModelTest() { verify(exactly = 1) { clipboardManager.setText( text = DEFAULT_SSH_KEY_TYPE.privateKey, - toastDescriptorOverride = R.string.private_key.asText(), + toastDescriptorOverride = BitwardenString.private_key.asText(), ) } } @@ -1924,7 +1926,7 @@ class VaultItemViewModelTest : BaseViewModelTest() { verify(exactly = 1) { clipboardManager.setText( text = DEFAULT_SSH_KEY_TYPE.fingerprint, - toastDescriptorOverride = R.string.fingerprint.asText(), + toastDescriptorOverride = BitwardenString.fingerprint.asText(), ) } } @@ -1969,7 +1971,7 @@ class VaultItemViewModelTest : BaseViewModelTest() { verify(exactly = 1) { clipboardManager.setText( text = username, - toastDescriptorOverride = R.string.username.asText(), + toastDescriptorOverride = BitwardenString.username.asText(), ) } } @@ -1982,7 +1984,7 @@ class VaultItemViewModelTest : BaseViewModelTest() { verify(exactly = 1) { clipboardManager.setText( text = identityName, - toastDescriptorOverride = R.string.identity_name.asText(), + toastDescriptorOverride = BitwardenString.identity_name.asText(), ) } } @@ -1994,7 +1996,7 @@ class VaultItemViewModelTest : BaseViewModelTest() { verify(exactly = 1) { clipboardManager.setText( text = company, - toastDescriptorOverride = R.string.company.asText(), + toastDescriptorOverride = BitwardenString.company.asText(), ) } } @@ -2006,7 +2008,7 @@ class VaultItemViewModelTest : BaseViewModelTest() { verify(exactly = 1) { clipboardManager.setText( text = ssn, - toastDescriptorOverride = R.string.ssn.asText(), + toastDescriptorOverride = BitwardenString.ssn.asText(), ) } } @@ -2018,7 +2020,7 @@ class VaultItemViewModelTest : BaseViewModelTest() { verify(exactly = 1) { clipboardManager.setText( text = passportNumber, - toastDescriptorOverride = R.string.passport_number.asText(), + toastDescriptorOverride = BitwardenString.passport_number.asText(), ) } } @@ -2030,7 +2032,7 @@ class VaultItemViewModelTest : BaseViewModelTest() { verify(exactly = 1) { clipboardManager.setText( text = licenseNumber, - toastDescriptorOverride = R.string.license_number.asText(), + toastDescriptorOverride = BitwardenString.license_number.asText(), ) } } @@ -2041,7 +2043,7 @@ class VaultItemViewModelTest : BaseViewModelTest() { viewModel.trySendAction(VaultItemAction.ItemType.Identity.CopyEmailClick) verify(exactly = 1) { clipboardManager.setText( - text = email, toastDescriptorOverride = R.string.email.asText(), + text = email, toastDescriptorOverride = BitwardenString.email.asText(), ) } } @@ -2052,7 +2054,7 @@ class VaultItemViewModelTest : BaseViewModelTest() { viewModel.trySendAction(VaultItemAction.ItemType.Identity.CopyPhoneClick) verify(exactly = 1) { clipboardManager.setText( - text = phone, toastDescriptorOverride = R.string.phone.asText(), + text = phone, toastDescriptorOverride = BitwardenString.phone.asText(), ) } } @@ -2064,7 +2066,7 @@ class VaultItemViewModelTest : BaseViewModelTest() { verify(exactly = 1) { clipboardManager.setText( text = address, - toastDescriptorOverride = R.string.address.asText(), + toastDescriptorOverride = BitwardenString.address.asText(), ) } } @@ -2288,7 +2290,7 @@ class VaultItemViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( viewState = VaultItemState.ViewState.Error( - message = R.string.generic_error_message.asText(), + message = BitwardenString.generic_error_message.asText(), ), ), viewModel.stateFlow.value, @@ -2333,7 +2335,7 @@ class VaultItemViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( viewState = VaultItemState.ViewState.Error( - message = R.string.generic_error_message.asText(), + message = BitwardenString.generic_error_message.asText(), ), ), viewModel.stateFlow.value, @@ -2373,7 +2375,7 @@ class VaultItemViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( viewState = VaultItemState.ViewState.Error( - message = R.string.generic_error_message.asText(), + message = BitwardenString.generic_error_message.asText(), ), ), viewModel.stateFlow.value, @@ -2414,11 +2416,11 @@ class VaultItemViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( viewState = VaultItemState.ViewState.Error( - message = R.string.internet_connection_required_title + message = BitwardenString.internet_connection_required_title .asText() .concat( " ".asText(), - R.string.internet_connection_required_message.asText(), + BitwardenString.internet_connection_required_message.asText(), ), ), ), @@ -2545,7 +2547,9 @@ class VaultItemViewModelTest : BaseViewModelTest() { isLaunchable = true, ), ), - passwordRevisionDate = R.string.password_last_updated.asText("12/31/69 06:16 PM"), + passwordRevisionDate = BitwardenString + .password_last_updated + .asText("12/31/69 06:16 PM"), isPremiumUser = true, totpCodeItemData = TotpCodeItemData( verificationCode = "123456", @@ -2599,8 +2603,8 @@ class VaultItemViewModelTest : BaseViewModelTest() { private val DEFAULT_COMMON: VaultItemState.ViewState.Content.Common = VaultItemState.ViewState.Content.Common( name = "login cipher", - created = R.string.created.asText("Dec 1, 1969, 05:20 PM"), - lastUpdated = R.string.last_edited.asText("Dec 31, 1969, 06:16 PM"), + created = BitwardenString.created.asText("Dec 1, 1969, 05:20 PM"), + lastUpdated = BitwardenString.last_edited.asText("Dec 31, 1969, 06:16 PM"), notes = "Lots of notes", customFields = listOf( VaultItemState.ViewState.Content.Common.Custom.TextField( diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/util/VaultItemTestUtil.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/util/VaultItemTestUtil.kt index 61d2c43951..1bb6a2f29a 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/util/VaultItemTestUtil.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/item/util/VaultItemTestUtil.kt @@ -3,6 +3,7 @@ package com.x8bit.bitwarden.ui.vault.feature.item.util import androidx.annotation.DrawableRes import com.bitwarden.ui.platform.components.icon.model.IconData import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.asText import com.bitwarden.vault.AttachmentView import com.bitwarden.vault.CipherRepromptType @@ -15,7 +16,6 @@ import com.bitwarden.vault.LoginUriView import com.bitwarden.vault.LoginView import com.bitwarden.vault.PasswordHistoryView import com.bitwarden.vault.SshKeyView -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockSdkCipherPermissions import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockSdkFido2CredentialList import com.x8bit.bitwarden.ui.vault.feature.item.VaultItemState @@ -170,8 +170,8 @@ fun createCommonContent( if (isEmpty) { VaultItemState.ViewState.Content.Common( name = "mockName", - created = R.string.created.asText("Jan 1, 1970, 12:16 AM"), - lastUpdated = R.string.last_edited.asText("Jan 1, 1970, 12:16 AM"), + created = BitwardenString.created.asText("Jan 1, 1970, 12:16 AM"), + lastUpdated = BitwardenString.last_edited.asText("Jan 1, 1970, 12:16 AM"), notes = null, customFields = emptyList(), requiresCloneConfirmation = false, @@ -188,8 +188,8 @@ fun createCommonContent( } else { VaultItemState.ViewState.Content.Common( name = "mockName", - created = R.string.created.asText("Jan 1, 1970, 12:16 AM"), - lastUpdated = R.string.last_edited.asText("Jan 1, 1970, 12:16 AM"), + created = BitwardenString.created.asText("Jan 1, 1970, 12:16 AM"), + lastUpdated = BitwardenString.last_edited.asText("Jan 1, 1970, 12:16 AM"), notes = "Lots of notes", customFields = listOf( FieldView( @@ -270,7 +270,7 @@ fun createLoginContent(isEmpty: Boolean): VaultItemState.ViewState.Content.ItemT ), ) }, - passwordRevisionDate = R.string.password_last_updated + passwordRevisionDate = BitwardenString.password_last_updated .asText("Jan 1, 1970, 12:16 AM") .takeUnless { isEmpty }, isPremiumUser = true, @@ -280,7 +280,7 @@ fun createLoginContent(isEmpty: Boolean): VaultItemState.ViewState.Content.ItemT verificationCode = "123456", ) .takeUnless { isEmpty }, - fido2CredentialCreationDateText = R.string.created_x + fido2CredentialCreationDateText = BitwardenString.created_x .asText("Oct 27, 2023, 12:00 PM") .takeUnless { isEmpty }, canViewTotpCode = true, diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/itemlisting/VaultItemListingScreenTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/itemlisting/VaultItemListingScreenTest.kt index 2b8b825a90..5c7792b6e3 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/itemlisting/VaultItemListingScreenTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/itemlisting/VaultItemListingScreenTest.kt @@ -23,13 +23,13 @@ import com.bitwarden.send.SendType import com.bitwarden.ui.platform.base.util.toHostOrPathOrNull import com.bitwarden.ui.platform.components.icon.model.IconData import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.asText import com.bitwarden.ui.util.assertMasterPasswordDialogDisplayed import com.bitwarden.ui.util.assertNoDialogExists import com.bitwarden.ui.util.isProgressBar import com.bitwarden.ui.util.onNodeWithTextAfterScroll import com.bitwarden.vault.CipherType -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.autofill.model.AutofillSelectionData import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockCipherView import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockLoginView @@ -1950,7 +1950,7 @@ class VaultItemListingScreenTest : BitwardenComposeTest() { mutableStateFlow.update { it.copy( dialogState = VaultItemListingState.DialogState.CredentialManagerOperationFail( - title = R.string.an_error_has_occurred.asText(), + title = BitwardenString.an_error_has_occurred.asText(), message = dialogMessage.asText(), ), ) @@ -2342,7 +2342,7 @@ class VaultItemListingScreenTest : BitwardenComposeTest() { verify(exactly = 1) { viewModel.trySendAction( VaultItemListingsAction.DismissCredentialManagerErrorDialogClick( - message = R.string.passkey_operation_failed_because_the_browser_is_not_trusted + message = BitwardenString.passkey_operation_failed_because_the_browser_is_not_trusted .asText(), ), ) @@ -2419,23 +2419,23 @@ private fun createDisplayItem(number: Int): VaultItemListingState.DisplayItem = extraIconList = persistentListOf( IconData.Local( iconRes = BitwardenDrawable.ic_send_disabled, - contentDescription = R.string.disabled.asText(), + contentDescription = BitwardenString.disabled.asText(), ), IconData.Local( iconRes = BitwardenDrawable.ic_key, - contentDescription = R.string.password.asText(), + contentDescription = BitwardenString.password.asText(), ), IconData.Local( iconRes = BitwardenDrawable.ic_send_max_access_count_reached, - contentDescription = R.string.maximum_access_count_reached.asText(), + contentDescription = BitwardenString.maximum_access_count_reached.asText(), ), IconData.Local( iconRes = BitwardenDrawable.ic_send_expired, - contentDescription = R.string.expired.asText(), + contentDescription = BitwardenString.expired.asText(), ), IconData.Local( iconRes = BitwardenDrawable.ic_send_pending_delete, - contentDescription = R.string.pending_delete.asText(), + contentDescription = BitwardenString.pending_delete.asText(), ), ), overflowOptions = listOf( diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/itemlisting/VaultItemListingViewModelTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/itemlisting/VaultItemListingViewModelTest.kt index 852c537249..1c82928da6 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/itemlisting/VaultItemListingViewModelTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/itemlisting/VaultItemListingViewModelTest.kt @@ -30,6 +30,7 @@ import com.bitwarden.send.SendType import com.bitwarden.ui.platform.base.BaseViewModelTest import com.bitwarden.ui.platform.components.icon.model.IconData import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText import com.bitwarden.ui.util.concat @@ -37,7 +38,6 @@ import com.bitwarden.vault.CipherListView import com.bitwarden.vault.CipherListViewType import com.bitwarden.vault.CipherRepromptType import com.bitwarden.vault.CipherType -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.auth.datasource.disk.model.OnboardingStatus import com.x8bit.bitwarden.data.auth.repository.AuthRepository import com.x8bit.bitwarden.data.auth.repository.model.LogoutReason @@ -366,7 +366,7 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { initialState.copy( createCredentialRequest = createCredentialRequest, dialogState = VaultItemListingState.DialogState.Loading( - message = R.string.loading.asText(), + message = BitwardenString.loading.asText(), ), ), awaitItem(), @@ -579,7 +579,7 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { assertEquals( initialState.copy( dialogState = VaultItemListingState.DialogState.Loading( - message = R.string.syncing.asText(), + message = BitwardenString.syncing.asText(), ), ), viewModel.stateFlow.value, @@ -599,8 +599,8 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { assertEquals( initialState.copy( dialogState = VaultItemListingState.DialogState.Error( - R.string.internet_connection_required_title.asText(), - R.string.internet_connection_required_message.asText(), + BitwardenString.internet_connection_required_title.asText(), + BitwardenString.internet_connection_required_message.asText(), ), ), viewModel.stateFlow.value, @@ -749,8 +749,8 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { assertEquals( VaultItemListingState.DialogState.CredentialManagerOperationFail( - title = R.string.an_error_has_occurred.asText(), - message = R.string + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString .credential_operation_failed_because_the_selected_item_does_not_exist .asText(), ), @@ -862,7 +862,7 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { viewModel.eventFlow.test { assertEquals( - VaultItemListingState.DialogState.Loading(R.string.saving.asText()), + VaultItemListingState.DialogState.Loading(BitwardenString.saving.asText()), viewModel.stateFlow.value.dialogState, ) assertEquals( @@ -1093,7 +1093,7 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { initialState.copy( dialogState = VaultItemListingState.DialogState.Error( title = null, - message = R.string.generic_error_message.asText(), + message = BitwardenString.generic_error_message.asText(), throwable = error, ), ), @@ -1156,7 +1156,7 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { initialState.copy( dialogState = VaultItemListingState.DialogState.Error( title = null, - message = R.string.invalid_master_password.asText(), + message = BitwardenString.invalid_master_password.asText(), ), ), viewModel.stateFlow.value, @@ -1524,8 +1524,8 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { createVaultItemListingState( itemListingType = VaultItemListingState.ItemListingType.Send.SendFile, dialogState = VaultItemListingState.DialogState.Error( - title = R.string.send.asText(), - message = R.string.send_file_premium_required.asText(), + title = BitwardenString.send.asText(), + message = BitwardenString.send_file_premium_required.asText(), ), isPremium = false, ), @@ -1666,7 +1666,7 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { verify(exactly = 1) { clipboardManager.setText( text = sendUrl, - toastDescriptorOverride = R.string.send_link.asText(), + toastDescriptorOverride = BitwardenString.send_link.asText(), ) } } @@ -1691,7 +1691,7 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { assertEquals( initialState.copy( dialogState = VaultItemListingState.DialogState.Loading( - message = R.string.deleting.asText(), + message = BitwardenString.deleting.asText(), ), ), awaitItem(), @@ -1699,8 +1699,8 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { assertEquals( initialState.copy( dialogState = VaultItemListingState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.generic_error_message.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.generic_error_message.asText(), throwable = error, ), ), @@ -1723,7 +1723,7 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { ), ) assertEquals( - VaultItemListingEvent.ShowSnackbar(R.string.send_deleted.asText()), + VaultItemListingEvent.ShowSnackbar(BitwardenString.send_deleted.asText()), awaitItem(), ) } @@ -1764,7 +1764,7 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { assertEquals( initialState.copy( dialogState = VaultItemListingState.DialogState.Loading( - message = R.string.removing_send_password.asText(), + message = BitwardenString.removing_send_password.asText(), ), ), awaitItem(), @@ -1772,8 +1772,8 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { assertEquals( initialState.copy( dialogState = VaultItemListingState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.generic_error_message.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.generic_error_message.asText(), throwable = error, ), ), @@ -1799,7 +1799,7 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { ), ) assertEquals( - VaultItemListingEvent.ShowSnackbar(R.string.password_removed.asText()), + VaultItemListingEvent.ShowSnackbar(BitwardenString.password_removed.asText()), awaitItem(), ) } @@ -1829,7 +1829,7 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { verify(exactly = 1) { clipboardManager.setText( text = notes, - toastDescriptorOverride = R.string.notes.asText(), + toastDescriptorOverride = BitwardenString.notes.asText(), ) } } @@ -1862,7 +1862,7 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { verify(exactly = 1) { clipboardManager.setText( text = number, - toastDescriptorOverride = R.string.number.asText(), + toastDescriptorOverride = BitwardenString.number.asText(), ) } } @@ -1893,7 +1893,7 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { verify(exactly = 1) { clipboardManager.setText( text = password, - toastDescriptorOverride = R.string.password.asText(), + toastDescriptorOverride = BitwardenString.password.asText(), ) organizationEventManager.trackEvent( event = OrganizationEvent.CipherClientCopiedPassword(cipherId = cipherId), @@ -1931,7 +1931,7 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { verify(exactly = 1) { clipboardManager.setText( text = securityCode, - toastDescriptorOverride = R.string.security_code.asText(), + toastDescriptorOverride = BitwardenString.security_code.asText(), ) organizationEventManager.trackEvent( event = OrganizationEvent.CipherClientCopiedCardCode(cipherId = cipherId), @@ -1963,7 +1963,7 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { verify(exactly = 1) { clipboardManager.setText( text = code, - toastDescriptorOverride = R.string.totp.asText(), + toastDescriptorOverride = BitwardenString.totp.asText(), ) } } @@ -2012,7 +2012,7 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { verify(exactly = 1) { clipboardManager.setText( text = username, - toastDescriptorOverride = R.string.username.asText(), + toastDescriptorOverride = BitwardenString.username.asText(), ) } } @@ -2374,9 +2374,9 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { createVaultItemListingState( viewState = VaultItemListingState.ViewState.NoItems( header = null, - message = R.string.no_logins.asText(), + message = BitwardenString.no_logins.asText(), shouldShowAddButton = true, - buttonText = R.string.new_login.asText(), + buttonText = BitwardenString.new_login.asText(), ), ), viewModel.stateFlow.value, @@ -2411,9 +2411,9 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { itemListingType = VaultItemListingState.ItemListingType.Vault.Card, viewState = VaultItemListingState.ViewState.NoItems( header = null, - message = R.string.no_cards.asText(), + message = BitwardenString.no_cards.asText(), shouldShowAddButton = true, - buttonText = R.string.new_card.asText(), + buttonText = BitwardenString.new_card.asText(), ), ), viewModel.stateFlow.value, @@ -2448,9 +2448,9 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { itemListingType = VaultItemListingState.ItemListingType.Vault.Identity, viewState = VaultItemListingState.ViewState.NoItems( header = null, - message = R.string.no_identities.asText(), + message = BitwardenString.no_identities.asText(), shouldShowAddButton = true, - buttonText = R.string.new_identity.asText(), + buttonText = BitwardenString.new_identity.asText(), ), ), viewModel.stateFlow.value, @@ -2485,9 +2485,9 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { itemListingType = VaultItemListingState.ItemListingType.Vault.SecureNote, viewState = VaultItemListingState.ViewState.NoItems( header = null, - message = R.string.no_notes.asText(), + message = BitwardenString.no_notes.asText(), shouldShowAddButton = true, - buttonText = R.string.new_note.asText(), + buttonText = BitwardenString.new_note.asText(), ), ), viewModel.stateFlow.value, @@ -2522,9 +2522,9 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { itemListingType = VaultItemListingState.ItemListingType.Send.SendFile, viewState = VaultItemListingState.ViewState.NoItems( header = null, - message = R.string.no_file_sends.asText(), + message = BitwardenString.no_file_sends.asText(), shouldShowAddButton = true, - buttonText = R.string.new_file_send.asText(), + buttonText = BitwardenString.new_file_send.asText(), ), ), viewModel.stateFlow.value, @@ -2559,9 +2559,9 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { itemListingType = VaultItemListingState.ItemListingType.Send.SendText, viewState = VaultItemListingState.ViewState.NoItems( header = null, - message = R.string.no_text_sends.asText(), + message = BitwardenString.no_text_sends.asText(), shouldShowAddButton = true, - buttonText = R.string.new_text_send.asText(), + buttonText = BitwardenString.new_text_send.asText(), ), ), viewModel.stateFlow.value, @@ -2590,9 +2590,9 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { createVaultItemListingState( viewState = VaultItemListingState.ViewState.NoItems( header = null, - message = R.string.no_logins.asText(), + message = BitwardenString.no_logins.asText(), shouldShowAddButton = true, - buttonText = R.string.new_login.asText(), + buttonText = BitwardenString.new_login.asText(), ), ), viewModel.stateFlow.value, @@ -2671,9 +2671,9 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { createVaultItemListingState( viewState = VaultItemListingState.ViewState.NoItems( header = null, - message = R.string.no_logins.asText(), + message = BitwardenString.no_logins.asText(), shouldShowAddButton = true, - buttonText = R.string.new_login.asText(), + buttonText = BitwardenString.new_login.asText(), ), ), viewModel.stateFlow.value, @@ -2703,9 +2703,9 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { createVaultItemListingState( viewState = VaultItemListingState.ViewState.NoItems( header = null, - message = R.string.no_logins.asText(), + message = BitwardenString.no_logins.asText(), shouldShowAddButton = true, - buttonText = R.string.new_login.asText(), + buttonText = BitwardenString.new_login.asText(), ), ), viewModel.stateFlow.value, @@ -2725,7 +2725,7 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { assertEquals( createVaultItemListingState( viewState = VaultItemListingState.ViewState.Error( - message = R.string.generic_error_message.asText(), + message = BitwardenString.generic_error_message.asText(), ), ), viewModel.stateFlow.value, @@ -2796,9 +2796,9 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { createVaultItemListingState( viewState = VaultItemListingState.ViewState.NoItems( header = null, - message = R.string.no_logins.asText(), + message = BitwardenString.no_logins.asText(), shouldShowAddButton = true, - buttonText = R.string.new_login.asText(), + buttonText = BitwardenString.new_login.asText(), ), ), viewModel.stateFlow.value, @@ -2828,9 +2828,9 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { createVaultItemListingState( viewState = VaultItemListingState.ViewState.NoItems( header = null, - message = R.string.no_logins.asText(), + message = BitwardenString.no_logins.asText(), shouldShowAddButton = true, - buttonText = R.string.new_login.asText(), + buttonText = BitwardenString.new_login.asText(), ), ), viewModel.stateFlow.value, @@ -2848,11 +2848,11 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { assertEquals( createVaultItemListingState( viewState = VaultItemListingState.ViewState.Error( - message = R.string.internet_connection_required_title + message = BitwardenString.internet_connection_required_title .asText() .concat( " ".asText(), - R.string.internet_connection_required_message.asText(), + BitwardenString.internet_connection_required_message.asText(), ), ), ), @@ -2922,9 +2922,9 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { createVaultItemListingState( viewState = VaultItemListingState.ViewState.NoItems( header = null, - message = R.string.no_logins.asText(), + message = BitwardenString.no_logins.asText(), shouldShowAddButton = true, - buttonText = R.string.new_login.asText(), + buttonText = BitwardenString.new_login.asText(), ), ), viewModel.stateFlow.value, @@ -2953,9 +2953,9 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { createVaultItemListingState( viewState = VaultItemListingState.ViewState.NoItems( header = null, - message = R.string.no_logins.asText(), + message = BitwardenString.no_logins.asText(), shouldShowAddButton = true, - buttonText = R.string.new_login.asText(), + buttonText = BitwardenString.new_login.asText(), ), ), viewModel.stateFlow.value, @@ -3028,8 +3028,8 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { initialState.copy( isRefreshing = false, dialogState = VaultItemListingState.DialogState.Error( - R.string.internet_connection_required_title.asText(), - R.string.internet_connection_required_message.asText(), + BitwardenString.internet_connection_required_title.asText(), + BitwardenString.internet_connection_required_message.asText(), ), ), viewModel.stateFlow.value, @@ -3094,8 +3094,8 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { assertEquals( VaultItemListingState.DialogState.CredentialManagerOperationFail( - R.string.an_error_has_occurred.asText(), - R.string.generic_error_message.asText(), + BitwardenString.an_error_has_occurred.asText(), + BitwardenString.generic_error_message.asText(), ), viewModel.stateFlow.value.dialogState, ) @@ -3120,7 +3120,7 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { assertEquals( VaultItemListingState.DialogState.TrustPrivilegedAddPrompt( - message = R.string.passkey_operation_failed_because_browser_x_is_not_trusted + message = BitwardenString.passkey_operation_failed_because_browser_x_is_not_trusted .asText("mockPackageName"), selectedCipherId = null, ), @@ -3150,8 +3150,8 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { assertEquals( VaultItemListingState.DialogState.CredentialManagerOperationFail( - title = R.string.an_error_has_occurred.asText(), - message = R.string.passkey_operation_failed_because_browser_is_not_privileged + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.passkey_operation_failed_because_browser_is_not_privileged .asText(), ), viewModel.stateFlow.value.dialogState, @@ -3177,8 +3177,8 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { assertEquals( VaultItemListingState.DialogState.CredentialManagerOperationFail( - R.string.an_error_has_occurred.asText(), - R.string.passkey_operation_failed_because_browser_signature_does_not_match.asText(), + BitwardenString.an_error_has_occurred.asText(), + BitwardenString.passkey_operation_failed_because_browser_signature_does_not_match.asText(), ), viewModel.stateFlow.value.dialogState, ) @@ -3203,8 +3203,8 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { assertEquals( VaultItemListingState.DialogState.CredentialManagerOperationFail( - R.string.an_error_has_occurred.asText(), - R.string.passkeys_not_supported_for_this_app.asText(), + BitwardenString.an_error_has_occurred.asText(), + BitwardenString.passkeys_not_supported_for_this_app.asText(), ), viewModel.stateFlow.value.dialogState, ) @@ -3229,8 +3229,8 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { assertEquals( VaultItemListingState.DialogState.CredentialManagerOperationFail( - R.string.an_error_has_occurred.asText(), - R.string.passkey_operation_failed_because_of_missing_asset_links.asText(), + BitwardenString.an_error_has_occurred.asText(), + BitwardenString.passkey_operation_failed_because_of_missing_asset_links.asText(), ), viewModel.stateFlow.value.dialogState, ) @@ -3253,14 +3253,14 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { assertEquals( VaultItemListingEvent.CompleteFido2Registration( RegisterFido2CredentialResult.Error( - R.string.passkey_registration_failed_due_to_an_internal_error.asText(), + BitwardenString.passkey_registration_failed_due_to_an_internal_error.asText(), ), ), awaitItem(), ) } verify { - toastManager.show(messageId = R.string.an_error_has_occurred) + toastManager.show(messageId = BitwardenString.an_error_has_occurred) } } @@ -3290,7 +3290,7 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { ) } verify { - toastManager.show(messageId = R.string.item_updated) + toastManager.show(messageId = BitwardenString.item_updated) } } @@ -3361,7 +3361,7 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { ) assertEquals( VaultItemListingState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), + title = BitwardenString.an_error_has_occurred.asText(), message = "".asText(), ), viewModel.stateFlow.value.dialogState, @@ -3499,8 +3499,8 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { assertEquals( VaultItemListingState.DialogState.CredentialManagerOperationFail( - title = R.string.an_error_has_occurred.asText(), - message = R.string.generic_error_message.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.generic_error_message.asText(), ), viewModel.stateFlow.value.dialogState, ) @@ -3546,9 +3546,9 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { assertEquals( VaultItemListingState.DialogState.CredentialManagerOperationFail( - title = R.string.an_error_has_occurred.asText(), + title = BitwardenString.an_error_has_occurred.asText(), message = - R.string.passkey_operation_failed_because_app_could_not_be_verified + BitwardenString.passkey_operation_failed_because_app_could_not_be_verified .asText(), ), viewModel.stateFlow.value.dialogState, @@ -3586,8 +3586,8 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { assertEquals( VaultItemListingState.DialogState.CredentialManagerOperationFail( - title = R.string.an_error_has_occurred.asText(), - message = R.string.generic_error_message.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.generic_error_message.asText(), ), viewModel.stateFlow.value.dialogState, ) @@ -3636,7 +3636,7 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { viewModel.eventFlow.test { assertEquals( - VaultItemListingState.DialogState.Loading(R.string.loading.asText()), + VaultItemListingState.DialogState.Loading(BitwardenString.loading.asText()), viewModel.stateFlow.value.dialogState, ) verify { bitwardenCredentialManager.isUserVerified } @@ -3698,7 +3698,7 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { mutableVaultDataStateFlow.value = dataState viewModel.eventFlow.test { assertEquals( - VaultItemListingState.DialogState.Loading(R.string.loading.asText()), + VaultItemListingState.DialogState.Loading(BitwardenString.loading.asText()), viewModel.stateFlow.value.dialogState, ) verify { bitwardenCredentialManager.isUserVerified } @@ -3825,10 +3825,10 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { viewModel.stateFlow.test { assertEquals( VaultItemListingState.DialogState.CredentialManagerOperationFail( - title = R.string.an_error_has_occurred.asText(), - message = - R.string.passkey_operation_failed_because_relying_party_cannot_be_identified - .asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString + .passkey_operation_failed_because_relying_party_cannot_be_identified + .asText(), ), awaitItem().dialogState, ) @@ -3874,8 +3874,8 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { viewModel.stateFlow.test { assertEquals( VaultItemListingState.DialogState.CredentialManagerOperationFail( - title = R.string.an_error_has_occurred.asText(), - message = R.string.generic_error_message.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.generic_error_message.asText(), ), awaitItem().dialogState, ) @@ -3995,8 +3995,9 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { assertEquals( VaultItemListingState.DialogState.CredentialManagerOperationFail( - title = R.string.an_error_has_occurred.asText(), - message = R.string.passkey_operation_failed_because_user_could_not_be_verified + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString + .passkey_operation_failed_because_user_could_not_be_verified .asText(), ), viewModel.stateFlow.value.dialogState, @@ -4152,8 +4153,10 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { verify { bitwardenCredentialManager.isUserVerified = false } assertEquals( VaultItemListingState.DialogState.CredentialManagerOperationFail( - title = R.string.an_error_has_occurred.asText(), - message = R.string.credential_operation_failed_because_user_is_locked_out.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString + .credential_operation_failed_because_user_is_locked_out + .asText(), ), viewModel.stateFlow.value.dialogState, ) @@ -4213,8 +4216,9 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { verify { bitwardenCredentialManager.isUserVerified = false } assertEquals( VaultItemListingState.DialogState.CredentialManagerOperationFail( - title = R.string.an_error_has_occurred.asText(), - message = R.string.credential_operation_failed_because_user_could_not_be_verified + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString + .credential_operation_failed_because_user_could_not_be_verified .asText(), ), viewModel.stateFlow.value.dialogState, @@ -4246,8 +4250,9 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { assertEquals( VaultItemListingState.DialogState.CredentialManagerOperationFail( - title = R.string.an_error_has_occurred.asText(), - message = R.string.passkey_operation_failed_because_the_request_is_invalid + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString + .passkey_operation_failed_because_the_request_is_invalid .asText(), ), viewModel.stateFlow.value.dialogState, @@ -4286,8 +4291,9 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { assertEquals( VaultItemListingState.DialogState.CredentialManagerOperationFail( - title = R.string.an_error_has_occurred.asText(), - message = R.string.passkey_operation_failed_because_the_request_is_invalid + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString + .passkey_operation_failed_because_the_request_is_invalid .asText(), ), viewModel.stateFlow.value.dialogState, @@ -4314,8 +4320,9 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { assertEquals( VaultItemListingState.DialogState.CredentialManagerOperationFail( - title = R.string.an_error_has_occurred.asText(), - message = R.string.passkey_operation_failed_because_user_could_not_be_verified + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString + .passkey_operation_failed_because_user_could_not_be_verified .asText(), ), viewModel.stateFlow.value.dialogState, @@ -4431,8 +4438,9 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { verify { bitwardenCredentialManager.isUserVerified = false } assertEquals( VaultItemListingState.DialogState.CredentialManagerOperationFail( - title = R.string.an_error_has_occurred.asText(), - message = R.string.credential_operation_failed_because_user_could_not_be_verified + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString + .credential_operation_failed_because_user_could_not_be_verified .asText(), ), viewModel.stateFlow.value.dialogState, @@ -4455,8 +4463,9 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { verify { bitwardenCredentialManager.isUserVerified = false } assertEquals( VaultItemListingState.DialogState.CredentialManagerOperationFail( - title = R.string.an_error_has_occurred.asText(), - message = R.string.credential_operation_failed_because_user_could_not_be_verified + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString + .credential_operation_failed_because_user_could_not_be_verified .asText(), ), viewModel.stateFlow.value.dialogState, @@ -4567,8 +4576,9 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { assertEquals( VaultItemListingState.DialogState.CredentialManagerOperationFail( - title = R.string.an_error_has_occurred.asText(), - message = R.string.credential_operation_failed_because_user_could_not_be_verified + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString + .credential_operation_failed_because_user_could_not_be_verified .asText(), ), viewModel.stateFlow.value.dialogState, @@ -4598,7 +4608,7 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { assertEquals( VaultItemListingState.DialogState.UserVerificationMasterPasswordError( title = null, - message = R.string.invalid_master_password.asText(), + message = BitwardenString.invalid_master_password.asText(), selectedCipherId = selectedCipherId, ), viewModel.stateFlow.value.dialogState, @@ -4628,8 +4638,8 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { assertEquals( VaultItemListingState.DialogState.CredentialManagerOperationFail( - title = R.string.an_error_has_occurred.asText(), - message = R.string + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString .credential_operation_failed_because_user_verification_attempts_exceeded .asText(), ), @@ -4662,8 +4672,9 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { assertEquals( VaultItemListingState.DialogState.CredentialManagerOperationFail( - title = R.string.an_error_has_occurred.asText(), - message = R.string.credential_operation_failed_because_the_selected_item_does_not_exist + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString + .credential_operation_failed_because_the_selected_item_does_not_exist .asText(), ), viewModel.stateFlow.value.dialogState, @@ -4746,8 +4757,9 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { assertEquals( VaultItemListingState.DialogState.CredentialManagerOperationFail( - title = R.string.an_error_has_occurred.asText(), - message = R.string.credential_operation_failed_because_user_could_not_be_verified + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString + .credential_operation_failed_because_user_could_not_be_verified .asText(), ), viewModel.stateFlow.value.dialogState, @@ -4777,7 +4789,7 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { assertEquals( VaultItemListingState.DialogState.UserVerificationPinError( title = null, - message = R.string.invalid_pin.asText(), + message = BitwardenString.invalid_pin.asText(), selectedCipherId = selectedCipherId, ), viewModel.stateFlow.value.dialogState, @@ -4807,8 +4819,8 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { assertEquals( VaultItemListingState.DialogState.CredentialManagerOperationFail( - title = R.string.an_error_has_occurred.asText(), - message = R.string + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString .credential_operation_failed_because_user_verification_attempts_exceeded .asText(), ), @@ -4841,8 +4853,9 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { assertEquals( VaultItemListingState.DialogState.CredentialManagerOperationFail( - title = R.string.an_error_has_occurred.asText(), - message = R.string.credential_operation_failed_because_the_selected_item_does_not_exist + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString + .credential_operation_failed_because_the_selected_item_does_not_exist .asText(), ), viewModel.stateFlow.value.dialogState, @@ -4921,7 +4934,8 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { assertEquals( VaultItemListingState.DialogState.UserVerificationPinSetUpError( title = null, - message = R.string.validation_field_required.asText(R.string.pin.asText()), + message = BitwardenString.validation_field_required + .asText(BitwardenString.pin.asText()), selectedCipherId = selectedCipherId, ), viewModel.stateFlow.value.dialogState, @@ -4997,9 +5011,10 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { assertEquals( VaultItemListingState.DialogState.CredentialManagerOperationFail( - title = R.string.an_error_has_occurred.asText(), + title = BitwardenString.an_error_has_occurred.asText(), message = - R.string.credential_operation_failed_because_user_verification_was_cancelled + BitwardenString + .credential_operation_failed_because_user_verification_was_cancelled .asText(), ), viewModel.stateFlow.value.dialogState, @@ -5075,8 +5090,9 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { assertEquals( VaultItemListingState.DialogState.CredentialManagerOperationFail( - R.string.an_error_has_occurred.asText(), - R.string.credential_operation_failed_because_the_selected_item_does_not_exist + BitwardenString.an_error_has_occurred.asText(), + BitwardenString + .credential_operation_failed_because_the_selected_item_does_not_exist .asText(), ), viewModel.stateFlow.value.dialogState, @@ -5150,8 +5166,8 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { assertEquals( VaultItemListingState.DialogState.CredentialManagerOperationFail( - title = R.string.an_error_has_occurred.asText(), - message = R.string + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString .credential_operation_failed_because_the_selected_item_does_not_exist .asText(), ), @@ -5202,8 +5218,8 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { assertEquals( VaultItemListingState.DialogState.CredentialManagerOperationFail( - title = R.string.an_error_has_occurred.asText(), - message = R.string + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString .credential_operation_failed_because_the_selected_item_does_not_exist .asText(), ), @@ -5365,8 +5381,8 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { initialState.copy( isRefreshing = false, dialogState = VaultItemListingState.DialogState.Error( - R.string.internet_connection_required_title.asText(), - R.string.internet_connection_required_message.asText(), + BitwardenString.internet_connection_required_title.asText(), + BitwardenString.internet_connection_required_message.asText(), ), ), viewModel.stateFlow.value, @@ -5429,8 +5445,9 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { assertEquals( VaultItemListingState.DialogState.CredentialManagerOperationFail( - title = R.string.an_error_has_occurred.asText(), - message = R.string.passkey_operation_failed_because_the_request_is_invalid + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString + .passkey_operation_failed_because_the_request_is_invalid .asText(), ), viewModel.stateFlow.value.dialogState, @@ -5509,8 +5526,9 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { assertEquals( VaultItemListingState.DialogState.CredentialManagerOperationFail( - title = R.string.an_error_has_occurred.asText(), - message = R.string.passkey_operation_failed_because_the_request_is_invalid + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString + .passkey_operation_failed_because_the_request_is_invalid .asText(), ), viewModel.stateFlow.value.dialogState, @@ -5548,8 +5566,9 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { assertEquals( VaultItemListingState.DialogState.CredentialManagerOperationFail( - title = R.string.an_error_has_occurred.asText(), - message = R.string.passkey_operation_failed_because_the_request_is_invalid + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString + .passkey_operation_failed_because_the_request_is_invalid .asText(), ), viewModel.stateFlow.value.dialogState, @@ -5696,8 +5715,9 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { assertEquals( VaultItemListingState.DialogState.CredentialManagerOperationFail( - title = R.string.an_error_has_occurred.asText(), - message = R.string.passkey_operation_failed_because_the_request_is_invalid + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString + .passkey_operation_failed_because_the_request_is_invalid .asText(), ), viewModel.stateFlow.value.dialogState, @@ -5772,8 +5792,8 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { assertEquals( VaultItemListingState.DialogState.CredentialManagerOperationFail( - title = R.string.an_error_has_occurred.asText(), - message = R.string + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString .credential_operation_failed_because_the_selected_item_does_not_exist .asText(), ), diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/itemlisting/util/VaultItemListingDataExtensionsTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/itemlisting/util/VaultItemListingDataExtensionsTest.kt index c3c1e145ff..10e0cef604 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/itemlisting/util/VaultItemListingDataExtensionsTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/itemlisting/util/VaultItemListingDataExtensionsTest.kt @@ -11,6 +11,7 @@ import com.bitwarden.send.SendType import com.bitwarden.send.SendView import com.bitwarden.ui.platform.components.icon.model.IconData import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.asText import com.bitwarden.vault.CipherListViewType import com.bitwarden.vault.CipherRepromptType @@ -18,7 +19,6 @@ import com.bitwarden.vault.CipherType import com.bitwarden.vault.CipherView import com.bitwarden.vault.CopyableCipherFields import com.bitwarden.vault.FolderView -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.autofill.model.AutofillSelectionData import com.x8bit.bitwarden.data.credentials.model.CreateCredentialRequest import com.x8bit.bitwarden.data.platform.util.subtitle @@ -721,9 +721,9 @@ class VaultItemListingDataExtensionsTest { // Trash assertEquals( VaultItemListingState.ViewState.NoItems( - message = R.string.no_items_trash.asText(), + message = BitwardenString.no_items_trash.asText(), shouldShowAddButton = false, - buttonText = R.string.new_item.asText(), + buttonText = BitwardenString.new_item.asText(), ), vaultData.toViewState( itemListingType = VaultItemListingState.ItemListingType.Vault.Trash, @@ -742,9 +742,9 @@ class VaultItemListingDataExtensionsTest { // Folders assertEquals( VaultItemListingState.ViewState.NoItems( - message = R.string.no_items_folder.asText(), + message = BitwardenString.no_items_folder.asText(), shouldShowAddButton = true, - buttonText = R.string.new_item.asText(), + buttonText = BitwardenString.new_item.asText(), ), vaultData.toViewState( itemListingType = VaultItemListingState.ItemListingType.Vault.Folder( @@ -765,9 +765,9 @@ class VaultItemListingDataExtensionsTest { // SSH keys assertEquals( VaultItemListingState.ViewState.NoItems( - message = R.string.no_ssh_keys.asText(), + message = BitwardenString.no_ssh_keys.asText(), shouldShowAddButton = false, - buttonText = R.string.new_ssh_key.asText(), + buttonText = BitwardenString.new_ssh_key.asText(), ), vaultData.toViewState( itemListingType = VaultItemListingState.ItemListingType.Vault.SshKey, @@ -787,9 +787,9 @@ class VaultItemListingDataExtensionsTest { // Login Type assertEquals( VaultItemListingState.ViewState.NoItems( - message = R.string.no_logins.asText(), + message = BitwardenString.no_logins.asText(), shouldShowAddButton = true, - buttonText = R.string.new_login.asText(), + buttonText = BitwardenString.new_login.asText(), ), vaultData.toViewState( itemListingType = VaultItemListingState.ItemListingType.Vault.Login, @@ -808,9 +808,9 @@ class VaultItemListingDataExtensionsTest { // Card type assertEquals( VaultItemListingState.ViewState.NoItems( - message = R.string.no_cards.asText(), + message = BitwardenString.no_cards.asText(), shouldShowAddButton = true, - buttonText = R.string.new_card.asText(), + buttonText = BitwardenString.new_card.asText(), ), vaultData.toViewState( itemListingType = VaultItemListingState.ItemListingType.Vault.Card, @@ -829,9 +829,9 @@ class VaultItemListingDataExtensionsTest { // Secure note type assertEquals( VaultItemListingState.ViewState.NoItems( - message = R.string.no_notes.asText(), + message = BitwardenString.no_notes.asText(), shouldShowAddButton = true, - buttonText = R.string.new_note.asText(), + buttonText = BitwardenString.new_note.asText(), ), vaultData.toViewState( itemListingType = VaultItemListingState.ItemListingType.Vault.SecureNote, @@ -850,9 +850,9 @@ class VaultItemListingDataExtensionsTest { // Identity type assertEquals( VaultItemListingState.ViewState.NoItems( - message = R.string.no_identities.asText(), + message = BitwardenString.no_identities.asText(), shouldShowAddButton = true, - buttonText = R.string.new_identity.asText(), + buttonText = BitwardenString.new_identity.asText(), ), vaultData.toViewState( itemListingType = VaultItemListingState.ItemListingType.Vault.Identity, @@ -871,9 +871,9 @@ class VaultItemListingDataExtensionsTest { // Autofill assertEquals( VaultItemListingState.ViewState.NoItems( - message = R.string.no_items_for_uri.asText("www.test.com"), + message = BitwardenString.no_items_for_uri.asText("www.test.com"), shouldShowAddButton = true, - buttonText = R.string.new_login.asText(), + buttonText = BitwardenString.new_login.asText(), ), vaultData.toViewState( itemListingType = VaultItemListingState.ItemListingType.Vault.Login, @@ -896,9 +896,9 @@ class VaultItemListingDataExtensionsTest { // Autofill passkey assertEquals( VaultItemListingState.ViewState.NoItems( - message = R.string.no_items_for_uri.asText("www.test.com"), + message = BitwardenString.no_items_for_uri.asText("www.test.com"), shouldShowAddButton = true, - buttonText = R.string.save_passkey_as_new_login.asText(), + buttonText = BitwardenString.save_passkey_as_new_login.asText(), ), vaultData.toViewState( itemListingType = VaultItemListingState.ItemListingType.Vault.Login, @@ -921,10 +921,10 @@ class VaultItemListingDataExtensionsTest { // Totp assertEquals( VaultItemListingState.ViewState.NoItems( - header = R.string.no_items_for_vault.asText("issuer"), - message = R.string.search_for_a_login_or_add_a_new_login.asText(), + header = BitwardenString.no_items_for_vault.asText("issuer"), + message = BitwardenString.search_for_a_login_or_add_a_new_login.asText(), shouldShowAddButton = false, - buttonText = R.string.new_item.asText(), + buttonText = BitwardenString.new_item.asText(), vectorRes = BitwardenDrawable.img_folder_question, ), vaultData.toViewState( @@ -990,9 +990,9 @@ class VaultItemListingDataExtensionsTest { assertEquals( VaultItemListingState.ViewState.NoItems( - message = R.string.no_file_sends.asText(), + message = BitwardenString.no_file_sends.asText(), shouldShowAddButton = true, - buttonText = R.string.new_file_send.asText(), + buttonText = BitwardenString.new_file_send.asText(), ), result, ) @@ -1008,9 +1008,9 @@ class VaultItemListingDataExtensionsTest { assertEquals( VaultItemListingState.ViewState.NoItems( - message = R.string.no_text_sends.asText(), + message = BitwardenString.no_text_sends.asText(), shouldShowAddButton = true, - buttonText = R.string.new_text_send.asText(), + buttonText = BitwardenString.new_text_send.asText(), ), result, ) @@ -1375,9 +1375,9 @@ class VaultItemListingDataExtensionsTest { // Card type assertEquals( VaultItemListingState.ViewState.NoItems( - message = R.string.no_cards.asText(), + message = BitwardenString.no_cards.asText(), shouldShowAddButton = false, - buttonText = R.string.new_card.asText(), + buttonText = BitwardenString.new_card.asText(), ), actual, ) diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/itemlisting/util/VaultItemListingDataUtil.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/itemlisting/util/VaultItemListingDataUtil.kt index 7e0a543184..a0513c93c4 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/itemlisting/util/VaultItemListingDataUtil.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/itemlisting/util/VaultItemListingDataUtil.kt @@ -3,9 +3,9 @@ package com.x8bit.bitwarden.ui.vault.feature.itemlisting.util import com.bitwarden.send.SendType import com.bitwarden.ui.platform.components.icon.model.IconData import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.asText import com.bitwarden.vault.CipherType -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.vault.feature.itemlisting.VaultItemListingState import com.x8bit.bitwarden.ui.vault.feature.itemlisting.model.ListingItemOverflowAction import kotlinx.collections.immutable.persistentListOf @@ -44,12 +44,12 @@ fun createMockDisplayItemForCipher( extraIconList = persistentListOf( IconData.Local( iconRes = BitwardenDrawable.ic_collections, - contentDescription = R.string.collections.asText(), + contentDescription = BitwardenString.collections.asText(), testTag = "CipherInCollectionIcon", ), IconData.Local( iconRes = BitwardenDrawable.ic_paperclip, - contentDescription = R.string.attachments.asText(), + contentDescription = BitwardenString.attachments.asText(), testTag = "CipherWithAttachmentsIcon", ), ), @@ -101,12 +101,12 @@ fun createMockDisplayItemForCipher( extraIconList = persistentListOf( IconData.Local( iconRes = BitwardenDrawable.ic_collections, - contentDescription = R.string.collections.asText(), + contentDescription = BitwardenString.collections.asText(), testTag = "CipherInCollectionIcon", ), IconData.Local( iconRes = BitwardenDrawable.ic_paperclip, - contentDescription = R.string.attachments.asText(), + contentDescription = BitwardenString.attachments.asText(), testTag = "CipherWithAttachmentsIcon", ), ), @@ -148,12 +148,12 @@ fun createMockDisplayItemForCipher( extraIconList = persistentListOf( IconData.Local( iconRes = BitwardenDrawable.ic_collections, - contentDescription = R.string.collections.asText(), + contentDescription = BitwardenString.collections.asText(), testTag = "CipherInCollectionIcon", ), IconData.Local( iconRes = BitwardenDrawable.ic_paperclip, - contentDescription = R.string.attachments.asText(), + contentDescription = BitwardenString.attachments.asText(), testTag = "CipherWithAttachmentsIcon", ), ), @@ -199,12 +199,12 @@ fun createMockDisplayItemForCipher( extraIconList = persistentListOf( IconData.Local( iconRes = BitwardenDrawable.ic_collections, - contentDescription = R.string.collections.asText(), + contentDescription = BitwardenString.collections.asText(), testTag = "CipherInCollectionIcon", ), IconData.Local( iconRes = BitwardenDrawable.ic_paperclip, - contentDescription = R.string.attachments.asText(), + contentDescription = BitwardenString.attachments.asText(), testTag = "CipherWithAttachmentsIcon", ), ), @@ -242,12 +242,12 @@ fun createMockDisplayItemForCipher( extraIconList = persistentListOf( IconData.Local( iconRes = BitwardenDrawable.ic_collections, - contentDescription = R.string.collections.asText(), + contentDescription = BitwardenString.collections.asText(), testTag = "CipherInCollectionIcon", ), IconData.Local( iconRes = BitwardenDrawable.ic_paperclip, - contentDescription = R.string.attachments.asText(), + contentDescription = BitwardenString.attachments.asText(), testTag = "CipherWithAttachmentsIcon", ), ), @@ -295,12 +295,12 @@ fun createMockDisplayItemForSend( extraIconList = persistentListOf( IconData.Local( iconRes = BitwardenDrawable.ic_key, - contentDescription = R.string.password.asText(), + contentDescription = BitwardenString.password.asText(), testTag = "PasswordProtectedSendIcon", ), IconData.Local( iconRes = BitwardenDrawable.ic_send_max_access_count_reached, - contentDescription = R.string.maximum_access_count_reached.asText(), + contentDescription = BitwardenString.maximum_access_count_reached.asText(), testTag = "MaxAccessSendIcon", ), ), @@ -344,12 +344,12 @@ fun createMockDisplayItemForSend( extraIconList = persistentListOf( IconData.Local( iconRes = BitwardenDrawable.ic_key, - contentDescription = R.string.password.asText(), + contentDescription = BitwardenString.password.asText(), testTag = "PasswordProtectedSendIcon", ), IconData.Local( iconRes = BitwardenDrawable.ic_send_max_access_count_reached, - contentDescription = R.string.maximum_access_count_reached.asText(), + contentDescription = BitwardenString.maximum_access_count_reached.asText(), testTag = "MaxAccessSendIcon", ), ), diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/manualcodeentry/ManualCodeEntryScreenTests.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/manualcodeentry/ManualCodeEntryScreenTests.kt index 70c47674a1..5799cd2987 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/manualcodeentry/ManualCodeEntryScreenTests.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/manualcodeentry/ManualCodeEntryScreenTests.kt @@ -16,10 +16,10 @@ import androidx.compose.ui.test.performClick import androidx.compose.ui.test.performTextInput import androidx.test.core.app.ApplicationProvider import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.asText import com.bitwarden.ui.util.assertNoDialogExists import com.bitwarden.ui.util.performCustomAccessibilityAction -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.platform.base.BitwardenComposeTest import com.x8bit.bitwarden.ui.platform.manager.intent.IntentManager import com.x8bit.bitwarden.ui.platform.manager.permissions.FakePermissionManager @@ -140,8 +140,8 @@ class ManualCodeEntryScreenTests : BitwardenComposeTest() { mutableStateFlow.update { it.copy( dialog = ManualCodeEntryState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.authenticator_key_read_error.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.authenticator_key_read_error.asText(), ), ) } @@ -169,8 +169,8 @@ class ManualCodeEntryScreenTests : BitwardenComposeTest() { mutableStateFlow.update { it.copy( dialog = ManualCodeEntryState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.authenticator_key_read_error.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.authenticator_key_read_error.asText(), ), ) } diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/manualcodeentry/ManualCodeEntryViewModelTests.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/manualcodeentry/ManualCodeEntryViewModelTests.kt index 83b8a6d9f7..9c11a15ffb 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/manualcodeentry/ManualCodeEntryViewModelTests.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/manualcodeentry/ManualCodeEntryViewModelTests.kt @@ -4,8 +4,8 @@ import androidx.lifecycle.SavedStateHandle import app.cash.turbine.test import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow import com.bitwarden.ui.platform.base.BaseViewModelTest +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.vault.repository.VaultRepository import com.x8bit.bitwarden.data.vault.repository.model.TotpCodeResult import io.mockk.every @@ -49,8 +49,8 @@ class ManualCodeEntryViewModelTests : BaseViewModelTest() { assertEquals( initialState.copy( dialog = ManualCodeEntryState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.authenticator_key_read_error.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.authenticator_key_read_error.asText(), ), ), viewModel.stateFlow.value, diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/VaultMoveToOrganizationViewModelTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/VaultMoveToOrganizationViewModelTest.kt index 8879c55782..994e59d695 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/VaultMoveToOrganizationViewModelTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/VaultMoveToOrganizationViewModelTest.kt @@ -6,11 +6,11 @@ import com.bitwarden.core.data.repository.model.DataState import com.bitwarden.data.repository.model.Environment import com.bitwarden.network.model.OrganizationType import com.bitwarden.ui.platform.base.BaseViewModelTest +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.asText import com.bitwarden.ui.util.concat import com.bitwarden.vault.CipherView import com.bitwarden.vault.CollectionView -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.auth.datasource.disk.model.OnboardingStatus import com.x8bit.bitwarden.data.auth.repository.AuthRepository import com.x8bit.bitwarden.data.auth.repository.model.Organization @@ -229,7 +229,7 @@ class VaultMoveToOrganizationViewModelTest : BaseViewModelTest() { assertEquals( initialState.copy( viewState = VaultMoveToOrganizationState.ViewState.Error( - message = R.string.generic_error_message.asText(), + message = BitwardenString.generic_error_message.asText(), ), ), awaitItem(), @@ -248,11 +248,11 @@ class VaultMoveToOrganizationViewModelTest : BaseViewModelTest() { assertEquals( initialState.copy( viewState = VaultMoveToOrganizationState.ViewState.Error( - message = R.string.internet_connection_required_title + message = BitwardenString.internet_connection_required_title .asText() .concat( " ".asText(), - R.string.internet_connection_required_message.asText(), + BitwardenString.internet_connection_required_message.asText(), ), ), ), @@ -289,7 +289,7 @@ class VaultMoveToOrganizationViewModelTest : BaseViewModelTest() { assertEquals( initialState.copy( dialogState = VaultMoveToOrganizationState.DialogState.Loading( - message = R.string.saving.asText(), + message = BitwardenString.saving.asText(), ), viewState = VaultMoveToOrganizationState.ViewState.Content( organizations = createMockOrganizationList(), @@ -350,7 +350,7 @@ class VaultMoveToOrganizationViewModelTest : BaseViewModelTest() { assertEquals( initialState.copy( dialogState = VaultMoveToOrganizationState.DialogState.Loading( - message = R.string.saving.asText(), + message = BitwardenString.saving.asText(), ), viewState = VaultMoveToOrganizationState.ViewState.Content( organizations = createMockOrganizationList(), @@ -363,7 +363,7 @@ class VaultMoveToOrganizationViewModelTest : BaseViewModelTest() { assertEquals( initialState.copy( dialogState = VaultMoveToOrganizationState.DialogState.Error( - message = R.string.generic_error_message.asText(), + message = BitwardenString.generic_error_message.asText(), throwable = error, ), viewState = VaultMoveToOrganizationState.ViewState.Content( @@ -408,7 +408,7 @@ class VaultMoveToOrganizationViewModelTest : BaseViewModelTest() { verify { snackbarRelayManager.sendSnackbarData( data = BitwardenSnackbarData( - message = R.string.moved_item_to_org.asText( + message = BitwardenString.moved_item_to_org.asText( "mockName-1", "mockOrganizationName-1", ), @@ -454,7 +454,7 @@ class VaultMoveToOrganizationViewModelTest : BaseViewModelTest() { } verify { snackbarRelayManager.sendSnackbarData( - data = BitwardenSnackbarData(message = R.string.item_updated.asText()), + data = BitwardenSnackbarData(message = BitwardenString.item_updated.asText()), relay = SnackbarRelay.CIPHER_MOVED_TO_ORGANIZATION, ) } diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/util/VaultMoveToOrganizationExtensionsTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/util/VaultMoveToOrganizationExtensionsTest.kt index d781d8aa80..f38cb86916 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/util/VaultMoveToOrganizationExtensionsTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/util/VaultMoveToOrganizationExtensionsTest.kt @@ -2,8 +2,8 @@ package com.x8bit.bitwarden.ui.vault.feature.movetoorganization.util import com.bitwarden.data.repository.model.Environment import com.bitwarden.network.model.OrganizationType +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.auth.datasource.disk.model.OnboardingStatus import com.x8bit.bitwarden.data.auth.repository.model.Organization import com.x8bit.bitwarden.data.auth.repository.model.UserState @@ -57,7 +57,7 @@ class VaultMoveToOrganizationExtensionsTest { val result = triple.toViewState() assertEquals( - VaultMoveToOrganizationState.ViewState.Error(R.string.generic_error_message.asText()), + VaultMoveToOrganizationState.ViewState.Error(BitwardenString.generic_error_message.asText()), result, ) } diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/vault/VaultScreenTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/vault/VaultScreenTest.kt index a86c4110fa..3811726336 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/vault/VaultScreenTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/vault/VaultScreenTest.kt @@ -25,12 +25,12 @@ import androidx.core.net.toUri import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow import com.bitwarden.data.repository.model.Environment import com.bitwarden.data.repository.util.baseIconUrl +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.asText import com.bitwarden.ui.util.assertNoDialogExists import com.bitwarden.ui.util.assertScrollableNodeDoesNotExist import com.bitwarden.ui.util.onNodeWithTextAfterScroll import com.bitwarden.vault.CipherType -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.util.advanceTimeByAndRunCurrent import com.x8bit.bitwarden.ui.platform.base.BitwardenComposeTest import com.x8bit.bitwarden.ui.platform.components.model.AccountSummary @@ -133,7 +133,7 @@ class VaultScreenTest : BitwardenComposeTest() { composeTestRule.onNodeWithText("Vaults").assertDoesNotExist() mutableStateFlow.update { - it.copy(appBarTitle = R.string.vaults.asText()) + it.copy(appBarTitle = BitwardenString.vaults.asText()) } composeTestRule.onNodeWithText("My vault").assertDoesNotExist() @@ -1974,12 +1974,12 @@ class VaultScreenTest : BitwardenComposeTest() { mutableStateFlow.update { it.copy( flightRecorderSnackBar = BitwardenSnackbarData( - message = R.string.flight_recorder_banner_message.asText( + message = BitwardenString.flight_recorder_banner_message.asText( "4/12/25", "9:15 AM", ), - messageHeader = R.string.flight_recorder_banner_title.asText(), - actionLabel = R.string.go_to_settings.asText(), + messageHeader = BitwardenString.flight_recorder_banner_title.asText(), + actionLabel = BitwardenString.go_to_settings.asText(), withDismissAction = true, ), ) @@ -1999,12 +1999,12 @@ class VaultScreenTest : BitwardenComposeTest() { mutableStateFlow.update { it.copy( flightRecorderSnackBar = BitwardenSnackbarData( - message = R.string.flight_recorder_banner_message.asText( + message = BitwardenString.flight_recorder_banner_message.asText( "4/12/25", "9:15 AM", ), - messageHeader = R.string.flight_recorder_banner_title.asText(), - actionLabel = R.string.go_to_settings.asText(), + messageHeader = BitwardenString.flight_recorder_banner_title.asText(), + actionLabel = BitwardenString.go_to_settings.asText(), withDismissAction = true, ), ) @@ -2055,7 +2055,7 @@ private val VAULT_FILTER_DATA = VaultFilterData( ) private val DEFAULT_STATE: VaultState = VaultState( - appBarTitle = R.string.my_vault.asText(), + appBarTitle = BitwardenString.my_vault.asText(), avatarColorString = "#aa00aa", initials = "AU", accountSummaries = persistentListOf( diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/vault/VaultViewModelTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/vault/VaultViewModelTest.kt index 7bd86e7f47..b090367f14 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/vault/VaultViewModelTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/vault/VaultViewModelTest.kt @@ -9,11 +9,11 @@ import com.bitwarden.network.model.OrganizationType import com.bitwarden.network.model.PolicyTypeJson import com.bitwarden.network.model.SyncResponseJson import com.bitwarden.ui.platform.base.BaseViewModelTest +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText import com.bitwarden.vault.CipherListViewType import com.bitwarden.vault.CipherType -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.auth.datasource.disk.model.OnboardingStatus import com.x8bit.bitwarden.data.auth.repository.AuthRepository import com.x8bit.bitwarden.data.auth.repository.model.LogoutReason @@ -299,7 +299,7 @@ class VaultViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( - appBarTitle = R.string.vaults.asText(), + appBarTitle = BitwardenString.vaults.asText(), avatarColorString = "#00aaaa", initials = "OU", accountSummaries = listOf( @@ -387,7 +387,7 @@ class VaultViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( - appBarTitle = R.string.vaults.asText(), + appBarTitle = BitwardenString.vaults.asText(), avatarColorString = "#00aaaa", initials = "OU", accountSummaries = listOf( @@ -658,8 +658,8 @@ class VaultViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialog = VaultState.DialogState.Error( - R.string.internet_connection_required_title.asText(), - R.string.internet_connection_required_message.asText(), + BitwardenString.internet_connection_required_title.asText(), + BitwardenString.internet_connection_required_message.asText(), ), ), viewModel.stateFlow.value, @@ -733,7 +733,7 @@ class VaultViewModelTest : BaseViewModelTest() { ), ) .copy( - appBarTitle = R.string.vaults.asText(), + appBarTitle = BitwardenString.vaults.asText(), vaultFilterData = VAULT_FILTER_DATA, ) assertEquals( @@ -854,7 +854,7 @@ class VaultViewModelTest : BaseViewModelTest() { ), VaultState.ViewState.FolderItem( id = null, - name = R.string.folder_none.asText(), + name = BitwardenString.folder_none.asText(), itemCount = 0, ), ), @@ -938,7 +938,7 @@ class VaultViewModelTest : BaseViewModelTest() { assertEquals(expectedState, viewModel.stateFlow.value) assertEquals( - VaultEvent.ShowSnackbar(R.string.syncing_complete.asText()), + VaultEvent.ShowSnackbar(BitwardenString.syncing_complete.asText()), awaitItem(), ) } @@ -991,7 +991,7 @@ class VaultViewModelTest : BaseViewModelTest() { assertEquals(expectedState, viewModel.stateFlow.value) assertEquals( - VaultEvent.ShowSnackbar(R.string.syncing_complete.asText()), + VaultEvent.ShowSnackbar(BitwardenString.syncing_complete.asText()), awaitItem(), ) } @@ -1031,7 +1031,7 @@ class VaultViewModelTest : BaseViewModelTest() { ), VaultState.ViewState.FolderItem( id = null, - name = R.string.folder_none.asText(), + name = BitwardenString.folder_none.asText(), itemCount = 0, ), ), @@ -1099,7 +1099,7 @@ class VaultViewModelTest : BaseViewModelTest() { assertEquals( createMockVaultState( viewState = VaultState.ViewState.Error( - message = R.string.generic_error_message.asText(), + message = BitwardenString.generic_error_message.asText(), ), ), viewModel.stateFlow.value, @@ -1143,7 +1143,7 @@ class VaultViewModelTest : BaseViewModelTest() { ), VaultState.ViewState.FolderItem( id = null, - name = R.string.folder_none.asText(), + name = BitwardenString.folder_none.asText(), itemCount = 0, ), ), @@ -1162,8 +1162,8 @@ class VaultViewModelTest : BaseViewModelTest() { showCardGroup = true, ), dialog = VaultState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.generic_error_message.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.generic_error_message.asText(), ), ), viewModel.stateFlow.value, @@ -1193,8 +1193,8 @@ class VaultViewModelTest : BaseViewModelTest() { createMockVaultState( viewState = VaultState.ViewState.NoItems, dialog = VaultState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.generic_error_message.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.generic_error_message.asText(), ), ), viewModel.stateFlow.value, @@ -1253,7 +1253,7 @@ class VaultViewModelTest : BaseViewModelTest() { ), VaultState.ViewState.FolderItem( id = null, - name = R.string.folder_none.asText(), + name = BitwardenString.folder_none.asText(), itemCount = 0, ), ), @@ -1546,8 +1546,8 @@ class VaultViewModelTest : BaseViewModelTest() { val initialState = DEFAULT_STATE.copy( viewState = VaultState.ViewState.NoItems, dialog = VaultState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.generic_error_message.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.generic_error_message.asText(), ), ) assertEquals( @@ -1588,8 +1588,8 @@ class VaultViewModelTest : BaseViewModelTest() { DEFAULT_STATE.copy( isRefreshing = false, dialog = VaultState.DialogState.Error( - R.string.internet_connection_required_title.asText(), - R.string.internet_connection_required_message.asText(), + BitwardenString.internet_connection_required_title.asText(), + BitwardenString.internet_connection_required_message.asText(), ), ), viewModel.stateFlow.value, @@ -1639,7 +1639,7 @@ class VaultViewModelTest : BaseViewModelTest() { verify(exactly = 1) { clipboardManager.setText( text = notes, - toastDescriptorOverride = R.string.notes.asText(), + toastDescriptorOverride = BitwardenString.notes.asText(), ) } } @@ -1672,8 +1672,8 @@ class VaultViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialog = VaultState.DialogState.Error( - title = R.string.decryption_error.asText(), - message = R.string.failed_to_decrypt_cipher_contact_support.asText(), + title = BitwardenString.decryption_error.asText(), + message = BitwardenString.failed_to_decrypt_cipher_contact_support.asText(), error = throwable, ), ), @@ -1708,8 +1708,8 @@ class VaultViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialog = VaultState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.generic_error_message.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.generic_error_message.asText(), error = null, ), ), @@ -1742,7 +1742,7 @@ class VaultViewModelTest : BaseViewModelTest() { verify(exactly = 1) { clipboardManager.setText( text = number, - toastDescriptorOverride = R.string.number.asText(), + toastDescriptorOverride = BitwardenString.number.asText(), ) } } @@ -1775,8 +1775,8 @@ class VaultViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialog = VaultState.DialogState.Error( - title = R.string.decryption_error.asText(), - message = R.string.failed_to_decrypt_cipher_contact_support.asText(), + title = BitwardenString.decryption_error.asText(), + message = BitwardenString.failed_to_decrypt_cipher_contact_support.asText(), error = throwable, ), ), @@ -1811,8 +1811,8 @@ class VaultViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialog = VaultState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.generic_error_message.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.generic_error_message.asText(), error = null, ), ), @@ -1838,7 +1838,7 @@ class VaultViewModelTest : BaseViewModelTest() { verify(exactly = 1) { clipboardManager.setText( text = password, - toastDescriptorOverride = R.string.password.asText(), + toastDescriptorOverride = BitwardenString.password.asText(), ) organizationEventManager.trackEvent( event = OrganizationEvent.CipherClientCopiedPassword(cipherId = cipherId), @@ -1875,8 +1875,8 @@ class VaultViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialog = VaultState.DialogState.Error( - title = R.string.decryption_error.asText(), - message = R.string.failed_to_decrypt_cipher_contact_support.asText(), + title = BitwardenString.decryption_error.asText(), + message = BitwardenString.failed_to_decrypt_cipher_contact_support.asText(), error = throwable, ), ), @@ -1912,8 +1912,8 @@ class VaultViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialog = VaultState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.generic_error_message.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.generic_error_message.asText(), error = null, ), ), @@ -1945,7 +1945,7 @@ class VaultViewModelTest : BaseViewModelTest() { verify(exactly = 1) { clipboardManager.setText( text = code, - toastDescriptorOverride = R.string.totp.asText(), + toastDescriptorOverride = BitwardenString.totp.asText(), ) } } @@ -2007,7 +2007,7 @@ class VaultViewModelTest : BaseViewModelTest() { verify(exactly = 1) { clipboardManager.setText( text = securityCode, - toastDescriptorOverride = R.string.security_code.asText(), + toastDescriptorOverride = BitwardenString.security_code.asText(), ) organizationEventManager.trackEvent( event = OrganizationEvent.CipherClientCopiedCardCode(cipherId = cipherId), @@ -2044,8 +2044,8 @@ class VaultViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialog = VaultState.DialogState.Error( - title = R.string.decryption_error.asText(), - message = R.string.failed_to_decrypt_cipher_contact_support.asText(), + title = BitwardenString.decryption_error.asText(), + message = BitwardenString.failed_to_decrypt_cipher_contact_support.asText(), error = throwable, ), ), @@ -2081,8 +2081,8 @@ class VaultViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialog = VaultState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.generic_error_message.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.generic_error_message.asText(), error = null, ), ), @@ -2106,7 +2106,7 @@ class VaultViewModelTest : BaseViewModelTest() { verify(exactly = 1) { clipboardManager.setText( text = username, - toastDescriptorOverride = R.string.username.asText(), + toastDescriptorOverride = BitwardenString.username.asText(), ) } } @@ -2204,8 +2204,8 @@ class VaultViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialog = VaultState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.generic_error_message.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.generic_error_message.asText(), error = error, ), ), @@ -2243,8 +2243,8 @@ class VaultViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialog = VaultState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.invalid_master_password.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.invalid_master_password.asText(), ), ), awaitItem(), @@ -2284,7 +2284,7 @@ class VaultViewModelTest : BaseViewModelTest() { verify(exactly = 1) { clipboardManager.setText( text = password, - toastDescriptorOverride = R.string.password.asText(), + toastDescriptorOverride = BitwardenString.password.asText(), ) organizationEventManager.trackEvent( event = OrganizationEvent.CipherClientCopiedPassword(cipherId = cipherId), @@ -2324,8 +2324,8 @@ class VaultViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialog = VaultState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.generic_error_message.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.generic_error_message.asText(), error = error, ), ), @@ -2365,8 +2365,8 @@ class VaultViewModelTest : BaseViewModelTest() { assertEquals( DEFAULT_STATE.copy( dialog = VaultState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.invalid_master_password.asText(), + title = BitwardenString.an_error_has_occurred.asText(), + message = BitwardenString.invalid_master_password.asText(), ), ), awaitItem(), @@ -2661,8 +2661,8 @@ class VaultViewModelTest : BaseViewModelTest() { DEFAULT_STATE.copy( isRefreshing = false, dialog = VaultState.DialogState.Error( - R.string.internet_connection_required_title.asText(), - R.string.internet_connection_required_message.asText(), + BitwardenString.internet_connection_required_title.asText(), + BitwardenString.internet_connection_required_message.asText(), ), ), viewModel.stateFlow.value, @@ -2675,16 +2675,16 @@ class VaultViewModelTest : BaseViewModelTest() { val throwable = Throwable("Decryption failed") viewModel.trySendAction( VaultAction.Internal.DecryptionErrorReceive( - title = R.string.decryption_error.asText(), - message = R.string.failed_to_decrypt_cipher_contact_support.asText(), + title = BitwardenString.decryption_error.asText(), + message = BitwardenString.failed_to_decrypt_cipher_contact_support.asText(), error = throwable, ), ) assertEquals( DEFAULT_STATE.copy( dialog = VaultState.DialogState.Error( - title = R.string.decryption_error.asText(), - message = R.string.failed_to_decrypt_cipher_contact_support.asText(), + title = BitwardenString.decryption_error.asText(), + message = BitwardenString.failed_to_decrypt_cipher_contact_support.asText(), error = throwable, ), ), @@ -2780,7 +2780,7 @@ private fun createMockVaultState( dialog: VaultState.DialogState? = null, ): VaultState = VaultState( - appBarTitle = R.string.my_vault.asText(), + appBarTitle = BitwardenString.my_vault.asText(), avatarColorString = "#aa00aa", initials = "AU", accountSummaries = listOf( diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/vault/util/AccountSummaryExtensionsTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/vault/util/AccountSummaryExtensionsTest.kt index 93dfb1131a..ee2dc81e17 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/vault/util/AccountSummaryExtensionsTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/vault/util/AccountSummaryExtensionsTest.kt @@ -1,7 +1,7 @@ package com.x8bit.bitwarden.ui.vault.feature.vault.util import com.bitwarden.ui.platform.resource.BitwardenDrawable -import com.x8bit.bitwarden.R +import com.bitwarden.ui.platform.resource.BitwardenString import com.x8bit.bitwarden.ui.platform.components.model.AccountSummary import io.mockk.every import io.mockk.mockk @@ -136,7 +136,7 @@ class AccountSummaryExtensionsTest { @Test fun `supportingTextResOrNull returns Locked locked accounts`() { assertEquals( - R.string.account_locked, + BitwardenString.account_locked, mockk { every { status } returns AccountSummary.Status.LOCKED } @@ -147,7 +147,7 @@ class AccountSummaryExtensionsTest { @Test fun `supportingTextResOrNull returns Logged Out for logged out accounts`() { assertEquals( - R.string.account_logged_out, + BitwardenString.account_logged_out, mockk { every { status } returns AccountSummary.Status.LOGGED_OUT } @@ -158,7 +158,7 @@ class AccountSummaryExtensionsTest { @Test fun `supportingTextResOrNull returns Unlocked for unlocked accounts`() { assertEquals( - R.string.account_unlocked, + BitwardenString.account_unlocked, mockk { every { status } returns AccountSummary.Status.UNLOCKED } diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/vault/util/FlightRecorderDataSetExtensionsTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/vault/util/FlightRecorderDataSetExtensionsTest.kt index c91bc01669..e196fbbf1b 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/vault/util/FlightRecorderDataSetExtensionsTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/vault/util/FlightRecorderDataSetExtensionsTest.kt @@ -1,7 +1,7 @@ package com.x8bit.bitwarden.ui.vault.feature.vault.util +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.platform.datasource.disk.model.FlightRecorderDataSet import com.x8bit.bitwarden.ui.platform.components.snackbar.BitwardenSnackbarData import org.junit.jupiter.api.Assertions.assertEquals @@ -68,9 +68,10 @@ class FlightRecorderDataSetExtensionsTest { assertEquals( BitwardenSnackbarData( - message = R.string.flight_recorder_banner_message.asText("4/12/25", "9:15 AM"), - messageHeader = R.string.flight_recorder_banner_title.asText(), - actionLabel = R.string.go_to_settings.asText(), + message = BitwardenString.flight_recorder_banner_message + .asText("4/12/25", "9:15 AM"), + messageHeader = BitwardenString.flight_recorder_banner_title.asText(), + actionLabel = BitwardenString.go_to_settings.asText(), withDismissAction = true, ), result, diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/vault/util/VaultDataExtensionsTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/vault/util/VaultDataExtensionsTest.kt index 6bb5519229..9fc6091993 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/vault/util/VaultDataExtensionsTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/vault/util/VaultDataExtensionsTest.kt @@ -5,6 +5,7 @@ import com.bitwarden.data.repository.model.Environment import com.bitwarden.data.repository.util.baseIconUrl import com.bitwarden.ui.platform.components.icon.model.IconData import com.bitwarden.ui.platform.resource.BitwardenDrawable +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.asText import com.bitwarden.vault.CipherListViewType import com.bitwarden.vault.CipherRepromptType @@ -13,7 +14,6 @@ import com.bitwarden.vault.DecryptCipherListResult import com.bitwarden.vault.FolderView import com.bitwarden.vault.LoginUriView import com.bitwarden.vault.UriMatchType -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockCardListView import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockCipherListView import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockCipherView @@ -100,7 +100,7 @@ class VaultDataExtensionsTest { ), VaultState.ViewState.FolderItem( id = null, - name = R.string.folder_none.asText(), + name = BitwardenString.folder_none.asText(), itemCount = 0, ), ), @@ -222,7 +222,7 @@ class VaultDataExtensionsTest { ), VaultState.ViewState.FolderItem( id = null, - name = R.string.folder_none.asText(), + name = BitwardenString.folder_none.asText(), itemCount = 0, ), ), @@ -779,7 +779,7 @@ class VaultDataExtensionsTest { folderItems = listOf( VaultState.ViewState.FolderItem( id = null, - name = R.string.folder_none.asText(), + name = BitwardenString.folder_none.asText(), itemCount = 100, ), ), @@ -931,7 +931,7 @@ class VaultDataExtensionsTest { ), VaultState.ViewState.FolderItem( id = null, - name = R.string.folder_none.asText(), + name = BitwardenString.folder_none.asText(), itemCount = 0, ), ), @@ -1196,12 +1196,12 @@ private fun createMockSshKeyVaultItem(number: Int): VaultState.ViewState.VaultIt extraIconList = persistentListOf( IconData.Local( iconRes = BitwardenDrawable.ic_collections, - contentDescription = R.string.collections.asText(), + contentDescription = BitwardenString.collections.asText(), testTag = "CipherInCollectionIcon", ), IconData.Local( iconRes = BitwardenDrawable.ic_paperclip, - contentDescription = R.string.attachments.asText(), + contentDescription = BitwardenString.attachments.asText(), testTag = "CipherWithAttachmentsIcon", ), ), diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/vault/util/VaultFilterDataExtensionsTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/vault/util/VaultFilterDataExtensionsTest.kt index 0cbd0fee24..2ae09c9103 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/vault/util/VaultFilterDataExtensionsTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/vault/util/VaultFilterDataExtensionsTest.kt @@ -1,7 +1,7 @@ package com.x8bit.bitwarden.ui.vault.feature.vault.util +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.vault.feature.vault.model.VaultFilterData import com.x8bit.bitwarden.ui.vault.feature.vault.model.VaultFilterType import org.junit.jupiter.api.Assertions.assertEquals @@ -11,7 +11,7 @@ class VaultFilterDataExtensionsTest { @Test fun `toAppBarTitle for a null value should return My Vault`() { assertEquals( - R.string.my_vault.asText(), + BitwardenString.my_vault.asText(), (null as VaultFilterData?).toAppBarTitle(), ) } @@ -19,7 +19,7 @@ class VaultFilterDataExtensionsTest { @Test fun `toAppBarTitle for a non-null value should return Vaults`() { assertEquals( - R.string.vaults.asText(), + BitwardenString.vaults.asText(), VaultFilterData( selectedVaultFilterType = VaultFilterType.MyVault, vaultFilterTypes = listOf( diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/verificationcode/VerificationCodeViewModelTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/verificationcode/VerificationCodeViewModelTest.kt index 0783762ab2..7a2e93c323 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/verificationcode/VerificationCodeViewModelTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/verificationcode/VerificationCodeViewModelTest.kt @@ -7,11 +7,11 @@ import com.bitwarden.core.data.repository.model.DataState import com.bitwarden.data.repository.model.Environment import com.bitwarden.data.repository.util.baseIconUrl import com.bitwarden.ui.platform.base.BaseViewModelTest +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText import com.bitwarden.ui.util.concat import com.bitwarden.vault.CipherRepromptType -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.auth.repository.AuthRepository import com.x8bit.bitwarden.data.auth.repository.model.UserState import com.x8bit.bitwarden.data.auth.repository.model.ValidatePasswordResult @@ -120,7 +120,7 @@ class VerificationCodeViewModelTest : BaseViewModelTest() { verify(exactly = 1) { clipboardManager.setText( text = authCode, - toastDescriptorOverride = R.string.verification_code_totp.asText(), + toastDescriptorOverride = BitwardenString.verification_code_totp.asText(), ) } } @@ -153,7 +153,7 @@ class VerificationCodeViewModelTest : BaseViewModelTest() { initialState.copy( dialogState = VerificationCodeState.DialogState.Error( title = null, - message = R.string.generic_error_message.asText(), + message = BitwardenString.generic_error_message.asText(), throwable = throwable, ), ), @@ -182,7 +182,7 @@ class VerificationCodeViewModelTest : BaseViewModelTest() { initialState.copy( dialogState = VerificationCodeState.DialogState.Error( title = null, - message = R.string.invalid_master_password.asText(), + message = BitwardenString.invalid_master_password.asText(), ), ), ) @@ -251,7 +251,7 @@ class VerificationCodeViewModelTest : BaseViewModelTest() { assertEquals( initialState.copy( dialogState = VerificationCodeState.DialogState.Loading( - message = R.string.syncing.asText(), + message = BitwardenString.syncing.asText(), ), ), viewModel.stateFlow.value, @@ -365,7 +365,7 @@ class VerificationCodeViewModelTest : BaseViewModelTest() { assertEquals( createVerificationCodeState( viewState = VerificationCodeState.ViewState.Error( - message = R.string.generic_error_message.asText(), + message = BitwardenString.generic_error_message.asText(), ), ), viewModel.stateFlow.value, @@ -398,11 +398,11 @@ class VerificationCodeViewModelTest : BaseViewModelTest() { assertEquals( createVerificationCodeState( viewState = VerificationCodeState.ViewState.Error( - message = R.string.internet_connection_required_title + message = BitwardenString.internet_connection_required_title .asText() .concat( " ".asText(), - R.string.internet_connection_required_message.asText(), + BitwardenString.internet_connection_required_message.asText(), ), ), ), diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/util/VaultCardBrandExtensionsTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/util/VaultCardBrandExtensionsTest.kt index 8ea5eb4292..1a0d89c61e 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/util/VaultCardBrandExtensionsTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/util/VaultCardBrandExtensionsTest.kt @@ -1,7 +1,7 @@ package com.x8bit.bitwarden.ui.vault.util +import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.asText -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.vault.feature.addedit.util.SELECT_TEXT import com.x8bit.bitwarden.ui.vault.model.VaultCardBrand import org.junit.jupiter.api.Assertions.assertEquals @@ -22,7 +22,7 @@ class VaultCardBrandExtensionsTest { VaultCardBrand.MAESTRO to "Maestro".asText(), VaultCardBrand.UNIONPAY to "UnionPay".asText(), VaultCardBrand.RUPAY to "RuPay".asText(), - VaultCardBrand.OTHER to R.string.other.asText(), + VaultCardBrand.OTHER to BitwardenString.other.asText(), ) .forEach { (type, label) -> assertEquals( @@ -45,7 +45,7 @@ class VaultCardBrandExtensionsTest { VaultCardBrand.MAESTRO to "Maestro".asText(), VaultCardBrand.UNIONPAY to "UnionPay".asText(), VaultCardBrand.RUPAY to "RuPay".asText(), - VaultCardBrand.OTHER to R.string.other.asText(), + VaultCardBrand.OTHER to BitwardenString.other.asText(), ) .forEach { (type, label) -> assertEquals( diff --git a/ui/src/main/res/values/strings.xml b/ui/src/main/res/values/strings.xml index 07be098153..f1b5ac64b9 100644 --- a/ui/src/main/res/values/strings.xml +++ b/ui/src/main/res/values/strings.xml @@ -1,4 +1,996 @@ + About + Add folder + Add Item + An error has occurred + Back + Bitwarden + Cancel + Copy + Copy password + Copy username + Delete + Deleting... + Do you really want to delete? This cannot be undone. + Edit + Edit folder + Email + Email address + Enter your PIN code + Favorites + Folder + New folder created. + Folder deleted. + No Folder + Folders + Folder saved + Hide + Please connect to the internet before continuing. + Internet connection required + Invalid master password. Try again. + Invalid PIN. Try again. + Launch + Log in + Login + Log out + Are you sure you want to log out? + Remove account + Are you sure you want to remove this account? + Account already added + Would you like to switch to it now? + Master password + Master password (required) + New master password (required) + More + My vault + Name + Item name (required) + "Send name (required)" + No + Notes + Private notes + Okay + Password + Save + Move + Saving... + Settings + Show + Item deleted + Submit + Sync + URI + Website (URI) + Username + The %1$s field is required. + You must attach a file to save this send. + %1$s copied + Verify master password + Verify PIN + View + Yes + Account + Your new account has been created! + Set Bitwarden as your passkey provider in device settings. + Avoid ambiguous characters + Bitwarden Autofill Service + Change master password + Close + Continue + Create account + Create an account + Edit item + Edit login + Edit card + Edit identity + Edit note + Edit SSH key + Enter your account email address to receive your master password hint. + Favorite + Unfavorite + Fingerprint + Generate password + Get your master password hint + Import items + Last sync: + Length + Lock + 15 minutes + 1 hour + 1 minute + 4 hours + Immediately + Set session timeout to \"Log out\"? + After the timeout period, you will be logged out. You will need to be connected to the internet to log in and access your vault again. Your settings and PIN saved on this device won\'t change. + Logging in... + Log in to Bitwarden + Password confirmation is not correct. + The master password is the password you use to access your vault. It is very important that you do not forget your master password. There is no way to recover the password in the event that you forget it. + Master password hint (optional) + A master password hint can help you remember your password if you forget it. + Master password must be at least %1$s characters long. + Minimum numbers + Minimum special + Never + Item added + There are no cards in your vault. + New card + There are no logins in your vault. + There are no identities in your vault. + New identity + There are no notes in your vault. + New note + New item + New SSH key + There are no text Sends in your vault. + There are no file Sends in your vault. + There are no SSH keys in your vault. + New text Send + New file Send + No Username + Options + Other + Password generator + Password hint + We\'ve sent you an email with your master password hint. + Are you sure you want to overwrite the current password? + Re-type master password + Re-type new master password (required) + Re-type master password (required) + Search vault + Select + Item details + Item saved + Submitting... + Syncing... + Syncing complete + Two-step login + Unlock with %1$s + Unlock with PIN code + Verification code + View login + View card + View identity + View note + View SSH key + Bitwarden web vault + Items + Items for %1$s + There are no items in your vault for %1$s. + There are no items in your vault that match “%1$s” + Search for a login or add a new login + Disabled + The easiest way to add new logins to your vault is from the Bitwarden Autofill Service. Learn more about using the Bitwarden Autofill Service by navigating to the \"Settings\" screen. + Autofill + Do you want to autofill or view this item? + Search + Learn about organizations + Authenticator app + Enter the 6 digit verification code from your authenticator app. + Enter the 6 digit verification code that was emailed to %1$s. + We don\'t recognize this device. Enter the code sent to your email to verify your identity. + Recovery code + Remember + Remember email + Resend code + Could not send verification email. Try again. + Verification email sent + To continue, hold your YubiKey NEO against the back of the device or insert your YubiKey into your device\'s USB port, then touch its button. + YubiKey security key + Add new attachment + Attachments + Unable to download file. + Downloading... + This attachment is %1$s in size. Are you sure you want to download it onto your device? + Authenticator key + Verification code (TOTP) + Authenticator key added. + Cannot read authenticator key. + Point your camera at the QR Code. +Scanning will happen automatically. + Copy TOTP + If a login has an authenticator key, copy the TOTP verification code to your clipboard when you autofill the login. + Copy TOTP automatically + A premium membership is required to use this feature. + Attachment deleted + Choose file + File + No file chosen + There are no attachments. + File Source + Maximum file size is 100 MB. + Required. Maximum file size is 100 MB. + Learn more + API server URL + Client certificate (mTLS) + Certificate used for client authentication. + Custom environment + For advanced users. You can specify the base URL of each service independently. + The environment URLs have been saved. + Identity server URL + Self-hosted environment + Specify the base URL of your on-premise hosted Bitwarden installation. + Server URL + Web vault server URL + Custom fields + Copy number + Copy security code + Number + Security code + Card + Identity + Login + Secure note + Address 1 + Address 2 + Address 3 + April + August + Brand + Card Details + Cardholder name + City / Town + Company + Country + December + Dr + Expiration month + Expiration year + February + First name + January + July + June + Last name + Full name + License number + March + May + Middle name + Mr + Mrs + Ms + Mx + November + October + Passport number + Phone + September + Social Security number + State / Province + Title + Zip / Postal code + Address + Expiration + Show website icons + Show website icons help + Show a recognizable image next to each login + Icons server URL + Vault is locked + Go to my vault + Collections + There are no items in this collection. + There are no items in this folder. + There are no items in the trash. + Assist with filling username and password fields in other apps and on the web. + The Bitwarden autofill service uses the Android Autofill Framework to assist in filling login information into other apps on your device. + We were unable to automatically open the Android autofill settings menu for you. You can navigate to the autofill settings menu manually from Android Settings > System > Languages and input > Advanced > Autofill service. + Custom field name + Boolean + Hidden + Linked + Text + What type of custom field do you want to add? + Remove + New URI + Add website + Base domain + Default + Exact + Host + Regular expression + Starts with + URI match detection + Match detection + Autofill and save + Organization + Try again + Created: %1$s + Password last updated: %1$s + Last edited: %1$s + Invalid email address. + Cards + Identities + Identification + Logins + Secure notes + Personal Details + Contact Info + Check password for data breaches + This password has been exposed %1$s time(s) in data breaches. You should change it. + This password was not found in any known data breaches. It should be safe to use. + Identity name + Value + Password history + Password history: %1$s + Types + No passwords to list. + Search file Sends + Search text Sends + Type + Move down + Move Up + Owner + There are no collections to list. + %1$s moved to %2$s. + You must select at least one collection. + Share + Move to Organization + No organizations to list. + Choose an organization that you wish to move this item to. Moving to an organization transfers ownership of the item to that organization. You will no longer be the direct owner of this item once it has been moved. + Number of words + Passphrase + Word separator + Clear + Generator + There are no folders to list. + Fingerprint phrase + Your account\'s fingerprint phrase + Export vault + Lock now + PIN + Unlock + 30 minutes + Your PIN must be at least 4 characters. Your PIN settings will be reset if you manually log out of the Bitwarden app. + Logged in as %1$s on %2$s. + Your vault is locked. Verify your master password to continue. + Your vault is locked. Verify your PIN code to continue. + Dark + Light + 5 minutes + 10 seconds + 30 seconds + 20 seconds + 2 minutes + Clear clipboard + Automatically clear copied values from your clipboard. + Default URI match detection + Choose the default way that URI match detection is handled for logins when performing actions such as autofill. + Theme + Change the application\'s color theme + Copy note + Exit + Are you sure you want to exit Bitwarden? + Require master password on app restart? + Do you want to require unlocking with your master password when the application is restarted? + Ask to add login + Ask to add an item if one isn\'t found in your vault. + On app restart + Capitalize + Include number + Download + Your login session has expired. + Biometric verification + Biometrics + Biometrics Failed + Log in with your Master Password or PIN then re-enable biometric login in Settings. + Use biometrics to unlock + File format + Enter your master password to export your vault data. + Send a verification code to your email + Code sent! + Confirm your identity to continue. + This export contains your vault data in an unencrypted format. You should not store or send the exported file over unsecure channels (such as email). Delete it immediately after you are done using it. + This file export will be password protected and require the file password to decrypt. + Confirm vault export + Warning + There was a problem exporting your vault. If the problem persists, you\'ll need to export from the web vault. + Vault exported successfully + Clone + One or more organization policies are affecting your generator settings + There was a problem saving this attachment. If the problem persists, you can save it from the web vault. + Attachment saved successfully + Please turn on \"Autofill Accessibility Service\" from Bitwarden Settings to use the Autofill tile. + No password fields detected + Sending to trash... + Item has been sent to trash. + Restore + Restoring... + Item restored + Trash + Do you really want to permanently delete? This cannot be undone. + Do you really want to restore this item? + Do you really want to send to the trash? + Biometric unlock for this account is disabled pending verification of master password. + Allow sync on refresh + Syncing vault with pull down gesture. + Enterprise single sign-on + Quickly log in using your organization\'s single sign-on portal. Please enter your organization\'s identifier to begin. + Organization identifier + Currently unable to login with SSO + Set master password + One or more organization policies require your master password to meet the following requirements: + Minimum complexity score of %1$s + Minimum length of %1$s + Contain one or more uppercase characters + Contain one or more lowercase characters + Contain one or more numbers + Contain one or more of the following special characters: %1$s + Invalid password + Password does not meet organization requirements. Please check the policy information and try again. + Loading + Terms of Service and Privacy Policy have not been acknowledged. + Terms of Service + Privacy Policy + Passkey management + Autofill services + Display autofill suggestions + Inline (shows in keyboard) + Popup (shows over input field) + Use accessibility + Required to use the Autofill Quick-Action Tile. + An organization policy is affecting your ownership options. + Send + Send Details + All Sends + Text + Text to share + Text + When accessing the Send, hide the text by default + File + Deletion date + Deletion time + The Send will be permanently deleted on the specified date and time. + Pending deletion + Expired + Expires at %s + Expires tomorrow + Expires on %s + Stops logging on %1$s at %2$s + Maximum access count + If set, users will no longer be able to access this Send once the maximum access count is reached. + Max access count reached + Current access count: %s + New password + Require this password to view the Send. + Remove password + Removing password + Password removed + New send + Copy link + Share link + Send link + Search Sends + Edit Send + Edit file Send + Edit text Send + New file Send + New text Send + Are you sure you want to delete this Send? + Send deleted + Send updated + 1 day + 2 days + 3 days + 7 days + 30 days + Custom + Add this authenticator key to an existing login, or create a new login. + Due to an enterprise policy, you are only able to delete an existing Send. + About Send + Hide my email address from recipients + One or more organization policies are affecting your Send options. + Free accounts are restricted to sharing text only. A premium membership is required to use files with Send. + Master password re-prompt + Master password confirmation + This action is protected, to continue please re-enter your master password to verify your identity. + Captcha failed. Please try again. + Update master password + Your master password was recently changed by an administrator in your organization. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour. + Updating password + Remove master password + Leave organization + Leave %1$s? + FIDO2 WebAuthn + Authenticate WebAuthn + Return to app + This organization has an enterprise policy that will automatically enroll you in password reset. Enrollment will allow organization administrators to change your master password. + Your organization policies have set your maximum allowed vault timeout to %1$s hour(s) and %2$s minute(s). + Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is %1$s hour(s) and %2$s minute(s). Your vault timeout action is set to %3$s. + Your organization policies have set your vault timeout action to %1$s. + Your vault timeout exceeds the restrictions set by your organization. + One or more organization policies prevents your from exporting your individual vault. + Add account + Unlocked + Locked + Logged out + Switched to next available account + Delete account + Deleting your account is permanent + Your account and all vault data will be erased and unrecoverable. Are you sure you want to continue? + Your account has been permanently deleted + Invalid verification code + Send code + Sending + Resend code + A verification code was sent to your email + Submit crash logs + Options are expanded, tap to collapse. + Options are collapsed, tap to expand. + Uppercase (A to Z) + Lowercase (A to Z) + Numbers (0 to 9) + Special characters (!@#$%^&*) + Filter items by vault + All vaults + Vaults + Vault: %1$s + All + TOTP + Verification codes + Premium subscription required + Cannot add authenticator key? Scan QR Code + Scan QR Code + Cannot scan QR code? Enter key manually + Authenticator key + Authenticator key help + Enter key manually + Add TOTP + Set up authenticator key + Once the key is successfully entered, +select Add TOTP to store the key safely + Setting your lock options to “Never” keeps your vault available to anyone with access to your device. If you use this option, you should ensure that you keep your device properly protected. + One or more of the URLs entered are invalid. Please revise it and try to save again. + We were unable to process your request. Please try again or contact us. + Allow screen capture + Are you sure you want to turn on screen capture? + Login requested + Are you trying to log in? + Login attempt by %1$s on %2$s + Device type + IP address + Time + Select time + Switch input mode + Confirm login + Deny login + Login denied + Approve login requests + No thanks + Confirm login attempt for %1$s + Username type + Plus addressed email + Catch-all email + Forwarded email alias + Random word + Email (required) + domain name + Domain name (required) + API key + API key (required) + Service + addy.io + Firefox Relay + SimpleLogin + DuckDuckGo + Fastmail + ForwardEmail + API access token (required) + API access token + Are you sure you want to overwrite the current username? + Generate username + Use your email provider\'s subaddress capabilities + Use your domain\'s configured catch-all inbox. + Generate an email alias with an external forwarding service. + Accessibility Service Disclosure + Bitwarden uses the Accessibility Service to search for login fields in apps and websites, then establish the appropriate field IDs for entering a username & password when a match for the app or site is found. We do not store any of the information presented to us by the service, nor do we make any attempt to control any on-screen elements beyond text entry of credentials. + Accept + Decline + Login request has already expired. + Login attempt from: +%1$s +Do you want to switch to this account? + New to Bitwarden? + Get master password hint + Logging in as %1$s on %2$s + Not you? + Log in with master password + Login initiated + A notification has been sent to your device. + Please make sure your vault is unlocked and the Fingerprint phrase matches on the other device. + Resend notification + View all log in options + Pending login requests + Decline all requests + Are you sure you want to decline all pending login requests? + No pending requests + Enable camera permission to use the scanner + Language + The language has been changed to %1$s. Please restart the app to see the change + Default (System) + Important + Your master password cannot be recovered if you forget it! %1$s characters minimum. + Weak Master Password + Weak password identified. Use a strong password to protect your account. Are you sure you want to use a weak password? + Weak + Good + Strong + Check known data breaches for this password + Exposed Master Password + Password found in a data breach. Use a unique password to protect your account. Are you sure you want to use an exposed password? + Weak and Exposed Master Password + Weak password identified and found in a data breach. Use a strong and unique password to protect your account. Are you sure you want to use this password? + There are no items that match the search + Self-hosted + Region + Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour. + Current master password (required) + Approve with my other device + Request admin approval + Approve with master password + Turn off using a public device + Remember this device + Passkey + Passkey will not be copied + The passkey will not be copied to the cloned item. Do you want to continue cloning this item? + Master password re-prompt help + Admin approval requested + Your request has been sent to your admin. + You will be notified once approved. + Trouble logging in? + Block autofill + Autofill will not be offered for these URIs. + New blocked URI + Invalid format. Use https://, http://, or androidapp:// + Enter URI + Format: %1$s. Separate multiple URIs with a comma. + Invalid URI + The URI %1$s is already blocked + Login approved + Log in with device must be set up in the settings of the Bitwarden app. Need another option? + Log in with device + Logging in on + Logging in on: + Vault + Appearance + Account security + Bitwarden help center + Sync now + Unlock options + Session timeout + Session timeout action + Account fingerprint phrase + Use Bitwarden to save new passkeys and log in with passkeys stored in your vault. + Allow Bitwarden to use your saved login information to sign in to other apps on your device. + Choose how your autofill suggestions will appear when you sign in to other apps on your device. + Additional options + Continue to web app? + Continue to %1$s? + Continue to Help center? + Continue to privacy policy? + Continue to device Settings? + Make your account more secure by setting up two-step login in the Bitwarden web app. + You can change your master password on the Bitwarden web app. + You can import data to your vault on %1$s. + Learn more about how to use Bitwarden on the Help center. + Check out our privacy policy on bitwarden.com. + Explore more features of your Bitwarden account on the web app. + Bitwarden allows you to share your vault items with others by using an organization. Learn more on the bitwarden.com website. + Created %1$s + Your organization requires you to set a master password. + Set up an unlock option to change your vault timeout action. + Save passkey as new login + Overwrite passkey? + This item already contains a passkey. Are you sure you want to overwrite the current passkey? + Duo two-step login is required for your account. + Follow the steps from Duo to finish logging in. + Launch Duo + Your passkey will be saved to your Bitwarden vault for %1$s + Passkeys not supported for this app + Passkey operation failed because browser is not privileged + Passkey operation failed because browser signature does not match + Passkey operation failed because of missing asset links + Passkey operation failed because app could not be verified + Confirm file password + File password + Password Protected + This password will be used to export and import this file + Autofill suggestion + Continue to complete WebAuthn verification. + Launch WebAuthn + There was an error starting WebAuthn two factor authentication + Self-hosted server URL + Credential operation failed because user could not be verified. + Passkey operation failed because user could not be verified. + User verification + Create account on + Create account on: + We sent an email to %1$s. + By continuing, you agree to the Terms of Service and Privacy Policy + By activating this switch, you agree to the Terms of Service and Privacy Policy + Unsubscribe + Check your email + Open email app + Email verified + Get emails from Bitwarden for announcements, advice, and research opportunities. Unsubscribe at any time. + Security, prioritized + Save logins, cards, and identities to your secure vault. Bitwarden uses zero-knowledge, end-to-end encryption to protect what’s important to you. + Set up biometric unlock and autofill to log into your accounts without typing a single letter. + Quick and easy login + Level up your logins + Use the generator to create and save strong, unique passwords for all your accounts. + Your data, when and where you need it + Save unlimited passwords across unlimited devices with Bitwarden mobile, browser, and desktop apps. + Remove passkey + Passkey removed + What makes a password strong? + A secure, memorable password + Account setup + Set up unlock + Set up later + Set up unlock later? + You can return to complete this step anytime from Account Security in Settings. + Confirm + Set up biometrics or choose a PIN code to quickly access your vault and Autofill your logins. + Never lose access to your vault + The best way to make sure you can always access your vault is to set up safeguards from the start. + One of the best ways to create a secure and memorable password is to use a passphrase. \nHere’s how: + Create a hint + Your hint will be sent to you via email when you request it. + Write your password down + Be careful to keep your written password somewhere secret and safe. + Prevent account lockout + Generate master password + Generate + Write this password down and keep it somewhere safe. + Learn about other ways to prevent account lockout + Learn about ways to prevent account lockout + Help with server geolocations. + Email address (required) + "Select the link in the email to verify your email address and continue creating your account. " + Change email address + Next + Bitwarden cannot recover a lost or forgotten master password. + Bitwarden cannot reset a lost or forgotten master password. + Choose your master password + Choose a unique and strong password to keep your information safe. + %1$s characters + Expired link + Please restart registration or try logging in. You may already have an account. + Restart registration + Authenticator Sync + Allow authenticator syncing + There was an issue validating the registration token. + Turn on autofill + Use autofill to log into your accounts with a single tap. + Turn on later + Turn on autofill later? + You can return to complete this step anytime in Settings. + You can now explore everything Bitwarden has to offer and start managing your passwords securely. + You\'re all set! + Error connecting with the Duo service. Use a different two-step login method or contact Duo for assistance. + Master password hint + New master password hint + Get started + Save and protect your data + The vault protects more than just passwords. Store secure logins, IDs, cards and notes securely here. + New login + Share files and data securely with anyone, on any platform. Your information will remain end-to-end encrypted while limiting exposure. + Send sensitive information, safely + Import saved logins + Use a computer to import logins from an existing password manager + You can return to complete this step anytime in Vault Settings. + Import logins later + Import logins later? + Do you have a computer available? + The following instructions will guide you through importing logins from your desktop or laptop computer + Import Logins + From your computer, follow these instructions to export saved passwords from your browser or other password manager. Then, safely import them to Bitwarden. + Give your vault a head start + Unlock with biometrics requires strong biometric authentication and may not be compatible with all biometric options on this device. + Unlock with biometrics requires strong biometric authentication and is not compatible with the biometrics options available on this device. + On your computer, log in to your current browser or password manager. + Export your passwords. This option is usually found in your settings. + Select Import data in the web app, then Done below to finish syncing. + Step 1 of 3 + Export your saved logins + You’ll delete this file after import is complete. + On your computer, open a new browser tab and go to %1$s + Log in to the Bitwarden web app. + Step 2 of 3 + Log in to Bitwarden + Step 3 of 3 + Import logins to Bitwarden + In the Bitwarden navigation, find the Tools option and select Import data. + Fill out the form and import your saved password file. + For your security, be sure to delete your saved password file. + Need help? Check out import help. + Save the exported file somewhere on your computer you can find easily. + This is not a recognized Bitwarden server. You may need to check with your provider or update your server. + Syncing logins... + Download the browser extension + Go to bitwarden.com/download to integrate Bitwarden into your favorite browser for a seamless experience. + Use the web app + Log in at bitwarden.com to easily manage your account and update settings. + Autofill passwords + Set up autofill on all your devices to login with a single tap anywhere. + Import Successful! + Manage your logins from anywhere with Bitwarden tools for web and desktop. + Bitwarden Tools + Got it + No logins were imported + Import error + Logins imported + Remember to delete your imported password file from your computer + SSH key + Public key + Private key + SSH keys + Copy public key + Copy fingerprint + Enable notifications + Log in quickly and easily across devices + Bitwarden can notify you each time you receive a new login request from another device. + Skip for now + Done + %1$s of %2$s + Copy identity name + Copy company + Copy social security number + Copy passport number + Copy license number + Copy email + Copy phone number + Copy address + Biometrics are no longer supported on this device + You’ve been logged out because your device’s biometrics don’t meet the latest security requirements. To update settings, log in once again or contact your administrator for access. + CXP Import + CXP Export + Choose three or four random words + Pick three or four random, unrelated words that you can easily remember. Think of objects, places, or things you like. + Combine those words together + Put the words together in any order to form your passphrase. Use hyphens, spaces, or leave them as one long word—your choice! + Make it yours + Add a number or symbol to make it even stronger. Now you have a unique, secure, and memorable passphrase! + "Need some inspiration?" + "Check out the passphrase generator" + We couldn’t verify the server’s certificate. The certificate chain or proxy settings on your device or your Bitwarden server may not be set up correctly. + Review flow launched! + Copy private key + Login Credentials + Autofill Options + Use this button to generate a new unique password. + 1 OF 3 + 2 OF 3 + You’ll only need to set up Authenticator Key for logins that require two-factor authentication with a code. The key will continuously generate six-digit codes you can use to log in. + 3 OF 3 + You must add a web address to use autofill to access this account. + Single tap passkey creation + Single tap passkey sign-on + Learn about new logins + We\'ll walk you through the key features to add a new login. + Explore the generator + Learn more about generating secure login credentials with a guided tour. + Import client certificate + Enter the client certificate password and the desired alias for this certificate. + Alias + "Use the generator to create secure passwords, passphrases and usernames. " + Passphrases are strong passwords that are often easier to remember and type than random passwords. They are helpful for logging into accounts where Autofill is not available, like a streaming service on your TV. + Unique usernames add an extra layer of security and can help prevent hackers from finding your accounts. + 1 OF 6 + 2 OF 6 + 3 OF 6 + 4 OF 6 + 5 OF 6 + 6 OF 6 + Use these options to adjust your password to meet your account website\'s requirements. + "After you save your new password to Bitwarden, don’t forget to update it on your account website. " + Verify your identity + Error loading certificate + Certificate alias + Import certificate + Choose system certificate + Certificate installed + Certificate installation failed + Unsupported certificate type + Certificate password incorrect + Invalid certificate chain + Using a system certificate is less secure than storing the certificate with Bitwarden. Continuing will display a list of available system certificates if one is already installed. + Link + Passkey operation failed because host URL is not present in request. + Passkey operation failed because app signature is invalid. + Passkey registration failed due to an internal error. + Passkey operation failed because relying party cannot be identified. + Passkey operation failed because the request is invalid. + Passkey operation failed because no item was selected. + Passkey operation failed because the request is unsupported. + Password operation failed because the selected item does not exist. + Password operation failed because no item was selected. + Credential operation failed because user verification attempts exceeded. + Credential operation failed because user is locked out. + Credential operation failed because the selected item does not exist. + Credential operation failed because user verification was cancelled. + Self-host server URL + Use Brave autofill integration + Use Chrome autofill integration + Use Chrome autofill integration (Beta) + Improves login filling for supported websites on selected browsers. Once enabled, you’ll be directed to browser settings to enable third-party autofill. + Show more + No folder + Show less + Add field + %s... + Share error details + Flight recorder + Flight recorder help + View recorded logs + Enable flight recorder + Recorded logs + No logs recorded + Experiencing an issue? + Enable temporary logging to collect and inspect logs locally. When enabled, application states and network calls may be logged—never sensitive vault information. + To get started, set a logging duration. Logging 
will automatically turn off after this period, giving you time to capture activity while reproducing 
any issues. + Logs will be automatically deleted after 30 days. Bitwarden is only able to access your log data when you share it. + For details on what is and isn’t logged, visit the\nBitwarden help center. + Logging duration + 1 hour + 8 hours + 24 hours + 1 week + Delete all + Share all + Unable to share + Please try again or select a different log. + The log file you are trying to share has been removed. + Delete log + Do you really want to delete this log? + Delete logs + Do you really want to delete all recorded logs? + Confirm Key Connector domain + Key Connector domain: + Organization: + A master password is no longer required for members of the following organization. Please confirm the domain below with your organization administrator. + Please confirm the domain below with your organization administrator.\n\nKey Connector domain:\n%1$s + Flight recorder on + Flight recorder will be active until %1$s at %2$s. Return to settings to deactivate now. + Go to settings + All logs deleted + Log deleted + App settings + Replace existing certificate? + A certificate with the alias \"%s\" already exists. Do you want to replace it?\nReplacing the certificate may impact your connection to any environments currently using it. + Replace certificate + Unable to read certificate. + Cannot delete your account + This action cannot be completed because your account is owned by an organization. Contact your organization administrator for additional details. + This account will soon be deleted. Log in at %1$s to continue using Bitwarden. + View file Send + View text Send + Delete Send + Missing Send re-sync your vault + Use dynamic colors + Use dynamic colors? + This color scheme automatically applies system colors to Bitwarden based on your current wallpaper. These colors may not meet all accessibility guidelines. + Passkey operation failed because browser (%1$s) is not recognized. Select \"Trust\" to add %1$s to the list of locally trusted applications. + Passkey operation failed because the browser is not trusted. + Trust + These are applications or browsers that Bitwarden does not trust by default, but you trust to perform passkey operations. + These are applications not included in the Google Play Store, but Bitwarden trusts to perform passkey operations after community members use and report them as safe. + These are applications Google considers safe and are available in Google\'s Play Store. + Trusted by You + Trusted by the Community + Trusted by Google + To protect users from phishing attempts, by default, Bitwarden only completes passkey operations through applications or web browsers trusted by Google or the Bitwarden community. + About privileged applications + Learn more about privileged apps + Privileged apps + Unrecognized browser + Learn more about using passkeys with Bitwarden. + All trusted apps + Are you sure you want to stop trusting %s? + Installed apps Delete %s + Failed to decrypt cipher. Contact support. + Decryption error diff --git a/ui/src/main/res/values/strings_non_localized.xml b/ui/src/main/res/values/strings_non_localized.xml new file mode 100644 index 0000000000..b78e6e7ad7 --- /dev/null +++ b/ui/src/main/res/values/strings_non_localized.xml @@ -0,0 +1,33 @@ + + + .csv + Duo + Duo (%1$s) + .json + .json (%1$s) + + + Email Verification + Import Logins Flow + Feature Flags: + Debug Menu + Reset values + Onboarding Status Override + Restart Onboarding + This will reset the onboarding status for the current user, if available. After clicking the button you will immediately be redirected to the onboarding flow. Onboarding flag must be enabled. + Show Onboarding Carousel + This will force the change to app state which will cause the first time carousel to show. The carousel will continue to show for any \"new\" account until a login is completed. May need to exit debug menu manually. + Cipher Key Encryption + Reset all coach mark tours + AnonAddy self-hosted aliases + SimpleLogin self-hosted aliases + Enable chrome autofill + Enable error reporting dialog + Restrict item deletion + Generate crash + Generate error report + Error reports + User-trusted privileged app management + Remove Card Policy + +