Pin unlock : hides behind feature flag (disabled by default)
This commit is contained in:
parent
45feedb208
commit
760ea44e9d
7 changed files with 31 additions and 11 deletions
|
|
@ -135,9 +135,9 @@ class LoggedInFlowNode @AssistedInject constructor(
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
onStop = {
|
onStop = {
|
||||||
pinStateDataSource.lock()
|
|
||||||
//Counterpart startSync is done in observeSyncStateAndNetworkStatus method.
|
|
||||||
coroutineScope.launch {
|
coroutineScope.launch {
|
||||||
|
pinStateDataSource.lock()
|
||||||
|
//Counterpart startSync is done in observeSyncStateAndNetworkStatus method.
|
||||||
syncService.stopSync()
|
syncService.stopSync()
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -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()
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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(
|
||||||
|
|
|
||||||
|
|
@ -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() {
|
||||||
_pinState.value = PinState.Unlocked
|
if (featureFlagService.isFeatureEnabled(FeatureFlags.PinUnlock)) {
|
||||||
|
_pinState.value = PinState.Unlocked
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun lock() {
|
override suspend fun lock() {
|
||||||
_pinState.value = PinState.Locked
|
if (featureFlagService.isFeatureEnabled(FeatureFlags.PinUnlock)) {
|
||||||
|
_pinState.value = PinState.Locked
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
),
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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…
Add table
Add a link
Reference in a new issue