diff --git a/app/src/main/kotlin/com/wire/android/di/IsProfileQRCodeEnabledUseCaseProvider.kt b/app/src/main/kotlin/com/wire/android/di/IsProfileQRCodeEnabledUseCaseProvider.kt new file mode 100644 index 0000000000..b873359c0a --- /dev/null +++ b/app/src/main/kotlin/com/wire/android/di/IsProfileQRCodeEnabledUseCaseProvider.kt @@ -0,0 +1,39 @@ +/* + * Wire + * Copyright (C) 2025 Wire Swiss GmbH + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see http://www.gnu.org/licenses/. + */ +package com.wire.android.di + +import com.wire.kalium.logic.CoreLogic +import com.wire.kalium.logic.data.user.UserId +import com.wire.kalium.logic.feature.client.IsProfileQRCodeEnabledUseCase +import dagger.assisted.Assisted +import dagger.assisted.AssistedFactory +import dagger.assisted.AssistedInject + +class IsProfileQRCodeEnabledUseCaseProvider @AssistedInject constructor( + @KaliumCoreLogic private val coreLogic: CoreLogic, + @Assisted private val userId: UserId +) { + + val isProfileQRCodeEnabled: IsProfileQRCodeEnabledUseCase + get() = coreLogic.getSessionScope(userId).users.isProfileQRCodeEnabled + + @AssistedFactory + interface Factory { + fun create(userId: UserId): IsProfileQRCodeEnabledUseCaseProvider + } +} diff --git a/app/src/main/kotlin/com/wire/android/ui/WireActivityViewModel.kt b/app/src/main/kotlin/com/wire/android/ui/WireActivityViewModel.kt index c3efa292bd..858f687ff5 100644 --- a/app/src/main/kotlin/com/wire/android/ui/WireActivityViewModel.kt +++ b/app/src/main/kotlin/com/wire/android/ui/WireActivityViewModel.kt @@ -29,6 +29,7 @@ import com.wire.android.BuildConfig import com.wire.android.R import com.wire.android.appLogger import com.wire.android.datastore.GlobalDataStore +import com.wire.android.di.IsProfileQRCodeEnabledUseCaseProvider import com.wire.android.di.KaliumCoreLogic import com.wire.android.di.ObserveIfE2EIRequiredDuringLoginUseCaseProvider import com.wire.android.di.ObserveScreenshotCensoringConfigUseCaseProvider @@ -64,7 +65,6 @@ import com.wire.kalium.logic.data.sync.SyncState import com.wire.kalium.logic.data.user.UserId import com.wire.kalium.logic.feature.appVersioning.ObserveIfAppUpdateRequiredUseCase import com.wire.kalium.logic.feature.client.ClearNewClientsForUserUseCase -import com.wire.kalium.logic.feature.client.IsProfileQRCodeEnabledUseCase import com.wire.kalium.logic.feature.client.NewClientResult import com.wire.kalium.logic.feature.client.ObserveNewClientsUseCase import com.wire.kalium.logic.feature.conversation.CheckConversationInviteCodeUseCase @@ -123,7 +123,7 @@ class WireActivityViewModel @Inject constructor( private val globalDataStore: Lazy, private val observeIfE2EIRequiredDuringLoginUseCaseProviderFactory: ObserveIfE2EIRequiredDuringLoginUseCaseProvider.Factory, private val workManager: Lazy, - private val isProfileQRCodeEnabled: IsProfileQRCodeEnabledUseCase, + private val isProfileQRCodeEnabledFactory: IsProfileQRCodeEnabledUseCaseProvider.Factory, ) : ActionsViewModel() { var globalAppState: GlobalAppState by mutableStateOf(GlobalAppState()) @@ -517,10 +517,12 @@ class WireActivityViewModel @Inject constructor( } private fun onOpenUserProfileDeepLink(result: DeepLinkResult.OpenOtherUserProfile) = viewModelScope.launch { - if (isProfileQRCodeEnabled()) { - sendAction(OnOpenUserProfile(result)) - } else { - sendAction(ShowToast(R.string.profile_deeplink_feature_unavailable_title_alert)) + observeCurrentValidUserId.first()?.let { userId -> + if (isProfileQRCodeEnabledFactory.create(userId).isProfileQRCodeEnabled()) { + sendAction(OnOpenUserProfile(result)) + } else { + sendAction(ShowToast(R.string.profile_deeplink_feature_unavailable_title_alert)) + } } } diff --git a/app/src/test/kotlin/com/wire/android/ui/WireActivityViewModelTest.kt b/app/src/test/kotlin/com/wire/android/ui/WireActivityViewModelTest.kt index 927794719d..78a646d89e 100644 --- a/app/src/test/kotlin/com/wire/android/ui/WireActivityViewModelTest.kt +++ b/app/src/test/kotlin/com/wire/android/ui/WireActivityViewModelTest.kt @@ -30,6 +30,7 @@ import com.wire.android.config.CoroutineTestExtension import com.wire.android.config.TestDispatcherProvider import com.wire.android.config.mockUri import com.wire.android.datastore.GlobalDataStore +import com.wire.android.di.IsProfileQRCodeEnabledUseCaseProvider import com.wire.android.di.ObserveIfE2EIRequiredDuringLoginUseCaseProvider import com.wire.android.di.ObserveScreenshotCensoringConfigUseCaseProvider import com.wire.android.di.ObserveSyncStateUseCaseProvider @@ -846,7 +847,7 @@ class WireActivityViewModelTest { lateinit var observeEstablishedCalls: ObserveEstablishedCallsUseCase @MockK - lateinit var isProfileQRCodeEnabled: IsProfileQRCodeEnabledUseCase + lateinit var isProfileQRCodeEnabledFactory: IsProfileQRCodeEnabledUseCaseProvider.Factory private val viewModel by lazy { WireActivityViewModel( @@ -868,7 +869,7 @@ class WireActivityViewModelTest { globalDataStore = { globalDataStore }, observeIfE2EIRequiredDuringLoginUseCaseProviderFactory = observeIfE2EIRequiredDuringLoginUseCaseProviderFactory, workManager = { workManager }, - isProfileQRCodeEnabled = isProfileQRCodeEnabled, + isProfileQRCodeEnabledFactory = isProfileQRCodeEnabledFactory, ) } @@ -989,7 +990,9 @@ class WireActivityViewModelTest { } suspend fun withProfileQRCodeEnabled(isEnabled: Boolean = true) = apply { - coEvery { isProfileQRCodeEnabled() } returns isEnabled + val useCase = mockk() + coEvery { isProfileQRCodeEnabledFactory.create(any()).isProfileQRCodeEnabled } returns useCase + coEvery { useCase() } returns isEnabled } fun arrange() = this to viewModel