From 91f1180be767e16bf1070178df9c6dace71d7c7b Mon Sep 17 00:00:00 2001 From: David Perez Date: Fri, 25 Jul 2025 13:05:18 -0500 Subject: [PATCH] PM-20150, PM-20151: Remove single tap passkey feature flags (#5585) --- .../builder/CredentialEntryBuilderImpl.kt | 8 +- .../di/CredentialProviderModule.kt | 18 ++- .../CredentialProviderProcessorImpl.kt | 13 +-- .../util/CredentialEntryBuilderExtensions.kt | 6 +- .../data/platform/manager/model/FlagKey.kt | 18 --- .../components/FeatureFlagListItems.kt | 7 -- .../builder/CredentialEntryBuilderTest.kt | 22 +--- .../CredentialProviderProcessorTest.kt | 108 ++++++++---------- .../data/platform/manager/FlagKeyTest.kt | 10 -- .../debugmenu/DebugMenuViewModelTest.kt | 4 - ui/src/main/res/values/strings.xml | 2 - 11 files changed, 63 insertions(+), 153 deletions(-) diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/credentials/builder/CredentialEntryBuilderImpl.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/credentials/builder/CredentialEntryBuilderImpl.kt index 7924ffbef5..d7238b8788 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/credentials/builder/CredentialEntryBuilderImpl.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/credentials/builder/CredentialEntryBuilderImpl.kt @@ -16,8 +16,6 @@ import com.x8bit.bitwarden.data.credentials.processor.GET_PASSKEY_INTENT import com.x8bit.bitwarden.data.credentials.processor.GET_PASSWORD_INTENT import com.x8bit.bitwarden.data.credentials.util.setBiometricPromptDataIfSupported import com.x8bit.bitwarden.data.platform.manager.BiometricsEncryptionManager -import com.x8bit.bitwarden.data.platform.manager.FeatureFlagManager -import com.x8bit.bitwarden.data.platform.manager.model.FlagKey import com.x8bit.bitwarden.ui.platform.manager.intent.IntentManager import kotlin.random.Random @@ -27,7 +25,6 @@ import kotlin.random.Random class CredentialEntryBuilderImpl( private val context: Context, private val intentManager: IntentManager, - private val featureFlagManager: FeatureFlagManager, private val biometricsEncryptionManager: BiometricsEncryptionManager, ) : CredentialEntryBuilder { @@ -91,10 +88,7 @@ class CredentialEntryBuilderImpl( .also { builder -> if (!isUserVerified) { builder.setBiometricPromptDataIfSupported( - cipher = biometricsEncryptionManager - .getOrCreateCipher(userId), - isSingleTapAuthEnabled = featureFlagManager - .getFeatureFlag(FlagKey.SingleTapPasskeyAuthentication), + cipher = biometricsEncryptionManager.getOrCreateCipher(userId), ) } } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/credentials/di/CredentialProviderModule.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/credentials/di/CredentialProviderModule.kt index d039ceae99..407ef5c2c4 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/credentials/di/CredentialProviderModule.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/credentials/di/CredentialProviderModule.kt @@ -53,18 +53,16 @@ object CredentialProviderModule { dispatcherManager: DispatcherManager, intentManager: IntentManager, biometricsEncryptionManager: BiometricsEncryptionManager, - featureFlagManager: FeatureFlagManager, clock: Clock, ): CredentialProviderProcessor = CredentialProviderProcessorImpl( - context, - authRepository, - bitwardenCredentialManager, - intentManager, - clock, - biometricsEncryptionManager, - featureFlagManager, - dispatcherManager, + context = context, + authRepository = authRepository, + bitwardenCredentialManager = bitwardenCredentialManager, + intentManager = intentManager, + clock = clock, + biometricsEncryptionManager = biometricsEncryptionManager, + dispatcherManager = dispatcherManager, ) @Provides @@ -108,12 +106,10 @@ object CredentialProviderModule { fun provideCredentialEntryBuilder( @ApplicationContext context: Context, intentManager: IntentManager, - featureFlagManager: FeatureFlagManager, biometricsEncryptionManager: BiometricsEncryptionManager, ): CredentialEntryBuilder = CredentialEntryBuilderImpl( context = context, intentManager = intentManager, - featureFlagManager = featureFlagManager, biometricsEncryptionManager = biometricsEncryptionManager, ) diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/credentials/processor/CredentialProviderProcessorImpl.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/credentials/processor/CredentialProviderProcessorImpl.kt index 4a10a0b8c9..96d8786ee6 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/credentials/processor/CredentialProviderProcessorImpl.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/credentials/processor/CredentialProviderProcessorImpl.kt @@ -33,8 +33,6 @@ import com.x8bit.bitwarden.data.auth.repository.model.UserState import com.x8bit.bitwarden.data.credentials.manager.BitwardenCredentialManager import com.x8bit.bitwarden.data.credentials.model.GetCredentialsRequest import com.x8bit.bitwarden.data.platform.manager.BiometricsEncryptionManager -import com.x8bit.bitwarden.data.platform.manager.FeatureFlagManager -import com.x8bit.bitwarden.data.platform.manager.model.FlagKey import com.x8bit.bitwarden.ui.platform.manager.intent.IntentManager import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch @@ -60,7 +58,6 @@ class CredentialProviderProcessorImpl( private val intentManager: IntentManager, private val clock: Clock, private val biometricsEncryptionManager: BiometricsEncryptionManager, - private val featureFlagManager: FeatureFlagManager, dispatcherManager: DispatcherManager, ) : CredentialProviderProcessor { @@ -186,9 +183,9 @@ class CredentialProviderProcessorImpl( .Builder( accountName = accountName, pendingIntent = intentManager.createFido2CreationPendingIntent( - CREATE_PASSKEY_INTENT, - userId, - requestCode.getAndIncrement(), + action = CREATE_PASSKEY_INTENT, + userId = userId, + requestCode = requestCode.getAndIncrement(), ), ) .setDescription( @@ -202,9 +199,7 @@ class CredentialProviderProcessorImpl( .setLastUsedTime(if (isActive) clock.instant() else null) .setAutoSelectAllowed(true) - if (isVaultUnlocked && - featureFlagManager.getFeatureFlag(FlagKey.SingleTapPasskeyCreation) - ) { + if (isVaultUnlocked) { biometricsEncryptionManager .getOrCreateCipher(userId) ?.let { entryBuilder.setBiometricPromptDataIfSupported(cipher = it) } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/credentials/util/CredentialEntryBuilderExtensions.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/credentials/util/CredentialEntryBuilderExtensions.kt index f489bad452..5f431b6575 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/credentials/util/CredentialEntryBuilderExtensions.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/credentials/util/CredentialEntryBuilderExtensions.kt @@ -14,12 +14,8 @@ import javax.crypto.Cipher */ fun PublicKeyCredentialEntry.Builder.setBiometricPromptDataIfSupported( cipher: Cipher?, - isSingleTapAuthEnabled: Boolean, ): PublicKeyCredentialEntry.Builder = - if (isBuildVersionAtLeast(Build.VERSION_CODES.VANILLA_ICE_CREAM) && - cipher != null && - isSingleTapAuthEnabled - ) { + if (isBuildVersionAtLeast(Build.VERSION_CODES.VANILLA_ICE_CREAM) && cipher != null) { setBiometricPromptData( biometricPromptData = buildPromptDataWithCipher(cipher), ) 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 337ed39cac..e8fd816a9a 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 @@ -24,8 +24,6 @@ sealed class FlagKey { EmailVerification, CredentialExchangeProtocolImport, CredentialExchangeProtocolExport, - SingleTapPasskeyCreation, - SingleTapPasskeyAuthentication, RestrictCipherItemDeletion, UserManagedPrivilegedApps, RemoveCardPolicy, @@ -67,22 +65,6 @@ sealed class FlagKey { override val defaultValue: Boolean = false } - /** - * Data object holding the feature flag key to enable single tap passkey creation. - */ - data object SingleTapPasskeyCreation : FlagKey() { - override val keyName: String = "single-tap-passkey-creation" - override val defaultValue: Boolean = false - } - - /** - * Data object holding the feature flag key to enable single tap passkey authentication. - */ - data object SingleTapPasskeyAuthentication : FlagKey() { - override val keyName: String = "single-tap-passkey-authentication" - override val defaultValue: Boolean = false - } - /** * Data object holding the feature flag key to enable the restriction of cipher item deletion */ 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 9b2249cc80..8921294634 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 @@ -29,8 +29,6 @@ fun FlagKey.ListItemContent( FlagKey.CredentialExchangeProtocolImport, FlagKey.CredentialExchangeProtocolExport, FlagKey.CipherKeyEncryption, - FlagKey.SingleTapPasskeyCreation, - FlagKey.SingleTapPasskeyAuthentication, FlagKey.RestrictCipherItemDeletion, FlagKey.UserManagedPrivilegedApps, FlagKey.RemoveCardPolicy, @@ -79,11 +77,6 @@ private fun FlagKey.getDisplayLabel(): String = when (this) { FlagKey.CredentialExchangeProtocolImport -> stringResource(BitwardenString.cxp_import) FlagKey.CredentialExchangeProtocolExport -> stringResource(BitwardenString.cxp_export) FlagKey.CipherKeyEncryption -> stringResource(BitwardenString.cipher_key_encryption) - FlagKey.SingleTapPasskeyCreation -> stringResource(BitwardenString.single_tap_passkey_creation) - FlagKey.SingleTapPasskeyAuthentication -> { - stringResource(BitwardenString.single_tap_passkey_authentication) - } - FlagKey.RestrictCipherItemDeletion -> stringResource(BitwardenString.restrict_item_deletion) FlagKey.UserManagedPrivilegedApps -> { stringResource(BitwardenString.user_trusted_privileged_app_management) diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/data/credentials/builder/CredentialEntryBuilderTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/data/credentials/builder/CredentialEntryBuilderTest.kt index ce0f5f832e..21cb6ad213 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/data/credentials/builder/CredentialEntryBuilderTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/data/credentials/builder/CredentialEntryBuilderTest.kt @@ -13,8 +13,6 @@ import com.bitwarden.fido.Fido2CredentialAutofillView import com.bitwarden.vault.CipherListView import com.bitwarden.vault.CipherListViewType import com.x8bit.bitwarden.data.platform.manager.BiometricsEncryptionManager -import com.x8bit.bitwarden.data.platform.manager.FeatureFlagManager -import com.x8bit.bitwarden.data.platform.manager.model.FlagKey import com.x8bit.bitwarden.data.util.mockBuilder import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockCipherListView import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockFido2CredentialAutofillView @@ -59,14 +57,12 @@ class CredentialEntryBuilderTest { ) } returns mockGetPasswordCredentialIntent } - private val mockFeatureFlagManager = mockk() private val mockBiometricsEncryptionManager = mockk() private val mockBeginGetPublicKeyOption = mockk() private val mockBeginGetPasswordOption = mockk() private val credentialEntryBuilder = CredentialEntryBuilderImpl( context = mockContext, intentManager = mockIntentManager, - featureFlagManager = mockFeatureFlagManager, biometricsEncryptionManager = mockBiometricsEncryptionManager, ) private val mockPublicKeyCredentialEntry = mockk(relaxed = true) @@ -144,9 +140,6 @@ class CredentialEntryBuilderTest { createMockFido2CredentialAutofillView(number = 1), ) - every { - mockFeatureFlagManager.getFeatureFlag(FlagKey.SingleTapPasskeyAuthentication) - } returns false every { mockBiometricsEncryptionManager.getOrCreateCipher("userId") } returns null @@ -183,11 +176,8 @@ class CredentialEntryBuilderTest { createMockFido2CredentialAutofillView(number = 1), ) - // Verify biometric prompt data is not set when flag is false, buildVersion is at least 35, + // Verify biometric prompt data is not set when buildVersion is at least 35 // and cipher is null. - every { - mockFeatureFlagManager.getFeatureFlag(FlagKey.SingleTapPasskeyAuthentication) - } returns false every { mockBiometricsEncryptionManager.getOrCreateCipher("userId") } returns null @@ -204,11 +194,7 @@ class CredentialEntryBuilderTest { anyConstructed().setBiometricPromptData(any()) } - // Verify biometric prompt data is not set when flag is true, buildVersion is below 35, and - // cipher is null. - every { - mockFeatureFlagManager.getFeatureFlag(FlagKey.SingleTapPasskeyAuthentication) - } returns true + // Verify biometric prompt data is not set when buildVersion is below 35 and cipher is null. credentialEntryBuilder .buildPublicKeyCredentialEntries( userId = "userId", @@ -221,7 +207,7 @@ class CredentialEntryBuilderTest { anyConstructed().setBiometricPromptData(any()) } - // Verify biometric prompt data is not set when flag is true, buildVersion is at least 35, + // Verify biometric prompt data is not set when buildVersion is at least 35 // and cipher is null every { isBuildVersionAtLeast(any()) } returns true credentialEntryBuilder @@ -250,7 +236,7 @@ class CredentialEntryBuilderTest { anyConstructed().setBiometricPromptData(any()) } - // Verify biometric prompt data is set when flag is true, buildVersion is >= 35, cipher is + // Verify biometric prompt data is set when buildVersion is >= 35, cipher is // not null, and user is not verified credentialEntryBuilder .buildPublicKeyCredentialEntries( diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/data/credentials/processor/CredentialProviderProcessorTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/data/credentials/processor/CredentialProviderProcessorTest.kt index 1ca600cefa..43c6bc1f06 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/data/credentials/processor/CredentialProviderProcessorTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/data/credentials/processor/CredentialProviderProcessorTest.kt @@ -32,9 +32,7 @@ import com.x8bit.bitwarden.data.auth.repository.model.UserState import com.x8bit.bitwarden.data.auth.repository.model.VaultUnlockType import com.x8bit.bitwarden.data.credentials.manager.BitwardenCredentialManager import com.x8bit.bitwarden.data.platform.manager.BiometricsEncryptionManager -import com.x8bit.bitwarden.data.platform.manager.FeatureFlagManager import com.x8bit.bitwarden.data.platform.manager.model.FirstTimeState -import com.x8bit.bitwarden.data.platform.manager.model.FlagKey import com.x8bit.bitwarden.ui.platform.manager.intent.IntentManager import io.mockk.coEvery import io.mockk.every @@ -74,10 +72,6 @@ class CredentialProviderProcessorTest { private val intentManager: IntentManager = mockk() private val dispatcherManager: DispatcherManager = FakeDispatcherManager() private val biometricsEncryptionManager: BiometricsEncryptionManager = mockk() - private val featureFlagManager: FeatureFlagManager = mockk { - every { getFeatureFlag(FlagKey.SingleTapPasskeyCreation) } returns false - every { getFeatureFlag(FlagKey.SingleTapPasskeyAuthentication) } returns false - } private val cancellationSignal: CancellationSignal = mockk() private val clock = FIXED_CLOCK @@ -85,14 +79,13 @@ class CredentialProviderProcessorTest { @BeforeEach fun setUp() { credentialProviderProcessor = CredentialProviderProcessorImpl( - context, - authRepository, - bitwardenCredentialManager, - intentManager, - clock, - biometricsEncryptionManager, - featureFlagManager, - dispatcherManager, + context = context, + authRepository = authRepository, + bitwardenCredentialManager = bitwardenCredentialManager, + intentManager = intentManager, + clock = clock, + biometricsEncryptionManager = biometricsEncryptionManager, + dispatcherManager = dispatcherManager, ) mockkStatic(::isBuildVersionAtLeast) @@ -144,9 +137,9 @@ class CredentialProviderProcessorTest { every { callback.onError(capture(captureSlot)) } just runs credentialProviderProcessor.processCreateCredentialRequest( - request, - cancellationSignal, - callback, + request = request, + cancellationSignal = cancellationSignal, + callback = callback, ) verify(exactly = 1) { callback.onError(any()) } @@ -173,9 +166,9 @@ class CredentialProviderProcessorTest { every { callback.onError(capture(captureSlot)) } just runs credentialProviderProcessor.processCreateCredentialRequest( - request, - cancellationSignal, - callback, + request = request, + cancellationSignal = cancellationSignal, + callback = callback, ) verify(exactly = 1) { callback.onError(any()) } @@ -201,9 +194,9 @@ class CredentialProviderProcessorTest { every { callback.onError(capture(captureSlot)) } just runs credentialProviderProcessor.processCreateCredentialRequest( - request, - cancellationSignal, - callback, + request = request, + cancellationSignal = cancellationSignal, + callback = callback, ) verify(exactly = 1) { callback.onError(any()) } @@ -228,11 +221,14 @@ class CredentialProviderProcessorTest { every { context.getString(any(), any()) } returns "mockDescription" every { intentManager.createFido2CreationPendingIntent( - any(), - any(), - any(), + action = any(), + userId = any(), + requestCode = any(), ) } returns mockIntent + every { + biometricsEncryptionManager.getOrCreateCipher(userId = any()) + } returns mockk() every { cancellationSignal.setOnCancelListener(any()) } just runs every { request.candidateQueryData } returns candidateQueryData every { @@ -241,9 +237,9 @@ class CredentialProviderProcessorTest { every { callback.onResult(capture(captureSlot)) } just runs credentialProviderProcessor.processCreateCredentialRequest( - request, - cancellationSignal, - callback, + request = request, + cancellationSignal = cancellationSignal, + callback = callback, ) verify(exactly = 1) { callback.onResult(any()) } @@ -275,21 +271,20 @@ class CredentialProviderProcessorTest { every { callback.onResult(capture(captureSlot)) } just runs every { intentManager.createFido2CreationPendingIntent( - any(), - any(), - any(), + action = any(), + userId = any(), + requestCode = any(), ) } returns mockIntent every { biometricsEncryptionManager.getOrCreateCipher(any()) } returns mockk() - every { featureFlagManager.getFeatureFlag(FlagKey.SingleTapPasskeyCreation) } returns true every { isBuildVersionAtLeast(Build.VERSION_CODES.VANILLA_ICE_CREAM) } returns true credentialProviderProcessor.processCreateCredentialRequest( - request, - cancellationSignal, - callback, + request = request, + cancellationSignal = cancellationSignal, + callback = callback, ) verify(exactly = 1) { callback.onResult(any()) } @@ -324,24 +319,13 @@ class CredentialProviderProcessorTest { // Verify entries have no biometric prompt data when cipher is null every { biometricsEncryptionManager.getOrCreateCipher(any()) } returns null credentialProviderProcessor.processCreateCredentialRequest( - request, - cancellationSignal, - callback, + request = request, + cancellationSignal = cancellationSignal, + callback = callback, ) assertTrue( captureSlot.captured.createEntries.all { it.biometricPromptData == null }, ) { "Expected all entries to have null biometric prompt data." } - - // Disable single tap feature flag to verify all entries do not have biometric prompt data - every { featureFlagManager.getFeatureFlag(FlagKey.SingleTapPasskeyCreation) } returns false - credentialProviderProcessor.processCreateCredentialRequest( - request, - cancellationSignal, - callback, - ) - assertTrue( - captureSlot.captured.createEntries.all { it.biometricPromptData == null }, - ) { "Expected all entries to not have biometric prompt data." } } @Test @@ -362,9 +346,9 @@ class CredentialProviderProcessorTest { every { callback.onError(capture(captureSlot)) } just runs credentialProviderProcessor.processGetCredentialRequest( - request, - cancellationSignal, - callback, + request = request, + cancellationSignal = cancellationSignal, + callback = callback, ) verify(exactly = 1) { callback.onError(any()) } @@ -412,9 +396,9 @@ class CredentialProviderProcessorTest { ) credentialProviderProcessor.processGetCredentialRequest( - request, - cancellationSignal, - callback, + request = request, + cancellationSignal = cancellationSignal, + callback = callback, ) verify(exactly = 0) { callback.onError(any()) } @@ -461,9 +445,9 @@ class CredentialProviderProcessorTest { } returns Result.failure(Exception("Error decrypting credentials.")) credentialProviderProcessor.processGetCredentialRequest( - request, - cancellationSignal, - callback, + request = request, + cancellationSignal = cancellationSignal, + callback = callback, ) verify(exactly = 1) { callback.onError(any()) } @@ -503,9 +487,9 @@ class CredentialProviderProcessorTest { every { callback.onResult(capture(captureSlot)) } just runs credentialProviderProcessor.processGetCredentialRequest( - request, - cancellationSignal, - callback, + request = request, + cancellationSignal = cancellationSignal, + callback = callback, ) assertEquals(1, captureSlot.captured.credentialEntries.size) 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 ce0e0af2d7..227369bdb0 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 @@ -25,14 +25,6 @@ class FlagKeyTest { FlagKey.CipherKeyEncryption.keyName, "cipher-key-encryption", ) - assertEquals( - FlagKey.SingleTapPasskeyCreation.keyName, - "single-tap-passkey-creation", - ) - assertEquals( - FlagKey.SingleTapPasskeyAuthentication.keyName, - "single-tap-passkey-authentication", - ) assertEquals( FlagKey.RestrictCipherItemDeletion.keyName, "pm-15493-restrict-item-deletion-to-can-manage-permission", @@ -54,8 +46,6 @@ class FlagKeyTest { FlagKey.EmailVerification, FlagKey.CredentialExchangeProtocolImport, FlagKey.CredentialExchangeProtocolExport, - FlagKey.SingleTapPasskeyCreation, - FlagKey.SingleTapPasskeyAuthentication, FlagKey.CipherKeyEncryption, FlagKey.RestrictCipherItemDeletion, FlagKey.UserManagedPrivilegedApps, 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 9d0e7e0c1b..5f2b5ed14c 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 @@ -147,8 +147,6 @@ private val DEFAULT_MAP_VALUE: ImmutableMap, Any> = persistentMapOf FlagKey.EmailVerification to true, FlagKey.CredentialExchangeProtocolImport to true, FlagKey.CredentialExchangeProtocolExport to true, - FlagKey.SingleTapPasskeyCreation to true, - FlagKey.SingleTapPasskeyAuthentication to true, FlagKey.RestrictCipherItemDeletion to true, FlagKey.UserManagedPrivilegedApps to true, FlagKey.RemoveCardPolicy to true, @@ -158,8 +156,6 @@ private val UPDATED_MAP_VALUE: ImmutableMap, Any> = persistentMapOf FlagKey.EmailVerification to false, FlagKey.CredentialExchangeProtocolImport to false, FlagKey.CredentialExchangeProtocolExport to false, - FlagKey.SingleTapPasskeyCreation to false, - FlagKey.SingleTapPasskeyAuthentication to false, FlagKey.RestrictCipherItemDeletion to false, FlagKey.UserManagedPrivilegedApps to false, FlagKey.RemoveCardPolicy to false, diff --git a/ui/src/main/res/values/strings.xml b/ui/src/main/res/values/strings.xml index 13fc401881..0c826a789c 100644 --- a/ui/src/main/res/values/strings.xml +++ b/ui/src/main/res/values/strings.xml @@ -865,8 +865,6 @@ Do you want to switch to this account? You’ll only need to set up Authenticator Key for logins that require two-factor authentication with a code. The key will continuously generate six-digit codes you can use to log in. 3 OF 3 You must add a web address to use autofill to access this account. - Single tap passkey creation - Single tap passkey sign-on Learn about new logins We\'ll walk you through the key features to add a new login. Explore the generator