From e82429b071721660a0c07836abe33ab5e461078e Mon Sep 17 00:00:00 2001 From: AndroidBob Date: Mon, 8 Jan 2024 17:46:34 +0100 Subject: [PATCH] fix: applock toggle state when enforced and responding to changes [WPB-5751] (#2566) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: GitHub Actions <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Michał Saleniuk Co-authored-by: Michał Saleniuk <30429749+saleniuk@users.noreply.github.com> --- .../com/wire/android/di/CoreLogicModule.kt | 6 ++--- .../android/feature/DisableAppLockUseCase.kt | 7 +++--- .../appLock/set/SetLockScreenViewModel.kt | 25 ++++++++++--------- .../ui/home/settings/SettingsScreen.kt | 11 +++----- .../ui/home/settings/SettingsViewModel.kt | 21 ++++++++++------ .../feature/DisableAppLockUseCaseTest.kt | 9 ++++--- .../appLock/set/SetLockScreenViewModelTest.kt | 15 +++++------ kalium | 2 +- 8 files changed, 48 insertions(+), 48 deletions(-) diff --git a/app/src/main/kotlin/com/wire/android/di/CoreLogicModule.kt b/app/src/main/kotlin/com/wire/android/di/CoreLogicModule.kt index 09dee673c2..8adb6e3d7a 100644 --- a/app/src/main/kotlin/com/wire/android/di/CoreLogicModule.kt +++ b/app/src/main/kotlin/com/wire/android/di/CoreLogicModule.kt @@ -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 @@ -431,7 +431,7 @@ class UseCaseModule { @ViewModelScoped @Provides - fun provideIsAppLockEditableUseCase( + fun provideObserveIsAppLockEditableUseCase( @KaliumCoreLogic coreLogic: CoreLogic - ): IsAppLockEditableUseCase = coreLogic.getGlobalScope().isAppLockEditableUseCase + ): ObserveIsAppLockEditableUseCase = coreLogic.getGlobalScope().observeIsAppLockEditableUseCase } diff --git a/app/src/main/kotlin/com/wire/android/feature/DisableAppLockUseCase.kt b/app/src/main/kotlin/com/wire/android/feature/DisableAppLockUseCase.kt index 6e7c214027..8f19a13a68 100644 --- a/app/src/main/kotlin/com/wire/android/feature/DisableAppLockUseCase.kt +++ b/app/src/main/kotlin/com/wire/android/feature/DisableAppLockUseCase.kt @@ -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 { diff --git a/app/src/main/kotlin/com/wire/android/ui/home/appLock/set/SetLockScreenViewModel.kt b/app/src/main/kotlin/com/wire/android/ui/home/appLock/set/SetLockScreenViewModel.kt index 8e2a36147f..d78ea6acff 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/appLock/set/SetLockScreenViewModel.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/appLock/set/SetLockScreenViewModel.kt @@ -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 @@ -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() { @@ -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 } } } @@ -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 diff --git a/app/src/main/kotlin/com/wire/android/ui/home/settings/SettingsScreen.kt b/app/src/main/kotlin/com/wire/android/ui/home/settings/SettingsScreen.kt index bc5513a9c4..afac552afb 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/settings/SettingsScreen.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/settings/SettingsScreen.kt @@ -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, @@ -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, ) } } diff --git a/app/src/main/kotlin/com/wire/android/ui/home/settings/SettingsViewModel.kt b/app/src/main/kotlin/com/wire/android/ui/home/settings/SettingsViewModel.kt index a96e9600d1..df18901d05 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/settings/SettingsViewModel.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/settings/SettingsViewModel.kt @@ -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 } } } diff --git a/app/src/test/kotlin/com/wire/android/feature/DisableAppLockUseCaseTest.kt b/app/src/test/kotlin/com/wire/android/feature/DisableAppLockUseCaseTest.kt index f9ce774446..45180b477b 100644 --- a/app/src/test/kotlin/com/wire/android/feature/DisableAppLockUseCaseTest.kt +++ b/app/src/test/kotlin/com/wire/android/feature/DisableAppLockUseCaseTest.kt @@ -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 @@ -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 { diff --git a/app/src/test/kotlin/com/wire/android/ui/home/appLock/set/SetLockScreenViewModelTest.kt b/app/src/test/kotlin/com/wire/android/ui/home/appLock/set/SetLockScreenViewModelTest.kt index aa005b73f5..b1df6468d6 100644 --- a/app/src/test/kotlin/com/wire/android/ui/home/appLock/set/SetLockScreenViewModelTest.kt +++ b/app/src/test/kotlin/com/wire/android/ui/home/appLock/set/SetLockScreenViewModelTest.kt @@ -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 @@ -83,10 +83,7 @@ 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) @@ -94,7 +91,8 @@ class SetLockScreenViewModelTest { coEvery { observeAppLockConfig() } returns flowOf( AppLockConfig.Disabled(ObserveAppLockConfigUseCase.DEFAULT_APP_LOCK_TIMEOUT) ) - coEvery { isAppLockEditable() } returns true + + coEvery { observeIsAppLockEditableUseCase() } returns flowOf(true) } fun withValidPassword() = apply { @@ -106,7 +104,7 @@ class SetLockScreenViewModelTest { } fun withIsAppLockEditable(result: Boolean) = apply { - coEvery { isAppLockEditableUseCase() } returns result + coEvery { observeIsAppLockEditableUseCase() } returns flowOf(result) } private val viewModel = SetLockScreenViewModel( @@ -114,8 +112,7 @@ class SetLockScreenViewModelTest { globalDataStore, TestDispatcherProvider(), observeAppLockConfig, - isAppLockEditable, - isAppLockEditableUseCase, + observeIsAppLockEditableUseCase, markTeamAppLockStatusAsNotified ) diff --git a/kalium b/kalium index 9b7234ded6..e85f2e54e0 160000 --- a/kalium +++ b/kalium @@ -1 +1 @@ -Subproject commit 9b7234ded60a6d4609f9a6d00cad9db48a017ffb +Subproject commit e85f2e54e070e28b90df8d60ace18c8b254bc9f9