Skip to content
Snippets Groups Projects
Unverified Commit 9d665501 authored by Mohamed's avatar Mohamed Committed by GitHub
Browse files

Reduce timeout to 5 sec (EXPOSUREAPP-5196) (#2392)


* Reduce timeout

* lint

* Update tests

* Set timeout to 5 sec and calculate waiting time

* Add pre-auth

* Show progress  while retrieving TEKs

Co-authored-by: default avatarharambasicluka <64483219+harambasicluka@users.noreply.github.com>
parent 5009ff85
No related branches found
Tags v1.13.0-RC7
No related merge requests found
......@@ -157,16 +157,21 @@ class DefaultTEKHistoryProvider @Inject constructor(
}
}
// Timeout after 20 sec if receiver did not get called
// Timeout after 5 sec if receiver did not get called
@VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
internal suspend fun getPreAuthorizedExposureKeys(): List<TemporaryExposureKey> = withTimeout(20_000) {
internal suspend fun getPreAuthorizedExposureKeys(): List<TemporaryExposureKey> = withTimeout(5_000) {
coroutineScope {
// Register receiver before hitting the API to avoid race conditions
val deferredIntent = async { awaitReceivedBroadcast() }
client.requestPreAuthorizedTemporaryExposureKeyRelease().await()
Timber.i("requestPreAuthorizedTemporaryExposureKeyRelease is done")
Timber.i("Pre-Auth requestPreAuthorizedTemporaryExposureKeyRelease is done")
val startTime = System.currentTimeMillis()
Timber.i("Pre-Auth Receiver StartTime:$startTime")
val intent = deferredIntent.await()
Timber.d("getPreAuthorizedExposureKeys():intent=%s", intent)
val endTime = System.currentTimeMillis()
Timber.i("Pre-Auth Receiver EndTime:$endTime")
Timber.i("Pre-Auth Receiver WaitingTime:${endTime - startTime}")
Timber.d("Pre-Auth getPreAuthorizedExposureKeys():intent=%s", intent)
intent.getParcelableArrayListExtra(EXTRA_TEMPORARY_EXPOSURE_KEY_LIST) ?: emptyList()
}
}
......@@ -175,7 +180,7 @@ class DefaultTEKHistoryProvider @Inject constructor(
val receiver = object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
cont.resume(intent)
Timber.d("unregisterReceiver")
Timber.d("Pre-Auth unregisterReceiver")
context.unregisterReceiver(this)
}
}
......@@ -184,7 +189,7 @@ class DefaultTEKHistoryProvider @Inject constructor(
IntentFilter(ACTION_PRE_AUTHORIZE_RELEASE_PHONE_UNLOCKED)
)
cont.invokeOnCancellation {
Timber.d(it, "unregisterReceiver")
Timber.d(it, "Pre-Auth unregisterReceiver")
context.unregisterReceiver(receiver)
}
}
......
......@@ -9,6 +9,7 @@ import androidx.fragment.app.Fragment
import de.rki.coronawarnapp.R
import de.rki.coronawarnapp.databinding.FragmentSubmissionTestResultAvailableBinding
import de.rki.coronawarnapp.tracing.ui.TracingConsentDialog
import de.rki.coronawarnapp.ui.submission.SubmissionBlockingDialog
import de.rki.coronawarnapp.util.DialogHelper
import de.rki.coronawarnapp.util.di.AutoInject
import de.rki.coronawarnapp.util.ui.doNavigate
......@@ -16,6 +17,7 @@ import de.rki.coronawarnapp.util.ui.observe2
import de.rki.coronawarnapp.util.ui.viewBindingLazy
import de.rki.coronawarnapp.util.viewmodel.CWAViewModelFactoryProvider
import de.rki.coronawarnapp.util.viewmodel.cwaViewModels
import timber.log.Timber
import javax.inject.Inject
/**
......@@ -27,10 +29,13 @@ class SubmissionTestResultAvailableFragment : Fragment(R.layout.fragment_submiss
@Inject lateinit var viewModelFactory: CWAViewModelFactoryProvider.Factory
private val vm: SubmissionTestResultAvailableViewModel by cwaViewModels { viewModelFactory }
private val binding: FragmentSubmissionTestResultAvailableBinding by viewBindingLazy()
private lateinit var keyRetrievalProgress: SubmissionBlockingDialog
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
keyRetrievalProgress = SubmissionBlockingDialog(requireContext())
val backCallback = object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() = vm.goBack()
}
......@@ -49,6 +54,12 @@ class SubmissionTestResultAvailableFragment : Fragment(R.layout.fragment_submiss
binding.submissionTestResultAvailableConsentStatus.consent = it
}
vm.showKeyRetrievalProgress.observe2(this) { show ->
Timber.i("SubmissionTestResult:showKeyRetrievalProgress:$show")
keyRetrievalProgress.setState(show)
binding.submissionTestResultAvailableProceedButton.isEnabled = !show
}
binding.apply {
submissionTestResultAvailableProceedButton.setOnClickListener { vm.proceed() }
submissionTestResultAvailableConsentStatus.setOnClickListener { vm.goConsent() }
......
......@@ -32,6 +32,7 @@ class SubmissionTestResultAvailableViewModel @AssistedInject constructor(
val consent = consentFlow.asLiveData(dispatcherProvider.Default)
val showPermissionRequest = SingleLiveEvent<(Activity) -> Unit>()
val showCloseDialog = SingleLiveEvent<Unit>()
val showKeyRetrievalProgress = SingleLiveEvent<Boolean>()
val showTracingConsentDialog = SingleLiveEvent<(Boolean) -> Unit>()
private val tekHistoryUpdater = tekHistoryUpdaterFactory.create(object : TEKHistoryUpdater.Callback {
......@@ -43,6 +44,8 @@ class SubmissionTestResultAvailableViewModel @AssistedInject constructor(
SubmissionTestResultAvailableFragmentDirections
.actionSubmissionTestResultAvailableFragmentToSubmissionTestResultConsentGivenFragment()
)
showKeyRetrievalProgress.postValue(false)
}
override fun onTEKPermissionDeclined() {
......@@ -50,14 +53,17 @@ class SubmissionTestResultAvailableViewModel @AssistedInject constructor(
SubmissionTestResultAvailableFragmentDirections
.actionSubmissionTestResultAvailableFragmentToSubmissionTestResultNoConsentFragment()
)
showKeyRetrievalProgress.postValue(false)
}
override fun onTracingConsentRequired(onConsentResult: (given: Boolean) -> Unit) {
showTracingConsentDialog.postValue(onConsentResult)
showKeyRetrievalProgress.postValue(false)
}
override fun onPermissionRequired(permissionRequest: (Activity) -> Unit) {
showPermissionRequest.postValue(permissionRequest)
showKeyRetrievalProgress.postValue(false)
}
override fun onError(error: Throwable) {
......@@ -66,6 +72,7 @@ class SubmissionTestResultAvailableViewModel @AssistedInject constructor(
exceptionCategory = ExceptionCategory.EXPOSURENOTIFICATION,
prefix = "SubmissionTestResultAvailableViewModel"
)
showKeyRetrievalProgress.postValue(false)
}
})
......@@ -94,6 +101,7 @@ class SubmissionTestResultAvailableViewModel @AssistedInject constructor(
}
fun proceed() {
showKeyRetrievalProgress.value = true
launch {
if (consentFlow.first()) {
tekHistoryUpdater.updateTEKHistoryOrRequestPermission()
......@@ -107,6 +115,7 @@ class SubmissionTestResultAvailableViewModel @AssistedInject constructor(
}
fun handleActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
showKeyRetrievalProgress.value = true
tekHistoryUpdater.handleActivityResult(requestCode, resultCode, data)
}
......
......@@ -8,6 +8,7 @@ import androidx.fragment.app.Fragment
import de.rki.coronawarnapp.R
import de.rki.coronawarnapp.databinding.FragmentSubmissionNoConsentPositiveOtherWarningBinding
import de.rki.coronawarnapp.tracing.ui.TracingConsentDialog
import de.rki.coronawarnapp.ui.submission.SubmissionBlockingDialog
import de.rki.coronawarnapp.util.DialogHelper
import de.rki.coronawarnapp.util.di.AutoInject
import de.rki.coronawarnapp.util.ui.doNavigate
......@@ -38,6 +39,8 @@ class SubmissionResultPositiveOtherWarningNoConsentFragment :
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val keysRetrievalProgress = SubmissionBlockingDialog(requireContext())
binding.submissionPositiveOtherWarningNoConsentButtonNext.setOnClickListener {
viewModel.onConsentButtonClicked()
}
......@@ -49,6 +52,11 @@ class SubmissionResultPositiveOtherWarningNoConsentFragment :
doNavigate(it)
}
viewModel.keysRetrievalProgress.observe2(this) { show ->
keysRetrievalProgress.setState(show)
binding.submissionPositiveOtherWarningNoConsentButtonNext.isEnabled = !show
}
viewModel.showPermissionRequest.observe2(this) { permissionRequest ->
permissionRequest.invoke(requireActivity())
}
......
......@@ -32,6 +32,8 @@ class SubmissionResultPositiveOtherWarningNoConsentViewModel @AssistedInject con
val routeToScreen = SingleLiveEvent<NavDirections>()
val keysRetrievalProgress = SingleLiveEvent<Boolean>()
val showPermissionRequest = SingleLiveEvent<(Activity) -> Unit>()
val showEnableTracingEvent = SingleLiveEvent<Unit>()
......@@ -45,7 +47,7 @@ class SubmissionResultPositiveOtherWarningNoConsentViewModel @AssistedInject con
override fun onTEKAvailable(teks: List<TemporaryExposureKey>) {
Timber.d("onTEKAvailable(tek.size=%d)", teks.size)
autoSubmission.updateMode(AutoSubmission.Mode.MONITOR)
keysRetrievalProgress.postValue(false)
routeToScreen.postValue(
SubmissionResultPositiveOtherWarningNoConsentFragmentDirections
.actionSubmissionResultPositiveOtherWarningNoConsentFragmentToSubmissionResultReadyFragment()
......@@ -53,18 +55,22 @@ class SubmissionResultPositiveOtherWarningNoConsentViewModel @AssistedInject con
}
override fun onTEKPermissionDeclined() {
keysRetrievalProgress.postValue(false)
// stay on screen
}
override fun onTracingConsentRequired(onConsentResult: (given: Boolean) -> Unit) {
keysRetrievalProgress.postValue(false)
showTracingConsentDialog.postValue(onConsentResult)
}
override fun onPermissionRequired(permissionRequest: (Activity) -> Unit) {
keysRetrievalProgress.postValue(false)
showPermissionRequest.postValue(permissionRequest)
}
override fun onError(error: Throwable) {
keysRetrievalProgress.postValue(false)
Timber.e(error, "Couldn't access temporary exposure key history.")
error.report(ExceptionCategory.EXPOSURENOTIFICATION, "Failed to obtain TEKs.")
}
......@@ -78,6 +84,7 @@ class SubmissionResultPositiveOtherWarningNoConsentViewModel @AssistedInject con
}
fun onConsentButtonClicked() {
keysRetrievalProgress.value = true
submissionRepository.giveConsentToSubmission()
launch {
if (enfClient.isTracingEnabled.first()) {
......@@ -96,6 +103,7 @@ class SubmissionResultPositiveOtherWarningNoConsentViewModel @AssistedInject con
}
fun handleActivityRersult(requestCode: Int, resultCode: Int, data: Intent?) {
keysRetrievalProgress.value = true
tekHistoryUpdater.handleActivityResult(requestCode, resultCode, data)
}
......
......@@ -212,14 +212,14 @@ class DefaultTEKHistoryProviderTest : BaseTest() {
}
@Test
fun `ENFV1_8 pre authorized key release timeout after 20 seconds`() {
fun `ENFV1_8 pre authorized key release timeout after 5 seconds`() {
coEvery { enfVersion.isAtLeast(ENFVersion.V1_8) } returns true
every { client.requestPreAuthorizedTemporaryExposureKeyRelease() } returns MockGMSTask.timeout()
verify(exactly = 0) { context.unregisterReceiver(any()) }
runBlockingTest {
val deferred = async { createInstance().getPreAuthorizedExposureKeys() }
advanceTimeBy(21_000)
advanceTimeBy(6_000)
deferred.getCompletionExceptionOrNull() shouldBe instanceOf(TimeoutCancellationException::class)
}
......@@ -228,7 +228,7 @@ class DefaultTEKHistoryProviderTest : BaseTest() {
}
@Test
fun `ENFV1_8 pre authorized key release broadcast receiver timeout after 20 seconds`() {
fun `ENFV1_8 pre authorized key release broadcast receiver timeout after 5 seconds`() {
coEvery { enfVersion.isAtLeast(ENFVersion.V1_8) } returns true
// We don't call onReceive
......@@ -241,7 +241,7 @@ class DefaultTEKHistoryProviderTest : BaseTest() {
runBlockingTest {
val deferred = async { createInstance().getPreAuthorizedExposureKeys() }
advanceTimeBy(21_000)
advanceTimeBy(6_000)
deferred.getCompletionExceptionOrNull() shouldBe instanceOf(TimeoutCancellationException::class)
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment