Merge pull request #3451 from element-hq/feature/valere/invisible_crypto_feature_flag
Feature/valere/invisible crypto feature flag
This commit is contained in:
commit
eae580422d
5 changed files with 45 additions and 34 deletions
|
|
@ -13,8 +13,6 @@ import io.element.android.libraries.core.meta.BuildType
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* To enable or disable a FeatureFlags, change the `defaultValue` value.
|
* To enable or disable a FeatureFlags, change the `defaultValue` value.
|
||||||
* Warning: to enable a flag for the release app, you MUST update the file
|
|
||||||
* [io.element.android.libraries.featureflag.impl.StaticFeatureFlagProvider]
|
|
||||||
*/
|
*/
|
||||||
enum class FeatureFlags(
|
enum class FeatureFlags(
|
||||||
override val key: String,
|
override val key: String,
|
||||||
|
|
@ -125,4 +123,13 @@ enum class FeatureFlags(
|
||||||
defaultValue = { true },
|
defaultValue = { true },
|
||||||
isFinished = false,
|
isFinished = false,
|
||||||
),
|
),
|
||||||
|
InvisibleCrypto(
|
||||||
|
key = "feature.invisibleCrypto",
|
||||||
|
title = "Invisible Crypto",
|
||||||
|
description = "This setting controls how end-to-end encryption (E2E) keys are shared." +
|
||||||
|
" Enabling it will prevent the inclusion of devices that have not been explicitly verified by their owners." +
|
||||||
|
" You'll have to stop and re-open the app manually for that setting to take effect.",
|
||||||
|
defaultValue = { false },
|
||||||
|
isFinished = false,
|
||||||
|
),
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,8 @@ package io.element.android.libraries.matrix.impl
|
||||||
import io.element.android.appconfig.AuthenticationConfig
|
import io.element.android.appconfig.AuthenticationConfig
|
||||||
import io.element.android.libraries.core.coroutine.CoroutineDispatchers
|
import io.element.android.libraries.core.coroutine.CoroutineDispatchers
|
||||||
import io.element.android.libraries.di.CacheDirectory
|
import io.element.android.libraries.di.CacheDirectory
|
||||||
|
import io.element.android.libraries.featureflag.api.FeatureFlagService
|
||||||
|
import io.element.android.libraries.featureflag.api.FeatureFlags
|
||||||
import io.element.android.libraries.matrix.impl.analytics.UtdTracker
|
import io.element.android.libraries.matrix.impl.analytics.UtdTracker
|
||||||
import io.element.android.libraries.matrix.impl.certificates.UserCertificatesProvider
|
import io.element.android.libraries.matrix.impl.certificates.UserCertificatesProvider
|
||||||
import io.element.android.libraries.matrix.impl.paths.SessionPaths
|
import io.element.android.libraries.matrix.impl.paths.SessionPaths
|
||||||
|
|
@ -30,6 +32,7 @@ import org.matrix.rustcomponents.sdk.SlidingSyncVersion
|
||||||
import org.matrix.rustcomponents.sdk.SlidingSyncVersionBuilder
|
import org.matrix.rustcomponents.sdk.SlidingSyncVersionBuilder
|
||||||
import org.matrix.rustcomponents.sdk.use
|
import org.matrix.rustcomponents.sdk.use
|
||||||
import timber.log.Timber
|
import timber.log.Timber
|
||||||
|
import uniffi.matrix_sdk_crypto.CollectStrategy
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
|
|
@ -45,6 +48,7 @@ class RustMatrixClientFactory @Inject constructor(
|
||||||
private val clock: SystemClock,
|
private val clock: SystemClock,
|
||||||
private val utdTracker: UtdTracker,
|
private val utdTracker: UtdTracker,
|
||||||
private val appPreferencesStore: AppPreferencesStore,
|
private val appPreferencesStore: AppPreferencesStore,
|
||||||
|
private val featureFlagService: FeatureFlagService,
|
||||||
) {
|
) {
|
||||||
suspend fun create(sessionData: SessionData): RustMatrixClient = withContext(coroutineDispatchers.io) {
|
suspend fun create(sessionData: SessionData): RustMatrixClient = withContext(coroutineDispatchers.io) {
|
||||||
val sessionDelegate = RustClientSessionDelegate(sessionStore, appCoroutineScope, coroutineDispatchers)
|
val sessionDelegate = RustClientSessionDelegate(sessionStore, appCoroutineScope, coroutineDispatchers)
|
||||||
|
|
@ -104,6 +108,13 @@ class RustMatrixClientFactory @Inject constructor(
|
||||||
.addRootCertificates(userCertificatesProvider.provides())
|
.addRootCertificates(userCertificatesProvider.provides())
|
||||||
.autoEnableBackups(true)
|
.autoEnableBackups(true)
|
||||||
.autoEnableCrossSigning(true)
|
.autoEnableCrossSigning(true)
|
||||||
|
.roomKeyRecipientStrategy(
|
||||||
|
strategy = if (featureFlagService.isFeatureEnabled(FeatureFlags.InvisibleCrypto)) {
|
||||||
|
CollectStrategy.IdentityBasedStrategy
|
||||||
|
} else {
|
||||||
|
CollectStrategy.DeviceBasedStrategy(onlyAllowTrustedDevices = false, errorOnVerifiedUserProblem = false)
|
||||||
|
}
|
||||||
|
)
|
||||||
.run {
|
.run {
|
||||||
// Apply sliding sync version settings
|
// Apply sliding sync version settings
|
||||||
when (slidingSync) {
|
when (slidingSync) {
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,23 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2024 New Vector Ltd.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
* Please see LICENSE in the repository root for full details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.element.android.samples.minimal
|
||||||
|
|
||||||
|
import io.element.android.libraries.featureflag.api.Feature
|
||||||
|
import io.element.android.libraries.featureflag.api.FeatureFlagService
|
||||||
|
import kotlinx.coroutines.flow.Flow
|
||||||
|
import kotlinx.coroutines.flow.flowOf
|
||||||
|
|
||||||
|
class AlwaysEnabledFeatureFlagService : FeatureFlagService {
|
||||||
|
override fun isFeatureEnabledFlow(feature: Feature): Flow<Boolean> {
|
||||||
|
return flowOf(true)
|
||||||
|
}
|
||||||
|
|
||||||
|
override suspend fun setFeatureEnabled(feature: Feature, enabled: Boolean): Boolean {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -56,6 +56,7 @@ class MainActivity : ComponentActivity() {
|
||||||
clock = DefaultSystemClock(),
|
clock = DefaultSystemClock(),
|
||||||
utdTracker = UtdTracker(NoopAnalyticsService()),
|
utdTracker = UtdTracker(NoopAnalyticsService()),
|
||||||
appPreferencesStore = InMemoryAppPreferencesStore(),
|
appPreferencesStore = InMemoryAppPreferencesStore(),
|
||||||
|
featureFlagService = AlwaysEnabledFeatureFlagService(),
|
||||||
),
|
),
|
||||||
passphraseGenerator = NullPassphraseGenerator(),
|
passphraseGenerator = NullPassphraseGenerator(),
|
||||||
oidcConfigurationProvider = OidcConfigurationProvider(baseDirectory),
|
oidcConfigurationProvider = OidcConfigurationProvider(baseDirectory),
|
||||||
|
|
|
||||||
|
|
@ -25,8 +25,6 @@ import io.element.android.features.roomlist.impl.filters.selection.DefaultFilter
|
||||||
import io.element.android.features.roomlist.impl.search.RoomListSearchDataSource
|
import io.element.android.features.roomlist.impl.search.RoomListSearchDataSource
|
||||||
import io.element.android.features.roomlist.impl.search.RoomListSearchPresenter
|
import io.element.android.features.roomlist.impl.search.RoomListSearchPresenter
|
||||||
import io.element.android.libraries.core.coroutine.CoroutineDispatchers
|
import io.element.android.libraries.core.coroutine.CoroutineDispatchers
|
||||||
import io.element.android.libraries.core.meta.BuildMeta
|
|
||||||
import io.element.android.libraries.core.meta.BuildType
|
|
||||||
import io.element.android.libraries.dateformatter.impl.DateFormatters
|
import io.element.android.libraries.dateformatter.impl.DateFormatters
|
||||||
import io.element.android.libraries.dateformatter.impl.DefaultLastMessageTimestampFormatter
|
import io.element.android.libraries.dateformatter.impl.DefaultLastMessageTimestampFormatter
|
||||||
import io.element.android.libraries.dateformatter.impl.LocalDateTimeProvider
|
import io.element.android.libraries.dateformatter.impl.LocalDateTimeProvider
|
||||||
|
|
@ -35,8 +33,6 @@ import io.element.android.libraries.eventformatter.impl.DefaultRoomLastMessageFo
|
||||||
import io.element.android.libraries.eventformatter.impl.ProfileChangeContentFormatter
|
import io.element.android.libraries.eventformatter.impl.ProfileChangeContentFormatter
|
||||||
import io.element.android.libraries.eventformatter.impl.RoomMembershipContentFormatter
|
import io.element.android.libraries.eventformatter.impl.RoomMembershipContentFormatter
|
||||||
import io.element.android.libraries.eventformatter.impl.StateContentFormatter
|
import io.element.android.libraries.eventformatter.impl.StateContentFormatter
|
||||||
import io.element.android.libraries.featureflag.impl.DefaultFeatureFlagService
|
|
||||||
import io.element.android.libraries.featureflag.impl.PreferencesFeatureFlagProvider
|
|
||||||
import io.element.android.libraries.fullscreenintent.api.FullScreenIntentPermissionsPresenter
|
import io.element.android.libraries.fullscreenintent.api.FullScreenIntentPermissionsPresenter
|
||||||
import io.element.android.libraries.fullscreenintent.api.FullScreenIntentPermissionsState
|
import io.element.android.libraries.fullscreenintent.api.FullScreenIntentPermissionsState
|
||||||
import io.element.android.libraries.indicator.impl.DefaultIndicatorService
|
import io.element.android.libraries.indicator.impl.DefaultIndicatorService
|
||||||
|
|
@ -70,13 +66,7 @@ class RoomListScreen(
|
||||||
private val sessionVerificationService = matrixClient.sessionVerificationService()
|
private val sessionVerificationService = matrixClient.sessionVerificationService()
|
||||||
private val encryptionService = matrixClient.encryptionService()
|
private val encryptionService = matrixClient.encryptionService()
|
||||||
private val stringProvider = AndroidStringProvider(context.resources)
|
private val stringProvider = AndroidStringProvider(context.resources)
|
||||||
private val buildMeta = getBuildMeta(context)
|
private val featureFlagService = AlwaysEnabledFeatureFlagService()
|
||||||
private val featureFlagService = DefaultFeatureFlagService(
|
|
||||||
providers = setOf(
|
|
||||||
PreferencesFeatureFlagProvider(context = context, buildMeta = buildMeta)
|
|
||||||
),
|
|
||||||
buildMeta = buildMeta,
|
|
||||||
)
|
|
||||||
private val roomListRoomSummaryFactory = RoomListRoomSummaryFactory(
|
private val roomListRoomSummaryFactory = RoomListRoomSummaryFactory(
|
||||||
lastMessageTimestampFormatter = DefaultLastMessageTimestampFormatter(
|
lastMessageTimestampFormatter = DefaultLastMessageTimestampFormatter(
|
||||||
localDateTimeProvider = dateTimeProvider,
|
localDateTimeProvider = dateTimeProvider,
|
||||||
|
|
@ -191,25 +181,4 @@ class RoomListScreen(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getBuildMeta(context: Context): BuildMeta {
|
|
||||||
val buildType = BuildType.valueOf(BuildConfig.BUILD_TYPE.uppercase())
|
|
||||||
val name = context.getString(R.string.app_name)
|
|
||||||
return BuildMeta(
|
|
||||||
isDebuggable = BuildConfig.DEBUG,
|
|
||||||
buildType = buildType,
|
|
||||||
applicationName = name,
|
|
||||||
productionApplicationName = name,
|
|
||||||
desktopApplicationName = name,
|
|
||||||
applicationId = BuildConfig.APPLICATION_ID,
|
|
||||||
lowPrivacyLoggingEnabled = false,
|
|
||||||
versionName = BuildConfig.VERSION_NAME,
|
|
||||||
versionCode = BuildConfig.VERSION_CODE.toLong(),
|
|
||||||
gitRevision = "",
|
|
||||||
gitBranchName = "",
|
|
||||||
flavorDescription = "",
|
|
||||||
flavorShortDescription = "",
|
|
||||||
isEnterpriseBuild = false,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue