Browse Source

Merge pull request #3451 from element-hq/feature/valere/invisible_crypto_feature_flag

Feature/valere/invisible crypto feature flag
pull/3408/head
ganfra 1 month ago committed by GitHub
parent
commit
da3f5e00dc
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 11
      libraries/featureflag/api/src/main/kotlin/io/element/android/libraries/featureflag/api/FeatureFlags.kt
  2. 11
      libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClientFactory.kt
  3. 23
      samples/minimal/src/main/kotlin/io/element/android/samples/minimal/AlwaysEnabledFeatureFlagService.kt
  4. 1
      samples/minimal/src/main/kotlin/io/element/android/samples/minimal/MainActivity.kt
  5. 33
      samples/minimal/src/main/kotlin/io/element/android/samples/minimal/RoomListScreen.kt

11
libraries/featureflag/api/src/main/kotlin/io/element/android/libraries/featureflag/api/FeatureFlags.kt

@ -13,8 +13,6 @@ import io.element.android.libraries.core.meta.BuildType @@ -13,8 +13,6 @@ import io.element.android.libraries.core.meta.BuildType
/**
* 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(
override val key: String,
@ -125,4 +123,13 @@ enum class FeatureFlags( @@ -125,4 +123,13 @@ enum class FeatureFlags(
defaultValue = { true },
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,
),
}

11
libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClientFactory.kt

@ -10,6 +10,8 @@ package io.element.android.libraries.matrix.impl @@ -10,6 +10,8 @@ package io.element.android.libraries.matrix.impl
import io.element.android.appconfig.AuthenticationConfig
import io.element.android.libraries.core.coroutine.CoroutineDispatchers
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.certificates.UserCertificatesProvider
import io.element.android.libraries.matrix.impl.paths.SessionPaths
@ -30,6 +32,7 @@ import org.matrix.rustcomponents.sdk.SlidingSyncVersion @@ -30,6 +32,7 @@ import org.matrix.rustcomponents.sdk.SlidingSyncVersion
import org.matrix.rustcomponents.sdk.SlidingSyncVersionBuilder
import org.matrix.rustcomponents.sdk.use
import timber.log.Timber
import uniffi.matrix_sdk_crypto.CollectStrategy
import java.io.File
import javax.inject.Inject
@ -45,6 +48,7 @@ class RustMatrixClientFactory @Inject constructor( @@ -45,6 +48,7 @@ class RustMatrixClientFactory @Inject constructor(
private val clock: SystemClock,
private val utdTracker: UtdTracker,
private val appPreferencesStore: AppPreferencesStore,
private val featureFlagService: FeatureFlagService,
) {
suspend fun create(sessionData: SessionData): RustMatrixClient = withContext(coroutineDispatchers.io) {
val sessionDelegate = RustClientSessionDelegate(sessionStore, appCoroutineScope, coroutineDispatchers)
@ -104,6 +108,13 @@ class RustMatrixClientFactory @Inject constructor( @@ -104,6 +108,13 @@ class RustMatrixClientFactory @Inject constructor(
.addRootCertificates(userCertificatesProvider.provides())
.autoEnableBackups(true)
.autoEnableCrossSigning(true)
.roomKeyRecipientStrategy(
strategy = if (featureFlagService.isFeatureEnabled(FeatureFlags.InvisibleCrypto)) {
CollectStrategy.IdentityBasedStrategy
} else {
CollectStrategy.DeviceBasedStrategy(onlyAllowTrustedDevices = false, errorOnVerifiedUserProblem = false)
}
)
.run {
// Apply sliding sync version settings
when (slidingSync) {

23
samples/minimal/src/main/kotlin/io/element/android/samples/minimal/AlwaysEnabledFeatureFlagService.kt

@ -0,0 +1,23 @@ @@ -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
}
}

1
samples/minimal/src/main/kotlin/io/element/android/samples/minimal/MainActivity.kt

@ -56,6 +56,7 @@ class MainActivity : ComponentActivity() { @@ -56,6 +56,7 @@ class MainActivity : ComponentActivity() {
clock = DefaultSystemClock(),
utdTracker = UtdTracker(NoopAnalyticsService()),
appPreferencesStore = InMemoryAppPreferencesStore(),
featureFlagService = AlwaysEnabledFeatureFlagService(),
),
passphraseGenerator = NullPassphraseGenerator(),
oidcConfigurationProvider = OidcConfigurationProvider(baseDirectory),

33
samples/minimal/src/main/kotlin/io/element/android/samples/minimal/RoomListScreen.kt

@ -25,8 +25,6 @@ import io.element.android.features.roomlist.impl.filters.selection.DefaultFilter @@ -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.RoomListSearchPresenter
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.DefaultLastMessageTimestampFormatter
import io.element.android.libraries.dateformatter.impl.LocalDateTimeProvider
@ -35,8 +33,6 @@ import io.element.android.libraries.eventformatter.impl.DefaultRoomLastMessageFo @@ -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.RoomMembershipContentFormatter
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.FullScreenIntentPermissionsState
import io.element.android.libraries.indicator.impl.DefaultIndicatorService
@ -70,13 +66,7 @@ class RoomListScreen( @@ -70,13 +66,7 @@ class RoomListScreen(
private val sessionVerificationService = matrixClient.sessionVerificationService()
private val encryptionService = matrixClient.encryptionService()
private val stringProvider = AndroidStringProvider(context.resources)
private val buildMeta = getBuildMeta(context)
private val featureFlagService = DefaultFeatureFlagService(
providers = setOf(
PreferencesFeatureFlagProvider(context = context, buildMeta = buildMeta)
),
buildMeta = buildMeta,
)
private val featureFlagService = AlwaysEnabledFeatureFlagService()
private val roomListRoomSummaryFactory = RoomListRoomSummaryFactory(
lastMessageTimestampFormatter = DefaultLastMessageTimestampFormatter(
localDateTimeProvider = dateTimeProvider,
@ -191,25 +181,4 @@ class RoomListScreen( @@ -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…
Cancel
Save