PM-24176: Consolidate all FlagKeys (#5593)

This commit is contained in:
David Perez
2025-07-28 13:05:55 -05:00
committed by GitHub
parent 517198b265
commit f589546e6a
56 changed files with 105 additions and 149 deletions

View File

@@ -1,6 +1,6 @@
package com.bitwarden.authenticator.data.platform.datasource.disk
import com.bitwarden.authenticator.data.platform.manager.model.FlagKey
import com.bitwarden.core.data.manager.model.FlagKey
/**
* Disk data source for saved feature flag overrides.

View File

@@ -1,7 +1,7 @@
package com.bitwarden.authenticator.data.platform.datasource.disk
import android.content.SharedPreferences
import com.bitwarden.authenticator.data.platform.manager.model.FlagKey
import com.bitwarden.core.data.manager.model.FlagKey
import com.bitwarden.data.datasource.disk.BaseDiskSource
/**

View File

@@ -1,7 +1,7 @@
package com.bitwarden.authenticator.data.platform.manager
import com.bitwarden.authenticator.data.platform.manager.model.FlagKey
import com.bitwarden.authenticator.data.platform.repository.DebugMenuRepository
import com.bitwarden.core.data.manager.model.FlagKey
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map

View File

@@ -1,6 +1,6 @@
package com.bitwarden.authenticator.data.platform.manager
import com.bitwarden.authenticator.data.platform.manager.model.FlagKey
import com.bitwarden.core.data.manager.model.FlagKey
import kotlinx.coroutines.flow.Flow
/**

View File

@@ -1,6 +1,6 @@
package com.bitwarden.authenticator.data.platform.manager
import com.bitwarden.authenticator.data.platform.manager.model.FlagKey
import com.bitwarden.core.data.manager.model.FlagKey
import com.bitwarden.data.datasource.disk.model.ServerConfig
import com.bitwarden.data.repository.ServerConfigRepository
import kotlinx.coroutines.flow.Flow

View File

@@ -1,60 +0,0 @@
package com.bitwarden.authenticator.data.platform.manager.model
/**
* Class to hold feature flag keys.
*/
sealed class FlagKey<out T : Any> {
/**
* The string value of the given key. This must match the network value.
*/
abstract val keyName: String
/**
* The value to be used if the flags value cannot be determined or is not remotely configured.
*/
abstract val defaultValue: T
@Suppress("UndocumentedPublicClass")
companion object {
/**
* List of all flag keys to consider
*/
val activeFlags: List<FlagKey<*>> by lazy {
listOf(
BitwardenAuthenticationEnabled,
)
}
}
/**
* Indicates the state of Bitwarden authentication.
*/
data object BitwardenAuthenticationEnabled : FlagKey<Boolean>() {
override val keyName: String = "bitwarden-authentication-enabled"
override val defaultValue: Boolean = false
}
/**
* Data object holding the key for a [Boolean] flag to be used in tests.
*/
data object DummyBoolean : FlagKey<Boolean>() {
override val keyName: String = "dummy-boolean"
override val defaultValue: Boolean = false
}
/**
* Data object holding the key for an [Int] flag to be used in tests.
*/
data object DummyInt : FlagKey<Int>() {
override val keyName: String = "dummy-int"
override val defaultValue: Int = Int.MIN_VALUE
}
/**
* Data object holding the key for a [String] flag to be used in tests.
*/
data object DummyString : FlagKey<String>() {
override val keyName: String = "dummy-string"
override val defaultValue: String = "defaultValue"
}
}

View File

@@ -1,6 +1,6 @@
package com.bitwarden.authenticator.data.platform.repository
import com.bitwarden.authenticator.data.platform.manager.model.FlagKey
import com.bitwarden.core.data.manager.model.FlagKey
import kotlinx.coroutines.flow.Flow
/**

View File

@@ -3,7 +3,7 @@ package com.bitwarden.authenticator.data.platform.repository
import com.bitwarden.authenticator.BuildConfig
import com.bitwarden.authenticator.data.platform.datasource.disk.FeatureFlagOverrideDiskSource
import com.bitwarden.authenticator.data.platform.manager.getFlagValueOrDefault
import com.bitwarden.authenticator.data.platform.manager.model.FlagKey
import com.bitwarden.core.data.manager.model.FlagKey
import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow
import com.bitwarden.data.repository.ServerConfigRepository
import kotlinx.coroutines.flow.Flow
@@ -36,7 +36,7 @@ class DebugMenuRepositoryImpl(
override fun resetFeatureFlagOverrides() {
val currentServerConfig = serverConfigRepository.serverConfigStateFlow.value
FlagKey.activeFlags.forEach { flagKey ->
FlagKey.activeAuthenticatorFlags.forEach { flagKey ->
updateFeatureFlag(
flagKey,
currentServerConfig.getFlagValueOrDefault(flagKey),

View File

@@ -21,13 +21,13 @@ import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.bitwarden.authenticator.data.platform.manager.model.FlagKey
import com.bitwarden.authenticator.ui.platform.components.appbar.AuthenticatorTopAppBar
import com.bitwarden.authenticator.ui.platform.components.button.AuthenticatorFilledButton
import com.bitwarden.authenticator.ui.platform.components.header.BitwardenListHeaderText
import com.bitwarden.authenticator.ui.platform.components.scaffold.BitwardenScaffold
import com.bitwarden.authenticator.ui.platform.feature.debugmenu.components.ListItemContent
import com.bitwarden.authenticator.ui.platform.theme.AuthenticatorTheme
import com.bitwarden.core.data.manager.model.FlagKey
import com.bitwarden.ui.platform.base.util.EventsEffect
import com.bitwarden.ui.platform.base.util.standardHorizontalMargin
import com.bitwarden.ui.platform.components.appbar.NavigationIcon

View File

@@ -2,8 +2,8 @@ package com.bitwarden.authenticator.ui.platform.feature.debugmenu
import androidx.lifecycle.viewModelScope
import com.bitwarden.authenticator.data.platform.manager.FeatureFlagManager
import com.bitwarden.authenticator.data.platform.manager.model.FlagKey
import com.bitwarden.authenticator.data.platform.repository.DebugMenuRepository
import com.bitwarden.core.data.manager.model.FlagKey
import com.bitwarden.ui.platform.base.BaseViewModel
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.Job
@@ -30,7 +30,7 @@ class DebugMenuViewModel @Inject constructor(
init {
combine(
flows = FlagKey.activeFlags.map { flagKey ->
flows = FlagKey.activeAuthenticatorFlags.map { flagKey ->
featureFlagManager.getFeatureFlagFlow(flagKey).map { flagKey to it }
},
) { DebugMenuAction.Internal.UpdateFeatureFlagMap(it.toMap()) }

View File

@@ -3,8 +3,8 @@ package com.bitwarden.authenticator.ui.platform.feature.debugmenu.components
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import com.bitwarden.authenticator.data.platform.manager.model.FlagKey
import com.bitwarden.authenticator.ui.platform.components.toggle.BitwardenWideSwitch
import com.bitwarden.core.data.manager.model.FlagKey
import com.bitwarden.ui.platform.resource.BitwardenString
/**
@@ -23,6 +23,13 @@ fun <T : Any> FlagKey<T>.ListItemContent(
-> Unit
FlagKey.BitwardenAuthenticationEnabled,
FlagKey.CipherKeyEncryption,
FlagKey.CredentialExchangeProtocolExport,
FlagKey.CredentialExchangeProtocolImport,
FlagKey.EmailVerification,
FlagKey.RemoveCardPolicy,
FlagKey.RestrictCipherItemDeletion,
FlagKey.UserManagedPrivilegedApps,
-> BooleanFlagItem(
label = flagKey.getDisplayLabel(),
key = flagKey as FlagKey<Boolean>,
@@ -60,6 +67,17 @@ private fun <T : Any> FlagKey<T>.getDisplayLabel(): String = when (this) {
FlagKey.DummyString,
-> this.keyName
FlagKey.BitwardenAuthenticationEnabled ->
FlagKey.EmailVerification -> stringResource(BitwardenString.email_verification)
FlagKey.CredentialExchangeProtocolImport -> stringResource(BitwardenString.cxp_import)
FlagKey.CredentialExchangeProtocolExport -> stringResource(BitwardenString.cxp_export)
FlagKey.CipherKeyEncryption -> stringResource(BitwardenString.cipher_key_encryption)
FlagKey.RestrictCipherItemDeletion -> stringResource(BitwardenString.restrict_item_deletion)
FlagKey.UserManagedPrivilegedApps -> {
stringResource(BitwardenString.user_trusted_privileged_app_management)
}
FlagKey.RemoveCardPolicy -> stringResource(BitwardenString.remove_card_policy)
FlagKey.BitwardenAuthenticationEnabled -> {
stringResource(BitwardenString.bitwarden_authentication_enabled)
}
}

View File

@@ -1,7 +1,7 @@
package com.bitwarden.authenticator.data.platform.datasource.disk
import androidx.core.content.edit
import com.bitwarden.authenticator.data.platform.manager.model.FlagKey
import com.bitwarden.core.data.manager.model.FlagKey
import com.bitwarden.data.datasource.disk.base.FakeSharedPreferences
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Assertions.assertFalse

View File

@@ -1,8 +1,8 @@
package com.bitwarden.authenticator.data.platform.manager
import app.cash.turbine.test
import com.bitwarden.authenticator.data.platform.manager.model.FlagKey
import com.bitwarden.authenticator.data.platform.repository.DebugMenuRepository
import com.bitwarden.core.data.manager.model.FlagKey
import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow
import io.mockk.coEvery
import io.mockk.coVerify

View File

@@ -1,8 +1,8 @@
package com.bitwarden.authenticator.data.platform.manager
import app.cash.turbine.test
import com.bitwarden.authenticator.data.platform.manager.model.FlagKey
import com.bitwarden.authenticator.data.platform.repository.util.FakeServerConfigRepository
import com.bitwarden.core.data.manager.model.FlagKey
import com.bitwarden.data.datasource.disk.model.ServerConfig
import com.bitwarden.network.model.ConfigResponseJson
import com.bitwarden.network.model.ConfigResponseJson.EnvironmentJson

View File

@@ -1,27 +0,0 @@
package com.bitwarden.authenticator.data.platform.manager
import com.bitwarden.authenticator.data.platform.manager.model.FlagKey
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Assertions.assertTrue
import org.junit.jupiter.api.Test
class FlagKeyTest {
@Test
fun `Feature flags have the correct key name set`() {
assertEquals(
FlagKey.BitwardenAuthenticationEnabled.keyName,
"bitwarden-authentication-enabled",
)
}
@Test
fun `All feature flags have the correct default value set`() {
assertTrue(
listOf(
FlagKey.BitwardenAuthenticationEnabled,
).all {
!it.defaultValue
},
)
}
}

View File

@@ -2,7 +2,7 @@ package com.bitwarden.authenticator.data.platform.repository
import app.cash.turbine.test
import com.bitwarden.authenticator.data.platform.datasource.disk.FeatureFlagOverrideDiskSource
import com.bitwarden.authenticator.data.platform.manager.model.FlagKey
import com.bitwarden.core.data.manager.model.FlagKey
import com.bitwarden.data.datasource.disk.model.ServerConfig
import com.bitwarden.data.repository.ServerConfigRepository
import io.mockk.every

View File

@@ -4,8 +4,8 @@ import androidx.compose.ui.test.onNodeWithContentDescription
import androidx.compose.ui.test.onNodeWithText
import androidx.compose.ui.test.performClick
import androidx.compose.ui.test.performScrollTo
import com.bitwarden.authenticator.data.platform.manager.model.FlagKey
import com.bitwarden.authenticator.ui.platform.base.AuthenticatorComposeTest
import com.bitwarden.core.data.manager.model.FlagKey
import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow
import io.mockk.every
import io.mockk.mockk

View File

@@ -2,8 +2,8 @@ package com.bitwarden.authenticator.ui.platform.feature.debugmenu
import app.cash.turbine.test
import com.bitwarden.authenticator.data.platform.manager.FeatureFlagManager
import com.bitwarden.authenticator.data.platform.manager.model.FlagKey
import com.bitwarden.authenticator.data.platform.repository.DebugMenuRepository
import com.bitwarden.core.data.manager.model.FlagKey
import com.bitwarden.ui.platform.base.BaseViewModelTest
import io.mockk.coEvery
import io.mockk.coVerify