RoomListFilters: add feature flag
This commit is contained in:
parent
e6dad00f06
commit
8f5ea76ab8
7 changed files with 31 additions and 1 deletions
|
|
@ -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
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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()
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
) {}
|
) {}
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
),
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue