Skip to content

Commit

Permalink
fix: applock toggle state when enforced and responding to changes [WP…
Browse files Browse the repository at this point in the history
…B-5751] (#2566)

Co-authored-by: GitHub Actions <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Michał Saleniuk <saleniuk@gmail.com>
Co-authored-by: Michał Saleniuk <30429749+saleniuk@users.noreply.github.com>
  • Loading branch information
4 people committed Jan 8, 2024
1 parent 52decf5 commit e82429b
Show file tree
Hide file tree
Showing 8 changed files with 48 additions and 48 deletions.
6 changes: 3 additions & 3 deletions app/src/main/kotlin/com/wire/android/di/CoreLogicModule.kt
Expand Up @@ -35,7 +35,7 @@ import com.wire.kalium.logic.feature.connection.BlockUserUseCase
import com.wire.kalium.logic.feature.connection.UnblockUserUseCase
import com.wire.kalium.logic.feature.conversation.ObserveOtherUserSecurityClassificationLabelUseCase
import com.wire.kalium.logic.feature.conversation.ObserveSecurityClassificationLabelUseCase
import com.wire.kalium.logic.feature.featureConfig.IsAppLockEditableUseCase
import com.wire.kalium.logic.feature.featureConfig.ObserveIsAppLockEditableUseCase
import com.wire.kalium.logic.feature.selfDeletingMessages.ObserveSelfDeletionTimerSettingsForConversationUseCase
import com.wire.kalium.logic.feature.selfDeletingMessages.ObserveTeamSettingsSelfDeletingStatusUseCase
import com.wire.kalium.logic.feature.selfDeletingMessages.PersistNewSelfDeletionTimerUseCase
Expand Down Expand Up @@ -431,7 +431,7 @@ class UseCaseModule {

@ViewModelScoped
@Provides
fun provideIsAppLockEditableUseCase(
fun provideObserveIsAppLockEditableUseCase(
@KaliumCoreLogic coreLogic: CoreLogic
): IsAppLockEditableUseCase = coreLogic.getGlobalScope().isAppLockEditableUseCase
): ObserveIsAppLockEditableUseCase = coreLogic.getGlobalScope().observeIsAppLockEditableUseCase
}
Expand Up @@ -18,16 +18,17 @@
package com.wire.android.feature

import com.wire.android.datastore.GlobalDataStore
import com.wire.kalium.logic.feature.featureConfig.IsAppLockEditableUseCase
import com.wire.kalium.logic.feature.featureConfig.ObserveIsAppLockEditableUseCase
import dagger.hilt.android.scopes.ViewModelScoped
import kotlinx.coroutines.flow.firstOrNull
import javax.inject.Inject

@ViewModelScoped
class DisableAppLockUseCase @Inject constructor(
private val dataStore: GlobalDataStore,
private val isAppLockEditableUseCase: IsAppLockEditableUseCase
private val observeIsAppLockEditableUseCase: ObserveIsAppLockEditableUseCase
) {
suspend operator fun invoke(): Boolean = if (isAppLockEditableUseCase()) {
suspend operator fun invoke(): Boolean = if (observeIsAppLockEditableUseCase().firstOrNull() == true) {
dataStore.clearAppLockPasscode()
true
} else {
Expand Down
Expand Up @@ -29,9 +29,10 @@ import com.wire.android.feature.ObserveAppLockConfigUseCase
import com.wire.android.util.dispatchers.DispatcherProvider
import com.wire.kalium.logic.feature.applock.MarkTeamAppLockStatusAsNotifiedUseCase
import com.wire.kalium.logic.feature.auth.ValidatePasswordUseCase
import com.wire.kalium.logic.feature.featureConfig.IsAppLockEditableUseCase
import com.wire.kalium.logic.feature.featureConfig.ObserveIsAppLockEditableUseCase
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import javax.inject.Inject
Expand All @@ -42,8 +43,7 @@ class SetLockScreenViewModel @Inject constructor(
private val globalDataStore: GlobalDataStore,
private val dispatchers: DispatcherProvider,
private val observeAppLockConfig: ObserveAppLockConfigUseCase,
private val isAppLockEditable: IsAppLockEditableUseCase,
private val isAppLockEditableUseCase: IsAppLockEditableUseCase,
private val observeIsAppLockEditable: ObserveIsAppLockEditableUseCase,
private val markTeamAppLockStatusAsNotified: MarkTeamAppLockStatusAsNotifiedUseCase
) : ViewModel() {

Expand All @@ -52,14 +52,15 @@ class SetLockScreenViewModel @Inject constructor(

init {
viewModelScope.launch {
val isEditable = isAppLockEditable()
observeAppLockConfig()
.collectLatest {
state = state.copy(
timeout = it.timeout,
isEditable = isEditable
)
}
combine(
observeAppLockConfig(),
observeIsAppLockEditable()
) { config, isEditable ->
SetLockCodeViewState(
timeout = config.timeout,
isEditable = isEditable
)
}.collectLatest { state = it }
}
}

Expand All @@ -85,7 +86,7 @@ class SetLockScreenViewModel @Inject constructor(
viewModelScope.launch {
withContext(dispatchers.io()) {
with(globalDataStore) {
val source = if (isAppLockEditableUseCase()) {
val source = if (state.isEditable) {
AppLockSource.Manual
} else {
AppLockSource.TeamEnforced
Expand Down
Expand Up @@ -114,12 +114,11 @@ fun SettingsScreenContent(
}
add(SettingsItem.NetworkSettings)

appLogger.d("AppLockConfig " +
"isAppLockEditable: ${settingsState.isAppLockEditable} isAppLockEnabled: ${settingsState.isAppLockEnabled}")
add(SettingsItem.AppLock(
when (settingsState.isAppLockEditable) {
true -> {
appLogger.d("AppLockConfig isAooLockEditable: ${settingsState.isAppLockEditable}")

appLogger.d("AppLockConfig isAppLockEnabled: ${settingsState.isAppLockEnabled}")
SwitchState.Enabled(
value = settingsState.isAppLockEnabled,
isOnOffVisible = true,
Expand All @@ -128,12 +127,8 @@ fun SettingsScreenContent(
}

false -> {
appLogger.d("AppLockConfig isAooLockEditable: ${settingsState.isAppLockEditable}")

appLogger.d("AppLockConfig isAppLockEnabled: ${settingsState.isAppLockEnabled}")
SwitchState.Disabled(
SwitchState.TextOnly(
value = settingsState.isAppLockEnabled,
isOnOffVisible = true,
)
}
}
Expand Down
Expand Up @@ -24,27 +24,32 @@ import androidx.compose.runtime.setValue
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.wire.android.datastore.GlobalDataStore
import com.wire.kalium.logic.feature.featureConfig.IsAppLockEditableUseCase
import com.wire.kalium.logic.feature.featureConfig.ObserveIsAppLockEditableUseCase
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.launch
import javax.inject.Inject

@HiltViewModel
class SettingsViewModel @Inject constructor(
private val globalDataStore: GlobalDataStore,
private val isAppLockEditableUseCase: IsAppLockEditableUseCase
private val observeIsAppLockEditable: ObserveIsAppLockEditableUseCase
) : ViewModel() {
var state by mutableStateOf(SettingsState())
private set

init {
viewModelScope.launch {
isAppLockEditableUseCase().let {
state = state.copy(isAppLockEditable = it)
}
globalDataStore.isAppLockPasscodeSetFlow().collect {
state = state.copy(isAppLockEnabled = it)
}
combine(
observeIsAppLockEditable(),
globalDataStore.isAppLockPasscodeSetFlow()
) {
isAppLockEditable, isAppLockEnabled ->
SettingsState(
isAppLockEditable = isAppLockEditable,
isAppLockEnabled = isAppLockEnabled
)
}.collect { state = it }
}
}

Expand Down
Expand Up @@ -18,11 +18,12 @@
package com.wire.android.feature

import com.wire.android.datastore.GlobalDataStore
import com.wire.kalium.logic.feature.featureConfig.IsAppLockEditableUseCase
import com.wire.kalium.logic.feature.featureConfig.ObserveIsAppLockEditableUseCase
import io.mockk.MockKAnnotations
import io.mockk.coEvery
import io.mockk.coVerify
import io.mockk.impl.annotations.MockK
import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.test.runTest
import org.junit.jupiter.api.Test

Expand Down Expand Up @@ -60,15 +61,15 @@ class DisableAppLockUseCaseTest {
lateinit var dataStore: GlobalDataStore

@MockK
lateinit var isAppLockEditableUseCase: IsAppLockEditableUseCase
lateinit var observeIsAppLockEditableUseCase: ObserveIsAppLockEditableUseCase

private val useCase = DisableAppLockUseCase(
dataStore,
isAppLockEditableUseCase
observeIsAppLockEditableUseCase
)

fun withAppLockEditable(result: Boolean) = apply {
coEvery { isAppLockEditableUseCase() } returns result
coEvery { observeIsAppLockEditableUseCase() } returns flowOf(result)
}

fun withClearAppLockPasscode() = apply {
Expand Down
Expand Up @@ -26,7 +26,7 @@ import com.wire.android.feature.ObserveAppLockConfigUseCase
import com.wire.kalium.logic.feature.applock.MarkTeamAppLockStatusAsNotifiedUseCase
import com.wire.kalium.logic.feature.auth.ValidatePasswordResult
import com.wire.kalium.logic.feature.auth.ValidatePasswordUseCase
import com.wire.kalium.logic.feature.featureConfig.IsAppLockEditableUseCase
import com.wire.kalium.logic.feature.featureConfig.ObserveIsAppLockEditableUseCase
import io.mockk.MockKAnnotations
import io.mockk.coEvery
import io.mockk.every
Expand Down Expand Up @@ -83,18 +83,16 @@ class SetLockScreenViewModelTest {
private lateinit var markTeamAppLockStatusAsNotified: MarkTeamAppLockStatusAsNotifiedUseCase

@MockK
private lateinit var isAppLockEditable: IsAppLockEditableUseCase

@MockK
private lateinit var isAppLockEditableUseCase: IsAppLockEditableUseCase
private lateinit var observeIsAppLockEditableUseCase: ObserveIsAppLockEditableUseCase

init {
MockKAnnotations.init(this, relaxUnitFun = true)
coEvery { globalDataStore.setUserAppLock(any(), any()) } returns Unit
coEvery { observeAppLockConfig() } returns flowOf(
AppLockConfig.Disabled(ObserveAppLockConfigUseCase.DEFAULT_APP_LOCK_TIMEOUT)
)
coEvery { isAppLockEditable() } returns true

coEvery { observeIsAppLockEditableUseCase() } returns flowOf(true)
}

fun withValidPassword() = apply {
Expand All @@ -106,16 +104,15 @@ class SetLockScreenViewModelTest {
}

fun withIsAppLockEditable(result: Boolean) = apply {
coEvery { isAppLockEditableUseCase() } returns result
coEvery { observeIsAppLockEditableUseCase() } returns flowOf(result)
}

private val viewModel = SetLockScreenViewModel(
validatePassword,
globalDataStore,
TestDispatcherProvider(),
observeAppLockConfig,
isAppLockEditable,
isAppLockEditableUseCase,
observeIsAppLockEditableUseCase,
markTeamAppLockStatusAsNotified
)

Expand Down
2 changes: 1 addition & 1 deletion kalium
Submodule kalium updated 2124 files

0 comments on commit e82429b

Please sign in to comment.