From 13b41d104a84aebb0213cb90edeeef8112300552 Mon Sep 17 00:00:00 2001 From: Maciej Zieniuk Date: Fri, 27 Mar 2026 21:59:51 +0000 Subject: [PATCH] behind feature flag --- .../ui/tools/feature/send/SendScreen.kt | 16 ++++++++++------ .../ui/tools/feature/send/SendViewModel.kt | 6 ++++++ .../bitwarden/core/data/manager/model/FlagKey.kt | 9 +++++++++ .../components/debug/FeatureFlagListItems.kt | 2 ++ ui/src/main/res/values/strings_non_localized.xml | 1 + 5 files changed, 28 insertions(+), 6 deletions(-) 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 2c99ddc38c..f03ae40d92 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 @@ -122,6 +122,7 @@ fun SendScreen( SendDialogs( dialogState = state.dialogState, + isSendFolderEnabled = state.isSendFolderEnabled, onAddSendSelected = { viewModel.trySendAction(SendAction.AddSendSelected(it)) }, onDismissRequest = { viewModel.trySendAction(SendAction.DismissDialog) }, ) @@ -211,6 +212,7 @@ fun SendScreen( @Composable private fun SendDialogs( dialogState: SendState.DialogState?, + isSendFolderEnabled: Boolean, onAddSendSelected: (SendItemType) -> Unit, onDismissRequest: () -> Unit, ) { @@ -230,12 +232,14 @@ private fun SendDialogs( title = stringResource(id = BitwardenString.type), onDismissRequest = onDismissRequest, ) { - SendItemType.entries.forEach { - BitwardenBasicDialogRow( - text = it.selectionText(), - onClick = { onAddSendSelected(it) }, - ) - } + SendItemType.entries + .filter { it != SendItemType.FOLDER || isSendFolderEnabled } + .forEach { + BitwardenBasicDialogRow( + text = it.selectionText(), + onClick = { onAddSendSelected(it) }, + ) + } } null -> Unit diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/SendViewModel.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/SendViewModel.kt index ecd920976d..e5b60d1224 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/SendViewModel.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/tools/feature/send/SendViewModel.kt @@ -16,8 +16,10 @@ import com.bitwarden.ui.platform.resource.BitwardenDrawable import com.bitwarden.ui.platform.resource.BitwardenString import com.bitwarden.ui.util.Text import com.bitwarden.ui.util.asText +import com.bitwarden.core.data.manager.model.FlagKey import com.x8bit.bitwarden.data.auth.repository.AuthRepository import com.x8bit.bitwarden.data.auth.repository.model.UserState +import com.x8bit.bitwarden.data.platform.manager.FeatureFlagManager import com.x8bit.bitwarden.data.platform.manager.PolicyManager import com.x8bit.bitwarden.data.platform.manager.clipboard.BitwardenClipboardManager import com.x8bit.bitwarden.data.platform.manager.network.NetworkConnectionManager @@ -59,6 +61,7 @@ class SendViewModel @Inject constructor( private val environmentRepo: EnvironmentRepository, private val vaultRepo: VaultRepository, private val networkConnectionManager: NetworkConnectionManager, + featureFlagManager: FeatureFlagManager, ) : BaseViewModel( // We load the state from the savedStateHandle for testing purposes. initialState = savedStateHandle[KEY_STATE] @@ -71,6 +74,8 @@ class SendViewModel @Inject constructor( .any(), isRefreshing = false, isPremiumUser = authRepo.userStateFlow.value?.activeAccount?.isPremium == true, + isSendFolderEnabled = featureFlagManager + .getFeatureFlag(key = FlagKey.SendFolder), ), ) { @@ -475,6 +480,7 @@ data class SendState( val policyDisablesSend: Boolean, val isRefreshing: Boolean, val isPremiumUser: Boolean, + val isSendFolderEnabled: Boolean, ) : Parcelable { /** diff --git a/core/src/main/kotlin/com/bitwarden/core/data/manager/model/FlagKey.kt b/core/src/main/kotlin/com/bitwarden/core/data/manager/model/FlagKey.kt index bed22817e5..0791e3771d 100644 --- a/core/src/main/kotlin/com/bitwarden/core/data/manager/model/FlagKey.kt +++ b/core/src/main/kotlin/com/bitwarden/core/data/manager/model/FlagKey.kt @@ -38,6 +38,7 @@ sealed class FlagKey { ArchiveItems, SendEmailVerification, MobilePremiumUpgrade, + SendFolder, ) } } @@ -116,6 +117,14 @@ sealed class FlagKey { override val defaultValue: Boolean = false } + /** + * Data object holding the feature flag key for the Send Folder feature. + */ + data object SendFolder : FlagKey() { + override val keyName: String = "innovation-sprint-2026-send-folder" + override val defaultValue: Boolean = false + } + //region Dummy keys for testing /** * Data object holding the key for a [Boolean] flag to be used in tests. diff --git a/ui/src/main/kotlin/com/bitwarden/ui/platform/components/debug/FeatureFlagListItems.kt b/ui/src/main/kotlin/com/bitwarden/ui/platform/components/debug/FeatureFlagListItems.kt index 84193580aa..c81e0785b7 100644 --- a/ui/src/main/kotlin/com/bitwarden/ui/platform/components/debug/FeatureFlagListItems.kt +++ b/ui/src/main/kotlin/com/bitwarden/ui/platform/components/debug/FeatureFlagListItems.kt @@ -32,6 +32,7 @@ fun FlagKey.ListItemContent( FlagKey.ArchiveItems, FlagKey.SendEmailVerification, FlagKey.MobilePremiumUpgrade, + FlagKey.SendFolder, -> { @Suppress("UNCHECKED_CAST") BooleanFlagItem( @@ -85,4 +86,5 @@ private fun FlagKey.getDisplayLabel(): String = when (this) { FlagKey.ArchiveItems -> stringResource(BitwardenString.archive_items) FlagKey.SendEmailVerification -> stringResource(BitwardenString.send_email_verification) FlagKey.MobilePremiumUpgrade -> stringResource(BitwardenString.mobile_premium_upgrade) + FlagKey.SendFolder -> stringResource(BitwardenString.send_folder) } diff --git a/ui/src/main/res/values/strings_non_localized.xml b/ui/src/main/res/values/strings_non_localized.xml index 206100c289..ea3a7786bf 100644 --- a/ui/src/main/res/values/strings_non_localized.xml +++ b/ui/src/main/res/values/strings_non_localized.xml @@ -46,6 +46,7 @@ Trigger cookie acquisition Clear SSO cookies Mobile Premium Upgrade + Send Folder