Skip to content

Commit

Permalink
fetch config providers config on time, so we have it when trying to f…
Browse files Browse the repository at this point in the history
…etch certificates
  • Loading branch information
ktiniatros committed Jan 23, 2023
1 parent 179de4c commit 2cc7a50
Show file tree
Hide file tree
Showing 7 changed files with 46 additions and 20 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,11 @@ import nl.rijksoverheid.ctr.shared.ext.initialisationException
abstract class AppConfigViewModel : ViewModel() {
val appStatusLiveData = MutableLiveData<AppStatus>()

abstract fun refresh(mobileCoreWrapper: MobileCoreWrapper, force: Boolean = false)
abstract fun refresh(
mobileCoreWrapper: MobileCoreWrapper,
force: Boolean = false,
afterRefresh: () -> Unit = {}
)
abstract fun saveNewFeaturesFinished()
abstract fun saveNewTerms()
}
Expand All @@ -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()) {
Expand All @@ -63,6 +71,7 @@ class AppConfigViewModelImpl(
}
viewModelScope.launch {
val configResult = configResultUseCase.fetch()
afterRefresh()
val appStatus = appStatusUseCase.get(configResult, versionCode)

val configFilesArePresentInFilesFolder =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,15 @@ 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
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
Expand Down Expand Up @@ -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() {
Expand Down Expand Up @@ -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
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ import retrofit2.Converter
*/

interface CoronaCheckRepository {
suspend fun configProviders(): NetworkRequestResult<RemoteConfigProviders>
suspend fun configProviders(useCache: Boolean = true): NetworkRequestResult<RemoteConfigProviders>
suspend fun accessTokens(jwt: String): NetworkRequestResult<RemoteAccessTokens>
suspend fun getGreenCards(
stoken: String,
Expand Down Expand Up @@ -67,17 +67,27 @@ open class CoronaCheckRepositoryImpl(
private val networkRequestResultFactory: NetworkRequestResultFactory
) : CoronaCheckRepository {

private var cachedConfigProvidersResult: NetworkRequestResult<RemoteConfigProviders>? = null

private fun getHolderApiClient(): HolderApiClient {
val backendTlsCertificates =
cachedAppConfigUseCase.getCachedAppConfig().backendTLSCertificates
val certificateBytes = backendTlsCertificates.map { it.toByteArray() }
return holderApiClientUtil.client(certificateBytes)
}

override suspend fun configProviders(): NetworkRequestResult<RemoteConfigProviders> {
return networkRequestResultFactory.createResult(HolderStep.ConfigProvidersNetworkRequest) {
override suspend fun configProviders(useCache: Boolean): NetworkRequestResult<RemoteConfigProviders> {
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<RemoteAccessTokens> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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,
Expand All @@ -68,7 +59,7 @@ class GetEventsViewModelImpl(
) {
getEvents {
getEventsUseCase.getEvents(
eventProvidersResult = eventProvidersResult,
eventProvidersResult = configProvidersUseCase.eventProviders(),
loginType = loginType,
jwt = jwt,
originTypes = originTypes
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ val repositoriesModule = module {
factory<HolderApiClientUtil> {
HolderApiClientUtilImpl(get(), get())
}
factory<CoronaCheckRepository> {
single<CoronaCheckRepository> {
CoronaCheckRepositoryImpl(
get(),
get(),
Expand Down
7 changes: 6 additions & 1 deletion holder/src/test/java/nl/rijksoverheid/ctr/Fakes.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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
}

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

0 comments on commit 2cc7a50

Please sign in to comment.