From e44a6027eb459a31f99cd0a204ac03f2b2d50825 Mon Sep 17 00:00:00 2001 From: Oussama Hassine Date: Wed, 20 Mar 2024 17:09:24 +0100 Subject: [PATCH 1/4] fix: run crlCheckWorker and FeatureFlagsSyncWorker on every app launch --- .../android/di/accountScoped/UserModule.kt | 18 ++++++++ .../wire/android/ui/home/AppSyncViewModel.kt | 45 +++++++++++++++++++ .../com/wire/android/ui/home/HomeScreen.kt | 23 +++++++++- .../com/wire/android/ui/home/HomeViewModel.kt | 7 ++- 4 files changed, 91 insertions(+), 2 deletions(-) create mode 100644 app/src/main/kotlin/com/wire/android/ui/home/AppSyncViewModel.kt diff --git a/app/src/main/kotlin/com/wire/android/di/accountScoped/UserModule.kt b/app/src/main/kotlin/com/wire/android/di/accountScoped/UserModule.kt index b36e3857ba..524bbfc748 100644 --- a/app/src/main/kotlin/com/wire/android/di/accountScoped/UserModule.kt +++ b/app/src/main/kotlin/com/wire/android/di/accountScoped/UserModule.kt @@ -26,10 +26,13 @@ import com.wire.kalium.logic.feature.asset.GetAssetSizeLimitUseCase import com.wire.kalium.logic.feature.asset.GetAvatarAssetUseCase import com.wire.kalium.logic.feature.client.FinalizeMLSClientAfterE2EIEnrollment import com.wire.kalium.logic.feature.conversation.GetAllContactsNotInConversationUseCase +import com.wire.kalium.logic.feature.e2ei.CertificateRevocationListCheckWorker import com.wire.kalium.logic.feature.e2ei.usecase.GetE2eiCertificateUseCase import com.wire.kalium.logic.feature.e2ei.usecase.GetMembersE2EICertificateStatusesUseCase import com.wire.kalium.logic.feature.e2ei.usecase.GetUserE2eiCertificateStatusUseCase import com.wire.kalium.logic.feature.e2ei.usecase.GetUserE2eiCertificatesUseCase +import com.wire.kalium.logic.feature.e2ei.usecase.ObserveCertificateRevocationForSelfClientUseCase +import com.wire.kalium.logic.feature.featureConfig.FeatureFlagsSyncWorker import com.wire.kalium.logic.feature.publicuser.GetAllContactsUseCase import com.wire.kalium.logic.feature.publicuser.GetKnownUserUseCase import com.wire.kalium.logic.feature.publicuser.RefreshUsersWithoutMetadataUseCase @@ -226,4 +229,19 @@ class UserModule { @Provides fun provideGetUserE2eiCertificates(userScope: UserScope): GetUserE2eiCertificatesUseCase = userScope.getUserE2eiCertificates + + @ViewModelScoped + @Provides + fun provideCertificateRevocationListCheckWorker(userScope: UserScope): CertificateRevocationListCheckWorker = + userScope.certificateRevocationListCheckWorker + + @ViewModelScoped + @Provides + fun provideFeatureFlagsSyncWorker(userScope: UserScope): FeatureFlagsSyncWorker = + userScope.featureFlagsSyncWorker + + @ViewModelScoped + @Provides + fun provideObserveCertificateRevocationForSelfClientUseCase(userScope: UserScope): ObserveCertificateRevocationForSelfClientUseCase = + userScope.observeCertificateRevocationForSelfClient } diff --git a/app/src/main/kotlin/com/wire/android/ui/home/AppSyncViewModel.kt b/app/src/main/kotlin/com/wire/android/ui/home/AppSyncViewModel.kt new file mode 100644 index 0000000000..e91b704532 --- /dev/null +++ b/app/src/main/kotlin/com/wire/android/ui/home/AppSyncViewModel.kt @@ -0,0 +1,45 @@ +/* + * Wire + * Copyright (C) 2024 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.ui.home + +import androidx.lifecycle.SavedStateHandle +import androidx.lifecycle.viewModelScope +import com.wire.android.navigation.SavedStateViewModel +import com.wire.kalium.logic.feature.e2ei.CertificateRevocationListCheckWorker +import com.wire.kalium.logic.feature.e2ei.usecase.ObserveCertificateRevocationForSelfClientUseCase +import com.wire.kalium.logic.feature.featureConfig.FeatureFlagsSyncWorker +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.launch +import javax.inject.Inject + +@HiltViewModel +class AppSyncViewModel @Inject constructor( + override val savedStateHandle: SavedStateHandle, + private val certificateRevocationListCheckWorker: CertificateRevocationListCheckWorker, + private val bserveCertificateRevocationForSelfClient: ObserveCertificateRevocationForSelfClientUseCase, + private val featureFlagsSyncWorker: FeatureFlagsSyncWorker +) : SavedStateViewModel(savedStateHandle) { + + fun startSyncingAppConfig() { + viewModelScope.launch { + certificateRevocationListCheckWorker.execute() + bserveCertificateRevocationForSelfClient.invoke() + featureFlagsSyncWorker.execute() + } + } +} diff --git a/app/src/main/kotlin/com/wire/android/ui/home/HomeScreen.kt b/app/src/main/kotlin/com/wire/android/ui/home/HomeScreen.kt index 9330e43cab..b64521cc64 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/HomeScreen.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/HomeScreen.kt @@ -38,6 +38,7 @@ import androidx.compose.material3.ModalDrawerSheet import androidx.compose.material3.ModalNavigationDrawer import androidx.compose.material3.SnackbarHostState import androidx.compose.runtime.Composable +import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.remember import androidx.compose.ui.Modifier @@ -52,6 +53,7 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.min import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.Lifecycle +import androidx.lifecycle.LifecycleEventObserver import com.google.accompanist.navigation.material.ExperimentalMaterialNavigationApi import com.ramcosta.composedestinations.DestinationsNavHost import com.ramcosta.composedestinations.animations.defaults.RootNavGraphDefaultAnimations @@ -96,6 +98,7 @@ import kotlinx.coroutines.launch fun HomeScreen( navigator: Navigator, homeViewModel: HomeViewModel = hiltViewModel(), + appSyncViewModel: AppSyncViewModel = hiltViewModel(), homeDrawerViewModel: HomeDrawerViewModel = hiltViewModel(), conversationListViewModel: ConversationListViewModel = hiltViewModel(), // TODO: move required elements from this one to HomeViewModel?, groupDetailsScreenResultRecipient: ResultRecipient, @@ -106,6 +109,21 @@ fun HomeScreen( val showNotificationsFlow = rememberRequestPushNotificationsPermissionFlow( onPermissionDenied = { /** TODO: Show a dialog rationale explaining why the permission is needed **/ }) + val lifecycleOwner = LocalLifecycleOwner.current + + DisposableEffect(lifecycleOwner) { + val observer = LifecycleEventObserver { source, event -> + if (event == Lifecycle.Event.ON_RESUME) { + appSyncViewModel.startSyncingAppConfig() + } + } + lifecycleOwner.lifecycle.addObserver(observer) + + onDispose { + lifecycleOwner.lifecycle.removeObserver(observer) + } + } + LaunchedEffect(homeViewModel.savedStateHandle) { showNotificationsFlow.launch() } @@ -300,7 +318,10 @@ fun HomeContent( contentScale = ContentScale.FillBounds, colorFilter = ColorFilter.tint(MaterialTheme.colorScheme.onPrimary), modifier = Modifier - .padding(start = dimensions().spacing4x, top = dimensions().spacing2x) + .padding( + start = dimensions().spacing4x, + top = dimensions().spacing2x + ) .size(dimensions().fabIconSize) ) }, diff --git a/app/src/main/kotlin/com/wire/android/ui/home/HomeViewModel.kt b/app/src/main/kotlin/com/wire/android/ui/home/HomeViewModel.kt index ffcaa4ed58..f810fec27e 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/HomeViewModel.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/HomeViewModel.kt @@ -29,6 +29,7 @@ import com.wire.android.model.ImageAsset.UserAvatarAsset import com.wire.android.navigation.SavedStateViewModel import com.wire.android.util.ui.WireSessionImageLoader import com.wire.kalium.logic.feature.client.NeedsToRegisterClientUseCase +import com.wire.kalium.logic.feature.e2ei.CertificateRevocationListCheckWorker import com.wire.kalium.logic.feature.user.GetSelfUserUseCase import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.first @@ -43,7 +44,8 @@ class HomeViewModel @Inject constructor( private val getSelf: GetSelfUserUseCase, private val needsToRegisterClient: NeedsToRegisterClientUseCase, private val wireSessionImageLoader: WireSessionImageLoader, - private val shouldTriggerMigrationForUser: ShouldTriggerMigrationForUserUserCase + private val shouldTriggerMigrationForUser: ShouldTriggerMigrationForUserUserCase, + private val certificateRevocationListCheckWorker: CertificateRevocationListCheckWorker ) : SavedStateViewModel(savedStateHandle) { var homeState by mutableStateOf(HomeState()) @@ -51,6 +53,9 @@ class HomeViewModel @Inject constructor( init { loadUserAvatar() + viewModelScope.launch { + certificateRevocationListCheckWorker.execute() + } } fun checkRequirements(onRequirement: (HomeRequirement) -> Unit) { From 0edad1269f5b9eb2d680c71cae64c330c5e9d257 Mon Sep 17 00:00:00 2001 From: Oussama Hassine Date: Mon, 25 Mar 2024 09:57:30 +0100 Subject: [PATCH 2/4] chore: run certificateRevocationListCheckWorker, observeCertificateRevocationForSelfClient and featureFlagsSyncWorker asynchronously --- .../kotlin/com/wire/android/ui/home/AppSyncViewModel.kt | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/app/src/main/kotlin/com/wire/android/ui/home/AppSyncViewModel.kt b/app/src/main/kotlin/com/wire/android/ui/home/AppSyncViewModel.kt index e91b704532..79b2a2cbfb 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/AppSyncViewModel.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/AppSyncViewModel.kt @@ -31,14 +31,18 @@ import javax.inject.Inject class AppSyncViewModel @Inject constructor( override val savedStateHandle: SavedStateHandle, private val certificateRevocationListCheckWorker: CertificateRevocationListCheckWorker, - private val bserveCertificateRevocationForSelfClient: ObserveCertificateRevocationForSelfClientUseCase, + private val observeCertificateRevocationForSelfClient: ObserveCertificateRevocationForSelfClientUseCase, private val featureFlagsSyncWorker: FeatureFlagsSyncWorker ) : SavedStateViewModel(savedStateHandle) { fun startSyncingAppConfig() { viewModelScope.launch { certificateRevocationListCheckWorker.execute() - bserveCertificateRevocationForSelfClient.invoke() + } + viewModelScope.launch { + observeCertificateRevocationForSelfClient.invoke() + } + viewModelScope.launch { featureFlagsSyncWorker.execute() } } From bbdd533a70de6be4564dc2f32230f7a91b523d98 Mon Sep 17 00:00:00 2001 From: Oussama Hassine Date: Mon, 25 Mar 2024 11:49:23 +0100 Subject: [PATCH 3/4] chore: update kalium reference --- kalium | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kalium b/kalium index cccff3879d..b1fa17bc19 160000 --- a/kalium +++ b/kalium @@ -1 +1 @@ -Subproject commit cccff3879d3aa7a749a7abb8dfb7423b1e66066f +Subproject commit b1fa17bc1999bbd26847313c6e04a4a2ac019ba8 From ef67293be3792399c27b20742fa9e686e3c3195d Mon Sep 17 00:00:00 2001 From: Oussama Hassine Date: Mon, 25 Mar 2024 12:00:48 +0100 Subject: [PATCH 4/4] chore: update kalium reference --- kalium | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kalium b/kalium index b1fa17bc19..b65962a2e2 160000 --- a/kalium +++ b/kalium @@ -1 +1 @@ -Subproject commit b1fa17bc1999bbd26847313c6e04a4a2ac019ba8 +Subproject commit b65962a2e21243fa12294809d2f8cb000f2474fb