From fb368f058b1914729bf7a2c61bc088fbe3ad1cba Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 21 Feb 2024 10:07:41 +0100 Subject: [PATCH] Remove feature flag `SecureStorage` --- .../features/logout/impl/LogoutPresenter.kt | 16 ++-------------- .../impl/direct/DefaultDirectLogoutPresenter.kt | 16 ++-------------- .../features/logout/impl/LogoutPresenterTest.kt | 4 ---- .../direct/DefaultDirectLogoutPresenterTest.kt | 12 ++++-------- .../impl/root/PreferencesRootPresenter.kt | 5 +---- .../impl/root/PreferencesRootPresenterTest.kt | 1 - .../features/roomlist/impl/RoomListPresenter.kt | 4 +--- .../roomlist/impl/RoomListPresenterTests.kt | 4 +--- .../libraries/featureflag/api/FeatureFlags.kt | 7 ------- .../impl/StaticFeatureFlagProvider.kt | 1 - .../indicator/impl/DefaultIndicatorService.kt | 7 +------ 11 files changed, 12 insertions(+), 65 deletions(-) diff --git a/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/LogoutPresenter.kt b/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/LogoutPresenter.kt index f56a24cef5..851e76a32a 100644 --- a/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/LogoutPresenter.kt +++ b/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/LogoutPresenter.kt @@ -30,22 +30,17 @@ import io.element.android.libraries.architecture.AsyncData import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.architecture.runCatchingUpdatingState import io.element.android.libraries.core.bool.orTrue -import io.element.android.libraries.featureflag.api.FeatureFlagService -import io.element.android.libraries.featureflag.api.FeatureFlags import io.element.android.libraries.matrix.api.MatrixClient import io.element.android.libraries.matrix.api.encryption.BackupState import io.element.android.libraries.matrix.api.encryption.BackupUploadState import io.element.android.libraries.matrix.api.encryption.EncryptionService import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.flow.emptyFlow -import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.launch import javax.inject.Inject class LogoutPresenter @Inject constructor( private val matrixClient: MatrixClient, private val encryptionService: EncryptionService, - private val featureFlagService: FeatureFlagService, ) : Presenter { @Composable override fun present(): LogoutState { @@ -54,15 +49,8 @@ class LogoutPresenter @Inject constructor( mutableStateOf(AsyncAction.Uninitialized) } - val secureStorageFlag by featureFlagService.isFeatureEnabledFlow(FeatureFlags.SecureStorage) - .collectAsState(initial = null) - - val backupUploadState: BackupUploadState by remember(secureStorageFlag) { - when (secureStorageFlag) { - true -> encryptionService.waitForBackupUploadSteadyState() - false -> flowOf(BackupUploadState.Done) - else -> emptyFlow() - } + val backupUploadState: BackupUploadState by remember { + encryptionService.waitForBackupUploadSteadyState() } .collectAsState(initial = BackupUploadState.Unknown) diff --git a/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/direct/DefaultDirectLogoutPresenter.kt b/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/direct/DefaultDirectLogoutPresenter.kt index d9a6e7e94c..4cf2445142 100644 --- a/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/direct/DefaultDirectLogoutPresenter.kt +++ b/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/direct/DefaultDirectLogoutPresenter.kt @@ -33,14 +33,10 @@ import io.element.android.features.logout.impl.tools.isBackingUp import io.element.android.libraries.architecture.AsyncAction import io.element.android.libraries.architecture.runCatchingUpdatingState import io.element.android.libraries.di.SessionScope -import io.element.android.libraries.featureflag.api.FeatureFlagService -import io.element.android.libraries.featureflag.api.FeatureFlags import io.element.android.libraries.matrix.api.MatrixClient import io.element.android.libraries.matrix.api.encryption.BackupUploadState import io.element.android.libraries.matrix.api.encryption.EncryptionService import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.flow.emptyFlow -import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.launch import javax.inject.Inject @@ -48,7 +44,6 @@ import javax.inject.Inject class DefaultDirectLogoutPresenter @Inject constructor( private val matrixClient: MatrixClient, private val encryptionService: EncryptionService, - private val featureFlagService: FeatureFlagService, ) : DirectLogoutPresenter { @Composable override fun present(): DirectLogoutState { @@ -58,15 +53,8 @@ class DefaultDirectLogoutPresenter @Inject constructor( mutableStateOf(AsyncAction.Uninitialized) } - val secureStorageFlag by featureFlagService.isFeatureEnabledFlow(FeatureFlags.SecureStorage) - .collectAsState(initial = null) - - val backupUploadState: BackupUploadState by remember(secureStorageFlag) { - when (secureStorageFlag) { - true -> encryptionService.waitForBackupUploadSteadyState() - false -> flowOf(BackupUploadState.Done) - else -> emptyFlow() - } + val backupUploadState: BackupUploadState by remember { + encryptionService.waitForBackupUploadSteadyState() } .collectAsState(initial = BackupUploadState.Unknown) diff --git a/features/logout/impl/src/test/kotlin/io/element/android/features/logout/impl/LogoutPresenterTest.kt b/features/logout/impl/src/test/kotlin/io/element/android/features/logout/impl/LogoutPresenterTest.kt index 8fab9f3e01..fbf08bc723 100644 --- a/features/logout/impl/src/test/kotlin/io/element/android/features/logout/impl/LogoutPresenterTest.kt +++ b/features/logout/impl/src/test/kotlin/io/element/android/features/logout/impl/LogoutPresenterTest.kt @@ -22,8 +22,6 @@ import app.cash.turbine.ReceiveTurbine import app.cash.turbine.test import com.google.common.truth.Truth.assertThat import io.element.android.libraries.architecture.AsyncAction -import io.element.android.libraries.featureflag.api.FeatureFlags -import io.element.android.libraries.featureflag.test.FakeFeatureFlagService import io.element.android.libraries.matrix.api.MatrixClient import io.element.android.libraries.matrix.api.encryption.BackupState import io.element.android.libraries.matrix.api.encryption.BackupUploadState @@ -99,7 +97,6 @@ class LogoutPresenterTest { assertThat(initialState.isLastDevice).isFalse() assertThat(initialState.backupUploadState).isEqualTo(BackupUploadState.Unknown) assertThat(initialState.logoutAction).isEqualTo(AsyncAction.Uninitialized) - skipItems(1) val waitingState = awaitItem() assertThat(waitingState.backupUploadState).isEqualTo(BackupUploadState.Waiting) skipItems(1) @@ -209,6 +206,5 @@ class LogoutPresenterTest { ): LogoutPresenter = LogoutPresenter( matrixClient = matrixClient, encryptionService = encryptionService, - featureFlagService = FakeFeatureFlagService(mapOf(FeatureFlags.SecureStorage.key to true)), ) } diff --git a/features/logout/impl/src/test/kotlin/io/element/android/features/logout/impl/direct/DefaultDirectLogoutPresenterTest.kt b/features/logout/impl/src/test/kotlin/io/element/android/features/logout/impl/direct/DefaultDirectLogoutPresenterTest.kt index 50a1e381e8..0c3aa3131d 100644 --- a/features/logout/impl/src/test/kotlin/io/element/android/features/logout/impl/direct/DefaultDirectLogoutPresenterTest.kt +++ b/features/logout/impl/src/test/kotlin/io/element/android/features/logout/impl/direct/DefaultDirectLogoutPresenterTest.kt @@ -23,8 +23,6 @@ import app.cash.turbine.test import com.google.common.truth.Truth.assertThat import io.element.android.features.logout.api.direct.DirectLogoutEvents import io.element.android.libraries.architecture.AsyncAction -import io.element.android.libraries.featureflag.api.FeatureFlags -import io.element.android.libraries.featureflag.test.FakeFeatureFlagService import io.element.android.libraries.matrix.api.MatrixClient import io.element.android.libraries.matrix.api.encryption.BackupUploadState import io.element.android.libraries.matrix.api.encryption.EncryptionService @@ -63,8 +61,8 @@ class DefaultDirectLogoutPresenterTest { moleculeFlow(RecompositionMode.Immediate) { presenter.present() }.test { - skipItems(2) - val initialState = awaitItem() + skipItems(1) + val initialState = awaitFirstItem() assertThat(initialState.canDoDirectSignOut).isFalse() assertThat(initialState.logoutAction).isEqualTo(AsyncAction.Uninitialized) } @@ -84,8 +82,8 @@ class DefaultDirectLogoutPresenterTest { moleculeFlow(RecompositionMode.Immediate) { presenter.present() }.test { - skipItems(2) - val initialState = awaitItem() + skipItems(1) + val initialState = awaitFirstItem() assertThat(initialState.canDoDirectSignOut).isFalse() assertThat(initialState.logoutAction).isEqualTo(AsyncAction.Uninitialized) } @@ -180,7 +178,6 @@ class DefaultDirectLogoutPresenterTest { } private suspend fun ReceiveTurbine.awaitFirstItem(): T { - skipItems(1) return awaitItem() } @@ -190,6 +187,5 @@ class DefaultDirectLogoutPresenterTest { ): DefaultDirectLogoutPresenter = DefaultDirectLogoutPresenter( matrixClient = matrixClient, encryptionService = encryptionService, - featureFlagService = FakeFeatureFlagService(mapOf(FeatureFlags.SecureStorage.key to true)), ) } diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootPresenter.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootPresenter.kt index 067bd2a26f..434985e068 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootPresenter.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootPresenter.kt @@ -79,9 +79,6 @@ class PreferencesRootPresenter @Inject constructor( val showSecureBackupIndicator by indicatorService.showSettingChatBackupIndicator() - val secureStorageFlag by featureFlagService.isFeatureEnabledFlow(FeatureFlags.SecureStorage) - .collectAsState(initial = null) - val accountManagementUrl: MutableState = remember { mutableStateOf(null) } @@ -101,7 +98,7 @@ class PreferencesRootPresenter @Inject constructor( version = versionFormatter.get(), deviceId = matrixClient.deviceId, showCompleteVerification = showCompleteVerification, - showSecureBackup = !showCompleteVerification && secureStorageFlag == true, + showSecureBackup = !showCompleteVerification, showSecureBackupBadge = showSecureBackupIndicator, accountManagementUrl = accountManagementUrl.value, devicesManagementUrl = devicesManagementUrl.value, diff --git a/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootPresenterTest.kt b/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootPresenterTest.kt index 2dea13eac3..f9789639f3 100644 --- a/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootPresenterTest.kt +++ b/features/preferences/impl/src/test/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootPresenterTest.kt @@ -65,7 +65,6 @@ class PreferencesRootPresenterTest { indicatorService = DefaultIndicatorService( sessionVerificationService = sessionVerificationService, encryptionService = FakeEncryptionService(), - featureFlagService = FakeFeatureFlagService(), ), directLogoutPresenter = object : DirectLogoutPresenter { @Composable diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListPresenter.kt b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListPresenter.kt index 9c3c154cb3..b32dfc44f9 100644 --- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListPresenter.kt +++ b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListPresenter.kt @@ -119,7 +119,6 @@ class RoomListPresenter @Inject constructor( } val recoveryState by encryptionService.recoveryStateStateFlow.collectAsState() val syncState by syncService.syncState.collectAsState() - val secureStorageFlag by featureFlagService.isFeatureEnabledFlow(FeatureFlags.SecureStorage).collectAsState(initial = null) val securityBannerState by remember { derivedStateOf { when { @@ -129,8 +128,7 @@ class RoomListPresenter @Inject constructor( } else { SecurityBannerState.SessionVerification } - secureStorageFlag == true && - recoveryState == RecoveryState.INCOMPLETE && + recoveryState == RecoveryState.INCOMPLETE && syncState == SyncState.Running -> SecurityBannerState.RecoveryKeyConfirmation else -> SecurityBannerState.None } diff --git a/features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/RoomListPresenterTests.kt b/features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/RoomListPresenterTests.kt index 698408d6e1..6b714c4841 100644 --- a/features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/RoomListPresenterTests.kt +++ b/features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/RoomListPresenterTests.kt @@ -45,7 +45,6 @@ import io.element.android.libraries.designsystem.utils.snackbar.SnackbarDispatch import io.element.android.libraries.eventformatter.api.RoomLastMessageFormatter import io.element.android.libraries.eventformatter.test.FakeRoomLastMessageFormatter import io.element.android.libraries.featureflag.api.FeatureFlagService -import io.element.android.libraries.featureflag.api.FeatureFlags import io.element.android.libraries.featureflag.test.FakeFeatureFlagService import io.element.android.libraries.featureflag.test.InMemorySessionPreferencesStore import io.element.android.libraries.indicator.impl.DefaultIndicatorService @@ -606,7 +605,7 @@ class RoomListPresenterTests { }, roomLastMessageFormatter: RoomLastMessageFormatter = FakeRoomLastMessageFormatter(), sessionPreferencesStore: SessionPreferencesStore = InMemorySessionPreferencesStore(), - featureFlagService: FeatureFlagService = FakeFeatureFlagService(mapOf(FeatureFlags.SecureStorage.key to true)), + featureFlagService: FeatureFlagService = FakeFeatureFlagService(), coroutineScope: CoroutineScope, migrationScreenPresenter: MigrationScreenPresenter = MigrationScreenPresenter( matrixClient = client, @@ -634,7 +633,6 @@ class RoomListPresenterTests { indicatorService = DefaultIndicatorService( sessionVerificationService = client.sessionVerificationService(), encryptionService = client.encryptionService(), - featureFlagService = featureFlagService, ), migrationScreenPresenter = migrationScreenPresenter, searchPresenter = searchPresenter, diff --git a/libraries/featureflag/api/src/main/kotlin/io/element/android/libraries/featureflag/api/FeatureFlags.kt b/libraries/featureflag/api/src/main/kotlin/io/element/android/libraries/featureflag/api/FeatureFlags.kt index 3c56c81fae..fea9088c2a 100644 --- a/libraries/featureflag/api/src/main/kotlin/io/element/android/libraries/featureflag/api/FeatureFlags.kt +++ b/libraries/featureflag/api/src/main/kotlin/io/element/android/libraries/featureflag/api/FeatureFlags.kt @@ -68,13 +68,6 @@ enum class FeatureFlags( defaultValue = true, isFinished = false, ), - SecureStorage( - key = "feature.securestorage", - title = "Chat backup", - description = "Allow access to backup and restore chat history settings", - defaultValue = true, - isFinished = false, - ), MarkAsUnread( key = "feature.markAsUnread", title = "Mark as unread", diff --git a/libraries/featureflag/impl/src/main/kotlin/io/element/android/libraries/featureflag/impl/StaticFeatureFlagProvider.kt b/libraries/featureflag/impl/src/main/kotlin/io/element/android/libraries/featureflag/impl/StaticFeatureFlagProvider.kt index 8462a33ba5..757f01904f 100644 --- a/libraries/featureflag/impl/src/main/kotlin/io/element/android/libraries/featureflag/impl/StaticFeatureFlagProvider.kt +++ b/libraries/featureflag/impl/src/main/kotlin/io/element/android/libraries/featureflag/impl/StaticFeatureFlagProvider.kt @@ -39,7 +39,6 @@ class StaticFeatureFlagProvider @Inject constructor() : FeatureFlags.VoiceMessages -> true FeatureFlags.PinUnlock -> true FeatureFlags.Mentions -> true - FeatureFlags.SecureStorage -> true FeatureFlags.MarkAsUnread -> false } } else { diff --git a/libraries/indicator/impl/src/main/kotlin/io/element/android/libraries/indicator/impl/DefaultIndicatorService.kt b/libraries/indicator/impl/src/main/kotlin/io/element/android/libraries/indicator/impl/DefaultIndicatorService.kt index 265e3d2d6f..aae0f1f913 100644 --- a/libraries/indicator/impl/src/main/kotlin/io/element/android/libraries/indicator/impl/DefaultIndicatorService.kt +++ b/libraries/indicator/impl/src/main/kotlin/io/element/android/libraries/indicator/impl/DefaultIndicatorService.kt @@ -24,8 +24,6 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import com.squareup.anvil.annotations.ContributesBinding import io.element.android.libraries.di.SessionScope -import io.element.android.libraries.featureflag.api.FeatureFlagService -import io.element.android.libraries.featureflag.api.FeatureFlags import io.element.android.libraries.indicator.api.IndicatorService import io.element.android.libraries.matrix.api.encryption.BackupState import io.element.android.libraries.matrix.api.encryption.EncryptionService @@ -37,7 +35,6 @@ import javax.inject.Inject class DefaultIndicatorService @Inject constructor( private val sessionVerificationService: SessionVerificationService, private val encryptionService: EncryptionService, - private val featureFlagService: FeatureFlagService, ) : IndicatorService { @Composable override fun showRoomListTopBarIndicator(): State { @@ -53,8 +50,6 @@ class DefaultIndicatorService @Inject constructor( @Composable override fun showSettingChatBackupIndicator(): State { - val secureStorageFlag by featureFlagService.isFeatureEnabledFlow(FeatureFlags.SecureStorage) - .collectAsState(initial = null) val backupState by encryptionService.backupStateStateFlow.collectAsState() val recoveryState by encryptionService.recoveryStateStateFlow.collectAsState() @@ -67,7 +62,7 @@ class DefaultIndicatorService @Inject constructor( RecoveryState.DISABLED, RecoveryState.INCOMPLETE, ) - secureStorageFlag == true && (showForBackup || showForRecovery) + showForBackup || showForRecovery } } }