Skip to content
This repository was archived by the owner on Jun 20, 2023. It is now read-only.

Add truncated submission dialog and 429 error (EXPOSUREAPP-14366) #5744

Merged
merged 5 commits into from
Dec 6, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import androidx.recyclerview.widget.LinearLayoutManager
import de.rki.coronawarnapp.R
import de.rki.coronawarnapp.appconfig.ConfigData
import de.rki.coronawarnapp.databinding.FragmentTestSubmissionBinding
import de.rki.coronawarnapp.srs.ui.dialogs.showTruncatedSubmissionDialog
import de.rki.coronawarnapp.test.menu.ui.TestMenuItem
import de.rki.coronawarnapp.tracing.ui.tracingConsentDialog
import de.rki.coronawarnapp.ui.dialog.displayDialog
Expand Down Expand Up @@ -85,6 +86,7 @@ class SubmissionTestFragment : Fragment(R.layout.fragment_test_submission), Auto
vm.srsSubmissionResult.observe(viewLifecycleOwner) { result ->
when (result) {
is Error -> displayDialog { setError(result.cause) }
is TruncatedSubmission -> showTruncatedSubmissionDialog(result.numberOfDays) { }
Success -> Toast.makeText(requireContext(), "SRS submission is successful", Toast.LENGTH_LONG).show()
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import dagger.assisted.AssistedInject
import de.rki.coronawarnapp.appconfig.AppConfigProvider
import de.rki.coronawarnapp.appconfig.ConfigData
import de.rki.coronawarnapp.srs.core.AndroidIdProvider
import de.rki.coronawarnapp.srs.core.error.SrsSubmissionTruncatedException
import de.rki.coronawarnapp.srs.core.model.SrsSubmissionType
import de.rki.coronawarnapp.srs.core.repository.SrsSubmissionRepository
import de.rki.coronawarnapp.srs.core.storage.SrsDevSettings
Expand All @@ -23,7 +24,6 @@ import de.rki.coronawarnapp.util.ui.SingleLiveEvent
import de.rki.coronawarnapp.util.viewmodel.CWAViewModel
import de.rki.coronawarnapp.util.viewmodel.SimpleCWAViewModelFactory
import timber.log.Timber
import kotlin.Exception

class SubmissionTestFragmentViewModel @AssistedInject constructor(
@BaseGson baseGson: Gson,
Expand Down Expand Up @@ -92,7 +92,10 @@ class SubmissionTestFragmentViewModel @AssistedInject constructor(
srsSubmissionRepository.submit(type = SrsSubmissionType.SRS_SELF_TEST)
srsSubmissionResult.postValue(Success)
} catch (e: Exception) {
srsSubmissionResult.postValue(Error(e))
when (e) {
is SrsSubmissionTruncatedException -> srsSubmissionResult.postValue(TruncatedSubmission(e.message))
else -> srsSubmissionResult.postValue(Error(e))
}
Timber.e(e, "submit()")
}
}
Expand Down Expand Up @@ -147,5 +150,7 @@ class SubmissionTestFragmentViewModel @AssistedInject constructor(
}

sealed interface SrsSubmissionResult

data class TruncatedSubmission(val numberOfDays: String?) : SrsSubmissionResult
data class Error(val cause: Exception) : SrsSubmissionResult
object Success : SrsSubmissionResult
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ class SrsSubmissionException(
SRS_SUB_SERVER_ERROR("SRS_SUB_SERVER_ERROR", TextKey.TRY_AGAIN_LATER),
SRS_SUB_400("SRS_SUB_400", TextKey.CALL_HOTLINE),
SRS_SUB_403("SRS_SUB_403", TextKey.CALL_HOTLINE),
SRS_SUB_429("SRS_SUB_429", TextKey.TRY_AGAIN_LATER),

// Local
ANDROID_ID_INVALID_LOCAL("ANDROID_ID_INVALID_LOCAL", TextKey.DEVICE_NOT_TRUSTED),
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
package de.rki.coronawarnapp.srs.core.error

class SrsSubmissionTruncatedException(headerValue: String) : Exception(headerValue)
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import de.rki.coronawarnapp.exception.http.NetworkReadTimeoutException
import de.rki.coronawarnapp.server.protocols.internal.SubmissionPayloadOuterClass
import de.rki.coronawarnapp.srs.core.error.SrsSubmissionException
import de.rki.coronawarnapp.srs.core.error.SrsSubmissionException.ErrorCode
import de.rki.coronawarnapp.srs.core.error.SrsSubmissionTruncatedException
import de.rki.coronawarnapp.srs.core.model.SrsSubmissionPayload
import de.rki.coronawarnapp.tag
import de.rki.coronawarnapp.util.PaddingTool
Expand All @@ -34,7 +35,9 @@ class SrsSubmissionServer @Inject constructor(
submitPayload(payload)
} catch (e: Exception) {
throw when (e) {
is SrsSubmissionException -> e
is SrsSubmissionException,
is SrsSubmissionTruncatedException -> e

is CwaUnknownHostException,
is NetworkReadTimeoutException,
is NetworkConnectTimeoutException -> SrsSubmissionException(ErrorCode.SRS_SUB_NO_NETWORK, cause = e)
Expand Down Expand Up @@ -75,13 +78,18 @@ class SrsSubmissionServer @Inject constructor(

val bodyResponse = api.submitPayload(payload.srsOtp.uuid.toString(), submissionPayload)
if (bodyResponse.isSuccessful) {
val truncatedHeaderException = bodyResponse.headers()[CWA_KEYS_TRUNCATED]
if (truncatedHeaderException != null) {
throw SrsSubmissionTruncatedException(truncatedHeaderException)
}
Timber.i("SRS submission is successful!")
return
}

throw when (bodyResponse.code()) {
400 -> SrsSubmissionException(ErrorCode.SRS_SUB_400)
403 -> SrsSubmissionException(ErrorCode.SRS_SUB_403)
429 -> SrsSubmissionException(ErrorCode.SRS_SUB_429)
in 400..499 -> SrsSubmissionException(ErrorCode.SRS_SUB_CLIENT_ERROR)
// error code in 500..599
else -> SrsSubmissionException(ErrorCode.SRS_SUB_SERVER_ERROR)
Expand All @@ -90,5 +98,6 @@ class SrsSubmissionServer @Inject constructor(

companion object {
val TAG = tag<SrsSubmissionServer>()
private const val CWA_KEYS_TRUNCATED = "cwa-keys-truncated"
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package de.rki.coronawarnapp.srs.ui.dialogs

import androidx.fragment.app.Fragment
import de.rki.coronawarnapp.R
import de.rki.coronawarnapp.ui.dialog.displayDialog

fun Fragment.showTruncatedSubmissionDialog(numberOfDays: String?, positiveFunction: () -> Unit) = displayDialog {
title(R.string.srs_submission_truncated_warning_dialog_title)
message(getString(R.string.srs_submission_truncated_warning_dialog_message, numberOfDays))
positiveButton(R.string.srs_submission_truncated_warning_dialog_button) { positiveFunction() }
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import de.rki.coronawarnapp.R
import de.rki.coronawarnapp.databinding.FragmentSubmissionSymptomCalendarBinding
import de.rki.coronawarnapp.srs.ui.dialogs.showCloseDialog
import de.rki.coronawarnapp.srs.ui.dialogs.showSubmissionWarningDialog
import de.rki.coronawarnapp.srs.ui.dialogs.showTruncatedSubmissionDialog
import de.rki.coronawarnapp.submission.Symptoms
import de.rki.coronawarnapp.ui.dialog.displayDialog
import de.rki.coronawarnapp.util.ExternalActionHelper.openUrl
Expand Down Expand Up @@ -85,6 +86,12 @@ class SrsSymptomsCalendarFragment : Fragment(R.layout.fragment_submission_sympto
)
)

is SrsSymptomsCalendarNavigation.TruncatedSubmission -> {
showTruncatedSubmissionDialog(it.numberOfDays) {
viewModel.onTruncatedDialogClick()
}
}

is SrsSymptomsCalendarNavigation.Error -> displayDialog {
setError(it.cause)
positiveButton(R.string.nm_faq_label) { openUrl(R.string.srs_faq_url) }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ sealed class SrsSymptomsCalendarNavigation {
object GoToHome : SrsSymptomsCalendarNavigation()

data class GoToThankYouScreen(val submissionType: SrsSubmissionType) : SrsSymptomsCalendarNavigation()

data class TruncatedSubmission(val numberOfDays: String?) : SrsSymptomsCalendarNavigation()
data class Error(val cause: Exception) : SrsSymptomsCalendarNavigation()

object ShowSubmissionWarning : SrsSymptomsCalendarNavigation()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import dagger.assisted.AssistedInject
import de.rki.coronawarnapp.bugreporting.reportProblem
import de.rki.coronawarnapp.presencetracing.checkins.CheckInRepository
import de.rki.coronawarnapp.presencetracing.checkins.common.completedCheckIns
import de.rki.coronawarnapp.srs.core.error.SrsSubmissionTruncatedException
import de.rki.coronawarnapp.srs.core.model.SrsSubmissionType
import de.rki.coronawarnapp.srs.core.repository.SrsSubmissionRepository
import de.rki.coronawarnapp.submission.Symptoms
Expand Down Expand Up @@ -41,6 +42,9 @@ class SrsSymptomsCalendarViewModel @AssistedInject constructor(

fun goHome() = events.postValue(SrsSymptomsCalendarNavigation.GoToHome)

fun onTruncatedDialogClick() =
events.postValue(SrsSymptomsCalendarNavigation.GoToThankYouScreen(submissionType))

fun startSubmission() {
if (symptomStartInternal.value == null) {
IllegalStateException("Can't finish symptom indication without symptomStart value.")
Expand All @@ -66,7 +70,13 @@ class SrsSymptomsCalendarViewModel @AssistedInject constructor(
)
events.postValue(SrsSymptomsCalendarNavigation.GoToThankYouScreen(submissionType))
} catch (e: Exception) {
events.postValue(SrsSymptomsCalendarNavigation.Error(e))
when (e) {
is SrsSubmissionTruncatedException -> events.postValue(
SrsSymptomsCalendarNavigation.TruncatedSubmission(e.message)
)

else -> events.postValue(SrsSymptomsCalendarNavigation.Error(e))
}
} finally {
showLoadingIndicator.postValue(false)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import de.rki.coronawarnapp.R
import de.rki.coronawarnapp.databinding.FragmentSubmissionSymptomIntroBinding
import de.rki.coronawarnapp.srs.ui.dialogs.showCloseDialog
import de.rki.coronawarnapp.srs.ui.dialogs.showSubmissionWarningDialog
import de.rki.coronawarnapp.srs.ui.dialogs.showTruncatedSubmissionDialog
import de.rki.coronawarnapp.submission.Symptoms
import de.rki.coronawarnapp.ui.dialog.displayDialog
import de.rki.coronawarnapp.util.ExternalActionHelper.openUrl
Expand Down Expand Up @@ -83,6 +84,12 @@ class SrsSymptomsIntroductionFragment : Fragment(R.layout.fragment_submission_sy
)
)

is SrsSymptomsIntroductionNavigation.TruncatedSubmission -> {
showTruncatedSubmissionDialog(it.numberOfDays) {
viewModel.onTruncatedDialogClick()
}
}

is SrsSymptomsIntroductionNavigation.Error -> displayDialog {
setError(it.cause)
positiveButton(R.string.nm_faq_label) { openUrl(R.string.srs_faq_url) }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ sealed class SrsSymptomsIntroductionNavigation {
data class GoToThankYouScreen(val submissionType: SrsSubmissionType) : SrsSymptomsIntroductionNavigation()

object ShowSubmissionWarning : SrsSymptomsIntroductionNavigation()

data class TruncatedSubmission(val numberOfDays: String?) : SrsSymptomsIntroductionNavigation()
data class Error(val cause: Exception) : SrsSymptomsIntroductionNavigation()

data class GoToSymptomCalendar(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
import de.rki.coronawarnapp.presencetracing.checkins.CheckInRepository
import de.rki.coronawarnapp.presencetracing.checkins.common.completedCheckIns
import de.rki.coronawarnapp.srs.core.error.SrsSubmissionTruncatedException
import de.rki.coronawarnapp.srs.core.model.SrsSubmissionType
import de.rki.coronawarnapp.srs.core.repository.SrsSubmissionRepository
import de.rki.coronawarnapp.submission.Symptoms
Expand Down Expand Up @@ -77,7 +78,13 @@ class SrsSymptomsIntroductionViewModel @AssistedInject constructor(
)
events.postValue(SrsSymptomsIntroductionNavigation.GoToThankYouScreen(submissionType))
} catch (e: Exception) {
events.postValue(SrsSymptomsIntroductionNavigation.Error(e))
when (e) {
is SrsSubmissionTruncatedException -> events.postValue(
SrsSymptomsIntroductionNavigation.TruncatedSubmission(e.message)
)

else -> events.postValue(SrsSymptomsIntroductionNavigation.Error(e))
}
} finally {
showLoadingIndicator.postValue(false)
}
Expand All @@ -96,6 +103,9 @@ class SrsSymptomsIntroductionViewModel @AssistedInject constructor(

fun goHome() = events.postValue(SrsSymptomsIntroductionNavigation.GoToHome)

fun onTruncatedDialogClick() =
events.postValue(SrsSymptomsIntroductionNavigation.GoToThankYouScreen(submissionType))

private fun resetPreviousSubmissionConsents() = launch {
try {
Timber.d("Trying to reset submission consents")
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?><resources>
<?xml version="1.0" encoding="UTF-8"?><resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">

<!-- Home screen register test card -->
<!-- XHED: Register test card title -->
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,15 @@
<string name="srs_submission_warning_dialog_positive_button">Andere Warnen</string>
<!-- XBUT: Submission warning negative button -->
<string name="srs_submission_warning_dialog_negative_button">Abbrechen</string>

<!-- Srs Submission Truncated Warning Dialog -->
<!-- XHED: Submission truncated warning dialog title -->
<string name="srs_submission_truncated_warning_dialog_title">Hinweis</string>
<!-- XTXT: Submission truncated warning message -->
<string name="srs_submission_truncated_warning_dialog_message">Aufgrund des aktuell erhöhten Aufkommens von Warnungen über die App wurden nur Kontakte der letzen %s Tage gewarnt.</string>
<!-- XBUT: Submission truncated warning ok button -->
<string name="srs_submission_truncated_warning_dialog_button">Ok</string>

<!-- Srs Errors-->
<!-- XTXT: SRS error title -->
<string name="srs_error_title">Andere warnen nicht möglich</string>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?><resources>
<?xml version="1.0" encoding="UTF-8"?><resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">

<!-- Home screen register test card -->
<!-- XHED: Register test card title -->
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?><resources>
<?xml version="1.0" encoding="UTF-8"?><resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">

<!-- Home screen register test card -->
<!-- XHED: Register test card title -->
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?><resources>
<?xml version="1.0" encoding="UTF-8"?><resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">

<!-- Home screen register test card -->
<!-- XHED: Register test card title -->
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?><resources>
<?xml version="1.0" encoding="UTF-8"?><resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">

<!-- Home screen register test card -->
<!-- XHED: Register test card title -->
Expand Down
11 changes: 10 additions & 1 deletion Corona-Warn-App/src/main/res/values/srs_submission_strings.xml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?><resources>
<?xml version="1.0" encoding="UTF-8"?><resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">

<!-- Home screen register test card -->
<!-- XHED: Register test card title -->
Expand Down Expand Up @@ -94,6 +94,15 @@
<string name="srs_submission_warning_dialog_positive_button">"Warn Others"</string>
<!-- XBUT: Submission warning negative button -->
<string name="srs_submission_warning_dialog_negative_button">"Cancel"</string>

<!-- Srs Submission Truncated Warning Dialog -->
<!-- XHED: Submission truncated warning dialog title -->
<string name="srs_submission_truncated_warning_dialog_title">Hinweis</string>
<!-- XTXT: Submission truncated warning message -->
<string name="srs_submission_truncated_warning_dialog_message">Aufgrund des aktuell erhöhten Aufkommens von Warnungen über die App wurden nur Kontakte der letzen %s Tage gewarnt.</string>
<!-- XBUT: Submission truncated warning ok button -->
<string name="srs_submission_truncated_warning_dialog_button">Ok</string>

<!-- Srs Errors-->
<!-- XTXT: SRS error title -->
<string name="srs_error_title">"You Cannot Warn Others"</string>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,7 @@ internal class SrsSubmissionServerTest : BaseTest() {
listOf(
400 to SrsSubmissionException.ErrorCode.SRS_SUB_400,
403 to SrsSubmissionException.ErrorCode.SRS_SUB_403,
429 to SrsSubmissionException.ErrorCode.SRS_SUB_429,
404 to SrsSubmissionException.ErrorCode.SRS_SUB_CLIENT_ERROR,
505 to SrsSubmissionException.ErrorCode.SRS_SUB_SERVER_ERROR,
).forEach { (responseErrorCode, errorCode) ->
Expand Down