mirror of
https://github.com/Novaloop-AG/element-x-android.git
synced 2026-11-03 16:10:00 +00:00
Merge pull request #7419 from element-hq/rav/feature_flags
Add hooks to allow providing additional feature flags in EX pro
This commit is contained in:
+21
@@ -0,0 +1,21 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2026 Element Creations Ltd.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial.
|
||||||
|
* Please see LICENSE files in the repository root for full details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.element.android.libraries.featureflag.api
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides a list of available [Feature]s that the application supports.
|
||||||
|
* Used by [FeatureFlagService.getAvailableFeatures] to obtain a list of features
|
||||||
|
* that can be presented to the user.
|
||||||
|
*
|
||||||
|
* Multiple instances can exist within the application, and all instances are polled
|
||||||
|
* to provide features for the list. This means that additional features can be provided
|
||||||
|
* by compile-time extensions.
|
||||||
|
*/
|
||||||
|
fun interface FeaturesProvider {
|
||||||
|
fun provide(): List<Feature>
|
||||||
|
}
|
||||||
+3
-2
@@ -14,6 +14,7 @@ import dev.zacsweers.metro.SingleIn
|
|||||||
import io.element.android.libraries.core.meta.BuildMeta
|
import io.element.android.libraries.core.meta.BuildMeta
|
||||||
import io.element.android.libraries.featureflag.api.Feature
|
import io.element.android.libraries.featureflag.api.Feature
|
||||||
import io.element.android.libraries.featureflag.api.FeatureFlagService
|
import io.element.android.libraries.featureflag.api.FeatureFlagService
|
||||||
|
import io.element.android.libraries.featureflag.api.FeaturesProvider
|
||||||
import kotlinx.coroutines.flow.Flow
|
import kotlinx.coroutines.flow.Flow
|
||||||
import kotlinx.coroutines.flow.flowOf
|
import kotlinx.coroutines.flow.flowOf
|
||||||
|
|
||||||
@@ -22,7 +23,7 @@ import kotlinx.coroutines.flow.flowOf
|
|||||||
class DefaultFeatureFlagService(
|
class DefaultFeatureFlagService(
|
||||||
private val providers: Set<@JvmSuppressWildcards FeatureFlagProvider>,
|
private val providers: Set<@JvmSuppressWildcards FeatureFlagProvider>,
|
||||||
private val buildMeta: BuildMeta,
|
private val buildMeta: BuildMeta,
|
||||||
private val featuresProvider: FeaturesProvider,
|
private val featuresProviders: Set<FeaturesProvider>,
|
||||||
) : FeatureFlagService {
|
) : FeatureFlagService {
|
||||||
override fun isFeatureEnabledFlow(feature: Feature): Flow<Boolean> {
|
override fun isFeatureEnabledFlow(feature: Feature): Flow<Boolean> {
|
||||||
return if (feature.isFinished) {
|
return if (feature.isFinished) {
|
||||||
@@ -47,7 +48,7 @@ class DefaultFeatureFlagService(
|
|||||||
includeFinishedFeatures: Boolean,
|
includeFinishedFeatures: Boolean,
|
||||||
isInLabs: Boolean,
|
isInLabs: Boolean,
|
||||||
): List<Feature> {
|
): List<Feature> {
|
||||||
return featuresProvider.provide().filter { flag ->
|
return featuresProviders.flatMap { provider -> provider.provide() }.filter { flag ->
|
||||||
(includeFinishedFeatures || !flag.isFinished) &&
|
(includeFinishedFeatures || !flag.isFinished) &&
|
||||||
flag.isInLabs == isInLabs
|
flag.isInLabs == isInLabs
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-6
@@ -9,15 +9,12 @@
|
|||||||
package io.element.android.libraries.featureflag.impl
|
package io.element.android.libraries.featureflag.impl
|
||||||
|
|
||||||
import dev.zacsweers.metro.AppScope
|
import dev.zacsweers.metro.AppScope
|
||||||
import dev.zacsweers.metro.ContributesBinding
|
import dev.zacsweers.metro.ContributesIntoSet
|
||||||
import io.element.android.libraries.featureflag.api.Feature
|
import io.element.android.libraries.featureflag.api.Feature
|
||||||
import io.element.android.libraries.featureflag.api.FeatureFlags
|
import io.element.android.libraries.featureflag.api.FeatureFlags
|
||||||
|
import io.element.android.libraries.featureflag.api.FeaturesProvider
|
||||||
|
|
||||||
fun interface FeaturesProvider {
|
@ContributesIntoSet(AppScope::class)
|
||||||
fun provide(): List<Feature>
|
|
||||||
}
|
|
||||||
|
|
||||||
@ContributesBinding(AppScope::class)
|
|
||||||
class DefaultFeaturesProvider : FeaturesProvider {
|
class DefaultFeaturesProvider : FeaturesProvider {
|
||||||
override fun provide(): List<Feature> = FeatureFlags.entries
|
override fun provide(): List<Feature> = FeatureFlags.entries
|
||||||
}
|
}
|
||||||
+2
-1
@@ -12,6 +12,7 @@ import app.cash.turbine.test
|
|||||||
import com.google.common.truth.Truth.assertThat
|
import com.google.common.truth.Truth.assertThat
|
||||||
import io.element.android.libraries.core.meta.BuildMeta
|
import io.element.android.libraries.core.meta.BuildMeta
|
||||||
import io.element.android.libraries.featureflag.api.Feature
|
import io.element.android.libraries.featureflag.api.Feature
|
||||||
|
import io.element.android.libraries.featureflag.api.FeaturesProvider
|
||||||
import io.element.android.libraries.featureflag.test.FakeFeature
|
import io.element.android.libraries.featureflag.test.FakeFeature
|
||||||
import io.element.android.libraries.matrix.test.core.aBuildMeta
|
import io.element.android.libraries.matrix.test.core.aBuildMeta
|
||||||
import kotlinx.coroutines.test.runTest
|
import kotlinx.coroutines.test.runTest
|
||||||
@@ -166,5 +167,5 @@ private fun createDefaultFeatureFlagService(
|
|||||||
) = DefaultFeatureFlagService(
|
) = DefaultFeatureFlagService(
|
||||||
providers = providers,
|
providers = providers,
|
||||||
buildMeta = buildMeta,
|
buildMeta = buildMeta,
|
||||||
featuresProvider = { features }
|
featuresProviders = setOf(FeaturesProvider { features })
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user