PM-24088: Remove the MobileErrorReporting feature flag (#5565)

This commit is contained in:
David Perez
2025-07-24 08:33:22 -05:00
committed by GitHub
parent d308b84943
commit c7df80ff00
10 changed files with 3 additions and 74 deletions

View File

@@ -23,12 +23,10 @@ import com.x8bit.bitwarden.data.credentials.util.getCreateCredentialRequestOrNul
import com.x8bit.bitwarden.data.credentials.util.getFido2AssertionRequestOrNull
import com.x8bit.bitwarden.data.credentials.util.getGetCredentialsRequestOrNull
import com.x8bit.bitwarden.data.platform.manager.AppResumeManager
import com.x8bit.bitwarden.data.platform.manager.FeatureFlagManager
import com.x8bit.bitwarden.data.platform.manager.SpecialCircumstanceManager
import com.x8bit.bitwarden.data.platform.manager.garbage.GarbageCollectionManager
import com.x8bit.bitwarden.data.platform.manager.model.AppResumeScreenData
import com.x8bit.bitwarden.data.platform.manager.model.CompleteRegistrationData
import com.x8bit.bitwarden.data.platform.manager.model.FlagKey
import com.x8bit.bitwarden.data.platform.manager.model.SpecialCircumstance
import com.x8bit.bitwarden.data.platform.repository.EnvironmentRepository
import com.x8bit.bitwarden.data.platform.repository.SettingsRepository
@@ -68,7 +66,6 @@ private const val ANIMATION_REFRESH_DELAY = 500L
class MainViewModel @Inject constructor(
accessibilitySelectionManager: AccessibilitySelectionManager,
autofillSelectionManager: AutofillSelectionManager,
featureFlagManager: FeatureFlagManager,
private val addTotpItemFromAuthenticatorManager: AddTotpItemFromAuthenticatorManager,
private val specialCircumstanceManager: SpecialCircumstanceManager,
private val garbageCollectionManager: GarbageCollectionManager,
@@ -85,9 +82,6 @@ class MainViewModel @Inject constructor(
initialState = MainState(
theme = settingsRepository.appTheme,
isScreenCaptureAllowed = settingsRepository.isScreenCaptureAllowed,
isErrorReportingDialogEnabled = featureFlagManager.getFeatureFlag(
key = FlagKey.MobileErrorReporting,
),
isDynamicColorsEnabled = settingsRepository.isDynamicColorsEnabled,
),
) {
@@ -106,12 +100,6 @@ class MainViewModel @Inject constructor(
.onEach { specialCircumstance = it }
.launchIn(viewModelScope)
featureFlagManager
.getFeatureFlagFlow(key = FlagKey.MobileErrorReporting)
.map { MainAction.Internal.OnMobileErrorReportingReceive(it) }
.onEach(::sendAction)
.launchIn(viewModelScope)
accessibilitySelectionManager
.accessibilitySelectionFlow
.map { MainAction.Internal.AccessibilitySelectionReceive(it) }
@@ -217,17 +205,6 @@ class MainViewModel @Inject constructor(
is MainAction.Internal.ThemeUpdate -> handleAppThemeUpdated(action)
is MainAction.Internal.VaultUnlockStateChange -> handleVaultUnlockStateChange()
is MainAction.Internal.DynamicColorsUpdate -> handleDynamicColorsUpdate(action)
is MainAction.Internal.OnMobileErrorReportingReceive -> {
handleOnMobileErrorReportingReceive(action)
}
}
}
private fun handleOnMobileErrorReportingReceive(
action: MainAction.Internal.OnMobileErrorReportingReceive,
) {
mutableStateFlow.update {
it.copy(isErrorReportingDialogEnabled = action.isErrorReportingEnabled)
}
}
@@ -495,15 +472,12 @@ data class MainState(
val theme: AppTheme,
val isScreenCaptureAllowed: Boolean,
val isDynamicColorsEnabled: Boolean,
private val isErrorReportingDialogEnabled: Boolean,
) : Parcelable {
/**
* Contains all feature flags that are available to the UI.
*/
val featureFlagsState: FeatureFlagsState
get() = FeatureFlagsState(
isErrorReportingDialogEnabled = isErrorReportingDialogEnabled,
)
get() = FeatureFlagsState
}
/**
@@ -548,13 +522,6 @@ sealed class MainAction {
val cipherView: CipherView,
) : Internal()
/**
* Indicates the Mobile Error Reporting feature flag has been updated.
*/
data class OnMobileErrorReportingReceive(
val isErrorReportingEnabled: Boolean,
) : Internal()
/**
* Indicates the user has manually selected the given [cipherView] for autofill.
*/

View File

@@ -31,7 +31,6 @@ sealed class FlagKey<out T : Any> {
AnonAddySelfHostAlias,
SimpleLoginSelfHostAlias,
ChromeAutofill,
MobileErrorReporting,
RestrictCipherItemDeletion,
UserManagedPrivilegedApps,
RemoveCardPolicy,
@@ -47,14 +46,6 @@ sealed class FlagKey<out T : Any> {
override val defaultValue: Boolean = false
}
/**
* Data object holding the key for syncing with the Bitwarden Authenticator app.
*/
data object MobileErrorReporting : FlagKey<Boolean>() {
override val keyName: String = "mobile-error-reporting"
override val defaultValue: Boolean = false
}
/**
* Data object holding the feature flag key for the import logins feature.
*/

View File

@@ -16,10 +16,8 @@ import com.x8bit.bitwarden.R
import com.x8bit.bitwarden.data.platform.util.ciBuildInfo
import com.x8bit.bitwarden.data.platform.util.deviceData
import com.x8bit.bitwarden.data.platform.util.versionData
import com.x8bit.bitwarden.ui.platform.composition.LocalFeatureFlagsState
import com.x8bit.bitwarden.ui.platform.composition.LocalIntentManager
import com.x8bit.bitwarden.ui.platform.manager.intent.IntentManager
import com.x8bit.bitwarden.ui.platform.model.FeatureFlagsState
/**
* Represents a Bitwarden-styled dialog.
@@ -38,7 +36,6 @@ fun BitwardenBasicDialog(
onDismissRequest: () -> Unit,
throwable: Throwable? = null,
intentManager: IntentManager = LocalIntentManager.current,
featureFlagsState: FeatureFlagsState = LocalFeatureFlagsState.current,
) {
AlertDialog(
onDismissRequest = onDismissRequest,
@@ -50,7 +47,6 @@ fun BitwardenBasicDialog(
)
},
dismissButton = throwable
?.takeIf { featureFlagsState.isErrorReportingDialogEnabled }
?.let { error ->
{
BitwardenTextButton(

View File

@@ -36,7 +36,6 @@ fun <T : Any> FlagKey<T>.ListItemContent(
FlagKey.AnonAddySelfHostAlias,
FlagKey.SimpleLoginSelfHostAlias,
FlagKey.ChromeAutofill,
FlagKey.MobileErrorReporting,
FlagKey.RestrictCipherItemDeletion,
FlagKey.UserManagedPrivilegedApps,
FlagKey.RemoveCardPolicy,
@@ -95,7 +94,6 @@ private fun <T : Any> FlagKey<T>.getDisplayLabel(): String = when (this) {
FlagKey.AnonAddySelfHostAlias -> stringResource(R.string.anon_addy_self_hosted_aliases)
FlagKey.SimpleLoginSelfHostAlias -> stringResource(R.string.simple_login_self_hosted_aliases)
FlagKey.ChromeAutofill -> stringResource(R.string.enable_chrome_autofill)
FlagKey.MobileErrorReporting -> stringResource(R.string.enable_error_reporting_dialog)
FlagKey.RestrictCipherItemDeletion -> stringResource(R.string.restrict_item_deletion)
FlagKey.UserManagedPrivilegedApps -> {
stringResource(R.string.user_trusted_privileged_app_management)

View File

@@ -9,6 +9,4 @@ import kotlinx.parcelize.Parcelize
*/
@Immutable
@Parcelize
data class FeatureFlagsState(
val isErrorReportingDialogEnabled: Boolean,
) : Parcelable
data object FeatureFlagsState : Parcelable

View File

@@ -23,7 +23,6 @@
<string name="anon_addy_self_hosted_aliases">AnonAddy self-hosted aliases</string>
<string name="simple_login_self_hosted_aliases">SimpleLogin self-hosted aliases</string>
<string name="enable_chrome_autofill">Enable chrome autofill</string>
<string name="enable_error_reporting_dialog">Enable error reporting dialog</string>
<string name="restrict_item_deletion">Restrict item deletion</string>
<string name="generate_crash">Generate crash</string>
<string name="generate_error_report">Generate error report</string>

View File

@@ -42,14 +42,12 @@ import com.x8bit.bitwarden.data.credentials.util.getCreateCredentialRequestOrNul
import com.x8bit.bitwarden.data.credentials.util.getFido2AssertionRequestOrNull
import com.x8bit.bitwarden.data.credentials.util.getGetCredentialsRequestOrNull
import com.x8bit.bitwarden.data.platform.manager.AppResumeManager
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.garbage.GarbageCollectionManager
import com.x8bit.bitwarden.data.platform.manager.model.AppResumeScreenData
import com.x8bit.bitwarden.data.platform.manager.model.CompleteRegistrationData
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.PasswordlessRequestData
import com.x8bit.bitwarden.data.platform.manager.model.SpecialCircumstance
import com.x8bit.bitwarden.data.platform.repository.EnvironmentRepository
@@ -144,13 +142,6 @@ class MainViewModelTest : BaseViewModelTest() {
every { clearResumeScreen() } just runs
}
private val mutableMobileErrorReportingFeatureFlow = MutableStateFlow(false)
private val featureFlagManager: FeatureFlagManager = mockk {
every { getFeatureFlag(key = FlagKey.MobileErrorReporting) } returns false
every {
getFeatureFlagFlow(key = FlagKey.MobileErrorReporting)
} returns mutableMobileErrorReportingFeatureFlow
}
private val mockBiometricsPromptResult = mockk<BiometricPromptResult>(relaxed = true) {
every { isSuccessful } returns true
}
@@ -1136,14 +1127,12 @@ class MainViewModelTest : BaseViewModelTest() {
set(SPECIAL_CIRCUMSTANCE_KEY, initialSpecialCircumstance)
},
appResumeManager = appResumeManager,
featureFlagManager = featureFlagManager,
)
}
private val DEFAULT_STATE: MainState = MainState(
theme = AppTheme.DEFAULT,
isScreenCaptureAllowed = true,
isErrorReportingDialogEnabled = false,
isDynamicColorsEnabled = false,
)

View File

@@ -49,10 +49,6 @@ class FlagKeyTest {
FlagKey.ChromeAutofill.keyName,
"android-chrome-autofill",
)
assertEquals(
FlagKey.MobileErrorReporting.keyName,
"mobile-error-reporting",
)
assertEquals(
FlagKey.RestrictCipherItemDeletion.keyName,
"pm-15493-restrict-item-deletion-to-can-manage-permission",
@@ -81,7 +77,6 @@ class FlagKeyTest {
FlagKey.SimpleLoginSelfHostAlias,
FlagKey.CipherKeyEncryption,
FlagKey.ChromeAutofill,
FlagKey.MobileErrorReporting,
FlagKey.RestrictCipherItemDeletion,
FlagKey.UserManagedPrivilegedApps,
FlagKey.RemoveCardPolicy,

View File

@@ -29,9 +29,7 @@ abstract class BitwardenComposeTest : BaseComposeTest() {
@Suppress("LongParameterList")
protected fun setContent(
theme: AppTheme = AppTheme.DEFAULT,
featureFlagsState: FeatureFlagsState = FeatureFlagsState(
isErrorReportingDialogEnabled = false,
),
featureFlagsState: FeatureFlagsState = FeatureFlagsState,
appResumeStateManager: AppResumeStateManager = mockk(),
appReviewManager: AppReviewManager = mockk(),
biometricsManager: BiometricsManager = mockk(),

View File

@@ -154,7 +154,6 @@ private val DEFAULT_MAP_VALUE: ImmutableMap<FlagKey<Any>, Any> = persistentMapOf
FlagKey.AnonAddySelfHostAlias to true,
FlagKey.SimpleLoginSelfHostAlias to true,
FlagKey.ChromeAutofill to true,
FlagKey.MobileErrorReporting to true,
FlagKey.RestrictCipherItemDeletion to true,
FlagKey.UserManagedPrivilegedApps to true,
FlagKey.RemoveCardPolicy to true,
@@ -171,7 +170,6 @@ private val UPDATED_MAP_VALUE: ImmutableMap<FlagKey<Any>, Any> = persistentMapOf
FlagKey.AnonAddySelfHostAlias to false,
FlagKey.SimpleLoginSelfHostAlias to false,
FlagKey.ChromeAutofill to false,
FlagKey.MobileErrorReporting to false,
FlagKey.RestrictCipherItemDeletion to false,
FlagKey.UserManagedPrivilegedApps to false,
FlagKey.RemoveCardPolicy to false,