From 2cc7a50e8257e479873f373964215ff365f2a3df Mon Sep 17 00:00:00 2001 From: Giorgos Papadopoulos Date: Mon, 23 Jan 2023 10:52:05 +0100 Subject: [PATCH] fetch config providers config on time, so we have it when trying to fetch certificates --- .../ctr/appconfig/AppConfigViewModel.kt | 13 +++++++++++-- .../ctr/holder/HolderMainActivity.kt | 11 +++++++++-- .../api/repositories/CoronaCheckRepository.kt | 16 +++++++++++++--- .../ctr/holder/get_events/GetEventsViewModel.kt | 11 +---------- .../ctr/holder/modules/RepositoriesModules.kt | 2 +- .../src/test/java/nl/rijksoverheid/ctr/Fakes.kt | 7 ++++++- .../java/nl/rijksoverheid/ctr/verifier/Fakes.kt | 6 +++++- 7 files changed, 46 insertions(+), 20 deletions(-) diff --git a/appconfig/src/main/java/nl/rijksoverheid/ctr/appconfig/AppConfigViewModel.kt b/appconfig/src/main/java/nl/rijksoverheid/ctr/appconfig/AppConfigViewModel.kt index f320cd20c..bc75742fa 100644 --- a/appconfig/src/main/java/nl/rijksoverheid/ctr/appconfig/AppConfigViewModel.kt +++ b/appconfig/src/main/java/nl/rijksoverheid/ctr/appconfig/AppConfigViewModel.kt @@ -26,7 +26,11 @@ import nl.rijksoverheid.ctr.shared.ext.initialisationException abstract class AppConfigViewModel : ViewModel() { val appStatusLiveData = MutableLiveData() - abstract fun refresh(mobileCoreWrapper: MobileCoreWrapper, force: Boolean = false) + abstract fun refresh( + mobileCoreWrapper: MobileCoreWrapper, + force: Boolean = false, + afterRefresh: () -> Unit = {} + ) abstract fun saveNewFeaturesFinished() abstract fun saveNewTerms() } @@ -50,7 +54,11 @@ class AppConfigViewModelImpl( } } - override fun refresh(mobileCoreWrapper: MobileCoreWrapper, force: Boolean) { + override fun refresh( + mobileCoreWrapper: MobileCoreWrapper, + force: Boolean, + afterRefresh: () -> Unit + ) { // update the app status from the last fetched config // only if it is valid (so don't use the default one) if (cachedAppConfigUseCase.isCachedAppConfigValid()) { @@ -63,6 +71,7 @@ class AppConfigViewModelImpl( } viewModelScope.launch { val configResult = configResultUseCase.fetch() + afterRefresh() val appStatus = appStatusUseCase.get(configResult, versionCode) val configFilesArePresentInFilesFolder = diff --git a/holder/src/main/java/nl/rijksoverheid/ctr/holder/HolderMainActivity.kt b/holder/src/main/java/nl/rijksoverheid/ctr/holder/HolderMainActivity.kt index 2dbd6373b..7641c612f 100644 --- a/holder/src/main/java/nl/rijksoverheid/ctr/holder/HolderMainActivity.kt +++ b/holder/src/main/java/nl/rijksoverheid/ctr/holder/HolderMainActivity.kt @@ -15,6 +15,7 @@ import android.net.NetworkRequest import android.os.Bundle import android.view.WindowManager import androidx.appcompat.app.AppCompatActivity +import androidx.lifecycle.coroutineScope import androidx.lifecycle.lifecycleScope import androidx.navigation.NavController import androidx.navigation.fragment.NavHostFragment @@ -22,6 +23,7 @@ import nl.rijksoverheid.ctr.appconfig.AppConfigViewModel import nl.rijksoverheid.ctr.appconfig.models.AppStatus import nl.rijksoverheid.ctr.design.utils.DialogUtil import nl.rijksoverheid.ctr.design.utils.IntentUtil +import nl.rijksoverheid.ctr.holder.api.repositories.CoronaCheckRepository import nl.rijksoverheid.ctr.holder.databinding.ActivityMainBinding import nl.rijksoverheid.ctr.holder.ui.device_rooted.DeviceRootedViewModel import nl.rijksoverheid.ctr.holder.ui.device_secure.DeviceSecureViewModel @@ -53,6 +55,7 @@ class HolderMainActivity : AppCompatActivity() { private var isFreshStart: Boolean = true // track if this is a fresh start of the app private val androidUtil: AndroidUtil by inject() private val workerManagerUtil: WorkerManagerUtil by inject() + private val coronaCheckRepository: CoronaCheckRepository by inject() private val connectivityChangeCallback = object : ConnectivityManager.NetworkCallback() { @@ -179,9 +182,13 @@ class HolderMainActivity : AppCompatActivity() { override fun onStart() { super.onStart() - // Only get app config on every app foreground when introduction is finished + // get app and providers config on every app foreground when introduction is finished if (!introductionViewModel.getIntroductionRequired()) { - appConfigViewModel.refresh(mobileCoreWrapper, isFreshStart) + appConfigViewModel.refresh(mobileCoreWrapper, isFreshStart) { + lifecycle.coroutineScope.launchWhenStarted { + coronaCheckRepository.configProviders(useCache = false) + } + } isFreshStart = false } } diff --git a/holder/src/main/java/nl/rijksoverheid/ctr/holder/api/repositories/CoronaCheckRepository.kt b/holder/src/main/java/nl/rijksoverheid/ctr/holder/api/repositories/CoronaCheckRepository.kt index fb34c6146..a6b163b9c 100644 --- a/holder/src/main/java/nl/rijksoverheid/ctr/holder/api/repositories/CoronaCheckRepository.kt +++ b/holder/src/main/java/nl/rijksoverheid/ctr/holder/api/repositories/CoronaCheckRepository.kt @@ -35,7 +35,7 @@ import retrofit2.Converter */ interface CoronaCheckRepository { - suspend fun configProviders(): NetworkRequestResult + suspend fun configProviders(useCache: Boolean = true): NetworkRequestResult suspend fun accessTokens(jwt: String): NetworkRequestResult suspend fun getGreenCards( stoken: String, @@ -67,6 +67,8 @@ open class CoronaCheckRepositoryImpl( private val networkRequestResultFactory: NetworkRequestResultFactory ) : CoronaCheckRepository { + private var cachedConfigProvidersResult: NetworkRequestResult? = null + private fun getHolderApiClient(): HolderApiClient { val backendTlsCertificates = cachedAppConfigUseCase.getCachedAppConfig().backendTLSCertificates @@ -74,10 +76,18 @@ open class CoronaCheckRepositoryImpl( return holderApiClientUtil.client(certificateBytes) } - override suspend fun configProviders(): NetworkRequestResult { - return networkRequestResultFactory.createResult(HolderStep.ConfigProvidersNetworkRequest) { + override suspend fun configProviders(useCache: Boolean): NetworkRequestResult { + if (useCache) { + cachedConfigProvidersResult?.takeIf { + it is NetworkRequestResult.Success + }?.let { return it } + } + + val result = networkRequestResultFactory.createResult(HolderStep.ConfigProvidersNetworkRequest) { remoteConfigApiClient.getConfigCtp() } + cachedConfigProvidersResult = result + return result } override suspend fun accessTokens(jwt: String): NetworkRequestResult { diff --git a/holder/src/main/java/nl/rijksoverheid/ctr/holder/get_events/GetEventsViewModel.kt b/holder/src/main/java/nl/rijksoverheid/ctr/holder/get_events/GetEventsViewModel.kt index d4b57fa57..ede5fe7aa 100644 --- a/holder/src/main/java/nl/rijksoverheid/ctr/holder/get_events/GetEventsViewModel.kt +++ b/holder/src/main/java/nl/rijksoverheid/ctr/holder/get_events/GetEventsViewModel.kt @@ -16,7 +16,6 @@ import nl.rijksoverheid.ctr.holder.get_events.models.EventsResult import nl.rijksoverheid.ctr.holder.get_events.models.LoginType import nl.rijksoverheid.ctr.holder.get_events.models.RemoteOriginType import nl.rijksoverheid.ctr.holder.get_events.usecases.ConfigProvidersUseCase -import nl.rijksoverheid.ctr.holder.get_events.usecases.EventProvidersResult import nl.rijksoverheid.ctr.holder.get_events.usecases.GetEventsUseCase import nl.rijksoverheid.ctr.holder.get_events.usecases.GetMijnCnEventsUsecase import nl.rijksoverheid.ctr.shared.livedata.Event @@ -52,14 +51,6 @@ class GetEventsViewModelImpl( private val mijnCnEventsUsecase: GetMijnCnEventsUsecase ) : GetEventsViewModel() { - private lateinit var eventProvidersResult: EventProvidersResult - - init { - viewModelScope.launch { - eventProvidersResult = configProvidersUseCase.eventProviders() - } - } - override fun getDigidEvents( loginType: LoginType, jwt: String, @@ -68,7 +59,7 @@ class GetEventsViewModelImpl( ) { getEvents { getEventsUseCase.getEvents( - eventProvidersResult = eventProvidersResult, + eventProvidersResult = configProvidersUseCase.eventProviders(), loginType = loginType, jwt = jwt, originTypes = originTypes diff --git a/holder/src/main/java/nl/rijksoverheid/ctr/holder/modules/RepositoriesModules.kt b/holder/src/main/java/nl/rijksoverheid/ctr/holder/modules/RepositoriesModules.kt index 2f5a251a1..1b16bfdef 100644 --- a/holder/src/main/java/nl/rijksoverheid/ctr/holder/modules/RepositoriesModules.kt +++ b/holder/src/main/java/nl/rijksoverheid/ctr/holder/modules/RepositoriesModules.kt @@ -37,7 +37,7 @@ val repositoriesModule = module { factory { HolderApiClientUtilImpl(get(), get()) } - factory { + single { CoronaCheckRepositoryImpl( get(), get(), diff --git a/holder/src/test/java/nl/rijksoverheid/ctr/Fakes.kt b/holder/src/test/java/nl/rijksoverheid/ctr/Fakes.kt index db0c62d98..068eee95f 100644 --- a/holder/src/test/java/nl/rijksoverheid/ctr/Fakes.kt +++ b/holder/src/test/java/nl/rijksoverheid/ctr/Fakes.kt @@ -81,7 +81,12 @@ import org.json.JSONObject fun fakeAppConfigViewModel(appStatus: AppStatus = AppStatus.NoActionRequired) = object : AppConfigViewModel() { - override fun refresh(mobileCoreWrapper: MobileCoreWrapper, force: Boolean) { + + override fun refresh( + mobileCoreWrapper: MobileCoreWrapper, + force: Boolean, + afterRefresh: () -> Unit + ) { appStatusLiveData.value = appStatus } diff --git a/verifier/src/test/java/nl/rijksoverheid/ctr/verifier/Fakes.kt b/verifier/src/test/java/nl/rijksoverheid/ctr/verifier/Fakes.kt index b0921335c..949a0d04b 100644 --- a/verifier/src/test/java/nl/rijksoverheid/ctr/verifier/Fakes.kt +++ b/verifier/src/test/java/nl/rijksoverheid/ctr/verifier/Fakes.kt @@ -34,7 +34,11 @@ import org.json.JSONObject fun fakeAppConfigViewModel(appStatus: AppStatus = AppStatus.NoActionRequired) = object : AppConfigViewModel() { - override fun refresh(mobileCoreWrapper: MobileCoreWrapper, force: Boolean) { + override fun refresh( + mobileCoreWrapper: MobileCoreWrapper, + force: Boolean, + afterRefresh: () -> Unit + ) { if (appStatusLiveData.value != appStatus) { appStatusLiveData.postValue(appStatus) }