RoomListFilters: add feature flag

This commit is contained in:
ganfra 2024-02-20 12:36:20 +01:00
parent e6dad00f06
commit 8f5ea76ab8
7 changed files with 31 additions and 1 deletions

View file

@ -18,11 +18,14 @@ package io.element.android.features.roomlist.impl.filters
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.architecture.Presenter
import io.element.android.libraries.featureflag.api.FeatureFlagService
import io.element.android.libraries.featureflag.api.FeatureFlags
import io.element.android.libraries.matrix.api.roomlist.RoomListService import io.element.android.libraries.matrix.api.roomlist.RoomListService
import kotlinx.collections.immutable.toPersistentList import kotlinx.collections.immutable.toPersistentList
import javax.inject.Inject import javax.inject.Inject
@ -30,10 +33,12 @@ import io.element.android.libraries.matrix.api.roomlist.RoomListFilter as Matrix
class RoomListFiltersPresenter @Inject constructor( class RoomListFiltersPresenter @Inject constructor(
private val roomListService: RoomListService, private val roomListService: RoomListService,
private val featureFlagService: FeatureFlagService,
) : Presenter<RoomListFiltersState> { ) : Presenter<RoomListFiltersState> {
@Composable @Composable
override fun present(): RoomListFiltersState { override fun present(): RoomListFiltersState {
val isFeatureEnabled by featureFlagService.isFeatureEnabledFlow(FeatureFlags.RoomListFilters).collectAsState(false)
var unselectedFilters: Set<RoomListFilter> by rememberSaveable { var unselectedFilters: Set<RoomListFilter> by rememberSaveable {
mutableStateOf(RoomListFilter.entries.toSet()) mutableStateOf(RoomListFilter.entries.toSet())
} }
@ -81,6 +86,7 @@ class RoomListFiltersPresenter @Inject constructor(
return RoomListFiltersState( return RoomListFiltersState(
unselectedFilters = unselectedFilters.toPersistentList(), unselectedFilters = unselectedFilters.toPersistentList(),
selectedFilters = selectedFilters.toPersistentList(), selectedFilters = selectedFilters.toPersistentList(),
isFeatureEnabled = isFeatureEnabled,
eventSink = ::handleEvents eventSink = ::handleEvents
) )
} }

View file

@ -21,6 +21,7 @@ import kotlinx.collections.immutable.ImmutableList
data class RoomListFiltersState( data class RoomListFiltersState(
val unselectedFilters: ImmutableList<RoomListFilter>, val unselectedFilters: ImmutableList<RoomListFilter>,
val selectedFilters: ImmutableList<RoomListFilter>, val selectedFilters: ImmutableList<RoomListFilter>,
val isFeatureEnabled: Boolean,
val eventSink: (RoomListFiltersEvents) -> Unit, val eventSink: (RoomListFiltersEvents) -> Unit,
) { ) {
val showClearFilterButton = selectedFilters.isNotEmpty() val showClearFilterButton = selectedFilters.isNotEmpty()

View file

@ -29,14 +29,19 @@ class RoomListFiltersStateProvider : PreviewParameterProvider<RoomListFiltersSta
aRoomListFiltersState( aRoomListFiltersState(
selectedFilters = persistentListOf(RoomListFilter.Rooms, RoomListFilter.Favourites), selectedFilters = persistentListOf(RoomListFilter.Rooms, RoomListFilter.Favourites),
unselectedFilters = persistentListOf(RoomListFilter.Unread), unselectedFilters = persistentListOf(RoomListFilter.Unread),
) ),
aRoomListFiltersState(
isFeatureEnabled = false,
),
) )
} }
fun aRoomListFiltersState( fun aRoomListFiltersState(
unselectedFilters: ImmutableList<RoomListFilter> = RoomListFilter.entries.toImmutableList(), unselectedFilters: ImmutableList<RoomListFilter> = RoomListFilter.entries.toImmutableList(),
selectedFilters: ImmutableList<RoomListFilter> = persistentListOf(), selectedFilters: ImmutableList<RoomListFilter> = persistentListOf(),
isFeatureEnabled: Boolean = true,
) = RoomListFiltersState( ) = RoomListFiltersState(
unselectedFilters = unselectedFilters, unselectedFilters = unselectedFilters,
selectedFilters = selectedFilters, selectedFilters = selectedFilters,
isFeatureEnabled = isFeatureEnabled,
) {} ) {}

View file

@ -41,12 +41,17 @@ import io.element.android.libraries.designsystem.preview.PreviewsDayNight
import io.element.android.libraries.designsystem.theme.components.Icon import io.element.android.libraries.designsystem.theme.components.Icon
import io.element.android.libraries.designsystem.theme.components.IconButton import io.element.android.libraries.designsystem.theme.components.IconButton
import io.element.android.libraries.designsystem.theme.components.Text import io.element.android.libraries.designsystem.theme.components.Text
import timber.log.Timber
@Composable @Composable
fun RoomListFiltersView( fun RoomListFiltersView(
state: RoomListFiltersState, state: RoomListFiltersState,
modifier: Modifier = Modifier modifier: Modifier = Modifier
) { ) {
if (!state.isFeatureEnabled) {
Timber.d("RoomListFiltersView: Feature is disabled, hide the view")
return
}
fun onClearFiltersClicked() { fun onClearFiltersClicked() {
state.eventSink(RoomListFiltersEvents.ClearSelectedFilters) state.eventSink(RoomListFiltersEvents.ClearSelectedFilters)

View file

@ -20,6 +20,8 @@ import app.cash.molecule.RecompositionMode
import app.cash.molecule.moleculeFlow import app.cash.molecule.moleculeFlow
import app.cash.turbine.test import app.cash.turbine.test
import com.google.common.truth.Truth.assertThat import com.google.common.truth.Truth.assertThat
import io.element.android.libraries.featureflag.api.FeatureFlagService
import io.element.android.libraries.featureflag.test.FakeFeatureFlagService
import io.element.android.libraries.matrix.api.roomlist.RoomListService import io.element.android.libraries.matrix.api.roomlist.RoomListService
import io.element.android.libraries.matrix.test.roomlist.FakeRoomListService import io.element.android.libraries.matrix.test.roomlist.FakeRoomListService
import io.element.android.tests.testutils.awaitLastSequentialItem import io.element.android.tests.testutils.awaitLastSequentialItem
@ -45,6 +47,7 @@ class RoomListFiltersPresenterTests {
RoomListFilter.Favourites, RoomListFilter.Favourites,
) )
} }
cancelAndIgnoreRemainingEvents()
} }
} }
@ -114,8 +117,10 @@ class RoomListFiltersPresenterTests {
fun createRoomListFiltersPresenter( fun createRoomListFiltersPresenter(
roomListService: RoomListService = FakeRoomListService(), roomListService: RoomListService = FakeRoomListService(),
featureFlagService: FeatureFlagService = FakeFeatureFlagService(),
): RoomListFiltersPresenter { ): RoomListFiltersPresenter {
return RoomListFiltersPresenter( return RoomListFiltersPresenter(
roomListService = roomListService, roomListService = roomListService,
featureFlagService = featureFlagService,
) )
} }

View file

@ -82,4 +82,11 @@ enum class FeatureFlags(
defaultValue = true, defaultValue = true,
isFinished = false, isFinished = false,
), ),
RoomListFilters(
key = "feature.roomlistfilters",
title = "Room list filters",
description = "Allow user to filter the room list",
defaultValue = true,
isFinished = false,
),
} }

View file

@ -41,6 +41,7 @@ class StaticFeatureFlagProvider @Inject constructor() :
FeatureFlags.Mentions -> true FeatureFlags.Mentions -> true
FeatureFlags.SecureStorage -> true FeatureFlags.SecureStorage -> true
FeatureFlags.MarkAsUnread -> false FeatureFlags.MarkAsUnread -> false
FeatureFlags.RoomListFilters -> false
} }
} else { } else {
false false