diff --git a/.github/workflows/crowdin-pull-authenticator.yml b/.github/workflows/crowdin-pull-authenticator.yml deleted file mode 100644 index 0221afec05..0000000000 --- a/.github/workflows/crowdin-pull-authenticator.yml +++ /dev/null @@ -1,59 +0,0 @@ -name: Crowdin Sync - Authenticator - -on: - workflow_dispatch: - inputs: {} - schedule: - - cron: '0 0 * * 5' - -jobs: - crowdin-sync: - name: Autosync - runs-on: ubuntu-24.04 - permissions: - contents: write - pull-requests: write - env: - _CROWDIN_PROJECT_ID: "673718" - steps: - - name: Check out repo - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - - - name: Log in to Azure - CI Subscription - uses: Azure/login@e15b166166a8746d1a47596803bd8c1b595455cf # v1.6.0 - with: - creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} - - - name: Retrieve secrets - id: retrieve-secrets - uses: bitwarden/gh-actions/get-keyvault-secrets@main - with: - keyvault: "bitwarden-ci" - secrets: "github-gpg-private-key, github-gpg-private-key-passphrase" - - - name: Generate GH App token - uses: actions/create-github-app-token@3ff1caaa28b64c9cc276ce0a02e2ff584f3900c5 # v2.0.2 - id: app-token - with: - app-id: ${{ secrets.BW_GHAPP_ID }} - private-key: ${{ secrets.BW_GHAPP_KEY }} - - - name: Download translations - uses: crowdin/github-action@b8012bd5491b8aa8578b73ab5b5f5e7c94aaa6e2 # v2.7.0 - env: - GITHUB_TOKEN: ${{ steps.app-token.outputs.token }} - CROWDIN_API_TOKEN: ${{ secrets.CROWDIN_API_TOKEN }} - with: - config: crowdin-bwa.yml - upload_sources: false - upload_translations: false - download_translations: true - github_user_name: "bitwarden-devops-bot" - github_user_email: "106330231+bitwarden-devops-bot@users.noreply.github.com" - commit_message: "Autosync the updated translations" - localization_branch_name: crowdin-auto-sync - create_pull_request: true - pull_request_title: "Autosync Crowdin Translations" - pull_request_body: "Autosync the updated translations" - gpg_private_key: ${{ steps.retrieve-secrets.outputs.github-gpg-private-key }} - gpg_passphrase: ${{ steps.retrieve-secrets.outputs.github-gpg-private-key-passphrase }} diff --git a/.github/workflows/crowdin-pull.yml b/.github/workflows/crowdin-pull.yml index 9aec4c130e..3603d059b1 100644 --- a/.github/workflows/crowdin-pull.yml +++ b/.github/workflows/crowdin-pull.yml @@ -1,20 +1,29 @@ -name: Crowdin Sync +name: Cron / Crowdin Pull +run-name: Crowdin Pull - ${{ github.event_name == 'workflow_dispatch' && 'Manual' || 'Scheduled' }} on: workflow_dispatch: - inputs: {} schedule: - cron: '0 0 * * 5' jobs: crowdin-sync: - name: Autosync + name: Crowdin Pull - ${{ matrix.name }} - ${{ github.event_name }} runs-on: ubuntu-24.04 permissions: contents: write pull-requests: write - env: - _CROWDIN_PROJECT_ID: "269690" + strategy: + matrix: + include: + - name: Password Manager + project_id: 269690 + config: crowdin-bwpm.yml + branch: crowdin-pull-bwpm + - name: Authenticator + project_id: 673718 + config: crowdin-bwa.yml + branch: crowdin-pull-bwa steps: - name: Checkout repo uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 @@ -38,22 +47,23 @@ jobs: app-id: ${{ secrets.BW_GHAPP_ID }} private-key: ${{ secrets.BW_GHAPP_KEY }} - - name: Download translations + - name: Download translations for ${{ matrix.name }} uses: crowdin/github-action@b8012bd5491b8aa8578b73ab5b5f5e7c94aaa6e2 # v2.7.0 env: GITHUB_TOKEN: ${{ steps.app-token.outputs.token }} CROWDIN_API_TOKEN: ${{ steps.retrieve-secrets.outputs.crowdin-api-token }} + _CROWDIN_PROJECT_ID: ${{ matrix.project_id }} with: - config: crowdin.yml + config: ${{ matrix.config }} upload_sources: false upload_translations: false download_translations: true github_user_name: "bitwarden-devops-bot" github_user_email: "106330231+bitwarden-devops-bot@users.noreply.github.com" - commit_message: "Autosync the updated translations" - localization_branch_name: crowdin-auto-sync + commit_message: "Crowdin Pull - ${{ matrix.name }}" + localization_branch_name: ${{ matrix.branch }} create_pull_request: true - pull_request_title: "Autosync Crowdin Translations" - pull_request_body: "Autosync the updated translations" + pull_request_title: "Crowdin Pull - ${{ matrix.name }}" + pull_request_body: ":inbox_tray: New translations for ${{ matrix.name }} received!" gpg_private_key: ${{ steps.retrieve-secrets.outputs.github-gpg-private-key }} gpg_passphrase: ${{ steps.retrieve-secrets.outputs.github-gpg-private-key-passphrase }} diff --git a/.github/workflows/crowdin-push-authenticator.yml b/.github/workflows/crowdin-push-authenticator.yml deleted file mode 100644 index 7191407ac2..0000000000 --- a/.github/workflows/crowdin-push-authenticator.yml +++ /dev/null @@ -1,32 +0,0 @@ -name: Crowdin Push - Authenticator - -on: - workflow_dispatch: - push: - branches: - - "main" -env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - JAVA_VERSION: 17 - -jobs: - crowdin-push: - name: Crowdin Push - runs-on: ubuntu-24.04 - permissions: - contents: read - env: - _CROWDIN_PROJECT_ID: "673718" - steps: - - name: Check out repo - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - - - name: Upload sources - uses: crowdin/github-action@b8012bd5491b8aa8578b73ab5b5f5e7c94aaa6e2 # v2.7.0 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - CROWDIN_API_TOKEN: ${{ secrets.CROWDIN_API_TOKEN }} - with: - config: crowdin-bwa.yml - upload_sources: true - upload_translations: false diff --git a/.github/workflows/crowdin-push.yml b/.github/workflows/crowdin-push.yml index 64c1b66640..923384bf5e 100644 --- a/.github/workflows/crowdin-push.yml +++ b/.github/workflows/crowdin-push.yml @@ -1,19 +1,18 @@ -name: Crowdin Push +name: CI / Crowdin Push +run-name: Crowdin Push - ${{ github.event_name == 'workflow_dispatch' && 'Manual' || 'CI' }} on: workflow_dispatch: push: branches: - - "main" + - main jobs: crowdin-push: - name: Crowdin Push + name: Crowdin Push - ${{ github.event_name }} runs-on: ubuntu-24.04 permissions: contents: read - env: - _CROWDIN_PROJECT_ID: "269690" steps: - name: Check out repo uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 @@ -30,12 +29,24 @@ jobs: keyvault: "bitwarden-ci" secrets: "crowdin-api-token" - - name: Upload sources + - name: Upload sources for Password Manager uses: crowdin/github-action@b8012bd5491b8aa8578b73ab5b5f5e7c94aaa6e2 # v2.7.0 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} CROWDIN_API_TOKEN: ${{ steps.retrieve-secrets.outputs.crowdin-api-token }} + _CROWDIN_PROJECT_ID: "269690" with: - config: crowdin.yml + config: crowdin-bwpm.yml + upload_sources: true + upload_translations: false + + - name: Upload sources for Authenticator + uses: crowdin/github-action@b8012bd5491b8aa8578b73ab5b5f5e7c94aaa6e2 # v2.7.0 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + CROWDIN_API_TOKEN: ${{ steps.retrieve-secrets.outputs.crowdin-api-token }} + _CROWDIN_PROJECT_ID: "673718" + with: + config: crowdin-bwa.yml upload_sources: true upload_translations: false diff --git a/.github/workflows/publish-github-release.yml b/.github/workflows/publish-github-release.yml new file mode 100644 index 0000000000..b08e068508 --- /dev/null +++ b/.github/workflows/publish-github-release.yml @@ -0,0 +1,12 @@ +name: Publish GitHub Release as newest + +on: + workflow_dispatch: + +jobs: + stub: + runs-on: ubuntu-24.04 + name: Stub + steps: + - name: Stub + run: echo "This is a stub job to trigger the workflow." \ No newline at end of file diff --git a/Gemfile.lock b/Gemfile.lock index 211b33de60..c40257f1d1 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -10,18 +10,18 @@ GEM artifactory (3.0.17) atomos (0.1.3) aws-eventstream (1.3.2) - aws-partitions (1.1102.0) - aws-sdk-core (3.223.0) + aws-partitions (1.1107.0) + aws-sdk-core (3.224.0) aws-eventstream (~> 1, >= 1.3.0) aws-partitions (~> 1, >= 1.992.0) aws-sigv4 (~> 1.9) base64 jmespath (~> 1, >= 1.6.1) logger - aws-sdk-kms (1.100.0) + aws-sdk-kms (1.101.0) aws-sdk-core (~> 3, >= 3.216.0) aws-sigv4 (~> 1.5) - aws-sdk-s3 (1.185.0) + aws-sdk-s3 (1.186.1) aws-sdk-core (~> 3, >= 3.216.0) aws-sdk-kms (~> 1) aws-sigv4 (~> 1.5) @@ -165,7 +165,7 @@ GEM httpclient (2.9.0) mutex_m jmespath (1.6.2) - json (2.11.3) + json (2.12.2) jwt (2.10.1) base64 logger (1.7.0) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index f47f76b2ed..000043f60b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -37,16 +37,18 @@ android:dataExtractionRules="@xml/data_extraction_rules" android:fullBackupContent="@xml/backup_rules" android:icon="@mipmap/ic_launcher" + android:intentMatchingFlags="enforceIntentFilter" android:label="@string/app_name" android:networkSecurityConfig="@xml/network_security_config" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/LaunchTheme" - android:intentMatchingFlags="enforceIntentFilter" + tools:ignore="CredentialDependency" tools:replace="appComponentFactory" - tools:targetApi="33"> + tools:targetApi="36"> - when (event) { - is MainEvent.CompleteAccessibilityAutofill -> { - handleCompleteAccessibilityAutofill(event) - } - - is MainEvent.CompleteAutofill -> handleCompleteAutofill(event) - MainEvent.Recreate -> handleRecreate() - MainEvent.NavigateToDebugMenu -> navController.navigateToDebugMenuScreen() - is MainEvent.ShowToast -> { - Toast - .makeText( - baseContext, - event.message.invoke(resources), - Toast.LENGTH_SHORT, - ) - .show() - } - - is MainEvent.UpdateAppLocale -> { - AppCompatDelegate.setApplicationLocales( - LocaleListCompat.forLanguageTags(event.localeName), - ) - } - - is MainEvent.UpdateAppTheme -> { - AppCompatDelegate.setDefaultNightMode(event.osTheme) - } - } - } + SetupEventsEffect(navController = navController) + val state by mainViewModel.stateFlow.collectAsStateWithLifecycle() updateScreenCapture(isScreenCaptureAllowed = state.isScreenCaptureAllowed) LocalManagerProvider(featureFlagsState = state.featureFlagsState) { ObserveScreenDataEffect( onDataUpdate = remember(mainViewModel) { - { - mainViewModel.trySendAction( - MainAction.ResumeScreenDataReceived(it), - ) - } + { mainViewModel.trySendAction(MainAction.ResumeScreenDataReceived(it)) } }, ) BitwardenTheme( @@ -148,11 +115,7 @@ class MainActivity : AppCompatActivity() { override fun onNewIntent(intent: Intent) { super.onNewIntent(intent) - mainViewModel.trySendAction( - action = MainAction.ReceiveNewIntent( - intent = intent, - ), - ) + mainViewModel.trySendAction(action = MainAction.ReceiveNewIntent(intent = intent)) } override fun onResume() { @@ -199,6 +162,34 @@ class MainActivity : AppCompatActivity() { .takeIf { it } ?: super.dispatchKeyEvent(event) + @Composable + private fun SetupEventsEffect(navController: NavController) { + EventsEffect(viewModel = mainViewModel) { event -> + when (event) { + is MainEvent.CompleteAccessibilityAutofill -> { + handleCompleteAccessibilityAutofill(event) + } + + is MainEvent.CompleteAutofill -> handleCompleteAutofill(event) + MainEvent.Recreate -> handleRecreate() + MainEvent.NavigateToDebugMenu -> navController.navigateToDebugMenuScreen() + is MainEvent.ShowToast -> { + Toast + .makeText(baseContext, event.message.invoke(resources), Toast.LENGTH_SHORT) + .show() + } + + is MainEvent.UpdateAppLocale -> { + AppCompatDelegate.setApplicationLocales( + LocaleListCompat.forLanguageTags(event.localeName), + ) + } + + is MainEvent.UpdateAppTheme -> AppCompatDelegate.setDefaultNightMode(event.osTheme) + } + } + } + private fun sendOpenDebugMenuEvent() { mainViewModel.trySendAction(MainAction.OpenDebugMenu) } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/auth/repository/AuthRepository.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/auth/repository/AuthRepository.kt index 0eaf38db7f..66d5358785 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/auth/repository/AuthRepository.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/auth/repository/AuthRepository.kt @@ -15,7 +15,6 @@ import com.x8bit.bitwarden.data.auth.repository.model.LeaveOrganizationResult import com.x8bit.bitwarden.data.auth.repository.model.LoginResult import com.x8bit.bitwarden.data.auth.repository.model.LogoutReason import com.x8bit.bitwarden.data.auth.repository.model.NewSsoUserResult -import com.x8bit.bitwarden.data.auth.repository.model.OrganizationDomainSsoDetailsResult import com.x8bit.bitwarden.data.auth.repository.model.PasswordHintResult import com.x8bit.bitwarden.data.auth.repository.model.PasswordStrengthResult import com.x8bit.bitwarden.data.auth.repository.model.PolicyInformation @@ -353,13 +352,6 @@ interface AuthRepository : AuthenticatorProvider, AuthRequestManager { */ fun setWebAuthResult(webAuthResult: WebAuthResult) - /** - * Checks for a claimed domain organization for the [email] that can be used for an SSO request. - */ - suspend fun getOrganizationDomainSsoDetails( - email: String, - ): OrganizationDomainSsoDetailsResult - /** * Get the verified organization domain SSO details for the given [email]. */ diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/auth/repository/AuthRepositoryImpl.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/auth/repository/AuthRepositoryImpl.kt index 6e9834e970..717768f5da 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/auth/repository/AuthRepositoryImpl.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/auth/repository/AuthRepositoryImpl.kt @@ -65,7 +65,6 @@ import com.x8bit.bitwarden.data.auth.repository.model.LeaveOrganizationResult import com.x8bit.bitwarden.data.auth.repository.model.LoginResult import com.x8bit.bitwarden.data.auth.repository.model.LogoutReason import com.x8bit.bitwarden.data.auth.repository.model.NewSsoUserResult -import com.x8bit.bitwarden.data.auth.repository.model.OrganizationDomainSsoDetailsResult import com.x8bit.bitwarden.data.auth.repository.model.PasswordHintResult import com.x8bit.bitwarden.data.auth.repository.model.PasswordStrengthResult import com.x8bit.bitwarden.data.auth.repository.model.PolicyInformation @@ -112,7 +111,6 @@ import com.x8bit.bitwarden.data.auth.util.YubiKeyResult import com.x8bit.bitwarden.data.auth.util.toSdkParams import com.x8bit.bitwarden.data.platform.error.MissingPropertyException import com.x8bit.bitwarden.data.platform.error.NoActiveUserException -import com.x8bit.bitwarden.data.platform.manager.FeatureFlagManager import com.x8bit.bitwarden.data.platform.manager.FirstTimeActionManager import com.x8bit.bitwarden.data.platform.manager.LogsManager import com.x8bit.bitwarden.data.platform.manager.PolicyManager @@ -173,7 +171,6 @@ class AuthRepositoryImpl( private val trustedDeviceManager: TrustedDeviceManager, private val userLogoutManager: UserLogoutManager, private val policyManager: PolicyManager, - private val featureFlagManager: FeatureFlagManager, firstTimeActionManager: FirstTimeActionManager, logsManager: LogsManager, pushManager: PushManager, @@ -1201,23 +1198,6 @@ class AuthRepositoryImpl( webAuthResultChannel.trySend(webAuthResult) } - override suspend fun getOrganizationDomainSsoDetails( - email: String, - ): OrganizationDomainSsoDetailsResult = organizationService - .getOrganizationDomainSsoDetails( - email = email, - ) - .fold( - onSuccess = { - OrganizationDomainSsoDetailsResult.Success( - isSsoAvailable = it.isSsoAvailable, - organizationIdentifier = it.organizationIdentifier, - verifiedDate = it.verifiedDate, - ) - }, - onFailure = { OrganizationDomainSsoDetailsResult.Failure(error = it) }, - ) - override suspend fun getVerifiedOrganizationDomainSsoDetails( email: String, ): VerifiedOrganizationDomainSsoDetailsResult = organizationService diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/auth/repository/di/AuthRepositoryModule.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/auth/repository/di/AuthRepositoryModule.kt index c1511a09bf..b9753a24ba 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/auth/repository/di/AuthRepositoryModule.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/auth/repository/di/AuthRepositoryModule.kt @@ -15,7 +15,6 @@ import com.x8bit.bitwarden.data.auth.manager.TrustedDeviceManager import com.x8bit.bitwarden.data.auth.manager.UserLogoutManager import com.x8bit.bitwarden.data.auth.repository.AuthRepository import com.x8bit.bitwarden.data.auth.repository.AuthRepositoryImpl -import com.x8bit.bitwarden.data.platform.manager.FeatureFlagManager import com.x8bit.bitwarden.data.platform.manager.FirstTimeActionManager import com.x8bit.bitwarden.data.platform.manager.LogsManager import com.x8bit.bitwarden.data.platform.manager.PolicyManager @@ -59,7 +58,6 @@ object AuthRepositoryModule { userLogoutManager: UserLogoutManager, pushManager: PushManager, policyManager: PolicyManager, - featureFlagManager: FeatureFlagManager, firstTimeActionManager: FirstTimeActionManager, logsManager: LogsManager, ): AuthRepository = AuthRepositoryImpl( @@ -82,7 +80,6 @@ object AuthRepositoryModule { userLogoutManager = userLogoutManager, pushManager = pushManager, policyManager = policyManager, - featureFlagManager = featureFlagManager, firstTimeActionManager = firstTimeActionManager, logsManager = logsManager, ) diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/auth/repository/model/Organization.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/auth/repository/model/Organization.kt index ddbc4fa48f..244be1bfde 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/auth/repository/model/Organization.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/auth/repository/model/Organization.kt @@ -12,6 +12,8 @@ import com.bitwarden.network.model.OrganizationType * @property shouldUseKeyConnector Indicates that the organization uses a key connector. * @property role The user's role in the organization. * @property keyConnectorUrl The key connector domain (if applicable). + * @property userIsClaimedByOrganization Indicates that the user is claimed by the organization. + * @property limitItemDeletion Indicates that the organization limits item deletion. */ data class Organization( val id: String, @@ -21,4 +23,5 @@ data class Organization( val role: OrganizationType, val keyConnectorUrl: String?, val userIsClaimedByOrganization: Boolean, + val limitItemDeletion: Boolean = false, ) diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/auth/repository/model/OrganizationDomainSsoDetailsResult.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/auth/repository/model/OrganizationDomainSsoDetailsResult.kt deleted file mode 100644 index d1372e7ceb..0000000000 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/auth/repository/model/OrganizationDomainSsoDetailsResult.kt +++ /dev/null @@ -1,28 +0,0 @@ -package com.x8bit.bitwarden.data.auth.repository.model - -import java.time.ZonedDateTime - -/** - * Response types when checking for an email's claimed domain organization. - */ -sealed class OrganizationDomainSsoDetailsResult { - /** - * The request was successful. - * - * @property isSsoAvailable Indicates if SSO is available for the email address. - * @property organizationIdentifier The claimed organization identifier for the email address. - * @property verifiedDate The date and time when the domain was verified. - */ - data class Success( - val isSsoAvailable: Boolean, - val organizationIdentifier: String, - val verifiedDate: ZonedDateTime?, - ) : OrganizationDomainSsoDetailsResult() - - /** - * The request failed. - */ - data class Failure( - val error: Throwable, - ) : OrganizationDomainSsoDetailsResult() -} diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/auth/repository/util/SyncResponseJsonExtensions.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/auth/repository/util/SyncResponseJsonExtensions.kt index f64bfa775e..d889c26451 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/auth/repository/util/SyncResponseJsonExtensions.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/auth/repository/util/SyncResponseJsonExtensions.kt @@ -24,6 +24,7 @@ fun SyncResponseJson.Profile.Organization.toOrganization(): Organization = shouldManageResetPassword = this.permissions.shouldManageResetPassword, keyConnectorUrl = this.keyConnectorUrl, userIsClaimedByOrganization = this.userIsClaimedByOrganization, + limitItemDeletion = this.limitItemDeletion, ) /** 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 342c408516..12cadf3448 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 @@ -33,14 +33,13 @@ class BitwardenAccessibilityProcessorImpl( ) { // Only process the event if the tile was clicked val accessibilityAction = accessibilityAutofillManager.accessibilityAction ?: return - val eventNode = event.source ?: return // Prevent clearing the action until we receive a processable event in case unprocessable // events are still being received from the device. This can happen on slower devices or if // screen transitions are still being performed. - if (!eventNode.shouldProcessEvent(rootAccessibilityNodeInfoProvider)) { - return - } + val eventNode = event + .getValidNode(rootAccessibilityNodeInfoProvider = rootAccessibilityNodeInfoProvider) + ?: return // Clear the action since we are now acting on a supported node. accessibilityAutofillManager.accessibilityAction = null @@ -53,35 +52,43 @@ class BitwardenAccessibilityProcessorImpl( } } - private fun AccessibilityNodeInfo.shouldProcessEvent( + private fun AccessibilityEvent.getValidNode( rootAccessibilityNodeInfoProvider: () -> AccessibilityNodeInfo?, - ): Boolean { + ): AccessibilityNodeInfo? { + val eventNode = this + .source + ?: run { + Timber.w("Accessibility event source is null, attempting root node") + // We only call for the root node once, after verifying that the there is an action + // to be filled. This is because it is a significant performance hit. + // Additionally, we do not use the root node if it does not have the same package + // as the triggering event. + rootAccessibilityNodeInfoProvider()?.takeIf { it.packageName == this.packageName } + } + ?: run { + Timber.w("Root node was also null, skipping this event") + return null + } + // Ignore the event when the phone is inactive. - if (!powerManager.isInteractive) return false + if (!powerManager.isInteractive) return null // We skip if the system package. - if (this.isSystemPackage) { - Timber.d("Skipping autofill for system package $packageName.") - return false + if (eventNode.isSystemPackage) { + Timber.d("Skipping autofill for system package ${eventNode.packageName}.") + return null } // We skip any package that is explicitly blocked. - if (this.shouldSkipPackage) { - Timber.d("Skipping autofill on block-listed package $packageName.") - return false + if (eventNode.shouldSkipPackage) { + Timber.d("Skipping autofill on block-listed package ${eventNode.packageName}.") + return null } // We skip any package that is a launcher. - if (launcherPackageNameManager.launcherPackages.any { it == this.packageName }) { - Timber.d("Skipping autofill on launcher package $packageName.") - return false + if (launcherPackageNameManager.launcherPackages.any { it == eventNode.packageName }) { + Timber.d("Skipping autofill on launcher package ${eventNode.packageName}.") + return null } - // We only call for the root node once, after all other checks have passed, because it is a - // significant performance hit. - if (rootAccessibilityNodeInfoProvider()?.packageName != this.packageName) { - Timber.d("Skipping autofill due to package name mismatch.") - return false - } - - return true + return eventNode } private fun handleAttemptParseUri(rootNode: AccessibilityNodeInfo) { diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/autofill/accessibility/util/KnownUsernameFieldUtil.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/autofill/accessibility/util/KnownUsernameFieldUtil.kt index 6e2f057977..b43f061d4d 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/autofill/accessibility/util/KnownUsernameFieldUtil.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/autofill/accessibility/util/KnownUsernameFieldUtil.kt @@ -187,6 +187,14 @@ private val LEGACY_KNOWN_USERNAME_FIELDS: List = listOf( uriAuthority = "bitly.com", accessOption = AccessOptions(matchValue = "/sso/url_slug", usernameViewId = "url_slug"), ), + KnownUsernameField( + uriAuthority = "com.disney.disneyplus", + accessOption = AccessOptions( + matchValue = "", + matchingStrategy = AccessOptions.MatchingStrategy.CONTAINS_CASE_SENSITIVE, + usernameViewId = "editFieldEditText", + ), + ), KnownUsernameField( uriAuthority = "signin.befr.ebay.be", accessOptions = listOf( diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/manager/FirstTimeActionManagerImpl.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/manager/FirstTimeActionManagerImpl.kt index 9a8bbdb779..987ca80533 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/manager/FirstTimeActionManagerImpl.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/manager/FirstTimeActionManagerImpl.kt @@ -160,13 +160,6 @@ class FirstTimeActionManagerImpl @Inject constructor( .getShouldShowAddLoginCoachMarkFlow() .map { it != false } .mapFalseIfAnyLoginCiphersAvailable() - .combine( - featureFlagManager.getFeatureFlagFlow(FlagKey.OnboardingFlow), - ) { shouldShow, featureIsEnabled -> - // If the feature flag is off always return true so observers know - // the card has not been shown. - shouldShow && featureIsEnabled - } .distinctUntilChanged() override val shouldShowGeneratorCoachMarkFlow: Flow @@ -174,13 +167,6 @@ class FirstTimeActionManagerImpl @Inject constructor( .getShouldShowGeneratorCoachMarkFlow() .map { it != false } .mapFalseIfAnyLoginCiphersAvailable() - .combine( - featureFlagManager.getFeatureFlagFlow(FlagKey.OnboardingFlow), - ) { shouldShow, featureFlagEnabled -> - // If the feature flag is off always return true so observers know - // the card has not been shown. - shouldShow && featureFlagEnabled - } .distinctUntilChanged() /** diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/manager/model/FlagKey.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/manager/model/FlagKey.kt index 919d2d2f99..c867699b31 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/manager/model/FlagKey.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/platform/manager/model/FlagKey.kt @@ -23,9 +23,7 @@ sealed class FlagKey { listOf( AuthenticatorSync, EmailVerification, - OnboardingFlow, ImportLoginsFlow, - VerifiedSsoDomainEndpoint, CredentialExchangeProtocolImport, CredentialExchangeProtocolExport, MutualTls, @@ -74,14 +72,6 @@ sealed class FlagKey { override val defaultValue: Boolean = false } - /** - * Data object holding the feature flag key for the new onboarding feature. - */ - data object OnboardingFlow : FlagKey() { - override val keyName: String = "native-create-account-flow" - override val defaultValue: Boolean = false - } - /** * Data object holding the feature flag key for the import logins feature. */ @@ -90,14 +80,6 @@ sealed class FlagKey { override val defaultValue: Boolean = false } - /** - * Data object holding the feature flag key for the new verified SSO domain endpoint feature. - */ - data object VerifiedSsoDomainEndpoint : FlagKey() { - override val keyName: String = "pm-12337-refactor-sso-details-endpoint" - override val defaultValue: Boolean = false - } - /** * Data object holding hte feature flag key for the Credential Exchange Protocol (CXP) import * feature. 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 c10bc3d4b2..a0aa69e9c1 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 @@ -31,15 +31,16 @@ import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.bitwarden.ui.platform.base.util.EventsEffect import com.bitwarden.ui.platform.base.util.standardHorizontalMargin +import com.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar +import com.bitwarden.ui.platform.components.appbar.NavigationIcon 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.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.appbar.BitwardenTopAppBar -import com.x8bit.bitwarden.ui.platform.components.appbar.NavigationIcon import com.x8bit.bitwarden.ui.platform.components.button.BitwardenFilledButton import com.x8bit.bitwarden.ui.platform.components.button.BitwardenTextButton import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenBasicDialog @@ -118,7 +119,7 @@ fun SetupAutoFillScreen( null } else { NavigationIcon( - navigationIcon = rememberVectorPainter(id = R.drawable.ic_close), + navigationIcon = rememberVectorPainter(id = BitwardenDrawable.ic_close), navigationIconContentDescription = stringResource(id = R.string.close), onNavigationIconClick = remember(viewModel) { { 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 2467b142d7..2149f90b38 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 @@ -25,10 +25,10 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import com.bitwarden.ui.platform.base.util.standardHorizontalMargin +import com.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar import com.bitwarden.ui.platform.components.util.rememberVectorPainter import com.bitwarden.ui.platform.theme.BitwardenTheme import com.x8bit.bitwarden.R -import com.x8bit.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar import com.x8bit.bitwarden.ui.platform.components.button.BitwardenFilledButton import com.x8bit.bitwarden.ui.platform.components.scaffold.BitwardenScaffold 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 a060195176..8034e3ca4a 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 @@ -35,15 +35,16 @@ import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.bitwarden.ui.platform.base.util.EventsEffect import com.bitwarden.ui.platform.base.util.standardHorizontalMargin +import com.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar +import com.bitwarden.ui.platform.components.appbar.NavigationIcon 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.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.appbar.BitwardenTopAppBar -import com.x8bit.bitwarden.ui.platform.components.appbar.NavigationIcon import com.x8bit.bitwarden.ui.platform.components.button.BitwardenFilledButton import com.x8bit.bitwarden.ui.platform.components.button.BitwardenTextButton import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenBasicDialog @@ -116,7 +117,7 @@ fun SetupUnlockScreen( null } else { NavigationIcon( - navigationIcon = rememberVectorPainter(id = R.drawable.ic_close), + navigationIcon = rememberVectorPainter(id = BitwardenDrawable.ic_close), navigationIconContentDescription = stringResource(id = R.string.close), onNavigationIconClick = remember(viewModel) { { 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 83f5d47b70..6d3939a63e 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 @@ -31,13 +31,13 @@ import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.bitwarden.ui.platform.base.util.EventsEffect +import com.bitwarden.ui.platform.base.util.annotatedStringResource import com.bitwarden.ui.platform.base.util.standardHorizontalMargin -import com.bitwarden.ui.platform.base.util.toAnnotatedString +import com.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar import com.bitwarden.ui.platform.components.util.rememberVectorPainter 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.appbar.BitwardenTopAppBar import com.x8bit.bitwarden.ui.platform.components.button.BitwardenFilledButton import com.x8bit.bitwarden.ui.platform.components.button.BitwardenOutlinedButton import com.x8bit.bitwarden.ui.platform.components.scaffold.BitwardenScaffold @@ -136,16 +136,16 @@ private fun CheckEmailContent( ) Spacer(modifier = Modifier.height(8.dp)) - val descriptionAnnotatedString = R.string.we_sent_an_email_to.toAnnotatedString( - args = arrayOf(email), - emphasisHighlightStyle = SpanStyle( - color = BitwardenTheme.colorScheme.text.primary, - fontSize = BitwardenTheme.typography.bodyMedium.fontSize, - fontWeight = FontWeight.Bold, - ), - ) Text( - text = descriptionAnnotatedString, + text = annotatedStringResource( + id = R.string.we_sent_an_email_to, + args = arrayOf(email), + emphasisHighlightStyle = SpanStyle( + color = BitwardenTheme.colorScheme.text.primary, + fontSize = BitwardenTheme.typography.bodyMedium.fontSize, + fontWeight = FontWeight.Bold, + ), + ), textAlign = TextAlign.Center, style = BitwardenTheme.typography.bodyMedium, modifier = Modifier 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 6332a91cb2..8f4a9df741 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 @@ -37,17 +37,17 @@ import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.bitwarden.ui.platform.base.util.EventsEffect import com.bitwarden.ui.platform.base.util.standardHorizontalMargin +import com.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar 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.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.appbar.BitwardenTopAppBar import com.x8bit.bitwarden.ui.platform.components.button.BitwardenFilledButton -import com.x8bit.bitwarden.ui.platform.components.button.BitwardenTextButton import com.x8bit.bitwarden.ui.platform.components.card.BitwardenActionCardSmall import com.x8bit.bitwarden.ui.platform.components.card.color.bitwardenCardColors import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenBasicDialog @@ -137,24 +137,11 @@ fun CompleteRegistrationScreen( .nestedScroll(scrollBehavior.nestedScrollConnection), topBar = { BitwardenTopAppBar( - title = stringResource( - id = R.string.create_account - .takeIf { state.onboardingEnabled } - ?: R.string.set_password, - ), + title = stringResource(id = R.string.create_account), scrollBehavior = scrollBehavior, navigationIcon = rememberVectorPainter(id = R.drawable.ic_back), navigationIconContentDescription = stringResource(id = R.string.back), onNavigationIconClick = handler.onBackClick, - actions = { - if (!state.onboardingEnabled) { - BitwardenTextButton( - label = state.callToActionText(), - onClick = handler.onCallToAction, - modifier = Modifier.testTag("CreateAccountButton"), - ) - } - }, ) }, ) { @@ -172,10 +159,8 @@ fun CompleteRegistrationScreen( isCheckDataBreachesToggled = state.isCheckDataBreachesToggled, handler = handler, nextButtonEnabled = state.validSubmissionReady, - callToActionText = state.callToActionText(), + callToActionText = stringResource(R.string.next), minimumPasswordLength = state.minimumPasswordLength, - showNewOnboardingUi = state.onboardingEnabled, - userEmail = state.userEmail, ) Spacer(modifier = Modifier.height(height = 16.dp)) Spacer(modifier = Modifier.navigationBarsPadding()) @@ -186,7 +171,6 @@ fun CompleteRegistrationScreen( @Suppress("LongMethod") @Composable private fun CompleteRegistrationContent( - userEmail: String, passwordInput: String, passwordStrengthState: PasswordStrengthState, confirmPasswordInput: String, @@ -196,50 +180,36 @@ private fun CompleteRegistrationContent( minimumPasswordLength: Int, callToActionText: String, handler: CompleteRegistrationHandler, - showNewOnboardingUi: Boolean, modifier: Modifier = Modifier, ) { Column( modifier = modifier .fillMaxWidth(), ) { - if (showNewOnboardingUi) { - CompleteRegistrationContentHeader( - modifier = Modifier - .align(Alignment.CenterHorizontally) - .standardHorizontalMargin(), - ) - Spacer(modifier = Modifier.height(24.dp)) - BitwardenActionCardSmall( - actionIcon = rememberVectorPainter(id = R.drawable.ic_question_circle), - actionText = stringResource(id = R.string.what_makes_a_password_strong), - callToActionText = stringResource(id = R.string.learn_more), - callToActionTextColor = BitwardenTheme.colorScheme.text.interaction, - colors = bitwardenCardColors( - containerColor = BitwardenTheme.colorScheme.background.primary, - ), - onCardClicked = handler.onMakeStrongPassword, - modifier = Modifier - .fillMaxWidth() - .standardHorizontalMargin(), - ) - } else { - LegacyHeaderContent( - userEmail = userEmail, - modifier = Modifier - .align(Alignment.CenterHorizontally) - .standardHorizontalMargin(), - ) - } + CompleteRegistrationContentHeader( + modifier = Modifier + .align(Alignment.CenterHorizontally) + .standardHorizontalMargin(), + ) + 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), + callToActionTextColor = BitwardenTheme.colorScheme.text.interaction, + colors = bitwardenCardColors( + containerColor = BitwardenTheme.colorScheme.background.primary, + ), + onCardClicked = handler.onMakeStrongPassword, + modifier = Modifier + .fillMaxWidth() + .standardHorizontalMargin(), + ) Spacer(modifier = Modifier.height(24.dp)) var showPassword by rememberSaveable { mutableStateOf(false) } BitwardenPasswordField( - label = stringResource( - id = R.string.master_password_required - .takeIf { showNewOnboardingUi } - ?: R.string.master_password, - ), + label = stringResource(id = R.string.master_password_required), showPassword = showPassword, showPasswordChange = { showPassword = it }, value = passwordInput, @@ -250,7 +220,7 @@ private fun CompleteRegistrationContent( PasswordStrengthIndicator( state = passwordStrengthState, currentCharacterCount = passwordInput.length, - minimumCharacterCount = minimumPasswordLength.takeIf { showNewOnboardingUi }, + minimumCharacterCount = minimumPasswordLength, modifier = Modifier.fillMaxWidth(), ) }, @@ -261,11 +231,7 @@ private fun CompleteRegistrationContent( .standardHorizontalMargin(), ) BitwardenPasswordField( - label = stringResource( - id = R.string.retype_master_password_required - .takeIf { showNewOnboardingUi } - ?: R.string.retype_master_password, - ), + label = stringResource(id = R.string.retype_master_password_required), value = confirmPasswordInput, showPassword = showPassword, showPasswordChange = { showPassword = it }, @@ -279,33 +245,27 @@ private fun CompleteRegistrationContent( ) BitwardenTextField( label = stringResource( - id = R.string.master_password_hint_not_specified - .takeIf { showNewOnboardingUi } - ?: R.string.master_password_hint, + id = R.string.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 - .takeIf { showNewOnboardingUi } - ?: R.string.master_password_hint_description, + id = R.string.bitwarden_cannot_recover_a_lost_or_forgotten_master_password, ), style = BitwardenTheme.typography.bodySmall, color = BitwardenTheme.colorScheme.text.secondary, modifier = Modifier.fillMaxWidth(), ) - if (showNewOnboardingUi) { - BitwardenClickableText( - label = stringResource( - id = R.string.learn_about_other_ways_to_prevent_account_lockout, - ), - onClick = handler.onLearnToPreventLockout, - style = BitwardenTheme.typography.labelMedium, - innerPadding = PaddingValues(vertical = 4.dp), - ) - } + BitwardenClickableText( + label = stringResource( + id = R.string.learn_about_other_ways_to_prevent_account_lockout, + ), + onClick = handler.onLearnToPreventLockout, + style = BitwardenTheme.typography.labelMedium, + innerPadding = PaddingValues(vertical = 4.dp), + ) }, textFieldTestTag = "MasterPasswordHintLabel", cardStyle = CardStyle.Bottom, @@ -323,17 +283,15 @@ private fun CompleteRegistrationContent( .testTag("CheckExposedMasterPasswordToggle") .standardHorizontalMargin(), ) - if (showNewOnboardingUi) { - Spacer(modifier = Modifier.height(height = 16.dp)) - BitwardenFilledButton( - label = callToActionText, - isEnabled = nextButtonEnabled, - onClick = handler.onCallToAction, - modifier = Modifier - .fillMaxWidth() - .standardHorizontalMargin(), - ) - } + Spacer(modifier = Modifier.height(height = 16.dp)) + BitwardenFilledButton( + label = callToActionText, + isEnabled = nextButtonEnabled, + onClick = handler.onCallToAction, + modifier = Modifier + .fillMaxWidth() + .standardHorizontalMargin(), + ) } } @@ -362,24 +320,6 @@ private fun CompleteRegistrationContentHeader( } } -@Composable -private fun LegacyHeaderContent( - userEmail: String, - modifier: Modifier = Modifier, -) { - @Suppress("MaxLineLength") - Text( - text = stringResource( - id = R.string.follow_the_instructions_in_the_email_sent_to_x_to_continue_creating_your_account, - userEmail, - ), - style = BitwardenTheme.typography.bodyMedium, - color = BitwardenTheme.colorScheme.text.primary, - modifier = modifier - .fillMaxWidth(), - ) -} - /** * Header content ordered with the image "first" and the text "second" which can be placed in a * [Column] or [Row]. @@ -439,40 +379,6 @@ private fun CompleteRegistrationContentOldUI_preview() { nextButtonEnabled = true, modifier = Modifier.standardHorizontalMargin(), minimumPasswordLength = 12, - showNewOnboardingUi = false, - userEmail = "fake@email.com", - ) - } -} - -@PreviewScreenSizes -@Composable -private fun CompleteRegistrationContentNewUI_preview() { - BitwardenTheme { - CompleteRegistrationContent( - passwordInput = "tortor", - passwordStrengthState = PasswordStrengthState.WEAK_3, - confirmPasswordInput = "consequat", - passwordHintInput = "dissentiunt", - isCheckDataBreachesToggled = false, - handler = CompleteRegistrationHandler( - onDismissErrorDialog = {}, - onContinueWithBreachedPasswordClick = {}, - onBackClick = {}, - onPasswordInputChange = {}, - onConfirmPasswordInputChange = {}, - onPasswordHintChange = {}, - onCheckDataBreachesToggle = {}, - onLearnToPreventLockout = {}, - onMakeStrongPassword = {}, - onCallToAction = {}, - ), - callToActionText = "Next", - nextButtonEnabled = true, - modifier = Modifier.standardHorizontalMargin(), - minimumPasswordLength = 12, - showNewOnboardingUi = true, - userEmail = "fake@email.com", ) } } 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 3fc57f3617..585e442687 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 @@ -14,9 +14,7 @@ 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.PasswordStrengthResult import com.x8bit.bitwarden.data.auth.repository.model.RegisterResult -import com.x8bit.bitwarden.data.platform.manager.FeatureFlagManager import com.x8bit.bitwarden.data.platform.manager.SpecialCircumstanceManager -import com.x8bit.bitwarden.data.platform.manager.model.FlagKey import com.x8bit.bitwarden.data.platform.repository.EnvironmentRepository import com.x8bit.bitwarden.data.tools.generator.repository.GeneratorRepository import com.x8bit.bitwarden.data.tools.generator.repository.model.GeneratorResult @@ -50,7 +48,6 @@ private const val MIN_PASSWORD_LENGTH = 12 @HiltViewModel class CompleteRegistrationViewModel @Inject constructor( savedStateHandle: SavedStateHandle, - featureFlagManager: FeatureFlagManager, generatorRepository: GeneratorRepository, private val authRepository: AuthRepository, private val environmentRepository: EnvironmentRepository, @@ -68,7 +65,6 @@ class CompleteRegistrationViewModel @Inject constructor( isCheckDataBreachesToggled = true, dialog = null, passwordStrengthState = PasswordStrengthState.NONE, - onboardingEnabled = featureFlagManager.getFeatureFlag(FlagKey.OnboardingFlow), minimumPasswordLength = MIN_PASSWORD_LENGTH, ) }, @@ -87,14 +83,6 @@ class CompleteRegistrationViewModel @Inject constructor( .onEach { savedStateHandle[KEY_STATE] = it } .launchIn(viewModelScope) - featureFlagManager - .getFeatureFlagFlow(FlagKey.OnboardingFlow) - .map { - Internal.UpdateOnboardingFeatureState(newValue = it) - } - .onEach(::sendAction) - .launchIn(viewModelScope) - generatorRepository .generatorResultFlow .filterIsInstance() @@ -132,7 +120,6 @@ class CompleteRegistrationViewModel @Inject constructor( is Internal.GeneratedPasswordResult -> handleGeneratedPasswordResult(action) is ReceivePasswordStrengthResult -> handlePasswordStrengthResult(action) is Internal.ReceiveRegisterResult -> handleReceiveRegisterAccountResult(action) - is Internal.UpdateOnboardingFeatureState -> handleUpdateOnboardingFeatureState(action) is Internal.ReceiveLoginResult -> handleLoginResult(action) } } @@ -164,12 +151,6 @@ class CompleteRegistrationViewModel @Inject constructor( } } - private fun handleUpdateOnboardingFeatureState(action: Internal.UpdateOnboardingFeatureState) { - mutableStateFlow.update { - it.copy(onboardingEnabled = action.newValue) - } - } - private fun handlePasswordStrengthResult(action: ReceivePasswordStrengthResult) { when (val result = action.result) { is PasswordStrengthResult.Success -> { @@ -458,20 +439,8 @@ data class CompleteRegistrationState( val isCheckDataBreachesToggled: Boolean, val dialog: CompleteRegistrationDialog?, val passwordStrengthState: PasswordStrengthState, - val onboardingEnabled: Boolean, val minimumPasswordLength: Int, ) : Parcelable { - - /** - * The text to display on the call to action button. - */ - val callToActionText: Text - get() = if (onboardingEnabled) { - R.string.next.asText() - } else { - R.string.create_account.asText() - } - /** * Whether or not the provided master password is considered strong. */ @@ -639,11 +608,6 @@ sealed class CompleteRegistrationAction { val result: PasswordStrengthResult, ) : Internal() - /** - * Indicate on boarding feature state has been updated. - */ - data class UpdateOnboardingFeatureState(val newValue: Boolean) : Internal() - /** * Indicates a generated password has been received. */ 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 7debaf7003..aa60ed975f 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 @@ -27,17 +27,18 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.semantics.CustomAccessibilityAction import androidx.compose.ui.semantics.customActions import androidx.compose.ui.semantics.semantics -import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.unit.dp import androidx.core.net.toUri import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.bitwarden.ui.platform.base.util.EventsEffect +import com.bitwarden.ui.platform.base.util.annotatedStringResource import com.bitwarden.ui.platform.base.util.standardHorizontalMargin -import com.bitwarden.ui.platform.base.util.toAnnotatedString +import com.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar 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.theme.BitwardenTheme import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.auth.feature.completeregistration.PasswordStrengthIndicator @@ -55,7 +56,6 @@ import com.x8bit.bitwarden.ui.auth.feature.createaccount.CreateAccountAction.Sub import com.x8bit.bitwarden.ui.auth.feature.createaccount.CreateAccountAction.TermsClick import com.x8bit.bitwarden.ui.auth.feature.createaccount.CreateAccountEvent.NavigateToPrivacyPolicy import com.x8bit.bitwarden.ui.auth.feature.createaccount.CreateAccountEvent.NavigateToTerms -import com.x8bit.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar import com.x8bit.bitwarden.ui.platform.components.button.BitwardenTextButton import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenBasicDialog import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenLoadingDialog @@ -156,7 +156,7 @@ fun CreateAccountScreen( BitwardenTopAppBar( title = stringResource(id = R.string.create_account), scrollBehavior = scrollBehavior, - navigationIcon = rememberVectorPainter(id = R.drawable.ic_close), + navigationIcon = rememberVectorPainter(id = BitwardenDrawable.ic_close), navigationIconContentDescription = stringResource(id = R.string.close), onNavigationIconClick = remember(viewModel) { { viewModel.trySendAction(CloseClick) } @@ -296,14 +296,6 @@ private fun TermsAndPrivacySwitch( ) { val strTerms = stringResource(id = R.string.terms_of_service) val strPrivacy = stringResource(id = R.string.privacy_policy) - val annotatedLinkString: AnnotatedString = R.string - .by_activating_this_switch_you_agree_to_the_terms_of_service_and_privacy_policy - .toAnnotatedString { - when (it) { - "termsOfService" -> onTermsClick() - "privacyPolicy" -> onPrivacyPolicyClick() - } - } BitwardenSwitch( modifier = modifier.semantics(mergeDescendants = true) { customActions = listOf( @@ -323,7 +315,16 @@ private fun TermsAndPrivacySwitch( ), ) }, - label = annotatedLinkString, + label = annotatedStringResource( + id = R.string + .by_activating_this_switch_you_agree_to_the_terms_of_service_and_privacy_policy, + onAnnotationClick = { + when (it) { + "termsOfService" -> onTermsClick() + "privacyPolicy" -> onPrivacyPolicyClick() + } + }, + ), isChecked = isChecked, contentDescription = "AcceptPoliciesToggle", onCheckedChange = onCheckedChange, 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 f0c4efe998..d07b9907a0 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 @@ -26,11 +26,12 @@ import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.bitwarden.ui.platform.base.util.EventsEffect import com.bitwarden.ui.platform.base.util.standardHorizontalMargin +import com.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar 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.theme.BitwardenTheme import com.x8bit.bitwarden.R -import com.x8bit.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar import com.x8bit.bitwarden.ui.platform.components.button.BitwardenTextButton import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenBasicDialog import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenLoadingDialog @@ -98,7 +99,7 @@ fun EnterpriseSignOnScreen( BitwardenTopAppBar( title = stringResource(id = R.string.app_name), scrollBehavior = scrollBehavior, - navigationIcon = rememberVectorPainter(id = R.drawable.ic_close), + navigationIcon = rememberVectorPainter(id = BitwardenDrawable.ic_close), navigationIconContentDescription = stringResource(id = R.string.close), onNavigationIconClick = remember(viewModel) { { viewModel.trySendAction(EnterpriseSignOnAction.CloseButtonClick) } 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 797c09fe0c..292f703a43 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 @@ -12,7 +12,6 @@ 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.OrganizationDomainSsoDetailsResult import com.x8bit.bitwarden.data.auth.repository.model.PrevalidateSsoResult import com.x8bit.bitwarden.data.auth.repository.model.VerifiedOrganizationDomainSsoDetailsResult import com.x8bit.bitwarden.data.auth.repository.util.CaptchaCallbackTokenResult @@ -20,8 +19,6 @@ import com.x8bit.bitwarden.data.auth.repository.util.SSO_URI import com.x8bit.bitwarden.data.auth.repository.util.SsoCallbackResult import com.x8bit.bitwarden.data.auth.repository.util.generateUriForCaptcha import com.x8bit.bitwarden.data.auth.repository.util.generateUriForSso -import com.x8bit.bitwarden.data.platform.manager.FeatureFlagManager -import com.x8bit.bitwarden.data.platform.manager.model.FlagKey import com.x8bit.bitwarden.data.platform.manager.network.NetworkConnectionManager import com.x8bit.bitwarden.data.platform.repository.EnvironmentRepository import com.x8bit.bitwarden.data.platform.util.toUriOrNull @@ -48,7 +45,6 @@ private const val RANDOM_STRING_LENGTH = 64 class EnterpriseSignOnViewModel @Inject constructor( private val authRepository: AuthRepository, private val environmentRepository: EnvironmentRepository, - private val featureFlagManager: FeatureFlagManager, private val generatorRepository: GeneratorRepository, private val networkConnectionManager: NetworkConnectionManager, private val savedStateHandle: SavedStateHandle, @@ -114,10 +110,6 @@ class EnterpriseSignOnViewModel @Inject constructor( handleOnSsoPrevalidationFailure(action) } - is EnterpriseSignOnAction.Internal.OnOrganizationDomainSsoDetailsReceive -> { - handleOnOrganizationDomainSsoDetailsReceive(action) - } - is EnterpriseSignOnAction.Internal.OnSsoCallbackResult -> { handleOnSsoCallbackResult(action) } @@ -249,15 +241,6 @@ class EnterpriseSignOnViewModel @Inject constructor( ) } - private fun handleOnOrganizationDomainSsoDetailsFailure() { - mutableStateFlow.update { - it.copy( - dialogState = null, - orgIdentifierInput = authRepository.rememberedOrgIdentifier ?: "", - ) - } - } - private fun handleOnVerifiedOrganizationDomainSsoDetailsReceive( action: EnterpriseSignOnAction.Internal.OnVerifiedOrganizationDomainSsoDetailsReceive, ) { @@ -306,53 +289,6 @@ class EnterpriseSignOnViewModel @Inject constructor( prevalidateSso() } - private fun handleOnOrganizationDomainSsoDetailsReceive( - action: EnterpriseSignOnAction.Internal.OnOrganizationDomainSsoDetailsReceive, - ) { - when (val orgDetails = action.organizationDomainSsoDetailsResult) { - is OrganizationDomainSsoDetailsResult.Failure -> { - handleOnOrganizationDomainSsoDetailsFailure() - } - - is OrganizationDomainSsoDetailsResult.Success -> { - handleOnOrganizationDomainSsoDetailsSuccess(orgDetails) - } - } - } - - private fun handleOnOrganizationDomainSsoDetailsSuccess( - orgDetails: OrganizationDomainSsoDetailsResult.Success, - ) { - if (!orgDetails.isSsoAvailable || orgDetails.verifiedDate == null) { - mutableStateFlow.update { - it.copy( - dialogState = null, - orgIdentifierInput = authRepository.rememberedOrgIdentifier ?: "", - ) - } - return - } - - if (orgDetails.organizationIdentifier.isBlank()) { - mutableStateFlow.update { - it.copy( - dialogState = EnterpriseSignOnState.DialogState.Error( - title = R.string.an_error_has_occurred.asText(), - message = R.string.organization_sso_identifier_required.asText(), - ), - orgIdentifierInput = authRepository.rememberedOrgIdentifier.orEmpty(), - ) - } - return - } - - mutableStateFlow.update { it.copy(orgIdentifierInput = orgDetails.organizationIdentifier) } - - // If the email address is associated with a claimed organization we can proceed to the - // prevalidation step. - prevalidateSso() - } - private fun handleOrgIdentifierInputChanged( action: EnterpriseSignOnAction.OrgIdentifierInputChange, ) { @@ -474,23 +410,14 @@ class EnterpriseSignOnViewModel @Inject constructor( ) } viewModelScope.launch { - if (featureFlagManager.getFeatureFlag(key = FlagKey.VerifiedSsoDomainEndpoint)) { - val result = authRepository.getVerifiedOrganizationDomainSsoDetails( - email = savedStateHandle.toEnterpriseSignOnArgs().emailAddress, - ) - sendAction( - EnterpriseSignOnAction.Internal.OnVerifiedOrganizationDomainSsoDetailsReceive( - result, - ), - ) - } else { - val result = authRepository.getOrganizationDomainSsoDetails( - email = savedStateHandle.toEnterpriseSignOnArgs().emailAddress, - ) - sendAction( - EnterpriseSignOnAction.Internal.OnOrganizationDomainSsoDetailsReceive(result), - ) - } + val result = authRepository.getVerifiedOrganizationDomainSsoDetails( + email = savedStateHandle.toEnterpriseSignOnArgs().emailAddress, + ) + sendAction( + EnterpriseSignOnAction.Internal.OnVerifiedOrganizationDomainSsoDetailsReceive( + result, + ), + ) } } @@ -713,13 +640,6 @@ sealed class EnterpriseSignOnAction { val error: Throwable?, ) : Internal() - /** - * A result was received when requesting an [OrganizationDomainSsoDetailsResult]. - */ - data class OnOrganizationDomainSsoDetailsReceive( - val organizationDomainSsoDetailsResult: OrganizationDomainSsoDetailsResult, - ) : Internal() - /** * A captcha callback result has been received */ 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 016c40c5db..fb0bc9125d 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 @@ -29,11 +29,12 @@ import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.bitwarden.ui.platform.base.util.EventsEffect import com.bitwarden.ui.platform.base.util.standardHorizontalMargin +import com.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar 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.BuildConfig import com.x8bit.bitwarden.R -import com.x8bit.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar import com.x8bit.bitwarden.ui.platform.components.button.BitwardenFilledButton import com.x8bit.bitwarden.ui.platform.components.button.BitwardenOutlinedButton import com.x8bit.bitwarden.ui.platform.components.button.BitwardenTextButton @@ -189,7 +190,7 @@ fun EnvironmentScreen( BitwardenTopAppBar( title = stringResource(id = R.string.settings), scrollBehavior = scrollBehavior, - navigationIcon = rememberVectorPainter(id = R.drawable.ic_close), + navigationIcon = rememberVectorPainter(id = BitwardenDrawable.ic_close), navigationIconContentDescription = stringResource(id = R.string.close), onNavigationIconClick = remember(viewModel) { { viewModel.trySendAction(EnvironmentAction.CloseClick) } 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 d6d0f783d7..8d0403c6dc 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 @@ -22,11 +22,12 @@ import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import com.bitwarden.ui.platform.base.util.EventsEffect import com.bitwarden.ui.platform.base.util.standardHorizontalMargin +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.theme.BitwardenTheme import com.x8bit.bitwarden.R -import com.x8bit.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar -import com.x8bit.bitwarden.ui.platform.components.appbar.NavigationIcon import com.x8bit.bitwarden.ui.platform.components.button.BitwardenFilledButton import com.x8bit.bitwarden.ui.platform.components.button.BitwardenOutlinedButton import com.x8bit.bitwarden.ui.platform.components.scaffold.BitwardenScaffold @@ -65,7 +66,7 @@ fun ExpiredRegistrationLinkScreen( title = stringResource(id = R.string.create_account), scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(), navigationIcon = NavigationIcon( - navigationIcon = rememberVectorPainter(id = R.drawable.ic_close), + navigationIcon = rememberVectorPainter(id = BitwardenDrawable.ic_close), navigationIconContentDescription = stringResource(id = R.string.close), onNavigationIconClick = sendCloseClicked, ), 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 d29c8560d6..51a795dcb0 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 @@ -38,13 +38,13 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.bitwarden.data.repository.model.Environment import com.bitwarden.ui.platform.base.util.EventsEffect import com.bitwarden.ui.platform.base.util.standardHorizontalMargin +import com.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar import com.bitwarden.ui.platform.components.model.CardStyle import com.bitwarden.ui.platform.components.util.rememberVectorPainter 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.appbar.BitwardenTopAppBar import com.x8bit.bitwarden.ui.platform.components.button.BitwardenFilledButton import com.x8bit.bitwarden.ui.platform.components.button.BitwardenTextButton import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenBasicDialog 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 7f7c866b13..f5c2958ff9 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 @@ -34,15 +34,16 @@ import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.bitwarden.ui.platform.base.util.EventsEffect import com.bitwarden.ui.platform.base.util.standardHorizontalMargin +import com.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar +import com.bitwarden.ui.platform.components.appbar.action.BitwardenOverflowActionItem +import com.bitwarden.ui.platform.components.appbar.model.OverflowMenuItemData 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.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.appbar.BitwardenTopAppBar -import com.x8bit.bitwarden.ui.platform.components.appbar.action.BitwardenOverflowActionItem -import com.x8bit.bitwarden.ui.platform.components.appbar.action.OverflowMenuItemData import com.x8bit.bitwarden.ui.platform.components.button.BitwardenFilledButton import com.x8bit.bitwarden.ui.platform.components.button.BitwardenOutlinedButton import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenBasicDialog @@ -124,7 +125,7 @@ fun LoginScreen( BitwardenTopAppBar( title = stringResource(id = R.string.app_name), scrollBehavior = scrollBehavior, - navigationIcon = rememberVectorPainter(id = R.drawable.ic_close), + navigationIcon = rememberVectorPainter(id = BitwardenDrawable.ic_close), navigationIconContentDescription = stringResource(id = R.string.close), onNavigationIconClick = remember(viewModel) { { viewModel.trySendAction(LoginAction.CloseButtonClick) } @@ -136,6 +137,7 @@ fun LoginScreen( ) } BitwardenOverflowActionItem( + contentDescription = stringResource(R.string.more), menuItemDataList = persistentListOf( OverflowMenuItemData( text = stringResource(id = R.string.get_password_hint), 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 28b1122a06..98bbb56a9b 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 @@ -32,10 +32,11 @@ import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle 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.theme.BitwardenTheme import com.x8bit.bitwarden.R -import com.x8bit.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar 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 @@ -93,7 +94,7 @@ fun LoginWithDeviceScreen( BitwardenTopAppBar( title = state.toolbarTitle(), scrollBehavior = scrollBehavior, - navigationIcon = rememberVectorPainter(id = R.drawable.ic_close), + navigationIcon = rememberVectorPainter(id = BitwardenDrawable.ic_close), navigationIconContentDescription = stringResource(id = R.string.close), onNavigationIconClick = remember(viewModel) { { viewModel.trySendAction(LoginWithDeviceAction.CloseButtonClick) } 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 c47717e44f..6ae4630fcd 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 @@ -28,11 +28,11 @@ import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.bitwarden.ui.platform.base.util.EventsEffect import com.bitwarden.ui.platform.base.util.standardHorizontalMargin +import com.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar import com.bitwarden.ui.platform.components.model.CardStyle import com.bitwarden.ui.platform.components.util.rememberVectorPainter import com.bitwarden.ui.platform.theme.BitwardenTheme import com.x8bit.bitwarden.R -import com.x8bit.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar import com.x8bit.bitwarden.ui.platform.components.button.BitwardenFilledButton import com.x8bit.bitwarden.ui.platform.components.button.BitwardenTextButton import com.x8bit.bitwarden.ui.platform.components.field.BitwardenTextField 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 ecb036f5ea..625a238290 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 @@ -23,12 +23,14 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import com.bitwarden.ui.platform.base.util.EventsEffect +import com.bitwarden.ui.platform.base.util.annotatedStringResource import com.bitwarden.ui.platform.base.util.standardHorizontalMargin import com.bitwarden.ui.platform.base.util.toAnnotatedString +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.theme.BitwardenTheme import com.x8bit.bitwarden.R -import com.x8bit.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar 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.model.ContentBlockData @@ -63,7 +65,7 @@ fun MasterPasswordGuidanceScreen( BitwardenTopAppBar( title = stringResource(id = R.string.master_password), scrollBehavior = scrollBehavior, - navigationIcon = rememberVectorPainter(id = R.drawable.ic_close), + navigationIcon = rememberVectorPainter(id = BitwardenDrawable.ic_close), navigationIconContentDescription = stringResource(id = R.string.close), onNavigationIconClick = remember(viewModel) { { @@ -137,20 +139,24 @@ private fun MasterPasswordGuidanceContentBlocks(modifier: Modifier = Modifier) { ContentBlockData( headerText = stringResource(R.string.choose_three_or_four_random_words) .toAnnotatedString(), - subtitleText = R.string.pick_three_or_four_random_unrelated_words.toAnnotatedString(), + subtitleText = annotatedStringResource( + id = R.string.pick_three_or_four_random_unrelated_words, + ), iconVectorResource = R.drawable.ic_number1, ), ContentBlockData( headerText = stringResource(R.string.combine_those_words_together) .toAnnotatedString(), - subtitleText = R.string.put_the_words_together_in_any_order_to_form_your_passphrase - .toAnnotatedString(), + subtitleText = annotatedStringResource( + id = R.string.put_the_words_together_in_any_order_to_form_your_passphrase, + ), iconVectorResource = R.drawable.ic_number2, ), ContentBlockData( headerText = stringResource(R.string.make_it_yours).toAnnotatedString(), - subtitleText = R.string.add_a_number_or_symbol_to_make_it_even_stronger - .toAnnotatedString(), + subtitleText = annotatedStringResource( + id = R.string.add_a_number_or_symbol_to_make_it_even_stronger, + ), iconVectorResource = R.drawable.ic_number3, ), ), 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 0c626c956e..05c0c8f4d5 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 @@ -22,10 +22,11 @@ import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.bitwarden.ui.platform.base.util.EventsEffect import com.bitwarden.ui.platform.base.util.standardHorizontalMargin +import com.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar 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.x8bit.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar import com.x8bit.bitwarden.ui.platform.components.button.BitwardenTextButton import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenBasicDialog import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenLoadingDialog @@ -90,7 +91,7 @@ fun MasterPasswordHintScreen( BitwardenTopAppBar( title = stringResource(id = R.string.password_hint), scrollBehavior = scrollBehavior, - navigationIcon = rememberVectorPainter(id = R.drawable.ic_close), + navigationIcon = rememberVectorPainter(id = BitwardenDrawable.ic_close), navigationIconContentDescription = stringResource(id = R.string.close), onNavigationIconClick = remember(viewModel) { { viewModel.trySendAction(MasterPasswordHintAction.CloseClick) } 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 64af1f6e19..529158b3f2 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 @@ -24,10 +24,11 @@ import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import com.bitwarden.ui.platform.base.util.EventsEffect import com.bitwarden.ui.platform.base.util.standardHorizontalMargin +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.theme.BitwardenTheme import com.x8bit.bitwarden.R -import com.x8bit.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar import com.x8bit.bitwarden.ui.platform.components.card.BitwardenContentCard import com.x8bit.bitwarden.ui.platform.components.model.ContentBlockData import com.x8bit.bitwarden.ui.platform.components.scaffold.BitwardenScaffold @@ -58,7 +59,7 @@ fun PreventAccountLockoutScreen( BitwardenTopAppBar( title = stringResource(R.string.prevent_account_lockout), scrollBehavior = scrollBehavior, - navigationIcon = rememberVectorPainter(id = R.drawable.ic_close), + navigationIcon = rememberVectorPainter(id = BitwardenDrawable.ic_close), navigationIconContentDescription = stringResource(id = R.string.close), onNavigationIconClick = remember(viewModel) { { 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 c35af540e3..cf3b99969e 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 @@ -24,11 +24,11 @@ import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.bitwarden.ui.platform.base.util.standardHorizontalMargin +import com.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar import com.bitwarden.ui.platform.components.model.CardStyle 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.appbar.BitwardenTopAppBar import com.x8bit.bitwarden.ui.platform.components.button.BitwardenFilledButton import com.x8bit.bitwarden.ui.platform.components.button.BitwardenOutlinedButton import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenBasicDialog 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 c1866c3039..5b79b7657c 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 @@ -30,15 +30,15 @@ import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.bitwarden.ui.platform.base.util.EventsEffect import com.bitwarden.ui.platform.base.util.standardHorizontalMargin +import com.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar +import com.bitwarden.ui.platform.components.appbar.action.BitwardenOverflowActionItem +import com.bitwarden.ui.platform.components.appbar.model.OverflowMenuItemData 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.auth.datasource.disk.model.ForcePasswordResetReason import com.x8bit.bitwarden.ui.auth.feature.completeregistration.PasswordStrengthIndicator import com.x8bit.bitwarden.ui.auth.feature.completeregistration.PasswordStrengthState -import com.x8bit.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar -import com.x8bit.bitwarden.ui.platform.components.appbar.action.BitwardenOverflowActionItem -import com.x8bit.bitwarden.ui.platform.components.appbar.action.OverflowMenuItemData import com.x8bit.bitwarden.ui.platform.components.button.BitwardenTextButton import com.x8bit.bitwarden.ui.platform.components.card.BitwardenInfoCalloutCard import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenBasicDialog @@ -126,6 +126,7 @@ fun ResetPasswordScreen( modifier = Modifier.testTag("SaveButton"), ) BitwardenOverflowActionItem( + contentDescription = stringResource(R.string.more), menuItemDataList = persistentListOf( OverflowMenuItemData( text = stringResource(R.string.log_out), 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 019c5969a8..330b666b08 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 @@ -26,10 +26,10 @@ import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.bitwarden.ui.platform.base.util.standardHorizontalMargin +import com.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar 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.appbar.BitwardenTopAppBar import com.x8bit.bitwarden.ui.platform.components.button.BitwardenTextButton import com.x8bit.bitwarden.ui.platform.components.card.BitwardenInfoCalloutCard import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenBasicDialog 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 4fa5675529..8503c86fe6 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 @@ -32,7 +32,6 @@ import androidx.compose.ui.semantics.CustomAccessibilityAction import androidx.compose.ui.semantics.customActions import androidx.compose.ui.semantics.semantics import androidx.compose.ui.semantics.testTag -import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview @@ -43,10 +42,12 @@ import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.bitwarden.data.repository.model.Environment import com.bitwarden.ui.platform.base.util.EventsEffect +import com.bitwarden.ui.platform.base.util.annotatedStringResource import com.bitwarden.ui.platform.base.util.standardHorizontalMargin -import com.bitwarden.ui.platform.base.util.toAnnotatedString +import com.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar 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.theme.BitwardenTheme import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.auth.feature.startregistration.StartRegistrationAction.ErrorDialogDismiss @@ -54,7 +55,6 @@ import com.x8bit.bitwarden.ui.auth.feature.startregistration.StartRegistrationEv import com.x8bit.bitwarden.ui.auth.feature.startregistration.StartRegistrationEvent.NavigateToTerms import com.x8bit.bitwarden.ui.auth.feature.startregistration.handlers.StartRegistrationHandler import com.x8bit.bitwarden.ui.auth.feature.startregistration.handlers.rememberStartRegistrationHandler -import com.x8bit.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar import com.x8bit.bitwarden.ui.platform.components.button.BitwardenFilledButton import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenBasicDialog import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenLoadingDialog @@ -156,7 +156,7 @@ fun StartRegistrationScreen( BitwardenTopAppBar( title = stringResource(id = R.string.create_account), scrollBehavior = scrollBehavior, - navigationIcon = rememberVectorPainter(id = R.drawable.ic_close), + navigationIcon = rememberVectorPainter(id = BitwardenDrawable.ic_close), navigationIconContentDescription = stringResource(id = R.string.close), onNavigationIconClick = handler.onCloseClick, ) @@ -168,7 +168,6 @@ fun StartRegistrationScreen( nameInput = state.nameInput, isReceiveMarketingEmailsToggled = state.isReceiveMarketingEmailsToggled, isContinueButtonEnabled = state.isContinueButtonEnabled, - isNewOnboardingUiEnabled = state.showNewOnboardingUi, handler = handler, ) } @@ -183,7 +182,6 @@ private fun StartRegistrationContent( isReceiveMarketingEmailsToggled: Boolean, isContinueButtonEnabled: Boolean, handler: StartRegistrationHandler, - isNewOnboardingUiEnabled: Boolean, modifier: Modifier = Modifier, ) { Column( @@ -194,18 +192,17 @@ private fun StartRegistrationContent( ) { Spacer(modifier = Modifier.height(height = 12.dp)) - if (isNewOnboardingUiEnabled) { - Spacer(modifier = Modifier.weight(1f)) - Image( - painter = rememberVectorPainter(id = R.drawable.bitwarden_logo), - colorFilter = ColorFilter.tint(BitwardenTheme.colorScheme.icon.secondary), - contentDescription = null, - modifier = Modifier - .standardHorizontalMargin() - .fillMaxWidth(), - ) - Spacer(modifier = Modifier.weight(1f)) - } + Spacer(modifier = Modifier.weight(1f)) + Image( + painter = rememberVectorPainter(id = R.drawable.bitwarden_logo), + colorFilter = ColorFilter.tint(BitwardenTheme.colorScheme.icon.secondary), + contentDescription = null, + modifier = Modifier + .standardHorizontalMargin() + .fillMaxWidth(), + ) + Spacer(modifier = Modifier.weight(1f)) + Spacer(modifier = Modifier.height(12.dp)) BitwardenTextField( @@ -222,7 +219,6 @@ private fun StartRegistrationContent( selectedOption = selectedEnvironmentType, onOptionSelected = handler.onEnvironmentTypeSelect, onHelpClick = handler.onServerGeologyHelpClick, - isHelpEnabled = isNewOnboardingUiEnabled, modifier = Modifier .fillMaxWidth() .testTag(tag = "RegionSelectorDropdown"), @@ -293,13 +289,6 @@ private fun TermsAndPrivacyText( ) { val strTerms = stringResource(id = R.string.terms_of_service) val strPrivacy = stringResource(id = R.string.privacy_policy) - val annotatedLinkString: AnnotatedString = - R.string.by_continuing_you_agree_to_the_terms_of_service_and_privacy_policy.toAnnotatedString { - when (it) { - "termsOfService" -> onTermsClick() - "privacyPolicy" -> onPrivacyPolicyClick() - } - } Row( horizontalArrangement = Arrangement.Start, verticalAlignment = Alignment.CenterVertically, @@ -327,7 +316,15 @@ private fun TermsAndPrivacyText( .fillMaxWidth(), ) { Text( - text = annotatedLinkString, + text = annotatedStringResource( + id = R.string.by_continuing_you_agree_to_the_terms_of_service_and_privacy_policy, + onAnnotationClick = { + when (it) { + "termsOfService" -> onTermsClick() + "privacyPolicy" -> onPrivacyPolicyClick() + } + }, + ), style = BitwardenTheme.typography.bodyMedium.copy( textAlign = TextAlign.Center, ), @@ -356,14 +353,14 @@ private fun ReceiveMarketingEmailsSwitch( }, ), ) - }, - label = R.string.get_emails_from_bitwarden_for_announcements_advices_and_research_opportunities_unsubscribe_any_time - .toAnnotatedString { - onUnsubscribeClick() - }, + } + .testTag(tag = "ReceiveMarketingEmailsToggle"), + label = annotatedStringResource( + id = R.string.get_emails_from_bitwarden_for_announcements_advices_and_research_opportunities_unsubscribe_any_time, + onAnnotationClick = { onUnsubscribeClick() }, + ), isChecked = isChecked, onCheckedChange = onCheckedChange, - contentDescription = "ReceiveMarketingEmailsToggle", cardStyle = CardStyle.Full, ) } @@ -378,7 +375,6 @@ private fun StartRegistrationContentFilledOut_preview() { nameInput = "Test User", isReceiveMarketingEmailsToggled = true, isContinueButtonEnabled = true, - isNewOnboardingUiEnabled = false, handler = StartRegistrationHandler( onEmailInputChange = {}, onNameInputChange = {}, @@ -405,34 +401,6 @@ private fun StartRegistrationContentEmpty_preview() { nameInput = "", isReceiveMarketingEmailsToggled = false, isContinueButtonEnabled = false, - isNewOnboardingUiEnabled = false, - handler = StartRegistrationHandler( - onEmailInputChange = {}, - onNameInputChange = {}, - onEnvironmentTypeSelect = {}, - onContinueClick = {}, - onTermsClick = {}, - onPrivacyPolicyClick = {}, - onReceiveMarketingEmailsToggle = {}, - onUnsubscribeMarketingEmailsClick = {}, - onServerGeologyHelpClick = {}, - onCloseClick = {}, - ), - ) - } -} - -@Preview(showBackground = true) -@Composable -private fun StartRegistrationContentNewOnboardingUi_preview() { - BitwardenTheme { - StartRegistrationContent( - emailInput = "", - selectedEnvironmentType = Environment.Type.US, - nameInput = "", - isReceiveMarketingEmailsToggled = false, - isContinueButtonEnabled = false, - isNewOnboardingUiEnabled = true, handler = StartRegistrationHandler( onEmailInputChange = {}, onNameInputChange = {}, 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 248275afba..0448d5ffd7 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 @@ -13,15 +13,12 @@ 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 -import com.x8bit.bitwarden.data.platform.manager.FeatureFlagManager -import com.x8bit.bitwarden.data.platform.manager.model.FlagKey import com.x8bit.bitwarden.data.platform.repository.EnvironmentRepository import com.x8bit.bitwarden.ui.auth.feature.startregistration.StartRegistrationAction.CloseClick import com.x8bit.bitwarden.ui.auth.feature.startregistration.StartRegistrationAction.ContinueClick import com.x8bit.bitwarden.ui.auth.feature.startregistration.StartRegistrationAction.EmailInputChange import com.x8bit.bitwarden.ui.auth.feature.startregistration.StartRegistrationAction.EnvironmentTypeSelect import com.x8bit.bitwarden.ui.auth.feature.startregistration.StartRegistrationAction.ErrorDialogDismiss -import com.x8bit.bitwarden.ui.auth.feature.startregistration.StartRegistrationAction.Internal.OnboardingFeatureFlagUpdated import com.x8bit.bitwarden.ui.auth.feature.startregistration.StartRegistrationAction.Internal.ReceiveSendVerificationEmailResult import com.x8bit.bitwarden.ui.auth.feature.startregistration.StartRegistrationAction.Internal.UpdatedEnvironmentReceive import com.x8bit.bitwarden.ui.auth.feature.startregistration.StartRegistrationAction.NameInputChange @@ -32,7 +29,6 @@ import com.x8bit.bitwarden.ui.auth.feature.startregistration.StartRegistrationAc import com.x8bit.bitwarden.ui.auth.feature.startregistration.StartRegistrationAction.UnsubscribeMarketingEmailsClick import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.launchIn -import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch @@ -48,7 +44,6 @@ private const val KEY_STATE = "state" @HiltViewModel class StartRegistrationViewModel @Inject constructor( savedStateHandle: SavedStateHandle, - featureFlagManager: FeatureFlagManager, private val authRepository: AuthRepository, private val environmentRepository: EnvironmentRepository, ) : BaseViewModel( @@ -60,7 +55,6 @@ class StartRegistrationViewModel @Inject constructor( isContinueButtonEnabled = false, selectedEnvironmentType = environmentRepository.environment.type, dialog = null, - showNewOnboardingUi = featureFlagManager.getFeatureFlag(FlagKey.OnboardingFlow), ), ) { @@ -79,14 +73,6 @@ class StartRegistrationViewModel @Inject constructor( ) } .launchIn(viewModelScope) - // Listen for changes on the onboarding feature flag. - featureFlagManager - .getFeatureFlagFlow(FlagKey.OnboardingFlow) - .map { - OnboardingFeatureFlagUpdated(it) - } - .onEach(::sendAction) - .launchIn(viewModelScope) } override fun handleAction(action: StartRegistrationAction) { @@ -113,13 +99,6 @@ class StartRegistrationViewModel @Inject constructor( } ServerGeologyHelpClick -> handleServerGeologyHelpClick() - is OnboardingFeatureFlagUpdated -> handleOnboardingFeatureFlagUpdated(action) - } - } - - private fun handleOnboardingFeatureFlagUpdated(action: OnboardingFeatureFlagUpdated) { - mutableStateFlow.update { - it.copy(showNewOnboardingUi = action.newValue) } } @@ -294,7 +273,6 @@ data class StartRegistrationState( val isContinueButtonEnabled: Boolean, val selectedEnvironmentType: Type, val dialog: StartRegistrationDialog?, - val showNewOnboardingUi: Boolean, ) : Parcelable /** @@ -452,10 +430,5 @@ sealed class StartRegistrationAction { data class UpdatedEnvironmentReceive( val environment: Environment, ) : Internal() - - /** - * Indicates updated value for onboarding feature flag. - */ - data class OnboardingFeatureFlagUpdated(val newValue: Boolean) : Internal() } } 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 bfce010b3e..7da39c6a8e 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 @@ -30,13 +30,14 @@ import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.bitwarden.ui.platform.base.util.EventsEffect import com.bitwarden.ui.platform.base.util.standardHorizontalMargin +import com.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar +import com.bitwarden.ui.platform.components.appbar.NavigationIcon 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.theme.BitwardenTheme import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.auth.feature.trusteddevice.handlers.TrustedDeviceHandlers -import com.x8bit.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar -import com.x8bit.bitwarden.ui.platform.components.appbar.NavigationIcon import com.x8bit.bitwarden.ui.platform.components.button.BitwardenFilledButton import com.x8bit.bitwarden.ui.platform.components.button.BitwardenOutlinedButton import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenBasicDialog @@ -109,7 +110,7 @@ private fun TrustedDeviceScaffold( title = stringResource(id = R.string.log_in_initiated), scrollBehavior = scrollBehavior, navigationIcon = NavigationIcon( - navigationIcon = rememberVectorPainter(id = R.drawable.ic_close), + navigationIcon = rememberVectorPainter(id = BitwardenDrawable.ic_close), navigationIconContentDescription = stringResource(id = R.string.close), onNavigationIconClick = handlers.onBackClick, ), 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 83888246c7..d734dabb2e 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 @@ -41,16 +41,17 @@ import com.bitwarden.network.model.TwoFactorAuthMethod import com.bitwarden.ui.platform.base.util.EventsEffect import com.bitwarden.ui.platform.base.util.LifecycleEventEffect import com.bitwarden.ui.platform.base.util.standardHorizontalMargin +import com.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar +import com.bitwarden.ui.platform.components.appbar.action.BitwardenOverflowActionItem +import com.bitwarden.ui.platform.components.appbar.model.OverflowMenuItemData 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.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.appbar.BitwardenTopAppBar -import com.x8bit.bitwarden.ui.platform.components.appbar.action.BitwardenOverflowActionItem -import com.x8bit.bitwarden.ui.platform.components.appbar.action.OverflowMenuItemData import com.x8bit.bitwarden.ui.platform.components.button.BitwardenFilledButton import com.x8bit.bitwarden.ui.platform.components.button.BitwardenOutlinedButton import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenBasicDialog @@ -142,7 +143,7 @@ fun TwoFactorLoginScreen( BitwardenTopAppBar( title = title(), scrollBehavior = scrollBehavior, - navigationIcon = rememberVectorPainter(id = R.drawable.ic_close), + navigationIcon = rememberVectorPainter(id = BitwardenDrawable.ic_close), navigationIconContentDescription = stringResource(id = R.string.close), onNavigationIconClick = remember(viewModel) { { viewModel.trySendAction(TwoFactorLoginAction.CloseButtonClick) } @@ -150,6 +151,7 @@ fun TwoFactorLoginScreen( actions = { if (!state.isNewDeviceVerification) { BitwardenOverflowActionItem( + contentDescription = stringResource(R.string.more), menuItemDataList = state.availableAuthMethods .map { OverflowMenuItemData( 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 0a108fba75..0fd89d9a8f 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 @@ -38,6 +38,9 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.bitwarden.ui.platform.base.util.EventsEffect import com.bitwarden.ui.platform.base.util.cardStyle import com.bitwarden.ui.platform.base.util.standardHorizontalMargin +import com.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar +import com.bitwarden.ui.platform.components.appbar.action.BitwardenOverflowActionItem +import com.bitwarden.ui.platform.components.appbar.model.OverflowMenuItemData import com.bitwarden.ui.platform.components.model.CardStyle import com.bitwarden.ui.platform.theme.BitwardenTheme import com.x8bit.bitwarden.R @@ -52,9 +55,6 @@ import com.x8bit.bitwarden.ui.credentials.manager.model.AssertFido2CredentialRes import com.x8bit.bitwarden.ui.credentials.manager.model.GetCredentialsResult 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.appbar.BitwardenTopAppBar -import com.x8bit.bitwarden.ui.platform.components.appbar.action.BitwardenOverflowActionItem -import com.x8bit.bitwarden.ui.platform.components.appbar.action.OverflowMenuItemData import com.x8bit.bitwarden.ui.platform.components.button.BitwardenFilledButton import com.x8bit.bitwarden.ui.platform.components.button.BitwardenOutlinedButton import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenBasicDialog @@ -224,6 +224,7 @@ fun VaultUnlockScreen( ) } BitwardenOverflowActionItem( + contentDescription = stringResource(R.string.more), menuItemDataList = persistentListOf( OverflowMenuItemData( text = stringResource(id = R.string.log_out), 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 989ad6a91e..7dd04c2ca6 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 @@ -16,10 +16,10 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.bitwarden.ui.platform.base.util.toSafeOverlayColor 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.theme.BitwardenTheme import com.x8bit.bitwarden.R -import com.x8bit.bitwarden.ui.platform.components.button.color.bitwardenStandardIconButtonColors /** * Displays an icon representing a Bitwarden account with the user's initials superimposed. 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 9951e53dde..6057de5ecb 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 @@ -8,11 +8,11 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.semantics.semantics import androidx.compose.ui.semantics.testTag import androidx.compose.ui.tooling.preview.Preview +import com.bitwarden.ui.platform.components.button.color.bitwardenStandardIconButtonColors import com.bitwarden.ui.platform.components.util.rememberVectorPainter import com.bitwarden.ui.platform.feature.settings.appearance.model.AppTheme import com.bitwarden.ui.platform.theme.BitwardenTheme import com.x8bit.bitwarden.R -import com.x8bit.bitwarden.ui.platform.components.button.color.bitwardenStandardIconButtonColors /** * A placeholder item to be used to represent an account. 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 4583deb4a7..7457a7584d 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 @@ -14,11 +14,12 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.input.nestedscroll.nestedScroll import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp +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.theme.BitwardenTheme import com.x8bit.bitwarden.R -import com.x8bit.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar -import com.x8bit.bitwarden.ui.platform.components.appbar.NavigationIcon import com.x8bit.bitwarden.ui.platform.components.scaffold.BitwardenScaffold import kotlinx.coroutines.launch @@ -67,7 +68,7 @@ fun BitwardenModalBottomSheet( BitwardenTopAppBar( title = sheetTitle, navigationIcon = NavigationIcon( - navigationIcon = rememberVectorPainter(R.drawable.ic_close), + navigationIcon = rememberVectorPainter(BitwardenDrawable.ic_close), onNavigationIconClick = animatedOnDismiss, navigationIconContentDescription = stringResource(R.string.close), ), diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/button/BitwardenFilledButton.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/button/BitwardenFilledButton.kt index 18bbb1d3ff..3e607356c0 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/button/BitwardenFilledButton.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/button/BitwardenFilledButton.kt @@ -17,8 +17,8 @@ import androidx.compose.ui.unit.dp import com.bitwarden.ui.platform.base.util.cardStyle 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.theme.BitwardenTheme -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.platform.components.button.color.bitwardenFilledButtonColors /** @@ -85,7 +85,7 @@ private fun BitwardenFilledButton_preview() { BitwardenFilledButton( label = "Label", onClick = {}, - icon = rememberVectorPainter(id = R.drawable.ic_question_circle), + icon = rememberVectorPainter(id = BitwardenDrawable.ic_question_circle), isEnabled = true, ) BitwardenFilledButton( @@ -97,7 +97,7 @@ private fun BitwardenFilledButton_preview() { BitwardenFilledButton( label = "Label", onClick = {}, - icon = rememberVectorPainter(id = R.drawable.ic_question_circle), + icon = rememberVectorPainter(id = BitwardenDrawable.ic_question_circle), isEnabled = false, ) } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/button/BitwardenFilledErrorButton.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/button/BitwardenFilledErrorButton.kt index d3f06efc67..95153cd290 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/button/BitwardenFilledErrorButton.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/button/BitwardenFilledErrorButton.kt @@ -7,7 +7,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.painter.Painter import androidx.compose.ui.tooling.preview.Preview import com.bitwarden.ui.platform.components.util.rememberVectorPainter -import com.x8bit.bitwarden.R +import com.bitwarden.ui.platform.resource.BitwardenDrawable import com.x8bit.bitwarden.ui.platform.components.button.color.bitwardenFilledErrorButtonColors /** @@ -50,7 +50,7 @@ private fun BitwardenErrorButton_preview() { BitwardenFilledErrorButton( label = "Label", onClick = {}, - icon = rememberVectorPainter(id = R.drawable.ic_question_circle), + icon = rememberVectorPainter(id = BitwardenDrawable.ic_question_circle), isEnabled = true, ) BitwardenFilledErrorButton( @@ -62,7 +62,7 @@ private fun BitwardenErrorButton_preview() { BitwardenFilledErrorButton( label = "Label", onClick = {}, - icon = rememberVectorPainter(id = R.drawable.ic_question_circle), + icon = rememberVectorPainter(id = BitwardenDrawable.ic_question_circle), isEnabled = false, ) } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/button/BitwardenOutlinedButton.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/button/BitwardenOutlinedButton.kt index fa8f37b00c..226b495d41 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/button/BitwardenOutlinedButton.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/button/BitwardenOutlinedButton.kt @@ -20,8 +20,8 @@ import androidx.compose.ui.unit.dp import com.bitwarden.ui.platform.base.util.cardStyle 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.theme.BitwardenTheme -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.platform.components.button.color.bitwardenOutlinedButtonColors /** @@ -107,7 +107,7 @@ private fun BitwardenOutlinedButton_preview() { BitwardenOutlinedButton( label = "Label", onClick = {}, - icon = rememberVectorPainter(id = R.drawable.ic_question_circle), + icon = rememberVectorPainter(id = BitwardenDrawable.ic_question_circle), isEnabled = true, ) BitwardenOutlinedButton( @@ -119,7 +119,7 @@ private fun BitwardenOutlinedButton_preview() { BitwardenOutlinedButton( label = "Label", onClick = {}, - icon = rememberVectorPainter(id = R.drawable.ic_question_circle), + icon = rememberVectorPainter(id = BitwardenDrawable.ic_question_circle), isEnabled = false, ) } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/button/BitwardenOutlinedErrorButton.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/button/BitwardenOutlinedErrorButton.kt index 80f51e954f..688bb055cd 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/button/BitwardenOutlinedErrorButton.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/button/BitwardenOutlinedErrorButton.kt @@ -7,8 +7,8 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.painter.Painter import androidx.compose.ui.tooling.preview.Preview import com.bitwarden.ui.platform.components.util.rememberVectorPainter +import com.bitwarden.ui.platform.resource.BitwardenDrawable import com.bitwarden.ui.platform.theme.BitwardenTheme -import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.platform.components.button.color.bitwardenOutlinedButtonColors /** @@ -55,7 +55,7 @@ private fun BBitwardenOutlinedErrorButton_preview() { BitwardenOutlinedErrorButton( label = "Label", onClick = {}, - icon = rememberVectorPainter(id = R.drawable.ic_question_circle), + icon = rememberVectorPainter(id = BitwardenDrawable.ic_question_circle), isEnabled = true, ) BitwardenOutlinedErrorButton( @@ -67,7 +67,7 @@ private fun BBitwardenOutlinedErrorButton_preview() { BitwardenOutlinedErrorButton( label = "Label", onClick = {}, - icon = rememberVectorPainter(id = R.drawable.ic_question_circle), + icon = rememberVectorPainter(id = BitwardenDrawable.ic_question_circle), isEnabled = false, ) } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/button/BitwardenTextSelectionButton.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/button/BitwardenTextSelectionButton.kt index c82729be89..a77c122f3e 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/button/BitwardenTextSelectionButton.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/button/BitwardenTextSelectionButton.kt @@ -29,12 +29,13 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.bitwarden.ui.platform.base.util.cardStyle import com.bitwarden.ui.platform.base.util.nullableTestTag +import com.bitwarden.ui.platform.components.button.BitwardenStandardIconButton +import com.bitwarden.ui.platform.components.field.color.bitwardenTextFieldButtonColors import com.bitwarden.ui.platform.components.model.CardStyle import com.bitwarden.ui.platform.components.util.rememberVectorPainter import com.bitwarden.ui.platform.theme.BitwardenTheme import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.platform.components.divider.BitwardenHorizontalDivider -import com.x8bit.bitwarden.ui.platform.components.field.color.bitwardenTextFieldButtonColors import com.x8bit.bitwarden.ui.platform.components.model.TooltipData import com.x8bit.bitwarden.ui.platform.components.row.BitwardenRowOfActions import com.x8bit.bitwarden.ui.platform.util.persistentListOfNotNull 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 862db16ea6..9e17d6fffc 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 @@ -19,12 +19,13 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import com.bitwarden.ui.platform.components.badge.NotificationBadge +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.theme.BitwardenTheme import com.x8bit.bitwarden.R -import com.x8bit.bitwarden.ui.platform.components.badge.NotificationBadge import com.x8bit.bitwarden.ui.platform.components.button.BitwardenFilledButton -import com.x8bit.bitwarden.ui.platform.components.button.BitwardenStandardIconButton import com.x8bit.bitwarden.ui.platform.components.card.color.bitwardenCardColors /** @@ -70,7 +71,7 @@ fun BitwardenActionCard( Spacer(Modifier.weight(1f)) onDismissClick?.let { BitwardenStandardIconButton( - painter = rememberVectorPainter(id = R.drawable.ic_close), + painter = rememberVectorPainter(id = BitwardenDrawable.ic_close), contentDescription = stringResource(id = R.string.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 ef3e03dd4a..18b6858ae8 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 @@ -31,10 +31,10 @@ import androidx.compose.ui.input.pointer.pointerInput import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview 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.theme.BitwardenTheme import com.x8bit.bitwarden.R -import com.x8bit.bitwarden.ui.platform.components.button.BitwardenStandardIconButton import com.x8bit.bitwarden.ui.platform.components.coachmark.model.CoachMarkHighlightShape import com.x8bit.bitwarden.ui.platform.components.text.BitwardenClickableText import kotlinx.coroutines.launch diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenDateSelectButton.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenDateSelectButton.kt index de20a1ec5f..00607837e2 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenDateSelectButton.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenDateSelectButton.kt @@ -30,13 +30,13 @@ import androidx.compose.ui.semantics.testTag import androidx.compose.ui.semantics.testTagsAsResourceId import androidx.compose.ui.unit.dp import com.bitwarden.ui.platform.base.util.cardStyle +import com.bitwarden.ui.platform.components.field.color.bitwardenTextFieldButtonColors +import com.bitwarden.ui.platform.components.field.color.bitwardenTextFieldColors import com.bitwarden.ui.platform.components.model.CardStyle import com.bitwarden.ui.platform.components.util.rememberVectorPainter import com.bitwarden.ui.platform.theme.BitwardenTheme import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.platform.components.button.BitwardenTextButton -import com.x8bit.bitwarden.ui.platform.components.field.color.bitwardenTextFieldButtonColors -import com.x8bit.bitwarden.ui.platform.components.field.color.bitwardenTextFieldColors import com.x8bit.bitwarden.ui.platform.components.row.BitwardenRowOfActions import com.x8bit.bitwarden.ui.platform.util.orNow import com.x8bit.bitwarden.ui.platform.util.toFormattedPattern 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 abaef003ea..867d488b7c 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 @@ -31,9 +31,9 @@ import androidx.compose.ui.semantics.testTagsAsResourceId import androidx.compose.ui.unit.dp import androidx.compose.ui.window.Dialog import androidx.compose.ui.window.DialogProperties +import com.bitwarden.ui.platform.components.button.BitwardenStandardIconButton import com.bitwarden.ui.platform.theme.BitwardenTheme import com.x8bit.bitwarden.R -import com.x8bit.bitwarden.ui.platform.components.button.BitwardenStandardIconButton import com.x8bit.bitwarden.ui.platform.components.button.BitwardenTextButton /** diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenTimeSelectButton.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenTimeSelectButton.kt index 9b7b7997be..0725b10eda 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenTimeSelectButton.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/dialog/BitwardenTimeSelectButton.kt @@ -20,11 +20,11 @@ import androidx.compose.ui.semantics.contentDescription import androidx.compose.ui.semantics.role import androidx.compose.ui.unit.dp import com.bitwarden.ui.platform.base.util.cardStyle +import com.bitwarden.ui.platform.components.field.color.bitwardenTextFieldButtonColors import com.bitwarden.ui.platform.components.model.CardStyle import com.bitwarden.ui.platform.components.util.rememberVectorPainter import com.bitwarden.ui.platform.theme.BitwardenTheme import com.x8bit.bitwarden.R -import com.x8bit.bitwarden.ui.platform.components.field.color.bitwardenTextFieldButtonColors import com.x8bit.bitwarden.ui.platform.components.row.BitwardenRowOfActions import com.x8bit.bitwarden.ui.platform.util.orNow import com.x8bit.bitwarden.ui.platform.util.toFormattedPattern 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 b7163998ed..55be8f8844 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 @@ -21,10 +21,10 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp 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.theme.BitwardenTheme import com.x8bit.bitwarden.R -import com.x8bit.bitwarden.ui.platform.components.button.BitwardenStandardIconButton 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 diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/field/BitwardenHiddenPasswordField.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/field/BitwardenHiddenPasswordField.kt index 038e5c83ad..201871fe60 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/field/BitwardenHiddenPasswordField.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/field/BitwardenHiddenPasswordField.kt @@ -13,9 +13,9 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.bitwarden.ui.platform.base.util.cardStyle import com.bitwarden.ui.platform.base.util.nullableTestTag +import com.bitwarden.ui.platform.components.field.color.bitwardenTextFieldColors import com.bitwarden.ui.platform.components.model.CardStyle import com.bitwarden.ui.platform.theme.BitwardenTheme -import com.x8bit.bitwarden.ui.platform.components.field.color.bitwardenTextFieldColors import com.x8bit.bitwarden.ui.platform.components.field.toolbar.BitwardenEmptyTextToolbar /** 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 3f4ef5f9cb..12260d601f 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 @@ -41,12 +41,12 @@ import androidx.compose.ui.unit.dp import com.bitwarden.ui.platform.base.util.cardStyle import com.bitwarden.ui.platform.base.util.nullableTestTag import com.bitwarden.ui.platform.base.util.tabNavigation +import com.bitwarden.ui.platform.components.button.BitwardenStandardIconButton +import com.bitwarden.ui.platform.components.field.color.bitwardenTextFieldColors 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.button.BitwardenStandardIconButton import com.x8bit.bitwarden.ui.platform.components.divider.BitwardenHorizontalDivider -import com.x8bit.bitwarden.ui.platform.components.field.color.bitwardenTextFieldColors 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 diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/field/BitwardenTextField.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/field/BitwardenTextField.kt index 6db1078c3f..993775f6db 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/field/BitwardenTextField.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/field/BitwardenTextField.kt @@ -54,13 +54,13 @@ import com.bitwarden.ui.platform.base.util.cardStyle import com.bitwarden.ui.platform.base.util.nullableTestTag import com.bitwarden.ui.platform.base.util.toPx import com.bitwarden.ui.platform.base.util.withLineBreaksAtWidth +import com.bitwarden.ui.platform.components.appbar.color.bitwardenMenuItemColors +import com.bitwarden.ui.platform.components.button.BitwardenStandardIconButton +import com.bitwarden.ui.platform.components.field.color.bitwardenTextFieldColors 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.appbar.color.bitwardenMenuItemColors -import com.x8bit.bitwarden.ui.platform.components.button.BitwardenStandardIconButton import com.x8bit.bitwarden.ui.platform.components.divider.BitwardenHorizontalDivider -import com.x8bit.bitwarden.ui.platform.components.field.color.bitwardenTextFieldColors 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.icon.BitwardenIcon 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 6fdebe6c57..41f616accc 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 @@ -24,10 +24,10 @@ import androidx.compose.ui.unit.dp import com.bitwarden.ui.platform.base.util.cardStyle import com.bitwarden.ui.platform.base.util.nullableTestTag import com.bitwarden.ui.platform.base.util.orNullIfBlank +import com.bitwarden.ui.platform.components.button.BitwardenStandardIconButton 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.button.BitwardenStandardIconButton 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.icon.BitwardenIcon diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/model/ScaffoldNavigationData.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/model/ScaffoldNavigationData.kt index 6cf3b6c42f..68c9e14b0c 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/model/ScaffoldNavigationData.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/model/ScaffoldNavigationData.kt @@ -1,5 +1,6 @@ package com.x8bit.bitwarden.ui.platform.components.model +import com.bitwarden.ui.platform.components.navigation.model.NavigationItem import kotlinx.collections.immutable.ImmutableList /** diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/row/BitwardenPushRow.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/row/BitwardenPushRow.kt index c1be8c2697..5d5a7ac1d6 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/row/BitwardenPushRow.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/row/BitwardenPushRow.kt @@ -17,11 +17,11 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.bitwarden.ui.platform.base.util.cardStyle import com.bitwarden.ui.platform.base.util.mirrorIfRtl +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.theme.BitwardenTheme import com.x8bit.bitwarden.R -import com.x8bit.bitwarden.ui.platform.components.badge.NotificationBadge import com.x8bit.bitwarden.ui.platform.components.icon.BitwardenIcon import com.x8bit.bitwarden.ui.platform.components.model.IconData diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/row/BitwardenRowOfActions.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/row/BitwardenRowOfActions.kt index ca8875138f..0296b8ec54 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/row/BitwardenRowOfActions.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/row/BitwardenRowOfActions.kt @@ -10,8 +10,8 @@ import androidx.compose.ui.Modifier 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.theme.BitwardenTheme -import com.x8bit.bitwarden.R /** * A composable function to display a row of actions. @@ -41,12 +41,12 @@ private fun BitwardenRowOfIconButtons_preview() { BitwardenTheme { BitwardenRowOfActions { Icon( - painter = rememberVectorPainter(id = R.drawable.ic_question_circle), + painter = rememberVectorPainter(id = BitwardenDrawable.ic_question_circle), contentDescription = "Icon 1", modifier = Modifier.size(24.dp), ) Icon( - painter = rememberVectorPainter(id = R.drawable.ic_question_circle), + painter = rememberVectorPainter(id = BitwardenDrawable.ic_question_circle), contentDescription = "Icon 2", modifier = Modifier.size(24.dp), ) diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/scaffold/BitwardenScaffold.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/scaffold/BitwardenScaffold.kt index c7d57cf63f..3688ab5012 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/scaffold/BitwardenScaffold.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/scaffold/BitwardenScaffold.kt @@ -40,14 +40,14 @@ import androidx.compose.ui.semantics.testTagsAsResourceId import androidx.compose.ui.unit.dp import androidx.compose.ui.zIndex import com.bitwarden.ui.platform.base.util.toDp +import com.bitwarden.ui.platform.components.navigation.BitwardenBottomAppBar +import com.bitwarden.ui.platform.components.navigation.BitwardenNavigationRail import com.bitwarden.ui.platform.model.WindowSize import com.bitwarden.ui.platform.theme.BitwardenTheme import com.bitwarden.ui.platform.util.rememberWindowSize import com.x8bit.bitwarden.ui.platform.components.model.BitwardenPullToRefreshState import com.x8bit.bitwarden.ui.platform.components.model.ScaffoldNavigationData import com.x8bit.bitwarden.ui.platform.components.model.rememberBitwardenPullToRefreshState -import com.x8bit.bitwarden.ui.platform.components.navigation.BitwardenBottomAppBar -import com.x8bit.bitwarden.ui.platform.components.navigation.BitwardenNavigationRail import com.x8bit.bitwarden.ui.platform.components.scrim.BitwardenAnimatedScrim /** 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 75bddd7c0d..da98dd1eeb 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 @@ -38,10 +38,10 @@ import androidx.compose.ui.unit.dp import com.bitwarden.ui.platform.base.util.cardStyle 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.theme.BitwardenTheme import com.x8bit.bitwarden.R -import com.x8bit.bitwarden.ui.platform.components.field.color.bitwardenTextFieldColors import com.x8bit.bitwarden.ui.platform.components.slider.color.bitwardenSliderColors /** 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 118c4c34c8..a0d1e5fc0f 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 @@ -25,11 +25,12 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import com.bitwarden.ui.platform.components.button.BitwardenStandardIconButton +import com.bitwarden.ui.platform.resource.BitwardenDrawable 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.button.BitwardenOutlinedButton -import com.x8bit.bitwarden.ui.platform.components.button.BitwardenStandardIconButton import com.x8bit.bitwarden.ui.platform.components.button.color.bitwardenOutlinedButtonColors /** @@ -106,7 +107,7 @@ fun BitwardenSnackbar( if (bitwardenSnackbarData.withDismissAction) { BitwardenStandardIconButton( onClick = onDismiss, - vectorIconRes = R.drawable.ic_close, + vectorIconRes = BitwardenDrawable.ic_close, contentDescription = stringResource(R.string.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/stepper/BitwardenStepper.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/stepper/BitwardenStepper.kt index 977336aa84..0e4985c9c3 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/stepper/BitwardenStepper.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/stepper/BitwardenStepper.kt @@ -10,12 +10,12 @@ import androidx.compose.ui.platform.testTag import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.unit.dp import com.bitwarden.ui.platform.base.util.orNullIfBlank +import com.bitwarden.ui.platform.components.button.BitwardenFilledIconButton +import com.bitwarden.ui.platform.components.field.color.bitwardenTextFieldColors 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.button.BitwardenFilledIconButton import com.x8bit.bitwarden.ui.platform.components.field.BitwardenTextField -import com.x8bit.bitwarden.ui.platform.components.field.color.bitwardenTextFieldColors /** * Displays a stepper that allows the user to increment and decrement an int value. diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/text/BitwardenHyperTextLink.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/text/BitwardenHyperTextLink.kt index 13bbfa26fe..61f065b44e 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/text/BitwardenHyperTextLink.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/text/BitwardenHyperTextLink.kt @@ -10,8 +10,8 @@ import androidx.compose.ui.semantics.customActions import androidx.compose.ui.semantics.semantics import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.style.TextAlign +import com.bitwarden.ui.platform.base.util.annotatedStringResource import com.bitwarden.ui.platform.base.util.spanStyleOf -import com.bitwarden.ui.platform.base.util.toAnnotatedString import com.bitwarden.ui.platform.theme.BitwardenTheme /** @@ -31,14 +31,16 @@ fun BitwardenHyperTextLink( color: Color = BitwardenTheme.colorScheme.text.secondary, ) { Text( - text = annotatedResId.toAnnotatedString( + text = annotatedStringResource( + id = annotatedResId, args = args, style = spanStyleOf(color = color, textStyle = style), - ) { key -> - when (key) { - annotationKey -> onClick() - } - }, + onAnnotationClick = { key -> + when (key) { + annotationKey -> onClick() + } + }, + ), style = style, color = color, textAlign = TextAlign.Center, diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/toggle/BitwardenSwitch.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/toggle/BitwardenSwitch.kt index aaeb27c8a4..5b49147b76 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/toggle/BitwardenSwitch.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/components/toggle/BitwardenSwitch.kt @@ -31,10 +31,10 @@ import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import com.bitwarden.ui.platform.base.util.cardStyle import com.bitwarden.ui.platform.base.util.toAnnotatedString +import com.bitwarden.ui.platform.components.button.BitwardenStandardIconButton 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.button.BitwardenStandardIconButton import com.x8bit.bitwarden.ui.platform.components.divider.BitwardenHorizontalDivider import com.x8bit.bitwarden.ui.platform.components.model.TooltipData import com.x8bit.bitwarden.ui.platform.components.row.BitwardenRowOfActions 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 c251cf4271..085d6621fd 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 @@ -19,10 +19,10 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.DpSize 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.theme.BitwardenTheme import com.x8bit.bitwarden.R -import com.x8bit.bitwarden.ui.platform.components.button.BitwardenStandardIconButton private val MIN_TOOLTIP_WIDTH = 312.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 1d5cc1435b..935416d8ee 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 @@ -27,12 +27,12 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.bitwarden.ui.platform.base.util.EventsEffect import com.bitwarden.ui.platform.base.util.standardHorizontalMargin import com.bitwarden.ui.platform.base.util.toListItemCardStyle +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.theme.BitwardenTheme import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.platform.manager.model.FlagKey -import com.x8bit.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar -import com.x8bit.bitwarden.ui.platform.components.appbar.NavigationIcon import com.x8bit.bitwarden.ui.platform.components.button.BitwardenFilledButton import com.x8bit.bitwarden.ui.platform.components.divider.BitwardenHorizontalDivider import com.x8bit.bitwarden.ui.platform.components.header.BitwardenListHeaderText @@ -99,10 +99,7 @@ fun DebugMenuScreen( Spacer(Modifier.height(height = 16.dp)) BitwardenHorizontalDivider() Spacer(Modifier.height(height = 16.dp)) - // Pulled these into variable to avoid over-nested formatting in the composable call. - val isRestartOnboardingEnabled = state.featureFlags[FlagKey.OnboardingFlow] as? Boolean OnboardingOverrideContent( - isRestartOnboardingEnabled = isRestartOnboardingEnabled == true, onStartOnboarding = remember(viewModel) { { viewModel.trySendAction(DebugMenuAction.RestartOnboarding) @@ -209,7 +206,6 @@ private fun FeatureFlagContent( */ @Composable private fun OnboardingOverrideContent( - isRestartOnboardingEnabled: Boolean, onStartOnboarding: () -> Unit, onStartOnboardingCarousel: () -> Unit, modifier: Modifier = Modifier, @@ -225,7 +221,6 @@ private fun OnboardingOverrideContent( BitwardenFilledButton( label = stringResource(R.string.restart_onboarding_cta), onClick = onStartOnboarding, - isEnabled = isRestartOnboardingEnabled, modifier = Modifier .fillMaxWidth() .standardHorizontalMargin(), @@ -268,7 +263,6 @@ private fun FeatureFlagContent_preview() { FeatureFlagContent( featureFlagMap = persistentMapOf( FlagKey.EmailVerification to true, - FlagKey.OnboardingFlow to false, ), onValueChange = { _, _ -> }, onResetValues = { }, @@ -282,7 +276,6 @@ private fun OnboardingOverrideContent_preview() { BitwardenTheme { OnboardingOverrideContent( onStartOnboarding = {}, - isRestartOnboardingEnabled = true, onStartOnboardingCarousel = {}, ) } 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 22473346f0..94b3263c0c 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 @@ -27,9 +27,7 @@ fun FlagKey.ListItemContent( FlagKey.AuthenticatorSync, FlagKey.EmailVerification, - FlagKey.OnboardingFlow, FlagKey.ImportLoginsFlow, - FlagKey.VerifiedSsoDomainEndpoint, FlagKey.CredentialExchangeProtocolImport, FlagKey.CredentialExchangeProtocolExport, FlagKey.CipherKeyEncryption, @@ -86,9 +84,7 @@ private fun FlagKey.getDisplayLabel(): String = when (this) { FlagKey.AuthenticatorSync -> stringResource(R.string.authenticator_sync) FlagKey.EmailVerification -> stringResource(R.string.email_verification) - FlagKey.OnboardingFlow -> stringResource(R.string.onboarding_flow) FlagKey.ImportLoginsFlow -> stringResource(R.string.import_logins_flow) - FlagKey.VerifiedSsoDomainEndpoint -> stringResource(R.string.verified_sso_domain_verified) FlagKey.CredentialExchangeProtocolImport -> stringResource(R.string.cxp_import) FlagKey.CredentialExchangeProtocolExport -> stringResource(R.string.cxp_export) FlagKey.CipherKeyEncryption -> stringResource(R.string.cipher_key_encryption) 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 6e66660570..1f410aa477 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 @@ -19,13 +19,13 @@ import androidx.core.net.toUri import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.bitwarden.ui.platform.base.util.EventsEffect +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.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 -import com.x8bit.bitwarden.ui.platform.components.appbar.BitwardenSearchTopAppBar -import com.x8bit.bitwarden.ui.platform.components.appbar.NavigationIcon 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 @@ -137,6 +137,7 @@ fun SearchScreen( navigationIconContentDescription = stringResource(id = R.string.back), onNavigationIconClick = searchHandlers.onBackClick, ), + clearIconContentDescription = stringResource(id = R.string.clear), ) }, utilityBar = { 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 fa3ba58a69..286a9baac5 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 @@ -24,10 +24,11 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.bitwarden.ui.platform.base.util.EventsEffect import com.bitwarden.ui.platform.base.util.standardHorizontalMargin import com.bitwarden.ui.platform.base.util.toListItemCardStyle +import com.bitwarden.ui.platform.components.appbar.BitwardenMediumTopAppBar +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.x8bit.bitwarden.ui.platform.components.appbar.BitwardenMediumTopAppBar -import com.x8bit.bitwarden.ui.platform.components.appbar.NavigationIcon import com.x8bit.bitwarden.ui.platform.components.model.IconData import com.x8bit.bitwarden.ui.platform.components.row.BitwardenPushRow import com.x8bit.bitwarden.ui.platform.components.scaffold.BitwardenScaffold @@ -70,7 +71,7 @@ fun SettingsScreen( scrollBehavior = scrollBehavior, navigationIcon = if (state.shouldShowCloseButton) { NavigationIcon( - navigationIcon = rememberVectorPainter(id = R.drawable.ic_close), + navigationIcon = rememberVectorPainter(id = BitwardenDrawable.ic_close), navigationIconContentDescription = stringResource(id = R.string.close), onNavigationIconClick = remember(viewModel) { { viewModel.trySendAction(SettingsAction.CloseClick) } 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 ecb603190d..42d947b37d 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 @@ -33,13 +33,13 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.bitwarden.ui.platform.base.util.EventsEffect import com.bitwarden.ui.platform.base.util.mirrorIfRtl import com.bitwarden.ui.platform.base.util.standardHorizontalMargin +import com.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar import com.bitwarden.ui.platform.components.model.CardStyle import com.bitwarden.ui.platform.components.util.rememberVectorPainter 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.appbar.BitwardenTopAppBar import com.x8bit.bitwarden.ui.platform.components.model.TooltipData import com.x8bit.bitwarden.ui.platform.components.row.BitwardenExternalLinkRow import com.x8bit.bitwarden.ui.platform.components.row.BitwardenPushRow 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 7fd7ee78f3..3a54fd109d 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 @@ -35,6 +35,8 @@ import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.bitwarden.ui.platform.base.util.EventsEffect import com.bitwarden.ui.platform.base.util.standardHorizontalMargin +import com.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar +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.theme.BitwardenTheme @@ -43,8 +45,6 @@ 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.appbar.BitwardenTopAppBar -import com.x8bit.bitwarden.ui.platform.components.badge.NotificationBadge import com.x8bit.bitwarden.ui.platform.components.button.BitwardenTextButton import com.x8bit.bitwarden.ui.platform.components.card.BitwardenActionCard import com.x8bit.bitwarden.ui.platform.components.card.BitwardenInfoCalloutCard 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 b85f66bb39..bbffc7c217 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 @@ -35,11 +35,12 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.bitwarden.ui.platform.base.util.EventsEffect import com.bitwarden.ui.platform.base.util.cardStyle import com.bitwarden.ui.platform.base.util.standardHorizontalMargin +import com.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar 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.theme.BitwardenTheme import com.x8bit.bitwarden.R -import com.x8bit.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar import com.x8bit.bitwarden.ui.platform.components.button.BitwardenFilledErrorButton import com.x8bit.bitwarden.ui.platform.components.button.BitwardenOutlinedErrorButton import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenBasicDialog @@ -109,7 +110,7 @@ fun DeleteAccountScreen( BitwardenTopAppBar( title = stringResource(id = R.string.delete_account), scrollBehavior = scrollBehavior, - navigationIcon = rememberVectorPainter(id = R.drawable.ic_close), + navigationIcon = rememberVectorPainter(id = BitwardenDrawable.ic_close), navigationIconContentDescription = stringResource(id = R.string.close), onNavigationIconClick = remember(viewModel) { { viewModel.trySendAction(DeleteAccountAction.CloseClick) } 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 b21cfce3de..da551fce72 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 @@ -29,11 +29,12 @@ import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.bitwarden.ui.platform.base.util.EventsEffect +import com.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar 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.theme.BitwardenTheme import com.x8bit.bitwarden.R -import com.x8bit.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar import com.x8bit.bitwarden.ui.platform.components.button.BitwardenFilledErrorButton import com.x8bit.bitwarden.ui.platform.components.button.BitwardenOutlinedButton import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenBasicDialog @@ -208,7 +209,7 @@ private fun DeleteAccountConfirmationScaffold( BitwardenTopAppBar( title = stringResource(id = R.string.verification_code), scrollBehavior = scrollBehavior, - navigationIcon = rememberVectorPainter(id = R.drawable.ic_close), + navigationIcon = rememberVectorPainter(id = BitwardenDrawable.ic_close), navigationIconContentDescription = stringResource(id = R.string.close), onNavigationIconClick = onCloseClick, ) 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 fc8207b3f6..8c03e83865 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 @@ -30,10 +30,11 @@ import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle 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.theme.BitwardenTheme import com.x8bit.bitwarden.R -import com.x8bit.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar import com.x8bit.bitwarden.ui.platform.components.button.BitwardenFilledButton import com.x8bit.bitwarden.ui.platform.components.button.BitwardenOutlinedButton import com.x8bit.bitwarden.ui.platform.components.content.BitwardenErrorContent @@ -96,7 +97,7 @@ fun LoginApprovalScreen( BitwardenTopAppBar( title = stringResource(id = R.string.log_in_requested), scrollBehavior = scrollBehavior, - navigationIcon = rememberVectorPainter(id = R.drawable.ic_close), + navigationIcon = rememberVectorPainter(id = BitwardenDrawable.ic_close), navigationIconContentDescription = stringResource(id = R.string.close), onNavigationIconClick = remember(viewModel) { { viewModel.trySendAction(LoginApprovalAction.CloseClick) } 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 be9fff64dc..8b831aae9c 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 @@ -47,13 +47,14 @@ import com.bitwarden.ui.platform.base.util.LifecycleEventEffect import com.bitwarden.ui.platform.base.util.cardStyle import com.bitwarden.ui.platform.base.util.standardHorizontalMargin import com.bitwarden.ui.platform.base.util.toListItemCardStyle +import com.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar 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.theme.BitwardenTheme import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.platform.util.isBuildVersionBelow import com.x8bit.bitwarden.data.platform.util.isFdroid -import com.x8bit.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar import com.x8bit.bitwarden.ui.platform.components.bottomsheet.BitwardenModalBottomSheet import com.x8bit.bitwarden.ui.platform.components.button.BitwardenFilledButton import com.x8bit.bitwarden.ui.platform.components.button.BitwardenOutlinedButton @@ -141,7 +142,7 @@ fun PendingRequestsScreen( BitwardenTopAppBar( title = stringResource(id = R.string.pending_log_in_requests), scrollBehavior = scrollBehavior, - navigationIcon = rememberVectorPainter(id = R.drawable.ic_close), + navigationIcon = rememberVectorPainter(id = BitwardenDrawable.ic_close), navigationIconContentDescription = stringResource(id = R.string.close), onNavigationIconClick = remember(viewModel) { { viewModel.trySendAction(PendingRequestsAction.CloseClick) } 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 a5a3477f16..86e4b62b2a 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 @@ -25,11 +25,11 @@ import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.bitwarden.ui.platform.base.util.EventsEffect import com.bitwarden.ui.platform.base.util.standardHorizontalMargin +import com.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar import com.bitwarden.ui.platform.components.model.CardStyle import com.bitwarden.ui.platform.components.util.rememberVectorPainter import com.bitwarden.ui.platform.feature.settings.appearance.model.AppTheme import com.x8bit.bitwarden.R -import com.x8bit.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar 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 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 92e1b5b3f0..853d63c28e 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 @@ -31,12 +31,12 @@ import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.bitwarden.ui.platform.base.util.EventsEffect import com.bitwarden.ui.platform.base.util.standardHorizontalMargin +import com.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar +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.x8bit.bitwarden.R import com.x8bit.bitwarden.data.platform.repository.model.UriMatchType -import com.x8bit.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar -import com.x8bit.bitwarden.ui.platform.components.badge.NotificationBadge 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.dialog.BitwardenBasicDialog 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 7508d8d421..d8ea5717da 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 @@ -39,12 +39,12 @@ import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.bitwarden.ui.platform.base.util.EventsEffect import com.bitwarden.ui.platform.base.util.bottomDivider +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.theme.BitwardenTheme import com.x8bit.bitwarden.R -import com.x8bit.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar import com.x8bit.bitwarden.ui.platform.components.button.BitwardenOutlinedButton -import com.x8bit.bitwarden.ui.platform.components.fab.BitwardenFloatingActionButton import com.x8bit.bitwarden.ui.platform.components.scaffold.BitwardenScaffold /** 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 a5da2fc7ad..eda3ba0b4c 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 @@ -32,12 +32,13 @@ import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.bitwarden.ui.platform.base.util.EventsEffect import com.bitwarden.ui.platform.base.util.standardHorizontalMargin +import com.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar 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.theme.BitwardenTheme import com.x8bit.bitwarden.R import com.x8bit.bitwarden.ui.auth.feature.completeregistration.PasswordStrengthIndicator -import com.x8bit.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar import com.x8bit.bitwarden.ui.platform.components.button.BitwardenOutlinedButton import com.x8bit.bitwarden.ui.platform.components.card.BitwardenInfoCalloutCard import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenBasicDialog @@ -146,7 +147,7 @@ fun ExportVaultScreen( BitwardenTopAppBar( title = stringResource(id = R.string.export_vault), scrollBehavior = scrollBehavior, - navigationIcon = rememberVectorPainter(id = R.drawable.ic_close), + navigationIcon = rememberVectorPainter(id = BitwardenDrawable.ic_close), navigationIconContentDescription = stringResource(id = R.string.close), onNavigationIconClick = remember(viewModel) { { viewModel.trySendAction(ExportVaultAction.CloseButtonClick) } 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 d8a2926887..7eca8e8f1f 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 @@ -26,12 +26,13 @@ import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.bitwarden.ui.platform.base.util.EventsEffect import com.bitwarden.ui.platform.base.util.standardHorizontalMargin +import com.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar 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.theme.BitwardenTheme import com.x8bit.bitwarden.R import com.x8bit.bitwarden.data.platform.repository.model.FlightRecorderDuration -import com.x8bit.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar import com.x8bit.bitwarden.ui.platform.components.button.BitwardenTextButton import com.x8bit.bitwarden.ui.platform.components.dropdown.BitwardenMultiSelectButton import com.x8bit.bitwarden.ui.platform.components.scaffold.BitwardenScaffold @@ -65,7 +66,7 @@ fun FlightRecorderScreen( topBar = { BitwardenTopAppBar( title = stringResource(id = R.string.enable_flight_recorder_title), - navigationIcon = rememberVectorPainter(id = R.drawable.ic_close), + navigationIcon = rememberVectorPainter(id = BitwardenDrawable.ic_close), navigationIconContentDescription = stringResource(id = R.string.close), onNavigationIconClick = remember(viewModel) { { viewModel.trySendAction(FlightRecorderAction.BackClick) } 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 9240f90ed3..649bb9d901 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 @@ -35,13 +35,14 @@ import com.bitwarden.ui.platform.base.util.EventsEffect import com.bitwarden.ui.platform.base.util.cardStyle import com.bitwarden.ui.platform.base.util.standardHorizontalMargin import com.bitwarden.ui.platform.base.util.toListItemCardStyle +import com.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar +import com.bitwarden.ui.platform.components.appbar.action.BitwardenOverflowActionItem +import com.bitwarden.ui.platform.components.appbar.model.OverflowMenuItemData 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.theme.BitwardenTheme import com.x8bit.bitwarden.R -import com.x8bit.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar -import com.x8bit.bitwarden.ui.platform.components.appbar.action.BitwardenOverflowActionItem -import com.x8bit.bitwarden.ui.platform.components.appbar.action.OverflowMenuItemData 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,7 +96,7 @@ fun RecordedLogsScreen( topBar = { BitwardenTopAppBar( title = stringResource(id = R.string.recorded_logs_title), - navigationIcon = rememberVectorPainter(id = R.drawable.ic_close), + navigationIcon = rememberVectorPainter(id = BitwardenDrawable.ic_close), navigationIconContentDescription = stringResource(id = R.string.close), onNavigationIconClick = remember(viewModel) { { viewModel.trySendAction(RecordedLogsAction.BackClick) } @@ -168,6 +169,7 @@ private fun RecordedLogsOverflowMenu( ) } BitwardenOverflowActionItem( + contentDescription = stringResource(R.string.more), modifier = modifier, menuItemDataList = persistentListOf( OverflowMenuItemData( @@ -309,6 +311,7 @@ private fun LogRow( } Spacer(modifier = Modifier.width(width = 12.dp)) BitwardenOverflowActionItem( + contentDescription = stringResource(R.string.more), menuItemDataList = persistentListOf( OverflowMenuItemData( text = stringResource(id = R.string.share), 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 26fb4da79e..075bd6e8c0 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 @@ -29,13 +29,14 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.bitwarden.ui.platform.base.util.EventsEffect import com.bitwarden.ui.platform.base.util.standardHorizontalMargin import com.bitwarden.ui.platform.base.util.toListItemCardStyle +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.theme.BitwardenTheme import com.x8bit.bitwarden.R -import com.x8bit.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar 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.fab.BitwardenFloatingActionButton import com.x8bit.bitwarden.ui.platform.components.row.BitwardenTextRow import com.x8bit.bitwarden.ui.platform.components.scaffold.BitwardenScaffold import com.x8bit.bitwarden.ui.platform.feature.settings.folders.model.FolderDisplayItem @@ -78,7 +79,7 @@ fun FoldersScreen( BitwardenTopAppBar( title = stringResource(id = R.string.folders), scrollBehavior = scrollBehavior, - navigationIcon = rememberVectorPainter(id = R.drawable.ic_close), + navigationIcon = rememberVectorPainter(id = BitwardenDrawable.ic_close), navigationIconContentDescription = stringResource(id = R.string.close), onNavigationIconClick = remember(viewModel) { { viewModel.trySendAction(FoldersAction.CloseButtonClick) } 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 3c1993e106..1c6f034cb4 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 @@ -26,13 +26,14 @@ import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.bitwarden.ui.platform.base.util.EventsEffect import com.bitwarden.ui.platform.base.util.standardHorizontalMargin +import com.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar +import com.bitwarden.ui.platform.components.appbar.action.BitwardenOverflowActionItem +import com.bitwarden.ui.platform.components.appbar.model.OverflowMenuItemData 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.theme.BitwardenTheme import com.x8bit.bitwarden.R -import com.x8bit.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar -import com.x8bit.bitwarden.ui.platform.components.appbar.action.BitwardenOverflowActionItem -import com.x8bit.bitwarden.ui.platform.components.appbar.action.OverflowMenuItemData import com.x8bit.bitwarden.ui.platform.components.button.BitwardenTextButton import com.x8bit.bitwarden.ui.platform.components.content.BitwardenErrorContent import com.x8bit.bitwarden.ui.platform.components.content.BitwardenLoadingContent @@ -99,7 +100,7 @@ fun FolderAddEditScreen( BitwardenTopAppBar( title = state.screenDisplayName.invoke(), scrollBehavior = scrollBehavior, - navigationIcon = rememberVectorPainter(id = R.drawable.ic_close), + navigationIcon = rememberVectorPainter(id = BitwardenDrawable.ic_close), navigationIconContentDescription = stringResource(id = R.string.close), onNavigationIconClick = remember(viewModel) { { viewModel.trySendAction(FolderAddEditAction.CloseClick) } @@ -114,6 +115,7 @@ fun FolderAddEditScreen( ) if (state.shouldShowOverflowMenu) { BitwardenOverflowActionItem( + contentDescription = stringResource(R.string.more), menuItemDataList = persistentListOf( OverflowMenuItemData( text = stringResource(id = R.string.delete), 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 2f4c6e9922..1c0cb3fe71 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 @@ -33,13 +33,13 @@ import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.bitwarden.ui.platform.base.util.EventsEffect import com.bitwarden.ui.platform.base.util.standardHorizontalMargin +import com.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar import com.bitwarden.ui.platform.components.model.CardStyle import com.bitwarden.ui.platform.components.util.rememberVectorPainter 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.appbar.BitwardenTopAppBar import com.x8bit.bitwarden.ui.platform.components.button.BitwardenOutlinedButton import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenBasicDialog import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenLoadingDialog 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 b9353daee0..c1505cb552 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 @@ -28,11 +28,11 @@ import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.bitwarden.ui.platform.base.util.EventsEffect import com.bitwarden.ui.platform.base.util.standardHorizontalMargin +import com.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar +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.x8bit.bitwarden.R -import com.x8bit.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar -import com.x8bit.bitwarden.ui.platform.components.badge.NotificationBadge 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 diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/vaultunlocked/VaultUnlockedNavigation.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/vaultunlocked/VaultUnlockedNavigation.kt index ae066b020a..9d4ecfe5ce 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/vaultunlocked/VaultUnlockedNavigation.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/vaultunlocked/VaultUnlockedNavigation.kt @@ -8,6 +8,7 @@ import com.x8bit.bitwarden.ui.auth.feature.accountsetup.navigateToSetupAutoFillS import com.x8bit.bitwarden.ui.auth.feature.accountsetup.navigateToSetupUnlockScreen import com.x8bit.bitwarden.ui.auth.feature.accountsetup.setupAutoFillDestination import com.x8bit.bitwarden.ui.auth.feature.accountsetup.setupUnlockDestination +import com.x8bit.bitwarden.ui.platform.feature.search.SearchRoute import com.x8bit.bitwarden.ui.platform.feature.search.navigateToSearch import com.x8bit.bitwarden.ui.platform.feature.search.searchDestination import com.x8bit.bitwarden.ui.platform.feature.settings.accountsecurity.deleteaccount.deleteAccountDestination @@ -201,7 +202,7 @@ fun NavGraphBuilder.vaultUnlockedGraph( addEditSendDestination( onNavigateBack = { navController.popBackStack() }, - onNavigateUpToRoot = { navController.navigateToVaultUnlockedRoot() }, + onNavigateUpToSearchOrRoot = { navController.navigateUpToSearchOrVaultUnlockedRoot() }, ) viewSendDestination( onNavigateBack = { navController.popBackStack() }, @@ -249,6 +250,12 @@ fun NavGraphBuilder.vaultUnlockedGraph( } } -private fun NavController.navigateToVaultUnlockedRoot() { - this.popBackStack(route = VaultUnlockedNavbarRoute, inclusive = false) +private fun NavController.navigateUpToSearchOrVaultUnlockedRoot() { + if (!this.popBackStack(inclusive = false)) { + this.navigateUpToVaultUnlockedRoot() + } +} + +private fun NavController.navigateUpToVaultUnlockedRoot() { + this.popBackStack(inclusive = false) } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/vaultunlockednavbar/VaultUnlockedNavBarScreen.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/vaultunlockednavbar/VaultUnlockedNavBarScreen.kt index 96acb52e8d..4debcfcbd9 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/vaultunlockednavbar/VaultUnlockedNavBarScreen.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/vaultunlockednavbar/VaultUnlockedNavBarScreen.kt @@ -20,8 +20,8 @@ import androidx.navigation.compose.NavHost import androidx.navigation.compose.currentBackStackEntryAsState import androidx.navigation.navOptions import com.bitwarden.ui.platform.base.util.EventsEffect +import com.bitwarden.ui.platform.components.navigation.model.NavigationItem import com.bitwarden.ui.platform.theme.RootTransitionProviders -import com.x8bit.bitwarden.ui.platform.components.model.NavigationItem import com.x8bit.bitwarden.ui.platform.components.model.ScaffoldNavigationData import com.x8bit.bitwarden.ui.platform.components.scaffold.BitwardenScaffold import com.x8bit.bitwarden.ui.platform.components.util.rememberBitwardenNavController 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 00b740a63d..ba416384e5 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 @@ -1,9 +1,9 @@ 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.util.toObjectNavigationRoute import com.x8bit.bitwarden.R -import com.x8bit.bitwarden.ui.platform.components.model.NavigationItem 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 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 d8c69c511c..7d0f901b25 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 @@ -41,20 +41,22 @@ import com.bitwarden.ui.platform.base.util.EventsEffect import com.bitwarden.ui.platform.base.util.LifecycleEventEffect import com.bitwarden.ui.platform.base.util.scrolledContainerBottomDivider import com.bitwarden.ui.platform.base.util.standardHorizontalMargin +import com.bitwarden.ui.platform.components.appbar.BitwardenMediumTopAppBar +import com.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar +import com.bitwarden.ui.platform.components.appbar.action.BitwardenOverflowActionItem +import com.bitwarden.ui.platform.components.appbar.model.OverflowMenuItemData +import com.bitwarden.ui.platform.components.button.BitwardenStandardIconButton import com.bitwarden.ui.platform.components.model.CardStyle +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.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 -import com.x8bit.bitwarden.ui.platform.components.appbar.BitwardenMediumTopAppBar -import com.x8bit.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar -import com.x8bit.bitwarden.ui.platform.components.appbar.action.BitwardenOverflowActionItem -import com.x8bit.bitwarden.ui.platform.components.appbar.action.OverflowMenuItemData import com.x8bit.bitwarden.ui.platform.components.button.BitwardenFilledButton -import com.x8bit.bitwarden.ui.platform.components.button.BitwardenStandardIconButton import com.x8bit.bitwarden.ui.platform.components.button.BitwardenTextButton import com.x8bit.bitwarden.ui.platform.components.card.BitwardenActionCard import com.x8bit.bitwarden.ui.platform.components.card.BitwardenInfoCalloutCard @@ -68,7 +70,6 @@ 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.model.TextToolbarType import com.x8bit.bitwarden.ui.platform.components.model.TooltipData -import com.x8bit.bitwarden.ui.platform.components.model.TopAppBarDividerStyle import com.x8bit.bitwarden.ui.platform.components.scaffold.BitwardenScaffold import com.x8bit.bitwarden.ui.platform.components.segment.BitwardenSegmentedButton import com.x8bit.bitwarden.ui.platform.components.segment.SegmentedButtonOptionContent @@ -310,6 +311,7 @@ private fun DefaultAppBar( dividerStyle = TopAppBarDividerStyle.NONE, actions = { BitwardenOverflowActionItem( + contentDescription = stringResource(R.string.more), menuItemDataList = persistentListOf( OverflowMenuItemData( text = stringResource(id = R.string.password_history), @@ -333,7 +335,7 @@ private fun ModalAppBar( ) { BitwardenTopAppBar( title = stringResource(id = R.string.generator), - navigationIcon = rememberVectorPainter(id = R.drawable.ic_close), + navigationIcon = rememberVectorPainter(id = BitwardenDrawable.ic_close), navigationIconContentDescription = stringResource(id = R.string.close), onNavigationIconClick = onCloseClick, scrollBehavior = scrollBehavior, 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 ea1de42613..bedce8dec6 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 @@ -20,10 +20,10 @@ import androidx.compose.ui.unit.dp import com.bitwarden.ui.platform.base.util.cardStyle import com.bitwarden.ui.platform.base.util.withLineBreaksAtWidth 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.theme.BitwardenTheme import com.x8bit.bitwarden.R -import com.x8bit.bitwarden.ui.platform.components.button.BitwardenStandardIconButton import com.x8bit.bitwarden.ui.platform.components.util.nonLetterColorVisualTransformation /** 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 61e6c65ed9..69aff8ad03 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 @@ -30,12 +30,12 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.bitwarden.ui.platform.base.util.EventsEffect import com.bitwarden.ui.platform.base.util.standardHorizontalMargin import com.bitwarden.ui.platform.base.util.toListItemCardStyle +import com.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar +import com.bitwarden.ui.platform.components.appbar.action.BitwardenOverflowActionItem +import com.bitwarden.ui.platform.components.appbar.model.OverflowMenuItemData import com.bitwarden.ui.platform.components.util.rememberVectorPainter import com.bitwarden.ui.platform.theme.BitwardenTheme import com.x8bit.bitwarden.R -import com.x8bit.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar -import com.x8bit.bitwarden.ui.platform.components.appbar.action.BitwardenOverflowActionItem -import com.x8bit.bitwarden.ui.platform.components.appbar.action.OverflowMenuItemData import com.x8bit.bitwarden.ui.platform.components.indicator.BitwardenCircularProgressIndicator import com.x8bit.bitwarden.ui.platform.components.scaffold.BitwardenScaffold import kotlinx.collections.immutable.persistentListOf @@ -80,6 +80,7 @@ fun PasswordHistoryScreen( actions = { if (state.menuEnabled) { BitwardenOverflowActionItem( + contentDescription = stringResource(R.string.more), menuItemDataList = persistentListOf( OverflowMenuItemData( text = stringResource(id = R.string.clear), 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 de344f2097..89fd8f2f2d 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 @@ -20,22 +20,22 @@ import androidx.core.net.toUri import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.bitwarden.ui.platform.base.util.EventsEffect +import com.bitwarden.ui.platform.components.appbar.BitwardenMediumTopAppBar +import com.bitwarden.ui.platform.components.appbar.action.BitwardenOverflowActionItem +import com.bitwarden.ui.platform.components.appbar.action.BitwardenSearchActionItem +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.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 -import com.x8bit.bitwarden.ui.platform.components.appbar.BitwardenMediumTopAppBar -import com.x8bit.bitwarden.ui.platform.components.appbar.action.BitwardenOverflowActionItem -import com.x8bit.bitwarden.ui.platform.components.appbar.action.BitwardenSearchActionItem -import com.x8bit.bitwarden.ui.platform.components.appbar.action.OverflowMenuItemData 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 import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenLoadingDialog 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.fab.BitwardenFloatingActionButton import com.x8bit.bitwarden.ui.platform.components.model.rememberBitwardenPullToRefreshState import com.x8bit.bitwarden.ui.platform.components.scaffold.BitwardenScaffold import com.x8bit.bitwarden.ui.platform.composition.LocalAppResumeStateManager @@ -155,6 +155,7 @@ fun SendScreen( }, ) BitwardenOverflowActionItem( + contentDescription = stringResource(R.string.more), menuItemDataList = persistentListOf( OverflowMenuItemData( text = stringResource(id = R.string.sync), diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/addedit/AddEditSendNavigation.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/addedit/AddEditSendNavigation.kt index 4d9b97374b..e8a6209066 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/addedit/AddEditSendNavigation.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/addedit/AddEditSendNavigation.kt @@ -56,12 +56,12 @@ fun SavedStateHandle.toAddEditSendArgs(): AddEditSendArgs { */ fun NavGraphBuilder.addEditSendDestination( onNavigateBack: () -> Unit, - onNavigateUpToRoot: () -> Unit, + onNavigateUpToSearchOrRoot: () -> Unit, ) { composableWithSlideTransitions { AddEditSendScreen( onNavigateBack = onNavigateBack, - onNavigateUpToRoot = onNavigateUpToRoot, + onNavigateUpToSearchOrRoot = onNavigateUpToSearchOrRoot, ) } } 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 31575b8fa5..981df79727 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 @@ -17,18 +17,19 @@ import androidx.compose.ui.res.stringResource import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.bitwarden.ui.platform.base.util.EventsEffect +import com.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar +import com.bitwarden.ui.platform.components.appbar.NavigationIcon +import com.bitwarden.ui.platform.components.appbar.action.BitwardenOverflowActionItem +import com.bitwarden.ui.platform.components.appbar.model.OverflowMenuItemData +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.x8bit.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar -import com.x8bit.bitwarden.ui.platform.components.appbar.NavigationIcon -import com.x8bit.bitwarden.ui.platform.components.appbar.action.BitwardenOverflowActionItem -import com.x8bit.bitwarden.ui.platform.components.appbar.action.OverflowMenuItemData import com.x8bit.bitwarden.ui.platform.components.button.BitwardenTextButton 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 import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenLoadingDialog -import com.x8bit.bitwarden.ui.platform.components.model.TopAppBarDividerStyle import com.x8bit.bitwarden.ui.platform.components.scaffold.BitwardenScaffold import com.x8bit.bitwarden.ui.platform.composition.LocalExitManager import com.x8bit.bitwarden.ui.platform.composition.LocalIntentManager @@ -51,7 +52,7 @@ fun AddEditSendScreen( intentManager: IntentManager = LocalIntentManager.current, permissionsManager: PermissionsManager = LocalPermissionsManager.current, onNavigateBack: () -> Unit, - onNavigateUpToRoot: () -> Unit, + onNavigateUpToSearchOrRoot: () -> Unit, ) { val state by viewModel.stateFlow.collectAsStateWithLifecycle() val addSendHandlers = remember(viewModel) { AddEditSendHandlers.create(viewModel) } @@ -76,7 +77,7 @@ fun AddEditSendScreen( is AddEditSendEvent.NavigateBack -> onNavigateBack() - is AddEditSendEvent.NavigateToRoot -> onNavigateUpToRoot() + is AddEditSendEvent.NavigateUpToSearchOrRoot -> onNavigateUpToSearchOrRoot() is AddEditSendEvent.ShowChooserSheet -> { fileChooserLauncher.launch( @@ -108,7 +109,7 @@ fun AddEditSendScreen( BitwardenTopAppBar( title = state.screenDisplayName(), navigationIcon = NavigationIcon( - navigationIcon = rememberVectorPainter(id = R.drawable.ic_close), + navigationIcon = rememberVectorPainter(id = BitwardenDrawable.ic_close), navigationIconContentDescription = stringResource(id = R.string.close), onNavigationIconClick = remember(viewModel) { { viewModel.trySendAction(AddEditSendAction.CloseClick) } @@ -128,6 +129,7 @@ fun AddEditSendScreen( ) if (!state.isAddMode) { BitwardenOverflowActionItem( + contentDescription = stringResource(R.string.more), menuItemDataList = persistentListOfNotNull( OverflowMenuItemData( text = stringResource(id = R.string.remove_password), 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 df5b333bc9..eebe23fb45 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 @@ -600,7 +600,7 @@ class AddEditSendViewModel @Inject constructor( } else if (isDeleted) { // We need to make sure we don't land on the View Send screen // since it has now been deleted. - AddEditSendEvent.NavigateToRoot + AddEditSendEvent.NavigateUpToSearchOrRoot } else { AddEditSendEvent.NavigateBack }, @@ -833,9 +833,9 @@ sealed class AddEditSendEvent { data object NavigateBack : AddEditSendEvent() /** - * Navigate up to the root. + * Navigate up to the search screen or the root screen depending where you came from. */ - data object NavigateToRoot : AddEditSendEvent() + data object NavigateUpToSearchOrRoot : AddEditSendEvent() /** * Show file chooser sheet. 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 b7e3cca124..2dec08b437 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 @@ -46,13 +46,15 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.bitwarden.ui.platform.base.util.EventsEffect import com.bitwarden.ui.platform.base.util.cardStyle import com.bitwarden.ui.platform.base.util.standardHorizontalMargin +import com.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar +import com.bitwarden.ui.platform.components.appbar.NavigationIcon +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.theme.BitwardenTheme import com.bitwarden.ui.util.asText import com.x8bit.bitwarden.R -import com.x8bit.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar -import com.x8bit.bitwarden.ui.platform.components.appbar.NavigationIcon import com.x8bit.bitwarden.ui.platform.components.button.BitwardenFilledButton import com.x8bit.bitwarden.ui.platform.components.button.BitwardenOutlinedButton import com.x8bit.bitwarden.ui.platform.components.button.BitwardenOutlinedErrorButton @@ -61,7 +63,6 @@ import com.x8bit.bitwarden.ui.platform.components.content.BitwardenLoadingConten 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 -import com.x8bit.bitwarden.ui.platform.components.fab.BitwardenFloatingActionButton 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 @@ -126,7 +127,7 @@ fun ViewSendScreen( BitwardenTopAppBar( title = state.screenDisplayName(), navigationIcon = NavigationIcon( - navigationIcon = rememberVectorPainter(id = R.drawable.ic_close), + navigationIcon = rememberVectorPainter(id = BitwardenDrawable.ic_close), navigationIconContentDescription = stringResource(id = R.string.close), onNavigationIconClick = remember(viewModel) { { viewModel.trySendAction(ViewSendAction.CloseClick) } @@ -272,6 +273,17 @@ private fun ViewStateContent( .padding(horizontal = 16.dp), ) Spacer(modifier = Modifier.height(height = 8.dp)) + BitwardenTextField( + label = stringResource(id = R.string.send_name_required), + value = state.sendName, + onValueChange = {}, + readOnly = true, + cardStyle = CardStyle.Full, + modifier = Modifier + .fillMaxWidth() + .standardHorizontalMargin(), + ) + Spacer(modifier = Modifier.height(height = 8.dp)) when (val sendType = state.sendType) { is ViewSendState.ViewState.Content.SendType.FileType -> { FileSendContent( @@ -293,18 +305,6 @@ private fun ViewStateContent( } Spacer(modifier = Modifier.height(height = 8.dp)) - BitwardenTextField( - label = stringResource(id = R.string.send_name_required), - value = state.sendName, - onValueChange = {}, - readOnly = true, - cardStyle = CardStyle.Full, - modifier = Modifier - .fillMaxWidth() - .standardHorizontalMargin(), - ) - Spacer(modifier = Modifier.height(height = 8.dp)) - BitwardenTextField( label = stringResource(id = R.string.deletion_date), value = state.deletionDate, @@ -375,7 +375,7 @@ private fun ShareLinkSection( ), ) { Text( - text = stringResource(id = R.string.share_link), + text = stringResource(id = R.string.send_link), style = BitwardenTheme.typography.titleSmall, color = BitwardenTheme.colorScheme.text.primary, overflow = TextOverflow.Ellipsis, 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 05079afc8e..b9d7c483cc 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 @@ -11,9 +11,9 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.platform.testTag import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp +import com.bitwarden.ui.platform.components.button.BitwardenStandardIconButton import com.bitwarden.ui.platform.components.model.CardStyle import com.x8bit.bitwarden.R -import com.x8bit.bitwarden.ui.platform.components.button.BitwardenStandardIconButton 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 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 ffcfebc00f..53cc2036b8 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 @@ -17,9 +17,9 @@ import androidx.compose.ui.platform.testTag 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.button.BitwardenStandardIconButton import com.bitwarden.ui.platform.components.model.CardStyle import com.x8bit.bitwarden.R -import com.x8bit.bitwarden.ui.platform.components.button.BitwardenStandardIconButton import com.x8bit.bitwarden.ui.platform.components.button.BitwardenTextSelectionButton import com.x8bit.bitwarden.ui.platform.components.card.BitwardenActionCard import com.x8bit.bitwarden.ui.platform.components.card.BitwardenInfoCalloutCard 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 644c4a8770..33f34c82e7 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 @@ -21,12 +21,13 @@ import androidx.compose.ui.res.stringResource 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.button.BitwardenStandardIconButton import com.bitwarden.ui.platform.components.model.CardStyle +import com.bitwarden.ui.platform.resource.BitwardenDrawable 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.button.BitwardenStandardIconButton 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 @@ -369,7 +370,7 @@ private fun TotpRow( actions = { totpKey?.let { BitwardenStandardIconButton( - vectorIconRes = R.drawable.ic_clear, + vectorIconRes = BitwardenDrawable.ic_clear, contentDescription = stringResource(id = R.string.delete), onClick = loginItemTypeHandlers.onClearTotpKeyClick, ) 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 b64fad3c2e..687942010c 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 @@ -41,16 +41,17 @@ import com.bitwarden.ui.platform.base.util.EventsEffect import com.bitwarden.ui.platform.base.util.cardStyle import com.bitwarden.ui.platform.base.util.standardHorizontalMargin import com.bitwarden.ui.platform.base.util.toListItemCardStyle +import com.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar +import com.bitwarden.ui.platform.components.appbar.NavigationIcon +import com.bitwarden.ui.platform.components.appbar.action.BitwardenOverflowActionItem +import com.bitwarden.ui.platform.components.appbar.model.OverflowMenuItemData 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.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.appbar.BitwardenTopAppBar -import com.x8bit.bitwarden.ui.platform.components.appbar.NavigationIcon -import com.x8bit.bitwarden.ui.platform.components.appbar.action.BitwardenOverflowActionItem -import com.x8bit.bitwarden.ui.platform.components.appbar.action.OverflowMenuItemData import com.x8bit.bitwarden.ui.platform.components.bottomsheet.BitwardenModalBottomSheet import com.x8bit.bitwarden.ui.platform.components.button.BitwardenTextButton import com.x8bit.bitwarden.ui.platform.components.coachmark.CoachMarkContainer @@ -325,7 +326,7 @@ fun VaultAddEditScreen( BitwardenTopAppBar( title = state.screenDisplayName(), navigationIcon = NavigationIcon( - navigationIcon = rememberVectorPainter(id = R.drawable.ic_close), + navigationIcon = rememberVectorPainter(id = BitwardenDrawable.ic_close), navigationIconContentDescription = stringResource(id = R.string.close), onNavigationIconClick = remember(viewModel) { { viewModel.trySendAction(VaultAddEditAction.Common.CloseClick) } @@ -342,6 +343,7 @@ fun VaultAddEditScreen( modifier = Modifier.testTag("SaveButton"), ) BitwardenOverflowActionItem( + contentDescription = stringResource(R.string.more), menuItemDataList = persistentListOfNotNull( OverflowMenuItemData( text = stringResource(id = R.string.attachments), 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 a2426030cb..b36a4f1067 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 @@ -8,9 +8,9 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.platform.testTag import androidx.compose.ui.res.stringResource +import com.bitwarden.ui.platform.components.button.BitwardenStandardIconButton import com.bitwarden.ui.platform.components.model.CardStyle import com.x8bit.bitwarden.R -import com.x8bit.bitwarden.ui.platform.components.button.BitwardenStandardIconButton 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 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 998f6f63d0..e24a4c6dfb 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 @@ -960,11 +960,12 @@ class VaultAddEditViewModel @Inject constructor( ) { updateCommonContent { currentCommonContentState -> currentCommonContentState.copy( + selectedOwnerId = currentCommonContentState.selectedOwner?.id, availableOwners = currentCommonContentState .availableOwners .toUpdatedOwners( selectedCollectionId = action.collection.id, - selectedOwnerId = currentCommonContentState.selectedOwnerId, + selectedOwnerId = currentCommonContentState.selectedOwner?.id, ), ) } @@ -1754,9 +1755,21 @@ class VaultAddEditViewModel @Inject constructor( ) { cipherView.permissions?.delete == true } else { + val needsManagePermission = cipherView + ?.organizationId + ?.let { orgId -> + currentAccount + .organizations + .firstOrNull { it.id == orgId } + ?.limitItemDeletion + } + internalVaultData .collectionViewList - .hasDeletePermissionInAtLeastOneCollection(cipherView?.collectionIds) + .hasDeletePermissionInAtLeastOneCollection( + collectionIds = cipherView?.collectionIds, + needsManagePermission = needsManagePermission == true, + ) } val canAssignToCollections = internalVaultData 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 78d81b0ecc..289d2234be 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 @@ -26,11 +26,11 @@ 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.base.util.toListItemCardStyle +import com.bitwarden.ui.platform.components.button.BitwardenStandardIconButton 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.button.BitwardenOutlinedButton -import com.x8bit.bitwarden.ui.platform.components.button.BitwardenStandardIconButton 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 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 2e62617380..06b2b5db1a 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 @@ -16,10 +16,10 @@ import androidx.compose.ui.res.stringResource import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.bitwarden.ui.platform.base.util.EventsEffect +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.x8bit.bitwarden.R -import com.x8bit.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar -import com.x8bit.bitwarden.ui.platform.components.appbar.NavigationIcon import com.x8bit.bitwarden.ui.platform.components.button.BitwardenTextButton import com.x8bit.bitwarden.ui.platform.components.content.BitwardenErrorContent import com.x8bit.bitwarden.ui.platform.components.content.BitwardenLoadingContent 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 8b7d58f6f5..a7603e1516 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 @@ -39,14 +39,16 @@ import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.bitwarden.annotation.OmitFromCoverage import com.bitwarden.ui.platform.base.util.EventsEffect +import com.bitwarden.ui.platform.base.util.annotatedStringResource import com.bitwarden.ui.platform.base.util.bitwardenBoldSpanStyle import com.bitwarden.ui.platform.base.util.standardHorizontalMargin import com.bitwarden.ui.platform.base.util.toAnnotatedString +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.theme.BitwardenTheme import com.x8bit.bitwarden.R -import com.x8bit.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar -import com.x8bit.bitwarden.ui.platform.components.appbar.NavigationIcon import com.x8bit.bitwarden.ui.platform.components.bottomsheet.BitwardenModalBottomSheet import com.x8bit.bitwarden.ui.platform.components.button.BitwardenFilledButton import com.x8bit.bitwarden.ui.platform.components.button.BitwardenOutlinedButton @@ -118,7 +120,7 @@ fun ImportLoginsScreen( BitwardenTopAppBar( title = stringResource(R.string.import_logins), navigationIcon = NavigationIcon( - navigationIcon = rememberVectorPainter(R.drawable.ic_close), + navigationIcon = rememberVectorPainter(BitwardenDrawable.ic_close), onNavigationIconClick = handler.onCloseClick, navigationIconContentDescription = stringResource(R.string.close), ), @@ -286,13 +288,15 @@ private fun ImportLoginsStepOneContent( onHelpClick: () -> Unit, modifier: Modifier = Modifier, ) { - val instruction1 = - R.string.on_your_computer_log_in_to_your_current_browser_or_password_manager.toAnnotatedString() - val instruction2 = - R.string.export_your_passwords_this_option_is_usually_found_in_your_settings.toAnnotatedString() - val instruction3 = - R.string.save_the_exported_file_somewhere_on_your_computer_you_can_find_easily - .toAnnotatedString() + val instruction1 = annotatedStringResource( + id = R.string.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, + ) + val instruction3 = annotatedStringResource( + id = R.string.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), @@ -329,11 +333,10 @@ private fun ImportLoginsStepTwoContent( onHelpClick: () -> Unit, modifier: Modifier = Modifier, ) { - val instruction1 = - R.string.on_your_computer_open_a_new_browser_tab_and_go_to_vault_bitwarden_com - .toAnnotatedString( - vaultUrl, - ) + val instruction1 = annotatedStringResource( + id = R.string.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 instruction2 = buildAnnotatedString { withStyle(bitwardenBoldSpanStyle) { @@ -370,15 +373,18 @@ private fun ImportLoginsStepThreeContent( onHelpClick: () -> Unit, modifier: Modifier = Modifier, ) { - val instruction1 = - R.string.in_the_bitwarden_navigation_find_the_tools_option_and_select_import_data - .toAnnotatedString() - val instruction2 = R.string.fill_out_the_form_and_import_your_saved_password_file - .toAnnotatedString() - val instruction3 = R.string.select_import_data_in_the_web_app_then_done_to_finish_syncing - .toAnnotatedString() - val instruction4 = R.string.for_your_security_be_sure_to_delete_your_saved_password_file - .toAnnotatedString() + val instruction1 = annotatedStringResource( + id = R.string.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, + ) + val instruction3 = annotatedStringResource( + id = R.string.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, + ) ImportLoginsInstructionStep( stepText = stringResource(R.string.step_3_of_3), stepTitle = stringResource(R.string.import_logins_to_bitwarden), 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 4101a5df61..caa26e1ed1 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 @@ -19,6 +19,7 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.withStyle import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import com.bitwarden.ui.platform.base.util.annotatedStringResource import com.bitwarden.ui.platform.base.util.standardHorizontalMargin import com.bitwarden.ui.platform.base.util.toAnnotatedString import com.bitwarden.ui.platform.theme.BitwardenTheme @@ -66,10 +67,10 @@ fun ImportLoginsInstructionStep( ) Spacer(Modifier.height(24.dp)) Text( - text = R.string.need_help_check_out_import_help - .toAnnotatedString { - onHelpClick() - }, + text = annotatedStringResource( + id = R.string.need_help_check_out_import_help, + onAnnotationClick = { onHelpClick() }, + ), style = BitwardenTheme.typography.bodySmall, color = BitwardenTheme.colorScheme.text.secondary, modifier = Modifier.standardHorizontalMargin(), 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 ca65371750..520c142e3e 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 @@ -18,10 +18,10 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import com.bitwarden.ui.platform.base.util.cardStyle +import com.bitwarden.ui.platform.components.button.BitwardenStandardIconButton 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.button.BitwardenStandardIconButton import com.x8bit.bitwarden.ui.platform.components.button.BitwardenTextButton import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenTwoButtonDialog 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 d48c1a3392..6dd0da4f07 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 @@ -19,10 +19,10 @@ 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.bitwarden.ui.platform.components.button.BitwardenStandardIconButton 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.button.BitwardenStandardIconButton 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 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 5012d355b5..0182fe98b4 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 @@ -20,10 +20,10 @@ 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.bitwarden.ui.platform.components.button.BitwardenStandardIconButton 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.button.BitwardenStandardIconButton 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.model.IconData 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 a160ac4d8d..a55fdbdc0b 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 @@ -20,10 +20,10 @@ 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.bitwarden.ui.platform.components.button.BitwardenStandardIconButton 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.button.BitwardenStandardIconButton 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 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 2555850f02..ed572dd657 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 @@ -22,11 +22,13 @@ import androidx.core.net.toUri import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.bitwarden.ui.platform.base.util.EventsEffect +import com.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar +import com.bitwarden.ui.platform.components.appbar.action.BitwardenOverflowActionItem +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.x8bit.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar -import com.x8bit.bitwarden.ui.platform.components.appbar.action.BitwardenOverflowActionItem -import com.x8bit.bitwarden.ui.platform.components.appbar.action.OverflowMenuItemData import com.x8bit.bitwarden.ui.platform.components.button.BitwardenTextButton import com.x8bit.bitwarden.ui.platform.components.content.BitwardenErrorContent import com.x8bit.bitwarden.ui.platform.components.content.BitwardenLoadingContent @@ -34,7 +36,6 @@ 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 import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenTwoButtonDialog -import com.x8bit.bitwarden.ui.platform.components.fab.BitwardenFloatingActionButton import com.x8bit.bitwarden.ui.platform.components.scaffold.BitwardenScaffold import com.x8bit.bitwarden.ui.platform.composition.LocalIntentManager import com.x8bit.bitwarden.ui.platform.manager.intent.IntentManager @@ -160,7 +161,7 @@ fun VaultItemScreen( BitwardenTopAppBar( title = state.title(), scrollBehavior = scrollBehavior, - navigationIcon = rememberVectorPainter(id = R.drawable.ic_close), + navigationIcon = rememberVectorPainter(id = BitwardenDrawable.ic_close), navigationIconContentDescription = stringResource(id = R.string.close), onNavigationIconClick = remember(viewModel) { { viewModel.trySendAction(VaultItemAction.Common.CloseClick) } @@ -180,6 +181,7 @@ fun VaultItemScreen( ) } BitwardenOverflowActionItem( + contentDescription = stringResource(R.string.more), menuItemDataList = persistentListOfNotNull( OverflowMenuItemData( text = stringResource(id = R.string.attachments), 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 1f21a8c3cb..a787cfa202 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 @@ -22,10 +22,10 @@ import androidx.compose.ui.semantics.semantics 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.button.BitwardenStandardIconButton 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.button.BitwardenStandardIconButton 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.model.IconData 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 6cc6a07faa..215df676c2 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 @@ -19,10 +19,10 @@ 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.bitwarden.ui.platform.components.button.BitwardenStandardIconButton 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.button.BitwardenStandardIconButton 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 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 d849b74b9a..29e5431c9e 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 @@ -138,8 +138,18 @@ class VaultItemViewModel @Inject constructor( ) { cipherView.permissions?.delete == true } else { + val needsManagePermission = cipherView + ?.organizationId + ?.let { orgId -> + userState + ?.activeAccount + ?.organizations + ?.firstOrNull { it.id == orgId } + ?.limitItemDeletion + } collectionsState.data.hasDeletePermissionInAtLeastOneCollection( collectionIds = cipherView?.collectionIds, + needsManagePermission = needsManagePermission == true, ) } 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 5192b7d9fb..22fd83f10a 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 @@ -4,10 +4,10 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.platform.testTag 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.util.asText import com.x8bit.bitwarden.R -import com.x8bit.bitwarden.ui.platform.components.button.BitwardenStandardIconButton 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.model.IconData 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 f46c7f2ea8..a98c3d39c4 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 @@ -28,6 +28,7 @@ import com.x8bit.bitwarden.ui.vault.model.VaultLinkedFieldType import com.x8bit.bitwarden.ui.vault.model.findVaultCardBrandWithNameOrNull import kotlinx.collections.immutable.ImmutableList import java.time.Clock +import java.util.Locale private const val LAST_UPDATED_DATE_TIME_PATTERN: String = "M/d/yy hh:mm a" private const val FIDO2_CREDENTIAL_CREATION_DATE_PATTERN: String = "M/d/yy" @@ -332,7 +333,9 @@ private val IdentityView.identityName: String? get() = listOfNotNull( title ?.lowercase() - ?.capitalize(), + ?.replaceFirstChar { + if (it.isLowerCase()) it.titlecase(Locale.getDefault()) else it.toString() + }, firstName, middleName, lastName, 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 1131adcda1..7ce0c3dadc 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 @@ -21,17 +21,18 @@ import androidx.core.net.toUri import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.bitwarden.ui.platform.base.util.EventsEffect +import com.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar +import com.bitwarden.ui.platform.components.appbar.NavigationIcon +import com.bitwarden.ui.platform.components.appbar.action.BitwardenOverflowActionItem +import com.bitwarden.ui.platform.components.appbar.action.BitwardenSearchActionItem +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.util.Text 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 -import com.x8bit.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar -import com.x8bit.bitwarden.ui.platform.components.appbar.NavigationIcon -import com.x8bit.bitwarden.ui.platform.components.appbar.action.BitwardenOverflowActionItem -import com.x8bit.bitwarden.ui.platform.components.appbar.action.BitwardenSearchActionItem -import com.x8bit.bitwarden.ui.platform.components.appbar.action.OverflowMenuItemData 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 @@ -39,7 +40,6 @@ import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenLoadingDialog import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenMasterPasswordDialog import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenOverwritePasskeyConfirmationDialog import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenPinDialog -import com.x8bit.bitwarden.ui.platform.components.fab.BitwardenFloatingActionButton import com.x8bit.bitwarden.ui.platform.components.model.BitwardenPullToRefreshState import com.x8bit.bitwarden.ui.platform.components.model.rememberBitwardenPullToRefreshState import com.x8bit.bitwarden.ui.platform.components.scaffold.BitwardenScaffold @@ -476,6 +476,7 @@ private fun VaultItemListingScaffold( ) if (state.shouldShowOverflowMenu) { BitwardenOverflowActionItem( + contentDescription = stringResource(R.string.more), menuItemDataList = persistentListOf( OverflowMenuItemData( text = stringResource(id = R.string.sync), 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 a27f43bdb5..3268b31170 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 @@ -34,11 +34,12 @@ import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.bitwarden.ui.platform.base.util.EventsEffect import com.bitwarden.ui.platform.base.util.standardHorizontalMargin +import com.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar 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.theme.BitwardenTheme import com.x8bit.bitwarden.R -import com.x8bit.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar import com.x8bit.bitwarden.ui.platform.components.button.BitwardenFilledButton import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenBasicDialog import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenTwoButtonDialog @@ -130,7 +131,7 @@ fun ManualCodeEntryScreen( topBar = { BitwardenTopAppBar( title = stringResource(id = R.string.authenticator_key_scanner), - navigationIcon = rememberVectorPainter(id = R.drawable.ic_close), + navigationIcon = rememberVectorPainter(id = BitwardenDrawable.ic_close), navigationIconContentDescription = stringResource(id = R.string.close), onNavigationIconClick = remember(viewModel) { { viewModel.trySendAction(ManualCodeEntryAction.CloseClick) } 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 d0a13513ea..2cfe1b7925 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 @@ -16,9 +16,10 @@ import androidx.compose.ui.res.stringResource import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle 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.x8bit.bitwarden.R -import com.x8bit.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar import com.x8bit.bitwarden.ui.platform.components.button.BitwardenTextButton import com.x8bit.bitwarden.ui.platform.components.content.BitwardenErrorContent import com.x8bit.bitwarden.ui.platform.components.content.BitwardenLoadingContent @@ -102,7 +103,7 @@ private fun VaultMoveToOrganizationScaffold( BitwardenTopAppBar( title = state.appBarText(), scrollBehavior = scrollBehavior, - navigationIcon = rememberVectorPainter(id = R.drawable.ic_close), + navigationIcon = rememberVectorPainter(id = BitwardenDrawable.ic_close), navigationIconContentDescription = stringResource(id = R.string.close), onNavigationIconClick = closeClick, actions = { 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 d5cf814b6b..2dfc0330d0 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 @@ -52,15 +52,16 @@ import androidx.core.content.ContextCompat import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.LocalLifecycleOwner import com.bitwarden.ui.platform.base.util.EventsEffect -import com.bitwarden.ui.platform.base.util.toAnnotatedString +import com.bitwarden.ui.platform.base.util.annotatedStringResource +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.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.appbar.BitwardenTopAppBar 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 @@ -114,7 +115,7 @@ fun QrCodeScanScreen( topBar = { BitwardenTopAppBar( title = stringResource(id = R.string.scan_qr_code), - navigationIcon = rememberVectorPainter(id = R.drawable.ic_close), + navigationIcon = rememberVectorPainter(id = BitwardenDrawable.ic_close), navigationIconContentDescription = stringResource(id = R.string.close), onNavigationIconClick = remember(viewModel) { { viewModel.trySendAction(QrCodeScanAction.CloseClick) } @@ -411,13 +412,15 @@ private fun EnterKeyManuallyText( modifier: Modifier = Modifier, ) { val enterKeyManuallyString = stringResource(R.string.enter_key_manually) - val annotatedLinkString = R.string.cannot_scan_qr_code_enter_key_manually.toAnnotatedString { - when (it) { - "enterKeyManually" -> onEnterKeyManuallyClick() - } - } Text( - text = annotatedLinkString, + text = annotatedStringResource( + id = R.string.cannot_scan_qr_code_enter_key_manually, + onAnnotationClick = { + when (it) { + "enterKeyManually" -> onEnterKeyManuallyClick() + } + }, + ), style = BitwardenTheme.typography.bodySmall, color = Color.White, textAlign = TextAlign.Center, diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/util/CollectionViewExtensions.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/util/CollectionViewExtensions.kt index 72bd105d5e..9e4c18374d 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/util/CollectionViewExtensions.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/util/CollectionViewExtensions.kt @@ -93,18 +93,28 @@ fun String.toCollectionDisplayName(list: List): String { /** * Checks if the user has delete permission in at least one collection. * - * Deletion is allowed when the item is in any collection that the user has "manage" permission for. + * Deletion is allowed when the item is in any collection that the user has "manage" permission for + * if [needsManagePermission] is true. Otherwise, deletion is allowed when the item is in any with + * manage or edit permission. */ fun List?.hasDeletePermissionInAtLeastOneCollection( collectionIds: List?, + needsManagePermission: Boolean = false, ): Boolean { if (this.isNullOrEmpty() || collectionIds.isNullOrEmpty()) return true - return this - .any { collectionView -> - collectionIds - .contains(collectionView.id) - .let { isInCollection -> isInCollection && collectionView.manage } + + val collectionViews = this.filter { it.id in collectionIds } + return if (collectionViews.isEmpty()) { + false + } else if (needsManagePermission) { + collectionViews.any { it.manage } + } else { + collectionViews.any { + it.manage || + it.permission == CollectionPermission.EDIT || + it.permission == CollectionPermission.EDIT_EXCEPT_PASSWORD } + } } /** 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 ccfbd64fbf..557c059848 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 @@ -26,9 +26,9 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp 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.theme.BitwardenTheme import com.x8bit.bitwarden.R -import com.x8bit.bitwarden.ui.platform.components.button.BitwardenStandardIconButton 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 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 6a871f50e2..e327f05801 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 @@ -31,15 +31,17 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.bitwarden.ui.platform.base.util.EventsEffect import com.bitwarden.ui.platform.base.util.LifecycleEventEffect import com.bitwarden.ui.platform.base.util.standardHorizontalMargin +import com.bitwarden.ui.platform.components.appbar.BitwardenMediumTopAppBar +import com.bitwarden.ui.platform.components.appbar.action.BitwardenOverflowActionItem +import com.bitwarden.ui.platform.components.appbar.action.BitwardenSearchActionItem +import com.bitwarden.ui.platform.components.appbar.model.OverflowMenuItemData +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.x8bit.bitwarden.R 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.animation.AnimateNullableContentVisibility -import com.x8bit.bitwarden.ui.platform.components.appbar.BitwardenMediumTopAppBar -import com.x8bit.bitwarden.ui.platform.components.appbar.action.BitwardenOverflowActionItem -import com.x8bit.bitwarden.ui.platform.components.appbar.action.BitwardenSearchActionItem -import com.x8bit.bitwarden.ui.platform.components.appbar.action.OverflowMenuItemData 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.content.BitwardenErrorContent @@ -48,9 +50,7 @@ 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 import com.x8bit.bitwarden.ui.platform.components.dialog.BitwardenTwoButtonDialog -import com.x8bit.bitwarden.ui.platform.components.fab.BitwardenFloatingActionButton import com.x8bit.bitwarden.ui.platform.components.model.BitwardenPullToRefreshState -import com.x8bit.bitwarden.ui.platform.components.model.TopAppBarDividerStyle import com.x8bit.bitwarden.ui.platform.components.model.rememberBitwardenPullToRefreshState import com.x8bit.bitwarden.ui.platform.components.scaffold.BitwardenScaffold import com.x8bit.bitwarden.ui.platform.components.snackbar.BitwardenSnackbar @@ -280,6 +280,7 @@ private fun VaultScreenScaffold( onClick = vaultHandlers.searchIconClickAction, ) BitwardenOverflowActionItem( + contentDescription = stringResource(R.string.more), menuItemDataList = persistentListOf( OverflowMenuItemData( text = stringResource(id = R.string.sync), 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 4e65eb6ecd..e3f997d884 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 @@ -16,10 +16,10 @@ import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.bitwarden.ui.platform.base.util.cardStyle +import com.bitwarden.ui.platform.components.button.BitwardenStandardIconButton 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.button.BitwardenStandardIconButton import com.x8bit.bitwarden.ui.platform.components.icon.BitwardenIcon import com.x8bit.bitwarden.ui.platform.components.indicator.BitwardenCircularCountdownIndicator import com.x8bit.bitwarden.ui.platform.components.model.IconData 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 a4fa46b694..bb96d87da5 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 @@ -23,15 +23,15 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.bitwarden.ui.platform.base.util.EventsEffect import com.bitwarden.ui.platform.base.util.standardHorizontalMargin import com.bitwarden.ui.platform.base.util.toListItemCardStyle +import com.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar +import com.bitwarden.ui.platform.components.appbar.action.BitwardenOverflowActionItem +import com.bitwarden.ui.platform.components.appbar.action.BitwardenSearchActionItem +import com.bitwarden.ui.platform.components.appbar.model.OverflowMenuItemData import com.bitwarden.ui.platform.components.util.rememberVectorPainter 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 -import com.x8bit.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar -import com.x8bit.bitwarden.ui.platform.components.appbar.action.BitwardenOverflowActionItem -import com.x8bit.bitwarden.ui.platform.components.appbar.action.BitwardenSearchActionItem -import com.x8bit.bitwarden.ui.platform.components.appbar.action.OverflowMenuItemData 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.BitwardenLoadingDialog @@ -111,6 +111,7 @@ fun VerificationCodeScreen( onClick = verificationCodeHandler.searchIconClick, ) BitwardenOverflowActionItem( + contentDescription = stringResource(R.string.more), menuItemDataList = persistentListOf( OverflowMenuItemData( text = stringResource(id = R.string.sync), diff --git a/app/src/main/res/values-af-rZA/strings.xml b/app/src/main/res/values-af-rZA/strings.xml index a9ea5741a7..3695b8be65 100644 --- a/app/src/main/res/values-af-rZA/strings.xml +++ b/app/src/main/res/values-af-rZA/strings.xml @@ -642,7 +642,10 @@ Skandering gebeur outomaties. Send-skakel Deursoek Sends Wysig Send - Voeg Send toe + Edit file Send + Edit text Send + New file Send + New text Send Is u seker u wil hierdie Send skrap? Send is geskrap. Send bygewerk. @@ -990,11 +993,9 @@ Wil u na die rekening omskakel? User verification Create account on Create account on: - Follow the instructions in the email sent to %1$s to continue creating your account. 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 - Set password Unsubscribe Check your email Open email app @@ -1260,7 +1261,7 @@ Wil u na die rekening omskakel? Log deleted App settings Replace existing certificate? - A certificate with this alias \"%s\" already exists. Do you want to replace it?\nReplace the certificate may impact your connection to any environments currently using it. + 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 diff --git a/app/src/main/res/values-ar-rSA/strings.xml b/app/src/main/res/values-ar-rSA/strings.xml index 4187d3a798..6e65269706 100644 --- a/app/src/main/res/values-ar-rSA/strings.xml +++ b/app/src/main/res/values-ar-rSA/strings.xml @@ -642,7 +642,10 @@ إرسال رابط بحث عن الإرسالات عدّل الإرسال - إضافة إرسال + Edit file Send + Edit text Send + New file Send + New text Send هل أنت متأكد من أنك تريد حذف هذا الإرسال؟ تم حذف الإرسال. تم تحديث الإرسال. @@ -990,11 +993,9 @@ التحقق من المستخدم إنشاء حساب في إنشاء حساب على: - اتبع الإرشادات في البريد الإلكتروني المرسلة إلى %1$s لمواصلة إنشاء حسابك. أرسلنا رسالة بريد إلكتروني إلى %1$s. من خلال المتابعة، أنت توافق على شروط الخدمة وسياسة الخصوصية بتفعيل هذا المفتاح، فإنك توافق على شروط الخدمة و سياسة الخصوصية - تعيين كلمة مرور إلغاء الاشتراك تحقق من بريدك الإلكتروني افتح تطبيق البريد الإلكتروني @@ -1256,21 +1257,21 @@ تشغيل مسجل الطيران مسجل الطيران سوف يكون نشطاً حتى %1$s عند %2$s. العودة إلى الإعدادات لإلغاء تنشيط الآن. اذهب إلى الإعدادات - All logs deleted - Log deleted - App settings - Replace existing certificate? - A certificate with this alias \"%s\" already exists. Do you want to replace it?\nReplace 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 - Dynamic colors - Apply dynamic colors based on your wallpaper - Dynamic colors uses the system colors and may not meet all accessibility guidelines. + تم حذف جميع السجلات + تم حذف السجل + إعدادات التطبيق + استبدال الشهادة الحالية؟ + توجد شهادة بهذا الاسم المستعار \"%s\" موجودة بالفعل. هل تريد استبدالها؟ \nقد يؤثر استبدال الشهادة على اتصالك بأي بيئات تستخدمها حالياً. + استبدال الشهادة + غير قادر على قراءة الشهادة. + لا يمكن حذف حسابك + لا يمكن إكمال هذا الإجراء لأن حسابك مملوك من قبل منظمة. اتصل بمسؤول مؤسستك للحصول على تفاصيل إضافية. + سيتم حذف هذا الحساب قريباً. سجل الدخول على %1$s لمتابعة استخدام Bitwarden. + عرض مِلَفّ الإرسال + عرض إرسال النص + حذف الإرسال + مفقود أرسل إعادة مزامنة المخزن الخاص بك + الألوان الديناميكية + تطبيق الألوان الديناميكية استناداً إلى الخلفية الخاصة بك + الألوان الديناميكية تستخدم ألوان النظام وقد لا تفي بجميع المبادئ التوجيهية المتعلقة بإمكانية الوصول. diff --git a/app/src/main/res/values-az-rAZ/strings.xml b/app/src/main/res/values-az-rAZ/strings.xml index a04b3d5e08..7731402b45 100644 --- a/app/src/main/res/values-az-rAZ/strings.xml +++ b/app/src/main/res/values-az-rAZ/strings.xml @@ -642,7 +642,10 @@ Skan prosesi avtomatik baş tutacaq. \"Send\" bağlantısı \"Send\"ləri axtar \"Send\"ə düzəliş et - \"Send\" əlavə et + Send faylına düzəliş et + Send mətninə düzəliş et + Yeni Send faylı + Yeni Send mətni Bu \"Send\"i silmək istədiyinizə əminsiniz? \"Send\" silindi. \"Send\" güncəlləndi. @@ -989,11 +992,9 @@ Bu hesaba keçmək istəyirsiniz? İstifadəçi doğrulama Hesab yarat Hesab yarat: - Hesabınızı yaratmağa davam etmək üçün %1$s ünvanına göndərilən e-poçtdakı təlimatları izləyin. %1$s ünvanına bir e-poçt göndərdik. Davam edərək, Xidmət Şərtləri və Gizlilik Siyasəti ilə razılaşırsınız Bu açarı aktivləşdirərək, Xidmət Şərtləri və Gizlilik Siyasəti ilə razılaşırsınız - Parol ayarla Abunəlikdən çıx E-poçtunuzu yoxlayın E-poçt tətbiqini aç diff --git a/app/src/main/res/values-be-rBY/strings.xml b/app/src/main/res/values-be-rBY/strings.xml index 5967de0e29..556bd4a763 100644 --- a/app/src/main/res/values-be-rBY/strings.xml +++ b/app/src/main/res/values-be-rBY/strings.xml @@ -641,7 +641,10 @@ Спасылка на Send Пошук у Send\'ах Рэдагаваць Send - Дадаць Send + Edit file Send + Edit text Send + New file Send + New text Send Вы сапраўды хочаце выдаліць гэты Send? Send быў выдалены. Send абноўлены. @@ -989,11 +992,9 @@ User verification Create account on Create account on: - Follow the instructions in the email sent to %1$s to continue creating your account. 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 - Set password Unsubscribe Check your email Open email app @@ -1259,7 +1260,7 @@ Log deleted App settings Replace existing certificate? - A certificate with this alias \"%s\" already exists. Do you want to replace it?\nReplace the certificate may impact your connection to any environments currently using it. + 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 diff --git a/app/src/main/res/values-bg-rBG/strings.xml b/app/src/main/res/values-bg-rBG/strings.xml index 0a8db8be8e..0ab950fa8d 100644 --- a/app/src/main/res/values-bg-rBG/strings.xml +++ b/app/src/main/res/values-bg-rBG/strings.xml @@ -642,7 +642,10 @@ Изпращане на връзката Търсене в изпратените Редактиране на изпращане - Добавяне на изпращане + Редактиране на файловото Изпращане + Редактиране на текстовото Изпращане + Ново файлово Изпращане + Ново текстово Изпращане Сигурни ли сте, че искате да изтриете това изпращане? Изпратеното е изтрито. Изпратеното е редактирано. @@ -990,11 +993,9 @@ Потвърждение на потребителя Създаване на регистрация в Създаване на регистрация в: - Следвайте инструкциите в е-писмото изпратено до %1$s, за да продължите с регистрацията. Изпратихме е-писмо до %1$s. Ако продължите, Вие се съгласявате с Условията за ползване и Политиката за поверителност Активирайки това, Вие се съгласявате с Условията за ползване и Политиката за поверителност - Задайте парола Отписване Проверете е-пощата си Отваряне на приложението за е-поща diff --git a/app/src/main/res/values-bn-rBD/strings.xml b/app/src/main/res/values-bn-rBD/strings.xml index 05bb6a5251..5e77e0e45f 100644 --- a/app/src/main/res/values-bn-rBD/strings.xml +++ b/app/src/main/res/values-bn-rBD/strings.xml @@ -642,7 +642,10 @@ Scanning will happen automatically. Send link Search Sends Edit Send - New 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 saved @@ -990,11 +993,9 @@ Do you want to switch to this account? User verification Create account on Create account on: - Follow the instructions in the email sent to %1$s to continue creating your account. 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 - Set password Unsubscribe Check your email Open email app @@ -1260,7 +1261,7 @@ Do you want to switch to this account? Log deleted App settings Replace existing certificate? - A certificate with this alias \"%s\" already exists. Do you want to replace it?\nReplace the certificate may impact your connection to any environments currently using it. + 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 diff --git a/app/src/main/res/values-bs-rBA/strings.xml b/app/src/main/res/values-bs-rBA/strings.xml index 78fdbc3f6c..418725cd4d 100644 --- a/app/src/main/res/values-bs-rBA/strings.xml +++ b/app/src/main/res/values-bs-rBA/strings.xml @@ -642,7 +642,10 @@ Skeniranje će biti izvršeno automatski. Link od Send-a Pretraži Send-ove Uredi Send - Dodaj Send + Edit file Send + Edit text Send + New file Send + New text Send Sigurno želiš izbrisati ovaj Send? Send izbrisan. Send ažuriran. @@ -989,11 +992,9 @@ Skeniranje će biti izvršeno automatski. User verification Create account on Create account on: - Follow the instructions in the email sent to %1$s to continue creating your account. 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 - Set password Unsubscribe Check your email Open email app @@ -1259,7 +1260,7 @@ Skeniranje će biti izvršeno automatski. Log deleted App settings Replace existing certificate? - A certificate with this alias \"%s\" already exists. Do you want to replace it?\nReplace the certificate may impact your connection to any environments currently using it. + 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 diff --git a/app/src/main/res/values-ca-rES/strings.xml b/app/src/main/res/values-ca-rES/strings.xml index 78e4c5510c..9d474250e6 100644 --- a/app/src/main/res/values-ca-rES/strings.xml +++ b/app/src/main/res/values-ca-rES/strings.xml @@ -642,7 +642,10 @@ L\'escaneig es farà automàticament. Enllaç Send Cerca Sends Edita Send - Afig Send + Edit file Send + Edit text Send + New file Send + New text Send Esteu segur que voleu suprimir aquest Send? S\'ha suprimit el Send. S\'ha guardat el Send @@ -990,11 +993,9 @@ Voleu canviar a aquest compte? Verificació d\'usuari Crea compte en Crea compte en: - Follow the instructions in the email sent to %1$s to continue creating your account. 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 - Estableix contrasenya Anul·la subscripció Comprova el correu Obri l\'aplicació de correu @@ -1260,7 +1261,7 @@ Voleu canviar a aquest compte? Log deleted App settings Replace existing certificate? - A certificate with this alias \"%s\" already exists. Do you want to replace it?\nReplace the certificate may impact your connection to any environments currently using it. + 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 diff --git a/app/src/main/res/values-cs-rCZ/strings.xml b/app/src/main/res/values-cs-rCZ/strings.xml index 49ee597a91..479ba260e4 100644 --- a/app/src/main/res/values-cs-rCZ/strings.xml +++ b/app/src/main/res/values-cs-rCZ/strings.xml @@ -627,7 +627,7 @@ Načtení proběhne automaticky. Maximální počet přístupů Je-li nastaveno, uživatelé již nebudou mít přístup k tomuto Send, jakmile bude dosaženo maximálního počtu přístupů. Dosažen maximální počet přístupů - Aktuální počet přístupů + Aktuální počet přístupů: %s Nové heslo Vyžadovat totot heslo pro přístup k tomuto Send. Odebrat heslo @@ -642,7 +642,10 @@ Načtení proběhne automaticky. Odkaz tohoto Send Prohledat Sends Upravit Send - Nový Send + Upravit soubor ze Send + Upravit text ze Send + Odeslat Send se soubory + Odeslat textový Send Opravdu chcete smazat tento Send? Send byl smazán Send byl uložen @@ -989,11 +992,9 @@ Chcete se přepnout na tento účet? Ověření uživatele Vytvořit účet na Vytvořit účet na: - Postupujte podle instrukcí zaslaných na e-mail %1$s, abyste mohli pokračovat ve vytváření účtu. Poslali jsme e-mail na %1$s. Pokračováním souhlasíte s Podmínkami služby a Zásadami ochrany osobních údajů Zapnutím tohoto spínače souhlasíte s Podmínkami služby a Zásadami ochrany osobních údajů - Nastavit heslo Odhlásit odběr Zkontrolujte Váš e-mail Otevřít e-mailovou aplikaci diff --git a/app/src/main/res/values-cy-rGB/strings.xml b/app/src/main/res/values-cy-rGB/strings.xml index 1352228049..573a05715d 100644 --- a/app/src/main/res/values-cy-rGB/strings.xml +++ b/app/src/main/res/values-cy-rGB/strings.xml @@ -642,7 +642,10 @@ Scanning will happen automatically. Send link Search Sends Edit Send - Send newydd + Edit file Send + Edit text Send + New file Send + New text Send Are you sure you want to delete this Send? Send deleted Send saved @@ -990,11 +993,9 @@ Do you want to switch to this account? User verification Create account on Create account on: - Follow the instructions in the email sent to %1$s to continue creating your account. 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 - Set password Unsubscribe Check your email Open email app @@ -1260,7 +1261,7 @@ Do you want to switch to this account? Log deleted App settings Replace existing certificate? - A certificate with this alias \"%s\" already exists. Do you want to replace it?\nReplace the certificate may impact your connection to any environments currently using it. + 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 diff --git a/app/src/main/res/values-da-rDK/strings.xml b/app/src/main/res/values-da-rDK/strings.xml index 4dfd2b68aa..2cf83708d3 100644 --- a/app/src/main/res/values-da-rDK/strings.xml +++ b/app/src/main/res/values-da-rDK/strings.xml @@ -642,7 +642,10 @@ Skanning vil ske automatisk. Send link Søg i Sends Redigér Send - Ny Send + Edit file Send + Edit text Send + New file Send + New text Send Sikker på, at denne Send skal slettes? Send slettet Send gemt @@ -990,11 +993,9 @@ Skift til denne konto? Brugerbekræftelse Opret konto på Opret konto på: - Følg vejledningen i e-mailen sendt til %1$s for at fortsætte med kontooprettelsen. Vi har sendt en e-mail til %1$s. Ved at fortsætte, accepterer du Vilkår for Tjeneste og Fortrolighedspolitik By activating this switch, you agree to the Terms of Service and Privacy Policy - Opsæt adgangskode Afmeld Tjek indbakken Åbn e-mail app @@ -1260,7 +1261,7 @@ Skift til denne konto? Log deleted App settings Replace existing certificate? - A certificate with this alias \"%s\" already exists. Do you want to replace it?\nReplace the certificate may impact your connection to any environments currently using it. + 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 diff --git a/app/src/main/res/values-de-rDE/strings.xml b/app/src/main/res/values-de-rDE/strings.xml index 62150d5838..e803f9e4fc 100644 --- a/app/src/main/res/values-de-rDE/strings.xml +++ b/app/src/main/res/values-de-rDE/strings.xml @@ -627,7 +627,7 @@ Das Scannen erfolgt automatisch. Maximale Zugriffsanzahl Falls aktiviert, können Benutzer nicht mehr auf dieses Send zugreifen, sobald die maximale Zugriffsanzahl erreicht ist. Maximale Zugriffsanzahl erreicht - Aktuelle Zugriffsanzahl + Aktuelle Zugriffsanzahl: %s Neues Passwort Optional ein Passwort verlangen, damit Benutzer auf dieses Send zugreifen können. Passwort entfernen @@ -642,7 +642,10 @@ Das Scannen erfolgt automatisch. Send-Link Sends suchen Send bearbeiten - Neues Send + Datei-Send bearbeiten + Text-Send bearbeiten + Neues Datei-Send + Neues Text-Send Bist du sicher, dass du dieses Send löschen möchtest? Send gelöscht Send gespeichert @@ -989,11 +992,9 @@ Möchtest du zu diesem Konto wechseln? Benutzer-Verifizierung Konto erstellt am Konto erstellt am: - Folge den Anweisungen in der an %1$s gesendeten E-Mail, um mit der Erstellung deines Kontos fortzufahren. Wir haben eine E-Mail an %1$s gesendet. Wenn du fortfährst, stimmst du den Nutzungsbedingungen und der Datenschutzvereinbarung zu Durch Aktivieren dieses Schalters stimmst du den Nutzungsbedingungen und Datenschutzbestimmungen zu - Passwort festlegen Deabonnieren Überprüfe deine E-Mails E-Mail-App öffnen @@ -1071,9 +1072,9 @@ Möchtest du zu diesem Konto wechseln? Neuer Hinweis zum Master-Passwort Loslegen Speicher und schütze deine Daten - Der Tresor schützt mehr als nur Passwörter. Speicher hier sicher Zugangsdaten, Ausweise, Karten und Notizen. + Der Tresor schützt mehr als nur Passwörter. Speicher hier sicher Zugangsdaten, Identitäten, Karten und Notizen. Neue Zugangsdaten - Teile Dateien und Daten sicher mit jedem auf jeder Plattform. Deine Informationen bleiben End-zu-Ende-Verschlüsselt, während die Verbreitung begrenzt wird. + Teile Dateien und Daten sicher mit jedem auf jeder Plattform. Deine Informationen bleiben Ende-zu-Ende-verschlüsselt, während die Verbreitung begrenzt wird. Sensible Informationen sicher versenden Gespeicherte Zugangsdaten importieren Verwende einen Computer, um Zugangsdaten von einem bestehenden Passwort-Manager zu importieren @@ -1268,7 +1269,7 @@ Möchtest du zu diesem Konto wechseln? Datei-Send anzeigen Text-Send anzeigen Send löschen - Missing Send re-sync your vault + Fehlendes Send. Synchronisiere deinen Tresor erneut Dynamische Farben Dynamische Farben auf Basis deines Hintergrunds anwenden Dynamische Farben verwenden die Systemfarben und erfüllen möglicherweise nicht alle Richtlinien zur Barrierefreiheit. diff --git a/app/src/main/res/values-el-rGR/strings.xml b/app/src/main/res/values-el-rGR/strings.xml index b8a61f4b29..a06edeb51b 100644 --- a/app/src/main/res/values-el-rGR/strings.xml +++ b/app/src/main/res/values-el-rGR/strings.xml @@ -642,7 +642,10 @@ Σύνδεσμος Send Αναζήτηση Sends Επεξεργασία Send - Προσθήκη Send + Edit file Send + Edit text Send + New file Send + New text Send Είστε βέβαιοι ότι θέλετε να διαγράψετε το Send; Το send έχει διαγραφεί. Το send ενημερώθηκε. @@ -990,11 +993,9 @@ Επαλήθευση χρήστη Create account on Create account on: - Ακολουθήστε τις οδηγίες στο μήνυμα που στάλθηκε στο %1$s για να συνεχίσετε τη δημιουργία του λογαριασμού σας. Στείλαμε ένα email στο %1$s. Συνεχίζοντας, συμφωνείτε με τους Όρους Παροχής Υπηρεσιών και την Πολιτική Απορρήτου By activating this switch, you agree to the Terms of Service and Privacy Policy - Ορισμός κωδικού Ακύρωση συνδρομής Ελέγξτε το ηλ. ταχυδρομείο σας Άνοιγμα εφαρμογής ηλ. ταχυδρομείου @@ -1260,7 +1261,7 @@ Log deleted Ρυθμίσεις εφαρμογής Replace existing certificate? - A certificate with this alias \"%s\" already exists. Do you want to replace it?\nReplace the certificate may impact your connection to any environments currently using it. + 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. Αντικατάσταση πιστοποιητικού Unable to read certificate. Cannot delete your account diff --git a/app/src/main/res/values-en-rGB/strings.xml b/app/src/main/res/values-en-rGB/strings.xml index 0dd9cd02d6..c2528e27f2 100644 --- a/app/src/main/res/values-en-rGB/strings.xml +++ b/app/src/main/res/values-en-rGB/strings.xml @@ -642,7 +642,10 @@ Scanning will happen automatically. Send link Search Sends Edit Send - New 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 saved @@ -990,11 +993,9 @@ Do you want to switch to this account? User verification Create account on Create account on: - Follow the instructions in the email sent to %1$s to continue creating your account. 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 - Set password Unsubscribe Check your email Open email app diff --git a/app/src/main/res/values-en-rIN/strings.xml b/app/src/main/res/values-en-rIN/strings.xml index 0718d34134..237fcfd253 100644 --- a/app/src/main/res/values-en-rIN/strings.xml +++ b/app/src/main/res/values-en-rIN/strings.xml @@ -642,7 +642,10 @@ Scanning will happen automatically. Send link Search Sends Edit Send - Add Send + Edit file Send + Edit text Send + New file Send + New text Send Are you sure you want to delete this Send? Send has been deleted. Send updated. @@ -990,11 +993,9 @@ Do you want to switch to this account? User verification Create account on Create account on: - Follow the instructions in the email sent to %1$s to continue creating your account. 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 - Set password Unsubscribe Check your email Open email app diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml index e750a04c46..7f49c34e31 100644 --- a/app/src/main/res/values-es-rES/strings.xml +++ b/app/src/main/res/values-es-rES/strings.xml @@ -40,7 +40,7 @@ Contraseña maestra no válida. Inténtelo de nuevo. PIN no válido. Prueba de nuevo. Iniciar - Log in + Iniciar sesión Identificarse Cerrar sesión ¿Estás seguro de querer cerrar sesión? @@ -49,8 +49,8 @@ Cuenta ya añadida ¿Te gustaría cambiar a esa cuenta ahora? Contraseña maestra - Master password (required) - New master password (required) + Contraseña maestra (requerido) + Nueva contraseña maestra (requerido) Más Mi caja fuerte Autenticador @@ -59,7 +59,7 @@ "Send name (required)" No Notas - Private notes + Notas privadas Aceptar Contraseña Guardar @@ -73,7 +73,7 @@ Gracias Herramientas URI - Website (URI) + Página web (URI) Usar huella dactilar para desbloquear Usuario El campo %1$s es obligatorio. @@ -88,7 +88,7 @@ Si Cuenta ¡Tu nueva cuenta ha sido creada! Ahora puedes acceder. - Your new account has been created! + ¡Tu nueva cuenta ha sido creada! Añadir un elemento Extensión de Aplicación Utiliza el servicio de accesibilidad de Bitwarden para autorellenar entradas entre aplicaciones y sitios web. @@ -106,13 +106,13 @@ Cerrar Continuar Crear cuenta - Create an account + Crear una cuenta Creando cuenta... Editar elemento - Edit login - Edit card - Edit identity - Edit note + Editar inicio de sesión + Editar tarjeta + Editar identidad + Editar nota Edit passkey Habilitar sincronización automática Introduce el correo electrónico de tu cuenta para recibir la pista de tu contraseña maestra. @@ -127,7 +127,7 @@ Pulsa en el icono de Bitwarden del menú para iniciar la extensión. Para activar Bitwarden en Safari y otras aplicaciones, pulsa en el icono \"más\" de la última fila del menú. Favorito - Unfavorite + Eliminar favorito Huella dactilar Generar contraseña Obtener pista de la contraseña maestra @@ -146,7 +146,7 @@ Acción de tiempo de espera de la caja fuerte Cerrar sesión quitará todo el acceso a su caja fuerte y requiere autenticación en línea después del tiempo de espera. ¿Está seguro de que quiere usar este ajuste? Iniciando sesión... - Log in to Bitwarden + Iniciar sesión en Bitwarden Gestionar La confirmación de la contraseña no es correcta. La contraseña maestra es la clave que utilizas para acceder a tu caja fuerte. Es muy importante que no olvides tu contraseña maestra. No hay forma de recuperarla si la olvidas. @@ -162,19 +162,19 @@ No hay favoritos en tu caja fuerte. No hay elementos en tu caja fuerte. No hay elementos en tu caja fuerte para este sitio web o aplicación. Pulsa para añadir uno. - 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 + No hay tarjetas en tu caja fuerte. + Nueva tarjeta + No hay inicios de sesión en tu caja fuerte. + No hay identidades en tu caja fuerte. + Nueva identidad + No hay notas en tu caja fuerte. + Nueva nota New passkey - New item - New SSH key + Nuevo elemento + Nueva clave SSH There are no text Sends in your vault. There are no file Sends in your vault. - There are no SSH keys in your vault. + No hay claves SSH en tu caja fuerte. New text Send New file Send No Username @@ -201,7 +201,7 @@ Establecer PIN Introduce un PIN de 4 dígitos para desbloquear la aplicación con él. Información del elemento - Item details + Detalles del elemento Elemento guardado Enviando... Sincronizando... @@ -215,10 +215,10 @@ Validando Código de verificación Ver elemento - View login - View card - View identity - View note + Ver inicio de sesión + Ver tarjeta + Ver identidad + Ver nota View passkey Caja fuerte web de Bitwarden ¿Has perdido la autenticación en dos pasos? @@ -257,8 +257,8 @@ Inicio de sesión no disponible Esta cuenta tiene configuración de inicio de sesión en dos pasos, sin embargo, ninguno de los proveedores de dos pasos configurados son soportados en este dispositivo. Por favor, utilice un dispositivo soportado y/o añada proveedores adicionales que sean mejor soportados entre los dispositivos (como una aplicación de autenticación). Código de recuperación - Remember - Remember email + Recordar + Recordar correo electrónico Reenviar código de verificación por correo electrónico Opciones de inicio de sesión en dos pasos Utilizar otro método de autenticación en dos pasos @@ -300,7 +300,7 @@ El escaneo se realizará automáticamente. URL del servidor de la API Client certificate (mTLS) Certificate used for client authentication. - Use system certificate + Usar certificado del sistema Entorno personalizado Para usuarios avanzados. Puedes especificar la URL base de cada servicio de forma independiente. Las URLs del entorno han sido guardadas. @@ -392,7 +392,7 @@ El escaneo se realizará automáticamente. ¿Que tipo de campo personalizado quieres añadir? Eliminar Nueva URI - Add website + Añadir página web URI %1$s Dominio base Por defecto @@ -427,11 +427,11 @@ El escaneo se realizará automáticamente. Dirección de correo electrónico inválida. Tarjetas Identidades - Identification + Identificación Inicios de sesión Notas seguras - Personal Details - Contact Info + Datos Personales + Información de Contacto Todos los elementos URIs Comprobando contraseña... @@ -606,7 +606,7 @@ El escaneo se realizará automáticamente. Todos los Sends Sends Texto - Text to share + Texto a compartir Texto Al acceder a este Envío, ocultar este texto por defecto Archivo @@ -621,7 +621,7 @@ El escaneo se realizará automáticamente. Eliminación pendiente Caducó Expires at %s - Expires tomorrow + Expira mañana Expires on %s Stops logging on %1$s at %2$s Número máximo de accesos @@ -642,7 +642,10 @@ El escaneo se realizará automáticamente. Enlace Send Buscar Sends Editar Send - Nuevo Send + Edit file Send + Edit text Send + New file Send + New text Send ¿Seguro que quieres eliminar este Send? Send eliminado Send guardado @@ -777,7 +780,7 @@ seleccione Agregar TOTP para almacenar la clave de forma segura Alias de correo reenviado Palabra aleatoria Email (obligatorio) - domain name + nombre de dominio Nombre de dominio (requerido) API key Clave API (requerida) @@ -808,7 +811,7 @@ seleccione Agregar TOTP para almacenar la clave de forma segura Intento de inicio de sesión desde: %1$s ¿Desea cambiar a esta cuenta? - New to Bitwarden? + ¿Nuevo en Bitwarden? Obtener pista de contraseña maestra Iniciando sesión como %1$s en %2$s ¿No eres tú? @@ -854,7 +857,7 @@ seleccione Agregar TOTP para almacenar la clave de forma segura Región de datos Región Su contraseña maestra no cumple con una o más de las políticas de su organización. Para acceder a la caja fuerte, debe actualizar su contraseña maestra ahora. Proceder le desconectará de su sesión actual, requiriendo que vuelva a iniciar sesión. Las sesiones activas en otros dispositivos pueden seguir estando activas durante hasta una hora. - Current master password (required) + Contraseña maestra actual (requerido) Conectado Aprobar con mi otro dispositivo Solicitar aprobación del administrador @@ -981,7 +984,7 @@ seleccione Agregar TOTP para almacenar la clave de forma segura Confirm file password File password Password Protected - This password will be used to export and import this file + Esta contraseña se usará para exportar e importar este archivo Autofill suggestion Continue to complete WebAuthn verification. Launch WebAuthn @@ -989,18 +992,16 @@ seleccione Agregar TOTP para almacenar la clave de forma segura Self-hosted server URL Passkey operation failed because user could not be verified. User verification - Create account on - Create account on: - Follow the instructions in the email sent to %1$s to continue creating your account. - 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 - Set password + Crea una cuenta en + Crea una cuenta en: + Hemos enviado un correo electrónico a %1$s. + Al continuar, aceptas los Términos de Servicio y la Política de Privacidad + Al activar este interruptor, aceptas los Términos de Servicio y la Política de Privacidad Unsubscribe - Check your email - Open email app - Go back - Email verified + Comprueba tu correo electrónico + Abrir aplicación de correo electrónico + Volver + Correo electrónico verificado No email? Go back to edit your email address. Or log in, you may already have an account. Get emails from Bitwarden for announcements, advice, and research opportunities. Unsubscribe at any time. @@ -1019,19 +1020,19 @@ seleccione Agregar TOTP para almacenar la clave de forma segura A secure, memorable password The longer your password, the more difficult it is to hack. The minimum for account creation is 12 characters but if you do 14 characters, the time to crack your password would be centuries! The strongest passwords are usually: - 12 or more characters + 12 o más caracteres Random and complex, using numbers and special characters Totally different from your other passwords Use the generator to create a strong, unique password - Try it out - Account setup + Pruébalo + Configuración de la cuenta Set up unlock - Set up later + Configurar más tarde Set up unlock later? You can return to complete this step anytime from Account Security in Settings. - Confirm + Confirmar Set up biometrics or choose a PIN code to quickly access your vault and Autofill your logins. - Never lose access to your vault + Nunca pierdas acceso a tu caja fuerte 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 @@ -1039,22 +1040,22 @@ seleccione Agregar TOTP para almacenar la clave de forma segura Write your password down Be careful to keep your written password somewhere secret and safe. Prevent account lockout - Generate master password - Generate + Generar contraseña maestra + Generar 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) + Dirección de correo electrónico (requerido) "Select the link in the email to verify your email address and continue creating your account. " - Change email address - Next + Cambiar dirección de correo electrónico + Siguiente 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. + Elige tu contraseña maestra + Elige una contraseña fuerte y única para mantener tu información segura. %1$s characters - Expired link + Enlace expirado Please restart registration or try logging in. You may already have an account. Restart registration Authenticator Sync @@ -1062,7 +1063,7 @@ seleccione Agregar TOTP para almacenar la clave de forma segura 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 + Activar más tarde 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. @@ -1074,7 +1075,7 @@ seleccione Agregar TOTP para almacenar la clave de forma segura 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 + Nuevo inicio de sesión 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 @@ -1082,9 +1083,9 @@ seleccione Agregar TOTP para almacenar la clave de forma segura You can return to complete this step anytime in Vault Settings. Import logins later Import logins later? - Do you have a computer available? + ¿Tienes un ordenador disponible? The following instructions will guide you through importing logins from your desktop or laptop computer - Import Logins + Importar Inicios de Sesión 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. @@ -1092,14 +1093,14 @@ seleccione Agregar TOTP para almacenar la clave de forma segura 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 + Paso 1 de 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 + Paso 2 de 3 + Iniciar sesión en Bitwarden + Paso 3 de 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. @@ -1107,29 +1108,29 @@ seleccione Agregar TOTP para almacenar la clave de forma segura 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... + Sincronizando inicios de sesión... 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 + Autocompletar contraseñas 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 + Herramientas de Bitwarden Got it No logins were imported - Import error + Error de importación Verified SSO Domain Endpoint Logins imported Remember to delete your imported password file from your computer - SSH key - Public key - Private key - SSH keys - Copy public key + Clave SSH + Clave pública + Clave privada + Claves SSH + Copiar clave pública Copy fingerprint - Enable notifications + Habilitar notificaciones 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 @@ -1154,7 +1155,7 @@ seleccione Agregar TOTP para almacenar la clave de forma segura 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?" + "¿Necesitas inspiración?" "Check out the passphrase generator" Copied to clipboard. 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. @@ -1163,10 +1164,10 @@ seleccione Agregar TOTP para almacenar la clave de forma segura Login Credentials Autofill Options Use this button to generate a new unique password. - 1 OF 3 - 2 OF 3 + 1 DE 3 + 2 DE 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 + 3 DE 3 You must add a web address to use autofill to access this account. Mutual TLS Single tap passkey creation @@ -1218,10 +1219,10 @@ seleccione Agregar TOTP para almacenar la clave de forma segura Use Chrome autofill integration Use Chrome autofill integration (Beta) Improves login filling for supported websites on Chrome. Once enabled, you’ll be directed to Chrome settings to enable third-party autofill. - Show more + Mostrar más No folder - Show less - Add field + Mostrar menos + Añadir campo %s... Share error details Flight recorder @@ -1236,22 +1237,22 @@ seleccione Agregar TOTP para almacenar la clave de forma segura 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 + 1 hora + 8 horas + 24 horas + 1 semana + Eliminar todo + Compartir todo + No se puede compartir 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 + Eliminar registro + ¿Estás seguro de que realmente quieres eliminar este registro? + Eliminar registros Do you really want to delete all recorded logs? Confirm Key Connector domain Key Connector domain: - Organization: + Organización: 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 @@ -1261,7 +1262,7 @@ seleccione Agregar TOTP para almacenar la clave de forma segura Log deleted App settings Replace existing certificate? - A certificate with this alias \"%s\" already exists. Do you want to replace it?\nReplace the certificate may impact your connection to any environments currently using it. + 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 diff --git a/app/src/main/res/values-et-rEE/strings.xml b/app/src/main/res/values-et-rEE/strings.xml index e031379045..2bab228bfd 100644 --- a/app/src/main/res/values-et-rEE/strings.xml +++ b/app/src/main/res/values-et-rEE/strings.xml @@ -642,7 +642,10 @@ Skaneerimine toimub automaatselt. Sendi link Otsi Sende Muuda Sendi - Lisa Send + Edit file Send + Edit text Send + New file Send + New text Send Soovid tõesti selle Sendi kustutada? Send on kustutatud. Send on uuendatud. @@ -990,11 +993,9 @@ Soovid selle konto peale lülituda? User verification Create account on Create account on: - Järgi aadressile %1$s saadetud juhiseid, et lõpetada konto loomine. Saatsime emaili aadressile %1$s. Jätkates kinnitad, et nõustud teenusetingimuste ja privaatsuspoliitikaga By activating this switch, you agree to the Terms of Service and Privacy Policy - Määra parool Lõpeta tellimus Kontrolli oma postkasti Ava emaili rakendus @@ -1260,7 +1261,7 @@ Soovid selle konto peale lülituda? Log deleted App settings Replace existing certificate? - A certificate with this alias \"%s\" already exists. Do you want to replace it?\nReplace the certificate may impact your connection to any environments currently using it. + 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 diff --git a/app/src/main/res/values-eu-rES/strings.xml b/app/src/main/res/values-eu-rES/strings.xml index 556712e9b6..d9577624e3 100644 --- a/app/src/main/res/values-eu-rES/strings.xml +++ b/app/src/main/res/values-eu-rES/strings.xml @@ -641,7 +641,10 @@ Send esteka Send-ak bilatu Editatu Send-a - Gehitu Send-a + Edit file Send + Edit text Send + New file Send + New text Send Ziur al zaude Send hau ezabatu nahi duzula? Send-a ezabatu da. Send-a eguneratu da. @@ -988,11 +991,9 @@ Kontu honetara aldatu nahi duzu? User verification Create account on Create account on: - Follow the instructions in the email sent to %1$s to continue creating your account. 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 - Set password Unsubscribe Check your email Open email app @@ -1258,7 +1259,7 @@ Kontu honetara aldatu nahi duzu? Log deleted App settings Replace existing certificate? - A certificate with this alias \"%s\" already exists. Do you want to replace it?\nReplace the certificate may impact your connection to any environments currently using it. + 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 diff --git a/app/src/main/res/values-fa-rIR/strings.xml b/app/src/main/res/values-fa-rIR/strings.xml index 37db53ace5..e162b6918e 100644 --- a/app/src/main/res/values-fa-rIR/strings.xml +++ b/app/src/main/res/values-fa-rIR/strings.xml @@ -268,7 +268,7 @@ کلید امنیتی YubiKey افزودن پیوست جدید پیوست‌ها - نمی‌توان پرونده را دانلود کرد. + نمی‌توان پرونده را بارگیری کرد. دستگاهتان قادر به باز کردن این نوع از پرونده نیست. در حال بارگیری... حجم این پیوست %1$s است. آیا مایل به بارگیری این پرونده در دستگاهتان هستید؟ @@ -298,9 +298,9 @@ انتقال کلید رمزگذاری مورد نیاز است. لطفاً از طریق گاوصندوق وب وارد شوید تا کلید رمزگذاری خود را به روز کنید. بیشتر بدانید نشانی اینترنتی سرور API - گواهی مشتری (mTLS) - گواهی استفاده شده برای احراز هویت مشتری. - استفاده از گواهی سیستم + گواهی‌نامه مشتری (mTLS) + گواهی‌نامه استفاده شده برای احراز هویت مشتری. + استفاده از گواهی‌نامه سیستم محیط سفارشی برای کاربران پیشرفته. شما می‌توانید نشانی اینترنتی پایه هر سرویس را مستقلاً تعیین کنید. نشانی‌های اینترنتی محیط ذخیره شد. @@ -643,7 +643,10 @@ ارسال پیوند جستجوی ارسال‌ها ویرایش ارسال - ارسال جدید + ویرایش پرونده ارسال + ویرایش متن ارسال + پرونده جدید ارسال + متن جدید ارسال آیا مطمئن هستید که می‌خواهید این ارسال را حذف کنید؟ ارسال حذف شد. ارسال ذخیره شد @@ -660,7 +663,7 @@ درباره ارسال نشانی ایمیلم را از گیرندگان مخفی کن یک یا چند سیاست سازمان بر گزینه‌های ارسال شما تأثیر می‌گذارد. - حساب‌های کاربری رایگان فقط می‌توانند متن را به اشتراک بگذارند. برای استفاده از قابلیت ارسال فایل‌ها، به عضویت پریمیوم نیاز دارید. + حساب‌های کاربری رایگان فقط می‌توانند متن را به اشتراک بگذارند. برای استفاده از قابلیت ارسال پرونده‌ها، به عضویت پریمیوم نیاز دارید. برای استفاده از پرونده‌ها با \"ارسال\" باید ایمیل خود را تأیید کنید. درخواست مجدد کلمه عبور اصلی تأیید کلمه عبور اصلی @@ -857,29 +860,29 @@ کلمه عبور اصلی شما با یک یا چند سیاست سازمان‌تان مطابقت ندارد. برای دسترسی به گاوصندوق، باید همین حالا کلمه عبور اصلی خود را به‌روزرسانی کنید. در صورت ادامه، شما از نشست فعلی خود خارج می‌شوید و باید دوباره وارد سیستم شوید. نشست فعال در دستگاه های دیگر ممکن است تا یک ساعت همچنان فعال باقی بمانند. کلمه عبور اصلی فعلی (الزامی) وارد شده! - تایید با دستگاه دیگرم - درخواست تایید مدیر - تایید با کلمه عبور اصلی - اگر از دستگاه عمومی استفاده میکنید خاموش کنید + تأیید با دستگاه دیگرم + درخواست تأیید مدیر + تأیید با کلمه عبور اصلی + اگر از دستگاه عمومی استفاده می‌کنید خاموش کنید این دستگاه را به خاطر بسپار کلید عبور کلیدهای عبور - درخواست + اپلیکیشن شما نمی‌توانید برنامه کلید عبور را ویرایش کنید زیرا باعث بی اعتباری کلید عبور می‌شود کلید عبور کپی نمی‌شود کلید عبور در مورد شبیه سازی شده کپی نمی‌شود. آیا می‌خواهید به شبیه سازی این مورد ادامه دهید؟ درخواست را کپی کنید برای ورود دو مرحله ای موجود است راهنمای درخواست مجدد کلمه عبور اصلی - بازگشایی ممکن است به دلیل حافظه ناکافی انجام نشود. برای انجام تنظیمات حافظه KDF خود را کاهش دهید یا از بازگشایی زیست‌سنجی استفاده کنید. + باز کردن قفل ممکن است به دلیل حافظه ناکافی انجام نشود. برای انجام تنظیمات حافظه KDF خود را کاهش دهید یا از باز کردن قفل بیومتریک استفاده کنید. کلید API نامعتبر توکن API نامعتبر - تایید مدیر در خواست شد + تأیید مدیر درخواست شد درخواست شما به مدیرتان فرستاده شد. - به محض تایید مطلع خواهید شد. + به محض تأیید مطلع خواهید شد. در ورود مشکلی دارید؟ ورود به عنوان %1$s - اقدام پایان زمان گاوصندوق به خروج تغییر کرد + اقدام پس از پایان زمان گاوصندوق به خروج تغییر کرد پر کردن خودکار را مسدود کنید پر کردن خودکار برای این نشانی‌های اینترنتی ارائه نمی‌شود. نشانی اینترنتی مسدود شده جدید @@ -928,7 +931,7 @@ به تنظیمات دستگاه ادامه دهید؟ با راه‌اندازی ورود دو مرحله‌ای در برنامه وب Bitwarden، حساب کاربری خود را ایمن‌تر کنید. می‌توانید کلمه عبور اصلی خود را در برنامه وب Bitwarden تغییر دهید. - می‌توانید داده‌ها را در %1$s به گاوصندوق خود وارد کنید. + می‌توانید داده‌ها را در %1$s به گاوصندوق خود درون ریزی کنید. درباره نحوه استفاده از Bitwarden در مرکز راهنمایی بیشتر بیاموزید. چیزی را که به دنبالش هستید پیدا نمی‌کنید؟ با پشتیبانی Bitwarden در bitwarden.com تماس بگیرید. سیاست حفظ حریم خصوصی ما را در bitwarden.com بررسی کنید. @@ -940,8 +943,8 @@ تلاش‌ها بیش از حد مجاز بود حساب کاربری از سیستم خارج شد. مجوزهای سازمان شما به‌روزرسانی شد، باید یک کلمه عبور اصلی تنظیم کنید. - سازمان شما از شما می‌خواهد که یک کلمه عبور اصلی تنظیم کنید. - یک گزینه بازگشایی برای پایان زمان مجاز تنظیم کنید. + سازمانتان از شما می‌خواهد که یک کلمه عبور اصلی تنظیم کنید. + یک گزینه باز کردن قفل برای پایان زمان مجاز راه‌اندازی کنید. یک ورود برای ذخیره این کلید عبور انتخاب کنید کلید عبور را به عنوان ورود جدید ذخیره کن ذخیره کلید عبور @@ -952,8 +955,8 @@ ورود دو مرحله ای Duo برای حساب کاربری شما لازم است. مراحل Duo را دنبال کنید تا وارد سیستم شوید. اجرای Duo - تایید لازم است توسط %1$s - تأیید برای این اقدام لازم است. برای ادامه، یک روش باز کردن قفل را در Bitwarden تنظیم کنید. + تأیید لازم است توسط %1$s + تأیید برای این اقدام لازم است. برای ادامه، یک روش باز کردن قفل را در Bitwarden راه‌اندازی کنید. خطا در ایجاد کلید عبور خطا در خواندن کلید عبور مشکلی در ایجاد کلمه عبور برای %1$s وجود داشت. بعداً دوباره امتحان کنید. @@ -961,7 +964,7 @@ در حال تأیید هویت... کلمه‌های عبور حساب کاربری نامشخص - راه‌اندازی تکمیل خودکار + راه‌اندازی پر کردن خودکار به کلمات و کلید‌های عبورتان دسترسی سریع داشته باشید! برای راه‌اندازی پر کردن خودکار کلمه عبور و مدیریت کلید عبور، Bitwarden را به عنوان ارائه‌دهنده ترجیحی خود در تنظیمات iOS تنظیم کنید. ۱. به تنظیمات دستگاه خود بروید > کلمه‌های عبور > گزینه‌های کلمه عبور @@ -991,11 +994,9 @@ تأیید کردن کاربر حساب کاربری ایجاد کنید در حساب کاربری ایجاد کنید در: - دستورالعمل‌های موجود در ایمیل ارسال‌شده به %1$s را دنبال کنید تا ساخت حساب کاربری خود را انجام دهید. ما یک ایمیل ارسال کردیم به %1$s. با ادامه، شما با شرایط خدمات و سیاست حفظ حریم خصوصی موافقت می‌کنید با فعال کردن این سوئیچ، شما با شرایط خدمات و سیاست حفظ حریم خصوصی موافقت می‌کنید - تنظیم کلمه عبور لغو اشتراک ایمیل خود را چک کنید برنامه‌ی ایمیل را باز کنید @@ -1026,13 +1027,13 @@ آن را امتحان کنید راه‌اندازی حساب کاربری راه‌اندازی باز کردن قفل - بعداً تنظیم شود - باز کردن قفل بعداً تنظیم شود؟ + بعداً راه‌اندازی شود + باز کردن قفل بعداً راه‌اندازی شود؟ می‌توانید هر زمان برای تکمیل این مرحله از بخش امنیت حساب کاربری در تنظیمات بازگردید. تأیید راه‌اندازی بیومتریک یا انتخاب کد PIN برای دسترسی سریع به گاوصندوق و پر کردن خودکار ورودهای شما. دسترسی به گاوصندوق خود را هرگز از دست ندهید - بهترین راه برای اطمینان از اینکه همیشه به گاوصندوق خود دسترسی دارید، این است که از همان ابتدا اقدامات امنیتی لازم را تنظیم کنید. + بهترین راه برای اطمینان از اینکه همیشه به گاوصندوق خود دسترسی دارید، این است که از همان ابتدا اقدامات امنیتی لازم را راه‌اندازی کنید. یکی از بهترین روش‌ها برای ساخت یک کلمه عبور امن و قابل یادآوری، استفاده از یک عبارت عبور است. \nدر ادامه نحوه انجام آن آمده است: ایجاد یک یادآور یادآور شما هنگام درخواست از طریق ایمیل برایتان ارسال خواهد شد. @@ -1057,7 +1058,7 @@ پیوند منقضی شد لطفاً ثبت‌نام را دوباره آغاز کنید یا سعی کنید وارد حساب کاربری خود شوید. ممکن است از قبل حساب کاربری داشته باشید. ثبت‌نام را دوباره آغاز کنید - همگام‌سازی احراز هویت + همگام‌سازی احراز کننده هویت اجازه دهید همگام‌سازی احراز هویت انجام شود در تأیید توکن ثبت‌نام مشکلی پیش آمده است. پر کردن خودکار را فعال کنید @@ -1075,40 +1076,40 @@ داده‌های خود را ذخیره و از آن‌ها محافظت کنید گاوصندوق تنها کلمات عبور را محافظت نمی‌کند. ورودهای امن، شناسه‌ها، کارت‌ها و یادداشت‌ها را نیز به صورت امن در اینجا ذخیره کنید. ورود جدید - فایل‌ها و داده‌های خود را به‌صورت امن با هر کسی، در هر پلتفرمی به اشتراک بگذارید. اطلاعات شما در حین اشتراک‌گذاری به‌طور کامل رمزگذاری انتها به انتها باقی خواهد ماند و میزان افشا محدود می‌شود. + پرونده‌ها و داده‌های خود را به‌صورت امن با هر کسی، در هر پلتفرمی به اشتراک بگذارید. اطلاعات شما در حین اشتراک‌گذاری به‌طور کامل رمزگذاری انتها به انتها باقی خواهد ماند و میزان افشا محدود می‌شود. اطلاعات حساس را به‌صورت ایمن ارسال کنید - ورودهای ذخیره‌شده را وارد کنید - از یک کامپیوتر برای وارد کردن ورودهای ذخیره‌شده از یک مدیر کلمه عبور موجود استفاده کنید + ورودهای ذخیره‌شده را درون ریزی کنید + از یک رایانه برای درون ریزی ورودهای ذخیره‌شده از یک مدیر کلمه عبور موجود استفاده کنید می‌توانید هر زمان برای تکمیل این مرحله به بخش تنظیمات گاوصندوق مراجعه کنید. - ورودها را بعداً وارد کنید - ورودها را بعداً وارد می‌کنید؟ - آیا به یک کامپیوتر دسترسی دارید؟ - دستورالعمل‌های زیر شما را در وارد کردن ورودها از رایانه دسکتاپ یا لپ‌تاپ راهنمایی می‌کنند - وارد کردن ورودها - از طریق کامپیوتر خود، این دستورالعمل‌ها را دنبال کنید تا کلمات عبور ذخیره‌شده را از مرورگر یا مدیر کلمه عبور دیگری صادر کنید. سپس آن‌ها را به‌صورت ایمن به Bitwarden وارد نمایید. + ورودها را بعداً درون ریزی کنید + ورودها را بعداً درون ریزی می‌کنید؟ + آیا به یک رایانه دسترسی دارید؟ + دستورالعمل‌های زیر شما را در درون ریزی ورودها از رایانه دسکتاپ یا لپ‌تاپ راهنمایی می‌کنند + درون ریزی ورودها + از طریق رایانه خود، این دستورالعمل‌ها را دنبال کنید تا کلمات عبور ذخیره‌شده را از مرورگر یا مدیر کلمه عبور دیگری برون ریزی کنید. سپس آن‌ها را به‌صورت ایمن به Bitwarden درون ریزی نمایید. به گاوصندوق خود یک شروع قدرتمند بدهید - باز کردن با بیومتریک نیاز به احراز هویت بیومتریک قوی دارد و ممکن است با تمام گزینه‌های بیومتریک موجود در این دستگاه سازگار نباشد. - باز کردن با بیومتریک نیاز به احراز هویت بیومتریک قوی دارد و با گزینه‌های بیومتریک موجود در این دستگاه سازگار نیست. - روی کامپیوتر خود، وارد مرورگر فعلی یا مدیر کلمه عبور خود شوید. + باز کردن قفل با بیومتریک نیاز به احراز هویت بیومتریک قوی دارد و ممکن است با تمام گزینه‌های بیومتریک موجود در این دستگاه سازگار نباشد. + باز کردن قفل با بیومتریک نیاز به احراز هویت بیومتریک قوی دارد و با گزینه‌های بیومتریک موجود در این دستگاه سازگار نیست. + روی رایانه خود، وارد مرورگر فعلی یا مدیر کلمه عبور خود شوید. کلمات عبور خود را برون ریزی کنید. این گزینه معمولاً در بخش تنظیمات یافت می‌شود. - گزینه «وارد کردن داده‌ها» را در اپلیکیشن تحت وب انتخاب کنید، سپس برای اتمام همگام‌سازی روی انجام شد در پایین کلیک کنید. + گزینه «درون ریزی داده‌ها» را در اپلیکیشن تحت وب انتخاب کنید، سپس برای اتمام همگام‌سازی روی انجام شد در پایین کلیک کنید. مرحلهٔ ۱ از ۳ ورودهای ذخیره‌شده را برون ریزی کنید - پس از پایان وارد کردن، این فایل را حذف خواهید کرد. - روی کامپیوتر خود، یک تب جدید در مرورگر باز کنید و به %1$s بروید + پس از اتمام درون ریزی، این پرونده را حذف خواهید کرد. + روی رایانه خود، یک تب جدید در مرورگر باز کنید و به %1$s بروید به اپلیکیشن وب Bitwarden وارد شوید. مرحلهٔ ۲ از ۳ وارد Bitwarden شوید مرحلهٔ ۳ از ۳ - ورودها را به Bitwarden وارد کنید - در ناوبری Bitwarden، گزینه ابزارها را پیدا کرده و وارد کردن داده‌ها را انتخاب کنید - فرم را پر کرده و فایل کلمه عبور ذخیره شده خود را وارد کنید. - برای امنیت خود، حتماً فایل کلمه عبور ذخیره شده خود را حذف کنید. + ورودها را به Bitwarden درون ریزی کنید + در ناوبری Bitwarden، گزینه ابزارها را پیدا کرده و درون ریزی داده‌ها را انتخاب کنید + فرم را پر کرده و پرونده کلمه عبور ذخیره شده خود را درون ریزی کنید. + برای امنیت خود، حتماً پرونده کلمه عبور ذخیره شده خود را حذف کنید. نیاز به کمک دارید؟ به راهنمای درون ریزی مراجعه کنید. - پرونده برون ریزی شده را ذخیره کنید در مکانی روی کامپیوترتان که به‌راحتی بتوانید آن را پیدا کنید. + پرونده برون ریزی شده را ذخیره کنید در مکانی روی رایانه‌تان که به‌راحتی بتوانید آن را پیدا کنید. این یک سرور معتبر Bitwarden نیست. ممکن است لازم باشد با ارائه‌دهنده خود بررسی کنید یا سرور را به‌روزرسانی نمایید. همگام‌سازی ورودها... - افزونه مرورگر را دانلود کنید + افزونه مرورگر را بارگیری کنید به نشانی bitwarden.com/download بروید تا Bitwarden را در مرورگر مورد علاقه‌تان یکپارچه‌سازی کنید و تجربه‌ای روان داشته باشید. از برنامه وب استفاده کنید در bitwarden.com وارد شوید تا به‌راحتی حساب کاربری خود را مدیریت کرده و تنظیمات را به‌روزرسانی کنید. @@ -1122,7 +1123,7 @@ خطای درون ریزی نقطه پایانی دامنه SSO تأیید شده ورودها درون ریزی شد - فراموش نکنید پرونده کلمات عبور درون ریزی شده را از کامپیوتر خود حذف کنید + فراموش نکنید پرونده کلمات عبور درون ریزی شده را از رایانه خود حذف کنید کلید SSH کلید عمومی کلید خصوصی @@ -1136,7 +1137,7 @@ انجام شد %1$s از %2$s کپی نام هویت - کپی سازمان + کپی شرکت کپی شماره کد ملی کپی شماره گذرنامه کپی شماره گواهینامه @@ -1153,7 +1154,7 @@ آن کلمات را کنار هم قرار دهید و ترکیب کنید کلمات را به هر ترتیبی کنار هم بگذارید تا عبارت عبور خود را بسازید. می‌توانید از خط فاصله، فاصله یا به‌صورت یک کلمه بلند استفاده کنید— انتخاب با شماست! آن را به سبک خودتان بسازید - یک عدد یا نماد اضافه کنید تا عبارت عبور شما قوی‌تر شود. حالا یک عبارت عبور منحصربه‌فرد، امن و به‌خاطرسپردنی دارید! + یک عدد یا نماد اضافه کنید تا عبارت عبور شما قوی‌تر شود. حالا یک عبارت عبور منحصربه‌فرد، امن و به‌خاطر سپردنی دارید! "نیاز به کمی الهام دارید؟" "از تولیدکننده عبارت عبور دیدن کنید" کپی در حافظهٔ موقت. @@ -1193,8 +1194,8 @@ خطا در بارگذاری گواهی‌نامه نام مستعار گواهی‌نامه وارد کردن گواهی‌نامه - انتخاب گواهی سیستم - گواهی نصب شد + انتخاب گواهی‌نامه سیستم + گواهی‌نامه نصب شد نصب گواهی‌نامه با خطا مواجه شد انتخاب گواهی‌نامه با خطا مواجه شد نوع گواهی‌نامه پشتیبانی نمی‌شود @@ -1217,17 +1218,17 @@ نشانی اینترنتی سرور خود میزبان استفاده از قابلیت پر کردن خودکار کروم استفاده از قابلیت پرکردن خودکار کروم (نسخه بتا) - پر کردن خودکار ورود به حساب برای وب‌سایت‌های پشتیبانی‌شده در کروم را بهبود می‌بخشد. پس از فعال‌سازی، به تنظیمات کروم هدایت می‌شوید تا پر کردن خودکار از سوی شخص ثالث را فعال کنید. + پر کردن خودکار ورود به حساب برای وب‌سایت‌های پشتیبانی شده در کروم را بهبود می‌بخشد. پس از فعال‌سازی، به تنظیمات کروم هدایت می‌شوید تا پر کردن خودکار از سوی شخص ثالث را فعال کنید. نمایش بیشتر بدون پوشه نمایش کمتر افزودن فیلد %s... اشتراک‌گذاری جزئیات خطا - ضبط‌کننده پرواز - راهنمای ضبط‌کننده پرواز + ضبط‌ کننده پرواز + راهنمای ضبط‌ کننده پرواز مشاهده گزارش‌های ضبط شده - فعال‌سازی ضبط‌کننده پرواز + فعال‌سازی ضبط‌ کننده پرواز گزارش‌های ضبط شده هیچ گزارشی ضبط نشده است مشکلی پیش آمده؟ @@ -1244,9 +1245,9 @@ هم‌رسانی همه امکان اشتراک‌گذاری وجود ندارد لطفاً دوباره تلاش کنید یا گزارش دیگری را انتخاب کنید. - پرونده گزارش که می‌خواهید به اشتراک بگذارید حذف شده است. + پرونده گزارشی که می‌خواهید به اشتراک بگذارید حذف شده است. حذف گزارش - آیا واقعاً می خواهید این گزارش را حذف کنید؟ + آیا واقعاً می‌خواهید این گزارش را حذف کنید؟ حذف گزارش‌ها آیا واقعاً می‌خواهید تمام گزارش‌های ثبت‌شده را حذف کنید؟ تأیید دامنه رابط کلید @@ -1254,14 +1255,14 @@ سازمان: برای اعضای سازمان زیر، کلمه عبور اصلی دیگر لازم نیست. لطفاً دامنه زیر را با مدیر سازمان خود تأیید کنید. لطفاً دامنه زیر را با مدیر سازمان خود تأیید کنید.\n\nدامنه رابط کلید:\n%1$s - ضبط‌کننده پرواز روشن است - ضبط‌کننده پرواز تا %1$s در %2$s فعال خواهد بود. برای غیرفعال کردن آن اکنون به تنظیمات بازگردید. + ضبط‌ کننده پرواز روشن است + ضبط‌ کننده پرواز تا %1$s در %2$s فعال خواهد بود. برای غیرفعال کردن آن اکنون به تنظیمات بازگردید. رفتن به تنظیمات تمامی لاگ‌ها حذف شدند - لاگ حذف شد + گزارش‌ حذف شد تنظیمات برنامه آیا می‌خواهید گواهی‌نامه موجود را جایگزین کنید؟ - گواهی با این نام مستعار \"%s\" از قبل وجود دارد. آیا می‌خواهید آن را جایگزین کنید؟\nتعویض گواهی ممکن است بر اتصال شما به محیط هایی که در حال حاضر از آن استفاده می‌کند تأثیر بگذارد. + یک گواهی‌نامه با این نام مستعار \"%s\" از قبل وجود دارد. آیا می‌خواهید آن را جایگزین کنید؟\nتعویض گواهی ممکن است بر اتصال شما به محیط هایی که در حال حاضر از آن استفاده می‌کند تأثیر بگذارد. جایگزینی گواهی‌نامه ناتوانی در خواندن گواهی‌نامه. قادر به حذف حساب کاربری شما نیستیم @@ -1270,7 +1271,7 @@ مشاهده پرونده جدید مشاهده متن ارسال حذف ارسال - گزینه «ارسال» برای همگام‌سازی مجدد گاوصندوق شما مفقود است + گزینه ارسال برای همگام‌سازی مجدد گاوصندوق شما مفقود است رنگ‌های پویا رنگ‌های پویا را بر اساس کاغذ دیواری خود اعمال کنید رنگ‌های پویا از رنگ‌های سیستم استفاده می‌کنند و ممکن است تمام دستورالعمل‌های دسترسی را رعایت نکنند. diff --git a/app/src/main/res/values-fi-rFI/strings.xml b/app/src/main/res/values-fi-rFI/strings.xml index 33a0abd5d7..b2775d7c90 100644 --- a/app/src/main/res/values-fi-rFI/strings.xml +++ b/app/src/main/res/values-fi-rFI/strings.xml @@ -642,7 +642,10 @@ Koodi skannataan automaattisesti. Send-linkki Etsi Sendeistä Muokkaa Sendiä - Uusi Send + Edit file Send + Edit text Send + New file Send + New text Send Haluatko varmasti poistaa Sendin? Send poistettiin Send tallennettiin @@ -990,11 +993,9 @@ Haluatko vaihtaa tähän tiliin? Käyttäjän vahvistus Luo tili palvelimelle Luo tili palvelimelle: - Jatka tilisi luomista seuraamalla osoitteeseen %1$s lähetetyn viestin ohjeita. Lähetimme viestin osoitteeseen %1$s. Jatkamalla hyväksyt Käyttöehdot ja Tietosuojakäytännön By activating this switch, you agree to the Terms of Service and Privacy Policy - Aseta salasana Lopeta tilaus Tarkasta sähköpostisi Avaa sähköpostisovellus @@ -1260,17 +1261,17 @@ Haluatko vaihtaa tähän tiliin? Loki on poistettu Sovelluksen asetukset Replace existing certificate? - A certificate with this alias \"%s\" already exists. Do you want to replace it?\nReplace the certificate may impact your connection to any environments currently using it. + 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 + Näytä tiedosto-Send + Näytä teksti-Send + Poista Send Missing Send re-sync your vault - Dynamic colors + Dynaamiset värit Apply dynamic colors based on your wallpaper Dynamic colors uses the system colors and may not meet all accessibility guidelines. diff --git a/app/src/main/res/values-fil-rPH/strings.xml b/app/src/main/res/values-fil-rPH/strings.xml index c7d30ed19e..f0aed2e6e4 100644 --- a/app/src/main/res/values-fil-rPH/strings.xml +++ b/app/src/main/res/values-fil-rPH/strings.xml @@ -642,7 +642,10 @@ Awtomatikong itong magsa-scan. Link ng Send Maghanap ng Mga Send Baguhin ang Send - Bagong Send + Edit file Send + Edit text Send + New file Send + New text Send Sigurado ka bang gusto mong burahin ang Send na ito? Nabura ang Send Na-save ang Send @@ -990,11 +993,9 @@ Gusto mo bang pumunta sa account na ito? User verification Create account on Create account on: - Follow the instructions in the email sent to %1$s to continue creating your account. 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 - Set password Unsubscribe Check your email Open email app @@ -1260,7 +1261,7 @@ Gusto mo bang pumunta sa account na ito? Log deleted App settings Replace existing certificate? - A certificate with this alias \"%s\" already exists. Do you want to replace it?\nReplace the certificate may impact your connection to any environments currently using it. + 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 diff --git a/app/src/main/res/values-fr-rFR/strings.xml b/app/src/main/res/values-fr-rFR/strings.xml index b4f613004c..ed2ed0b8bd 100644 --- a/app/src/main/res/values-fr-rFR/strings.xml +++ b/app/src/main/res/values-fr-rFR/strings.xml @@ -642,7 +642,10 @@ La numérisation se fera automatiquement. Lien du Send Rechercher dans les Sends Modifier le Send - Ajouter un Send + Edit file Send + Edit text Send + New file Send + New text Send Êtes-vous sûr de vouloir supprimer ce Send ? Send supprimé Send sauvegardé @@ -990,11 +993,9 @@ Voulez-vous basculer vers ce compte ? Vérification de l’utilisateur Création du compte sur Créer le compte sur : - Suivez les instructions dans le courriel envoyé à %1$s pour continuer à créer votre compte. Nous avons envoyé un email à %1$s. En continuant, vous acceptez les conditions générales d\'utilisation et la politique de confidentialité By activating this switch, you agree to the Terms of Service and Privacy Policy - Définir un mot de passe Se désabonner Vérifiez votre courriel Ouvrir mon application d\'e-mail @@ -1260,7 +1261,7 @@ Voulez-vous basculer vers ce compte ? Log deleted App settings Replace existing certificate? - A certificate with this alias \"%s\" already exists. Do you want to replace it?\nReplace the certificate may impact your connection to any environments currently using it. + 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 diff --git a/app/src/main/res/values-gl-rES/strings.xml b/app/src/main/res/values-gl-rES/strings.xml index 52d5d770d0..a21487ba56 100644 --- a/app/src/main/res/values-gl-rES/strings.xml +++ b/app/src/main/res/values-gl-rES/strings.xml @@ -642,7 +642,10 @@ Escanearase automaticamente. Ligazón Send Buscar Sends Editar Send - Novo Send + Edit file Send + Edit text Send + New file Send + New text Send Seguro que queres eliminar este Send? Send eliminado Send gardado @@ -990,11 +993,9 @@ Queres comprobalo dende esa conta? Verificación de usuario Crear unha conta en Crear unha conta en: - Segue as instrucións enviadas a %1$s para continuar creando a túa conta. Enviamos un correo a %1$s. Ó continuar, aceptas os Termos de Servizo e a Política de Privacidade Ó marcar esta opción, aceptas os Termos de Servizo e a Política de Privacidade - Establecer contrasinal Cancelar subscrición Revisa o teu correo Abrir app de email @@ -1260,7 +1261,7 @@ Queres comprobalo dende esa conta? Log deleted App settings Replace existing certificate? - A certificate with this alias \"%s\" already exists. Do you want to replace it?\nReplace the certificate may impact your connection to any environments currently using it. + 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 diff --git a/app/src/main/res/values-hi-rIN/strings.xml b/app/src/main/res/values-hi-rIN/strings.xml index 423fb57cd9..c6389bb252 100644 --- a/app/src/main/res/values-hi-rIN/strings.xml +++ b/app/src/main/res/values-hi-rIN/strings.xml @@ -641,7 +641,10 @@ लिंक सेंड करें सेंड सर्च करें सेंड बदलें - नया सेंड + Edit file Send + Edit text Send + New file Send + New text Send Are you sure you want to delete this Send? सेंड हटाया गया सेंड सेव किया गया @@ -989,11 +992,9 @@ Do you want to switch to this account? User verification Create account on Create account on: - Follow the instructions in the email sent to %1$s to continue creating your account. 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 - Set password Unsubscribe Check your email Open email app @@ -1259,7 +1260,7 @@ Do you want to switch to this account? Log deleted App settings Replace existing certificate? - A certificate with this alias \"%s\" already exists. Do you want to replace it?\nReplace the certificate may impact your connection to any environments currently using it. + 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 diff --git a/app/src/main/res/values-hr-rHR/strings.xml b/app/src/main/res/values-hr-rHR/strings.xml index fd4b37e6cf..302b1db2f3 100644 --- a/app/src/main/res/values-hr-rHR/strings.xml +++ b/app/src/main/res/values-hr-rHR/strings.xml @@ -641,7 +641,10 @@ Veza na Send Pretraži Sendove Uredi Send - Novi Send + Edit file Send + Edit text Send + New file Send + New text Send Sigurno želiš izbrisati ovaj Send? Send izbrisan Send ažuriran @@ -988,11 +991,9 @@ Provjera korisnika Stvaranje računa na Stvaranje računa na: - Za nastavak stvaranja svog računa, prati upute poslane na %1$s. e-pošta poslana na %1$s. Nastavkom, slažeš se s Uvjetima usluge i Politikom privatnosti Aktiviranjem ovog prekidača pristaješ na Uvjete korištenja i Politiku privatnosti - Postavi lozinku Poništi pretplatu Provjeri svoju e-poštu Otvori aplikaciju za e-poštu @@ -1259,7 +1260,7 @@ Log deleted App settings Replace existing certificate? - A certificate with this alias \"%s\" already exists. Do you want to replace it?\nReplace the certificate may impact your connection to any environments currently using it. + 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 diff --git a/app/src/main/res/values-hu-rHU/strings.xml b/app/src/main/res/values-hu-rHU/strings.xml index 96ec5d0fd9..fa21b41ad0 100644 --- a/app/src/main/res/values-hu-rHU/strings.xml +++ b/app/src/main/res/values-hu-rHU/strings.xml @@ -641,7 +641,10 @@ Send hivatkozás Send elemek keresése Send szerkesztése - Send hozzáadása + Send fájl szerkesztése + Send szöveg szerkesztése + Új fájl Send elem + Új szöveges Send elem Biztosan törlésre kerüljön ez a Send elem? A Send elem törlésre került. A Send elem frissítésre került. @@ -989,11 +992,9 @@ Szeretnénk átváltani erre a fiókra? Felhasználó ellenőrzés Fiók létrehozása: Fiók létrehozása: - Kövessük %1$s címre küldött emailben található utasításokat a fiók létrehozásának folytatásához. Egy email került kiküldésre: %1$s. A folytatással elfogadjuk a Használati feltételeket és az Adatvédelmi szabályokat A kapcsoló aktiválásával elfogadjuk az Általános Szerződési Feltételeket és az Adatvédelmi irányelveket. - Jelszó beállítása Leiratkozás Email cím postaláda ellenőrzése Email alkalmazás megnyitása @@ -1262,8 +1263,8 @@ Szeretnénk átváltani erre a fiókra? Már létezik egy tanúsítvány ilyen álnévvel: \"%s\". Szeretnénk lecserélni?\nA tanúsítvány cseréje hatással lehet a jelenleg azt használó környezetekhez fűződő kapcsolatra. Tanúsítvány csere Nem sikerült beolvasni a tanúsítványt. - Cannot delete your account - This action cannot be completed because your account is owned by an organization. Contact your organization administrator for additional details. + Saját fiókját nem törölheti + Ez a művelet nem végezhető el, mert a fiókja egy szervezethez tartozik. További részletekért vegye fel a kapcsolatot az adminisztrátorral. Ez a fiók hamarosan törlésre kerül. A Bitwarden használatának folytatásához jelentkezzünk be: %1$s. Send fájl megtekintése Szöveges Send elem megtekintése diff --git a/app/src/main/res/values-in-rID/strings.xml b/app/src/main/res/values-in-rID/strings.xml index 8725db5e74..5c42474fc2 100644 --- a/app/src/main/res/values-in-rID/strings.xml +++ b/app/src/main/res/values-in-rID/strings.xml @@ -642,7 +642,10 @@ Proses pindai akan terjadi secara otomatis. Tautan Send Pencarian Send Edit Send - Tambahkan Send + Edit file Send + Edit text Send + New file Send + New text Send Anda yakin ingin menghapus Send ini? Send telah dihapus. Send diperbarui. @@ -990,11 +993,9 @@ Do you want to switch to this account? User verification Create account on Create account on: - Follow the instructions in the email sent to %1$s to continue creating your account. 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 - Set password Unsubscribe Check your email Open email app @@ -1260,7 +1261,7 @@ Do you want to switch to this account? Log deleted App settings Replace existing certificate? - A certificate with this alias \"%s\" already exists. Do you want to replace it?\nReplace the certificate may impact your connection to any environments currently using it. + 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 diff --git a/app/src/main/res/values-it-rIT/strings.xml b/app/src/main/res/values-it-rIT/strings.xml index 5e737b733f..de6181565f 100644 --- a/app/src/main/res/values-it-rIT/strings.xml +++ b/app/src/main/res/values-it-rIT/strings.xml @@ -623,7 +623,7 @@ La scansione è automatica. Scade alle %s Scade domani Scade il %s - Stops logging on %1$s at %2$s + Ferma il tracciamento su %1$s a %2$s Numero massimo di accessi Il numero di accessi complessivi consentiti al Send. Numero massimo di accessi raggiunto @@ -642,7 +642,10 @@ La scansione è automatica. Link del Send Cerca Send Modifica il Send - Aggiungi un Send + Modifica file Send + Modifica testo Send + Nuovo file Send + Nuovo testo Send Vuoi davvero eliminare questo Send? Send eliminato Send salvato @@ -777,7 +780,7 @@ usa \'Aggiungi TOTP\' per salvarla in modo sicuro. Alias Parola casuale Indirizzo email (necessario) - domain name + nome dominio Nome dominio (necessario) Chiave API Chiave API (necessaria) @@ -990,11 +993,9 @@ Vuoi passare a questo account? Verifica dell\'utente Crea account su Crea account su: - Segui le istruzioni contenute nell\'email inviata a %1$s per proseguire con la creazione del tuo account. Abbiamo inviato una email a %1$s. Continuando, accetti i Termini di servizio e l\'Informativa sulla privacy. Attivando questo switch, accetti i Termini di Servizio e Politica di riservatezza - Imposta la password Annulla iscrizione Controlla la casella di posta Apri l\'app email @@ -1212,7 +1213,7 @@ Vuoi passare a questo account? Operazione parola d\'accesso non riuscita perché la richiesta non è valida. Operazione chiave d\'accesso non riuscita perché i tentativi di verifica dell\'utente sono stati superati. Operazione chiave d\'accesso non riuscita perché nessun elemento è stato selezionato. - Passkey operation failed because the request is unsupported. + Operazione passkey non riuscita perché la richiesta non è supportata. URL server autogestito Usa l\'integrazione di riempimento automatico Chrome Usa l\'integrazione di riempimento automatico Chrome (Beta) @@ -1223,54 +1224,54 @@ Vuoi passare a questo account? Aggiungi campo %s… Condividi dettagli dell\'errore - 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. + Tracciamento (log) + Come usare il tracciamento + Visualizza tracciamento (log) + Abilita tracciamento (log) + Tracciamenti (log) registrati + Nessun tracciamento (log) registrato + Hai un problema con l\'app Bitwarden? + Abilita il tracciamento (log) temporaneo di stati dell\'app e chiamate di rete, che saranno memorizzati localmente: se richiesti, potrai inviarli all\'assistenza per la risoluzione di problemi. Non saranno memorizzati o inviati dati sensibili né contenuti della cassaforte. + Per iniziare, imposta una durata della registrazione. Questa si disattiverà automaticamente dopo il periodo indicato, dandoti il tempo di acquisire informazioni durante la riproduzione del problema. I file di log verranno automaticamente eliminati dopo 30 giorni. Bitwarden può accedere ai dati dei log solo quando li condividi. - 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 this alias \"%s\" already exists. Do you want to replace it?\nReplace 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 - Dynamic colors - Apply dynamic colors based on your wallpaper - Dynamic colors uses the system colors and may not meet all accessibility guidelines. + Per maggiori dettagli sui dati memorizzati dal tracciamento, visita il centro di aiuto\nBitwarden. + Durata del tracciamento (log) + 1 ora + 8 ore + 24 ore + 1 settimana + Elimina tutto + Condividi tutto + Impossibile condividere + Riprova o seleziona un\'altra registrazione. + La registrazione che stai cercando di condividere è stata rimossa. + Elimina registrazione (log) + Vuoi davvero eliminare questa registrazione? + Elimina registrazioni + Vuoi davvero eliminare tutte le registrazioni? + Conferma dominio Key Connector + Dominio Key Connector: + Organizzazione: + La password principale non è più richiesta per i membri dell\'organizzazione. Per favore, conferma il dominio qui sotto con l\'amministratore. + Per favore, conferma il dominio qui sotto con l\'amministratore dell\'organizzazione.\n\nDominio Key Connector:\n%1$s + Tracciamento (log) attivo + Il tracciamento (log) sarà attivo fino a %1$s alle %2$s. Torna alle impostazioni se vuoi disattivarlo prima. + Vai alle impostazioni + Tutte le registrazioni (log) sono state eliminate + Registrazione eliminata + Impostazioni app + Vuoi sostituire il certificato esistente? + Esiste già un certificato con l\'alias \"%s\". Vuoi sostituirlo?\nSostituire il certificato potrebbe influire sulla connessione a qualsiasi ambiente che lo utilizza. + Sostituisci certificato + Impossibile leggere il certificato. + Impossibile eliminare l\'account + Non è possibile procedere, perché il tuo account è di proprietà di un\'organizzazione. Contatta l\'amministratore dell\'organizzazione per maggiori dettagli. + Questo account sarà eliminato a breve. Accedi a %1$s per continuare a utilizzare Bitwarden. + Visualizza il file Send + Visualizza il testo Send + Elimina Send + File Send mancante: ri-sincronizza la cassaforte + Colori dinamici + Applica colori dinamici in base allo sfondo + I colori dinamici utilizzano i colori di sistema e potrebbero non soddisfare tutte le linee guida di accessibilità. diff --git a/app/src/main/res/values-iw-rIL/strings.xml b/app/src/main/res/values-iw-rIL/strings.xml index e69f737922..12b0772c7c 100644 --- a/app/src/main/res/values-iw-rIL/strings.xml +++ b/app/src/main/res/values-iw-rIL/strings.xml @@ -642,7 +642,10 @@ קישור סֵנְד חפש סֵנְדים ערוך סֵנְד - סֵנְד חדש + Edit file Send + Edit text Send + New file Send + New text Send האם אתה בטוח שברצונך למחוק סֵנְד זה? הסֵנְד נמחק סֵנְד נשמר @@ -990,11 +993,9 @@ אימות משתמש צור חשבון ב־ צור חשבון ב: - עקוב אחר ההוראות בדוא\"ל שנשלח אל %1$s כדי להמשיך ליצור את החשבון שלך. שלחנו דוא\"ל אל %1$s. על ידי המשך, אתה מסכים לתנאי השירות ומדיניות הפרטיות על ידי הפעלת מתג זה, אתה מסכים לתנאי השירות ומדיניות הפרטיות - הגדר סיסמה בטל הרשמה בדוק את הדוא\"ל שלך פתח יישום דוא\"ל @@ -1260,7 +1261,7 @@ Log deleted App settings Replace existing certificate? - A certificate with this alias \"%s\" already exists. Do you want to replace it?\nReplace the certificate may impact your connection to any environments currently using it. + 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 diff --git a/app/src/main/res/values-ja-rJP/strings.xml b/app/src/main/res/values-ja-rJP/strings.xml index 4c90d76862..c5be3ab65a 100644 --- a/app/src/main/res/values-ja-rJP/strings.xml +++ b/app/src/main/res/values-ja-rJP/strings.xml @@ -642,7 +642,10 @@ Send リンク Send を検索 Send を編集 - Send を追加 + Edit file Send + Edit text Send + New file Send + New text Send この Send を削除してもよろしいですか? Send を削除しました。 Send を更新しました。 @@ -990,11 +993,9 @@ ユーザー認証 Create account on Create account on: - %1$s に送信されたメールの指示に従って、アカウントの作成を続けてください。 %1$s にメールを送信しました。 続行すると弊社サービスの利用規約及びプライバシーポリシーに同意されたとみなされます By activating this switch, you agree to the Terms of Service and Privacy Policy - パスワードを設定 配信停止 メールをご確認ください メールアプリを開く @@ -1260,7 +1261,7 @@ Log deleted App settings Replace existing certificate? - A certificate with this alias \"%s\" already exists. Do you want to replace it?\nReplace the certificate may impact your connection to any environments currently using it. + 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 diff --git a/app/src/main/res/values-ka-rGE/strings.xml b/app/src/main/res/values-ka-rGE/strings.xml index be702fb43d..bdd7aa4411 100644 --- a/app/src/main/res/values-ka-rGE/strings.xml +++ b/app/src/main/res/values-ka-rGE/strings.xml @@ -642,7 +642,10 @@ Scanning will happen automatically. Send link Search Sends Edit Send - New 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 saved @@ -990,11 +993,9 @@ Do you want to switch to this account? User verification Create account on Create account on: - Follow the instructions in the email sent to %1$s to continue creating your account. 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 - Set password Unsubscribe Check your email Open email app @@ -1260,7 +1261,7 @@ Do you want to switch to this account? Log deleted App settings Replace existing certificate? - A certificate with this alias \"%s\" already exists. Do you want to replace it?\nReplace the certificate may impact your connection to any environments currently using it. + 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 diff --git a/app/src/main/res/values-kn-rIN/strings.xml b/app/src/main/res/values-kn-rIN/strings.xml index 7ceac51157..2e9ccb548e 100644 --- a/app/src/main/res/values-kn-rIN/strings.xml +++ b/app/src/main/res/values-kn-rIN/strings.xml @@ -642,7 +642,10 @@ Scanning will happen automatically. ಲಿಂಕ್ ಕಳುಹಿಸಿ ಹುಡುಕಾಟ ಕಳುಹಿಸುತ್ತದೆ ಕಳುಹಿಸು ಸಂಪಾದಿಸಿ - ಕಳುಹಿಸು ಸೇರಿಸಿ + Edit file Send + Edit text Send + New file Send + New text Send ಈ ಕಳುಹಿಸುವಿಕೆಯನ್ನು ಅಳಿಸಲು ನೀವು ಖಚಿತವಾಗಿ ಬಯಸುವಿರಾ? ಕಳುಹಿಸು ಅಳಿಸಲಾಗಿದೆ. ನವೀಕರಿಸಲಾಗಿದೆ ಕಳುಹಿಸಿ. @@ -990,11 +993,9 @@ Do you want to switch to this account? User verification Create account on Create account on: - Follow the instructions in the email sent to %1$s to continue creating your account. 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 - Set password Unsubscribe Check your email Open email app @@ -1260,7 +1261,7 @@ Do you want to switch to this account? Log deleted App settings Replace existing certificate? - A certificate with this alias \"%s\" already exists. Do you want to replace it?\nReplace the certificate may impact your connection to any environments currently using it. + 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 diff --git a/app/src/main/res/values-ko-rKR/strings.xml b/app/src/main/res/values-ko-rKR/strings.xml index fe02494a31..4c5df95f3f 100644 --- a/app/src/main/res/values-ko-rKR/strings.xml +++ b/app/src/main/res/values-ko-rKR/strings.xml @@ -642,7 +642,10 @@ Send 링크 Send 검색 Send 편집 - Send 추가 + Edit file Send + Edit text Send + New file Send + New text Send 정말 이 Send를 삭제하시겠습니까? Send가 삭제되었습니다. Send 업데이트됨. @@ -990,11 +993,9 @@ 사용자 인증 Create account on Create account on: - Follow the instructions in the email sent to %1$s to continue creating your account. 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 - Set password Unsubscribe Check your email Open email app @@ -1260,7 +1261,7 @@ Log deleted App settings Replace existing certificate? - A certificate with this alias \"%s\" already exists. Do you want to replace it?\nReplace the certificate may impact your connection to any environments currently using it. + 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 diff --git a/app/src/main/res/values-lt-rLT/strings.xml b/app/src/main/res/values-lt-rLT/strings.xml index 40d8b1cba9..0a4c76f047 100644 --- a/app/src/main/res/values-lt-rLT/strings.xml +++ b/app/src/main/res/values-lt-rLT/strings.xml @@ -642,7 +642,10 @@ Nuskaitymas vyks automatiškai. Siųsti nuorodą Ieškoti Siuntinių Pakeisti Siuntinį - Naujas Siuntinys + Edit file Send + Edit text Send + New file Send + New text Send Ar tikrai norite ištrinti šį Siuntinį? Siuntinys ištrintas Siuntinys išsaugotas @@ -990,11 +993,9 @@ Ar norite pereiti prie šios paskyros? User verification Create account on Create account on: - Follow the instructions in the email sent to %1$s to continue creating your account. 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 - Set password Unsubscribe Check your email Open email app @@ -1260,7 +1261,7 @@ Ar norite pereiti prie šios paskyros? Log deleted App settings Replace existing certificate? - A certificate with this alias \"%s\" already exists. Do you want to replace it?\nReplace the certificate may impact your connection to any environments currently using it. + 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 diff --git a/app/src/main/res/values-lv-rLV/strings.xml b/app/src/main/res/values-lv-rLV/strings.xml index 06dacc0b90..223db82fd0 100644 --- a/app/src/main/res/values-lv-rLV/strings.xml +++ b/app/src/main/res/values-lv-rLV/strings.xml @@ -642,7 +642,10 @@ Nolasīšana notiks automātiski. Send saite Meklēt Send Labot Send - Jauns Send + Labot datnes Send + Labot teksta Send + Jauns datnes Send + Jauns teksta Send Vai tiešām izdzēst šo Send? Send izdzēsts Send saglabāts @@ -990,11 +993,9 @@ Vai pārslēgties uz šo kontu? Lietotāja apliecināšana Izveidot kontu Izveidot kontu: - Jāseko uz e-pasta adresi %1$s nosūtītajām norādēm, lai turpinātu sava konta izveidošanu. Mēs nosūtījām e-pasta ziņojumu uz %1$s. Turpinot Tu piekrīti pakalpojuma izmantošanas nosacījumiem un privātuma politikai Ar šī slēdža ieslēgšanu tiek piekrists Pakalpojuma izmantošanas nosacījumiem un Privātuma politikai - Iestatīt paroli Atteikt abonēšanu Jāpārbauda e-pasts Atvērt e-pasta lietotni diff --git a/app/src/main/res/values-ml-rIN/strings.xml b/app/src/main/res/values-ml-rIN/strings.xml index 8eb6318dfb..db5f857b7d 100644 --- a/app/src/main/res/values-ml-rIN/strings.xml +++ b/app/src/main/res/values-ml-rIN/strings.xml @@ -642,7 +642,10 @@ ലിങ്ക് അയയ്‌ക്കുക Send-കൾ തിരയുക Send തിരുത്തുക - Send ചേർക്കുക + Edit file Send + Edit text Send + New file Send + New text Send ഈ Send ഇല്ലാതാക്കാൻ നിങ്ങൾ ആഗ്രഹിക്കുന്നുണ്ടോ? Send ഇല്ലാതാക്കി Send പുതുക്കി. @@ -990,11 +993,9 @@ Do you want to switch to this account? User verification Create account on Create account on: - Follow the instructions in the email sent to %1$s to continue creating your account. 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 - Set password Unsubscribe Check your email Open email app @@ -1260,7 +1261,7 @@ Do you want to switch to this account? Log deleted App settings Replace existing certificate? - A certificate with this alias \"%s\" already exists. Do you want to replace it?\nReplace the certificate may impact your connection to any environments currently using it. + 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 diff --git a/app/src/main/res/values-mr-rIN/strings.xml b/app/src/main/res/values-mr-rIN/strings.xml index 1f94229442..b827795d79 100644 --- a/app/src/main/res/values-mr-rIN/strings.xml +++ b/app/src/main/res/values-mr-rIN/strings.xml @@ -642,7 +642,10 @@ Scanning will happen automatically. Send link Search Sends Edit Send - New 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 saved @@ -990,11 +993,9 @@ Do you want to switch to this account? User verification Create account on Create account on: - Follow the instructions in the email sent to %1$s to continue creating your account. 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 - Set password Unsubscribe Check your email Open email app @@ -1260,7 +1261,7 @@ Do you want to switch to this account? Log deleted App settings Replace existing certificate? - A certificate with this alias \"%s\" already exists. Do you want to replace it?\nReplace the certificate may impact your connection to any environments currently using it. + 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 diff --git a/app/src/main/res/values-my-rMM/strings.xml b/app/src/main/res/values-my-rMM/strings.xml index be702fb43d..bdd7aa4411 100644 --- a/app/src/main/res/values-my-rMM/strings.xml +++ b/app/src/main/res/values-my-rMM/strings.xml @@ -642,7 +642,10 @@ Scanning will happen automatically. Send link Search Sends Edit Send - New 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 saved @@ -990,11 +993,9 @@ Do you want to switch to this account? User verification Create account on Create account on: - Follow the instructions in the email sent to %1$s to continue creating your account. 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 - Set password Unsubscribe Check your email Open email app @@ -1260,7 +1261,7 @@ Do you want to switch to this account? Log deleted App settings Replace existing certificate? - A certificate with this alias \"%s\" already exists. Do you want to replace it?\nReplace the certificate may impact your connection to any environments currently using it. + 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 diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index 76981340dd..b0cd1f5ab0 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -642,7 +642,10 @@ Skanning skjer automatisk. Send lenke Søk i Send-ene Rediger Send - Legg til Send + Edit file Send + Edit text Send + New file Send + New text Send Er du sikker på at du vil slette denne Send-en? Send-en har blitt slettet. Send-en er oppdatert. @@ -990,11 +993,9 @@ Vil du bytte til denne kontoen? User verification Create account on Create account on: - Follow the instructions in the email sent to %1$s to continue creating your account. 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 - Bestem passord Avabonner Sjekk E-postinnboksen din Open email app @@ -1260,7 +1261,7 @@ Vil du bytte til denne kontoen? Log deleted App-innstillinger Replace existing certificate? - A certificate with this alias \"%s\" already exists. Do you want to replace it?\nReplace the certificate may impact your connection to any environments currently using it. + 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 diff --git a/app/src/main/res/values-ne-rNP/strings.xml b/app/src/main/res/values-ne-rNP/strings.xml index be702fb43d..bdd7aa4411 100644 --- a/app/src/main/res/values-ne-rNP/strings.xml +++ b/app/src/main/res/values-ne-rNP/strings.xml @@ -642,7 +642,10 @@ Scanning will happen automatically. Send link Search Sends Edit Send - New 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 saved @@ -990,11 +993,9 @@ Do you want to switch to this account? User verification Create account on Create account on: - Follow the instructions in the email sent to %1$s to continue creating your account. 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 - Set password Unsubscribe Check your email Open email app @@ -1260,7 +1261,7 @@ Do you want to switch to this account? Log deleted App settings Replace existing certificate? - A certificate with this alias \"%s\" already exists. Do you want to replace it?\nReplace the certificate may impact your connection to any environments currently using it. + 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 diff --git a/app/src/main/res/values-nl-rNL/strings.xml b/app/src/main/res/values-nl-rNL/strings.xml index c49ea00490..2bcffe52a0 100644 --- a/app/src/main/res/values-nl-rNL/strings.xml +++ b/app/src/main/res/values-nl-rNL/strings.xml @@ -642,7 +642,10 @@ Het scannen gebeurt automatisch. Send-link Sends zoeken Send bewerken - Send toevoegen + Send (bestand) bewerken + Send (tekst) bewerken + Nieuwe Send (bestand) + Nieuwe Send (tekst) Weet je zeker dat je deze Send wilt verwijderen? Send is verwijderd. Send bijgewerkt. @@ -990,11 +993,9 @@ Wilt u naar dit account wisselen? Gebruikersverificatie Account maken bij Account maken bij: - Volg de instructies in het e-mailbericht wat is verzonden naar %1$s om door te gaan met het aanmaken van je account. We hebben een e-mail gestuurd naar %1$s. Door verder te gaan, gaat je akkoord met de Algemene voorwaarden en het Privacybeleid Het het inschakelen ga je akkoord met de Algemene voorwaarden en het Privacybeleid - Wachtwoord instellen Afmelden Check je e-mail E-mail-app openen diff --git a/app/src/main/res/values-nn-rNO/strings.xml b/app/src/main/res/values-nn-rNO/strings.xml index 57d13b7c21..c3ff606f3d 100644 --- a/app/src/main/res/values-nn-rNO/strings.xml +++ b/app/src/main/res/values-nn-rNO/strings.xml @@ -642,7 +642,10 @@ Skanning skjer automatisk. Send-lekk Leita i Send-ane Rediger Send - Legg til Send + Edit file Send + Edit text Send + New file Send + New text Send Er du trygg på at du vil sletta denne Send-en? Send-en er vorten fjerna. Send-en er retta. @@ -990,11 +993,9 @@ Do you want to switch to this account? User verification Create account on Create account on: - Følg instruksjonane i e-posten som er sendt til %1$s for å fortsetje å opprette kontoen din. We sent an email to %1$s. Ved å halde fram godtar du vilkåra for bruk og personvernerklæringa By activating this switch, you agree to the Terms of Service and Privacy Policy - Vel passord Avslutt abonnementet Sjekk e-posten din Opne e-postapp @@ -1260,7 +1261,7 @@ Do you want to switch to this account? Log deleted Appinnstillingar Replace existing certificate? - A certificate with this alias \"%s\" already exists. Do you want to replace it?\nReplace the certificate may impact your connection to any environments currently using it. + 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 diff --git a/app/src/main/res/values-or-rIN/strings.xml b/app/src/main/res/values-or-rIN/strings.xml index b4145cdd3f..d39366f0b5 100644 --- a/app/src/main/res/values-or-rIN/strings.xml +++ b/app/src/main/res/values-or-rIN/strings.xml @@ -642,7 +642,10 @@ Scanning will happen automatically. Send link Search Sends Edit Send - New 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 saved @@ -990,11 +993,9 @@ Do you want to switch to this account? User verification Create account on Create account on: - Follow the instructions in the email sent to %1$s to continue creating your account. 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 - Set password Unsubscribe Check your email Open email app @@ -1260,7 +1261,7 @@ Do you want to switch to this account? Log deleted App settings Replace existing certificate? - A certificate with this alias \"%s\" already exists. Do you want to replace it?\nReplace the certificate may impact your connection to any environments currently using it. + 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 diff --git a/app/src/main/res/values-pl-rPL/strings.xml b/app/src/main/res/values-pl-rPL/strings.xml index 0062e0c10e..5b0660b8bb 100644 --- a/app/src/main/res/values-pl-rPL/strings.xml +++ b/app/src/main/res/values-pl-rPL/strings.xml @@ -642,7 +642,10 @@ Skanowanie nastąpi automatycznie. Link wysyłki Szukaj w wysyłkach Edytuj wysyłkę - Nowa wysyłka + Edytuj wysłany plik + Edytuj wysłany tekst + Nowa wysyłka pliku + Nowa wysyłka tekstu Czy na pewno chcesz usunąć tę wysyłkę? Wysyłka została usunięta Wysyłka została zapisana @@ -990,11 +993,9 @@ Czy chcesz przełączyć się na to konto? Weryfikacja użytkownika Utwórz konto na Utwórz konto na: - Postępuj zgodnie z instrukcjami zawartymi w wiadomości e-mail wysłanej na %1$s, aby kontynuować tworzenie konta. Wysłaliśmy e-mail do %1$s. Kontynuując, akceptujesz Warunki korzystania z usługi i Politykę prywatności Aktywując ten przełącznik, zgadzasz się na Warunki korzystania z usługi oraz Politykę prywatności - Ustaw hasło Anuluj subskrypcję Sprawdź swoją pocztę e-mail Otwórz aplikację poczty e-mail diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index a1ba744144..89c3be88f9 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -642,7 +642,10 @@ A leitura será feita automaticamente. Link do Send Pesquisar Sends Editar Send - Adicionar Send + Editar Envio de arquivo + Editar Envio de texto + Novo Envio de arquivo + Novo Envio de texto Você tem certeza que deseja excluir este Send? Send excluído Send atualizado @@ -990,11 +993,9 @@ Você deseja mudar para esta conta? Verificação de usuário Criar conta em Criar conta em: - Siga as instruções no e-mail enviado para %1$s para continuar a criar sua conta. Enviamos um e-mail para %1$s. Ao continuar, você concorda com os Termos de Serviço e Política de Privacidade Ao ativar esse botão, você concorda com os Termos de Serviço e a Política de Privacidade - Definir senha Cancelar inscrição Verifique seu e-mail Abrir app de email @@ -1266,11 +1267,11 @@ Você deseja mudar para esta conta? Não é possível excluir sua conta Esta ação não pode ser concluída porque sua conta pertence a uma organização. Entre em contato com o administrador da sua organização para obter mais detalhes. Esta conta será excluída em breve. Inicie sessão em %1$s para continuar usando o Bitwarden. - View file Send - View text Send - Delete send - Missing Send re-sync your vault - Dynamic colors - Apply dynamic colors based on your wallpaper - Dynamic colors uses the system colors and may not meet all accessibility guidelines. + Ver Envio de arquivo + Ver Envio de texto + Excluir Envio + Envio ausente, sincronize seu cofre + Cores dinâmicas + Aplicar cores dinâmicas com base no seu papel de parede + As cores dinâmicas usam as cores do sistema e podem não atender todas as diretrizes de acessibilidade. diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index 042cb85fd2..1c96c1c608 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -642,7 +642,10 @@ A leitura será efetuada automaticamente. Link do Send Procurar Sends Editar Send - Novo Send + Editar Send de ficheiro + Editar Send de texto + Novo Send de ficheiro + Novo Send de texto Tem a certeza de que pretende eliminar este Send? Send eliminado Send guardado @@ -989,11 +992,9 @@ Pretende mudar para esta conta? Verificação do utilizador Criar conta em Criar conta em: - Siga as instruções do e-mail enviado para %1$s para continuar a criar a sua conta. Enviámos um e-mail para %1$s. Ao continuar, concorda com os Termos de utilização e Política de privacidade Ao ativar este interruptor, concorda com os Termos de utilização e Política de privacidade - Definir palavra-passe Anular subscrição Verifique o seu e-mail Abrir a app de e-mail @@ -1260,7 +1261,7 @@ Pretende mudar para esta conta? Registo eliminado Definições da app Substituir o certificado existente? - Já existe um certificado com este pseudónimo \"%s\". Deseja substituí-lo? \nSubstituir o certificado pode afetar a sua ligação a quaisquer ambientes que o utilizem atualmente. + Já existe um certificado com o pseudónimo \"%s\". Deseja substituí-lo? \nSubstituir o certificado pode afetar a sua ligação a quaisquer ambientes que o utilizem atualmente. Substituir o certificado Não é possível ler o certificado. Não é possível eliminar a sua conta diff --git a/app/src/main/res/values-ro-rRO/strings.xml b/app/src/main/res/values-ro-rRO/strings.xml index 7d1be198fc..5825042d01 100644 --- a/app/src/main/res/values-ro-rRO/strings.xml +++ b/app/src/main/res/values-ro-rRO/strings.xml @@ -642,7 +642,10 @@ Scanarea se va face automat. Trimitere link Căutare Send-uri Editare Send - Adăugare Send + Edit file Send + Edit text Send + New file Send + New text Send Sigur doriți să ștergeți acest Send? Send-ul a fost șters Send salvat @@ -990,11 +993,9 @@ Doriți să comutați la acest cont? Verificare utilizator Create account on Create account on: - Follow the instructions in the email sent to %1$s to continue creating your account. Am trimis un e-mail către %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 - Setează parola Dezabonare Verifică-ți e-mailul Deschide aplicația de email @@ -1260,7 +1261,7 @@ Doriți să comutați la acest cont? Log deleted App settings Replace existing certificate? - A certificate with this alias \"%s\" already exists. Do you want to replace it?\nReplace the certificate may impact your connection to any environments currently using it. + 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 diff --git a/app/src/main/res/values-ru-rRU/strings.xml b/app/src/main/res/values-ru-rRU/strings.xml index e5663ebdd9..bed9ecafbd 100644 --- a/app/src/main/res/values-ru-rRU/strings.xml +++ b/app/src/main/res/values-ru-rRU/strings.xml @@ -111,7 +111,7 @@ Изменение элемента Изменить логин Редактировать карту - Редактировать личность + Редактировать личную информацию Редактировать заметку Редактировать passkey Разрешить автоматическую синхронизацию @@ -165,8 +165,8 @@ В вашем хранилище нет карт. Новая карта В вашем хранилище нет логинов. - В вашем хранилище нет личностей. - Новая личность + В вашем хранилище нет личной информации. + Новая личная информация В вашем хранилище нет заметок. Новая заметка Новый passkey @@ -217,7 +217,7 @@ Просмотр элемента Просмотр логина Просмотр карты - Просмотр личности + Просмотр личной информации Просмотр заметки Просмотр passkey Веб-хранилище Bitwarden @@ -317,7 +317,7 @@ Номер Код безопасности Карта - Личность + Личная информация Логин Защищенная заметка Строка адреса 1 @@ -426,7 +426,7 @@ Самый простой способ добавлять новые логины в хранилище - использовать расширение автозаполнения паролей Bitwarden. Дополнительные сведения об использовании расширения автозаполнения паролей Bitwarden находятся в разделе \'Настройки\'. Неверный адрес email. Карты - Личные данные + Личная информация Идентификация Логины Защищенные заметки @@ -642,7 +642,10 @@ Ссылка на Send Поиск Send’ов Изменить Send - Новая Send + Изменить файловую Send + Изменить тестовую Send + Новая файловая Send + Новая текстовая Send Вы действительно хотите удалить эту Send? Send удалена Send сохранена @@ -992,11 +995,9 @@ Верификация пользователя Создать аккаунт на Создать аккаунт на: - Следуйте инструкциям из письма, отправленного %1$s, чтобы продолжить создание аккаунта. Мы отправили письмо %1$s. Продолжая, вы принимаете Условия предоставления услуг и Политику конфиденциальности При активации этого переключателя, вы принимаете Условия предоставления услуг и Политику конфиденциальности - Задать пароль Отписаться Проверьте свою почту Открыть приложение электронной почты @@ -1007,7 +1008,7 @@ Получайте электронные письма от Bitwarden с анонсами, советами и возможностями для исследований. Отписаться можно в любое время. Получайте советы, объявления и исследования от Bitwarden в свой почтовый ящик. Отписаться можно в любое время. Безопасность, приоритет - Сохраняйте логины, карты и личные данные в своем защищенном хранилище. Bitwarden использует сквозное шифрование, чтобы защитить то, что для вас важно. + Сохраняйте логины, карты и личную информацию в своем защищенном хранилище. Bitwarden использует сквозное шифрование, чтобы защитить то, что для вас важно. Настройте биометрическую разблокировку и автозаполнение, чтобы входить в свои аккаунты, не набирая ни одной буквы. Быстрая и простая авторизация Сделайте авторизацию еще проще diff --git a/app/src/main/res/values-si-rLK/strings.xml b/app/src/main/res/values-si-rLK/strings.xml index 91e57b4bfe..fe6f3cb801 100644 --- a/app/src/main/res/values-si-rLK/strings.xml +++ b/app/src/main/res/values-si-rLK/strings.xml @@ -642,7 +642,10 @@ Scanning will happen automatically. Send link Search Sends Edit Send - New 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 saved @@ -990,11 +993,9 @@ Do you want to switch to this account? User verification Create account on Create account on: - Follow the instructions in the email sent to %1$s to continue creating your account. 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 - Set password Unsubscribe Check your email Open email app @@ -1260,7 +1261,7 @@ Do you want to switch to this account? Log deleted App settings Replace existing certificate? - A certificate with this alias \"%s\" already exists. Do you want to replace it?\nReplace the certificate may impact your connection to any environments currently using it. + 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 diff --git a/app/src/main/res/values-sk-rSK/strings.xml b/app/src/main/res/values-sk-rSK/strings.xml index 98a75283fe..f6646e3f18 100644 --- a/app/src/main/res/values-sk-rSK/strings.xml +++ b/app/src/main/res/values-sk-rSK/strings.xml @@ -642,7 +642,10 @@ Skenovanie prebehne automaticky. Odkaz na Send Hľadať Sendy Upraviť Send - Pridať Send + Upraviť súborový Send + Upraviť textový Send + Nový súborový Send + Nový textový Send Naozaj chcete odstrániť tento Send? Send bol odstránený. Send bol aktualizovaný. @@ -990,11 +993,9 @@ Chcete prepnúť na tento účet? Overenie používateľa Vytvoriť účet na Vytvoriť účet na: - Na vytvorenie účtu postupujte podľa pokynov v e-maile zaslanom na %1$s. Poslali sme e-mail na adresu %1$s. Ak budete pokračovať, tak súhlasíte s Podmienkami používania a Zásadami ochrany osobných údajov Aktivovaním tohto prepínača súhlasíte s Podmienkami služby a Zásadami ochrany osobných údajov - Nastaviť heslo Odhlásiť sa z odberu Skontrolujte si svoj e-mail Otvoriť e-mailovú aplikáciu diff --git a/app/src/main/res/values-sl-rSI/strings.xml b/app/src/main/res/values-sl-rSI/strings.xml index e83bf5254e..ac457933c9 100644 --- a/app/src/main/res/values-sl-rSI/strings.xml +++ b/app/src/main/res/values-sl-rSI/strings.xml @@ -642,7 +642,10 @@ Scanning will happen automatically. Povezava pošiljke Išči med pošiljkami Uredi pošiljko - Nova pošiljka + Edit file Send + Edit text Send + New file Send + New text Send Ali želite izbrisati to pošiljko? Pošiljka je bila izbrisana. Pošiljka shranjena. @@ -990,11 +993,9 @@ Do you want to switch to this account? User verification Create account on Create account on: - Follow the instructions in the email sent to %1$s to continue creating your account. 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 - Set password Unsubscribe Check your email Open email app @@ -1260,7 +1261,7 @@ Do you want to switch to this account? Log deleted App settings Replace existing certificate? - A certificate with this alias \"%s\" already exists. Do you want to replace it?\nReplace the certificate may impact your connection to any environments currently using it. + 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 diff --git a/app/src/main/res/values-sr-rSP/strings.xml b/app/src/main/res/values-sr-rSP/strings.xml index a6d6e64d01..8260515e3c 100644 --- a/app/src/main/res/values-sr-rSP/strings.xml +++ b/app/src/main/res/values-sr-rSP/strings.xml @@ -642,7 +642,10 @@ Пошаљи повезницу Претражи слања Уреди слање - Додај слање + Уред датотеке Send + Уред текст Send + Нова датотека Send + Нови текст Send Да ли си сигуран да желиш да избришеш ово слање? Слање је избрисано Слање је сачувано @@ -990,11 +993,9 @@ Верификација корисника Направи налог на Направи налог на: - Прати упутства из Е-поште који су послата на %1$s да наставиш са прављењем налога. Послали смо Е-пошту на %1$s. Ако наставите, слажете се са Услови коришћења услуге и Политике приватности Активирањем ове опције, прихватате Услове коришћења и Политику приватности - Поставити лозинку Одјави се Погледај своје пријемно сандуче у Е-пошти Отвори апликацију за Е-пошту @@ -1265,12 +1266,12 @@ Није могуће прочитати сертификат. Није могуће избрисати Ваш налог Ова радња се не може довршити јер је ваш налог у власништву организације. Обратите се администратору своје организације за додатне детаље. - This account will soon be deleted. Log in at %1$s to continue using Bitwarden. - View file Send - View text Send - Delete send + Овај рачун ће ускоро бити избрисан. Пријавити се на %1$s да анставите са употребом Bitwarden-а. + Преглед датотеке Send + Преглед текст Send + Избриши „Send“ Missing Send re-sync your vault - Dynamic colors - Apply dynamic colors based on your wallpaper - Dynamic colors uses the system colors and may not meet all accessibility guidelines. + Динамичке боје + Примените динамичке боје на основу позадине + Динамичне боје користе боје система и не могу да испуне све смернице за приступачност. diff --git a/app/src/main/res/values-sv-rSE/strings.xml b/app/src/main/res/values-sv-rSE/strings.xml index 433a6a81d1..385bc2af50 100644 --- a/app/src/main/res/values-sv-rSE/strings.xml +++ b/app/src/main/res/values-sv-rSE/strings.xml @@ -643,7 +643,10 @@ Skanningen sker automatiskt. Send-länk Sök bland Send Redigera Send - Ny Send + Edit file Send + Edit text Send + New file Send + New text Send Är du säker på att du vill radera denna Send? Send har raderats Send har sparats @@ -991,11 +994,9 @@ Vill du byta till detta konto? User verification Create account on Create account on: - Follow the instructions in the email sent to %1$s to continue creating your account. Vi har skickat ett e-postmeddelande till %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 - Ställ in lösenord Unsubscribe Kontrollera din e-post Open email app @@ -1261,7 +1262,7 @@ Vill du byta till detta konto? Log deleted App settings Replace existing certificate? - A certificate with this alias \"%s\" already exists. Do you want to replace it?\nReplace the certificate may impact your connection to any environments currently using it. + 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 diff --git a/app/src/main/res/values-ta-rIN/strings.xml b/app/src/main/res/values-ta-rIN/strings.xml index 5c84d760ed..916d6f736a 100644 --- a/app/src/main/res/values-ta-rIN/strings.xml +++ b/app/src/main/res/values-ta-rIN/strings.xml @@ -642,7 +642,10 @@ Send தொடுப்பு Sends தேடு Send திருத்து - புதிய Send + Edit file Send + Edit text Send + New file Send + New text Send இந்த Send ஐ அழிக்க உறுதியா? Send அழிக்கப்பட்டது Send சேமிக்கப்பட்டது @@ -990,11 +993,9 @@ User verification Create account on Create account on: - Follow the instructions in the email sent to %1$s to continue creating your account. 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 - Set password Unsubscribe Check your email Open email app @@ -1260,7 +1261,7 @@ Log deleted App settings Replace existing certificate? - A certificate with this alias \"%s\" already exists. Do you want to replace it?\nReplace the certificate may impact your connection to any environments currently using it. + 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 diff --git a/app/src/main/res/values-te-rIN/strings.xml b/app/src/main/res/values-te-rIN/strings.xml index be702fb43d..bdd7aa4411 100644 --- a/app/src/main/res/values-te-rIN/strings.xml +++ b/app/src/main/res/values-te-rIN/strings.xml @@ -642,7 +642,10 @@ Scanning will happen automatically. Send link Search Sends Edit Send - New 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 saved @@ -990,11 +993,9 @@ Do you want to switch to this account? User verification Create account on Create account on: - Follow the instructions in the email sent to %1$s to continue creating your account. 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 - Set password Unsubscribe Check your email Open email app @@ -1260,7 +1261,7 @@ Do you want to switch to this account? Log deleted App settings Replace existing certificate? - A certificate with this alias \"%s\" already exists. Do you want to replace it?\nReplace the certificate may impact your connection to any environments currently using it. + 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 diff --git a/app/src/main/res/values-th-rTH/strings.xml b/app/src/main/res/values-th-rTH/strings.xml index c2a347c0ad..e809e71d8d 100644 --- a/app/src/main/res/values-th-rTH/strings.xml +++ b/app/src/main/res/values-th-rTH/strings.xml @@ -642,7 +642,10 @@ Scanning will happen automatically. Send link Search Sends Edit Send - New 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 saved @@ -990,11 +993,9 @@ Do you want to switch to this account? User verification Create account on Create account on: - Follow the instructions in the email sent to %1$s to continue creating your account. 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 - Set password Unsubscribe Check your email Open email app @@ -1260,7 +1261,7 @@ Do you want to switch to this account? Log deleted App settings Replace existing certificate? - A certificate with this alias \"%s\" already exists. Do you want to replace it?\nReplace the certificate may impact your connection to any environments currently using it. + 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 diff --git a/app/src/main/res/values-tr-rTR/strings.xml b/app/src/main/res/values-tr-rTR/strings.xml index b0998c8267..07927f448f 100644 --- a/app/src/main/res/values-tr-rTR/strings.xml +++ b/app/src/main/res/values-tr-rTR/strings.xml @@ -642,7 +642,10 @@ Kod otomatik olarak taranacaktır. Send bağlantısı Send\'lerde ara Send\'i düzenle - Yeni Send + Send dosyasını düzenle + Send metnini düzenle + Yeni Send dosyası + Yeni Send metni Bu Send\'i silmek istediğinizden emin misiniz? Send silindi Send kaydedildi @@ -989,11 +992,9 @@ Bu hesaba geçmek ister misiniz? Kullanıcı doğrulama Create account on Hesabın oluşturulacağı konum: - Hesabınızı oluşturmaya devam etmek için %1$s adresine gönderdiğimiz e-postadaki yönergeleri uygulayın. %1$s adresine bir e-posta gönderdik. Devam etmeniz halinde Hizmet Şartları ve Gizlilik Politikası\'nı kabul etmiş olursunuz By activating this switch, you agree to the Terms of Service and Privacy Policy - Parola belirle Aboneliği iptal et E-postanızı kontrol edin E-Posta uygulamasını aç @@ -1259,7 +1260,7 @@ Bu hesaba geçmek ister misiniz? Log deleted Uygulama ayarları Replace existing certificate? - A certificate with this alias \"%s\" already exists. Do you want to replace it?\nReplace the certificate may impact your connection to any environments currently using it. + 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. Hesabınız silinemiyor diff --git a/app/src/main/res/values-uk-rUA/strings.xml b/app/src/main/res/values-uk-rUA/strings.xml index 487238b7c9..b69c8c3135 100644 --- a/app/src/main/res/values-uk-rUA/strings.xml +++ b/app/src/main/res/values-uk-rUA/strings.xml @@ -627,7 +627,7 @@ Максимальна кількість доступів Якщо встановлено, користувачі більше не зможуть отримати доступ до цього відправлення після досягнення максимальної кількості доступів. Досягнуто максимальної кількості доступів - Поточна кількість доступів + Поточна кількість доступів: %s Новий пароль Вимагати цей пароль для перегляду відправлення. Вилучити пароль @@ -642,7 +642,10 @@ Посилання на відправлення Шукати відправлення Редагування - Нове відправлення + Редагувати файлове відправлення + Редагувати текстове відправлення + Нове файлове відправлення + Нове текстове відправлення Ви дійсно хочете видалити це відправлення? Відправлення видалено Відправлення збережено @@ -990,11 +993,9 @@ Перевірка користувача Створити обліковий запис на Створити обліковий запис на: - Дотримуйтесь інструкцій у повідомленні, надісланому на %1$s, щоб продовжити створення облікового запису. Ми надіслали електронний лист на %1$s. Продовжуючи, ви погоджуєтеся з Умовами користування і Політикою приватності Активуючи цей перемикач, ви погоджуєтеся з Умовами користування і Політикою приватності - Встановіть пароль Відписатися Перевірте свою електронну пошту Відкрийте програму електронної пошти @@ -1270,9 +1271,9 @@ Цей обліковий запис незабаром буде видалено. Виконайте вхід на %1$s, щоб продовжити використання Bitwarden. Переглянути файлове відправлення Переглянути текстове відправлення - Delete send - Missing Send re-sync your vault - Dynamic colors - Apply dynamic colors based on your wallpaper - Dynamic colors uses the system colors and may not meet all accessibility guidelines. + Видалити відправлення + Немає відправлення. Повторно синхронізуйте сховище. + Динамічні кольори + Застосувати динамічні кольори на основі ваших шпалер + Для динамічних кольорів використовуються системні кольори, які можуть не відповідати всім рекомендаціям щодо доступності. diff --git a/app/src/main/res/values-vi-rVN/strings.xml b/app/src/main/res/values-vi-rVN/strings.xml index c4e773ff5a..d05f977d6f 100644 --- a/app/src/main/res/values-vi-rVN/strings.xml +++ b/app/src/main/res/values-vi-rVN/strings.xml @@ -56,7 +56,7 @@ Xác thực Tên mục Tên mục (bắt buộc) - "Tên người gửi (bắt buộc)" + "Tên mục Gửi (bắt buộc)" Không Ghi chú Ghi chú riêng @@ -172,11 +172,11 @@ Mã khoá mới Thêm mục Mã SSH mới - Không có mục Gửi Văn bản nào trong kho của bạn. - Không có mục Gửi File nào trong kho của bạn. + Không có văn bản Gửi trong kho của bạn. + Không có tập tin Gửi trong kho của bạn. Không có mã SSH nào trong kho của bạn. - Gửi văn bản - Gửi file + Văn bản Gửi mới + Tập tin Gửi mới Không có tên đăng nhập Thông tin đăng nhập này không có tên người dùng hoặc mật khẩu được định cấu hình. Ok, tôi đã hiểu! @@ -259,7 +259,7 @@ Mã khôi phục Lưu Lưu email - Gửi lại email chứa mã xác nhận + Gửi lại mã Tùy chọn xác minh 2 bước Sử dụng phương pháp xác thực hai lớp khác Không thể gửi email xác minh. Thử lại. @@ -602,7 +602,7 @@ Quá trình quét sẽ diễn ra tự động. Do chính sách của tổ chức, bạn không được lưu trữ mục trong kho mật khẩu cá nhân. Chính sách của tổ chức đang ảnh hưởng đến các tùy chọn quyền sở hữu của bạn. Gửi - Chi tiết gửi + Chi tiết Gửi Tất cả mục Gửi Gửi Văn bản @@ -636,13 +636,16 @@ Quá trình quét sẽ diễn ra tự động. Mật khẩu đã được xóa. Ghi chú riêng tư về mục Gửi này. Không có mục Gửi trong tài khoản của bạn. - Thêm mục Gửi + Mục Gửi mới Sao chép liên kết Chia sẻ liên kết Liên kết Gửi Tìm kiếm mục Gửi Sửa mục Gửi - Mục Gửi mới + Chỉnh sửa tập tin Gửi + Chỉnh sửa văn bản Gửi + Tập tin Gửi mới + Văn bản Gửi mới Bạn có chắc muốn mục Gửi này? Đã xóa mục Gửi Đã lưu mục Gửi @@ -990,11 +993,9 @@ Bạn có muốn chuyển sang tài khoản này không? Xác minh người dùng Tạo tài khoản Đang tạo tài khoản: - Làm theo hướng dẫn trong email được gửi tới %1$s để tiếp tục tạo tài khoản của bạn. Chúng tôi đã gửi một email tới %1$s. Nếu tiếp tục, bạn đồng ý Điều khoản dịch vụ và Chính sách bảo mật Kích hoạt nghĩa là bạn đồng ý Điều khoản Dịch vụ và Chính sách Bảo mật - Đặt mật khẩu Hủy đăng ký Kiểm tra email của bạn Mở ứng dụng email @@ -1256,7 +1257,7 @@ bất kỳ sự cố nào. Mật khẩu chính không còn cần thiết đối với các thành viên của tổ chức. Vui lòng xác nhận tên miền bên dưới với quản trị viên tổ chức của bạn. Vui lòng xác nhận tên miền bên dưới với quản trị viên tổ chức của bạn.\n\nTên miền kết nối khóa:\n%1$s Bộ lưu chuyến bay - Bộ lưu chuyến bay sẽ kích hoạt cho tới %1$s vào %2$s. Đến cài đặt để hủy kích hoạt ngay. + Bộ lưu chuyến bay sẽ kích hoạt cho tới %1$s vào %2$s. Đến Cài đặt để hủy kích hoạt ngay. Chuyển đến Cài đặt Đã xóa tất cả nhật ký Đã xóa nhật ký @@ -1268,7 +1269,7 @@ bất kỳ sự cố nào. Không thể xóa tài khoản Không thể thực hiện hành động này vì tài khoản của bạn thuộc sở hữu của một tổ chức. Liên hệ với quản trị viên tổ chức của bạn để biết thêm thông tin chi tiết. Tài khoản này sẽ sớm bị xóa. Đăng nhập %1$s để tiếp tục sử dụng Bitwarden. - Xem file Gửi + Xem tập tin Gửi Xem văn bản Gửi Xóa Gửi Thiếu Gửi, đồng bộ lại kho của bạn diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 25323ee4a8..54c10adbac 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -620,9 +620,9 @@ 此 Send 将在指定的日期和时间后被永久删除。 待删除 已过期 - %s 后过期 + %s 过期 明天过期 - %s 后过期 + %s 过期 %1$s %2$s 后停止记录 最大访问次数 设置后,当达到最大访问次数时用户将不再能够访问此 Send。 @@ -642,7 +642,10 @@ Send 链接 搜索 Send 编辑 Send - 新增 Send + 编辑文件 Send + 编辑文本 Send + 新增文件 Send + 新增文本 Send 确定要删除此 Send 吗? Send 已删除 Send 已保存 @@ -990,11 +993,9 @@ 用户验证 创建账户至 创建账户至: - 按照发送到 %1$s 的电子邮件中的说明继续创建您的账户。 我们向 %1$s 发送了一封电子邮件。 若继续,表示您同意 服务条款 和 隐私政策 激活此开关,表示您同意 服务条款 和 隐私政策 - 设置密码 取消订阅 检查您的电子邮箱 打开电子邮箱 App @@ -1231,7 +1232,8 @@ 没有日志被记录 遇到问题了吗? 启用临时日志记录,以在本地收集和检查日志。启用后,可能会记录应用程序状态和网络调用,但绝不会记录敏感的密码库信息。 - 要开始使用,请设置日志记录持续时间。日志记录将在该时间段后自动关闭,方便您在复现问题时捕获相关活动。 + 要开始使用,请设置日志记录持续时间,以便您在复现问题时捕获相关活动。 +日志记录将在该时间段后自动停用。 日志将在 30 天后自动删除。只有当您共享它时,Bitwarden 才能访问您的日志数据。 要了解哪些内容会被记录、哪些不会被记录,请访问\nBitwarden 帮助中心。 日志记录持续时间 @@ -1260,12 +1262,12 @@ 日志已删除 App 设置 替换现有证书吗? - 别名为「%s」的证书已经存在。您想要替换它吗?\n替换证书可能会影响与当前使用该证书的任何环境的连接。 + 别名为「%s」的证书已经存在。您要替换它吗?\n替换该证书可能会影响您与当前使用该证书的任何环境的连接。 替换证书 无法读取证书。 无法删除您的账户 此操作无法完成,因为您的账户归组织所有。请联系您的组织管理员获取详细信息。 - 此账户将很快被删除。请在 %1$s 前登录以继续使用 Bitwarden。 + 此账户即将被删除。请在 %1$s 前登录以继续使用 Bitwarden。 查看文件 Send 查看文本 Send 删除 Send diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 24feb6a58a..d67128eda2 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -642,7 +642,10 @@ Send 連結 搜尋 Send 編輯 Send - 建立新 Send + Edit file Send + Edit text Send + New file Send + New text Send 您確定要刪除此 Send 嗎? 已刪除 Send 已更新 Send。 @@ -990,11 +993,9 @@ 使用者驗證 Create account on Create account on: - 依照傳送至 %1$s 的電子郵件中提供的說明操作以繼續建立您的帳號。 我們向 %1$s 傳送了一封電子郵件。 若繼續,表示您同意 服務條款 及 隱私權政策 By activating this switch, you agree to the Terms of Service and Privacy Policy - 設定密碼 取消訂閱 檢查您的電子郵件 開啟電子郵件 App @@ -1260,7 +1261,7 @@ Log deleted App settings Replace existing certificate? - A certificate with this alias \"%s\" already exists. Do you want to replace it?\nReplace the certificate may impact your connection to any environments currently using it. + 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 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index fe384b83f3..516403cb9a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -846,7 +846,6 @@ Do you want to switch to this account? 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? - Organization SSO identifier required. Add the key to an existing or new item There are no items in your vault that match \"%1$s\" Search for an item or add a new item @@ -993,11 +992,9 @@ Do you want to switch to this account? User verification Create account on Create account on: - Follow the instructions in the email sent to %1$s to continue creating your account. 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 - Set password Unsubscribe Check your email Open email app @@ -1122,7 +1119,6 @@ Do you want to switch to this account? Got it No logins were imported Import error - Verified SSO Domain Endpoint Logins imported Remember to delete your imported password file from your computer SSH key @@ -1263,7 +1259,7 @@ Do you want to switch to this account? Log deleted App settings Replace existing certificate? - A certificate with this alias \"%s\" already exists. Do you want to replace it?\nReplace the certificate may impact your connection to any environments currently using it. + 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 diff --git a/app/src/main/res/values/strings_non_localized.xml b/app/src/main/res/values/strings_non_localized.xml index 2b9ba447b9..a6dcbf0e50 100644 --- a/app/src/main/res/values/strings_non_localized.xml +++ b/app/src/main/res/values/strings_non_localized.xml @@ -9,7 +9,6 @@ Email Verification - Onboarding Flow Import Logins Flow Feature Flags: Debug Menu diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 4ae391cbeb..05ca0b6eb5 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -2,13 +2,11 @@ diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/data/auth/repository/AuthRepositoryTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/data/auth/repository/AuthRepositoryTest.kt index 4ceb6d15f4..5b47fb8180 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/data/auth/repository/AuthRepositoryTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/data/auth/repository/AuthRepositoryTest.kt @@ -28,7 +28,6 @@ import com.bitwarden.network.model.IdentityTokenAuthModel import com.bitwarden.network.model.KdfTypeJson import com.bitwarden.network.model.KeyConnectorMasterKeyResponseJson import com.bitwarden.network.model.OrganizationAutoEnrollStatusResponseJson -import com.bitwarden.network.model.OrganizationDomainSsoDetailsResponseJson import com.bitwarden.network.model.OrganizationKeysResponseJson import com.bitwarden.network.model.OrganizationType import com.bitwarden.network.model.PasswordHintResponseJson @@ -87,7 +86,6 @@ import com.x8bit.bitwarden.data.auth.repository.model.LeaveOrganizationResult import com.x8bit.bitwarden.data.auth.repository.model.LoginResult import com.x8bit.bitwarden.data.auth.repository.model.LogoutReason import com.x8bit.bitwarden.data.auth.repository.model.NewSsoUserResult -import com.x8bit.bitwarden.data.auth.repository.model.OrganizationDomainSsoDetailsResult import com.x8bit.bitwarden.data.auth.repository.model.PasswordHintResult import com.x8bit.bitwarden.data.auth.repository.model.PasswordStrengthResult import com.x8bit.bitwarden.data.auth.repository.model.PrevalidateSsoResult @@ -118,13 +116,11 @@ import com.x8bit.bitwarden.data.auth.util.YubiKeyResult import com.x8bit.bitwarden.data.auth.util.toSdkParams import com.x8bit.bitwarden.data.platform.error.MissingPropertyException import com.x8bit.bitwarden.data.platform.error.NoActiveUserException -import com.x8bit.bitwarden.data.platform.manager.FeatureFlagManager import com.x8bit.bitwarden.data.platform.manager.FirstTimeActionManager import com.x8bit.bitwarden.data.platform.manager.LogsManager import com.x8bit.bitwarden.data.platform.manager.PolicyManager import com.x8bit.bitwarden.data.platform.manager.PushManager import com.x8bit.bitwarden.data.platform.manager.model.FirstTimeState -import com.x8bit.bitwarden.data.platform.manager.model.FlagKey import com.x8bit.bitwarden.data.platform.manager.model.NotificationLogoutData import com.x8bit.bitwarden.data.platform.repository.SettingsRepository import com.x8bit.bitwarden.data.platform.repository.util.FakeEnvironmentRepository @@ -255,10 +251,6 @@ class AuthRepositoryTest { } returns mutableActivePolicyFlow } - private val featureFlagManager: FeatureFlagManager = mockk(relaxed = true) { - every { getFeatureFlag(FlagKey.OnboardingFlow) } returns false - } - private val firstTimeActionManager = mockk { every { currentOrDefaultUserFirstTimeState } returns FIRST_TIME_STATE every { firstTimeStateFlow } returns MutableStateFlow(FIRST_TIME_STATE) @@ -287,7 +279,6 @@ class AuthRepositoryTest { dispatcherManager = dispatcherManager, pushManager = pushManager, policyManager = policyManager, - featureFlagManager = featureFlagManager, firstTimeActionManager = firstTimeActionManager, logsManager = logsManager, ) @@ -4752,6 +4743,7 @@ class AuthRepositoryTest { every { type } returns OrganizationType.USER every { keyConnectorUrl } returns null every { userIsClaimedByOrganization } returns false + every { limitItemDeletion } returns false }, ) fakeAuthDiskSource.storeOrganizations(userId = USER_ID_1, organizations = organizations) @@ -4782,6 +4774,7 @@ class AuthRepositoryTest { every { type } returns OrganizationType.USER every { keyConnectorUrl } returns url every { userIsClaimedByOrganization } returns false + every { limitItemDeletion } returns false }, ) fakeAuthDiskSource.storeOrganizations(userId = USER_ID_1, organizations = organizations) @@ -4820,6 +4813,7 @@ class AuthRepositoryTest { every { type } returns OrganizationType.USER every { keyConnectorUrl } returns url every { userIsClaimedByOrganization } returns false + every { limitItemDeletion } returns false }, ) fakeAuthDiskSource.storeOrganizations(userId = USER_ID_1, organizations = organizations) @@ -4861,6 +4855,7 @@ class AuthRepositoryTest { every { type } returns OrganizationType.USER every { keyConnectorUrl } returns url every { userIsClaimedByOrganization } returns false + every { limitItemDeletion } returns false }, ) fakeAuthDiskSource.storeOrganizations(userId = USER_ID_1, organizations = organizations) @@ -4901,6 +4896,7 @@ class AuthRepositoryTest { every { type } returns OrganizationType.USER every { keyConnectorUrl } returns url every { userIsClaimedByOrganization } returns false + every { limitItemDeletion } returns false }, ) fakeAuthDiskSource.storeOrganizations(userId = USER_ID_1, organizations = organizations) @@ -5662,39 +5658,6 @@ class AuthRepositoryTest { assertFalse(repository.showWelcomeCarousel) } - @Test - fun `getOrganizationDomainSsoDetails Failure should return Failure `() = runTest { - val email = "test@gmail.com" - val throwable = Throwable("Fail!") - coEvery { - organizationService.getOrganizationDomainSsoDetails(email) - } returns throwable.asFailure() - val result = repository.getOrganizationDomainSsoDetails(email) - assertEquals(OrganizationDomainSsoDetailsResult.Failure(error = throwable), result) - } - - @Test - fun `getOrganizationDomainSsoDetails Success should return Success`() = runTest { - val email = "test@gmail.com" - coEvery { - organizationService.getOrganizationDomainSsoDetails(email) - } returns OrganizationDomainSsoDetailsResponseJson( - isSsoAvailable = true, - organizationIdentifier = "Test Org", - verifiedDate = ZonedDateTime.parse("2023-10-27T12:00:00Z"), - ) - .asSuccess() - val result = repository.getOrganizationDomainSsoDetails(email) - assertEquals( - OrganizationDomainSsoDetailsResult.Success( - isSsoAvailable = true, - organizationIdentifier = "Test Org", - verifiedDate = ZonedDateTime.parse("2023-10-27T12:00:00Z"), - ), - result, - ) - } - @Test fun `getVerifiedOrganizationDomainSsoDetails Success should return Success`() = runTest { val email = "test@gmail.com" @@ -6737,13 +6700,12 @@ class AuthRepositoryTest { @Test @Suppress("MaxLineLength") - fun `on successful login a new user should have onboarding status set if feature flag is on and has not previously logged in`() = + fun `on successful login a new user should have onboarding status set if has not previously logged in`() = runTest { val successResponse = GET_TOKEN_RESPONSE_SUCCESS coEvery { identityService.preLogin(email = EMAIL) } returns PRE_LOGIN_SUCCESS.asSuccess() - every { featureFlagManager.getFeatureFlag(FlagKey.OnboardingFlow) } returns true coEvery { identityService.getToken( email = EMAIL, @@ -6797,73 +6759,12 @@ class AuthRepositoryTest { } @Test - fun `on successful login does not set onboarding status if feature flag is off`() = + fun `on successful login does not set onboarding status if user has previously logged in`() = runTest { val successResponse = GET_TOKEN_RESPONSE_SUCCESS coEvery { identityService.preLogin(email = EMAIL) } returns PRE_LOGIN_SUCCESS.asSuccess() - every { featureFlagManager.getFeatureFlag(FlagKey.OnboardingFlow) } returns false - coEvery { - identityService.getToken( - email = EMAIL, - authModel = IdentityTokenAuthModel.MasterPassword( - username = EMAIL, - password = PASSWORD_HASH, - ), - captchaToken = null, - uniqueAppId = UNIQUE_APP_ID, - ) - } returns successResponse.asSuccess() - coEvery { - vaultRepository.unlockVault( - userId = USER_ID_1, - email = EMAIL, - kdf = ACCOUNT_1.profile.toSdkParams(), - initUserCryptoMethod = InitUserCryptoMethod.Password( - password = PASSWORD, - userKey = successResponse.key!!, - ), - privateKey = successResponse.privateKey!!, - organizationKeys = null, - ) - } returns VaultUnlockResult.Success - coEvery { vaultRepository.syncIfNecessary() } just runs - every { - GET_TOKEN_RESPONSE_SUCCESS.toUserState( - previousUserState = null, - environmentUrlData = EnvironmentUrlDataJson.DEFAULT_US, - ) - } returns SINGLE_USER_STATE_1 - val result = repository.login(email = EMAIL, password = PASSWORD, captchaToken = null) - assertEquals(LoginResult.Success, result) - assertEquals(AuthState.Authenticated(ACCESS_TOKEN), repository.authStateFlow.value) - coVerify { identityService.preLogin(email = EMAIL) } - fakeAuthDiskSource.assertPrivateKey( - userId = USER_ID_1, - privateKey = "privateKey", - ) - fakeAuthDiskSource.assertUserKey( - userId = USER_ID_1, - userKey = "key", - ) - fakeAuthDiskSource.assertMasterPasswordHash( - userId = USER_ID_1, - passwordHash = PASSWORD_HASH, - ) - verify { settingsRepository.setDefaultsIfNecessary(userId = USER_ID_1) } - assertNull(fakeAuthDiskSource.getOnboardingStatus(USER_ID_1)) - } - - @Suppress("MaxLineLength") - @Test - fun `on successful login does not set onboarding status if feature flag is on but user has previously logged in`() = - runTest { - val successResponse = GET_TOKEN_RESPONSE_SUCCESS - coEvery { - identityService.preLogin(email = EMAIL) - } returns PRE_LOGIN_SUCCESS.asSuccess() - every { featureFlagManager.getFeatureFlag(FlagKey.OnboardingFlow) } returns true coEvery { identityService.getToken( email = EMAIL, 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 abd1d4f001..1151e9b6da 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 @@ -77,7 +77,7 @@ class BitwardenAccessibilityProcessorTest { } @Test - fun `processAccessibilityEvent with null event source should return`() { + fun `processAccessibilityEvent with null event source and root node should return`() { val event = mockk { every { source } returns null } @@ -89,6 +89,41 @@ class BitwardenAccessibilityProcessorTest { } } + @Test + fun `processAccessibilityEvent with null event source and invalid root node should return`() { + val event = mockk { + every { source } returns null + every { packageName } returns "event_package" + } + val rootNode = mockk { + every { packageName } returns "other_package" + } + + bitwardenAccessibilityProcessor.processAccessibilityEvent(event = event) { rootNode } + + verify(exactly = 0) { + powerManager.isInteractive + } + } + + @Test + fun `processAccessibilityEvent with null event source and valid root node should continue`() { + val event = mockk { + every { source } returns null + every { packageName } returns "package" + } + val rootNode = mockk { + every { packageName } returns "package" + } + every { powerManager.isInteractive } returns false + + bitwardenAccessibilityProcessor.processAccessibilityEvent(event = event) { rootNode } + + verify(exactly = 1) { + powerManager.isInteractive + } + } + @Test fun `processAccessibilityEvent with powerManager not interactive should return`() { val event = mockk { @@ -184,40 +219,6 @@ class BitwardenAccessibilityProcessorTest { } } - @Test - fun `processAccessibilityEvent with mismatched package name should return`() { - val testPackageName = "com.android.chrome" - val rootNode = mockk { - every { packageName } returns "other.package.name" - } - val node = mockk { - every { isSystemPackage } returns false - every { shouldSkipPackage } returns false - every { packageName } returns testPackageName - } - val event = mockk { - every { source } returns node - every { packageName } returns testPackageName - } - every { powerManager.isInteractive } returns true - every { launcherPackageNameManager.launcherPackages } returns emptyList() - every { - accessibilityAutofillManager.accessibilityAction - } returns AccessibilityAction.AttemptParseUri - every { accessibilityAutofillManager.accessibilityAction = null } just runs - every { accessibilityParser.parseForUriOrPackageName(rootNode = node) } returns null - - bitwardenAccessibilityProcessor.processAccessibilityEvent(event = event) { rootNode } - - verify(exactly = 1) { - powerManager.isInteractive - node.isSystemPackage - node.shouldSkipPackage - launcherPackageNameManager.launcherPackages - accessibilityAutofillManager.accessibilityAction - } - } - @Test fun `processAccessibilityEvent with AttemptParseUri and a invalid uri should show a toast`() { val testPackageName = "com.android.chrome" diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/data/platform/manager/FirstTimeActionManagerTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/data/platform/manager/FirstTimeActionManagerTest.kt index aff8375c48..75db2dfcd8 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/data/platform/manager/FirstTimeActionManagerTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/data/platform/manager/FirstTimeActionManagerTest.kt @@ -40,7 +40,6 @@ class FirstTimeActionManagerTest { private val mutableOnboardingFeatureFlow = MutableStateFlow(false) private val featureFlagManager = mockk { every { getFeatureFlagFlow(FlagKey.ImportLoginsFlow) } returns mutableImportLoginsFlow - every { getFeatureFlagFlow(FlagKey.OnboardingFlow) } returns mutableOnboardingFeatureFlow } private val mutableAutofillEnabledFlow = MutableStateFlow(false) @@ -313,17 +312,6 @@ class FirstTimeActionManagerTest { } } - @Test - fun `shouldShowAddLoginCoachMarkFlow updates when feature flag for onboarding updates`() = - runTest { - fakeAuthDiskSource.userState = MOCK_USER_STATE - firstTimeActionManager.shouldShowAddLoginCoachMarkFlow.test { - assertFalse(awaitItem()) - mutableOnboardingFeatureFlow.update { true } - assertTrue(awaitItem()) - } - } - @Suppress("MaxLineLength") @Test fun `if there are any login ciphers available for the active user should not show add login coach marks`() = @@ -377,18 +365,6 @@ class FirstTimeActionManagerTest { } } - @Test - fun `shouldShowGeneratorCoachMarkFlow updates when onboarding feature value changes`() = - runTest { - fakeAuthDiskSource.userState = MOCK_USER_STATE - firstTimeActionManager.shouldShowGeneratorCoachMarkFlow.test { - assertFalse(awaitItem()) - mutableOnboardingFeatureFlow.update { true } - // Take the value from disk. - assertTrue(awaitItem()) - } - } - @Suppress("MaxLineLength") @Test fun `if there are any login ciphers available for the active user should not show generator coach marks`() = diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/data/platform/manager/FlagKeyTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/data/platform/manager/FlagKeyTest.kt index f7e7db49bb..d53bbaf163 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/data/platform/manager/FlagKeyTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/data/platform/manager/FlagKeyTest.kt @@ -17,18 +17,10 @@ class FlagKeyTest { FlagKey.EmailVerification.keyName, "email-verification", ) - assertEquals( - FlagKey.OnboardingFlow.keyName, - "native-create-account-flow", - ) assertEquals( FlagKey.ImportLoginsFlow.keyName, "import-logins-flow", ) - assertEquals( - FlagKey.VerifiedSsoDomainEndpoint.keyName, - "pm-12337-refactor-sso-details-endpoint", - ) assertEquals( FlagKey.CredentialExchangeProtocolImport.keyName, "cxp-import-mobile", @@ -85,9 +77,7 @@ class FlagKeyTest { listOf( FlagKey.AuthenticatorSync, FlagKey.EmailVerification, - FlagKey.OnboardingFlow, FlagKey.ImportLoginsFlow, - FlagKey.VerifiedSsoDomainEndpoint, FlagKey.CredentialExchangeProtocolImport, FlagKey.CredentialExchangeProtocolExport, FlagKey.SingleTapPasskeyCreation, diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/data/platform/repository/DebugMenuRepositoryTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/data/platform/repository/DebugMenuRepositoryTest.kt index ada52050d3..a4eb369456 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/data/platform/repository/DebugMenuRepositoryTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/data/platform/repository/DebugMenuRepositoryTest.kt @@ -102,10 +102,6 @@ class DebugMenuRepositoryTest { FlagKey.EmailVerification, FlagKey.EmailVerification.defaultValue, ) - mockFeatureFlagOverrideDiskSource.saveFeatureFlag( - FlagKey.OnboardingFlow, - FlagKey.OnboardingFlow.defaultValue, - ) } debugMenuRepository.featureFlagOverridesUpdatedFlow.test { awaitItem() // initial value on subscription diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/completeregistration/CompleteRegistrationScreenTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/completeregistration/CompleteRegistrationScreenTest.kt index e59fe58f40..13421425cf 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/completeregistration/CompleteRegistrationScreenTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/completeregistration/CompleteRegistrationScreenTest.kt @@ -36,7 +36,6 @@ import kotlinx.coroutines.flow.update import org.junit.Assert.assertTrue import org.junit.Before import org.junit.Test -import org.robolectric.annotation.Config class CompleteRegistrationScreenTest : BitwardenComposeTest() { @@ -72,32 +71,6 @@ class CompleteRegistrationScreenTest : BitwardenComposeTest() { } } - @Test - fun `determine if using the old ui by title text`() { - composeTestRule - .onNodeWithText("Set password") - .assertIsDisplayed() - - composeTestRule - .onNode(hasText("Create account") and !hasClickAction()) - .assertDoesNotExist() - } - - @Test - fun `call to action with valid input click should send CreateAccountClick action`() { - mutableStateFlow.update { - it.copy( - passwordInput = "password1234", - confirmPasswordInput = "password1234", - ) - } - composeTestRule - .onNode(hasText("Create account") and hasClickAction()) - .assertIsEnabled() - .performClick() - verify { viewModel.trySendAction(CompleteRegistrationAction.CallToActionClick) } - } - @Test fun `close click should send CloseClick action`() { composeTestRule.onNodeWithContentDescription("Back").performClick() @@ -127,20 +100,21 @@ class CompleteRegistrationScreenTest : BitwardenComposeTest() { @Test fun `password input change should send PasswordInputChange action`() { - composeTestRule.onNodeWithText("Master password").performTextInput(TEST_INPUT) + composeTestRule.onNodeWithText("Master password (required)").performTextInput(TEST_INPUT) verify { viewModel.trySendAction(PasswordInputChange(TEST_INPUT)) } } @Test fun `confirm password input change should send ConfirmPasswordInputChange action`() { - composeTestRule.onNodeWithText("Re-type master password").performTextInput(TEST_INPUT) + composeTestRule.onNodeWithText("Re-type master password (required)") + .performTextInput(TEST_INPUT) verify { viewModel.trySendAction(ConfirmPasswordInputChange(TEST_INPUT)) } } @Test fun `password hint input change should send PasswordHintChange action`() { composeTestRule - .onNodeWithText("Master password hint (optional)") + .onNodeWithText("Master password hint") .performTextInput(TEST_INPUT) verify { viewModel.trySendAction(PasswordHintChange(TEST_INPUT)) } } @@ -202,27 +176,42 @@ class CompleteRegistrationScreenTest : BitwardenComposeTest() { @Test fun `password strength should change as state changes`() { mutableStateFlow.update { - DEFAULT_STATE.copy(passwordStrengthState = PasswordStrengthState.WEAK_1) + DEFAULT_STATE.copy( + passwordStrengthState = PasswordStrengthState.WEAK_1, + passwordInput = "123123123123", + ) } composeTestRule.onNodeWithText("Weak").performScrollTo().assertIsDisplayed() mutableStateFlow.update { - DEFAULT_STATE.copy(passwordStrengthState = PasswordStrengthState.WEAK_2) + DEFAULT_STATE.copy( + passwordStrengthState = PasswordStrengthState.WEAK_2, + passwordInput = "123123123123", + ) } composeTestRule.onNodeWithText("Weak").assertIsDisplayed() mutableStateFlow.update { - DEFAULT_STATE.copy(passwordStrengthState = PasswordStrengthState.WEAK_3) + DEFAULT_STATE.copy( + passwordStrengthState = PasswordStrengthState.WEAK_3, + passwordInput = "123123123123", + ) } composeTestRule.onNodeWithText("Weak").assertIsDisplayed() mutableStateFlow.update { - DEFAULT_STATE.copy(passwordStrengthState = PasswordStrengthState.GOOD) + DEFAULT_STATE.copy( + passwordStrengthState = PasswordStrengthState.GOOD, + passwordInput = "123123123123", + ) } composeTestRule.onNodeWithText("Good").assertIsDisplayed() mutableStateFlow.update { - DEFAULT_STATE.copy(passwordStrengthState = PasswordStrengthState.STRONG) + DEFAULT_STATE.copy( + passwordStrengthState = PasswordStrengthState.STRONG, + passwordInput = "123123123123", + ) } composeTestRule.onNodeWithText("Strong").assertIsDisplayed() } @@ -281,7 +270,7 @@ class CompleteRegistrationScreenTest : BitwardenComposeTest() { // New Onboarding UI tests @Test - fun `determine if using the new ui by title text`() = testWithFeatureFlagOn { + fun `determine if using the new ui by title text`() { composeTestRule .onNode(hasText("Create account") and !hasClickAction()) .assertIsDisplayed() @@ -292,106 +281,58 @@ class CompleteRegistrationScreenTest : BitwardenComposeTest() { } @Test - fun `call to action state should update with input based on if both fields are populated`() = - testWithFeatureFlagOn { - mutableStateFlow.update { - it.copy( - passwordInput = "", - confirmPasswordInput = "password1234", - ) - } - composeTestRule - .onNodeWithText("Next") - .assertIsNotEnabled() - .performScrollTo() - .performClick() - verify(exactly = 0) { - viewModel.trySendAction(CompleteRegistrationAction.CallToActionClick) - } - - mutableStateFlow.update { - it.copy( - passwordInput = "password1234", - confirmPasswordInput = "password1234", - ) - } - - composeTestRule - .onNodeWithText("Next") - .assertIsEnabled() - .performScrollTo() - .performClick() - verify(exactly = 1) { - viewModel.trySendAction(CompleteRegistrationAction.CallToActionClick) - } - } - - @Test - fun `Click on action card should send MakePasswordStrongClick action`() = - testWithFeatureFlagOn { - composeTestRule - .onNodeWithText("Learn more") - .performScrollTo() - .performClick() - - verify { viewModel.trySendAction(CompleteRegistrationAction.MakePasswordStrongClick) } - } - - @Test - fun `Click on prevent account lockout should send LearnToPreventLockoutClick action`() = - testWithFeatureFlagOn { - composeTestRule - .onNodeWithText("Learn about other ways to prevent account lockout") - .performScrollTo() - .performClick() - - verify { - viewModel.trySendAction(CompleteRegistrationAction.LearnToPreventLockoutClick) - } - } - - @Test - fun `Header should be displayed in portrait mode`() = testWithFeatureFlagOn { - composeTestRule - .onNodeWithText("Choose your master password") - .performScrollTo() - .assertIsDisplayed() - - composeTestRule - .onNodeWithText("Choose a unique and strong password to keep your information safe.") - .performScrollTo() - .assertIsDisplayed() - } - - @Config(qualifiers = "land") - @Test - fun `Header should be displayed in landscape mode`() = testWithFeatureFlagOn { - composeTestRule - .onNodeWithText("Choose your master password") - .performScrollTo() - .assertIsDisplayed() - - composeTestRule - .onNodeWithText("Choose a unique and strong password to keep your information safe.") - .performScrollTo() - .assertIsDisplayed() - } - - private fun testWithFeatureFlagOn(test: () -> Unit) { - turnFeatureFlagOn() - test() - turnFeatureFlagOff() - } - - private fun turnFeatureFlagOn() { + fun `call to action state should update with input based on if both fields are populated`() { mutableStateFlow.update { - it.copy(onboardingEnabled = true) + it.copy( + passwordInput = "", + confirmPasswordInput = "password1234", + ) + } + composeTestRule + .onNodeWithText("Next") + .assertIsNotEnabled() + .performScrollTo() + .performClick() + verify(exactly = 0) { + viewModel.trySendAction(CompleteRegistrationAction.CallToActionClick) + } + + mutableStateFlow.update { + it.copy( + passwordInput = "password1234", + confirmPasswordInput = "password1234", + ) + } + + composeTestRule + .onNodeWithText("Next") + .assertIsEnabled() + .performScrollTo() + .performClick() + verify(exactly = 1) { + viewModel.trySendAction(CompleteRegistrationAction.CallToActionClick) } } - private fun turnFeatureFlagOff() { - mutableStateFlow.update { - it.copy(onboardingEnabled = false) + @Test + fun `Click on action card should send MakePasswordStrongClick action`() { + composeTestRule + .onNodeWithText("Learn more") + .performScrollTo() + .performClick() + + verify { viewModel.trySendAction(CompleteRegistrationAction.MakePasswordStrongClick) } + } + + @Test + fun `Click on prevent account lockout should send LearnToPreventLockoutClick action`() { + composeTestRule + .onNodeWithText("Learn about other ways to prevent account lockout") + .performScrollTo() + .performClick() + + verify { + viewModel.trySendAction(CompleteRegistrationAction.LearnToPreventLockoutClick) } } @@ -409,7 +350,6 @@ class CompleteRegistrationScreenTest : BitwardenComposeTest() { isCheckDataBreachesToggled = true, dialog = null, passwordStrengthState = PasswordStrengthState.NONE, - onboardingEnabled = false, minimumPasswordLength = 12, ) } 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 44351a3609..874c6cdc0a 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 @@ -19,10 +19,8 @@ import com.x8bit.bitwarden.data.auth.repository.model.PasswordStrengthResult import com.x8bit.bitwarden.data.auth.repository.model.RegisterResult import com.x8bit.bitwarden.data.auth.repository.model.UserState import com.x8bit.bitwarden.data.auth.repository.util.generateUriForCaptcha -import com.x8bit.bitwarden.data.platform.manager.FeatureFlagManager import com.x8bit.bitwarden.data.platform.manager.SpecialCircumstanceManager import com.x8bit.bitwarden.data.platform.manager.SpecialCircumstanceManagerImpl -import com.x8bit.bitwarden.data.platform.manager.model.FlagKey import com.x8bit.bitwarden.data.platform.manager.model.SpecialCircumstance.RegistrationEvent import com.x8bit.bitwarden.data.platform.repository.util.FakeEnvironmentRepository import com.x8bit.bitwarden.data.tools.generator.repository.GeneratorRepository @@ -93,11 +91,6 @@ class CompleteRegistrationViewModelTest : BaseViewModelTest() { authRepository = mockAuthRepository, dispatcherManager = FakeDispatcherManager(), ) - private val mutableFeatureFlagFlow = MutableStateFlow(false) - private val featureFlagManager = mockk(relaxed = true) { - every { getFeatureFlag(FlagKey.OnboardingFlow) } returns false - every { getFeatureFlagFlow(FlagKey.OnboardingFlow) } returns mutableFeatureFlagFlow - } private val mutableGeneratorResultFlow = bufferedMutableSharedFlow() private val mockCompleteRegistrationCircumstance = mockk() @@ -595,13 +588,6 @@ class CompleteRegistrationViewModelTest : BaseViewModelTest() { } } - @Test - fun `feature flag state update is captured in ViewModel state`() { - mutableFeatureFlagFlow.value = true - val viewModel = createCompleteRegistrationViewModel() - assertTrue(viewModel.stateFlow.value.onboardingEnabled) - } - @Test fun `CreateAccountClick with password below 12 chars should show password length dialog`() = runTest { @@ -679,13 +665,12 @@ class CompleteRegistrationViewModelTest : BaseViewModelTest() { every { toCompleteRegistrationArgs() } returns CompleteRegistrationArgs( emailAddress = completeRegistrationState?.userEmail ?: EMAIL, verificationToken = completeRegistrationState?.emailVerificationToken ?: TOKEN, - fromEmail = completeRegistrationState?.fromEmail ?: false, + fromEmail = completeRegistrationState?.fromEmail == true, ) }, authRepository = mockAuthRepository, environmentRepository = fakeEnvironmentRepository, specialCircumstanceManager = specialCircumstanceManager, - featureFlagManager = featureFlagManager, generatorRepository = generatorRepository, ) @@ -704,7 +689,6 @@ class CompleteRegistrationViewModelTest : BaseViewModelTest() { isCheckDataBreachesToggled = true, dialog = null, passwordStrengthState = PasswordStrengthState.NONE, - onboardingEnabled = false, minimumPasswordLength = 12, ) private val VALID_INPUT_STATE = CompleteRegistrationState( @@ -717,7 +701,6 @@ class CompleteRegistrationViewModelTest : BaseViewModelTest() { isCheckDataBreachesToggled = false, dialog = null, passwordStrengthState = PasswordStrengthState.GOOD, - onboardingEnabled = false, minimumPasswordLength = 12, ) } 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 e05d90ccba..8d7fd3bcc4 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 @@ -12,15 +12,12 @@ 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.OrganizationDomainSsoDetailsResult import com.x8bit.bitwarden.data.auth.repository.model.PrevalidateSsoResult import com.x8bit.bitwarden.data.auth.repository.model.VerifiedOrganizationDomainSsoDetailsResult import com.x8bit.bitwarden.data.auth.repository.util.CaptchaCallbackTokenResult import com.x8bit.bitwarden.data.auth.repository.util.SsoCallbackResult import com.x8bit.bitwarden.data.auth.repository.util.generateUriForCaptcha import com.x8bit.bitwarden.data.auth.repository.util.generateUriForSso -import com.x8bit.bitwarden.data.platform.manager.FeatureFlagManager -import com.x8bit.bitwarden.data.platform.manager.model.FlagKey import com.x8bit.bitwarden.data.platform.manager.model.NetworkConnection import com.x8bit.bitwarden.data.platform.manager.util.FakeNetworkConnectionManager import com.x8bit.bitwarden.data.platform.repository.EnvironmentRepository @@ -41,7 +38,6 @@ import org.junit.jupiter.api.AfterEach import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test -import java.time.ZonedDateTime @Suppress("LargeClass") class EnterpriseSignOnViewModelTest : BaseViewModelTest() { @@ -53,27 +49,23 @@ class EnterpriseSignOnViewModelTest : BaseViewModelTest() { every { ssoCallbackResultFlow } returns mutableSsoCallbackResultFlow every { captchaTokenResultFlow } returns mutableCaptchaTokenResultFlow every { rememberedOrgIdentifier } returns null + every { rememberedOrgIdentifier = "Bitwarden" } just runs coEvery { - getOrganizationDomainSsoDetails(any()) - } just awaits + getVerifiedOrganizationDomainSsoDetails(any()) + } returns VerifiedOrganizationDomainSsoDetailsResult.Success(emptyList()) + coEvery { prevalidateSso(any()) } returns PrevalidateSsoResult.Success(token = "mockToken") } private val environmentRepository: EnvironmentRepository = FakeEnvironmentRepository() private val generatorRepository: GeneratorRepository = FakeGeneratorRepository() - private val featureFlagManager = mockk { - every { - getFeatureFlag(FlagKey.VerifiedSsoDomainEndpoint) - } returns false - } - @BeforeEach fun setUp() { + setupMockUri() mockkStatic( SavedStateHandle::toEnterpriseSignOnArgs, ::generateUriForSso, - Uri::parse, ) } @@ -99,6 +91,9 @@ class EnterpriseSignOnViewModelTest : BaseViewModelTest() { val expectedState = DEFAULT_STATE.copy( orgIdentifierInput = "test", ) + every { + authRepository.rememberedOrgIdentifier + } returns "test" val viewModel = createViewModel(expectedState) viewModel.stateFlow.test { assertEquals(expectedState, awaitItem()) @@ -125,6 +120,9 @@ class EnterpriseSignOnViewModelTest : BaseViewModelTest() { val error = Throwable("Fail!") val state = DEFAULT_STATE.copy(orgIdentifierInput = organizationId) + every { + authRepository.rememberedOrgIdentifier + } returns organizationId coEvery { authRepository.prevalidateSso(organizationId) } returns PrevalidateSsoResult.Failure(error = error) @@ -160,9 +158,12 @@ class EnterpriseSignOnViewModelTest : BaseViewModelTest() { @Test fun `LogInClick with valid organization and successful prevalidation should show a loading dialog, hide a loading dialog, and then emit NavigateToSsoLogin`() = runTest { - val organizationId = "Test" + val organizationId = "Bitwarden" val state = DEFAULT_STATE.copy(orgIdentifierInput = organizationId) + every { + authRepository.rememberedOrgIdentifier + } returns organizationId coEvery { authRepository.prevalidateSso(organizationId) } returns PrevalidateSsoResult.Success(token = "token") @@ -274,6 +275,10 @@ class EnterpriseSignOnViewModelTest : BaseViewModelTest() { @Test fun `DialogDismiss should clear the active dialog when DialogState is Loading`() { + // Just hang on this request; login is tested elsewhere + coEvery { + authRepository.getVerifiedOrganizationDomainSsoDetails(any()) + } just awaits val viewModel = createViewModel( dismissInitialDialog = false, ) @@ -762,10 +767,9 @@ class EnterpriseSignOnViewModelTest : BaseViewModelTest() { coEvery { authRepository.login(any(), any(), any(), any(), any(), any()) } returns LoginResult.Success - - coEvery { - authRepository.rememberedOrgIdentifier = "Bitwarden" - } just runs + every { + authRepository.rememberedOrgIdentifier + } returns "Bitwarden" val initialState = DEFAULT_STATE.copy(orgIdentifierInput = "Bitwarden") val viewModel = createViewModel( @@ -819,7 +823,9 @@ class EnterpriseSignOnViewModelTest : BaseViewModelTest() { coEvery { authRepository.login(any(), any(), any(), any(), any(), any()) } returns LoginResult.CaptchaRequired("captcha") - + every { + authRepository.rememberedOrgIdentifier + } returns "Bitwarden" val uri: Uri = mockk() every { generateUriForCaptcha(captchaId = "captcha") @@ -876,7 +882,9 @@ class EnterpriseSignOnViewModelTest : BaseViewModelTest() { coEvery { authRepository.login(any(), any(), any(), any(), any(), any()) } returns LoginResult.TwoFactorRequired - + every { + authRepository.rememberedOrgIdentifier + } returns "Bitwarden" val initialState = DEFAULT_STATE.copy(orgIdentifierInput = "Bitwarden") val viewModel = createViewModel( initialState = initialState, @@ -1011,10 +1019,9 @@ class EnterpriseSignOnViewModelTest : BaseViewModelTest() { coEvery { authRepository.login(any(), any(), any(), any(), any(), any()) } returns LoginResult.Success - - coEvery { - authRepository.rememberedOrgIdentifier = "Bitwarden" - } just runs + every { + authRepository.rememberedOrgIdentifier + } returns "Bitwarden" val initialState = DEFAULT_STATE.copy(orgIdentifierInput = "Bitwarden") val viewModel = createViewModel( @@ -1055,8 +1062,8 @@ class EnterpriseSignOnViewModelTest : BaseViewModelTest() { fun `OrganizationDomainSsoDetails failure should make a request, hide the dialog, and update the org input based on the remembered org`() = runTest { coEvery { - authRepository.getOrganizationDomainSsoDetails(any()) - } returns OrganizationDomainSsoDetailsResult.Failure(error = Throwable("Fail!")) + authRepository.getVerifiedOrganizationDomainSsoDetails(any()) + } returns VerifiedOrganizationDomainSsoDetailsResult.Failure(error = Throwable("Fail!")) coEvery { authRepository.rememberedOrgIdentifier @@ -1069,7 +1076,7 @@ class EnterpriseSignOnViewModelTest : BaseViewModelTest() { ) coVerify(exactly = 1) { - authRepository.getOrganizationDomainSsoDetails(DEFAULT_EMAIL) + authRepository.getVerifiedOrganizationDomainSsoDetails(DEFAULT_EMAIL) authRepository.rememberedOrgIdentifier } } @@ -1078,15 +1085,9 @@ class EnterpriseSignOnViewModelTest : BaseViewModelTest() { @Test fun `OrganizationDomainSsoDetails success with no SSO available should make a request, hide the dialog, and update the org input based on the remembered org`() = runTest { - val orgDetails = OrganizationDomainSsoDetailsResult.Success( - isSsoAvailable = false, - organizationIdentifier = "Bitwarden without SSO", - verifiedDate = ZonedDateTime.parse("2023-10-27T12:00:00Z"), - ) - coEvery { - authRepository.getOrganizationDomainSsoDetails(any()) - } returns orgDetails + authRepository.getVerifiedOrganizationDomainSsoDetails(any()) + } returns VerifiedOrganizationDomainSsoDetailsResult.Success(emptyList()) coEvery { authRepository.rememberedOrgIdentifier @@ -1099,37 +1100,7 @@ class EnterpriseSignOnViewModelTest : BaseViewModelTest() { ) coVerify(exactly = 1) { - authRepository.getOrganizationDomainSsoDetails(DEFAULT_EMAIL) - authRepository.rememberedOrgIdentifier - } - } - - @Suppress("MaxLineLength") - @Test - fun `OrganizationDomainSsoDetails success with no verified date available should make a request, hide the dialog, and update the org input based on the remembered org`() = - runTest { - val orgDetails = OrganizationDomainSsoDetailsResult.Success( - isSsoAvailable = true, - organizationIdentifier = "Bitwarden without SSO", - verifiedDate = null, - ) - - coEvery { - authRepository.getOrganizationDomainSsoDetails(any()) - } returns orgDetails - - coEvery { - authRepository.rememberedOrgIdentifier - } returns "Bitwarden" - - val viewModel = createViewModel(dismissInitialDialog = false) - assertEquals( - DEFAULT_STATE.copy(orgIdentifierInput = "Bitwarden"), - viewModel.stateFlow.value, - ) - - coVerify(exactly = 1) { - authRepository.getOrganizationDomainSsoDetails(DEFAULT_EMAIL) + authRepository.getVerifiedOrganizationDomainSsoDetails(DEFAULT_EMAIL) authRepository.rememberedOrgIdentifier } } @@ -1138,14 +1109,19 @@ class EnterpriseSignOnViewModelTest : BaseViewModelTest() { @Test fun `OrganizationDomainSsoDetails success with blank identifier should make a request, show the error dialog, and update the org input based on the remembered org`() = runTest { - val orgDetails = OrganizationDomainSsoDetailsResult.Success( - isSsoAvailable = true, - organizationIdentifier = "", - verifiedDate = ZonedDateTime.parse("2023-10-27T12:00:00Z"), + val orgDetails = VerifiedOrganizationDomainSsoDetailsResult.Success( + verifiedOrganizationDomainSsoDetails = listOf( + VerifiedOrganizationDomainSsoDetailsResponse + .VerifiedOrganizationDomainSsoDetail( + organizationIdentifier = "", + organizationName = "", + domainName = "", + ), + ), ) coEvery { - authRepository.getOrganizationDomainSsoDetails(any()) + authRepository.getVerifiedOrganizationDomainSsoDetails(any()) } returns orgDetails coEvery { @@ -1157,16 +1133,17 @@ class EnterpriseSignOnViewModelTest : BaseViewModelTest() { DEFAULT_STATE.copy( dialogState = EnterpriseSignOnState.DialogState.Error( title = R.string.an_error_has_occurred.asText(), - message = R.string.organization_sso_identifier_required.asText(), + message = R.string.validation_field_required.asText( + R.string.org_identifier.asText(), + ), ), - orgIdentifierInput = "Bitwarden", + orgIdentifierInput = "", ), viewModel.stateFlow.value, ) coVerify(exactly = 1) { - authRepository.getOrganizationDomainSsoDetails(DEFAULT_EMAIL) - authRepository.rememberedOrgIdentifier + authRepository.getVerifiedOrganizationDomainSsoDetails(DEFAULT_EMAIL) } } @@ -1174,14 +1151,19 @@ class EnterpriseSignOnViewModelTest : BaseViewModelTest() { @Test fun `OrganizationDomainSsoDetails success with valid organization should make a request then attempt to login`() = runTest { - val orgDetails = OrganizationDomainSsoDetailsResult.Success( - isSsoAvailable = true, - organizationIdentifier = "Bitwarden with SSO", - verifiedDate = ZonedDateTime.parse("2023-10-27T12:00:00Z"), + val orgDetails = VerifiedOrganizationDomainSsoDetailsResult.Success( + verifiedOrganizationDomainSsoDetails = listOf( + VerifiedOrganizationDomainSsoDetailsResponse + .VerifiedOrganizationDomainSsoDetail( + organizationIdentifier = "Bitwarden with SSO", + organizationName = "Bitwarden", + domainName = "bitwarden.com", + ), + ), ) coEvery { - authRepository.getOrganizationDomainSsoDetails(any()) + authRepository.getVerifiedOrganizationDomainSsoDetails(any()) } returns orgDetails // Just hang on this request; login is tested elsewhere @@ -1201,7 +1183,7 @@ class EnterpriseSignOnViewModelTest : BaseViewModelTest() { ) coVerify(exactly = 1) { - authRepository.getOrganizationDomainSsoDetails(DEFAULT_EMAIL) + authRepository.getVerifiedOrganizationDomainSsoDetails(DEFAULT_EMAIL) } } @@ -1223,10 +1205,6 @@ class EnterpriseSignOnViewModelTest : BaseViewModelTest() { authRepository.getVerifiedOrganizationDomainSsoDetails(any()) } returns orgDetails - coEvery { - featureFlagManager.getFeatureFlag(FlagKey.VerifiedSsoDomainEndpoint) - } returns true - // Just hang on this request; login is tested elsewhere coEvery { authRepository.prevalidateSso(any()) @@ -1260,10 +1238,6 @@ class EnterpriseSignOnViewModelTest : BaseViewModelTest() { authRepository.getVerifiedOrganizationDomainSsoDetails(any()) } returns orgDetails - coEvery { - featureFlagManager.getFeatureFlag(FlagKey.VerifiedSsoDomainEndpoint) - } returns true - val viewModel = createViewModel(dismissInitialDialog = false) assertEquals( DEFAULT_STATE.copy( @@ -1286,10 +1260,6 @@ class EnterpriseSignOnViewModelTest : BaseViewModelTest() { authRepository.getVerifiedOrganizationDomainSsoDetails(any()) } returns VerifiedOrganizationDomainSsoDetailsResult.Failure(error = Throwable("Fail!")) - coEvery { - featureFlagManager.getFeatureFlag(FlagKey.VerifiedSsoDomainEndpoint) - } returns true - coEvery { authRepository.rememberedOrgIdentifier } returns "Bitwarden" @@ -1315,10 +1285,9 @@ class EnterpriseSignOnViewModelTest : BaseViewModelTest() { coEvery { authRepository.continueKeyConnectorLogin() } returns LoginResult.Success - coEvery { - authRepository.rememberedOrgIdentifier = "Bitwarden" - } just runs + authRepository.rememberedOrgIdentifier + } returns "Bitwarden" val initialState = DEFAULT_STATE.copy(orgIdentifierInput = "Bitwarden") val viewModel = createViewModel( @@ -1418,7 +1387,6 @@ class EnterpriseSignOnViewModelTest : BaseViewModelTest() { ): EnterpriseSignOnViewModel = EnterpriseSignOnViewModel( authRepository = authRepository, environmentRepository = environmentRepository, - featureFlagManager = featureFlagManager, generatorRepository = generatorRepository, networkConnectionManager = FakeNetworkConnectionManager( isNetworkConnected = isNetworkConnected, @@ -1434,6 +1402,13 @@ class EnterpriseSignOnViewModelTest : BaseViewModelTest() { } } + private fun setupMockUri() { + mockkStatic(Uri::class) + val uriMock = mockk() + every { Uri.parse(any()) } returns uriMock + every { uriMock.host } returns "www.bitwarden.com" + } + companion object { private val DEFAULT_STATE = EnterpriseSignOnState( dialogState = null, diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/startregistration/StartRegistrationScreenTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/startregistration/StartRegistrationScreenTest.kt index e0e3720787..5b43b366c8 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/startregistration/StartRegistrationScreenTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/auth/feature/startregistration/StartRegistrationScreenTest.kt @@ -176,7 +176,6 @@ class StartRegistrationScreenTest : BitwardenComposeTest() { @Test fun `clicking the server tool tip should send ServerGeologyHelpClickAction`() { - mutableStateFlow.value = DEFAULT_STATE.copy(showNewOnboardingUi = true) composeTestRule .onNodeWithContentDescription("Help with server geolocations.") .performScrollTo() @@ -185,14 +184,6 @@ class StartRegistrationScreenTest : BitwardenComposeTest() { verify { viewModel.trySendAction(StartRegistrationAction.ServerGeologyHelpClick) } } - @Test - fun `server tool tip should not exist if not in new onboarding ui`() { - mutableStateFlow.value = DEFAULT_STATE.copy(showNewOnboardingUi = false) - composeTestRule - .onNodeWithContentDescription("Help with server geolocations.") - .assertDoesNotExist() - } - @Test fun `when NavigateToServerSelectionInfo is observed event should invoke intent manager`() { mutableEventFlow.tryEmit(StartRegistrationEvent.NavigateToServerSelectionInfo) @@ -284,7 +275,6 @@ class StartRegistrationScreenTest : BitwardenComposeTest() { isContinueButtonEnabled = false, selectedEnvironmentType = Environment.Type.US, dialog = null, - showNewOnboardingUi = false, ) } } 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 88537a53c2..82a1937164 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 @@ -10,8 +10,6 @@ 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 -import com.x8bit.bitwarden.data.platform.manager.FeatureFlagManager -import com.x8bit.bitwarden.data.platform.manager.model.FlagKey import com.x8bit.bitwarden.data.platform.repository.util.FakeEnvironmentRepository import com.x8bit.bitwarden.ui.auth.feature.startregistration.StartRegistrationAction.CloseClick import com.x8bit.bitwarden.ui.auth.feature.startregistration.StartRegistrationAction.ContinueClick @@ -33,7 +31,6 @@ import io.mockk.every import io.mockk.mockk import io.mockk.mockkStatic import io.mockk.unmockkStatic -import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.test.runTest import org.junit.jupiter.api.AfterEach @@ -43,12 +40,6 @@ import org.junit.jupiter.api.Test @Suppress("LargeClass") class StartRegistrationViewModelTest : BaseViewModelTest() { - private val mutableFeatureFlagFlow = MutableStateFlow(false) - private val featureFlagManager = mockk(relaxed = true) { - every { getFeatureFlag(FlagKey.OnboardingFlow) } returns false - every { getFeatureFlagFlow(FlagKey.OnboardingFlow) } returns mutableFeatureFlagFlow - } - /** * Saved state handle that has valid inputs. Useful for tests that want to test things * after the user has entered all valid inputs. @@ -73,12 +64,7 @@ class StartRegistrationViewModelTest : BaseViewModelTest() { @Test fun `initial state should be correct`() { - val viewModel = StartRegistrationViewModel( - savedStateHandle = SavedStateHandle(), - authRepository = mockAuthRepository, - environmentRepository = fakeEnvironmentRepository, - featureFlagManager = featureFlagManager, - ) + val viewModel = createStartRegistrationViewModel() assertEquals(DEFAULT_STATE, viewModel.stateFlow.value) } @@ -91,26 +77,19 @@ class StartRegistrationViewModelTest : BaseViewModelTest() { isContinueButtonEnabled = false, selectedEnvironmentType = Environment.Type.US, dialog = null, - showNewOnboardingUi = false, ) val handle = SavedStateHandle(mapOf("state" to savedState)) val viewModel = StartRegistrationViewModel( savedStateHandle = handle, authRepository = mockAuthRepository, environmentRepository = fakeEnvironmentRepository, - featureFlagManager = featureFlagManager, ) assertEquals(savedState, viewModel.stateFlow.value) } @Test fun `ContinueClick with blank email should show email required`() = runTest { - val viewModel = StartRegistrationViewModel( - savedStateHandle = SavedStateHandle(), - authRepository = mockAuthRepository, - environmentRepository = fakeEnvironmentRepository, - featureFlagManager = featureFlagManager, - ) + val viewModel = createStartRegistrationViewModel() val input = "a" viewModel.trySendAction(EmailInputChange(input)) val expectedState = DEFAULT_STATE.copy( @@ -129,12 +108,7 @@ class StartRegistrationViewModelTest : BaseViewModelTest() { @Test fun `ContinueClick with invalid email should show invalid email`() = runTest { - val viewModel = StartRegistrationViewModel( - savedStateHandle = SavedStateHandle(), - authRepository = mockAuthRepository, - environmentRepository = fakeEnvironmentRepository, - featureFlagManager = featureFlagManager, - ) + val viewModel = createStartRegistrationViewModel() val input = " " viewModel.trySendAction(EmailInputChange(input)) val expectedState = DEFAULT_STATE.copy( @@ -169,7 +143,6 @@ class StartRegistrationViewModelTest : BaseViewModelTest() { savedStateHandle = validInputHandle, authRepository = repo, environmentRepository = fakeEnvironmentRepository, - featureFlagManager = featureFlagManager, ) viewModel.stateEventFlow(backgroundScope) { stateFlow, eventFlow -> assertEquals(VALID_INPUT_STATE, stateFlow.awaitItem()) @@ -204,7 +177,6 @@ class StartRegistrationViewModelTest : BaseViewModelTest() { savedStateHandle = validInputHandle, authRepository = repo, environmentRepository = fakeEnvironmentRepository, - featureFlagManager = featureFlagManager, ) viewModel.stateFlow.test { assertEquals(VALID_INPUT_STATE, awaitItem()) @@ -250,7 +222,6 @@ class StartRegistrationViewModelTest : BaseViewModelTest() { savedStateHandle = validInputHandle, authRepository = repo, environmentRepository = fakeEnvironmentRepository, - featureFlagManager = featureFlagManager, ) viewModel.eventFlow.test { viewModel.trySendAction(ContinueClick) @@ -288,7 +259,6 @@ class StartRegistrationViewModelTest : BaseViewModelTest() { savedStateHandle = validInputHandle, authRepository = repo, environmentRepository = fakeEnvironmentRepository, - featureFlagManager = featureFlagManager, ) viewModel.eventFlow.test { viewModel.trySendAction(ContinueClick) @@ -303,12 +273,7 @@ class StartRegistrationViewModelTest : BaseViewModelTest() { @Test fun `BackClick should emit NavigateBack`() = runTest { - val viewModel = StartRegistrationViewModel( - savedStateHandle = SavedStateHandle(), - authRepository = mockAuthRepository, - environmentRepository = fakeEnvironmentRepository, - featureFlagManager = featureFlagManager, - ) + val viewModel = createStartRegistrationViewModel() viewModel.eventFlow.test { viewModel.trySendAction(CloseClick) assertEquals(NavigateBack, awaitItem()) @@ -317,12 +282,7 @@ class StartRegistrationViewModelTest : BaseViewModelTest() { @Test fun `PrivacyPolicyClick should emit NavigatePrivacyPolicy`() = runTest { - val viewModel = StartRegistrationViewModel( - savedStateHandle = SavedStateHandle(), - authRepository = mockAuthRepository, - environmentRepository = fakeEnvironmentRepository, - featureFlagManager = featureFlagManager, - ) + val viewModel = createStartRegistrationViewModel() viewModel.eventFlow.test { viewModel.trySendAction(PrivacyPolicyClick) assertEquals(NavigateToPrivacyPolicy, awaitItem()) @@ -331,12 +291,7 @@ class StartRegistrationViewModelTest : BaseViewModelTest() { @Test fun `TermsClick should emit NavigateToTerms`() = runTest { - val viewModel = StartRegistrationViewModel( - savedStateHandle = SavedStateHandle(), - authRepository = mockAuthRepository, - environmentRepository = fakeEnvironmentRepository, - featureFlagManager = featureFlagManager, - ) + val viewModel = createStartRegistrationViewModel() viewModel.eventFlow.test { viewModel.trySendAction(TermsClick) assertEquals(NavigateToTerms, awaitItem()) @@ -345,12 +300,7 @@ class StartRegistrationViewModelTest : BaseViewModelTest() { @Test fun `UnsubscribeMarketingEmailsClick should emit NavigateToUnsubscribe`() = runTest { - val viewModel = StartRegistrationViewModel( - savedStateHandle = SavedStateHandle(), - authRepository = mockAuthRepository, - environmentRepository = fakeEnvironmentRepository, - featureFlagManager = featureFlagManager, - ) + val viewModel = createStartRegistrationViewModel() viewModel.eventFlow.test { viewModel.trySendAction(UnsubscribeMarketingEmailsClick) assertEquals(NavigateToUnsubscribe, awaitItem()) @@ -360,12 +310,7 @@ class StartRegistrationViewModelTest : BaseViewModelTest() { @Test fun `EnvironmentTypeSelect should update value of selected region for US or EU`() = runTest { val inputEnvironmentType = Environment.Type.EU - val viewModel = StartRegistrationViewModel( - savedStateHandle = SavedStateHandle(), - authRepository = mockAuthRepository, - environmentRepository = fakeEnvironmentRepository, - featureFlagManager = featureFlagManager, - ) + val viewModel = createStartRegistrationViewModel() viewModel.stateFlow.test { awaitItem() viewModel.trySendAction( @@ -383,12 +328,7 @@ class StartRegistrationViewModelTest : BaseViewModelTest() { @Test fun `EnvironmentTypeSelect should emit NavigateToEnvironment for self-hosted`() = runTest { val inputEnvironmentType = Environment.Type.SELF_HOSTED - val viewModel = StartRegistrationViewModel( - savedStateHandle = SavedStateHandle(), - authRepository = mockAuthRepository, - environmentRepository = fakeEnvironmentRepository, - featureFlagManager = featureFlagManager, - ) + val viewModel = createStartRegistrationViewModel() viewModel.eventFlow.test { viewModel.trySendAction( EnvironmentTypeSelect( @@ -404,12 +344,7 @@ class StartRegistrationViewModelTest : BaseViewModelTest() { @Test fun `EmailInputChange update email`() = runTest { - val viewModel = StartRegistrationViewModel( - savedStateHandle = SavedStateHandle(), - authRepository = mockAuthRepository, - environmentRepository = fakeEnvironmentRepository, - featureFlagManager = featureFlagManager, - ) + val viewModel = createStartRegistrationViewModel() viewModel.trySendAction(EmailInputChange("input")) viewModel.stateFlow.test { assertEquals( @@ -424,12 +359,7 @@ class StartRegistrationViewModelTest : BaseViewModelTest() { @Test fun `NameInputChange update name`() = runTest { - val viewModel = StartRegistrationViewModel( - savedStateHandle = SavedStateHandle(), - authRepository = mockAuthRepository, - environmentRepository = fakeEnvironmentRepository, - featureFlagManager = featureFlagManager, - ) + val viewModel = createStartRegistrationViewModel() viewModel.trySendAction(NameInputChange("input")) viewModel.stateFlow.test { assertEquals(DEFAULT_STATE.copy(nameInput = "input"), awaitItem()) @@ -438,12 +368,7 @@ class StartRegistrationViewModelTest : BaseViewModelTest() { @Test fun `ReceiveMarketingEmailsToggle update isReceiveMarketingEmailsToggled`() = runTest { - val viewModel = StartRegistrationViewModel( - savedStateHandle = SavedStateHandle(), - authRepository = mockAuthRepository, - environmentRepository = fakeEnvironmentRepository, - featureFlagManager = featureFlagManager, - ) + val viewModel = createStartRegistrationViewModel() viewModel.trySendAction(ReceiveMarketingEmailsToggle(false)) viewModel.stateFlow.test { assertEquals(DEFAULT_STATE.copy(isReceiveMarketingEmailsToggled = false), awaitItem()) @@ -452,12 +377,7 @@ class StartRegistrationViewModelTest : BaseViewModelTest() { @Test fun `ServerGeologyHelpClickAction should emit NavigateToServerSelectionInfo`() = runTest { - val viewModel = StartRegistrationViewModel( - savedStateHandle = SavedStateHandle(), - authRepository = mockAuthRepository, - environmentRepository = fakeEnvironmentRepository, - featureFlagManager = featureFlagManager, - ) + val viewModel = createStartRegistrationViewModel() viewModel.eventFlow.test { viewModel.trySendAction(StartRegistrationAction.ServerGeologyHelpClick) @@ -465,20 +385,11 @@ class StartRegistrationViewModelTest : BaseViewModelTest() { } } - @Test - fun `OnboardingFeatureFlagUpdated should update showNewOnboardingUi in state`() { - val viewModel = StartRegistrationViewModel( - savedStateHandle = SavedStateHandle(), - authRepository = mockAuthRepository, - environmentRepository = fakeEnvironmentRepository, - featureFlagManager = featureFlagManager, - ) - mutableFeatureFlagFlow.value = true - assertEquals( - DEFAULT_STATE.copy(showNewOnboardingUi = true), - viewModel.stateFlow.value, - ) - } + fun createStartRegistrationViewModel(): StartRegistrationViewModel = StartRegistrationViewModel( + savedStateHandle = SavedStateHandle(), + authRepository = mockAuthRepository, + environmentRepository = fakeEnvironmentRepository, + ) companion object { private const val EMAIL = "test@test.com" @@ -490,7 +401,6 @@ class StartRegistrationViewModelTest : BaseViewModelTest() { isContinueButtonEnabled = false, selectedEnvironmentType = Environment.Type.US, dialog = null, - showNewOnboardingUi = false, ) private val VALID_INPUT_STATE = StartRegistrationState( emailInput = EMAIL, @@ -499,7 +409,6 @@ class StartRegistrationViewModelTest : BaseViewModelTest() { isContinueButtonEnabled = true, selectedEnvironmentType = Environment.Type.US, dialog = null, - showNewOnboardingUi = false, ) } } diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/debugmenu/DebugMenuScreenTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/debugmenu/DebugMenuScreenTest.kt index 740e1bf615..efbeb48f5f 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/debugmenu/DebugMenuScreenTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/debugmenu/DebugMenuScreenTest.kt @@ -1,7 +1,6 @@ package com.x8bit.bitwarden.ui.platform.feature.debugmenu import androidx.compose.ui.test.assertIsEnabled -import androidx.compose.ui.test.assertIsNotEnabled import androidx.compose.ui.test.onNodeWithContentDescription import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.performClick @@ -130,14 +129,7 @@ class DebugMenuScreenTest : BitwardenComposeTest() { } @Test - fun `restart onboarding should send action when enabled and clicked`() { - mutableStateFlow.tryEmit( - DebugMenuState( - featureFlags = persistentMapOf( - FlagKey.OnboardingFlow to true, - ), - ), - ) + fun `restart onboarding should send action when clicked`() { composeTestRule .onNodeWithText("Restart Onboarding", ignoreCase = true) .performScrollTo() @@ -147,25 +139,6 @@ class DebugMenuScreenTest : BitwardenComposeTest() { verify(exactly = 1) { viewModel.trySendAction(DebugMenuAction.RestartOnboarding) } } - @Test - fun `restart onboarding should not send action when not enabled`() { - mutableStateFlow.tryEmit( - DebugMenuState( - featureFlags = persistentMapOf( - FlagKey.OnboardingFlow to false, - ), - ), - ) - - composeTestRule - .onNodeWithText("Restart Onboarding", ignoreCase = true) - .performScrollTo() - .assertIsNotEnabled() - .performClick() - - verify(exactly = 0) { viewModel.trySendAction(DebugMenuAction.RestartOnboarding) } - } - @Test fun `Show onboarding carousel should send action when enabled and clicked`() { composeTestRule diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/debugmenu/DebugMenuViewModelTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/debugmenu/DebugMenuViewModelTest.kt index b7135b00ef..30a230e686 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/debugmenu/DebugMenuViewModelTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/debugmenu/DebugMenuViewModelTest.kt @@ -146,9 +146,7 @@ class DebugMenuViewModelTest : BaseViewModelTest() { private val DEFAULT_MAP_VALUE: ImmutableMap, Any> = persistentMapOf( FlagKey.AuthenticatorSync to true, FlagKey.EmailVerification to true, - FlagKey.OnboardingFlow to true, FlagKey.ImportLoginsFlow to true, - FlagKey.VerifiedSsoDomainEndpoint to true, FlagKey.CredentialExchangeProtocolImport to true, FlagKey.CredentialExchangeProtocolExport to true, FlagKey.MutualTls to true, @@ -166,9 +164,7 @@ private val DEFAULT_MAP_VALUE: ImmutableMap, Any> = persistentMapOf private val UPDATED_MAP_VALUE: ImmutableMap, Any> = persistentMapOf( FlagKey.AuthenticatorSync to false, FlagKey.EmailVerification to false, - FlagKey.OnboardingFlow to false, FlagKey.ImportLoginsFlow to false, - FlagKey.VerifiedSsoDomainEndpoint to false, FlagKey.CredentialExchangeProtocolImport to false, FlagKey.CredentialExchangeProtocolExport to false, FlagKey.MutualTls to false, diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/addedit/AddEditSendScreenTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/addedit/AddEditSendScreenTest.kt index d508b454b1..69434bab40 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/addedit/AddEditSendScreenTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/addedit/AddEditSendScreenTest.kt @@ -49,7 +49,7 @@ import java.time.ZonedDateTime class AddEditSendScreenTest : BitwardenComposeTest() { private var onNavigateBackCalled = false - private var onNavigateUpToRootCalled = false + private var onNavigateUpToSearchOrRootCalled = false private val exitManager: ExitManager = mockk(relaxed = true) { every { exitApplication() } just runs @@ -75,7 +75,7 @@ class AddEditSendScreenTest : BitwardenComposeTest() { AddEditSendScreen( viewModel = viewModel, onNavigateBack = { onNavigateBackCalled = true }, - onNavigateUpToRoot = { onNavigateUpToRootCalled = true }, + onNavigateUpToSearchOrRoot = { onNavigateUpToSearchOrRootCalled = true }, ) } } @@ -87,9 +87,9 @@ class AddEditSendScreenTest : BitwardenComposeTest() { } @Test - fun `on NavigateToRoot should call onNavigateUpToRoot`() { - mutableEventFlow.tryEmit(AddEditSendEvent.NavigateToRoot) - assertTrue(onNavigateUpToRootCalled) + fun `on NavigateUpToSearchOrRoot should call onNavigateUpToSearchOrRootCalled`() { + mutableEventFlow.tryEmit(AddEditSendEvent.NavigateUpToSearchOrRoot) + assertTrue(onNavigateUpToSearchOrRootCalled) } @Test 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 e6b6700f2f..02a02630e4 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 @@ -661,7 +661,7 @@ class AddEditSendViewModelTest : BaseViewModelTest() { viewModel.eventFlow.test { viewModel.trySendAction(AddEditSendAction.DeleteClick) - assertEquals(AddEditSendEvent.NavigateToRoot, awaitItem()) + assertEquals(AddEditSendEvent.NavigateUpToSearchOrRoot, awaitItem()) assertEquals(AddEditSendEvent.ShowToast(R.string.send_deleted.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 04b26aab1d..01206c13fe 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 @@ -416,7 +416,7 @@ class VaultAddEditViewModelTest : BaseViewModelTest() { specialCircumstanceManager.specialCircumstance = SpecialCircumstance.ProviderCreateCredential( createCredentialRequest = createCredentialRequest, - ) + ) val fido2ContentState = createCredentialRequest.toDefaultAddTypeContent( attestationOptions = createMockPasskeyAttestationOptions(number = 1), isIndividualVaultDisabled = false, @@ -1467,8 +1467,28 @@ class VaultAddEditViewModelTest : BaseViewModelTest() { @Suppress("MaxLineLength") @Test - fun `in edit mode, canDelete should be false when cipher is in a collection the user cannot manage`() = + fun `in edit mode, canDelete should be false when cipher is in a collection the user cannot manage and org has limitItemDeletion`() = runTest { + val userState = createUserState().copy( + accounts = listOf( + createUserState().accounts.first().copy( + organizations = listOf( + Organization( + id = "mockOrganizationId-1", + name = "Mock Organization Name 1", + shouldManageResetPassword = false, + shouldUseKeyConnector = false, + role = OrganizationType.ADMIN, + keyConnectorUrl = null, + userIsClaimedByOrganization = false, + limitItemDeletion = true, + ), + ), + ), + ), + ) + mutableUserStateFlow.value = userState + val cipherView = createMockCipherView(1) val vaultAddEditType = VaultAddEditType.EditItem(DEFAULT_EDIT_ITEM_ID) val stateWithName = createVaultAddItemState( @@ -2115,7 +2135,7 @@ class VaultAddEditViewModelTest : BaseViewModelTest() { specialCircumstanceManager.specialCircumstance = SpecialCircumstance.ProviderCreateCredential( createCredentialRequest = mockFido2CredentialRequest, - ) + ) setupFido2CreateRequest() @@ -2174,7 +2194,7 @@ class VaultAddEditViewModelTest : BaseViewModelTest() { specialCircumstanceManager.specialCircumstance = SpecialCircumstance.ProviderCreateCredential( createCredentialRequest = mockFidoRequest, - ) + ) setupFido2CreateRequest( mockCallingAppInfo = mockCallingAppInfo, mockCreatePublicKeyCredentialRequest = mockCreatePublicKeyCredentialRequest, @@ -2254,7 +2274,7 @@ class VaultAddEditViewModelTest : BaseViewModelTest() { specialCircumstanceManager.specialCircumstance = SpecialCircumstance.ProviderCreateCredential( createCredentialRequest = mockFidoRequest, - ) + ) setupFido2CreateRequest() @@ -4056,6 +4076,58 @@ class VaultAddEditViewModelTest : BaseViewModelTest() { assertEquals(expectedState, viewModel.stateFlow.value) } + @Suppress("MaxLineLength") + @Test + fun `CollectionSelect should update selectedOwnerId when isIndividualVaultDisabled is true`() = + runTest { + every { + policyManager.getActivePolicies(type = PolicyTypeJson.PERSONAL_OWNERSHIP) + } returns listOf( + SyncResponseJson.Policy( + organizationId = "Test Org", + id = "testId", + type = PolicyTypeJson.PERSONAL_OWNERSHIP, + isEnabled = true, + data = null, + ), + ) + + val vaultAddEditType = VaultAddEditType.AddItem + val vaultItemCipherType = VaultItemCipherType.LOGIN + mutableVaultDataFlow.value = DataState.Loaded( + data = createVaultData(), + ) + + val viewModel = createAddVaultItemViewModel( + savedStateHandle = createSavedStateHandleWithState( + state = null, + vaultAddEditType = vaultAddEditType, + vaultItemCipherType = vaultItemCipherType, + ), + ) + + val action = collectionSelectAction() + viewModel.trySendAction(action) + + val expectedState = vaultAddItemInitialState.copy( + viewState = VaultAddEditState.ViewState.Content( + common = createCommonContentViewState( + availableOwners = listOf( + VaultAddEditState.Owner( + id = "organizationId", + name = "organizationName", + collections = emptyList(), + ), + ), + selectedOwnerId = "organizationId", + ), + isIndividualVaultDisabled = true, + type = createLoginTypeContentViewState(), + ), + ) + assertEquals(expectedState, viewModel.stateFlow.value) + } + @Suppress("MaxLineLength") @Test fun `UserVerificationLockout should set isUserVerified to false and display Fido2ErrorDialog`() { @@ -4501,7 +4573,7 @@ class VaultAddEditViewModelTest : BaseViewModelTest() { specialCircumstanceManager.specialCircumstance = SpecialCircumstance.ProviderCreateCredential( createCredentialRequest = mockRequest, - ) + ) setupFido2CreateRequest() every { authRepository.activeUserId } returns "activeUserId" coEvery { @@ -4529,7 +4601,7 @@ class VaultAddEditViewModelTest : BaseViewModelTest() { specialCircumstanceManager.specialCircumstance = SpecialCircumstance.ProviderCreateCredential( createCredentialRequest = mockRequest, - ) + ) every { authRepository.activeUserId } returns "activeUserId" coEvery { bitwardenCredentialManager.registerFido2Credential( @@ -4577,7 +4649,7 @@ class VaultAddEditViewModelTest : BaseViewModelTest() { specialCircumstanceManager.specialCircumstance = SpecialCircumstance.ProviderCreateCredential( createCredentialRequest = mockRequest, - ) + ) setupFido2CreateRequest() every { authRepository.activeUserId } returns "activeUserId" coEvery { @@ -4780,6 +4852,7 @@ class VaultAddEditViewModelTest : BaseViewModelTest() { role = OrganizationType.ADMIN, keyConnectorUrl = null, userIsClaimedByOrganization = false, + limitItemDeletion = false, ), ), isBiometricsEnabled = true, diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/util/CollectionViewExtensionsTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/util/CollectionViewExtensionsTest.kt index f18ec2e919..afc405ab39 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/util/CollectionViewExtensionsTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/util/CollectionViewExtensionsTest.kt @@ -79,10 +79,10 @@ class CollectionViewExtensionsTest { @Test fun `hasDeletePermissionInAtLeastOneCollection should return true if the user has manage permission in at least one collection`() { val collectionList: List = listOf( + createViewCollectionView(number = 4), createManageCollectionView(number = 1), createEditCollectionView(number = 2), createEditExceptPasswordsCollectionView(number = 3), - createViewCollectionView(number = 4), createViewExceptPasswordsCollectionView(number = 5), ) @@ -93,7 +93,7 @@ class CollectionViewExtensionsTest { @Suppress("MaxLineLength") @Test - fun `hasDeletePermissionInAtLeastOneCollection should return false if the user does not have manage permission in at least one collection`() { + fun `hasDeletePermissionInAtLeastOneCollection should return false if the user does not have manage permission in at least one collection and org has limitItemDeletion active`() { val collectionList: List = listOf( createEditCollectionView(number = 1), createEditExceptPasswordsCollectionView(number = 2), @@ -101,7 +101,48 @@ class CollectionViewExtensionsTest { createViewExceptPasswordsCollectionView(number = 4), ) val collectionIds = collectionList.mapNotNull { it.id } - assertFalse(collectionList.hasDeletePermissionInAtLeastOneCollection(collectionIds)) + assertFalse( + collectionList.hasDeletePermissionInAtLeastOneCollection( + collectionIds = collectionIds, + needsManagePermission = true, + ), + ) + } + + @Suppress("MaxLineLength") + @Test + fun `hasDeletePermissionInAtLeastOneCollection should return true if the user does not have manage permission in at least one collection and org has limitItemDeletion off and has edit permissions`() { + val collectionList: List = listOf( + createEditCollectionView(number = 1), + createEditExceptPasswordsCollectionView(number = 2), + createViewCollectionView(number = 3), + createViewExceptPasswordsCollectionView(number = 4), + ) + val collectionIds = collectionList.mapNotNull { it.id } + assertTrue( + collectionList.hasDeletePermissionInAtLeastOneCollection( + collectionIds = collectionIds, + needsManagePermission = false, + ), + ) + } + + @Suppress("MaxLineLength") + @Test + fun `hasDeletePermissionInAtLeastOneCollection should return false if ids don't match any collection`() { + val collectionList: List = listOf( + createEditCollectionView(number = 1), + createEditExceptPasswordsCollectionView(number = 2), + createViewCollectionView(number = 3), + createViewExceptPasswordsCollectionView(number = 4), + ) + val collectionIds = listOf("notInCollectionId") + assertFalse( + collectionList.hasDeletePermissionInAtLeastOneCollection( + collectionIds = collectionIds, + needsManagePermission = false, + ), + ) } @Suppress("MaxLineLength") @@ -142,6 +183,24 @@ class CollectionViewExtensionsTest { ) } + @Suppress("MaxLineLength") + @Test + fun `hasDeletePermissionInAtLeastOneCollection should return false if the user doesn't have any collection with edit or manage permissions`() { + val collectionList: List = listOf( + createViewCollectionView(number = 1), + createViewCollectionView(number = 2), + createViewExceptPasswordsCollectionView(number = 3), + createViewExceptPasswordsCollectionView(number = 4), + ) + val collectionIds = collectionList.mapNotNull { it.id } + assertFalse( + collectionList.hasDeletePermissionInAtLeastOneCollection( + collectionIds = collectionIds, + needsManagePermission = false, + ), + ) + } + @Suppress("MaxLineLength") @Test fun `canAssociateToCollections should return true if the user has edit and manage permission`() { diff --git a/authenticator/src/main/AndroidManifest.xml b/authenticator/src/main/AndroidManifest.xml index 3e1aa450ce..69361e3cd6 100644 --- a/authenticator/src/main/AndroidManifest.xml +++ b/authenticator/src/main/AndroidManifest.xml @@ -19,15 +19,16 @@ android:dataExtractionRules="@xml/data_extraction_rules" android:fullBackupContent="@xml/backup_rules" android:icon="@mipmap/ic_launcher" + android:intentMatchingFlags="enforceIntentFilter" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:taskAffinity="" android:theme="@style/LaunchTheme" - android:intentMatchingFlags="enforceIntentFilter" - tools:targetApi="31"> + tools:targetApi="36"> Unit = {}, onExpandAdvancedOptionsClicked: () -> Unit = {}, ) { - Column(modifier = modifier) { - LazyColumn { - item { - BitwardenListHeaderText( - modifier = Modifier - .padding(horizontal = 16.dp), - label = stringResource(id = R.string.information), - ) - } + LazyColumn(modifier = modifier) { + item { + BitwardenListHeaderText( + modifier = Modifier + .standardHorizontalMargin() + .fillMaxWidth(), + label = stringResource(id = R.string.information), + ) + } - item { - Spacer(Modifier.height(8.dp)) - BitwardenTextField( - modifier = Modifier - .semantics { testTag = "NameTextField" } - .fillMaxSize() - .padding(horizontal = 16.dp), - label = stringResource(id = R.string.name), - value = viewState.itemData.issuer, - onValueChange = onIssuerNameTextChange, - singleLine = true, - ) - } + item { + Spacer(Modifier.height(8.dp)) + BitwardenTextField( + modifier = Modifier + .testTag(tag = "NameTextField") + .standardHorizontalMargin() + .fillMaxWidth(), + label = stringResource(id = R.string.name), + value = viewState.itemData.issuer, + onValueChange = onIssuerNameTextChange, + singleLine = true, + ) + } - item { - Spacer(modifier = Modifier.height(8.dp)) - BitwardenPasswordField( - modifier = Modifier - .semantics { testTag = "KeyTextField" } - .fillMaxSize() - .padding(horizontal = 16.dp), - label = stringResource(id = R.string.key), - value = viewState.itemData.totpCode, - onValueChange = onTotpCodeTextChange, - singleLine = true, - capitalization = KeyboardCapitalization.Characters, - ) - } + item { + Spacer(modifier = Modifier.height(8.dp)) + BitwardenPasswordField( + modifier = Modifier + .testTag(tag = "KeyTextField") + .fillMaxWidth() + .standardHorizontalMargin(), + label = stringResource(id = R.string.key), + value = viewState.itemData.totpCode, + onValueChange = onTotpCodeTextChange, + singleLine = true, + capitalization = KeyboardCapitalization.Characters, + ) + } - item { - Spacer(modifier = Modifier.height(8.dp)) - BitwardenTextField( - modifier = Modifier - .semantics { testTag = "UsernameTextField" } - .fillMaxWidth() - .padding(horizontal = 16.dp), - label = stringResource(id = R.string.username), - value = viewState.itemData.username.orEmpty(), - onValueChange = onUsernameTextChange, - singleLine = true, - ) - } + item { + Spacer(modifier = Modifier.height(8.dp)) + BitwardenTextField( + modifier = Modifier + .testTag(tag = "UsernameTextField") + .fillMaxWidth() + .standardHorizontalMargin(), + label = stringResource(id = R.string.username), + value = viewState.itemData.username.orEmpty(), + onValueChange = onUsernameTextChange, + singleLine = true, + ) + } - item { - Spacer(modifier = Modifier.height(16.dp)) - BitwardenSwitch( - label = stringResource(id = R.string.favorite), - isChecked = viewState.itemData.favorite, - onCheckedChange = onToggleFavorite, - modifier = Modifier - .testTag("ItemFavoriteToggle") - .fillMaxWidth() - .padding(horizontal = 16.dp), + item { + Spacer(modifier = Modifier.height(16.dp)) + BitwardenSwitch( + label = stringResource(id = R.string.favorite), + isChecked = viewState.itemData.favorite, + onCheckedChange = onToggleFavorite, + modifier = Modifier + .testTag(tag = "ItemFavoriteToggle") + .fillMaxWidth() + .standardHorizontalMargin(), + ) + } + + item { + Spacer(modifier = Modifier.height(16.dp)) + Row( + modifier = Modifier + .testTag(tag = "CollapseAdvancedOptions") + .standardHorizontalMargin() + .fillMaxWidth() + .clip(RoundedCornerShape(28.dp)) + .clickable( + indication = ripple( + bounded = true, + color = MaterialTheme.colorScheme.primary, + ), + interactionSource = remember { MutableInteractionSource() }, + onClick = onExpandAdvancedOptionsClicked, + ) + .padding(vertical = 12.dp), + verticalAlignment = Alignment.CenterVertically, + ) { + Text( + text = stringResource(R.string.advanced), + style = MaterialTheme.typography.labelLarge, + color = MaterialTheme.colorScheme.primary, + ) + Spacer(Modifier.width(8.dp)) + BitwardenIcon( + iconData = IconData.Local( + iconRes = if (viewState.isAdvancedOptionsExpanded) { + R.drawable.ic_chevron_up + } else { + R.drawable.ic_chevron_down + }, + ), + contentDescription = stringResource( + id = R.string.collapse_advanced_options, + ), + tint = MaterialTheme.colorScheme.primary, ) } } - Spacer(modifier = Modifier.height(16.dp)) + if (viewState.isAdvancedOptionsExpanded) { + advancedOptions( + viewState = viewState, + onAlgorithmOptionClicked = onAlgorithmOptionClicked, + onTypeOptionClicked = onTypeOptionClicked, + onRefreshPeriodOptionClicked = onRefreshPeriodOptionClicked, + onNumberOfDigitsChanged = onNumberOfDigitsChanged, + ) + } - AdvancedOptions( - modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 16.dp), - viewState = viewState, - onExpandStateChange = onExpandAdvancedOptionsClicked, - onAlgorithmOptionClicked = onAlgorithmOptionClicked, - onTypeOptionClicked = onTypeOptionClicked, - onRefreshPeriodOptionClicked = onRefreshPeriodOptionClicked, - onNumberOfDigitsChanged = onNumberOfDigitsChanged, - ) + item { + Spacer(modifier = Modifier.height(height = 16.dp)) + Spacer(modifier = Modifier.navigationBarsPadding()) + } } } @Suppress("LongMethod") -@Composable -private fun AdvancedOptions( - modifier: Modifier = Modifier, +private fun LazyListScope.advancedOptions( viewState: EditItemState.ViewState.Content, - onExpandStateChange: () -> Unit, onAlgorithmOptionClicked: (AuthenticatorItemAlgorithm) -> Unit, onTypeOptionClicked: (AuthenticatorItemType) -> Unit, onRefreshPeriodOptionClicked: (AuthenticatorRefreshPeriodOption) -> Unit, onNumberOfDigitsChanged: (Int) -> Unit, ) { - Column(modifier = modifier) { - Row( + item(key = "OtpItemTypeSelector") { + val possibleTypeOptions = AuthenticatorItemType.entries + val typeOptionsWithStrings = + possibleTypeOptions.associateWith { it.name } + BitwardenMultiSelectButton( modifier = Modifier - .semantics { testTag = "CollapseAdvancedOptions" } - .padding(vertical = 4.dp) - .clip(RoundedCornerShape(28.dp)) - .clickable( - indication = ripple( - bounded = true, - color = MaterialTheme.colorScheme.primary, - ), - interactionSource = remember { MutableInteractionSource() }, - ) { - onExpandStateChange() - }, - verticalAlignment = Alignment.CenterVertically, - ) { - Text( - text = stringResource(R.string.advanced), - style = MaterialTheme.typography.labelLarge, - color = MaterialTheme.colorScheme.primary, - ) - Spacer(Modifier.width(8.dp)) - BitwardenIcon( - iconData = IconData.Local( - iconRes = if (viewState.isAdvancedOptionsExpanded) { - R.drawable.ic_chevron_up - } else { - R.drawable.ic_chevron_down - }, - ), - contentDescription = stringResource( - id = R.string.collapse_advanced_options, - ), - tint = MaterialTheme.colorScheme.primary, - ) + .testTag(tag = "OTPItemTypePicker") + .standardHorizontalMargin() + .fillMaxWidth() + .animateItem(), + label = stringResource(id = R.string.otp_type), + options = typeOptionsWithStrings.values.toImmutableList(), + selectedOption = viewState.itemData.type.name, + onOptionSelected = { selectedOption -> + val selectedOptionName = typeOptionsWithStrings + .entries + .first { it.value == selectedOption } + .key + onTypeOptionClicked(selectedOptionName) + }, + ) + } + + item(key = "AlgorithmItemTypeSelector") { + val possibleAlgorithmOptions = AuthenticatorItemAlgorithm.entries + val algorithmOptionsWithStrings = possibleAlgorithmOptions.associateWith { it.name } + Spacer(Modifier.height(8.dp)) + BitwardenMultiSelectButton( + modifier = Modifier + .testTag(tag = "AlgorithmItemTypePicker") + .standardHorizontalMargin() + .fillMaxWidth() + .animateItem(), + label = stringResource(id = R.string.algorithm), + options = algorithmOptionsWithStrings.values.toImmutableList(), + selectedOption = viewState.itemData.algorithm.name, + onOptionSelected = { selectedOption -> + val selectedOptionName = algorithmOptionsWithStrings + .entries + .first { it.value == selectedOption } + .key + onAlgorithmOptionClicked(selectedOptionName) + }, + ) + } + + item(key = "RefreshPeriodItemTypePicker") { + val possibleRefreshPeriodOptions = AuthenticatorRefreshPeriodOption.entries + val refreshPeriodOptionsWithStrings = possibleRefreshPeriodOptions.associateWith { + stringResource(id = R.string.refresh_period_seconds, it.seconds) } - - AnimatedVisibility( - visible = viewState.isAdvancedOptionsExpanded, - enter = fadeIn(tween(DEFAULT_FADE_TRANSITION_TIME_MS)) + - expandVertically(tween(DEFAULT_STAY_TRANSITION_TIME_MS)), - exit = fadeOut(tween(DEFAULT_FADE_TRANSITION_TIME_MS)) + - shrinkVertically(tween(DEFAULT_STAY_TRANSITION_TIME_MS)), - ) { - LazyColumn { - item { - val possibleTypeOptions = AuthenticatorItemType.entries - val typeOptionsWithStrings = - possibleTypeOptions.associateWith { it.name } - Spacer(modifier = Modifier.height(8.dp)) - BitwardenMultiSelectButton( - modifier = Modifier - .fillMaxSize() - .semantics { testTag = "OTPItemTypePicker" }, - label = stringResource(id = R.string.otp_type), - options = typeOptionsWithStrings.values.toImmutableList(), - selectedOption = viewState.itemData.type.name, - onOptionSelected = { selectedOption -> - val selectedOptionName = typeOptionsWithStrings - .entries - .first { it.value == selectedOption } - .key - - onTypeOptionClicked(selectedOptionName) - }, - ) + Spacer(modifier = Modifier.height(8.dp)) + BitwardenMultiSelectButton( + modifier = Modifier + .testTag(tag = "RefreshPeriodItemTypePicker") + .standardHorizontalMargin() + .fillMaxWidth() + .animateItem(), + label = stringResource(id = R.string.refresh_period), + options = refreshPeriodOptionsWithStrings.values.toImmutableList(), + selectedOption = stringResource( + id = R.string.refresh_period_seconds, + viewState.itemData.refreshPeriod.seconds, + ), + onOptionSelected = remember(viewState) { + { selectedOption -> + val selectedOptionName = refreshPeriodOptionsWithStrings + .entries + .first { it.value == selectedOption } + .key + onRefreshPeriodOptionClicked(selectedOptionName) } + }, + ) + } - item { - val possibleAlgorithmOptions = AuthenticatorItemAlgorithm.entries - val algorithmOptionsWithStrings = - possibleAlgorithmOptions.associateWith { it.name } - Spacer(Modifier.height(8.dp)) - BitwardenMultiSelectButton( - modifier = Modifier - .fillMaxWidth() - .semantics { testTag = "AlgorithmItemTypePicker" }, - label = stringResource(id = R.string.algorithm), - options = algorithmOptionsWithStrings.values.toImmutableList(), - selectedOption = viewState.itemData.algorithm.name, - onOptionSelected = { selectedOption -> - val selectedOptionName = algorithmOptionsWithStrings - .entries - .first { it.value == selectedOption } - .key - - onAlgorithmOptionClicked(selectedOptionName) - }, - ) - } - - item { - val possibleRefreshPeriodOptions = AuthenticatorRefreshPeriodOption.entries - val refreshPeriodOptionsWithStrings = possibleRefreshPeriodOptions - .associateWith { - stringResource( - id = R.string.refresh_period_seconds, - it.seconds, - ) - } - Spacer(modifier = Modifier.height(8.dp)) - BitwardenMultiSelectButton( - modifier = Modifier - .fillMaxWidth() - .semantics { testTag = "RefreshPeriodItemTypePicker" }, - label = stringResource(id = R.string.refresh_period), - options = refreshPeriodOptionsWithStrings.values.toImmutableList(), - selectedOption = stringResource( - id = R.string.refresh_period_seconds, - viewState.itemData.refreshPeriod.seconds, - ), - onOptionSelected = remember(viewState) { - { selectedOption -> - val selectedOptionName = refreshPeriodOptionsWithStrings - .entries - .first { it.value == selectedOption } - .key - - onRefreshPeriodOptionClicked(selectedOptionName) - } - }, - ) - } - - item { - Spacer(modifier = Modifier.height(8.dp)) - DigitsCounterItem( - digits = viewState.itemData.digits, - onDigitsCounterChange = onNumberOfDigitsChanged, - minValue = viewState.minDigitsAllowed, - maxValue = viewState.maxDigitsAllowed, - ) - } - } - } + item(key = "DigitsCounterItem") { + Spacer(modifier = Modifier.height(8.dp)) + DigitsCounterItem( + modifier = Modifier + .fillMaxWidth() + .standardHorizontalMargin() + .animateItem(), + digits = viewState.itemData.digits, + onDigitsCounterChange = onNumberOfDigitsChanged, + minValue = viewState.minDigitsAllowed, + maxValue = viewState.maxDigitsAllowed, + ) } } @@ -500,6 +485,7 @@ private fun DigitsCounterItem( onDigitsCounterChange: (Int) -> Unit, minValue: Int, maxValue: Int, + modifier: Modifier = Modifier, ) { BitwardenStepper( label = stringResource(id = R.string.number_of_digits), @@ -508,7 +494,7 @@ private fun DigitsCounterItem( onValueChange = onDigitsCounterChange, increaseButtonTestTag = "DigitsIncreaseButton", decreaseButtonTestTag = "DigitsDecreaseButton", - modifier = Modifier.testTag("DigitsValueLabel"), + modifier = modifier.testTag(tag = "DigitsValueLabel"), ) } diff --git a/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/itemlisting/FirstTimeSyncSnackbarHost.kt b/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/itemlisting/FirstTimeSyncSnackbarHost.kt index e99a8d5515..939c9b1e9d 100644 --- a/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/itemlisting/FirstTimeSyncSnackbarHost.kt +++ b/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/itemlisting/FirstTimeSyncSnackbarHost.kt @@ -20,6 +20,7 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import com.bitwarden.authenticator.R +import com.bitwarden.ui.platform.resource.BitwardenDrawable /** * Show a snackbar that says "Account synced from Bitwarden app" with a close action. @@ -56,7 +57,7 @@ fun FirstTimeSyncSnackbarHost( onClick = { state.currentSnackbarData?.dismiss() }, ) { Icon( - painter = painterResource(id = R.drawable.ic_close), + painter = painterResource(id = BitwardenDrawable.ic_close), contentDescription = stringResource(id = R.string.close), tint = MaterialTheme.colorScheme.inverseOnSurface, modifier = Modifier diff --git a/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/itemlisting/ItemListingScreen.kt b/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/itemlisting/ItemListingScreen.kt index 032c26a7f1..969ed33acc 100644 --- a/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/itemlisting/ItemListingScreen.kt +++ b/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/itemlisting/ItemListingScreen.kt @@ -58,9 +58,9 @@ import com.bitwarden.authenticator.ui.authenticator.feature.itemlisting.model.It import com.bitwarden.authenticator.ui.authenticator.feature.itemlisting.model.SharedCodesDisplayState import com.bitwarden.authenticator.ui.authenticator.feature.itemlisting.model.VaultDropdownMenuAction import com.bitwarden.authenticator.ui.authenticator.feature.itemlisting.model.VerificationCodeDisplayItem -import com.bitwarden.authenticator.ui.platform.components.appbar.BitwardenMediumTopAppBar -import com.bitwarden.authenticator.ui.platform.components.appbar.BitwardenTopAppBar -import com.bitwarden.authenticator.ui.platform.components.appbar.action.BitwardenSearchActionItem +import com.bitwarden.authenticator.ui.platform.components.appbar.AuthenticatorMediumTopAppBar +import com.bitwarden.authenticator.ui.platform.components.appbar.AuthenticatorTopAppBar +import com.bitwarden.authenticator.ui.platform.components.appbar.action.AuthenticatorSearchActionItem import com.bitwarden.authenticator.ui.platform.components.button.BitwardenFilledButton import com.bitwarden.authenticator.ui.platform.components.button.BitwardenFilledTonalButton import com.bitwarden.authenticator.ui.platform.components.button.BitwardenTextButton @@ -84,6 +84,7 @@ import com.bitwarden.authenticator.ui.platform.theme.Typography import com.bitwarden.ui.platform.base.util.EventsEffect 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.util.asText import kotlinx.coroutines.launch @@ -363,11 +364,11 @@ private fun ItemListingContent( .fillMaxSize() .nestedScroll(scrollBehavior.nestedScrollConnection), topBar = { - BitwardenMediumTopAppBar( + AuthenticatorMediumTopAppBar( title = stringResource(id = R.string.verification_codes), scrollBehavior = scrollBehavior, actions = { - BitwardenSearchActionItem( + AuthenticatorSearchActionItem( contentDescription = stringResource(id = R.string.search_codes), onClick = onNavigateToSearch, ) @@ -590,7 +591,7 @@ fun EmptyItemListingContent( .fillMaxSize() .nestedScroll(scrollBehavior.nestedScrollConnection), topBar = { - BitwardenTopAppBar( + AuthenticatorTopAppBar( title = stringResource(id = R.string.verification_codes), scrollBehavior = scrollBehavior, navigationIcon = null, @@ -727,7 +728,7 @@ private fun DownloadBitwardenActionCard( onClick = onDismissClick, ) { Icon( - painter = painterResource(id = R.drawable.ic_close), + painter = painterResource(id = BitwardenDrawable.ic_close), contentDescription = stringResource(id = R.string.close), tint = MaterialTheme.colorScheme.onSurfaceVariant, modifier = Modifier @@ -778,7 +779,7 @@ private fun SyncWithBitwardenActionCard( Spacer(Modifier.width(width = 16.dp)) IconButton(onClick = onDismissClick) { Icon( - painter = painterResource(id = R.drawable.ic_close), + painter = painterResource(id = BitwardenDrawable.ic_close), contentDescription = stringResource(id = R.string.close), tint = MaterialTheme.colorScheme.onSurfaceVariant, modifier = Modifier.size(size = 24.dp), diff --git a/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/manualcodeentry/ManualCodeEntryScreen.kt b/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/manualcodeentry/ManualCodeEntryScreen.kt index 6db789ee19..4ffccb4cfc 100644 --- a/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/manualcodeentry/ManualCodeEntryScreen.kt +++ b/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/manualcodeentry/ManualCodeEntryScreen.kt @@ -2,7 +2,6 @@ package com.bitwarden.authenticator.ui.authenticator.feature.manualcodeentry import android.Manifest import android.content.Intent -import android.net.Uri import android.provider.Settings import android.widget.Toast import androidx.compose.foundation.layout.Column @@ -10,8 +9,10 @@ import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.navigationBarsPadding import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.text.ClickableText +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text @@ -25,16 +26,19 @@ import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.testTag import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource +import androidx.compose.ui.semantics.CustomAccessibilityAction +import androidx.compose.ui.semantics.customActions import androidx.compose.ui.semantics.semantics -import androidx.compose.ui.semantics.testTag import androidx.compose.ui.text.input.KeyboardCapitalization import androidx.compose.ui.unit.dp +import androidx.core.net.toUri import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.bitwarden.authenticator.R -import com.bitwarden.authenticator.ui.platform.components.appbar.BitwardenTopAppBar +import com.bitwarden.authenticator.ui.platform.components.appbar.AuthenticatorTopAppBar import com.bitwarden.authenticator.ui.platform.components.dialog.BasicDialogState import com.bitwarden.authenticator.ui.platform.components.dialog.BitwardenBasicDialog import com.bitwarden.authenticator.ui.platform.components.dialog.BitwardenLoadingDialog @@ -48,7 +52,10 @@ import com.bitwarden.authenticator.ui.platform.composition.LocalPermissionsManag import com.bitwarden.authenticator.ui.platform.manager.intent.IntentManager import com.bitwarden.authenticator.ui.platform.manager.permissions.PermissionsManager import com.bitwarden.ui.platform.base.util.EventsEffect -import com.bitwarden.ui.platform.base.util.toAnnotatedString +import com.bitwarden.ui.platform.base.util.annotatedStringResource +import com.bitwarden.ui.platform.base.util.spanStyleOf +import com.bitwarden.ui.platform.base.util.standardHorizontalMargin +import com.bitwarden.ui.platform.resource.BitwardenDrawable /** * The screen to manually add a totp code. @@ -80,7 +87,7 @@ fun ManualCodeEntryScreen( when (event) { is ManualCodeEntryEvent.NavigateToAppSettings -> { val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) - intent.data = Uri.parse("package:" + context.packageName) + intent.data = "package:${context.packageName}".toUri() intentManager.startActivity(intent = intent) } @@ -115,39 +122,19 @@ fun ManualCodeEntryScreen( ) } - when (val dialog = state.dialog) { - - is ManualCodeEntryState.DialogState.Error -> { - BitwardenBasicDialog( - visibilityState = BasicDialogState.Shown( - title = dialog.title, - message = dialog.message, - ), - onDismissRequest = remember(state) { - { viewModel.trySendAction(ManualCodeEntryAction.DismissDialog) } - }, - ) - } - - is ManualCodeEntryState.DialogState.Loading -> { - BitwardenLoadingDialog( - visibilityState = LoadingDialogState.Shown( - dialog.message, - ), - ) - } - - null -> { - Unit - } - } + ManualCodeEntryDialogs( + dialog = state.dialog, + onDismissRequest = remember(state) { + { viewModel.trySendAction(ManualCodeEntryAction.DismissDialog) } + }, + ) BitwardenScaffold( modifier = Modifier.fillMaxSize(), topBar = { - BitwardenTopAppBar( + AuthenticatorTopAppBar( title = stringResource(id = R.string.create_verification_code), - navigationIcon = painterResource(id = R.drawable.ic_close), + navigationIcon = painterResource(id = BitwardenDrawable.ic_close), navigationIconContentDescription = stringResource(id = R.string.close), onNavigationIconClick = remember(viewModel) { { viewModel.trySendAction(ManualCodeEntryAction.CloseClick) } @@ -156,92 +143,156 @@ fun ManualCodeEntryScreen( ) }, ) { paddingValues -> - Column(modifier = Modifier.padding(paddingValues)) { - - Text( - text = stringResource(id = R.string.enter_key_manually), - style = MaterialTheme.typography.titleMedium, - modifier = Modifier.padding(horizontal = 16.dp), - ) - - Spacer(modifier = Modifier.height(8.dp)) - BitwardenTextField( - label = stringResource(id = R.string.name), - value = state.issuer, - onValueChange = remember(viewModel) { - { - viewModel.trySendAction( - ManualCodeEntryAction.IssuerTextChange(it), - ) + ManualCodeEntryContent( + state = state, + onNameChange = remember(viewModel) { + { viewModel.trySendAction(ManualCodeEntryAction.IssuerTextChange(it)) } + }, + onKeyChange = remember(viewModel) { + { viewModel.trySendAction(ManualCodeEntryAction.CodeTextChange(it)) } + }, + onSaveLocallyClick = remember(viewModel) { + { viewModel.trySendAction(ManualCodeEntryAction.SaveLocallyClick) } + }, + onSaveToBitwardenClick = remember(viewModel) { + { viewModel.trySendAction(ManualCodeEntryAction.SaveToBitwardenClick) } + }, + onScanQrCodeClick = remember(viewModel) { + { + if (permissionsManager.checkPermission(Manifest.permission.CAMERA)) { + viewModel.trySendAction(ManualCodeEntryAction.ScanQrCodeTextClick) + } else { + launcher.launch(Manifest.permission.CAMERA) } - }, - modifier = Modifier - .semantics { testTag = "NameTextField" } - .fillMaxWidth() - .padding(horizontal = 16.dp), - ) - Spacer(modifier = Modifier.height(8.dp)) - BitwardenPasswordField( - singleLine = false, - label = stringResource(id = R.string.key), - value = state.code, - onValueChange = remember(viewModel) { - { - viewModel.trySendAction( - ManualCodeEntryAction.CodeTextChange(it), - ) - } - }, - capitalization = KeyboardCapitalization.Characters, - modifier = Modifier - .semantics { testTag = "KeyTextField" } - .fillMaxWidth() - .padding(horizontal = 16.dp), - ) + } + }, + modifier = Modifier.padding(paddingValues = paddingValues), + ) + } +} + +@Composable +private fun ManualCodeEntryContent( + state: ManualCodeEntryState, + onNameChange: (name: String) -> Unit, + onKeyChange: (key: String) -> Unit, + onSaveLocallyClick: () -> Unit, + onSaveToBitwardenClick: () -> Unit, + onScanQrCodeClick: () -> Unit, + modifier: Modifier = Modifier, +) { + Column(modifier = modifier.verticalScroll(state = rememberScrollState())) { + Text( + text = stringResource(id = R.string.enter_key_manually), + style = MaterialTheme.typography.titleMedium, + modifier = Modifier + .fillMaxWidth() + .standardHorizontalMargin(), + ) + + Spacer(modifier = Modifier.height(height = 8.dp)) + BitwardenTextField( + label = stringResource(id = R.string.name), + value = state.issuer, + onValueChange = onNameChange, + modifier = Modifier + .testTag(tag = "NameTextField") + .fillMaxWidth() + .standardHorizontalMargin(), + ) + Spacer(modifier = Modifier.height(height = 8.dp)) + BitwardenPasswordField( + singleLine = false, + label = stringResource(id = R.string.key), + value = state.code, + onValueChange = onKeyChange, + capitalization = KeyboardCapitalization.Characters, + modifier = Modifier + .testTag(tag = "KeyTextField") + .fillMaxWidth() + .standardHorizontalMargin(), + ) - Spacer(modifier = Modifier.height(16.dp)) - SaveManualCodeButtons( - state = state.buttonState, - onSaveLocallyClick = remember(viewModel) { - { - viewModel.trySendAction(ManualCodeEntryAction.SaveLocallyClick) - } - }, - onSaveToBitwardenClick = remember(viewModel) { - { - viewModel.trySendAction(ManualCodeEntryAction.SaveToBitwardenClick) - } - }, - ) + Spacer(modifier = Modifier.height(16.dp)) + SaveManualCodeButtons( + state = state.buttonState, + onSaveLocallyClick = onSaveLocallyClick, + onSaveToBitwardenClick = onSaveToBitwardenClick, + modifier = Modifier + .standardHorizontalMargin() + .fillMaxWidth(), + ) + Spacer(modifier = Modifier.height(height = 8.dp)) + Text( + text = stringResource(id = R.string.cannot_add_authenticator_key), + style = MaterialTheme.typography.bodyMedium, + modifier = Modifier + .fillMaxWidth() + .standardHorizontalMargin(), + ) + Spacer(modifier = Modifier.height(height = 8.dp)) + ScanQrCodeText( + onClick = onScanQrCodeClick, + modifier = Modifier.standardHorizontalMargin(), + ) + Spacer(modifier = Modifier.height(height = 16.dp)) + Spacer(modifier = Modifier.navigationBarsPadding()) + } +} - Text( - text = stringResource(id = R.string.cannot_add_authenticator_key), - style = MaterialTheme.typography.bodyMedium, - modifier = Modifier - .fillMaxWidth() - .padding( - vertical = 8.dp, - horizontal = 16.dp, - ), +@Composable +private fun ScanQrCodeText( + onClick: () -> Unit, + modifier: Modifier = Modifier, +) { + val accessibilityString = stringResource(id = R.string.scan_qr_code) + Text( + text = annotatedStringResource( + id = R.string.scan_qr_code, + emphasisHighlightStyle = spanStyleOf( + color = MaterialTheme.colorScheme.primary, + textStyle = MaterialTheme.typography.bodyMedium, + ), + onAnnotationClick = { + when (it) { + "scanQrCode" -> onClick() + } + }, + ), + modifier = modifier.semantics { + customActions = listOf( + CustomAccessibilityAction( + label = accessibilityString, + action = { + onClick() + true + }, + ), ) + }, + ) +} - ClickableText( - text = stringResource(id = R.string.scan_qr_code).toAnnotatedString(), - style = MaterialTheme.typography.bodyMedium.copy( - color = MaterialTheme.colorScheme.primary, +@Composable +private fun ManualCodeEntryDialogs( + dialog: ManualCodeEntryState.DialogState?, + onDismissRequest: () -> Unit, +) { + when (val dialogString = dialog) { + is ManualCodeEntryState.DialogState.Error -> { + BitwardenBasicDialog( + visibilityState = BasicDialogState.Shown( + title = dialogString.title, + message = dialogString.message, ), - modifier = Modifier - .padding(horizontal = 16.dp), - onClick = remember(viewModel) { - { - if (permissionsManager.checkPermission(Manifest.permission.CAMERA)) { - viewModel.trySendAction(ManualCodeEntryAction.ScanQrCodeTextClick) - } else { - launcher.launch(Manifest.permission.CAMERA) - } - } - }, + onDismissRequest = onDismissRequest, ) + } + + is ManualCodeEntryState.DialogState.Loading -> { + BitwardenLoadingDialog(visibilityState = LoadingDialogState.Shown(dialog.message)) } + + null -> Unit } } diff --git a/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/manualcodeentry/SaveManualCodeButtons.kt b/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/manualcodeentry/SaveManualCodeButtons.kt index abdfac93eb..7516b63de3 100644 --- a/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/manualcodeentry/SaveManualCodeButtons.kt +++ b/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/manualcodeentry/SaveManualCodeButtons.kt @@ -2,13 +2,10 @@ package com.bitwarden.authenticator.ui.authenticator.feature.manualcodeentry import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.padding import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.testTag import androidx.compose.ui.res.stringResource -import androidx.compose.ui.semantics.semantics -import androidx.compose.ui.semantics.testTag -import androidx.compose.ui.unit.dp import com.bitwarden.authenticator.R import com.bitwarden.authenticator.ui.platform.components.button.BitwardenFilledButton import com.bitwarden.authenticator.ui.platform.components.button.BitwardenFilledTonalButton @@ -20,60 +17,50 @@ import com.bitwarden.authenticator.ui.platform.components.button.BitwardenOutlin * @param state State of the buttons to show. * @param onSaveLocallyClick Callback invoked when the user clicks save locally. * @param onSaveToBitwardenClick Callback invoked when the user clicks save to Bitwarden. + * @param modifier The modifier to be applied to the composable. */ @Composable fun SaveManualCodeButtons( state: ManualCodeEntryState.ButtonState, onSaveLocallyClick: () -> Unit, onSaveToBitwardenClick: () -> Unit, + modifier: Modifier = Modifier, ) { - when (state) { ManualCodeEntryState.ButtonState.LocalOnly -> { BitwardenFilledTonalButton( label = stringResource(id = R.string.add_code), onClick = onSaveLocallyClick, - modifier = Modifier - .semantics { testTag = "AddCodeButton" } - .fillMaxWidth() - .padding(horizontal = 16.dp), + modifier = modifier.testTag(tag = "AddCodeButton"), ) } ManualCodeEntryState.ButtonState.SaveLocallyPrimary -> { - Column { + Column(modifier = modifier) { BitwardenFilledButton( label = stringResource(id = R.string.save_here), onClick = onSaveLocallyClick, - modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 16.dp), + modifier = Modifier.fillMaxWidth(), ) BitwardenOutlinedButton( label = stringResource(R.string.save_to_bitwarden), onClick = onSaveToBitwardenClick, - modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 16.dp), + modifier = Modifier.fillMaxWidth(), ) } } ManualCodeEntryState.ButtonState.SaveToBitwardenPrimary -> { - Column { + Column(modifier = modifier) { BitwardenFilledButton( label = stringResource(id = R.string.save_to_bitwarden), onClick = onSaveToBitwardenClick, - modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 16.dp), + modifier = Modifier.fillMaxWidth(), ) BitwardenOutlinedButton( label = stringResource(R.string.save_here), onClick = onSaveLocallyClick, - modifier = Modifier - .fillMaxWidth() - .padding(horizontal = 16.dp), + modifier = Modifier.fillMaxWidth(), ) } } diff --git a/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/qrcodescan/QrCodeScanScreen.kt b/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/qrcodescan/QrCodeScanScreen.kt index 76023a846a..f940e04465 100644 --- a/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/qrcodescan/QrCodeScanScreen.kt +++ b/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/qrcodescan/QrCodeScanScreen.kt @@ -60,13 +60,14 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.bitwarden.authenticator.R import com.bitwarden.authenticator.ui.authenticator.feature.qrcodescan.util.QrCodeAnalyzer import com.bitwarden.authenticator.ui.authenticator.feature.qrcodescan.util.QrCodeAnalyzerImpl -import com.bitwarden.authenticator.ui.platform.components.appbar.BitwardenTopAppBar +import com.bitwarden.authenticator.ui.platform.components.appbar.AuthenticatorTopAppBar import com.bitwarden.authenticator.ui.platform.components.dialog.BasicDialogState import com.bitwarden.authenticator.ui.platform.components.dialog.BitwardenBasicDialog import com.bitwarden.authenticator.ui.platform.components.scaffold.BitwardenScaffold import com.bitwarden.authenticator.ui.platform.theme.LocalNonMaterialColors import com.bitwarden.authenticator.ui.platform.theme.clickableSpanStyle import com.bitwarden.ui.platform.base.util.EventsEffect +import com.bitwarden.ui.platform.resource.BitwardenDrawable import com.bitwarden.ui.util.asText import java.util.concurrent.Executors import kotlin.coroutines.resume @@ -116,9 +117,9 @@ fun QrCodeScanScreen( BitwardenScaffold( modifier = Modifier.fillMaxSize(), topBar = { - BitwardenTopAppBar( + AuthenticatorTopAppBar( title = stringResource(id = R.string.scan_qr_code), - navigationIcon = painterResource(id = R.drawable.ic_close), + navigationIcon = painterResource(id = BitwardenDrawable.ic_close), navigationIconContentDescription = stringResource(id = R.string.close), onNavigationIconClick = remember(viewModel) { { viewModel.trySendAction(QrCodeScanAction.CloseClick) } diff --git a/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/search/ItemSearchScreen.kt b/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/search/ItemSearchScreen.kt index 1be6066067..d80969ac44 100644 --- a/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/search/ItemSearchScreen.kt +++ b/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/authenticator/feature/search/ItemSearchScreen.kt @@ -21,11 +21,11 @@ import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.bitwarden.authenticator.R import com.bitwarden.authenticator.ui.authenticator.feature.search.handlers.SearchHandlers -import com.bitwarden.authenticator.ui.platform.components.appbar.BitwardenSearchTopAppBar -import com.bitwarden.authenticator.ui.platform.components.appbar.NavigationIcon +import com.bitwarden.authenticator.ui.platform.components.appbar.AuthenticatorSearchTopAppBar import com.bitwarden.authenticator.ui.platform.components.scaffold.BitwardenScaffold import com.bitwarden.ui.platform.base.util.EventsEffect import com.bitwarden.ui.platform.base.util.bottomDivider +import com.bitwarden.ui.platform.components.appbar.NavigationIcon /** * The search screen for authenticator items. @@ -58,7 +58,7 @@ fun ItemSearchScreen( modifier = Modifier .nestedScroll(scrollBehavior.nestedScrollConnection), topBar = { - BitwardenSearchTopAppBar( + AuthenticatorSearchTopAppBar( modifier = Modifier .semantics { testTag = "SearchFieldEntry" } .bottomDivider(), diff --git a/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/components/appbar/BitwardenMediumTopAppBar.kt b/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/components/appbar/AuthenticatorMediumTopAppBar.kt similarity index 92% rename from authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/components/appbar/BitwardenMediumTopAppBar.kt rename to authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/components/appbar/AuthenticatorMediumTopAppBar.kt index f8cba80f24..143ead4ec0 100644 --- a/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/components/appbar/BitwardenMediumTopAppBar.kt +++ b/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/components/appbar/AuthenticatorMediumTopAppBar.kt @@ -16,7 +16,7 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.semantics.semantics import androidx.compose.ui.semantics.testTag import androidx.compose.ui.tooling.preview.Preview -import com.bitwarden.authenticator.R +import com.bitwarden.ui.platform.resource.BitwardenDrawable /** * A custom Bitwarden-themed medium top app bar with support for actions. @@ -35,7 +35,7 @@ import com.bitwarden.authenticator.R */ @OptIn(ExperimentalMaterial3Api::class) @Composable -fun BitwardenMediumTopAppBar( +fun AuthenticatorMediumTopAppBar( title: String, scrollBehavior: TopAppBarScrollBehavior, modifier: Modifier = Modifier, @@ -65,9 +65,9 @@ fun BitwardenMediumTopAppBar( @OptIn(ExperimentalMaterial3Api::class) @Preview(showBackground = true) @Composable -private fun BitwardenMediumTopAppBar_preview() { +private fun AuthenticatorMediumTopAppBar_preview() { MaterialTheme { - BitwardenMediumTopAppBar( + AuthenticatorMediumTopAppBar( title = "Preview Title", scrollBehavior = TopAppBarDefaults .exitUntilCollapsedScrollBehavior( @@ -76,7 +76,7 @@ private fun BitwardenMediumTopAppBar_preview() { actions = { IconButton(onClick = { }) { Icon( - painter = painterResource(id = R.drawable.ic_more), + painter = painterResource(id = BitwardenDrawable.ic_ellipsis_vertical), contentDescription = "", tint = MaterialTheme.colorScheme.onSurface, ) diff --git a/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/components/appbar/BitwardenSearchTopAppBar.kt b/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/components/appbar/AuthenticatorSearchTopAppBar.kt similarity index 94% rename from authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/components/appbar/BitwardenSearchTopAppBar.kt rename to authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/components/appbar/AuthenticatorSearchTopAppBar.kt index 49c8d58f01..5351a7b57c 100644 --- a/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/components/appbar/BitwardenSearchTopAppBar.kt +++ b/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/components/appbar/AuthenticatorSearchTopAppBar.kt @@ -26,6 +26,8 @@ import androidx.compose.ui.semantics.testTag import androidx.compose.ui.text.input.ImeAction import com.bitwarden.authenticator.R import com.bitwarden.ui.platform.base.util.mirrorIfRtl +import com.bitwarden.ui.platform.components.appbar.NavigationIcon +import com.bitwarden.ui.platform.resource.BitwardenDrawable /** * Represents a Bitwarden styled [TopAppBar] that assumes the following components: @@ -35,7 +37,7 @@ import com.bitwarden.ui.platform.base.util.mirrorIfRtl */ @OptIn(ExperimentalMaterial3Api::class) @Composable -fun BitwardenSearchTopAppBar( +fun AuthenticatorSearchTopAppBar( searchTerm: String, placeholder: String, onSearchTermChange: (String) -> Unit, @@ -85,7 +87,7 @@ fun BitwardenSearchTopAppBar( onClick = { onSearchTermChange("") }, ) { Icon( - painter = painterResource(id = R.drawable.ic_close), + painter = painterResource(id = BitwardenDrawable.ic_close), contentDescription = stringResource(id = R.string.clear), ) } diff --git a/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/components/appbar/BitwardenTopAppBar.kt b/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/components/appbar/AuthenticatorTopAppBar.kt similarity index 87% rename from authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/components/appbar/BitwardenTopAppBar.kt rename to authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/components/appbar/AuthenticatorTopAppBar.kt index bf65478985..ac4763615a 100644 --- a/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/components/appbar/BitwardenTopAppBar.kt +++ b/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/components/appbar/AuthenticatorTopAppBar.kt @@ -22,6 +22,8 @@ import androidx.compose.ui.tooling.preview.Preview import com.bitwarden.authenticator.R import com.bitwarden.authenticator.ui.platform.theme.AuthenticatorTheme import com.bitwarden.ui.platform.base.util.mirrorIfRtl +import com.bitwarden.ui.platform.components.appbar.NavigationIcon +import com.bitwarden.ui.platform.resource.BitwardenDrawable /** * Represents a Bitwarden styled [TopAppBar] that assumes the following components: @@ -35,7 +37,7 @@ import com.bitwarden.ui.platform.base.util.mirrorIfRtl */ @OptIn(ExperimentalMaterial3Api::class) @Composable -fun BitwardenTopAppBar( +fun AuthenticatorTopAppBar( title: String, scrollBehavior: TopAppBarScrollBehavior, navigationIcon: Painter, @@ -44,7 +46,7 @@ fun BitwardenTopAppBar( modifier: Modifier = Modifier, actions: @Composable RowScope.() -> Unit = { }, ) { - BitwardenTopAppBar( + AuthenticatorTopAppBar( title = title, scrollBehavior = scrollBehavior, navigationIcon = NavigationIcon( @@ -68,7 +70,7 @@ fun BitwardenTopAppBar( */ @OptIn(ExperimentalMaterial3Api::class) @Composable -fun BitwardenTopAppBar( +fun AuthenticatorTopAppBar( title: String, scrollBehavior: TopAppBarScrollBehavior, navigationIcon: NavigationIcon?, @@ -116,32 +118,19 @@ fun BitwardenTopAppBar( @OptIn(ExperimentalMaterial3Api::class) @Preview @Composable -private fun BitwardenTopAppBar_preview() { +private fun AuthenticatorTopAppBar_preview() { AuthenticatorTheme { - BitwardenTopAppBar( + AuthenticatorTopAppBar( title = "Title", scrollBehavior = TopAppBarDefaults .exitUntilCollapsedScrollBehavior( rememberTopAppBarState(), ), navigationIcon = NavigationIcon( - navigationIcon = painterResource(id = R.drawable.ic_close), + navigationIcon = painterResource(id = BitwardenDrawable.ic_close), navigationIconContentDescription = stringResource(id = R.string.close), onNavigationIconClick = { }, ), ) } } - -/** - * Represents all data required to display a [navigationIcon]. - * - * @property navigationIcon The [Painter] displayed as part of the icon. - * @property navigationIconContentDescription The content description associated with the icon. - * @property onNavigationIconClick The click action that is invoked when the icon is tapped. - */ -data class NavigationIcon( - val navigationIcon: Painter, - val navigationIconContentDescription: String, - val onNavigationIconClick: () -> Unit, -) diff --git a/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/components/appbar/action/BitwardenSearchActionItem.kt b/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/components/appbar/action/AuthenticatorSearchActionItem.kt similarity index 85% rename from authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/components/appbar/action/BitwardenSearchActionItem.kt rename to authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/components/appbar/action/AuthenticatorSearchActionItem.kt index 53387b1643..f4c4803eeb 100644 --- a/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/components/appbar/action/BitwardenSearchActionItem.kt +++ b/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/components/appbar/action/AuthenticatorSearchActionItem.kt @@ -10,17 +10,17 @@ import com.bitwarden.authenticator.R import com.bitwarden.ui.platform.components.util.rememberVectorPainter /** - * Represents the Bitwarden search action item. + * Represents the Authenticator search action item. * * This is an [Icon] composable tailored specifically for the search functionality - * in the Bitwarden app. + * in the Authenticator app. * It presents the search icon and offers an `onClick` callback for when the icon is tapped. * * @param contentDescription A description of the UI element, used for accessibility purposes. * @param onClick A callback to be invoked when this action item is clicked. */ @Composable -fun BitwardenSearchActionItem( +fun AuthenticatorSearchActionItem( contentDescription: String, onClick: () -> Unit, ) { @@ -37,8 +37,8 @@ fun BitwardenSearchActionItem( @Preview(showBackground = true) @Composable -private fun BitwardenSearchActionItem_preview() { - BitwardenSearchActionItem( +private fun AuthenticatorSearchActionItem_preview() { + AuthenticatorSearchActionItem( contentDescription = "Search", onClick = {}, ) diff --git a/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/components/button/BitwardenStandardIconButton.kt b/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/components/button/BitwardenStandardIconButton.kt deleted file mode 100644 index 34e77bc782..0000000000 --- a/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/components/button/BitwardenStandardIconButton.kt +++ /dev/null @@ -1,58 +0,0 @@ -package com.bitwarden.authenticator.ui.platform.components.button - -import androidx.compose.material3.FilledIconButton -import androidx.compose.material3.Icon -import androidx.compose.material3.IconButtonColors -import androidx.compose.material3.MaterialTheme -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import androidx.compose.ui.semantics.semantics -import androidx.compose.ui.tooling.preview.Preview -import com.bitwarden.authenticator.R -import com.bitwarden.authenticator.ui.platform.components.model.IconResource -import com.bitwarden.ui.platform.components.util.rememberVectorPainter - -/** - * An icon button that displays an icon from the provided [IconResource]. - * - * @param iconRes Icon to display on the button. - * @param onClick Callback for when the icon button is clicked. - * @param isEnabled Whether or not the button should be enabled. - * @param modifier A [Modifier] for the composable. - */ -@Composable -fun BitwardenIconButtonWithResource( - iconRes: IconResource, - onClick: () -> Unit, - modifier: Modifier = Modifier, - isEnabled: Boolean = true, -) { - FilledIconButton( - modifier = modifier.semantics(mergeDescendants = true) {}, - onClick = onClick, - colors = IconButtonColors( - containerColor = MaterialTheme.colorScheme.secondaryContainer, - contentColor = MaterialTheme.colorScheme.onSecondaryContainer, - disabledContainerColor = MaterialTheme.colorScheme.onSurface.copy(alpha = .12f), - disabledContentColor = MaterialTheme.colorScheme.onSecondaryContainer, - ), - enabled = isEnabled, - ) { - Icon( - painter = iconRes.iconPainter, - contentDescription = iconRes.contentDescription, - ) - } -} - -@Preview(showBackground = true) -@Composable -private fun BitwardenIconButtonWithResource_preview() { - BitwardenIconButtonWithResource( - iconRes = IconResource( - iconPainter = rememberVectorPainter(id = R.drawable.ic_tooltip), - contentDescription = "Sample Icon", - ), - onClick = {}, - ) -} diff --git a/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/components/card/BitwardenActionCard.kt b/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/components/card/BitwardenActionCard.kt index b327fad440..28d93bed0e 100644 --- a/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/components/card/BitwardenActionCard.kt +++ b/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/components/card/BitwardenActionCard.kt @@ -26,6 +26,7 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.bitwarden.authenticator.R import com.bitwarden.ui.platform.components.util.rememberVectorPainter +import com.bitwarden.ui.platform.resource.BitwardenDrawable /** * A reusable card for displaying actions to the user. @@ -97,7 +98,7 @@ fun BitwardenActionCard( @Composable private fun ActionCardPreview() { BitwardenActionCard( - actionIcon = rememberVectorPainter(id = R.drawable.ic_close), + actionIcon = rememberVectorPainter(id = BitwardenDrawable.ic_close), actionText = "This is an action.", callToActionText = "Take action", titleText = "This is a title", @@ -119,7 +120,7 @@ private fun ActionCardWithTrailingPreview() { onClick = {}, ) { Icon( - painter = painterResource(id = R.drawable.ic_close), + painter = painterResource(id = BitwardenDrawable.ic_close), contentDescription = stringResource(id = R.string.close), tint = MaterialTheme.colorScheme.onSurfaceVariant, modifier = Modifier diff --git a/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/feature/debugmenu/DebugMenuScreen.kt b/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/feature/debugmenu/DebugMenuScreen.kt index 62d4b8ec97..47c9277db7 100644 --- a/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/feature/debugmenu/DebugMenuScreen.kt +++ b/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/feature/debugmenu/DebugMenuScreen.kt @@ -22,8 +22,7 @@ import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.bitwarden.authenticator.R import com.bitwarden.authenticator.data.platform.manager.model.FlagKey -import com.bitwarden.authenticator.ui.platform.components.appbar.BitwardenTopAppBar -import com.bitwarden.authenticator.ui.platform.components.appbar.NavigationIcon +import com.bitwarden.authenticator.ui.platform.components.appbar.AuthenticatorTopAppBar import com.bitwarden.authenticator.ui.platform.components.button.BitwardenFilledButton import com.bitwarden.authenticator.ui.platform.components.divider.BitwardenHorizontalDivider import com.bitwarden.authenticator.ui.platform.components.header.BitwardenListHeaderText @@ -32,6 +31,7 @@ import com.bitwarden.authenticator.ui.platform.feature.debugmenu.components.List import com.bitwarden.authenticator.ui.platform.theme.AuthenticatorTheme import com.bitwarden.ui.platform.base.util.EventsEffect import com.bitwarden.ui.platform.base.util.standardHorizontalMargin +import com.bitwarden.ui.platform.components.appbar.NavigationIcon import com.bitwarden.ui.platform.components.util.rememberVectorPainter /** @@ -57,7 +57,7 @@ fun DebugMenuScreen( .fillMaxSize() .nestedScroll(scrollBehavior.nestedScrollConnection), topBar = { - BitwardenTopAppBar( + AuthenticatorTopAppBar( title = stringResource(R.string.debug_menu), scrollBehavior = scrollBehavior, navigationIcon = NavigationIcon( diff --git a/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/feature/settings/SettingsScreen.kt b/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/feature/settings/SettingsScreen.kt index f254c18c3a..e2fde7436f 100644 --- a/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/feature/settings/SettingsScreen.kt +++ b/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/feature/settings/SettingsScreen.kt @@ -48,7 +48,7 @@ import androidx.core.net.toUri import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.bitwarden.authenticator.R -import com.bitwarden.authenticator.ui.platform.components.appbar.BitwardenMediumTopAppBar +import com.bitwarden.authenticator.ui.platform.components.appbar.AuthenticatorMediumTopAppBar import com.bitwarden.authenticator.ui.platform.components.dialog.BitwardenSelectionDialog import com.bitwarden.authenticator.ui.platform.components.dialog.BitwardenSelectionRow import com.bitwarden.authenticator.ui.platform.components.header.BitwardenListHeaderText @@ -64,9 +64,9 @@ import com.bitwarden.authenticator.ui.platform.manager.intent.IntentManager import com.bitwarden.authenticator.ui.platform.theme.AuthenticatorTheme import com.bitwarden.authenticator.ui.platform.util.displayLabel import com.bitwarden.ui.platform.base.util.EventsEffect +import com.bitwarden.ui.platform.base.util.annotatedStringResource import com.bitwarden.ui.platform.base.util.mirrorIfRtl import com.bitwarden.ui.platform.base.util.spanStyleOf -import com.bitwarden.ui.platform.base.util.toAnnotatedString import com.bitwarden.ui.platform.components.util.rememberVectorPainter import com.bitwarden.ui.platform.feature.settings.appearance.model.AppTheme import com.bitwarden.ui.util.Text @@ -138,7 +138,7 @@ fun SettingsScreen( .fillMaxSize() .nestedScroll(scrollBehavior.nestedScrollConnection), topBar = { - BitwardenMediumTopAppBar( + AuthenticatorMediumTopAppBar( title = stringResource(id = R.string.settings), scrollBehavior = scrollBehavior, ) @@ -349,22 +349,22 @@ private fun VaultSettings( Spacer(modifier = Modifier.height(8.dp)) BitwardenTextRow( text = stringResource(id = R.string.sync_with_bitwarden_app), - description = R.string - .this_feature_is_not_not_yet_available_for_self_hosted_users - .toAnnotatedString( - style = spanStyleOf( - color = MaterialTheme.colorScheme.onSurfaceVariant, - textStyle = MaterialTheme.typography.bodyMedium, - ), - linkHighlightStyle = spanStyleOf( - color = MaterialTheme.colorScheme.primary, - textStyle = MaterialTheme.typography.labelLarge, - ), - ) { + description = annotatedStringResource( + id = R.string.this_feature_is_not_not_yet_available_for_self_hosted_users, + style = spanStyleOf( + color = MaterialTheme.colorScheme.onSurfaceVariant, + textStyle = MaterialTheme.typography.bodyMedium, + ), + linkHighlightStyle = spanStyleOf( + color = MaterialTheme.colorScheme.primary, + textStyle = MaterialTheme.typography.labelLarge, + ), + onAnnotationClick = { when (it) { "learnMore" -> onSyncLearnMoreClick() } }, + ), onClick = onSyncWithBitwardenClick, modifier = modifier, withDivider = true, diff --git a/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/feature/settings/export/ExportScreen.kt b/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/feature/settings/export/ExportScreen.kt index b0eab5a607..2950320d3e 100644 --- a/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/feature/settings/export/ExportScreen.kt +++ b/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/feature/settings/export/ExportScreen.kt @@ -29,7 +29,7 @@ import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.bitwarden.authenticator.R -import com.bitwarden.authenticator.ui.platform.components.appbar.BitwardenTopAppBar +import com.bitwarden.authenticator.ui.platform.components.appbar.AuthenticatorTopAppBar import com.bitwarden.authenticator.ui.platform.components.button.BitwardenFilledTonalButton import com.bitwarden.authenticator.ui.platform.components.dialog.BasicDialogState import com.bitwarden.authenticator.ui.platform.components.dialog.BitwardenBasicDialog @@ -43,6 +43,7 @@ import com.bitwarden.authenticator.ui.platform.feature.settings.export.model.Exp import com.bitwarden.authenticator.ui.platform.manager.intent.IntentManager import com.bitwarden.authenticator.ui.platform.util.displayLabel import com.bitwarden.ui.platform.base.util.EventsEffect +import com.bitwarden.ui.platform.resource.BitwardenDrawable import kotlinx.collections.immutable.toImmutableList /** @@ -141,10 +142,10 @@ fun ExportScreen( .fillMaxSize() .nestedScroll(scrollBehavior.nestedScrollConnection), topBar = { - BitwardenTopAppBar( + AuthenticatorTopAppBar( title = stringResource(id = R.string.export), scrollBehavior = scrollBehavior, - navigationIcon = painterResource(id = R.drawable.ic_close), + navigationIcon = painterResource(id = BitwardenDrawable.ic_close), navigationIconContentDescription = stringResource(id = R.string.close), onNavigationIconClick = remember(viewModel) { { diff --git a/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/feature/settings/importing/ImportingScreen.kt b/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/feature/settings/importing/ImportingScreen.kt index 178b66d733..0404bdcf71 100644 --- a/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/feature/settings/importing/ImportingScreen.kt +++ b/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/feature/settings/importing/ImportingScreen.kt @@ -28,7 +28,7 @@ import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.bitwarden.authenticator.R import com.bitwarden.authenticator.data.platform.manager.imports.model.ImportFileFormat -import com.bitwarden.authenticator.ui.platform.components.appbar.BitwardenTopAppBar +import com.bitwarden.authenticator.ui.platform.components.appbar.AuthenticatorTopAppBar import com.bitwarden.authenticator.ui.platform.components.button.BitwardenFilledTonalButton import com.bitwarden.authenticator.ui.platform.components.dialog.BitwardenLoadingDialog import com.bitwarden.authenticator.ui.platform.components.dialog.BitwardenTwoButtonDialog @@ -39,6 +39,7 @@ import com.bitwarden.authenticator.ui.platform.composition.LocalIntentManager import com.bitwarden.authenticator.ui.platform.manager.intent.IntentManager import com.bitwarden.authenticator.ui.platform.util.displayLabel import com.bitwarden.ui.platform.base.util.EventsEffect +import com.bitwarden.ui.platform.resource.BitwardenDrawable import kotlinx.collections.immutable.toImmutableList /** @@ -118,10 +119,10 @@ fun ImportingScreen( .fillMaxSize() .nestedScroll(scrollBehavior.nestedScrollConnection), topBar = { - BitwardenTopAppBar( + AuthenticatorTopAppBar( title = stringResource(id = R.string.import_vault), scrollBehavior = scrollBehavior, - navigationIcon = painterResource(id = R.drawable.ic_close), + navigationIcon = painterResource(id = BitwardenDrawable.ic_close), navigationIconContentDescription = stringResource(id = R.string.close), onNavigationIconClick = remember(viewModel) { { diff --git a/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/theme/AuthenticatorTheme.kt b/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/theme/AuthenticatorTheme.kt index bb85c02b35..a4e5d1f9b0 100644 --- a/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/theme/AuthenticatorTheme.kt +++ b/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/theme/AuthenticatorTheme.kt @@ -1,8 +1,6 @@ package com.bitwarden.authenticator.ui.platform.theme -import android.app.Activity import android.content.Context -import android.graphics.drawable.ColorDrawable import android.os.Build import androidx.annotation.ColorRes import androidx.compose.foundation.isSystemInDarkTheme @@ -13,12 +11,9 @@ import androidx.compose.material3.dynamicLightColorScheme import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.ProvidableCompositionLocal -import androidx.compose.runtime.SideEffect import androidx.compose.runtime.compositionLocalOf import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.platform.LocalView -import androidx.core.view.WindowCompat import com.bitwarden.authenticator.R import com.bitwarden.ui.platform.feature.settings.appearance.model.AppTheme @@ -48,19 +43,6 @@ fun AuthenticatorTheme( else -> lightColorScheme(context) } - // Update status bar according to scheme - val view = LocalView.current - if (!view.isInEditMode) { - SideEffect { - val window = (view.context as Activity).window - WindowCompat.setDecorFitsSystemWindows(window, false) - val insetsController = WindowCompat.getInsetsController(window, view) - insetsController.isAppearanceLightStatusBars = !darkTheme - insetsController.isAppearanceLightNavigationBars = !darkTheme - window.setBackgroundDrawable(ColorDrawable(colorScheme.surface.value.toInt())) - } - } - val nonMaterialColors = if (darkTheme) { darkNonMaterialColors(context) } else { diff --git a/authenticator/src/main/res/drawable/ic_close.xml b/authenticator/src/main/res/drawable/ic_close.xml deleted file mode 100644 index 0709d97e4d..0000000000 --- a/authenticator/src/main/res/drawable/ic_close.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/authenticator/src/main/res/drawable/ic_more.xml b/authenticator/src/main/res/drawable/ic_more.xml deleted file mode 100644 index 2cf873f58e..0000000000 --- a/authenticator/src/main/res/drawable/ic_more.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - diff --git a/authenticator/src/main/res/values-af-rZA/strings.xml b/authenticator/src/main/res/values-af-rZA/strings.xml index fdcce20cc5..6c2a1641d7 100644 --- a/authenticator/src/main/res/values-af-rZA/strings.xml +++ b/authenticator/src/main/res/values-af-rZA/strings.xml @@ -2,45 +2,45 @@ Authenticator Biometric verification - Avbryt - Legg til gjenstand - En feil har oppstått. + Cancel + Add item + An error has occurred. We were unable to process your request. Please try again or contact us. Internet connection required - Vennligst koble deg til internett før du fortsetter. + Please connect to the internet before continuing. OK - Synkroniserer - Kopier - Rediger + Syncing + Copy + Edit Close - Bitwarden-autentiserer - Navn + Bitwarden Authenticator + Name Add Item Rotation Scan a QR code Enter a setup key Scan QR code - Pek kameraet ditt mot QR-koden. + Point your camera at the QR code. Cannot scan QR code. Enter key manually Cannot add authenticator key? Once the key is successfully entered,\nselect Add TOTP to store the key safely Add TOTP - Autentiseringsnøkkel - Nei takk - Innstillinger + Authenticator key + No thanks + Settings Enable camera permission to use the scanner Empty Item Listing You don\'t have any items to display. Add a new code to secure your accounts. - Legg til kode + Add code Cannot read key. Verification code added - Brukernavn + Username Refresh period - Algoritme - Skjul - Vis - Avansert + Algorithm + Hide + Show + Advanced Collapse advanced options Number of digits Save @@ -48,21 +48,21 @@ %d seconds Saving Item saved - Informasjon - OTP-type + Information + OTP type Verification codes There are no items that match the search - Tilbake + Back Clear Search codes - Innstillinger - Prøv igjen - Utseende - Standard (System) - Tema - Mørk - Lys - Språk + Options + Try again + Appearance + Default (System) + Theme + Dark + Light + Language The language has been changed to %1$s. Please restart the app to see the change Secure your accounts with Bitwarden Authenticator Get verification codes for all your accounts that support 2-step verification. @@ -70,76 +70,78 @@ Scan the QR code in your 2-step verification settings for any account. Sign in using unique codes When using 2-step verification, you\'ll enter your username and password and a code generated in this app. - Fortsett - Hopp over - Kom i gang + Continue + Skip + Get started Unique codes - Hjelp + Help Launch tutorial %1$s copied - Slett gjenstanden + Delete item Item deleted - Slett - Vil du virkelig slette denne permanent? Dette kan ikke angres. + Delete + Do you really want to permanently delete? This cannot be undone. Data - Eksporter - Laster + Export + Loading Confirm export This export contains your 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. - Filformat + File format There was a problem exporting your vault. If the problem persists, you\'ll need to export from the web vault. Data exported successfully Unlock with %1$s - Biometri - Sikkerhet + Biometrics + Security Use biometrics to unlock Too many failed biometrics attempts. - Om - Versjon - Fortsett + About + Version + Continue Bitwarden Help Center - Vil du fortsette til Hjelpesenteret? + Continue to Help Center? Learn more about how to use Bitwarden Authenticator on the Help Center. - Personvernerklæring + Privacy policy Continue to privacy policy? Check out our privacy policy on bitwarden.com - Nøkkel + Key Create Verification code Key is required. - Et navn er påkrevd. + Name is required. Submit crash logs There was a problem importing your vault. - Filens kilde - Importer + File Source + Import Vault import successful - Nøkkelen er ugyldig. + Key is invalid. Save as a favorite - Favoritt - Favoritter - Sikkerhetskopi + Favorite + Favorites + Backup Data backup Bitwarden Authenticator data is backed up and can be restored with your regularly scheduled device backups. - Lær mer + Learn more Importing from 2FAS password protected files is not supported. Try again with an exported file that is not password protected. Importing Bitwarden CSV files is not supported. Try again with an exported JSON file. Download the Bitwarden app Store all of your logins and sync verification codes directly with the Authenticator app. - Last ned nå + Download now Sync with Bitwarden app + This feature is not yet available for self-hosted users. Learn more Unable to sync codes from the Bitwarden app. Make sure both apps are up-to-date. You can still access your existing codes in the Bitwarden app. %1$s | %2$s Sync with the Bitwarden app - Gå til innstillingene - Allow Authenticator app syncing in settings to view all of your verification codes here. - Noe gikk galt - Vennligst prøv igjen + Go to settings + In order to view all of your verification codes, you’ll need to allow for syncing on all of your accounts. + Take me to the app settings + Something went wrong + Please try again Move to Bitwarden Default save option - Lagre til Bitwarden - Lagre her - Ingen + Save to Bitwarden + Save here + None Select where you would like to save new verification codes. - Bekreft + Confirm Verification code created Save this authenticator key here, or add it to a login in your Bitwarden app. Save option as default @@ -151,5 +153,5 @@ "Required info is missing (e.g., ‘services’ or ‘secret’). Check your file and try again. Visit bitwarden.com/help for support" "File Could Not Be Processed" "File could not be processed. Ensure it’s valid JSON and try again. Need help? Visit bitwarden.com/help" - Få hjelp + Get Help diff --git a/authenticator/src/main/res/values-ar-rSA/strings.xml b/authenticator/src/main/res/values-ar-rSA/strings.xml index 591a26c995..274141880f 100644 --- a/authenticator/src/main/res/values-ar-rSA/strings.xml +++ b/authenticator/src/main/res/values-ar-rSA/strings.xml @@ -126,11 +126,13 @@ تخزين جميع تسجيلات الدخول الخاصة بك ومزامنة رموز التحقق مباشرة مع تطبيق المصادقة. تنزيل الآن المزامنة مع تطبيق Bitwarden + This feature is not yet available for self-hosted users. Learn more غير قادر على مزامنة الرموز من تطبيق Bitwarden. تأكد من تحديث كلا التطبيقين. لا يزال بإمكانك الوصول إلى الرموز الموجودة في تطبيق Bitwarden. %1$s | %2$s المزامنة مع تطبيق Bitwarden اذهب إلى الإعدادات السماح لمزامنة تطبيق المصادقة في الإعدادات لعرض جميع رموز التحقق الخاصة بك هنا. + خذني إلى إعدادات التطبيق حدث خطأ ما الرجاء المحاولة مرة أخرى نقل إلى Bitwarden diff --git a/authenticator/src/main/res/values-az-rAZ/strings.xml b/authenticator/src/main/res/values-az-rAZ/strings.xml index f0fe93c396..47e095fa67 100644 --- a/authenticator/src/main/res/values-az-rAZ/strings.xml +++ b/authenticator/src/main/res/values-az-rAZ/strings.xml @@ -126,11 +126,13 @@ Bütün girişlərinizi saxlayın və doğrulama kodlarını birbaşa Authenticator tətbiqi ilə sinxronlaşdırın. İndi endir Bitwarden tətbiqi ilə sinxronlaşdır + This feature is not yet available for self-hosted users. Learn more Kodlar, Bitwarden tətbiqindən sinxronlaşdırıla bilmir. Hər iki tətbiqin güncəl olduğuna əmin olun. Mövcud kodlarınıza Bitwarden tətbiqində müraciət etməyə davam edə bilərsiniz. %1$s | %2$s Bitwarden tətbiqi ilə sinxronlaşdır Ayarlara get Bütün doğrulama kodlarınıza burada baxmaq üçün ayarlarda Authenticator tətbiqinin sinxronlaşdırmasına icazə verin. + Məni tətbiq ayarlarına apar Nəsə səhv getdi Lütfən yenidən sınayın \"Bitwarden\"ə daşı diff --git a/authenticator/src/main/res/values-be-rBY/strings.xml b/authenticator/src/main/res/values-be-rBY/strings.xml index 7aa3ecb5e0..1a905a0e7e 100644 --- a/authenticator/src/main/res/values-be-rBY/strings.xml +++ b/authenticator/src/main/res/values-be-rBY/strings.xml @@ -126,11 +126,13 @@ Store all of your logins and sync verification codes directly with the Authenticator app. Download now Sync with Bitwarden app + This feature is not yet available for self-hosted users. Learn more Unable to sync codes from the Bitwarden app. Make sure both apps are up-to-date. You can still access your existing codes in the Bitwarden app. %1$s | %2$s Sync with the Bitwarden app Go to settings - Allow Authenticator app syncing in settings to view all of your verification codes here. + In order to view all of your verification codes, you’ll need to allow for syncing on all of your accounts. + Take me to the app settings Something went wrong Please try again Move to Bitwarden diff --git a/authenticator/src/main/res/values-bg-rBG/strings.xml b/authenticator/src/main/res/values-bg-rBG/strings.xml index d29b5d916c..6c2a1641d7 100644 --- a/authenticator/src/main/res/values-bg-rBG/strings.xml +++ b/authenticator/src/main/res/values-bg-rBG/strings.xml @@ -1,36 +1,36 @@ Authenticator - Weryfikacja biometryczna + Biometric verification Cancel - Dodaj element + Add item An error has occurred. We were unable to process your request. Please try again or contact us. Internet connection required Please connect to the internet before continuing. OK - Synchronizuję + Syncing Copy Edit Close Bitwarden Authenticator Name Add Item Rotation - Zeskanuj kod QR - Wprowadź klucz konfiguracyjny - Zeskanuj kod QR - Skieruj aparat w stronę kodu QR. - Nie można zeskanować kodu QR. + Scan a QR code + Enter a setup key + Scan QR code + Point your camera at the QR code. + Cannot scan QR code. Enter key manually - Nie możesz dodać klucza uwierzytelniającego? - Po poprawnym wprowadzeniu klucza\nwybierz Dodaj TOTP, aby bezpiecznie przechowywać klucz - Dodaj TOTP - Klucz uwierzytelniający - Nie, dziękuję + Cannot add authenticator key? + Once the key is successfully entered,\nselect Add TOTP to store the key safely + Add TOTP + Authenticator key + No thanks Settings - Włącz uprawnienia aparatu do korzystania ze skanera - Pusta lista elementów - Nie masz żadnych elementów do wyświetlenia. + Enable camera permission to use the scanner + Empty Item Listing + You don\'t have any items to display. Add a new code to secure your accounts. Add code Cannot read key. @@ -38,23 +38,23 @@ Username Refresh period Algorithm - Ukryj - Pokaż + Hide + Show Advanced - Zwiń opcje zaawansowane + Collapse advanced options Number of digits Save The %1$s field is required. - %d sekund - Zapisywanie - Element został zapisany - Informacje - Typ OTP + %d seconds + Saving + Item saved + Information + OTP type Verification codes There are no items that match the search - Powrót - Wyczyść - Szukaj kodów + Back + Clear + Search codes Options Try again Appearance @@ -65,91 +65,93 @@ Language The language has been changed to %1$s. Please restart the app to see the change Secure your accounts with Bitwarden Authenticator - Uzyskaj kody weryfikacyjne dla wszystkich swoich kont, które obsługują dwuetapową weryfikację. + Get verification codes for all your accounts that support 2-step verification. Use your device camera to scan codes Scan the QR code in your 2-step verification settings for any account. Sign in using unique codes - Gdy używasz dwuetapowej weryfikacji, wprowadzisz nazwę użytkownika, hasło oraz kod wygenerowany w tej aplikacji. + When using 2-step verification, you\'ll enter your username and password and a code generated in this app. Continue Skip Get started - Unikalne kody + Unique codes Help Launch tutorial %1$s copied - Usuń element + Delete item Item deleted Delete - Czy na pewno chcesz trwale usunąć? Tej operacji nie można cofnąć. + Do you really want to permanently delete? This cannot be undone. Data Export - Ładowanie - Potwierdź eksport - Plik zawiera dane sejfu w niezaszyfrowanym formacie. Nie powinieneś go przechowywać, ani przesyłać poprzez niezabezpieczone kanały (takie jak poczta e-mail). Skasuj go natychmiast po użyciu. + Loading + Confirm export + This export contains your 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. File format - Wystąpił problem z wyeksportowaniem sejfu. Jeśli problem nadal występuje, musisz wyeksportować dane z sejfu internetowego. - Dane wyeksportowane pomyślnie + There was a problem exporting your vault. If the problem persists, you\'ll need to export from the web vault. + Data exported successfully Unlock with %1$s - Biometria + Biometrics Security Use biometrics to unlock - Zbyt wiele nieudanych prób biometrycznych. + Too many failed biometrics attempts. About Version Continue Bitwarden Help Center - Kontynuować do Centrum Pomocy? - Dowiedz się więcej o tym, jak korzystać z uwierzytelniania Bitwarden w Centrum Pomocy. - Polityka prywatności + Continue to Help Center? + Learn more about how to use Bitwarden Authenticator on the Help Center. + Privacy policy Continue to privacy policy? - Sprawdź naszą politykę prywatności na bitwarden.com + Check out our privacy policy on bitwarden.com Key - Utwórz kod weryfikacyjny - Klucz jest wymagany. - Nazwa jest wymagana. - Prześlij dzienniki awarii - Podczas importowania sejfu wystąpił problem. - Źródło pliku + Create Verification code + Key is required. + Name is required. + Submit crash logs + There was a problem importing your vault. + File Source Import - Import sejfu zakończony powodzeniem - Klucz jest nieprawidłowy. - Zapisz jako ulubione + Vault import successful + Key is invalid. + Save as a favorite Favorite Favorites Backup - Kopia zapasowa danych + Data backup Bitwarden Authenticator data is backed up and can be restored with your regularly scheduled device backups. Learn more Importing from 2FAS password protected files is not supported. Try again with an exported file that is not password protected. - Importowanie plików CSV w Bitwarden nie jest obsługiwane. Spróbuj ponownie z eksportowanym plikiem JSON. + Importing Bitwarden CSV files is not supported. Try again with an exported JSON file. Download the Bitwarden app - Przechowuj wszystkie swoje logowania i synchronizuj kody weryfikacyjne bezpośrednio z aplikacją Authenticator. - Pobierz teraz - Synchronizacja z aplikacją Bitwarden - Nie można zsynchronizować kodów z aplikacji Bitwarden. Upewnij się, że obie aplikacje są aktualne. Nadal możesz uzyskać dostęp do istniejących kodów w aplikacji Bitwarden. + Store all of your logins and sync verification codes directly with the Authenticator app. + Download now + Sync with Bitwarden app + This feature is not yet available for self-hosted users. Learn more + Unable to sync codes from the Bitwarden app. Make sure both apps are up-to-date. You can still access your existing codes in the Bitwarden app. %1$s | %2$s Sync with the Bitwarden app - Przejdź do ustawień - Zezwalaj aplikacji Authenticator na synchronizację w ustawieniach aby wyświetlić tutaj wszystkie Twoje kody weryfikacyjne. - Coś poszło nie tak - Proszę spróbować ponownie. - Przenieś do Bitwarden - Domyślna opcja zapisu - Zapisz w Bitwarden - Zapisz tutaj - Żaden - Wybierz, gdzie chcesz zapisać nowe kody weryfikacyjne. - Potwierdź - Kod weryfikacyjny został utworzony - Zapisz ten klucz uwierzytelniający tutaj lub dodaj go do logowania w aplikacji Bitwarden. - Zapisz opcję jako domyślną - Konto zsynchronizowane z aplikacji Bitwarden - Dodaj kod do Bitwarden - Dodaj kod lokalnie - Kody lokalne + Go to settings + In order to view all of your verification codes, you’ll need to allow for syncing on all of your accounts. + Take me to the app settings + Something went wrong + Please try again + Move to Bitwarden + Default save option + Save to Bitwarden + Save here + None + Select where you would like to save new verification codes. + Confirm + Verification code created + Save this authenticator key here, or add it to a login in your Bitwarden app. + Save option as default + Account synced from Bitwarden app + Add code to Bitwarden + Add code locally + Local codes Required Information Missing - "Brakuje wymaganych informacji (np. ‘services’ lub ‘secret’). Sprawdź swój plik i spróbuj ponownie. Odwiedź bitwarden.com/help by uzyskać pomoc" - "Plik nie może zostać przetworzony" - "Plik nie może być przetworzony. Upewnij się, że plik JSON jest prawidłowy i spróbuj ponownie. Potrzebujesz pomocy? Odwiedź bitwarden.com/help" - Uzyskaj pomoc + "Required info is missing (e.g., ‘services’ or ‘secret’). Check your file and try again. Visit bitwarden.com/help for support" + "File Could Not Be Processed" + "File could not be processed. Ensure it’s valid JSON and try again. Need help? Visit bitwarden.com/help" + Get Help diff --git a/authenticator/src/main/res/values-bn-rBD/strings.xml b/authenticator/src/main/res/values-bn-rBD/strings.xml index 6fd006df80..7ae35cebc6 100644 --- a/authenticator/src/main/res/values-bn-rBD/strings.xml +++ b/authenticator/src/main/res/values-bn-rBD/strings.xml @@ -126,11 +126,13 @@ Store all of your logins and sync verification codes directly with the Authenticator app. Download now Sync with Bitwarden app + This feature is not yet available for self-hosted users. Learn more Unable to sync codes from the Bitwarden app. Make sure both apps are up-to-date. You can still access your existing codes in the Bitwarden app. %1$s | %2$s Sync with the Bitwarden app Go to settings - Allow Authenticator app syncing in settings to view all of your verification codes here. + In order to view all of your verification codes, you’ll need to allow for syncing on all of your accounts. + Take me to the app settings Something went wrong Please try again Move to Bitwarden diff --git a/authenticator/src/main/res/values-bs-rBA/strings.xml b/authenticator/src/main/res/values-bs-rBA/strings.xml index 75c2c3c63a..6c2a1641d7 100644 --- a/authenticator/src/main/res/values-bs-rBA/strings.xml +++ b/authenticator/src/main/res/values-bs-rBA/strings.xml @@ -126,11 +126,13 @@ Store all of your logins and sync verification codes directly with the Authenticator app. Download now Sync with Bitwarden app + This feature is not yet available for self-hosted users. Learn more Unable to sync codes from the Bitwarden app. Make sure both apps are up-to-date. You can still access your existing codes in the Bitwarden app. %1$s | %2$s Sync with the Bitwarden app Go to settings - Allow Authenticator app syncing in settings to view all of your verification codes here. + In order to view all of your verification codes, you’ll need to allow for syncing on all of your accounts. + Take me to the app settings Something went wrong Please try again Move to Bitwarden diff --git a/authenticator/src/main/res/values-ca-rES/strings.xml b/authenticator/src/main/res/values-ca-rES/strings.xml index 096d054dce..ad726de9d1 100644 --- a/authenticator/src/main/res/values-ca-rES/strings.xml +++ b/authenticator/src/main/res/values-ca-rES/strings.xml @@ -126,11 +126,13 @@ Store all of your logins and sync verification codes directly with the Authenticator app. Descarregueu ara Sync with Bitwarden app + This feature is not yet available for self-hosted users. Learn more Unable to sync codes from the Bitwarden app. Make sure both apps are up-to-date. You can still access your existing codes in the Bitwarden app. %1$s | %2$s Sync with the Bitwarden app Vés a la configuració - Allow Authenticator app syncing in settings to view all of your verification codes here. + In order to view all of your verification codes, you’ll need to allow for syncing on all of your accounts. + Take me to the app settings Alguna cosa no ha anat bé Torna-ho a provar Move to Bitwarden diff --git a/authenticator/src/main/res/values-cs-rCZ/strings.xml b/authenticator/src/main/res/values-cs-rCZ/strings.xml index 3e406b3b3e..92742fab3c 100644 --- a/authenticator/src/main/res/values-cs-rCZ/strings.xml +++ b/authenticator/src/main/res/values-cs-rCZ/strings.xml @@ -126,11 +126,13 @@ Uložte všechny Vaše přihlašovací údaje a synchronizujte ověřovací kódy přímo s ověřovací aplikací. Stáhnout nyní Synchronizovat s aplikací Bitwarden + Tato funkce zatím není dostupná pro vlastní hostované uživatele. Další informace Nelze synchronizovat kódy z aplikace Bitwarden. Zkontrolujte, zda jsou obě aplikace aktuální. Ke stávajícím kódům máte stále přístup v aplikaci Bitwarden. %1$s | %2$s Synchronizovat s aplikací Bitwarden Přejít do nastavení - V nastavení povolte synchronizaci aplikace Authenticator a zobrazte zde všechny své ověřovací kódy. + Pokud chcete zobrazit všechny ověřovací kódy, budete muset povolit synchronizaci na všech Vašich účtech. + Přejít do nastavení aplikace Něco se pokazilo Zkuste to znovu Přesunout do Bitwardenu diff --git a/authenticator/src/main/res/values-cy-rGB/strings.xml b/authenticator/src/main/res/values-cy-rGB/strings.xml index 75c2c3c63a..6c2a1641d7 100644 --- a/authenticator/src/main/res/values-cy-rGB/strings.xml +++ b/authenticator/src/main/res/values-cy-rGB/strings.xml @@ -126,11 +126,13 @@ Store all of your logins and sync verification codes directly with the Authenticator app. Download now Sync with Bitwarden app + This feature is not yet available for self-hosted users. Learn more Unable to sync codes from the Bitwarden app. Make sure both apps are up-to-date. You can still access your existing codes in the Bitwarden app. %1$s | %2$s Sync with the Bitwarden app Go to settings - Allow Authenticator app syncing in settings to view all of your verification codes here. + In order to view all of your verification codes, you’ll need to allow for syncing on all of your accounts. + Take me to the app settings Something went wrong Please try again Move to Bitwarden diff --git a/authenticator/src/main/res/values-da-rDK/strings.xml b/authenticator/src/main/res/values-da-rDK/strings.xml index a3bcc0f727..8078b8c267 100644 --- a/authenticator/src/main/res/values-da-rDK/strings.xml +++ b/authenticator/src/main/res/values-da-rDK/strings.xml @@ -126,11 +126,13 @@ Gem alle logins og synk bekræftelseskoder direkte med Authenticator-appen. Download nu Synk med Bitwarden-appen + This feature is not yet available for self-hosted users. Learn more Kan ikke synke koder fra Bitwarden-appen. Sørg for, at begge apps er opdaterede. Eksisterende koder kan stadig tilgås i Bitwarden-appen. %1$s | %2$s Synk med Bitwarden-appen Gå til Indstillinger Tillad Authenticator-app synkning i Indstillinger for at se alle bekræftelseskoderne her. + Gå til til app-indstillingerne Noget gik galt Forsøg igen Move to Bitwarden diff --git a/authenticator/src/main/res/values-de-rDE/strings.xml b/authenticator/src/main/res/values-de-rDE/strings.xml index 10a14814a5..388ccef60f 100644 --- a/authenticator/src/main/res/values-de-rDE/strings.xml +++ b/authenticator/src/main/res/values-de-rDE/strings.xml @@ -126,11 +126,13 @@ Speicher alle deine Zugangsdaten und synchronisiere Verifizierungscodes direkt mit der Authenticator-App. Jetzt herunterladen Mit der Bitwarden-App synchronisieren + Diese Funktion ist für selbst gehostete Benutzer noch nicht verfügbar. Erfahre mehr Codes aus der Bitwarden-App konnten nicht synchronisiert werden. Stelle sicher, dass beide Apps auf dem neusten Stand sind. Du kannst weiterhin auf deine existierenden Codes in der Bitwarden-App zugreifen. %1$s | %2$s Mit der Bitwarden-App synchronisieren Gehe zu den Einstellungen Lasse die Authenticator-App-Synchronisierung in den Einstellungen zu, um hier alle deine Verifizierungscodes anzuzeigen. + Bring mich zu den App-Einstellungen Etwas ist schiefgelaufen Bitte versuche es erneut Zu Bitwarden verschieben diff --git a/authenticator/src/main/res/values-el-rGR/strings.xml b/authenticator/src/main/res/values-el-rGR/strings.xml index d93ebc432c..91f5289cc1 100644 --- a/authenticator/src/main/res/values-el-rGR/strings.xml +++ b/authenticator/src/main/res/values-el-rGR/strings.xml @@ -126,11 +126,13 @@ Αποθηκεύστε όλες τις συνδέσεις σας και συγχρονίστε απευθείας τους κωδικούς επαλήθευσης με το Authenticator. Λήψη τώρα Συγχρονισμός με την εφαρμογή Bitwarden + This feature is not yet available for self-hosted users. Learn more Δεν είναι δυνατός ο συγχρονισμός κωδικών από το Bitwarden. Βεβαιωθείτε ότι έχουν ενημερωθεί και οι δύο εφαρμογές. Μπορείτε ακόμα να αποκτήσετε πρόσβαση στους υπάρχοντες κωδικούς σας στο Bitwarden. %1$s | %2$s Συγχρονισμός με την εφαρμογή Bitwarden Μετάβαση στις ρυθμίσεις Επιτρέψτε τον συγχρονισμό του Authenticator στις ρυθμίσεις για να βλέπετε όλους τους κωδικούς επαλήθευσής σας εδώ. + Μετάβαση στις ρυθμίσεις της εφαρμογής Κάτι πήγε στραβά Δοκιμάστε ξανά Move to Bitwarden diff --git a/authenticator/src/main/res/values-en-rGB/strings.xml b/authenticator/src/main/res/values-en-rGB/strings.xml index ff35fd2e47..99ec704d8c 100644 --- a/authenticator/src/main/res/values-en-rGB/strings.xml +++ b/authenticator/src/main/res/values-en-rGB/strings.xml @@ -126,11 +126,13 @@ Store all of your logins and sync verification codes directly with the Authenticator app. Download now Sync with Bitwarden app + This feature is not yet available for self-hosted users. Learn more Unable to sync codes from the Bitwarden app. Make sure both apps are up-to-date. You can still access your existing codes in the Bitwarden app. %1$s | %2$s Sync with the Bitwarden app Go to settings Allow Authenticator app syncing in settings to view all of your verification codes here. + Take me to the app settings Something went wrong Please try again Move to Bitwarden diff --git a/authenticator/src/main/res/values-en-rIN/strings.xml b/authenticator/src/main/res/values-en-rIN/strings.xml index ff35fd2e47..99ec704d8c 100644 --- a/authenticator/src/main/res/values-en-rIN/strings.xml +++ b/authenticator/src/main/res/values-en-rIN/strings.xml @@ -126,11 +126,13 @@ Store all of your logins and sync verification codes directly with the Authenticator app. Download now Sync with Bitwarden app + This feature is not yet available for self-hosted users. Learn more Unable to sync codes from the Bitwarden app. Make sure both apps are up-to-date. You can still access your existing codes in the Bitwarden app. %1$s | %2$s Sync with the Bitwarden app Go to settings Allow Authenticator app syncing in settings to view all of your verification codes here. + Take me to the app settings Something went wrong Please try again Move to Bitwarden diff --git a/authenticator/src/main/res/values-es-rES/strings.xml b/authenticator/src/main/res/values-es-rES/strings.xml index 6fe4a57b25..bed12c4ff8 100644 --- a/authenticator/src/main/res/values-es-rES/strings.xml +++ b/authenticator/src/main/res/values-es-rES/strings.xml @@ -22,7 +22,7 @@ Apunta tu cámara al código QR. No puede escanear el código QR. Introducir clave manualmente. - Cannot add authenticator key? + ¿No se puede agregar la clave del autenticador? Una vez que la clave se ha sido introducida correctamente,\nselecciona \"Añadir TOTP\" para almacenar la clave de forma segura Añadir TOTP Clave de autenticador @@ -123,33 +123,35 @@ No se admite la importación desde archivos protegidos con contraseña 2FAS. Inténtalo de nuevo con un archivo exportado que no esté protegido con contraseña. No se admite la importación de archivos CSV de Bitwarden. Inténtalo de nuevo con un archivo JSON exportado. Descarga la aplicación Bitwarden - Store all of your logins and sync verification codes directly with the Authenticator app. + Almacena todos tus inicios de sesión y sincroniza los códigos de verificación directamente con la aplicación Authenticator. Descargar ahora Sincronizar con la aplicación Bitwarden - Unable to sync codes from the Bitwarden app. Make sure both apps are up-to-date. You can still access your existing codes in the Bitwarden app. + This feature is not yet available for self-hosted users. Learn more + No se pueden sincronizar los códigos desde la aplicación de Bitwarden. Asegúrate de que ambas aplicaciones estén actualizadas. Aún puedes acceder a tus códigos existentes en la aplicación de Bitwarden. %1$s | %2$s Sincronizar con la aplicación Bitwarden Ir a los ajustes - Allow Authenticator app syncing in settings to view all of your verification codes here. - Something went wrong + Permite la sincronización de la aplicación Authenticator en la configuración para ver todos tus códigos de verificación aquí. + Llévame a la configuración de la aplicación + Algo salió mal Por favor, reinténtalo - Move to Bitwarden + Mover a Bitwarden Ajuste de guardado por defecto Guardar en Bitwarden Guardar aquí Ninguno - Select where you would like to save new verification codes. + Selecciona dónde te gustaría guardar los nuevos códigos de verificación. Confirmar - Verification code created - Save this authenticator key here, or add it to a login in your Bitwarden app. + Código de verificación creado + Guarda esta clave de autenticador aquí o agrégala a un inicio de sesión en tu aplicación de Bitwarden. Guardar opción por defecto - Account synced from Bitwarden app - Add code to Bitwarden - Add code locally - Local codes - Required Information Missing - "Required info is missing (e.g., ‘services’ or ‘secret’). Check your file and try again. Visit bitwarden.com/help for support" - "File Could Not Be Processed" - "File could not be processed. Ensure it’s valid JSON and try again. Need help? Visit bitwarden.com/help" - Get Help + Cuenta sincronizada desde la aplicación de Bitwarden + Añadir código en Bitwarden + Añadir código localmente + Códigos locales + Información requerida faltante + "Falta información requerida (por ejemplo, 'servicios' o 'secreto'). Revisa tu archivo e inténtalo de nuevo. Visita bitwarden.com/help para obtener soporte" + "No se pudo procesar el archivo" + "No se pudo procesar el archivo. Asegúrate de que sea un JSON válido e inténtalo de nuevo. ¿Necesitas ayuda? Visita bitwarden.com/help" + Obtener ayuda diff --git a/authenticator/src/main/res/values-et-rEE/strings.xml b/authenticator/src/main/res/values-et-rEE/strings.xml index 75c2c3c63a..c35ae5ce24 100644 --- a/authenticator/src/main/res/values-et-rEE/strings.xml +++ b/authenticator/src/main/res/values-et-rEE/strings.xml @@ -1,36 +1,36 @@ - Authenticator - Biometric verification + Autentikaator + Biomeetriline tuvastamine Cancel - Add item + Lisa kirje An error has occurred. We were unable to process your request. Please try again or contact us. Internet connection required Please connect to the internet before continuing. OK - Syncing + Sünkroonimine Copy Edit Close Bitwarden Authenticator Name Add Item Rotation - Scan a QR code + Skanneeri QR-koodi Enter a setup key - Scan QR code - Point your camera at the QR code. - Cannot scan QR code. + Skanneeri QR-koodi + Suuna telefoni kaamera QR koodile. + Ei suuda QR koodi skaneerida. Enter key manually - Cannot add authenticator key? - Once the key is successfully entered,\nselect Add TOTP to store the key safely - Add TOTP - Authenticator key - No thanks + Ei suuda autentimise võtit lisada? + Pärast võtme edukat sisestamist vajuta\n\"Lisa TOTP\", et see võti turvaliselt talletada + Lisa TOTP + Autentimise võti + Ei aitäh Settings - Enable camera permission to use the scanner + Skänneri kasutamiseks luba ligipääs kaamerale Empty Item Listing - You don\'t have any items to display. + Sul ei ole ühtegi kirjet. Add a new code to secure your accounts. Add code Cannot read key. @@ -38,23 +38,23 @@ Username Refresh period Algorithm - Hide - Show + Peida + Näita Advanced - Collapse advanced options + Peida seaded edasijõudnutele Number of digits Save The %1$s field is required. - %d seconds - Saving - Item saved - Information - OTP type + %d sekundit + Salvestan + Kirje salvestatud + Teave + OTP tüüp Verification codes There are no items that match the search - Back - Clear - Search codes + Tagasi + Tühjenda + Otsi koode Options Try again Appearance @@ -65,72 +65,74 @@ Language The language has been changed to %1$s. Please restart the app to see the change Secure your accounts with Bitwarden Authenticator - Get verification codes for all your accounts that support 2-step verification. + Hangi kinnitamiskoodid kõikidele sinu kontodele, mis toetavad 2-astmelist kinnitamist. Use your device camera to scan codes Scan the QR code in your 2-step verification settings for any account. Sign in using unique codes - When using 2-step verification, you\'ll enter your username and password and a code generated in this app. + Kui sa kasutad 2-astmelist kinnitamist, sisestad sa oma kasutajanime, parooli ja selle rakenduse genereeritud koodi. Continue Skip Get started - Unique codes + Ainulaadsed koodid Help Launch tutorial %1$s copied - Delete item + Kustuta kirje Item deleted Delete - Do you really want to permanently delete? This cannot be undone. + Oled sa kindel, et soovid jäädavalt kustudada? Seda ei saa tagasi võtta. Data Export - Loading - Confirm export - This export contains your 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. + Laen + Kinnita eksportimine + Eksporditav fail sisaldab sinu andmed, mis on krüpteerimata. Seda faili ei tohiks ebaturvaliselt hoiustada või saata ebaturvaliste kanalite kaudu (näiteks e-postiga). Kustuta see kohe peale kasutamist. File format - There was a problem exporting your vault. If the problem persists, you\'ll need to export from the web vault. - Data exported successfully + Hoidla eksportimisel ilmnes tõrge. Probleemi jätkumisel teosta eksportimine veebihoidla kaudu. + Andmed edukalt eksporditud Unlock with %1$s - Biometrics + Biomeetria Security Use biometrics to unlock - Too many failed biometrics attempts. + Liiga palju ebaõnnestunud biomeetriaga katseid. About Version Continue Bitwarden Help Center - Continue to Help Center? - Learn more about how to use Bitwarden Authenticator on the Help Center. - Privacy policy + Kas soovid avada Abikeskuse? + Uuri teisigi Bitwardeni kasutusvõimalusi Abikeskuses. + Privaatsuspoliitika Continue to privacy policy? - Check out our privacy policy on bitwarden.com + Vaadake meie privaatsuspoliitikat veebilehel bitwarden.com Key - Create Verification code - Key is required. - Name is required. - Submit crash logs - There was a problem importing your vault. - File Source + Loo kinnituskood + Võti on nõutud. + Nimi on kohustuslik. + Teavita programmi tõrgetest + Hoidla importimine ebaõnnestus. + Faili allikas Import - Vault import successful - Key is invalid. - Save as a favorite + Hoidla edukalt imporditud + Võti on kehtimatu. + Salvesta lemmikuna Favorite Favorites Backup - Data backup + Andmete varundamine Bitwarden Authenticator data is backed up and can be restored with your regularly scheduled device backups. Learn more Importing from 2FAS password protected files is not supported. Try again with an exported file that is not password protected. - Importing Bitwarden CSV files is not supported. Try again with an exported JSON file. + Bitwardeni CSV failide importimine ei ole toetatud. Proovi uuesti eksporditud JSON failiga. Download the Bitwarden app Store all of your logins and sync verification codes directly with the Authenticator app. - Download now - Sync with Bitwarden app + Laadi kohe alla + Sünkroniseeri Bitwardeni rakendusega + This feature is not yet available for self-hosted users. Learn more Unable to sync codes from the Bitwarden app. Make sure both apps are up-to-date. You can still access your existing codes in the Bitwarden app. %1$s | %2$s Sync with the Bitwarden app Go to settings - Allow Authenticator app syncing in settings to view all of your verification codes here. + In order to view all of your verification codes, you’ll need to allow for syncing on all of your accounts. + Take me to the app settings Something went wrong Please try again Move to Bitwarden diff --git a/authenticator/src/main/res/values-eu-rES/strings.xml b/authenticator/src/main/res/values-eu-rES/strings.xml index 75c2c3c63a..6c2a1641d7 100644 --- a/authenticator/src/main/res/values-eu-rES/strings.xml +++ b/authenticator/src/main/res/values-eu-rES/strings.xml @@ -126,11 +126,13 @@ Store all of your logins and sync verification codes directly with the Authenticator app. Download now Sync with Bitwarden app + This feature is not yet available for self-hosted users. Learn more Unable to sync codes from the Bitwarden app. Make sure both apps are up-to-date. You can still access your existing codes in the Bitwarden app. %1$s | %2$s Sync with the Bitwarden app Go to settings - Allow Authenticator app syncing in settings to view all of your verification codes here. + In order to view all of your verification codes, you’ll need to allow for syncing on all of your accounts. + Take me to the app settings Something went wrong Please try again Move to Bitwarden diff --git a/authenticator/src/main/res/values-fa-rIR/strings.xml b/authenticator/src/main/res/values-fa-rIR/strings.xml index 75c2c3c63a..6c2a1641d7 100644 --- a/authenticator/src/main/res/values-fa-rIR/strings.xml +++ b/authenticator/src/main/res/values-fa-rIR/strings.xml @@ -126,11 +126,13 @@ Store all of your logins and sync verification codes directly with the Authenticator app. Download now Sync with Bitwarden app + This feature is not yet available for self-hosted users. Learn more Unable to sync codes from the Bitwarden app. Make sure both apps are up-to-date. You can still access your existing codes in the Bitwarden app. %1$s | %2$s Sync with the Bitwarden app Go to settings - Allow Authenticator app syncing in settings to view all of your verification codes here. + In order to view all of your verification codes, you’ll need to allow for syncing on all of your accounts. + Take me to the app settings Something went wrong Please try again Move to Bitwarden diff --git a/authenticator/src/main/res/values-fi-rFI/strings.xml b/authenticator/src/main/res/values-fi-rFI/strings.xml index 75c2c3c63a..c0a5b473ce 100644 --- a/authenticator/src/main/res/values-fi-rFI/strings.xml +++ b/authenticator/src/main/res/values-fi-rFI/strings.xml @@ -2,19 +2,19 @@ Authenticator Biometric verification - Cancel + Peruuta Add item - An error has occurred. + Tapahtui virhe. We were unable to process your request. Please try again or contact us. - Internet connection required - Please connect to the internet before continuing. + Verkkoyhteys vaaditaan + Jatka muodostamalla verkkoyhteys. OK Syncing - Copy - Edit - Close + Kopioi + Muokkaa + Suljex Bitwarden Authenticator - Name + Nimi Add Item Rotation Scan a QR code Enter a setup key @@ -27,7 +27,7 @@ Add TOTP Authenticator key No thanks - Settings + Asetukset Enable camera permission to use the scanner Empty Item Listing You don\'t have any items to display. @@ -35,7 +35,7 @@ Add code Cannot read key. Verification code added - Username + Käyttäjätunnus Refresh period Algorithm Hide @@ -43,7 +43,7 @@ Advanced Collapse advanced options Number of digits - Save + Tallenna The %1$s field is required. %d seconds Saving @@ -70,7 +70,7 @@ Scan the QR code in your 2-step verification settings for any account. Sign in using unique codes When using 2-step verification, you\'ll enter your username and password and a code generated in this app. - Continue + Jatka Skip Get started Unique codes @@ -78,8 +78,8 @@ Launch tutorial %1$s copied Delete item - Item deleted - Delete + Kohde poistettiin + Poista Do you really want to permanently delete? This cannot be undone. Data Export @@ -94,9 +94,9 @@ Security Use biometrics to unlock Too many failed biometrics attempts. - About - Version - Continue + Tietoja + Versio + Jatka Bitwarden Help Center Continue to Help Center? Learn more about how to use Bitwarden Authenticator on the Help Center. @@ -114,8 +114,8 @@ Vault import successful Key is invalid. Save as a favorite - Favorite - Favorites + Suosikki + Suosikit Backup Data backup Bitwarden Authenticator data is backed up and can be restored with your regularly scheduled device backups. @@ -126,11 +126,13 @@ Store all of your logins and sync verification codes directly with the Authenticator app. Download now Sync with Bitwarden app + This feature is not yet available for self-hosted users. Learn more Unable to sync codes from the Bitwarden app. Make sure both apps are up-to-date. You can still access your existing codes in the Bitwarden app. %1$s | %2$s Sync with the Bitwarden app Go to settings - Allow Authenticator app syncing in settings to view all of your verification codes here. + In order to view all of your verification codes, you’ll need to allow for syncing on all of your accounts. + Take me to the app settings Something went wrong Please try again Move to Bitwarden diff --git a/authenticator/src/main/res/values-fil-rPH/strings.xml b/authenticator/src/main/res/values-fil-rPH/strings.xml index 75c2c3c63a..6c2a1641d7 100644 --- a/authenticator/src/main/res/values-fil-rPH/strings.xml +++ b/authenticator/src/main/res/values-fil-rPH/strings.xml @@ -126,11 +126,13 @@ Store all of your logins and sync verification codes directly with the Authenticator app. Download now Sync with Bitwarden app + This feature is not yet available for self-hosted users. Learn more Unable to sync codes from the Bitwarden app. Make sure both apps are up-to-date. You can still access your existing codes in the Bitwarden app. %1$s | %2$s Sync with the Bitwarden app Go to settings - Allow Authenticator app syncing in settings to view all of your verification codes here. + In order to view all of your verification codes, you’ll need to allow for syncing on all of your accounts. + Take me to the app settings Something went wrong Please try again Move to Bitwarden diff --git a/authenticator/src/main/res/values-fr-rFR/strings.xml b/authenticator/src/main/res/values-fr-rFR/strings.xml index 75c2c3c63a..590118e6a2 100644 --- a/authenticator/src/main/res/values-fr-rFR/strings.xml +++ b/authenticator/src/main/res/values-fr-rFR/strings.xml @@ -2,32 +2,32 @@ Authenticator Biometric verification - Cancel + Annuler Add item - An error has occurred. - We were unable to process your request. Please try again or contact us. - Internet connection required - Please connect to the internet before continuing. + Une erreur s\'est produite. + Nous n\'avons pas pu traiter votre requête. Veuillez réessayer ou nous contacter. + Connexion internet requise + Veuillez vous connecter à internet avant de continuer. OK Syncing - Copy - Edit - Close + Copier + Modifier + Fermer Bitwarden Authenticator - Name + Nom Add Item Rotation Scan a QR code Enter a setup key Scan QR code Point your camera at the QR code. Cannot scan QR code. - Enter key manually + Saisir la clé manuellement Cannot add authenticator key? Once the key is successfully entered,\nselect Add TOTP to store the key safely Add TOTP Authenticator key No thanks - Settings + Paramètres Enable camera permission to use the scanner Empty Item Listing You don\'t have any items to display. @@ -35,7 +35,7 @@ Add code Cannot read key. Verification code added - Username + Nom d\'utilisateur Refresh period Algorithm Hide @@ -43,43 +43,43 @@ Advanced Collapse advanced options Number of digits - Save - The %1$s field is required. + Sauvegarder + Le champ %1$s est requis. %d seconds Saving Item saved Information OTP type - Verification codes - There are no items that match the search + Codes de vérification + Aucun élément ne correspond à la recherche Back Clear Search codes Options Try again - Appearance - Default (System) - Theme - Dark - Light - Language - The language has been changed to %1$s. Please restart the app to see the change + Apparence + Par défaut (Système) + Thème + Sombre + Clair + Langue + La langue a été changée en %1$s. Veuillez redémarrer l\'application pour voir le changement Secure your accounts with Bitwarden Authenticator Get verification codes for all your accounts that support 2-step verification. Use your device camera to scan codes Scan the QR code in your 2-step verification settings for any account. Sign in using unique codes When using 2-step verification, you\'ll enter your username and password and a code generated in this app. - Continue + Continuer Skip Get started Unique codes Help Launch tutorial - %1$s copied + %1$s copié Delete item - Item deleted - Delete + Élément supprimé + Supprimer Do you really want to permanently delete? This cannot be undone. Data Export @@ -89,19 +89,19 @@ File format There was a problem exporting your vault. If the problem persists, you\'ll need to export from the web vault. Data exported successfully - Unlock with %1$s + Déverrouiller avec %1$s Biometrics - Security - Use biometrics to unlock + Sécurité + Utiliser la biométrie pour déverrouiller Too many failed biometrics attempts. - About + À propos Version - Continue - Bitwarden Help Center + Continuer + Centre d\'aide Bitwarden Continue to Help Center? Learn more about how to use Bitwarden Authenticator on the Help Center. Privacy policy - Continue to privacy policy? + Poursuivre vers la politique de confidentialité ? Check out our privacy policy on bitwarden.com Key Create Verification code @@ -115,22 +115,24 @@ Key is invalid. Save as a favorite Favorite - Favorites + Favoris Backup Data backup Bitwarden Authenticator data is backed up and can be restored with your regularly scheduled device backups. - Learn more + En savoir plus Importing from 2FAS password protected files is not supported. Try again with an exported file that is not password protected. Importing Bitwarden CSV files is not supported. Try again with an exported JSON file. Download the Bitwarden app Store all of your logins and sync verification codes directly with the Authenticator app. Download now Sync with Bitwarden app + This feature is not yet available for self-hosted users. Learn more Unable to sync codes from the Bitwarden app. Make sure both apps are up-to-date. You can still access your existing codes in the Bitwarden app. %1$s | %2$s Sync with the Bitwarden app Go to settings - Allow Authenticator app syncing in settings to view all of your verification codes here. + In order to view all of your verification codes, you’ll need to allow for syncing on all of your accounts. + Take me to the app settings Something went wrong Please try again Move to Bitwarden diff --git a/authenticator/src/main/res/values-gl-rES/strings.xml b/authenticator/src/main/res/values-gl-rES/strings.xml index bbc2ff0e10..49dd2ac073 100644 --- a/authenticator/src/main/res/values-gl-rES/strings.xml +++ b/authenticator/src/main/res/values-gl-rES/strings.xml @@ -126,11 +126,13 @@ Store all of your logins and sync verification codes directly with the Authenticator app. Download now Sync with Bitwarden app + This feature is not yet available for self-hosted users. Learn more Unable to sync codes from the Bitwarden app. Make sure both apps are up-to-date. You can still access your existing codes in the Bitwarden app. %1$s | %2$s Sync with the Bitwarden app Go to settings - Allow Authenticator app syncing in settings to view all of your verification codes here. + In order to view all of your verification codes, you’ll need to allow for syncing on all of your accounts. + Take me to the app settings Something went wrong Please try again Move to Bitwarden diff --git a/authenticator/src/main/res/values-hi-rIN/strings.xml b/authenticator/src/main/res/values-hi-rIN/strings.xml index 75c2c3c63a..6c2a1641d7 100644 --- a/authenticator/src/main/res/values-hi-rIN/strings.xml +++ b/authenticator/src/main/res/values-hi-rIN/strings.xml @@ -126,11 +126,13 @@ Store all of your logins and sync verification codes directly with the Authenticator app. Download now Sync with Bitwarden app + This feature is not yet available for self-hosted users. Learn more Unable to sync codes from the Bitwarden app. Make sure both apps are up-to-date. You can still access your existing codes in the Bitwarden app. %1$s | %2$s Sync with the Bitwarden app Go to settings - Allow Authenticator app syncing in settings to view all of your verification codes here. + In order to view all of your verification codes, you’ll need to allow for syncing on all of your accounts. + Take me to the app settings Something went wrong Please try again Move to Bitwarden diff --git a/authenticator/src/main/res/values-hr-rHR/strings.xml b/authenticator/src/main/res/values-hr-rHR/strings.xml index c3f8c1e5be..c8d6b9629b 100644 --- a/authenticator/src/main/res/values-hr-rHR/strings.xml +++ b/authenticator/src/main/res/values-hr-rHR/strings.xml @@ -22,10 +22,10 @@ Usmjeri kameru na QR kôd. Nije moguće očitati QR kôd. Ručno unesi ključ. - Nije moguće dodati ključ za provjeru autentičnosti? + Nije moguće dodati ključ autentifikatora? Jednom kada je ključ uspješno unesen,\nodaberi „Dodaj TOTP” za sigurno spremanje ključa Dodaj TOTP - Ključ za provjeru autentičnosti + Ključ autentifikatora Ne hvala Postavke Za skeniranje, odobri korištenje kamere @@ -126,11 +126,13 @@ Pohrani sve svoje prijave i sinkroniziraj kôdove za provjeru izravno s aplikacijom Autentifikator. Preuzmi sada Sinkroniziraj s Bitwarden aplikacijom + This feature is not yet available for self-hosted users. Learn more Nije moguće sinkronizirati kodove iz aplikacije Bitwarden. Provjeri jesu li obje aplikacije ažurirane. I dalje možeš pristupiti svojim postojećim kodovima u aplikaciji Bitwarden. %1$s od %2$s Sinkroniziraj s Bitwardenom Idi na Postavke Dopusti sinkronizaciju aplikacije Autentifikator u postavkama kako bi ovdje mogli vidjeti sve svoje kodove za provjeru. + U postavke aplikacije Dogodila se greška Molimo pokušaj ponovo Premjesti u Bitwarden @@ -141,7 +143,7 @@ Odaberi gdje želiš spremiti nove kodove. Potvrdi Kôd za provjeru stvoren - Spremi ovaj autentifikatorski ključ ovdje ili ga dodaj prijavi u Bitwarden aplikaciji. + Ovdje spremi autentifikatorski ključ ili ga dodaj prijavi u Bitwarden aplikaciji. Spremi opciju kao zadanu Račun sinkroniziran iz aplikacije Bitwarden Dodaj kod u Bitwardn diff --git a/authenticator/src/main/res/values-hu-rHU/strings.xml b/authenticator/src/main/res/values-hu-rHU/strings.xml index 75c2c3c63a..6c2a1641d7 100644 --- a/authenticator/src/main/res/values-hu-rHU/strings.xml +++ b/authenticator/src/main/res/values-hu-rHU/strings.xml @@ -126,11 +126,13 @@ Store all of your logins and sync verification codes directly with the Authenticator app. Download now Sync with Bitwarden app + This feature is not yet available for self-hosted users. Learn more Unable to sync codes from the Bitwarden app. Make sure both apps are up-to-date. You can still access your existing codes in the Bitwarden app. %1$s | %2$s Sync with the Bitwarden app Go to settings - Allow Authenticator app syncing in settings to view all of your verification codes here. + In order to view all of your verification codes, you’ll need to allow for syncing on all of your accounts. + Take me to the app settings Something went wrong Please try again Move to Bitwarden diff --git a/authenticator/src/main/res/values-in-rID/strings.xml b/authenticator/src/main/res/values-in-rID/strings.xml index f810b9cd9b..66d6cd20f1 100644 --- a/authenticator/src/main/res/values-in-rID/strings.xml +++ b/authenticator/src/main/res/values-in-rID/strings.xml @@ -126,11 +126,13 @@ Store all of your logins and sync verification codes directly with the Authenticator app. Download now Sync with Bitwarden app + This feature is not yet available for self-hosted users. Learn more Unable to sync codes from the Bitwarden app. Make sure both apps are up-to-date. You can still access your existing codes in the Bitwarden app. %1$s | %2$s Sync with the Bitwarden app Go to settings - Allow Authenticator app syncing in settings to view all of your verification codes here. + In order to view all of your verification codes, you’ll need to allow for syncing on all of your accounts. + Take me to the app settings Something went wrong Please try again Move to Bitwarden diff --git a/authenticator/src/main/res/values-it-rIT/strings.xml b/authenticator/src/main/res/values-it-rIT/strings.xml index bbaa68f91e..fd9a9d56e4 100644 --- a/authenticator/src/main/res/values-it-rIT/strings.xml +++ b/authenticator/src/main/res/values-it-rIT/strings.xml @@ -126,11 +126,13 @@ Memorizza tutti i login e sincronizza i codici di verifica direttamente con l\'app Authenticator. Scarica adesso Sincronizza con l\'app Bitwarden + This feature is not yet available for self-hosted users. Learn more Impossibile sincronizzare i codici dall\'app Bitwarden. Assicurati che entrambe le app siano aggiornate. Puoi comunque accedere ai tuoi codici esistenti nell\'app Bitwarden. %1$s | %2$s Sincronizza con l\'app Bitwarden Vai alle impostazioni Consenti la sincronizzazione dell\'app Authenticator nelle impostazioni per visualizzare tutti i codici di verifica qui. + Portami alle impostazioni dell\'app Qualcosa è andato storto Per favore riprova Sposta in Bitwarden diff --git a/authenticator/src/main/res/values-iw-rIL/strings.xml b/authenticator/src/main/res/values-iw-rIL/strings.xml index 75c2c3c63a..6c2a1641d7 100644 --- a/authenticator/src/main/res/values-iw-rIL/strings.xml +++ b/authenticator/src/main/res/values-iw-rIL/strings.xml @@ -126,11 +126,13 @@ Store all of your logins and sync verification codes directly with the Authenticator app. Download now Sync with Bitwarden app + This feature is not yet available for self-hosted users. Learn more Unable to sync codes from the Bitwarden app. Make sure both apps are up-to-date. You can still access your existing codes in the Bitwarden app. %1$s | %2$s Sync with the Bitwarden app Go to settings - Allow Authenticator app syncing in settings to view all of your verification codes here. + In order to view all of your verification codes, you’ll need to allow for syncing on all of your accounts. + Take me to the app settings Something went wrong Please try again Move to Bitwarden diff --git a/authenticator/src/main/res/values-ja-rJP/strings.xml b/authenticator/src/main/res/values-ja-rJP/strings.xml index 33b2f87938..784da77c49 100644 --- a/authenticator/src/main/res/values-ja-rJP/strings.xml +++ b/authenticator/src/main/res/values-ja-rJP/strings.xml @@ -126,11 +126,13 @@ すべてのログイン情報を格納し、認証アプリに認証コードを直接同期します。 今すぐダウンロード Bitwarden アプリと同期 + This feature is not yet available for self-hosted users. Learn more Bitwarden アプリからコードを同期できません。両方のアプリが最新であることを確認してください。既存のコードには Bitwarden アプリでアクセスできます。 %1$s | %2$s Bitwarden アプリと同期 設定に移動 ここにすべての認証コードを表示するためには、認証アプリの同期を許可してください。 + アプリの設定に移動 何らかのエラーが発生しました もう一度お試しください Bitwarden へ移動 @@ -148,8 +150,8 @@ コードをローカルに追加 ローカルのコード 必須の情報がありません - "Required info is missing (e.g., ‘services’ or ‘secret’). Check your file and try again. Visit bitwarden.com/help for support" - "File Could Not Be Processed" - "File could not be processed. Ensure it’s valid JSON and try again. Need help? Visit bitwarden.com/help" - Get Help + "必須の情報がありません(例:「サービス」または「シークレット」)。ファイルを確認して再度お試しください。サポートが必要な場合は bitwarden.com/help をご覧ください" + "ファイルを処理できませんでした" + "ファイルを処理できませんでした。有効な JSON であることを確認し、再度お試しください。ヘルプが必要な場合は bitwarden.com/help をご覧ください" + ヘルプを参照する diff --git a/authenticator/src/main/res/values-ka-rGE/strings.xml b/authenticator/src/main/res/values-ka-rGE/strings.xml index 75c2c3c63a..6c2a1641d7 100644 --- a/authenticator/src/main/res/values-ka-rGE/strings.xml +++ b/authenticator/src/main/res/values-ka-rGE/strings.xml @@ -126,11 +126,13 @@ Store all of your logins and sync verification codes directly with the Authenticator app. Download now Sync with Bitwarden app + This feature is not yet available for self-hosted users. Learn more Unable to sync codes from the Bitwarden app. Make sure both apps are up-to-date. You can still access your existing codes in the Bitwarden app. %1$s | %2$s Sync with the Bitwarden app Go to settings - Allow Authenticator app syncing in settings to view all of your verification codes here. + In order to view all of your verification codes, you’ll need to allow for syncing on all of your accounts. + Take me to the app settings Something went wrong Please try again Move to Bitwarden diff --git a/authenticator/src/main/res/values-kn-rIN/strings.xml b/authenticator/src/main/res/values-kn-rIN/strings.xml index 75c2c3c63a..6c2a1641d7 100644 --- a/authenticator/src/main/res/values-kn-rIN/strings.xml +++ b/authenticator/src/main/res/values-kn-rIN/strings.xml @@ -126,11 +126,13 @@ Store all of your logins and sync verification codes directly with the Authenticator app. Download now Sync with Bitwarden app + This feature is not yet available for self-hosted users. Learn more Unable to sync codes from the Bitwarden app. Make sure both apps are up-to-date. You can still access your existing codes in the Bitwarden app. %1$s | %2$s Sync with the Bitwarden app Go to settings - Allow Authenticator app syncing in settings to view all of your verification codes here. + In order to view all of your verification codes, you’ll need to allow for syncing on all of your accounts. + Take me to the app settings Something went wrong Please try again Move to Bitwarden diff --git a/authenticator/src/main/res/values-ko-rKR/strings.xml b/authenticator/src/main/res/values-ko-rKR/strings.xml index de6488c1b5..2ff158e7f5 100644 --- a/authenticator/src/main/res/values-ko-rKR/strings.xml +++ b/authenticator/src/main/res/values-ko-rKR/strings.xml @@ -126,11 +126,13 @@ Store all of your logins and sync verification codes directly with the Authenticator app. Download now Sync with Bitwarden app + This feature is not yet available for self-hosted users. Learn more Unable to sync codes from the Bitwarden app. Make sure both apps are up-to-date. You can still access your existing codes in the Bitwarden app. %1$s | %2$s Sync with the Bitwarden app Go to settings - Allow Authenticator app syncing in settings to view all of your verification codes here. + In order to view all of your verification codes, you’ll need to allow for syncing on all of your accounts. + Take me to the app settings Something went wrong Please try again Move to Bitwarden diff --git a/authenticator/src/main/res/values-lt-rLT/strings.xml b/authenticator/src/main/res/values-lt-rLT/strings.xml index 75c2c3c63a..6c2a1641d7 100644 --- a/authenticator/src/main/res/values-lt-rLT/strings.xml +++ b/authenticator/src/main/res/values-lt-rLT/strings.xml @@ -126,11 +126,13 @@ Store all of your logins and sync verification codes directly with the Authenticator app. Download now Sync with Bitwarden app + This feature is not yet available for self-hosted users. Learn more Unable to sync codes from the Bitwarden app. Make sure both apps are up-to-date. You can still access your existing codes in the Bitwarden app. %1$s | %2$s Sync with the Bitwarden app Go to settings - Allow Authenticator app syncing in settings to view all of your verification codes here. + In order to view all of your verification codes, you’ll need to allow for syncing on all of your accounts. + Take me to the app settings Something went wrong Please try again Move to Bitwarden diff --git a/authenticator/src/main/res/values-lv-rLV/strings.xml b/authenticator/src/main/res/values-lv-rLV/strings.xml index 75c2c3c63a..6c2a1641d7 100644 --- a/authenticator/src/main/res/values-lv-rLV/strings.xml +++ b/authenticator/src/main/res/values-lv-rLV/strings.xml @@ -126,11 +126,13 @@ Store all of your logins and sync verification codes directly with the Authenticator app. Download now Sync with Bitwarden app + This feature is not yet available for self-hosted users. Learn more Unable to sync codes from the Bitwarden app. Make sure both apps are up-to-date. You can still access your existing codes in the Bitwarden app. %1$s | %2$s Sync with the Bitwarden app Go to settings - Allow Authenticator app syncing in settings to view all of your verification codes here. + In order to view all of your verification codes, you’ll need to allow for syncing on all of your accounts. + Take me to the app settings Something went wrong Please try again Move to Bitwarden diff --git a/authenticator/src/main/res/values-ml-rIN/strings.xml b/authenticator/src/main/res/values-ml-rIN/strings.xml index 75c2c3c63a..6c2a1641d7 100644 --- a/authenticator/src/main/res/values-ml-rIN/strings.xml +++ b/authenticator/src/main/res/values-ml-rIN/strings.xml @@ -126,11 +126,13 @@ Store all of your logins and sync verification codes directly with the Authenticator app. Download now Sync with Bitwarden app + This feature is not yet available for self-hosted users. Learn more Unable to sync codes from the Bitwarden app. Make sure both apps are up-to-date. You can still access your existing codes in the Bitwarden app. %1$s | %2$s Sync with the Bitwarden app Go to settings - Allow Authenticator app syncing in settings to view all of your verification codes here. + In order to view all of your verification codes, you’ll need to allow for syncing on all of your accounts. + Take me to the app settings Something went wrong Please try again Move to Bitwarden diff --git a/authenticator/src/main/res/values-mr-rIN/strings.xml b/authenticator/src/main/res/values-mr-rIN/strings.xml index 75c2c3c63a..9d5b4a44ea 100644 --- a/authenticator/src/main/res/values-mr-rIN/strings.xml +++ b/authenticator/src/main/res/values-mr-rIN/strings.xml @@ -1,7 +1,7 @@ Authenticator - Biometric verification + बायोमेट्रिक पडताळणी Cancel Add item An error has occurred. @@ -16,17 +16,17 @@ Bitwarden Authenticator Name Add Item Rotation - Scan a QR code - Enter a setup key - Scan QR code - Point your camera at the QR code. - Cannot scan QR code. + QR कोड स्कॅन करा + सेटअप की एंटर करा + QR कोड स्कॅन करा + तुमचा कॅमेरा QR कोडवर रोखा. + QR कोड स्कॅन करू शकत नाही. Enter key manually Cannot add authenticator key? Once the key is successfully entered,\nselect Add TOTP to store the key safely - Add TOTP + TOTP जोडा Authenticator key - No thanks + नाही धन्यवाद Settings Enable camera permission to use the scanner Empty Item Listing @@ -38,14 +38,14 @@ Username Refresh period Algorithm - Hide - Show + लपवा + दाखवा Advanced Collapse advanced options Number of digits Save The %1$s field is required. - %d seconds + %d सेकंद Saving Item saved Information @@ -54,7 +54,7 @@ There are no items that match the search Back Clear - Search codes + कोड शोधा Options Try again Appearance @@ -90,7 +90,7 @@ There was a problem exporting your vault. If the problem persists, you\'ll need to export from the web vault. Data exported successfully Unlock with %1$s - Biometrics + बायोमेट्रिक्स Security Use biometrics to unlock Too many failed biometrics attempts. @@ -100,7 +100,7 @@ Bitwarden Help Center Continue to Help Center? Learn more about how to use Bitwarden Authenticator on the Help Center. - Privacy policy + गोपनीयता धोरण Continue to privacy policy? Check out our privacy policy on bitwarden.com Key @@ -126,11 +126,13 @@ Store all of your logins and sync verification codes directly with the Authenticator app. Download now Sync with Bitwarden app + This feature is not yet available for self-hosted users. Learn more Unable to sync codes from the Bitwarden app. Make sure both apps are up-to-date. You can still access your existing codes in the Bitwarden app. %1$s | %2$s Sync with the Bitwarden app Go to settings - Allow Authenticator app syncing in settings to view all of your verification codes here. + In order to view all of your verification codes, you’ll need to allow for syncing on all of your accounts. + Take me to the app settings Something went wrong Please try again Move to Bitwarden diff --git a/authenticator/src/main/res/values-my-rMM/strings.xml b/authenticator/src/main/res/values-my-rMM/strings.xml index 75c2c3c63a..6c2a1641d7 100644 --- a/authenticator/src/main/res/values-my-rMM/strings.xml +++ b/authenticator/src/main/res/values-my-rMM/strings.xml @@ -126,11 +126,13 @@ Store all of your logins and sync verification codes directly with the Authenticator app. Download now Sync with Bitwarden app + This feature is not yet available for self-hosted users. Learn more Unable to sync codes from the Bitwarden app. Make sure both apps are up-to-date. You can still access your existing codes in the Bitwarden app. %1$s | %2$s Sync with the Bitwarden app Go to settings - Allow Authenticator app syncing in settings to view all of your verification codes here. + In order to view all of your verification codes, you’ll need to allow for syncing on all of your accounts. + Take me to the app settings Something went wrong Please try again Move to Bitwarden diff --git a/authenticator/src/main/res/values-nb-rNO/strings.xml b/authenticator/src/main/res/values-nb-rNO/strings.xml index 75c2c3c63a..74bfe44f3b 100644 --- a/authenticator/src/main/res/values-nb-rNO/strings.xml +++ b/authenticator/src/main/res/values-nb-rNO/strings.xml @@ -2,67 +2,67 @@ Authenticator Biometric verification - Cancel - Add item - An error has occurred. + Avbryt + Legg til gjenstand + En feil har oppstått. We were unable to process your request. Please try again or contact us. Internet connection required - Please connect to the internet before continuing. + Vennligst koble deg til internett før du fortsetter. OK - Syncing - Copy - Edit - Close - Bitwarden Authenticator - Name + Synkroniserer + Kopier + Rediger + Lukk + Bitwarden-autentiserer + Navn Add Item Rotation - Scan a QR code + Skann en QR-kode Enter a setup key - Scan QR code - Point your camera at the QR code. + Skann QR-kode + Pek kameraet ditt mot QR-koden. Cannot scan QR code. Enter key manually Cannot add authenticator key? Once the key is successfully entered,\nselect Add TOTP to store the key safely Add TOTP - Authenticator key - No thanks - Settings + Autentiseringsnøkkel + Nei takk + Innstillinger Enable camera permission to use the scanner Empty Item Listing You don\'t have any items to display. Add a new code to secure your accounts. - Add code + Legg til kode Cannot read key. Verification code added - Username + Brukernavn Refresh period - Algorithm - Hide - Show - Advanced + Algoritme + Skjul + Vis + Avansert Collapse advanced options - Number of digits - Save + Antall sifre + Lagre The %1$s field is required. %d seconds - Saving + Lagrer Item saved - Information - OTP type - Verification codes + Informasjon + OTP-type + Verifiseringskoder There are no items that match the search - Back - Clear + Tilbake + Tøm Search codes - Options - Try again - Appearance - Default (System) - Theme - Dark - Light - Language + Innstillinger + Prøv igjen + Utseende + Standard (System) + Tema + Mørk + Lys + Språk The language has been changed to %1$s. Please restart the app to see the change Secure your accounts with Bitwarden Authenticator Get verification codes for all your accounts that support 2-step verification. @@ -70,86 +70,88 @@ Scan the QR code in your 2-step verification settings for any account. Sign in using unique codes When using 2-step verification, you\'ll enter your username and password and a code generated in this app. - Continue - Skip - Get started - Unique codes - Help + Fortsett + Hopp over + Kom i gang + Unike koder + Hjelp Launch tutorial %1$s copied - Delete item + Slett gjenstanden Item deleted - Delete - Do you really want to permanently delete? This cannot be undone. + Slett + Vil du virkelig slette denne permanent? Dette kan ikke angres. Data - Export - Loading + Eksporter + Laster Confirm export This export contains your 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. - File format + Filformat There was a problem exporting your vault. If the problem persists, you\'ll need to export from the web vault. Data exported successfully Unlock with %1$s - Biometrics - Security + Biometri + Sikkerhet Use biometrics to unlock Too many failed biometrics attempts. - About - Version - Continue + Om + Versjon + Fortsett Bitwarden Help Center - Continue to Help Center? + Vil du fortsette til Hjelpesenteret? Learn more about how to use Bitwarden Authenticator on the Help Center. - Privacy policy + Personvernerklæring Continue to privacy policy? Check out our privacy policy on bitwarden.com - Key + Nøkkel Create Verification code Key is required. - Name is required. + Et navn er påkrevd. Submit crash logs There was a problem importing your vault. - File Source - Import + Filens kilde + Importer Vault import successful - Key is invalid. - Save as a favorite - Favorite - Favorites - Backup + Nøkkelen er ugyldig. + Lagre som en favoritt + Favoritt + Favoritter + Sikkerhetskopi Data backup Bitwarden Authenticator data is backed up and can be restored with your regularly scheduled device backups. - Learn more + Lær mer Importing from 2FAS password protected files is not supported. Try again with an exported file that is not password protected. Importing Bitwarden CSV files is not supported. Try again with an exported JSON file. Download the Bitwarden app Store all of your logins and sync verification codes directly with the Authenticator app. - Download now + Last ned nå Sync with Bitwarden app + This feature is not yet available for self-hosted users. Learn more Unable to sync codes from the Bitwarden app. Make sure both apps are up-to-date. You can still access your existing codes in the Bitwarden app. %1$s | %2$s Sync with the Bitwarden app - Go to settings - Allow Authenticator app syncing in settings to view all of your verification codes here. - Something went wrong - Please try again - Move to Bitwarden + Gå til innstillingene + In order to view all of your verification codes, you’ll need to allow for syncing on all of your accounts. + Take me to the app settings + Noe gikk galt + Vennligst prøv igjen + Flytt til Bitwarden Default save option - Save to Bitwarden - Save here - None + Lagre til Bitwarden + Lagre her + Ingen Select where you would like to save new verification codes. - Confirm + Bekreft Verification code created Save this authenticator key here, or add it to a login in your Bitwarden app. Save option as default Account synced from Bitwarden app - Add code to Bitwarden - Add code locally + Legg til kode i Bitwarden + Legg til kode lokalt Local codes Required Information Missing "Required info is missing (e.g., ‘services’ or ‘secret’). Check your file and try again. Visit bitwarden.com/help for support" "File Could Not Be Processed" "File could not be processed. Ensure it’s valid JSON and try again. Need help? Visit bitwarden.com/help" - Get Help + Få hjelp diff --git a/authenticator/src/main/res/values-ne-rNP/strings.xml b/authenticator/src/main/res/values-ne-rNP/strings.xml index 75c2c3c63a..6c2a1641d7 100644 --- a/authenticator/src/main/res/values-ne-rNP/strings.xml +++ b/authenticator/src/main/res/values-ne-rNP/strings.xml @@ -126,11 +126,13 @@ Store all of your logins and sync verification codes directly with the Authenticator app. Download now Sync with Bitwarden app + This feature is not yet available for self-hosted users. Learn more Unable to sync codes from the Bitwarden app. Make sure both apps are up-to-date. You can still access your existing codes in the Bitwarden app. %1$s | %2$s Sync with the Bitwarden app Go to settings - Allow Authenticator app syncing in settings to view all of your verification codes here. + In order to view all of your verification codes, you’ll need to allow for syncing on all of your accounts. + Take me to the app settings Something went wrong Please try again Move to Bitwarden diff --git a/authenticator/src/main/res/values-nl-rNL/strings.xml b/authenticator/src/main/res/values-nl-rNL/strings.xml index 6b06b0c8f3..a4068ff9d9 100644 --- a/authenticator/src/main/res/values-nl-rNL/strings.xml +++ b/authenticator/src/main/res/values-nl-rNL/strings.xml @@ -127,11 +127,13 @@ selecteer TOTP toevoegen om de sleutel veilig op te slaan Sla al je logins op en synchroniseer verificatiecodes direct met de Authenticator app. Nu downloaden Synchroniseren met Bitwarden app + This feature is not yet available for self-hosted users. Learn more Kan geen codes synchroniseren vanuit de Bitwarden app. Zorg ervoor dat beide apps up-to-date zijn. Je hebt nog steeds toegang tot je bestaande codes in de Bitwarden app. %1$s | %2$s Synchroniseren met de Bitwarden app Ga naar instellingen Authenticator app synchronisatie toestaan in instellingen om hier al je verificatiecodes te bekijken. + Breng me naar de app-instellingen Er ging iets mis Probeer opnieuw Verplaatsen naar Bitwarden diff --git a/authenticator/src/main/res/values-nn-rNO/strings.xml b/authenticator/src/main/res/values-nn-rNO/strings.xml index 75c2c3c63a..6c2a1641d7 100644 --- a/authenticator/src/main/res/values-nn-rNO/strings.xml +++ b/authenticator/src/main/res/values-nn-rNO/strings.xml @@ -126,11 +126,13 @@ Store all of your logins and sync verification codes directly with the Authenticator app. Download now Sync with Bitwarden app + This feature is not yet available for self-hosted users. Learn more Unable to sync codes from the Bitwarden app. Make sure both apps are up-to-date. You can still access your existing codes in the Bitwarden app. %1$s | %2$s Sync with the Bitwarden app Go to settings - Allow Authenticator app syncing in settings to view all of your verification codes here. + In order to view all of your verification codes, you’ll need to allow for syncing on all of your accounts. + Take me to the app settings Something went wrong Please try again Move to Bitwarden diff --git a/authenticator/src/main/res/values-or-rIN/strings.xml b/authenticator/src/main/res/values-or-rIN/strings.xml index 75c2c3c63a..6c2a1641d7 100644 --- a/authenticator/src/main/res/values-or-rIN/strings.xml +++ b/authenticator/src/main/res/values-or-rIN/strings.xml @@ -126,11 +126,13 @@ Store all of your logins and sync verification codes directly with the Authenticator app. Download now Sync with Bitwarden app + This feature is not yet available for self-hosted users. Learn more Unable to sync codes from the Bitwarden app. Make sure both apps are up-to-date. You can still access your existing codes in the Bitwarden app. %1$s | %2$s Sync with the Bitwarden app Go to settings - Allow Authenticator app syncing in settings to view all of your verification codes here. + In order to view all of your verification codes, you’ll need to allow for syncing on all of your accounts. + Take me to the app settings Something went wrong Please try again Move to Bitwarden diff --git a/authenticator/src/main/res/values-pl-rPL/strings.xml b/authenticator/src/main/res/values-pl-rPL/strings.xml index 75c2c3c63a..5dad621b53 100644 --- a/authenticator/src/main/res/values-pl-rPL/strings.xml +++ b/authenticator/src/main/res/values-pl-rPL/strings.xml @@ -1,155 +1,157 @@ Authenticator - Biometric verification - Cancel - Add item - An error has occurred. - We were unable to process your request. Please try again or contact us. - Internet connection required - Please connect to the internet before continuing. + Weryfikacja biometryczna + Anuluj + Dodaj element + Wystąpił błąd. + Nie mogliśmy przetworzyć żądania. Spróbuj ponownie lub skontaktuj się z nami. + Połączenie z Internetem jest wymagane + Połącz się z internetem zanim przejdziesz dalej. OK - Syncing - Copy - Edit - Close + Synchronizuję + Kopiuj + Edytuj + Zamknij Bitwarden Authenticator - Name - Add Item Rotation - Scan a QR code - Enter a setup key - Scan QR code - Point your camera at the QR code. - Cannot scan QR code. - Enter key manually - Cannot add authenticator key? - Once the key is successfully entered,\nselect Add TOTP to store the key safely - Add TOTP - Authenticator key - No thanks - Settings - Enable camera permission to use the scanner - Empty Item Listing - You don\'t have any items to display. - Add a new code to secure your accounts. - Add code - Cannot read key. - Verification code added - Username - Refresh period - Algorithm - Hide - Show - Advanced - Collapse advanced options - Number of digits - Save - The %1$s field is required. - %d seconds - Saving - Item saved - Information - OTP type - Verification codes - There are no items that match the search - Back - Clear - Search codes - Options - Try again - Appearance - Default (System) - Theme - Dark - Light - Language - The language has been changed to %1$s. Please restart the app to see the change - Secure your accounts with Bitwarden Authenticator - Get verification codes for all your accounts that support 2-step verification. - Use your device camera to scan codes - Scan the QR code in your 2-step verification settings for any account. - Sign in using unique codes - When using 2-step verification, you\'ll enter your username and password and a code generated in this app. - Continue - Skip - Get started - Unique codes - Help - Launch tutorial - %1$s copied - Delete item - Item deleted - Delete - Do you really want to permanently delete? This cannot be undone. - Data - Export - Loading - Confirm export - This export contains your 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. - File format - There was a problem exporting your vault. If the problem persists, you\'ll need to export from the web vault. - Data exported successfully - Unlock with %1$s - Biometrics - Security - Use biometrics to unlock - Too many failed biometrics attempts. - About - Version - Continue - Bitwarden Help Center - Continue to Help Center? - Learn more about how to use Bitwarden Authenticator on the Help Center. - Privacy policy - Continue to privacy policy? - Check out our privacy policy on bitwarden.com - Key - Create Verification code - Key is required. - Name is required. - Submit crash logs - There was a problem importing your vault. - File Source - Import - Vault import successful - Key is invalid. - Save as a favorite - Favorite - Favorites - Backup - Data backup - Bitwarden Authenticator data is backed up and can be restored with your regularly scheduled device backups. - Learn more - Importing from 2FAS password protected files is not supported. Try again with an exported file that is not password protected. - Importing Bitwarden CSV files is not supported. Try again with an exported JSON file. - Download the Bitwarden app - Store all of your logins and sync verification codes directly with the Authenticator app. - Download now - Sync with Bitwarden app - Unable to sync codes from the Bitwarden app. Make sure both apps are up-to-date. You can still access your existing codes in the Bitwarden app. + Nazwa + Dodaj Obrót Produktu + Zeskanuj kod QR + Wprowadź klucz konfiguracyjny + Zeskanuj kod QR + Skieruj aparat w stronę kodu QR. + Nie można zeskanować kodu QR. + Wprowadź klucz ręcznie + Nie możesz dodać klucza uwierzytelniającego? + Po poprawnym wprowadzeniu klucza\nwybierz Dodaj TOTP, aby bezpiecznie przechowywać klucz + Dodaj TOTP + Klucz uwierzytelniający + Nie, dziękuję + Ustawienia + Włącz uprawnienia aparatu do korzystania ze skanera + Pusta lista elementów + Nie masz żadnych elementów do wyświetlenia. + Dodaj nowy kod, by zabezpieczyć swoje konta. + Dodaj kod + Nie można odczytać klucza. + Dodano kod weryfikacyjny + Nazwa użytkownika + Okres odświeżenia + Algorytm + Ukryj + Pokaż + Zaawansowane + Zwiń opcje zaawansowane + Liczba cyfr + Zapisz + Pole %1$s jest wymagane. + %d sekund + Zapisywanie + Element został zapisany + Informacje + Typ OTP + Kody weryfikacyjne + Brak elementów, które pasują do wyszukiwania + Powrót + Wyczyść + Szukaj kodów + Opcje + Spróbuj ponownie + Wygląd + Domyślny (Systemowy) + Motyw + Ciemny + Jasny + Język + Język został zmieniony na %1$s. Uruchom aplikację ponownie, aby zobaczyć zmiany + Zabezpiecz swoje konta za pomocą Bitwarden Authenticator + Uzyskaj kody weryfikacyjne dla wszystkich swoich kont, które obsługują dwuetapową weryfikację. + Użyj aparatu do skanowania kodów + Zeskanuj kod QR w ustawieniach weryfikacji dwuetapowej dla każdego konta. + Zaloguj się za pomocą unikalnych kodów + Gdy używasz dwuetapowej weryfikacji, wprowadzisz nazwę użytkownika, hasło oraz kod wygenerowany w tej aplikacji. + Kontynuuj + Pomiń + Pierwsze kroki + Unikalne kody + Pomoc + Uruchom samouczek + Skopiowano %1$s + Usuń element + Element usunięty + Usuń + Czy na pewno chcesz trwale usunąć? Tej operacji nie można cofnąć. + Dane + Eksportuj + Ładowanie + Potwierdź eksport + Plik zawiera dane sejfu w niezaszyfrowanym formacie. Nie powinieneś go przechowywać, ani przesyłać poprzez niezabezpieczone kanały (takie jak poczta e-mail). Skasuj go natychmiast po użyciu. + Format pliku + Wystąpił problem z wyeksportowaniem sejfu. Jeśli problem nadal występuje, musisz wyeksportować dane z sejfu internetowego. + Dane wyeksportowane pomyślnie + Odblokuj z %1$s + Biometria + Zabezpieczenia + Użyj biometrii by odblokować + Zbyt wiele nieudanych prób biometrycznych. + O aplikacji + Wersja + Kontynuuj + Centrum pomocy Bitwarden + Kontynuować do Centrum Pomocy? + Dowiedz się więcej o tym, jak korzystać z uwierzytelniania Bitwarden w Centrum Pomocy. + Polityka prywatności + Przejść do polityki prywatności? + Sprawdź naszą politykę prywatności na bitwarden.com + Klucz + Utwórz kod weryfikacyjny + Klucz jest wymagany. + Nazwa jest wymagana. + Prześlij dzienniki awarii + Podczas importowania sejfu wystąpił problem. + Źródło pliku + Importuj + Import sejfu zakończony powodzeniem + Klucz jest nieprawidłowy. + Zapisz jako ulubione + Ulubione + Ulubione + Kopia zapasowa + Kopia zapasowa danych + Kopia zapasowa danych Bitwarden Authenticator jest wykonywana i może być przywrócona z regularnymi kopiami zapasowymi urządzenia. + Dowiedz się więcej + Importowanie z plików chronionych hasłami 2FAS nie jest obsługiwane. Spróbuj ponownie z eksportowanym plikiem, który nie jest chroniony hasłem. + Importowanie plików CSV w Bitwarden nie jest obsługiwane. Spróbuj ponownie z eksportowanym plikiem JSON. + Pobierz aplikację Bitwarden + Przechowuj wszystkie swoje logowania i synchronizuj kody weryfikacyjne bezpośrednio z aplikacją Authenticator. + Pobierz teraz + Synchronizacja z aplikacją Bitwarden + Ta funkcja nie jest jeszcze dostępna dla użytkowników korzystających z hostingu samodzielnego. Dowiedz się więcej + Nie można zsynchronizować kodów z aplikacji Bitwarden. Upewnij się, że obie aplikacje są aktualne. Nadal możesz uzyskać dostęp do istniejących kodów w aplikacji Bitwarden. %1$s | %2$s - Sync with the Bitwarden app - Go to settings - Allow Authenticator app syncing in settings to view all of your verification codes here. - Something went wrong - Please try again - Move to Bitwarden - Default save option - Save to Bitwarden - Save here - None - Select where you would like to save new verification codes. - Confirm - Verification code created - Save this authenticator key here, or add it to a login in your Bitwarden app. - Save option as default - Account synced from Bitwarden app - Add code to Bitwarden - Add code locally - Local codes - Required Information Missing - "Required info is missing (e.g., ‘services’ or ‘secret’). Check your file and try again. Visit bitwarden.com/help for support" - "File Could Not Be Processed" - "File could not be processed. Ensure it’s valid JSON and try again. Need help? Visit bitwarden.com/help" - Get Help + Synchronizuj z aplikacją Bitwarden + Przejdź do ustawień + Zezwalaj aplikacji Authenticator na synchronizację w ustawieniach aby wyświetlić tutaj wszystkie Twoje kody weryfikacyjne. + Przejdź do ustawień aplikacji + Coś poszło nie tak + Proszę spróbować ponownie. + Przenieś do Bitwarden + Domyślna opcja zapisu + Zapisz w Bitwarden + Zapisz tutaj + Żaden + Wybierz, gdzie chcesz zapisać nowe kody weryfikacyjne. + Potwierdź + Kod weryfikacyjny został utworzony + Zapisz ten klucz uwierzytelniający tutaj lub dodaj go do logowania w aplikacji Bitwarden. + Zapisz opcję jako domyślną + Konto zsynchronizowane z aplikacji Bitwarden + Dodaj kod do Bitwarden + Dodaj kod lokalnie + Kody lokalne + Brakujące wymagane informacje + "Brakuje wymaganych informacji (np. ‘services’ lub ‘secret’). Sprawdź swój plik i spróbuj ponownie. Odwiedź bitwarden.com/help by uzyskać pomoc" + "Plik nie może zostać przetworzony" + "Plik nie może być przetworzony. Upewnij się, że plik JSON jest prawidłowy i spróbuj ponownie. Potrzebujesz pomocy? Odwiedź bitwarden.com/help" + Uzyskaj pomoc diff --git a/authenticator/src/main/res/values-pt-rBR/strings.xml b/authenticator/src/main/res/values-pt-rBR/strings.xml index 411396b79a..bf852dcc3e 100644 --- a/authenticator/src/main/res/values-pt-rBR/strings.xml +++ b/authenticator/src/main/res/values-pt-rBR/strings.xml @@ -126,11 +126,13 @@ Armazene todos os seus logins e sincronize códigos de verificação diretamente com o app Autenticador. Baixe agora Sincronizar com o aplicativo Bitwarden + This feature is not yet available for self-hosted users. Learn more Não é possível sincronizar os códigos do aplicativo Bitwarden. Certifique-se de que ambos os aplicativos estão atualizados. Você ainda pode acessar os códigos existentes no aplicativo Bitwarden. %1$s ├%2$s Sincronizar com o aplicativo Bitwarden Ir para as configurações Permitir a sincronização do app Autenticador em configurações para ver todos os seus códigos de verificação aqui. + Me leve para as configurações do aplicativo Algo deu errado Por favor, tente novamente Mover para o Bitwarden diff --git a/authenticator/src/main/res/values-pt-rPT/strings.xml b/authenticator/src/main/res/values-pt-rPT/strings.xml index 41d955ed73..413a157630 100644 --- a/authenticator/src/main/res/values-pt-rPT/strings.xml +++ b/authenticator/src/main/res/values-pt-rPT/strings.xml @@ -63,7 +63,7 @@ Escuro Claro Idioma - O idioma foi alterado para %1$s. Por favor, reinicie a aplicação para ver as alterações + O idioma foi alterado para %1$s. Por favor, reinicie a app para ver as alterações Proteja as suas contas com o Bitwarden Authenticator Obtenha códigos de verificação para todas as suas contas que suportam a verificação de dois passos. Utilize a câmara do seu dispositivo para ler códigos @@ -126,11 +126,13 @@ Armazene todas as suas credenciais e sincronize os códigos de verificação diretamente com a app Authenticator. Descarregar agora Sincronizar com a app Bitwarden + Esta funcionalidade ainda não está disponível para utilizadores auto-hospedados. Saiba mais Não é possível sincronizar códigos da app Bitwarden. Certifique-se de que ambas as aplicações estão atualizadas. Ainda pode aceder aos seus códigos existentes na app Bitwarden. %1$s | %2$s Sincronizar com a app Bitwarden Ir para as definições - Permita a sincronização da app Authenticator nas definições para ver todos os seus códigos de verificação aqui. + Para ver todos os seus códigos de verificação, terá de permitir a sincronização em todas as suas contas. + Ir às definições da aplicação Alguma coisa correu mal Por favor, tente novamente Mover para o Bitwarden diff --git a/authenticator/src/main/res/values-ro-rRO/strings.xml b/authenticator/src/main/res/values-ro-rRO/strings.xml index 75c2c3c63a..6c2a1641d7 100644 --- a/authenticator/src/main/res/values-ro-rRO/strings.xml +++ b/authenticator/src/main/res/values-ro-rRO/strings.xml @@ -126,11 +126,13 @@ Store all of your logins and sync verification codes directly with the Authenticator app. Download now Sync with Bitwarden app + This feature is not yet available for self-hosted users. Learn more Unable to sync codes from the Bitwarden app. Make sure both apps are up-to-date. You can still access your existing codes in the Bitwarden app. %1$s | %2$s Sync with the Bitwarden app Go to settings - Allow Authenticator app syncing in settings to view all of your verification codes here. + In order to view all of your verification codes, you’ll need to allow for syncing on all of your accounts. + Take me to the app settings Something went wrong Please try again Move to Bitwarden diff --git a/authenticator/src/main/res/values-ru-rRU/strings.xml b/authenticator/src/main/res/values-ru-rRU/strings.xml index 75c2c3c63a..cf275cc05e 100644 --- a/authenticator/src/main/res/values-ru-rRU/strings.xml +++ b/authenticator/src/main/res/values-ru-rRU/strings.xml @@ -1,155 +1,159 @@ - Authenticator - Biometric verification - Cancel - Add item - An error has occurred. - We were unable to process your request. Please try again or contact us. - Internet connection required - Please connect to the internet before continuing. - OK - Syncing - Copy - Edit - Close - Bitwarden Authenticator - Name - Add Item Rotation - Scan a QR code - Enter a setup key - Scan QR code - Point your camera at the QR code. - Cannot scan QR code. - Enter key manually - Cannot add authenticator key? - Once the key is successfully entered,\nselect Add TOTP to store the key safely - Add TOTP - Authenticator key - No thanks - Settings - Enable camera permission to use the scanner - Empty Item Listing - You don\'t have any items to display. - Add a new code to secure your accounts. - Add code - Cannot read key. - Verification code added - Username - Refresh period - Algorithm - Hide - Show - Advanced - Collapse advanced options - Number of digits - Save - The %1$s field is required. - %d seconds - Saving - Item saved - Information - OTP type - Verification codes - There are no items that match the search - Back - Clear - Search codes - Options - Try again - Appearance - Default (System) - Theme - Dark - Light - Language - The language has been changed to %1$s. Please restart the app to see the change - Secure your accounts with Bitwarden Authenticator - Get verification codes for all your accounts that support 2-step verification. - Use your device camera to scan codes - Scan the QR code in your 2-step verification settings for any account. - Sign in using unique codes - When using 2-step verification, you\'ll enter your username and password and a code generated in this app. - Continue - Skip - Get started - Unique codes - Help - Launch tutorial - %1$s copied - Delete item - Item deleted - Delete - Do you really want to permanently delete? This cannot be undone. - Data - Export - Loading - Confirm export - This export contains your 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. - File format - There was a problem exporting your vault. If the problem persists, you\'ll need to export from the web vault. - Data exported successfully - Unlock with %1$s - Biometrics - Security - Use biometrics to unlock - Too many failed biometrics attempts. - About - Version - Continue - Bitwarden Help Center - Continue to Help Center? - Learn more about how to use Bitwarden Authenticator on the Help Center. - Privacy policy - Continue to privacy policy? - Check out our privacy policy on bitwarden.com - Key - Create Verification code - Key is required. - Name is required. - Submit crash logs - There was a problem importing your vault. - File Source - Import - Vault import successful - Key is invalid. - Save as a favorite - Favorite - Favorites - Backup - Data backup - Bitwarden Authenticator data is backed up and can be restored with your regularly scheduled device backups. - Learn more - Importing from 2FAS password protected files is not supported. Try again with an exported file that is not password protected. - Importing Bitwarden CSV files is not supported. Try again with an exported JSON file. - Download the Bitwarden app - Store all of your logins and sync verification codes directly with the Authenticator app. - Download now - Sync with Bitwarden app - Unable to sync codes from the Bitwarden app. Make sure both apps are up-to-date. You can still access your existing codes in the Bitwarden app. + Аутентификатор + Биометрическая верификация + Отменить + Добавить элемент + Произошла ошибка. + Мы не смогли обработать ваш запрос. Пожалуйста, попробуйте еще раз или свяжитесь с нами. + Требуется подключение к Интернету + Прежде чем продолжить, подключитесь к Интернету. + Ок + Синхронизация + Копировать + Редактировать + Закрыть + Аутентификатор Bitwarden + Имя + Добавить ротацию элементов + Сканирование QR-кода + Введите ключ настройки + Сканирование QR-кода + Наведите камеру на QR-код. + Невозможно отсканировать QR-код. + Введите клавишу вручную + Не удается добавить ключ аутентификатора? + После успешного ввода ключа,\n выберите Добавить TOTP, чтобы надежно сохранить ключ + Добавить TOTP + Ключ аутентификатора + Нет, спасибо + Настройки + Дайте разрешение камеры на использование сканера + Пустой список элементов + У вас нет предметов для отображения. + Добавьте новый код для защиты учетных записей. + Добавить код + Невозможно прочитать ключ. + Добавлен код проверки + Имя пользователя + Период обновления + Алгоритм + Скрыть + Показать + Расширенный + Свернуть дополнительные параметры + Количество цифр + Сохранить + Поле %1$s является обязательным. + %d секунд + Сохранение + Элемент сохранен + Информация + Тип OTP + Коды верификации + Нет элементов, соответствующих запросу + Назад + Очистить + Искать коды + Опции + Попробуйте еще + Внешний вид + По умолчанию (система) + Тема + Темная + Светлая + Язык + Язык был изменен на %1$s. Пожалуйста, перезапустите приложение, чтобы увидеть изменения + Защитите свои учетные записи с помощью аутентификатора Bitwarden + Получите коды проверки для всех ваших учетных записей, поддерживающих 2-этапную проверку. + Используйте камеру вашего устройства для сканирования кодов + Сканируйте QR-код в настройках +2-этапной верификации для любой учетной записи. + Авторизуйтесь с помощью уникальных кодов + При использовании 2-этапной верификации вы введете свое имя пользователя, пароль и код, сгенерированный в этом приложении. + Продолжить + Пропустить + Начать + Уникальные коды + Помощь + Руководство по эксплуатации + %1$s скопировано + Удалить элемент + Элемент удален + Удалить + Вы действительно хотите удалить его навсегда? Это невозможно отменить. + Данные + Экспорт + Загрузка + Подтвердите экспорт + Этот экспорт содержит ваши данные в незашифрованном формате. Не следует хранить или отправлять экспортированный файл по незащищенным каналам (например, по электронной почте). Удалите его сразу после завершения работы. + Формат файла + Возникла проблема с экспортом вашего хранилища. Если проблема сохраняется, вам нужно экспортировать из +веб хранилища. + Данные успешно экспортированы + Разблокируйте с помощью %1$s + Биометрия + Безопасность + Используйте биометрические данные для разблокировки + Слишком много неудачных попыток биометрии. + О приложении + Версия + Продолжить + Справочный центр Bitwarden + Продолжить работу в Справочном центре? + Узнайте больше о том, как использовать аутентификатор Bitwarden, в Справочном центре. + Политика конфиденциальности + Перейти к политике конфиденциальности? + Ознакомьтесь с нашей политикой конфиденциальности на сайте bitwarden.com + Ключ + Создайте верификационный код + Требуется ключ. + Имя обязательно. + Отправьте журналы сбоев + Возникла проблема с импортом вашего хранилища. + Источник файла + Импорт + Импорт хранилища прошел успешно + Ключ недействителен. + Сохранить как избранное + Избранное + Избранное + Резервное копирование + Резервное копирование данных + Данные Bitwarden Аутентификатора сохраняются в резервной копии и могут быть восстановлены при регулярном резервном копировании устройства. + Узнать больше + Импорт из файлов, защищенных паролем 2FAS, не поддерживается. Повторите попытку с экспортированным файлом, не защищенным паролем. + Импорт CSV-файлов Bitwarden не поддерживается. Повторите попытку с экспортированным JSON-файлом. + Загрузите приложение Bitwarden + Храните все свои логины и синхронизируйте коды проверки непосредственно с приложением \"Аутентификатор\". + Скачать сейчас + Синхронизация с приложением Bitwarden + This feature is not yet available for self-hosted users. Learn more + Невозможно синхронизировать коды из приложения Bitwarden. Убедитесь, что оба приложения обновлены. Вы по-прежнему можете получить доступ к существующим кодам в приложении Bitwarden. %1$s | %2$s - Sync with the Bitwarden app - Go to settings - Allow Authenticator app syncing in settings to view all of your verification codes here. - Something went wrong - Please try again - Move to Bitwarden - Default save option - Save to Bitwarden - Save here - None - Select where you would like to save new verification codes. - Confirm - Verification code created - Save this authenticator key here, or add it to a login in your Bitwarden app. - Save option as default - Account synced from Bitwarden app - Add code to Bitwarden - Add code locally - Local codes - Required Information Missing - "Required info is missing (e.g., ‘services’ or ‘secret’). Check your file and try again. Visit bitwarden.com/help for support" - "File Could Not Be Processed" - "File could not be processed. Ensure it’s valid JSON and try again. Need help? Visit bitwarden.com/help" - Get Help + Синхронизация с приложением Bitwarden + Перейдите к настройкам + Разрешите синхронизацию приложения \"Аутентификатор\" в настройках, чтобы просмотреть все ваши проверочные коды здесь. + Перейдите к настройкам приложения + Что-то пошло не так + Пожалуйста, попробуйте еще раз + Перейти в Bitwarden + Вариант сохранения по умолчанию + Сохранить в Bitwarden + Сохранить здесь + Нет + Выберите место, где вы хотите сохранять новые проверочные коды. + Подтвердить + Верификационный код создан + Сохраните этот ключ аутентификатора здесь или добавьте его к логину в приложении Bitwarden. + Сохранить опцию по умолчанию + Аккаунт синхронизирован из приложения Bitwarden + Добавить код в Bitwarden + Добавьте код локально + Локальные коды + Отсутствует необходимая информация + "Отсутствует необходимая информация (например, 'services' или 'secret'). Проверьте файл и повторите попытку. Посетите bitwarden.com/help для получения поддержки" + "Файл не удалось обработать" + "Файл не удалось обработать. Убедитесь, что это корректный JSON, и повторите попытку. Нужна помощь? Посетите bitwarden.com/help" + Получить помощь diff --git a/authenticator/src/main/res/values-si-rLK/strings.xml b/authenticator/src/main/res/values-si-rLK/strings.xml index 75c2c3c63a..6c2a1641d7 100644 --- a/authenticator/src/main/res/values-si-rLK/strings.xml +++ b/authenticator/src/main/res/values-si-rLK/strings.xml @@ -126,11 +126,13 @@ Store all of your logins and sync verification codes directly with the Authenticator app. Download now Sync with Bitwarden app + This feature is not yet available for self-hosted users. Learn more Unable to sync codes from the Bitwarden app. Make sure both apps are up-to-date. You can still access your existing codes in the Bitwarden app. %1$s | %2$s Sync with the Bitwarden app Go to settings - Allow Authenticator app syncing in settings to view all of your verification codes here. + In order to view all of your verification codes, you’ll need to allow for syncing on all of your accounts. + Take me to the app settings Something went wrong Please try again Move to Bitwarden diff --git a/authenticator/src/main/res/values-sk-rSK/strings.xml b/authenticator/src/main/res/values-sk-rSK/strings.xml index 75c2c3c63a..6c2a1641d7 100644 --- a/authenticator/src/main/res/values-sk-rSK/strings.xml +++ b/authenticator/src/main/res/values-sk-rSK/strings.xml @@ -126,11 +126,13 @@ Store all of your logins and sync verification codes directly with the Authenticator app. Download now Sync with Bitwarden app + This feature is not yet available for self-hosted users. Learn more Unable to sync codes from the Bitwarden app. Make sure both apps are up-to-date. You can still access your existing codes in the Bitwarden app. %1$s | %2$s Sync with the Bitwarden app Go to settings - Allow Authenticator app syncing in settings to view all of your verification codes here. + In order to view all of your verification codes, you’ll need to allow for syncing on all of your accounts. + Take me to the app settings Something went wrong Please try again Move to Bitwarden diff --git a/authenticator/src/main/res/values-sl-rSI/strings.xml b/authenticator/src/main/res/values-sl-rSI/strings.xml index 75c2c3c63a..6c2a1641d7 100644 --- a/authenticator/src/main/res/values-sl-rSI/strings.xml +++ b/authenticator/src/main/res/values-sl-rSI/strings.xml @@ -126,11 +126,13 @@ Store all of your logins and sync verification codes directly with the Authenticator app. Download now Sync with Bitwarden app + This feature is not yet available for self-hosted users. Learn more Unable to sync codes from the Bitwarden app. Make sure both apps are up-to-date. You can still access your existing codes in the Bitwarden app. %1$s | %2$s Sync with the Bitwarden app Go to settings - Allow Authenticator app syncing in settings to view all of your verification codes here. + In order to view all of your verification codes, you’ll need to allow for syncing on all of your accounts. + Take me to the app settings Something went wrong Please try again Move to Bitwarden diff --git a/authenticator/src/main/res/values-sr-rSP/strings.xml b/authenticator/src/main/res/values-sr-rSP/strings.xml index 6435c6e3f0..5fd271d40d 100644 --- a/authenticator/src/main/res/values-sr-rSP/strings.xml +++ b/authenticator/src/main/res/values-sr-rSP/strings.xml @@ -126,11 +126,13 @@ Чувајте све своје пријаве и синхронизујте верификационе кôдове директно са апликацијом Authenticator. Преузми сада Синхронизујте са апликацијом Bitwarden + This feature is not yet available for self-hosted users. Learn more Није могуће синхронизовати кодове из апликације Bitwarden. Уверите се да су обе апликације ажуриране. И даље можете да приступите својим постојећим кодовима у апликацији Bitwarden. %1$s | %2$s Синхронизујте са апликацијом Bitwarden Иди у подешавања Дозволите синхронизацију апликације Authenticator у подешавањима да бисте видели све своје верификационе кôдове овде. + Одведи ме до подешавања апликације Нешто није у реду Покушајте поново Пречи на Bitwarden diff --git a/authenticator/src/main/res/values-sv-rSE/strings.xml b/authenticator/src/main/res/values-sv-rSE/strings.xml index 5bdb30cd34..3f6d5acc64 100644 --- a/authenticator/src/main/res/values-sv-rSE/strings.xml +++ b/authenticator/src/main/res/values-sv-rSE/strings.xml @@ -126,11 +126,13 @@ Spara alla inloggningar och synkronisera verifieringskoder direkt med Authenticator-appen. Download now Synkronisera med Bitwarden-appen + This feature is not yet available for self-hosted users. Learn more Unable to sync codes from the Bitwarden app. Make sure both apps are up-to-date. You can still access your existing codes in the Bitwarden app. %1$s | %2$s Synkronisera med Bitwarden-appen Gå till inställningar - Allow Authenticator app syncing in settings to view all of your verification codes here. + In order to view all of your verification codes, you’ll need to allow for syncing on all of your accounts. + Take me to the app settings Något gick fel Försök igen Move to Bitwarden diff --git a/authenticator/src/main/res/values-ta-rIN/strings.xml b/authenticator/src/main/res/values-ta-rIN/strings.xml index 75c2c3c63a..6c2a1641d7 100644 --- a/authenticator/src/main/res/values-ta-rIN/strings.xml +++ b/authenticator/src/main/res/values-ta-rIN/strings.xml @@ -126,11 +126,13 @@ Store all of your logins and sync verification codes directly with the Authenticator app. Download now Sync with Bitwarden app + This feature is not yet available for self-hosted users. Learn more Unable to sync codes from the Bitwarden app. Make sure both apps are up-to-date. You can still access your existing codes in the Bitwarden app. %1$s | %2$s Sync with the Bitwarden app Go to settings - Allow Authenticator app syncing in settings to view all of your verification codes here. + In order to view all of your verification codes, you’ll need to allow for syncing on all of your accounts. + Take me to the app settings Something went wrong Please try again Move to Bitwarden diff --git a/authenticator/src/main/res/values-te-rIN/strings.xml b/authenticator/src/main/res/values-te-rIN/strings.xml index 75c2c3c63a..6c2a1641d7 100644 --- a/authenticator/src/main/res/values-te-rIN/strings.xml +++ b/authenticator/src/main/res/values-te-rIN/strings.xml @@ -126,11 +126,13 @@ Store all of your logins and sync verification codes directly with the Authenticator app. Download now Sync with Bitwarden app + This feature is not yet available for self-hosted users. Learn more Unable to sync codes from the Bitwarden app. Make sure both apps are up-to-date. You can still access your existing codes in the Bitwarden app. %1$s | %2$s Sync with the Bitwarden app Go to settings - Allow Authenticator app syncing in settings to view all of your verification codes here. + In order to view all of your verification codes, you’ll need to allow for syncing on all of your accounts. + Take me to the app settings Something went wrong Please try again Move to Bitwarden diff --git a/authenticator/src/main/res/values-th-rTH/strings.xml b/authenticator/src/main/res/values-th-rTH/strings.xml index 75c2c3c63a..6c2a1641d7 100644 --- a/authenticator/src/main/res/values-th-rTH/strings.xml +++ b/authenticator/src/main/res/values-th-rTH/strings.xml @@ -126,11 +126,13 @@ Store all of your logins and sync verification codes directly with the Authenticator app. Download now Sync with Bitwarden app + This feature is not yet available for self-hosted users. Learn more Unable to sync codes from the Bitwarden app. Make sure both apps are up-to-date. You can still access your existing codes in the Bitwarden app. %1$s | %2$s Sync with the Bitwarden app Go to settings - Allow Authenticator app syncing in settings to view all of your verification codes here. + In order to view all of your verification codes, you’ll need to allow for syncing on all of your accounts. + Take me to the app settings Something went wrong Please try again Move to Bitwarden diff --git a/authenticator/src/main/res/values-tr-rTR/strings.xml b/authenticator/src/main/res/values-tr-rTR/strings.xml index e76cd725c3..1b8f46841b 100644 --- a/authenticator/src/main/res/values-tr-rTR/strings.xml +++ b/authenticator/src/main/res/values-tr-rTR/strings.xml @@ -126,11 +126,13 @@ Tüm giriş bilgilerinizi saklayın ve doğrulama kodlarını doğrudan Authenticator uygulaması ile senkronize edin. Şimdi indir Bitwarden uygulaması ile senkronize et + Bu özellik, kendi kendine barındırılan kullanıcılar için henüz mevcut değil. Daha fazla bilgi edinin Bitwarden uygulamasından kodlar senkronize edilemiyor. Her iki uygulamanın da güncel olduğundan emin olun. Bitwarden uygulamasında mevcut kodlarınıza hala erişebilirsiniz. %1$s | %2$s Bitwarden uygulaması ile senkronize et Ayarlara git Tüm doğrulama kodlarınızı burada görüntülemek için ayarlardan Authenticator uygulaması senkronizasyonuna izin verin. + Beni uygulama ayarlarına götür Bir sorun oluştu Lütfen tekrar deneyin Bitwarden\'a taşı diff --git a/authenticator/src/main/res/values-uk-rUA/strings.xml b/authenticator/src/main/res/values-uk-rUA/strings.xml index 2fb0f2b8f9..904a987f50 100644 --- a/authenticator/src/main/res/values-uk-rUA/strings.xml +++ b/authenticator/src/main/res/values-uk-rUA/strings.xml @@ -126,11 +126,13 @@ Зберігайте всі паролі та синхронізуйте коди підтвердження безпосередньо з програмою Authenticator. Завантажити Синхронізувати з програмою Bitwarden + This feature is not yet available for self-hosted users. Learn more Неможливо синхронізувати коди з програмою Bitwarden. Переконайтеся, що у вас найновіші версії обох програм. Ви все одно можете отримати доступ до наявних кодів у програмі Bitwarden. %1$s | %2$s Синхронізувати з програмою Bitwarden Відкрити налаштування Дозвольте синхронізацію програми Authenticator у налаштуваннях, щоб бачити тут свої коди підтвердження. + Перейти до налаштувань програми Щось пішло не так Повторіть спробу Перемістити до Bitwarden @@ -148,8 +150,8 @@ Додати код локально Локальні коди Відсутня необхідна інформація - "Required info is missing (e.g., ‘services’ or ‘secret’). Check your file and try again. Visit bitwarden.com/help for support" - "File Could Not Be Processed" - "File could not be processed. Ensure it’s valid JSON and try again. Need help? Visit bitwarden.com/help" - Get Help + "Необхідна інформація відсутня (наприклад, 'services' або 'secret'). Перевірте свій файл і повторіть спробу. Відвідайте bitwarden.com/help для підтримки" + "Неможливо обробити файл" + "Не вдалося обробити файл. Перевірте правильність JSON і повторіть спробу. Потрібна допомога? Відвідайте bitwarden.com/help" + Отримати допомогу diff --git a/authenticator/src/main/res/values-vi-rVN/strings.xml b/authenticator/src/main/res/values-vi-rVN/strings.xml index 0d10164f1f..b571538307 100644 --- a/authenticator/src/main/res/values-vi-rVN/strings.xml +++ b/authenticator/src/main/res/values-vi-rVN/strings.xml @@ -126,11 +126,13 @@ Store all of your logins and sync verification codes directly with the Authenticator app. Download now Sync with Bitwarden app + This feature is not yet available for self-hosted users. Learn more Unable to sync codes from the Bitwarden app. Make sure both apps are up-to-date. You can still access your existing codes in the Bitwarden app. %1$s | %2$s Sync with the Bitwarden app Go to settings - Allow Authenticator app syncing in settings to view all of your verification codes here. + In order to view all of your verification codes, you’ll need to allow for syncing on all of your accounts. + Take me to the app settings Something went wrong Please try again Move to Bitwarden diff --git a/authenticator/src/main/res/values-zh-rCN/strings.xml b/authenticator/src/main/res/values-zh-rCN/strings.xml index d8df471a51..3f8935b9b6 100644 --- a/authenticator/src/main/res/values-zh-rCN/strings.xml +++ b/authenticator/src/main/res/values-zh-rCN/strings.xml @@ -2,155 +2,157 @@ 身份验证器 生物识别验证 - Cancel + 取消 添加项目 - An error has occurred. - We were unable to process your request. Please try again or contact us. - Internet connection required - Please connect to the internet before continuing. + 发生错误。 + 我们无法处理您的请求,请重试或联系我们。 + 需要连接网络 + 请连接网络后再试。 确定 同步中 - Copy - Edit - Close - Bitwarden Authenticator - Name + 复制 + 编辑 + 关闭 + Bitwarden 身份验证器 + 名称 添加轮换项目 扫描二维码 输入设置密钥 扫描二维码 将您的相机对准二维码 - 无法扫描二维码。 + 无法扫描二维码 手动输入密钥。 - Cannot add authenticator key? + 无法添加身份验证器密钥? 成功输入密钥后,\n点击「添加 TOTP」即可安全地存储密钥 添加 TOTP 验证器密钥 不,谢谢 - Settings + 设置 启用相机权限以扫描二维码 空列表 您没有任何可显示的项目。 - Add a new code to secure your accounts. - Add code - Cannot read key. - Verification code added - Username - Refresh period - Algorithm + 添加一个新代码来保护您的帐户 + 添加代码 + 无法读取密钥。 + 验证码已添加 + 用户名 + 刷新周期 + 算法 隐藏 显示 - Advanced + 高级选项 折叠高级选项 - Number of digits - Save - The %1$s field is required. + 位数 + 保存 + 需要填写 %1$s 字段 %d 秒 保存中 项目已保存 信息 OTP 类型 - Verification codes - There are no items that match the search + 验证码 + 没有匹配搜索条件的项目 返回 清除 搜索动态密码 - Options - Try again - Appearance - Default (System) - Theme - Dark - Light - Language - The language has been changed to %1$s. Please restart the app to see the change - Secure your accounts with Bitwarden Authenticator + 选项 + 请重试 + 外观样式 + 系统默认 + 主题 + 深色模式 + 浅色模式 + 语言 + 语言已更改为 %1$s,请重新启动 App 以查看更改 + 使用 Bitwarden 身份验证器保护您的帐户 为您所有支持两步验证的帐户获取验证码。 - Use your device camera to scan codes - Scan the QR code in your 2-step verification settings for any account. - Sign in using unique codes + 使用系统相机扫描代码 + 扫描任何帐户的两步验证设置中的二维码。 + 使用唯一的代码登录 当使用两步验证时,您将输入您的用户名和密码以及在此应用中生成的代码。 - Continue - Skip - Get started + 继续 + 跳过 + 开始使用 唯一验证码 - Help - Launch tutorial - %1$s copied + 帮助 + 打开教程 + %1$s 已复制 删除项目 - Item deleted - Delete + 项目已删除 + 删除 您确定要永久删除吗?此操作无法撤销。 - Data - Export + 数据 + 导出 加载中 确认导出 导出的数据包含未加密的格式。请不要在不安全的渠道(如电子邮件)上存储或发送导出的文件。使 用后请立即删除。 - File format + 文件格式 导出密码库出现问题。如果问题持续存在,请从网页版密码库导出。 数据导出成功 - Unlock with %1$s + 使用 %1$s 解锁 生物识别 - Security - Use biometrics to unlock + 安全 + 使用生物识别解锁 生物识别尝试次数过多。 - About - Version - Continue - Bitwarden Help Center + 关于 + 版本 + 继续 + Bitwarden 帮助中心 前往帮助中心吗? 在帮助中心了解更多如何使用 Bitwarden Authenticator 的信息。 隐私政策 - Continue to privacy policy? + 查看隐私政策吗? 在 bitwarden.com 上查看我们的隐私政策。 - Key + 密钥 创建验证码 密钥不能为空。 账户名不能为空。 提交崩溃日志 导入密码库时出现问题。 文件来源 - Import + 导入 密码库导入成功 密钥无效。 收藏 - Favorite - Favorites - Backup + 收藏 + 收藏夹 + 备份 数据备份 - Bitwarden Authenticator data is backed up and can be restored with your regularly scheduled device backups. - Learn more - Importing from 2FAS password protected files is not supported. Try again with an exported file that is not password protected. - 不支持导入 Bitwarden CSV 文件。请使用导出的 JSON 文件重试。 - Download the Bitwarden app - Store all of your logins and sync verification codes directly with the Authenticator app. + Bitwarden 身份验证器数据已备份,并且可以使用您的定期设备备份恢复。 + 进一步了解 + 不支持从 2FAS 密码保护文件导入,请尝试导出不受密码保护的文件。 + 不支持导入 Bitwarden CSV 文件,请使用导出的 JSON 文件重试。 + 下载 Bitwarden App + 保存您所有的登录信息并直接与身份验证器 App 同步验证码。 现在就下载 - Sync with Bitwarden app - Unable to sync codes from the Bitwarden app. Make sure both apps are up-to-date. You can still access your existing codes in the Bitwarden app. + 与 Bitwarden App 同步 + This feature is not yet available for self-hosted users. Learn more + 无法从 Bitwarden App 同步代码,请确保这两个应用程序都是最新的。您仍然可以在 Bitwarden App 中访问您现有的代码。 %1$s | %2$s - Sync with the Bitwarden app - Go to settings - Allow Authenticator app syncing in settings to view all of your verification codes here. - Something went wrong - Please try again - Move to Bitwarden - Default save option - Save to Bitwarden - Save here - None - Select where you would like to save new verification codes. - Confirm - Verification code created - Save this authenticator key here, or add it to a login in your Bitwarden app. - Save option as default - Account synced from Bitwarden app - Add code to Bitwarden - Add code locally - Local codes - Required Information Missing - "Required info is missing (e.g., ‘services’ or ‘secret’). Check your file and try again. Visit bitwarden.com/help for support" - "File Could Not Be Processed" - "File could not be processed. Ensure it’s valid JSON and try again. Need help? Visit bitwarden.com/help" - Get Help + 与 Bitwarden App 同步 + 转到设置 + 允许身份验证器应用在设置中同步以查看您的所有验证码。 + 跳转到应用设置 + 出错了 + 请重试 + 转到 Bitwarden + 默认保存选项 + 保存到 Bitwarden + 另存至此 + 无 + 选择保存新验证码的位置 + 确认 + 验证码已创建 + 将此身份验证器密钥保存到此处,或将其添加到您的 Bitwarden 应用程序的登录中。 + 保存选项为默认值 + 从 Bitwarden App 同步帐户 + 将代码添加到 Bitwarden + 添加本地代码 + 本地代码 + 缺少所需信息 + "缺少所需信息(例如,“服务”或“机密”)。请检查您的文件,然后再试一次。请访问 bitwarden.com/help 以获取支持" + "无法处理文件" + "无法处理文件。请确保它是有效的 JSON 文件后重试。需要帮助吗?请访问 bitwarden.com/help" + 获取帮助 diff --git a/authenticator/src/main/res/values-zh-rTW/strings.xml b/authenticator/src/main/res/values-zh-rTW/strings.xml index 75c2c3c63a..9050c165fa 100644 --- a/authenticator/src/main/res/values-zh-rTW/strings.xml +++ b/authenticator/src/main/res/values-zh-rTW/strings.xml @@ -2,135 +2,137 @@ Authenticator Biometric verification - Cancel + Add item - An error has occurred. - We were unable to process your request. Please try again or contact us. - Internet connection required - Please connect to the internet before continuing. + 發生錯誤。 + 我們無法處理您的請求,請再試一次或聯絡我們。 + 需要網際網路連線 + 請先連線至網際網路再繼續。 OK Syncing - Copy - Edit - Close - Bitwarden Authenticator - Name + 複製 + 編輯 + 關閉 + Bitwarden 驗證器 + 名稱 Add Item Rotation Scan a QR code Enter a setup key Scan QR code Point your camera at the QR code. Cannot scan QR code. - Enter key manually + 手動輸入金鑰 Cannot add authenticator key? Once the key is successfully entered,\nselect Add TOTP to store the key safely Add TOTP Authenticator key No thanks - Settings + 設定 Enable camera permission to use the scanner Empty Item Listing You don\'t have any items to display. - Add a new code to secure your accounts. - Add code - Cannot read key. - Verification code added - Username - Refresh period - Algorithm + 新增驗證碼以保護您的帳戶。 + 新增驗證碼 + 無法讀取金鑰。 + 驗證碼已匯入 + 使用者名稱 + 更新週期 + 演算法 Hide Show - Advanced + 進階 Collapse advanced options - Number of digits - Save - The %1$s field is required. + 位數 + 儲存 + 必須填入 %1$s 欄位。 %d seconds Saving Item saved Information OTP type - Verification codes - There are no items that match the search + 驗證碼 + 您的密碼庫中沒有與搜尋目標一致的項目 Back Clear Search codes - Options - Try again - Appearance - Default (System) - Theme - Dark - Light - Language - The language has been changed to %1$s. Please restart the app to see the change - Secure your accounts with Bitwarden Authenticator + 選項 + 再試一次 + 外觀 + 預設(系統) + 主題 + 深色 + 淺色 + 語言 + 語言已變更為 %1$s。請重新啟動應用程式以查看變更 + 使用 Bitwarden 驗證器保護您的帳戶 Get verification codes for all your accounts that support 2-step verification. - Use your device camera to scan codes - Scan the QR code in your 2-step verification settings for any account. - Sign in using unique codes + 使用您裝置的相機掃描驗證碼 + 掃描您帳戶兩步驟驗證設定中的 QR code。 + When using 2-step verification, you\'ll enter your username and password and a code generated in this app. - Continue - Skip - Get started + 繼續 + 略過 + Unique codes - Help - Launch tutorial - %1$s copied + + + %1$s 已複製 Delete item - Item deleted - Delete + 已刪除項目 + 刪除 Do you really want to permanently delete? This cannot be undone. - Data - Export + 資料 + 匯出 Loading Confirm export This export contains your 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. - File format + 檔案格式 There was a problem exporting your vault. If the problem persists, you\'ll need to export from the web vault. Data exported successfully - Unlock with %1$s + 使用 %1$s 解鎖 Biometrics - Security - Use biometrics to unlock + 安全性 + 使用生物特徵辨識解鎖 Too many failed biometrics attempts. - About - Version - Continue - Bitwarden Help Center + 關於 + 版本 + 繼續 + Bitwarden 說明中心 Continue to Help Center? Learn more about how to use Bitwarden Authenticator on the Help Center. Privacy policy - Continue to privacy policy? + 繼續前往隱私權政策嗎? Check out our privacy policy on bitwarden.com - Key + 金鑰 Create Verification code Key is required. Name is required. Submit crash logs There was a problem importing your vault. File Source - Import + 匯入 Vault import successful Key is invalid. Save as a favorite - Favorite - Favorites - Backup + 我的最愛 + 我的最愛 + 備份 Data backup - Bitwarden Authenticator data is backed up and can be restored with your regularly scheduled device backups. - Learn more - Importing from 2FAS password protected files is not supported. Try again with an exported file that is not password protected. + Bitwarden 驗證器資料已備份,可透過您定期排程的裝置備份進行還原。 + 了解更多 + 不支援從受密碼保護的 2FAS 檔案匯入。請使用未受密碼保護的匯出檔案重試。 Importing Bitwarden CSV files is not supported. Try again with an exported JSON file. - Download the Bitwarden app + 下載 Bitwarden 應用程式 Store all of your logins and sync verification codes directly with the Authenticator app. Download now Sync with Bitwarden app + This feature is not yet available for self-hosted users. Learn more Unable to sync codes from the Bitwarden app. Make sure both apps are up-to-date. You can still access your existing codes in the Bitwarden app. %1$s | %2$s - Sync with the Bitwarden app + 與 Bitwarden 應用程式同步 Go to settings - Allow Authenticator app syncing in settings to view all of your verification codes here. + In order to view all of your verification codes, you’ll need to allow for syncing on all of your accounts. + 前往應用程式設定 Something went wrong Please try again Move to Bitwarden @@ -147,7 +149,7 @@ Add code to Bitwarden Add code locally Local codes - Required Information Missing + 缺少必要資訊 "Required info is missing (e.g., ‘services’ or ‘secret’). Check your file and try again. Visit bitwarden.com/help for support" "File Could Not Be Processed" "File could not be processed. Ensure it’s valid JSON and try again. Need help? Visit bitwarden.com/help" diff --git a/authenticator/src/main/res/values/strings.xml b/authenticator/src/main/res/values/strings.xml index 6bf18030ea..f51a2cea2a 100644 --- a/authenticator/src/main/res/values/strings.xml +++ b/authenticator/src/main/res/values/strings.xml @@ -17,7 +17,7 @@ Add Item Rotation Scan a QR code Enter a setup key - Scan QR code + Scan QR code Point your camera at the QR code. Cannot scan QR code. Enter key manually diff --git a/authenticator/src/main/res/values/styles.xml b/authenticator/src/main/res/values/styles.xml index 92757f7013..fa14a29c21 100644 --- a/authenticator/src/main/res/values/styles.xml +++ b/authenticator/src/main/res/values/styles.xml @@ -2,8 +2,6 @@