diff --git a/appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt b/appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt index 6bc8c3afaf..8879c39220 100644 --- a/appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt @@ -135,9 +135,9 @@ class LoggedInFlowNode @AssistedInject constructor( } }, onStop = { - pinStateDataSource.lock() - //Counterpart startSync is done in observeSyncStateAndNetworkStatus method. coroutineScope.launch { + pinStateDataSource.lock() + //Counterpart startSync is done in observeSyncStateAndNetworkStatus method. syncService.stopSync() } }, diff --git a/features/pin/api/src/main/kotlin/io/element/android/features/pin/api/PinStateDataSource.kt b/features/pin/api/src/main/kotlin/io/element/android/features/pin/api/PinStateDataSource.kt index c0b52af8b7..5098f6c0a6 100644 --- a/features/pin/api/src/main/kotlin/io/element/android/features/pin/api/PinStateDataSource.kt +++ b/features/pin/api/src/main/kotlin/io/element/android/features/pin/api/PinStateDataSource.kt @@ -21,6 +21,6 @@ import kotlinx.coroutines.flow.StateFlow interface PinStateDataSource { val pinState: StateFlow - fun lock() - fun unlock() + suspend fun lock() + suspend fun unlock() } diff --git a/features/pin/impl/build.gradle.kts b/features/pin/impl/build.gradle.kts index 6bf14646e3..0d115ac46c 100644 --- a/features/pin/impl/build.gradle.kts +++ b/features/pin/impl/build.gradle.kts @@ -40,6 +40,7 @@ dependencies { implementation(projects.libraries.matrix.api) implementation(projects.libraries.matrixui) implementation(projects.libraries.designsystem) + implementation(projects.libraries.featureflag.api) testImplementation(libs.test.junit) testImplementation(libs.coroutines.test) diff --git a/features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/auth/PinAuthenticationPresenter.kt b/features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/auth/PinAuthenticationPresenter.kt index 36970f34ab..a9660552ad 100644 --- a/features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/auth/PinAuthenticationPresenter.kt +++ b/features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/auth/PinAuthenticationPresenter.kt @@ -19,17 +19,21 @@ package io.element.android.features.pin.impl.auth import androidx.compose.runtime.Composable import io.element.android.features.pin.api.PinStateDataSource import io.element.android.libraries.architecture.Presenter +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.launch import javax.inject.Inject class PinAuthenticationPresenter @Inject constructor( private val pinStateDataSource: PinStateDataSource, + private val coroutineScope: CoroutineScope, ) : Presenter { @Composable override fun present(): PinAuthenticationState { + fun handleEvents(event: PinAuthenticationEvents) { when (event) { - PinAuthenticationEvents.Unlock -> pinStateDataSource.unlock() + PinAuthenticationEvents.Unlock -> coroutineScope.launch { pinStateDataSource.unlock() } } } return PinAuthenticationState( diff --git a/features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/state/DefaultPinStateDataSource.kt b/features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/state/DefaultPinStateDataSource.kt index e0f8c6e6f9..396d3a8d3a 100644 --- a/features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/state/DefaultPinStateDataSource.kt +++ b/features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/state/DefaultPinStateDataSource.kt @@ -21,22 +21,30 @@ import io.element.android.features.pin.api.PinState import io.element.android.features.pin.api.PinStateDataSource import io.element.android.libraries.di.AppScope import io.element.android.libraries.di.SingleIn +import io.element.android.libraries.featureflag.api.FeatureFlagService +import io.element.android.libraries.featureflag.api.FeatureFlags import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import javax.inject.Inject @SingleIn(AppScope::class) @ContributesBinding(AppScope::class) -class DefaultPinStateDataSource @Inject constructor() : PinStateDataSource { +class DefaultPinStateDataSource @Inject constructor( + private val featureFlagService: FeatureFlagService, +) : PinStateDataSource { - private val _pinState = MutableStateFlow(PinState.Locked) + private val _pinState = MutableStateFlow(PinState.Unlocked) override val pinState: StateFlow = _pinState - override fun unlock() { - _pinState.value = PinState.Unlocked + override suspend fun unlock() { + if (featureFlagService.isFeatureEnabled(FeatureFlags.PinUnlock)) { + _pinState.value = PinState.Unlocked + } } - override fun lock() { - _pinState.value = PinState.Locked + override suspend fun lock() { + if (featureFlagService.isFeatureEnabled(FeatureFlags.PinUnlock)) { + _pinState.value = PinState.Locked + } } } diff --git a/libraries/featureflag/api/src/main/kotlin/io/element/android/libraries/featureflag/api/FeatureFlags.kt b/libraries/featureflag/api/src/main/kotlin/io/element/android/libraries/featureflag/api/FeatureFlags.kt index 8d35223986..121cf26271 100644 --- a/libraries/featureflag/api/src/main/kotlin/io/element/android/libraries/featureflag/api/FeatureFlags.kt +++ b/libraries/featureflag/api/src/main/kotlin/io/element/android/libraries/featureflag/api/FeatureFlags.kt @@ -49,4 +49,10 @@ enum class FeatureFlags( description = "Send and receive voice messages", defaultValue = false, ), + PinUnlock( + key = "feature.pinunlock", + title = "Pin unlock", + description = "Allow user to lock/unlock the app with a pin code or biometrics", + defaultValue = false, + ), } diff --git a/libraries/featureflag/impl/src/main/kotlin/io/element/android/libraries/featureflag/impl/StaticFeatureFlagProvider.kt b/libraries/featureflag/impl/src/main/kotlin/io/element/android/libraries/featureflag/impl/StaticFeatureFlagProvider.kt index 7ef10262c9..48f159de83 100644 --- a/libraries/featureflag/impl/src/main/kotlin/io/element/android/libraries/featureflag/impl/StaticFeatureFlagProvider.kt +++ b/libraries/featureflag/impl/src/main/kotlin/io/element/android/libraries/featureflag/impl/StaticFeatureFlagProvider.kt @@ -36,6 +36,7 @@ class StaticFeatureFlagProvider @Inject constructor() : FeatureFlags.Polls -> true FeatureFlags.NotificationSettings -> true FeatureFlags.VoiceMessages -> false + FeatureFlags.PinUnlock -> false } } else { false