Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: applock toggle state when enforced and responding to changes [WPB-5751] #2566

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
6 changes: 3 additions & 3 deletions app/src/main/kotlin/com/wire/android/di/CoreLogicModule.kt
Original file line number Diff line number Diff line change
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
}
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
Expand Up @@ -24,27 +24,32 @@
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

Check warning on line 36 in app/src/main/kotlin/com/wire/android/ui/home/settings/SettingsViewModel.kt

View check run for this annotation

Codecov / codecov/patch

app/src/main/kotlin/com/wire/android/ui/home/settings/SettingsViewModel.kt#L36

Added line #L36 was not covered by tests
) : 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()

Check warning on line 45 in app/src/main/kotlin/com/wire/android/ui/home/settings/SettingsViewModel.kt

View check run for this annotation

Codecov / codecov/patch

app/src/main/kotlin/com/wire/android/ui/home/settings/SettingsViewModel.kt#L43-L45

Added lines #L43 - L45 were not covered by tests
) {
isAppLockEditable, isAppLockEnabled ->
SettingsState(

Check warning on line 48 in app/src/main/kotlin/com/wire/android/ui/home/settings/SettingsViewModel.kt

View check run for this annotation

Codecov / codecov/patch

app/src/main/kotlin/com/wire/android/ui/home/settings/SettingsViewModel.kt#L48

Added line #L48 was not covered by tests
isAppLockEditable = isAppLockEditable,
isAppLockEnabled = isAppLockEnabled
)
}.collect { state = it }

Check warning on line 52 in app/src/main/kotlin/com/wire/android/ui/home/settings/SettingsViewModel.kt

View check run for this annotation

Codecov / codecov/patch

app/src/main/kotlin/com/wire/android/ui/home/settings/SettingsViewModel.kt#L52

Added line #L52 was not covered by tests
}
}

Expand Down
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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