@@ -2,19 +2,25 @@ package pl.gov.mc.protegosafe.ui.home
22
33import androidx.lifecycle.LiveData
44import androidx.lifecycle.MutableLiveData
5+ import io.reactivex.android.schedulers.AndroidSchedulers
56import io.reactivex.rxkotlin.addTo
67import io.reactivex.rxkotlin.subscribeBy
8+ import io.reactivex.schedulers.Schedulers
9+ import pl.gov.mc.protegosafe.domain.exception.CovidTestNotCompatibleDeviceException
710import pl.gov.mc.protegosafe.domain.exception.NoInternetConnectionException
811import pl.gov.mc.protegosafe.domain.exception.UploadException
912import pl.gov.mc.protegosafe.domain.model.ActionRequiredItem
1013import pl.gov.mc.protegosafe.domain.model.ActivityResult
1114import pl.gov.mc.protegosafe.domain.model.AppLifecycleState
1215import pl.gov.mc.protegosafe.domain.model.ExposureNotificationActionNotResolvedException
16+ import pl.gov.mc.protegosafe.domain.model.GetBridgeDataUIRequestItem
1317import pl.gov.mc.protegosafe.domain.model.IncomingBridgeDataItem
1418import pl.gov.mc.protegosafe.domain.model.IncomingBridgeDataType
1519import pl.gov.mc.protegosafe.domain.model.OutgoingBridgeDataResultComposer
1620import pl.gov.mc.protegosafe.domain.model.OutgoingBridgeDataType
21+ import pl.gov.mc.protegosafe.domain.model.SetBridgeDataUIRequestItem
1722import pl.gov.mc.protegosafe.domain.model.TemporaryExposureKeysUploadState
23+ import pl.gov.mc.protegosafe.domain.repository.UiRequestCacheRepository
1824import pl.gov.mc.protegosafe.domain.usecase.ComposeAppLifecycleStateBrideDataUseCase
1925import pl.gov.mc.protegosafe.domain.usecase.GetServicesStatusUseCase
2026import pl.gov.mc.protegosafe.domain.usecase.OnGetBridgeDataUseCase
@@ -23,6 +29,7 @@ import pl.gov.mc.protegosafe.domain.usecase.ProcessPendingActivityResultUseCase
2329import pl.gov.mc.protegosafe.domain.usecase.StartExposureNotificationUseCase
2430import pl.gov.mc.protegosafe.domain.usecase.StorePendingActivityResultUseCase
2531import pl.gov.mc.protegosafe.domain.usecase.UploadTemporaryExposureKeysWithCachedPayloadUseCase
32+ import pl.gov.mc.protegosafe.domain.usecase.covidtest.UpdateTestSubscriptionStatusUseCase
2633import pl.gov.mc.protegosafe.logging.webViewTimber
2734import pl.gov.mc.protegosafe.ui.common.BaseViewModel
2835import pl.gov.mc.protegosafe.ui.common.livedata.SingleLiveEvent
@@ -38,7 +45,9 @@ class HomeViewModel(
3845 private val uploadTemporaryExposureKeysWithCachedPayloadUseCase : UploadTemporaryExposureKeysWithCachedPayloadUseCase ,
3946 private val storePendingActivityResultUseCase : StorePendingActivityResultUseCase ,
4047 private val processPendingActivityResultUseCase : ProcessPendingActivityResultUseCase ,
41- private val outgoingBridgeDataResultComposer : OutgoingBridgeDataResultComposer
48+ private val updateTestSubscriptionStatusUseCase : UpdateTestSubscriptionStatusUseCase ,
49+ private val outgoingBridgeDataResultComposer : OutgoingBridgeDataResultComposer ,
50+ private val uiRequestCacheRepository : UiRequestCacheRepository
4251) : BaseViewModel() {
4352
4453 private val _javascriptCode = MutableLiveData <String >()
@@ -96,30 +105,53 @@ class HomeViewModel(
96105 }
97106
98107 fun getBridgeData (dataType : Int , data : String , requestId : String ) {
99- onGetBridgeDataUseCase.execute(OutgoingBridgeDataType .valueOf(dataType), data)
108+ onGetBridgeDataUseCase.execute(
109+ OutgoingBridgeDataType .valueOf(dataType), data, requestId, ::onResultActionRequired
110+ )
100111 .subscribe(
101112 {
102113 webViewTimber().d(" getBridgeData: $dataType output: $it " )
103114 bridgeDataResponse(it, dataType, requestId)
104115 },
105116 {
117+ handleError(it)
106118 Timber .e(it, " getBridgeData failed" )
107119 }
108120 ).addTo(disposables)
109121 }
110122
111- fun onUploadRetry () {
112- uploadTemporaryExposureKeysWithCachedPayload()
123+ fun onRequestRetry () {
124+ uiRequestCacheRepository.getCachedRequest()?.let { uiRequest ->
125+ when (uiRequest) {
126+ is SetBridgeDataUIRequestItem -> {
127+ retryCachedSetBridgeDataRequest(uiRequest)
128+ }
129+ is GetBridgeDataUIRequestItem -> {
130+ uiRequestCacheRepository.retryCachedRequest(uiRequest, ::getBridgeData)
131+ }
132+ }
133+ }
113134 }
114135
115- fun onUploadCanceled () {
116- sendUploadStatus(TemporaryExposureKeysUploadState .CANCELED )
136+ fun onRequestCanceled () {
137+ uiRequestCacheRepository.getCachedRequest()?.let { uiRequest ->
138+ when (uiRequest) {
139+ is SetBridgeDataUIRequestItem -> {
140+ uiRequestCacheRepository.cancelCachedRequest(uiRequest, ::onBridgeData)
141+ }
142+ is GetBridgeDataUIRequestItem -> {
143+ uiRequestCacheRepository.cancelCachedRequest(uiRequest, ::bridgeDataResponse)
144+ }
145+ }
146+ }
117147 }
118148
119- private fun sendUploadStatus ( status : TemporaryExposureKeysUploadState ) {
149+ private fun sendAccessDeniedUploadStatus ( ) {
120150 onBridgeData(
121151 OutgoingBridgeDataType .TEMPORARY_EXPOSURE_KEYS_UPLOAD_STATUS .code,
122- outgoingBridgeDataResultComposer.composeTemporaryExposureKeysUploadResult(status)
152+ outgoingBridgeDataResultComposer.composeTemporaryExposureKeysUploadResult(
153+ TemporaryExposureKeysUploadState .ACCESS_DENIED
154+ )
123155 )
124156 }
125157
@@ -136,6 +168,10 @@ class HomeViewModel(
136168 is UploadException -> {
137169 _showUploadError .postValue(error as Exception )
138170 }
171+ is CovidTestNotCompatibleDeviceException -> {
172+ onRequestCanceled()
173+ _showUploadError .postValue(error as Exception )
174+ }
139175 else -> {
140176 Timber .e(error, " Problem can not be handled" )
141177 }
@@ -204,7 +240,7 @@ class HomeViewModel(
204240 onBridgeData(actionRequired.dataType, actionRequired.dataJson)
205241 }
206242 is ActionRequiredItem .TemporaryExposureKeysPermissionDenied -> {
207- sendUploadStatus( TemporaryExposureKeysUploadState . ACCESS_DENIED )
243+ sendAccessDeniedUploadStatus( )
208244 }
209245 is ActionRequiredItem .ExposureNotificationPermissionGranted -> {
210246 onExposureNotificationPermissionGranted()
@@ -218,6 +254,9 @@ class HomeViewModel(
218254 is ActionRequiredItem .CloseApp -> {
219255 _closeApplication .postValue(Unit )
220256 }
257+ is ActionRequiredItem .UpdateTestSubscription -> {
258+ updateTestSubscriptionStatus()
259+ }
221260 }
222261 }
223262
@@ -250,6 +289,40 @@ class HomeViewModel(
250289 ).addTo(disposables)
251290 }
252291
292+ private fun updateTestSubscriptionStatus () {
293+ Timber .d(" updateTestSubscriptionStatus" )
294+ updateTestSubscriptionStatusUseCase.execute()
295+ .subscribe(
296+ {
297+ onBridgeData(OutgoingBridgeDataType .GET_COVID_TEST_SUBSCRIPTION_STATUS .code, it)
298+ },
299+ {
300+ Timber .e(it, " sendServicesStatus failed" )
301+ }
302+ ).addTo(disposables)
303+ }
304+
305+ private fun retryCachedSetBridgeDataRequest (
306+ setBridgeDataUIRequestItem : SetBridgeDataUIRequestItem
307+ ) {
308+ uiRequestCacheRepository.retryCachedRequest(
309+ setBridgeDataUIRequestItem,
310+ ::onResultActionRequired
311+ )
312+ .subscribeOn(Schedulers .io())
313+ .observeOn(AndroidSchedulers .mainThread())
314+ .subscribe(
315+ {
316+ Timber .d(" Success" )
317+ },
318+ {
319+ handleError(it)
320+ Timber .e(it)
321+ }
322+ ).addTo(disposables)
323+ // TODO move to usecase
324+ }
325+
253326 private fun bridgeDataResponse (body : String , dataType : Int , requestId : String ) {
254327 val codeToExecute = " bridgeDataResponse('$body ', $dataType , '$requestId ')"
255328 webViewTimber().d(" run Javascript: -$codeToExecute -" )
0 commit comments