Browse Source

Pin unlock : hides behind feature flag (disabled by default)

pull/1554/head
ganfra 11 months ago
parent
commit
304ec0b740
  1. 2
      appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt
  2. 4
      features/pin/api/src/main/kotlin/io/element/android/features/pin/api/PinStateDataSource.kt
  3. 1
      features/pin/impl/build.gradle.kts
  4. 6
      features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/auth/PinAuthenticationPresenter.kt
  5. 16
      features/pin/impl/src/main/kotlin/io/element/android/features/pin/impl/state/DefaultPinStateDataSource.kt
  6. 6
      libraries/featureflag/api/src/main/kotlin/io/element/android/libraries/featureflag/api/FeatureFlags.kt
  7. 1
      libraries/featureflag/impl/src/main/kotlin/io/element/android/libraries/featureflag/impl/StaticFeatureFlagProvider.kt

2
appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt

@ -135,9 +135,9 @@ class LoggedInFlowNode @AssistedInject constructor(
} }
}, },
onStop = { onStop = {
coroutineScope.launch {
pinStateDataSource.lock() pinStateDataSource.lock()
//Counterpart startSync is done in observeSyncStateAndNetworkStatus method. //Counterpart startSync is done in observeSyncStateAndNetworkStatus method.
coroutineScope.launch {
syncService.stopSync() syncService.stopSync()
} }
}, },

4
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 { interface PinStateDataSource {
val pinState: StateFlow<PinState> val pinState: StateFlow<PinState>
fun lock() suspend fun lock()
fun unlock() suspend fun unlock()
} }

1
features/pin/impl/build.gradle.kts

@ -40,6 +40,7 @@ dependencies {
implementation(projects.libraries.matrix.api) implementation(projects.libraries.matrix.api)
implementation(projects.libraries.matrixui) implementation(projects.libraries.matrixui)
implementation(projects.libraries.designsystem) implementation(projects.libraries.designsystem)
implementation(projects.libraries.featureflag.api)
testImplementation(libs.test.junit) testImplementation(libs.test.junit)
testImplementation(libs.coroutines.test) testImplementation(libs.coroutines.test)

6
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 androidx.compose.runtime.Composable
import io.element.android.features.pin.api.PinStateDataSource import io.element.android.features.pin.api.PinStateDataSource
import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.architecture.Presenter
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch
import javax.inject.Inject import javax.inject.Inject
class PinAuthenticationPresenter @Inject constructor( class PinAuthenticationPresenter @Inject constructor(
private val pinStateDataSource: PinStateDataSource, private val pinStateDataSource: PinStateDataSource,
private val coroutineScope: CoroutineScope,
) : Presenter<PinAuthenticationState> { ) : Presenter<PinAuthenticationState> {
@Composable @Composable
override fun present(): PinAuthenticationState { override fun present(): PinAuthenticationState {
fun handleEvents(event: PinAuthenticationEvents) { fun handleEvents(event: PinAuthenticationEvents) {
when (event) { when (event) {
PinAuthenticationEvents.Unlock -> pinStateDataSource.unlock() PinAuthenticationEvents.Unlock -> coroutineScope.launch { pinStateDataSource.unlock() }
} }
} }
return PinAuthenticationState( return PinAuthenticationState(

16
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.features.pin.api.PinStateDataSource
import io.element.android.libraries.di.AppScope import io.element.android.libraries.di.AppScope
import io.element.android.libraries.di.SingleIn 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.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.StateFlow
import javax.inject.Inject import javax.inject.Inject
@SingleIn(AppScope::class) @SingleIn(AppScope::class)
@ContributesBinding(AppScope::class) @ContributesBinding(AppScope::class)
class DefaultPinStateDataSource @Inject constructor() : PinStateDataSource { class DefaultPinStateDataSource @Inject constructor(
private val featureFlagService: FeatureFlagService,
) : PinStateDataSource {
private val _pinState = MutableStateFlow<PinState>(PinState.Locked) private val _pinState = MutableStateFlow<PinState>(PinState.Unlocked)
override val pinState: StateFlow<PinState> = _pinState override val pinState: StateFlow<PinState> = _pinState
override fun unlock() { override suspend fun unlock() {
if (featureFlagService.isFeatureEnabled(FeatureFlags.PinUnlock)) {
_pinState.value = PinState.Unlocked _pinState.value = PinState.Unlocked
} }
}
override fun lock() { override suspend fun lock() {
if (featureFlagService.isFeatureEnabled(FeatureFlags.PinUnlock)) {
_pinState.value = PinState.Locked _pinState.value = PinState.Locked
} }
} }
}

6
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", description = "Send and receive voice messages",
defaultValue = false, 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,
),
} }

1
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.Polls -> true
FeatureFlags.NotificationSettings -> true FeatureFlags.NotificationSettings -> true
FeatureFlags.VoiceMessages -> false FeatureFlags.VoiceMessages -> false
FeatureFlags.PinUnlock -> false
} }
} else { } else {
false false

Loading…
Cancel
Save