From 0eadf275e1ee795c4c016d30336da3ca7d942bc4 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 12 Aug 2025 14:30:30 +0200 Subject: [PATCH] Remove FeatureFlag.NotificationSettings and FeatureFlag.PinUnlock --- .../impl/DefaultLockScreenService.kt | 11 +------- .../impl/root/PreferencesRootPresenter.kt | 14 ---------- .../impl/root/PreferencesRootState.kt | 2 -- .../impl/root/PreferencesRootStateProvider.kt | 2 -- .../impl/root/PreferencesRootView.kt | 28 ++++++++----------- .../impl/root/PreferencesRootPresenterTest.kt | 4 --- .../roomdetails/impl/RoomDetailsPresenter.kt | 10 ++----- .../roomdetails/impl/RoomDetailsState.kt | 1 - .../impl/RoomDetailsStateProvider.kt | 2 -- .../roomdetails/impl/RoomDetailsView.kt | 5 ++-- .../impl/RoomDetailsPresenterTest.kt | 1 - .../libraries/featureflag/api/FeatureFlags.kt | 13 --------- 12 files changed, 16 insertions(+), 77 deletions(-) diff --git a/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/DefaultLockScreenService.kt b/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/DefaultLockScreenService.kt index 85ec2e3130..8be72a113e 100644 --- a/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/DefaultLockScreenService.kt +++ b/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/DefaultLockScreenService.kt @@ -18,8 +18,6 @@ import io.element.android.features.lockscreen.impl.storage.LockScreenStore import io.element.android.libraries.di.AppScope import io.element.android.libraries.di.SingleIn import io.element.android.libraries.di.annotations.AppCoroutineScope -import io.element.android.libraries.featureflag.api.FeatureFlagService -import io.element.android.libraries.featureflag.api.FeatureFlags import io.element.android.libraries.sessionstorage.api.observer.SessionListener import io.element.android.libraries.sessionstorage.api.observer.SessionObserver import io.element.android.services.appnavstate.api.AppForegroundStateService @@ -29,7 +27,6 @@ import kotlinx.coroutines.delay import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow -import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.map import kotlinx.coroutines.launch @@ -40,7 +37,6 @@ import kotlin.time.Duration @ContributesBinding(AppScope::class) class DefaultLockScreenService @Inject constructor( private val lockScreenConfig: LockScreenConfig, - private val featureFlagService: FeatureFlagService, private val lockScreenStore: LockScreenStore, private val pinCodeManager: PinCodeManager, @AppCoroutineScope @@ -108,12 +104,7 @@ class DefaultLockScreenService @Inject constructor( } override fun isPinSetup(): Flow { - return combine( - featureFlagService.isFeatureEnabledFlow(FeatureFlags.PinUnlock), - pinCodeManager.hasPinCode() - ) { isEnabled, hasPinCode -> - isEnabled && hasPinCode - } + return pinCodeManager.hasPinCode() } override fun isSetupRequired(): Flow { 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 ee73b7f721..b0bcfed44c 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 @@ -23,8 +23,6 @@ import io.element.android.features.rageshake.api.RageshakeFeatureAvailability import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.designsystem.utils.snackbar.SnackbarDispatcher import io.element.android.libraries.designsystem.utils.snackbar.collectSnackbarMessageAsState -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.MatrixClient import io.element.android.libraries.matrix.api.oidc.AccountManagementAction @@ -42,7 +40,6 @@ class PreferencesRootPresenter @Inject constructor( private val analyticsService: AnalyticsService, private val versionFormatter: VersionFormatter, private val snackbarDispatcher: SnackbarDispatcher, - private val featureFlagService: FeatureFlagService, private val indicatorService: IndicatorService, private val directLogoutPresenter: Presenter, private val showDeveloperSettingsProvider: ShowDeveloperSettingsProvider, @@ -60,15 +57,6 @@ class PreferencesRootPresenter @Inject constructor( val snackbarMessage by snackbarDispatcher.collectSnackbarMessageAsState() val hasAnalyticsProviders = remember { analyticsService.getAvailableAnalyticsProviders().isNotEmpty() } - val showNotificationSettings = remember { mutableStateOf(false) } - LaunchedEffect(Unit) { - showNotificationSettings.value = featureFlagService.isFeatureEnabled(FeatureFlags.NotificationSettings) - } - val showLockScreenSettings = remember { mutableStateOf(false) } - LaunchedEffect(Unit) { - showLockScreenSettings.value = featureFlagService.isFeatureEnabled(FeatureFlags.PinUnlock) - } - // We should display the 'complete verification' option if the current session can be verified val canVerifyUserSession by sessionVerificationService.needsSessionVerification.collectAsState(false) @@ -122,8 +110,6 @@ class PreferencesRootPresenter @Inject constructor( canReportBug = canReportBug, showDeveloperSettings = showDeveloperSettings, canDeactivateAccount = canDeactivateAccount, - showNotificationSettings = showNotificationSettings.value, - showLockScreenSettings = showLockScreenSettings.value, showBlockedUsersItem = showBlockedUsersItem, directLogoutState = directLogoutState, snackbarMessage = snackbarMessage, diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootState.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootState.kt index 2e5cb4fa14..ebe8aaf57f 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootState.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootState.kt @@ -24,8 +24,6 @@ data class PreferencesRootState( val showAnalyticsSettings: Boolean, val showDeveloperSettings: Boolean, val canDeactivateAccount: Boolean, - val showLockScreenSettings: Boolean, - val showNotificationSettings: Boolean, val showBlockedUsersItem: Boolean, val directLogoutState: DirectLogoutState, val snackbarMessage: SnackbarMessage?, diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootStateProvider.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootStateProvider.kt index 43307e9988..91b32fe12d 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootStateProvider.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootStateProvider.kt @@ -27,8 +27,6 @@ fun aPreferencesRootState( showAnalyticsSettings = true, canReportBug = true, showDeveloperSettings = true, - showNotificationSettings = true, - showLockScreenSettings = true, showBlockedUsersItem = true, canDeactivateAccount = true, snackbarMessage = SnackbarMessage(CommonStrings.common_verification_complete), diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootView.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootView.kt index 337544ed7f..85c180ddac 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootView.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootView.kt @@ -121,20 +121,16 @@ private fun ColumnScope.ManageAppSection( onOpenLockScreenSettings: () -> Unit, onSecureBackupClick: () -> Unit, ) { - if (state.showNotificationSettings) { - ListItem( - headlineContent = { Text(stringResource(id = R.string.screen_notification_settings_title)) }, - leadingContent = ListItemContent.Icon(IconSource.Vector(CompoundIcons.Notifications())), - onClick = onOpenNotificationSettings, - ) - } - if (state.showLockScreenSettings) { - ListItem( - headlineContent = { Text(stringResource(id = CommonStrings.common_screen_lock)) }, - leadingContent = ListItemContent.Icon(IconSource.Vector(CompoundIcons.Lock())), - onClick = onOpenLockScreenSettings, - ) - } + ListItem( + headlineContent = { Text(stringResource(id = R.string.screen_notification_settings_title)) }, + leadingContent = ListItemContent.Icon(IconSource.Vector(CompoundIcons.Notifications())), + onClick = onOpenNotificationSettings, + ) + ListItem( + headlineContent = { Text(stringResource(id = CommonStrings.common_screen_lock)) }, + leadingContent = ListItemContent.Icon(IconSource.Vector(CompoundIcons.Lock())), + onClick = onOpenLockScreenSettings, + ) if (state.showSecureBackup) { ListItem( headlineContent = { Text(stringResource(id = CommonStrings.common_encryption)) }, @@ -143,9 +139,7 @@ private fun ColumnScope.ManageAppSection( onClick = onSecureBackupClick, ) } - if (state.showNotificationSettings || state.showLockScreenSettings || state.showSecureBackup) { - HorizontalDivider() - } + HorizontalDivider() } @Composable 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 a65e61661e..42fee711a7 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 @@ -16,7 +16,6 @@ import io.element.android.features.preferences.impl.utils.ShowDeveloperSettingsP import io.element.android.features.rageshake.api.RageshakeFeatureAvailability import io.element.android.libraries.core.meta.BuildType import io.element.android.libraries.designsystem.utils.snackbar.SnackbarDispatcher -import io.element.android.libraries.featureflag.test.FakeFeatureFlagService import io.element.android.libraries.indicator.api.IndicatorService import io.element.android.libraries.indicator.test.FakeIndicatorService import io.element.android.libraries.matrix.api.oidc.AccountManagementAction @@ -77,8 +76,6 @@ class PreferencesRootPresenterTest { assertThat(loadedState.devicesManagementUrl).isNull() assertThat(loadedState.showAnalyticsSettings).isFalse() assertThat(loadedState.showDeveloperSettings).isTrue() - assertThat(loadedState.showLockScreenSettings).isTrue() - assertThat(loadedState.showNotificationSettings).isTrue() assertThat(loadedState.canDeactivateAccount).isTrue() assertThat(loadedState.canReportBug).isTrue() assertThat(loadedState.directLogoutState).isEqualTo(aDirectLogoutState()) @@ -194,7 +191,6 @@ class PreferencesRootPresenterTest { analyticsService = FakeAnalyticsService(), versionFormatter = FakeVersionFormatter(), snackbarDispatcher = SnackbarDispatcher(), - featureFlagService = FakeFeatureFlagService(), indicatorService = indicatorService, directLogoutPresenter = { aDirectLogoutState() }, showDeveloperSettingsProvider = showDeveloperSettingsProvider, diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsPresenter.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsPresenter.kt index 3356c899d0..2bbc40172f 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsPresenter.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsPresenter.kt @@ -12,7 +12,6 @@ import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.produceState import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope @@ -77,7 +76,6 @@ class RoomDetailsPresenter @Inject constructor( override fun present(): RoomDetailsState { val scope = rememberCoroutineScope() val leaveRoomState = leaveRoomPresenter.present() - val canShowNotificationSettings = remember { mutableStateOf(false) } val roomInfo by room.roomInfoFlow.collectAsState() val isUserAdmin = room.isOwnUserAdmin() val syncUpdateFlow = room.syncUpdateFlow.collectAsState() @@ -96,11 +94,8 @@ class RoomDetailsPresenter @Inject constructor( }.collectAsState(false) LaunchedEffect(Unit) { - canShowNotificationSettings.value = featureFlagService.isFeatureEnabled(FeatureFlags.NotificationSettings) - if (canShowNotificationSettings.value) { - room.updateRoomNotificationSettings() - observeNotificationSettings() - } + room.updateRoomNotificationSettings() + observeNotificationSettings() } val membersState by room.membersStateFlow.collectAsState() @@ -197,7 +192,6 @@ class RoomDetailsPresenter @Inject constructor( isEncrypted = isEncrypted, canInvite = canInvite, canEdit = (canEditAvatar || canEditName || canEditTopic) && roomType == RoomDetailsType.Room, - canShowNotificationSettings = canShowNotificationSettings.value, roomCallState = roomCallState, roomType = roomType, roomMemberDetailsState = roomMemberDetailsState, diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsState.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsState.kt index 331329a034..f4fabbbea7 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsState.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsState.kt @@ -32,7 +32,6 @@ data class RoomDetailsState( val roomMemberDetailsState: UserProfileState?, val canEdit: Boolean, val canInvite: Boolean, - val canShowNotificationSettings: Boolean, val roomCallState: RoomCallState, val leaveRoomState: LeaveRoomState, val roomNotificationSettings: RoomNotificationSettings?, diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsStateProvider.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsStateProvider.kt index 9631be01c2..958b784af3 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsStateProvider.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsStateProvider.kt @@ -100,7 +100,6 @@ fun aRoomDetailsState( isEncrypted: Boolean = true, canInvite: Boolean = false, canEdit: Boolean = false, - canShowNotificationSettings: Boolean = true, roomCallState: RoomCallState = aStandByCallState(), roomType: RoomDetailsType = RoomDetailsType.Room, roomMemberDetailsState: UserProfileState? = null, @@ -132,7 +131,6 @@ fun aRoomDetailsState( isEncrypted = isEncrypted, canInvite = canInvite, canEdit = canEdit, - canShowNotificationSettings = canShowNotificationSettings, roomCallState = roomCallState, roomType = roomType, roomMemberDetailsState = roomMemberDetailsState, diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsView.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsView.kt index fe14fd983c..9948762a1e 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsView.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsView.kt @@ -185,7 +185,7 @@ fun RoomDetailsView( } PreferenceCategory { - if (state.canShowNotificationSettings && state.roomNotificationSettings != null) { + if (state.roomNotificationSettings != null) { NotificationItem( isDefaultMode = state.roomNotificationSettings.isDefault, openRoomNotificationSettings = openRoomNotificationSettings @@ -337,8 +337,7 @@ private fun MainActionsSection( .padding(horizontal = 16.dp), horizontalArrangement = Arrangement.SpaceEvenly, ) { - val roomNotificationSettings = state.roomNotificationSettings - if (state.canShowNotificationSettings && roomNotificationSettings != null) { + state.roomNotificationSettings?.let { roomNotificationSettings -> if (roomNotificationSettings.mode == RoomNotificationMode.MUTE) { MainActionButton( title = stringResource(CommonStrings.common_unmute), diff --git a/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsPresenterTest.kt b/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsPresenterTest.kt index 7dd954011e..e9afd0df39 100644 --- a/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsPresenterTest.kt +++ b/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsPresenterTest.kt @@ -79,7 +79,6 @@ class RoomDetailsPresenterTest { analyticsService: AnalyticsService = FakeAnalyticsService(), featureFlagService: FeatureFlagService = FakeFeatureFlagService( mapOf( - FeatureFlags.NotificationSettings.key to true, FeatureFlags.Knock.key to false, ) ), 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 3aaeb3dd35..cd7a00f811 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 @@ -21,12 +21,6 @@ enum class FeatureFlags( override val defaultValue: (BuildMeta) -> Boolean, override val isFinished: Boolean, ) : Feature { - NotificationSettings( - key = "feature.notificationsettings", - title = "Show notification settings", - defaultValue = { true }, - isFinished = true, - ), VoiceMessages( key = "feature.voicemessages", title = "Voice messages", @@ -34,13 +28,6 @@ enum class FeatureFlags( defaultValue = { true }, isFinished = true, ), - PinUnlock( - key = "feature.pinunlock", - title = "Pin unlock", - description = "Allow user to lock/unlock the app with a pin code or biometrics", - defaultValue = { true }, - isFinished = true, - ), MarkAsUnread( key = "feature.markAsUnread", title = "Mark as unread",