diff --git a/Corona-Warn-App/build.gradle b/Corona-Warn-App/build.gradle index 2905048422caf64055c2ae6e9852cdd7eb6f8533..ea075f218b9c71caa3f7efb719a3bb8ea9c8d574 100644 --- a/Corona-Warn-App/build.gradle +++ b/Corona-Warn-App/build.gradle @@ -127,7 +127,7 @@ android { applicationIdSuffix '.test' ext { - envTypeDefault = [debug: "INT", release: "WRU-XD"] + envTypeDefault = [debug: "INT", release: "WRU"] } if (signingPropFile.canRead()) { diff --git a/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/onboarding/OnboardingTracingFragmentTest.kt b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/onboarding/OnboardingTracingFragmentTest.kt index a0362781c44750b755b88ca6f51228a89fd8d598..61922e75255197b0c1ac393c21c0d9fc44b55765 100644 --- a/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/onboarding/OnboardingTracingFragmentTest.kt +++ b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/onboarding/OnboardingTracingFragmentTest.kt @@ -3,6 +3,7 @@ package de.rki.coronawarnapp.ui.onboarding import androidx.test.ext.junit.runners.AndroidJUnit4 import dagger.Module import dagger.android.ContributesAndroidInjector +import de.rki.coronawarnapp.nearby.ENFClient import de.rki.coronawarnapp.nearby.TracingPermissionHelper import de.rki.coronawarnapp.storage.TracingSettings import de.rki.coronawarnapp.storage.interoperability.InteroperabilityRepository @@ -33,6 +34,7 @@ class OnboardingTracingFragmentTest : BaseUITest() { @MockK lateinit var interopRepo: InteroperabilityRepository @MockK lateinit var factory: TracingPermissionHelper.Factory @MockK lateinit var tracingSettings: TracingSettings + @MockK lateinit var enfClient: ENFClient @Rule @JvmField @@ -50,7 +52,8 @@ class OnboardingTracingFragmentTest : BaseUITest() { interoperabilityRepository = interopRepo, tracingPermissionHelperFactory = factory, dispatcherProvider = TestDispatcherProvider(), - tracingSettings = tracingSettings + tracingSettings = tracingSettings, + enfClient = enfClient, ) ) diff --git a/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/submission/SubmissionTestResultNoConsentGivenFragmentTest.kt b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/submission/SubmissionTestResultNoConsentGivenFragmentTest.kt index 8ccf0d97fc63042291fae1d597143cff30ddea52..a1c88a8f2c3c0ff446a66b7ddf02a3010b69630f 100644 --- a/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/submission/SubmissionTestResultNoConsentGivenFragmentTest.kt +++ b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/submission/SubmissionTestResultNoConsentGivenFragmentTest.kt @@ -27,6 +27,7 @@ import org.junit.runner.RunWith import testhelpers.BaseUITest import testhelpers.Screenshot import testhelpers.SystemUIDemoModeRule +import testhelpers.TestDispatcherProvider import testhelpers.captureScreenshot import tools.fastlane.screengrab.locale.LocaleTestRule @@ -55,6 +56,7 @@ class SubmissionTestResultNoConsentGivenFragmentTest : BaseUITest() { viewModel = spyk( SubmissionTestResultNoConsentViewModel( + TestDispatcherProvider(), submissionRepository, testResultAvailableNotificationService, analyticsKeySubmissionCollector, diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/http/CwaWebException.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/http/CwaWebException.kt index 7f8d7b4ae755482bc1d80ca7a1d4ce85bd243010..2f69c10266f4ca45208b7ff4062bf674fd5887ee 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/http/CwaWebException.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/http/CwaWebException.kt @@ -1,7 +1,11 @@ package de.rki.coronawarnapp.exception.http +import android.content.Context +import de.rki.coronawarnapp.R import de.rki.coronawarnapp.exception.reporting.ErrorCodes import de.rki.coronawarnapp.exception.reporting.ReportedIOException +import de.rki.coronawarnapp.util.HasHumanReadableError +import de.rki.coronawarnapp.util.HumanReadableError open class CwaWebException( val statusCode: Int, @@ -21,12 +25,19 @@ open class CwaServerError( statusCode = statusCode, message = message, cause = cause -) { +), + HasHumanReadableError { init { if (statusCode !in 500..599) { throw IllegalArgumentException("Invalid HTTP server error code $statusCode (!= 5xx)") } } + + override fun toHumanReadableError(context: Context): HumanReadableError { + return HumanReadableError( + description = context.getString(R.string.submission_error_dialog_web_generic_network_error_body) + ) + } } open class CwaClientError( diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/nearby/InternalExposureNotificationClient.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/nearby/InternalExposureNotificationClient.kt deleted file mode 100644 index 7229fda0a8ad3809edf317bfa0eaaf3f401daf06..0000000000000000000000000000000000000000 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/nearby/InternalExposureNotificationClient.kt +++ /dev/null @@ -1,43 +0,0 @@ -package de.rki.coronawarnapp.nearby - -import de.rki.coronawarnapp.util.di.AppInjector -import kotlinx.coroutines.flow.first -import timber.log.Timber -import kotlin.coroutines.resume -import kotlin.coroutines.resumeWithException -import kotlin.coroutines.suspendCoroutine - -/** - * Wrapper class for the Exposure Notification Client in the com.google.android.gms.nearby.Nearby - * implementing all Exposure Notification related APIs - */ -object InternalExposureNotificationClient { - - // reference to the client from the Google framework with the given application context - private val enfClient by lazy { - AppInjector.component.enfClient - } - - /** - * Disables broadcasting and scanning. You can call this directly, and it is also called when - * users uninstall the app. When it’s called as part of the uninstallation process, the - * database and keys are deleted from the device. - * - * @return - */ - suspend fun asyncStop() = suspendCoroutine<Unit> { cont -> - enfClient.setTracing( - false, - onSuccess = { cont.resume(Unit) }, - onError = { cont.resumeWithException(it) }, - onPermissionRequired = { Timber.e("Permission was required to disable tracing?") } - ) - } - - /** - * Indicates if exposure notifications are running - * - * @return - */ - suspend fun asyncIsEnabled(): Boolean = enfClient.isTracingEnabled.first() -} diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/nearby/modules/tracing/TracingStatus.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/nearby/modules/tracing/TracingStatus.kt index d98223148d89af4d909c2a6723c820a7d7713e54..47ae9c4df79425937e50c7890b83a2ad7c8d65a1 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/nearby/modules/tracing/TracingStatus.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/nearby/modules/tracing/TracingStatus.kt @@ -2,6 +2,11 @@ package de.rki.coronawarnapp.nearby.modules.tracing import com.google.android.gms.common.api.Status import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.first +import timber.log.Timber +import kotlin.coroutines.resume +import kotlin.coroutines.resumeWithException +import kotlin.coroutines.suspendCoroutine interface TracingStatus { val isTracingEnabled: Flow<Boolean> @@ -13,3 +18,22 @@ interface TracingStatus { onPermissionRequired: (Status) -> Unit ) } + +/** + * Returns true if tracing was disabled. + */ +suspend fun TracingStatus.disableTracingIfEnabled(): Boolean { + if (!isTracingEnabled.first()) { + Timber.d("Tracing was already disabled.") + return false + } + + return suspendCoroutine { cont -> + setTracing( + enable = false, + onSuccess = { cont.resume(true) }, + onError = { cont.resumeWithException(it) }, + onPermissionRequired = { Timber.e("Permission was required to disable tracing?") } + ) + } +} diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/TracingRepository.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/TracingRepository.kt index 7a80372f1eb61ddb8dc1bd4c175bf4efae1d9c53..7ca4411fa7d03804e156cae6a64486abb7f9075c 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/TracingRepository.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/TracingRepository.kt @@ -3,7 +3,6 @@ package de.rki.coronawarnapp.storage import android.annotation.SuppressLint import de.rki.coronawarnapp.diagnosiskeys.download.DownloadDiagnosisKeysTask import de.rki.coronawarnapp.nearby.ENFClient -import de.rki.coronawarnapp.nearby.InternalExposureNotificationClient import de.rki.coronawarnapp.nearby.modules.detectiontracker.ExposureDetectionTracker import de.rki.coronawarnapp.nearby.modules.detectiontracker.lastSubmission import de.rki.coronawarnapp.presencetracing.risk.execution.PresenceTracingRiskWorkScheduler @@ -34,8 +33,6 @@ import javax.inject.Singleton /** * The Tracing Repository refreshes and triggers all tracing relevant data. Some functions get their * data directly from the Exposure Notification, others consume the shared preferences. - * - * @see InternalExposureNotificationClient */ @Singleton class TracingRepository @Inject constructor( diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/tracing/ui/settings/SettingsTracingFragment.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/tracing/ui/settings/SettingsTracingFragment.kt index e6c4f67d8b7e00f2d1c690da682d74cf9ec0b6fa..d4fabbb857abca5d5c780a85bc4228a8c9115449 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/tracing/ui/settings/SettingsTracingFragment.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/tracing/ui/settings/SettingsTracingFragment.kt @@ -8,7 +8,6 @@ import androidx.fragment.app.Fragment import de.rki.coronawarnapp.R import de.rki.coronawarnapp.bugreporting.ui.toErrorDialogBuilder import de.rki.coronawarnapp.databinding.FragmentSettingsTracingBinding -import de.rki.coronawarnapp.nearby.InternalExposureNotificationClient import de.rki.coronawarnapp.tracing.ui.TracingConsentDialog import de.rki.coronawarnapp.tracing.ui.settings.SettingsTracingFragmentViewModel.Event import de.rki.coronawarnapp.util.DialogHelper @@ -24,8 +23,6 @@ import javax.inject.Inject /** * The user can start/stop tracing and is informed about tracing. - * - * @see InternalExposureNotificationClient */ class SettingsTracingFragment : Fragment(R.layout.fragment_settings_tracing), AutoInject { diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/tracing/ui/settings/SettingsTracingFragmentViewModel.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/tracing/ui/settings/SettingsTracingFragmentViewModel.kt index 3ec86a0a71c21b36e1b2abb6f63d27f99f56b2ef..bb83ecf881dc231a987b01d19f75972f91d6f351 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/tracing/ui/settings/SettingsTracingFragmentViewModel.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/tracing/ui/settings/SettingsTracingFragmentViewModel.kt @@ -11,8 +11,9 @@ import dagger.assisted.AssistedInject import de.rki.coronawarnapp.exception.ExceptionCategory import de.rki.coronawarnapp.exception.reporting.report import de.rki.coronawarnapp.installTime.InstallTimeProvider -import de.rki.coronawarnapp.nearby.InternalExposureNotificationClient +import de.rki.coronawarnapp.nearby.ENFClient import de.rki.coronawarnapp.nearby.TracingPermissionHelper +import de.rki.coronawarnapp.nearby.modules.tracing.disableTracingIfEnabled import de.rki.coronawarnapp.risk.execution.ExposureWindowRiskWorkScheduler import de.rki.coronawarnapp.tracing.GeneralTracingStatus import de.rki.coronawarnapp.tracing.ui.details.items.periodlogged.PeriodLoggedBox @@ -35,7 +36,8 @@ class SettingsTracingFragmentViewModel @AssistedInject constructor( installTimeProvider: InstallTimeProvider, private val backgroundStatus: BackgroundModeStatus, tracingPermissionHelperFactory: TracingPermissionHelper.Factory, - private val exposureWindowRiskWorkScheduler: ExposureWindowRiskWorkScheduler + private val exposureWindowRiskWorkScheduler: ExposureWindowRiskWorkScheduler, + private val enfClient: ENFClient, ) : CWAViewModel(dispatcherProvider = dispatcherProvider) { val loggingPeriod: LiveData<PeriodLoggedBox.Item> = @@ -120,8 +122,7 @@ class SettingsTracingFragmentViewModel @AssistedInject constructor( isTracingSwitchChecked.postValue(false) launch { try { - if (InternalExposureNotificationClient.asyncIsEnabled()) { - InternalExposureNotificationClient.asyncStop() + if (enfClient.disableTracingIfEnabled()) { exposureWindowRiskWorkScheduler.setPeriodicRiskCalculation(enabled = false) } } catch (exception: Exception) { diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/onboarding/OnboardingTracingFragmentViewModel.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/onboarding/OnboardingTracingFragmentViewModel.kt index 94f0dadf744b212591c86373f78601061d79f012..d629c1267c72337575951e99d478175a7e4ef6ea 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/onboarding/OnboardingTracingFragmentViewModel.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/onboarding/OnboardingTracingFragmentViewModel.kt @@ -7,8 +7,9 @@ import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject import de.rki.coronawarnapp.exception.ExceptionCategory import de.rki.coronawarnapp.exception.reporting.report -import de.rki.coronawarnapp.nearby.InternalExposureNotificationClient +import de.rki.coronawarnapp.nearby.ENFClient import de.rki.coronawarnapp.nearby.TracingPermissionHelper +import de.rki.coronawarnapp.nearby.modules.tracing.disableTracingIfEnabled import de.rki.coronawarnapp.storage.TracingSettings import de.rki.coronawarnapp.storage.interoperability.InteroperabilityRepository import de.rki.coronawarnapp.util.coroutine.DispatcherProvider @@ -22,6 +23,7 @@ class OnboardingTracingFragmentViewModel @AssistedInject constructor( tracingPermissionHelperFactory: TracingPermissionHelper.Factory, dispatcherProvider: DispatcherProvider, private val tracingSettings: TracingSettings, + private val enfClient: ENFClient, ) : CWAViewModel(dispatcherProvider = dispatcherProvider) { val countryList = interoperabilityRepository.countryList @@ -63,8 +65,7 @@ class OnboardingTracingFragmentViewModel @AssistedInject constructor( fun resetTracing() { launch { try { - if (InternalExposureNotificationClient.asyncIsEnabled()) { - InternalExposureNotificationClient.asyncStop() + if (enfClient.disableTracingIfEnabled()) { tracingSettings.isConsentGiven = false } } catch (exception: Exception) { diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/settings/SettingsResetViewModel.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/settings/SettingsResetViewModel.kt index 9260aefa17d5e884a7986acd9ee4ea6a2b77bd13..0c3b5dbb542d11d19dd1ffcffafc4daefb6cb265 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/settings/SettingsResetViewModel.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/settings/SettingsResetViewModel.kt @@ -5,7 +5,8 @@ import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject import de.rki.coronawarnapp.exception.ExceptionCategory import de.rki.coronawarnapp.exception.reporting.report -import de.rki.coronawarnapp.nearby.InternalExposureNotificationClient +import de.rki.coronawarnapp.nearby.ENFClient +import de.rki.coronawarnapp.nearby.modules.tracing.disableTracingIfEnabled import de.rki.coronawarnapp.util.DataReset import de.rki.coronawarnapp.util.coroutine.DispatcherProvider import de.rki.coronawarnapp.util.shortcuts.AppShortcutsHelper @@ -17,6 +18,7 @@ class SettingsResetViewModel @AssistedInject constructor( dispatcherProvider: DispatcherProvider, private val dataReset: DataReset, private val shortcutsHelper: AppShortcutsHelper, + private val enfClient: ENFClient, ) : CWAViewModel(dispatcherProvider = dispatcherProvider) { val clickEvent: SingleLiveEvent<SettingsEvents> = SingleLiveEvent() @@ -32,18 +34,9 @@ class SettingsResetViewModel @AssistedInject constructor( fun deleteAllAppContent() { launch { try { - // TODO Remove static access - val isTracingEnabled = InternalExposureNotificationClient.asyncIsEnabled() - // only stop tracing if it is currently enabled - if (isTracingEnabled) { - InternalExposureNotificationClient.asyncStop() - } + enfClient.disableTracingIfEnabled() } catch (apiException: ApiException) { - apiException.report( - ExceptionCategory.EXPOSURENOTIFICATION, - TAG, - null - ) + apiException.report(ExceptionCategory.EXPOSURENOTIFICATION, TAG, null) } dataReset.clearAllLocalData() diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/testresult/positive/SubmissionTestResultNoConsentViewModel.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/testresult/positive/SubmissionTestResultNoConsentViewModel.kt index 3c21410fa9787dbdac4c8bd81cf3dbf53e9b582c..1b69fd6861f8e2f8e7e8221e9c0519b519cd88f7 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/testresult/positive/SubmissionTestResultNoConsentViewModel.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/submission/testresult/positive/SubmissionTestResultNoConsentViewModel.kt @@ -12,6 +12,7 @@ import de.rki.coronawarnapp.datadonation.analytics.modules.keysubmission.Analyti import de.rki.coronawarnapp.datadonation.analytics.modules.keysubmission.Screen import de.rki.coronawarnapp.submission.SubmissionRepository import de.rki.coronawarnapp.ui.submission.testresult.TestResultUIState +import de.rki.coronawarnapp.util.coroutine.DispatcherProvider import de.rki.coronawarnapp.util.viewmodel.CWAViewModel import de.rki.coronawarnapp.util.viewmodel.CWAViewModelFactory import kotlinx.coroutines.Dispatchers @@ -20,11 +21,12 @@ import kotlinx.coroutines.flow.map import timber.log.Timber class SubmissionTestResultNoConsentViewModel @AssistedInject constructor( + dispatcherProvider: DispatcherProvider, private val submissionRepository: SubmissionRepository, private val testResultAvailableNotificationService: PCRTestResultAvailableNotificationService, private val analyticsKeySubmissionCollector: AnalyticsKeySubmissionCollector, @Assisted private val testType: CoronaTest.Type -) : CWAViewModel() { +) : CWAViewModel(dispatcherProvider = dispatcherProvider) { init { Timber.v("init() coronaTestType=%s", testType) } diff --git a/Corona-Warn-App/src/main/res/drawable/ic_country_be.xml b/Corona-Warn-App/src/main/res/drawable/ic_country_be.xml index 58e34fc7783cfd92b9efc76e3fb9ca75c1f9c4e6..acb35d687f163e1d1301c34d321438f59332da55 100644 --- a/Corona-Warn-App/src/main/res/drawable/ic_country_be.xml +++ b/Corona-Warn-App/src/main/res/drawable/ic_country_be.xml @@ -21,7 +21,7 @@ <path android:pathData="M-0,0l8.1818,0l0,16l-8.1818,0z" android:strokeWidth="1" - android:fillColor="#424242" + android:fillColor="#000000" android:fillType="nonZero" android:strokeColor="#00000000"/> </group> diff --git a/Corona-Warn-App/src/main/res/drawable/ic_country_de.xml b/Corona-Warn-App/src/main/res/drawable/ic_country_de.xml index d47f4299d446e9529719e292eaf6730d2f839b41..ae835aea6739d229f5aa384ea1674b6621021398 100644 --- a/Corona-Warn-App/src/main/res/drawable/ic_country_de.xml +++ b/Corona-Warn-App/src/main/res/drawable/ic_country_de.xml @@ -21,7 +21,7 @@ <path android:pathData="M0,-0l24,0l0,5.3333l-24,0z" android:strokeWidth="1" - android:fillColor="#424242" + android:fillColor="#000000" android:fillType="nonZero" android:strokeColor="#00000000"/> </group> diff --git a/Corona-Warn-App/src/main/res/layout/fragment_ppa_more_info.xml b/Corona-Warn-App/src/main/res/layout/fragment_ppa_more_info.xml index 02379b9dd847711461895979192a3a02f555ee2b..8cad19e8c0f2c6c020a191bec39787912b5af8b4 100644 --- a/Corona-Warn-App/src/main/res/layout/fragment_ppa_more_info.xml +++ b/Corona-Warn-App/src/main/res/layout/fragment_ppa_more_info.xml @@ -324,6 +324,7 @@ <TextView android:id="@+id/rki_data_point_5_text" style="@style/subtitle" + android:layout_weight="1" android:layout_marginStart="13dp" android:focusable="true" android:text="@string/onboarding_ppa_more_info_rki_data_point_5_text" /> @@ -673,4 +674,4 @@ </ScrollView> </LinearLayout> -</layout> \ No newline at end of file +</layout> diff --git a/Corona-Warn-App/src/main/res/values-de/strings.xml b/Corona-Warn-App/src/main/res/values-de/strings.xml index 82866751eb6e62ea7b1ae2e9215bb74b010d2d9a..fe4d6ca4dfd5b4d399688b0f7cdc2bf79ac444c4 100644 --- a/Corona-Warn-App/src/main/res/values-de/strings.xml +++ b/Corona-Warn-App/src/main/res/values-de/strings.xml @@ -1994,7 +1994,7 @@ <!-- XHED: Trace location check-ins consent screen title --> <string name="trace_location_attendee_consent_title">Check-ins für diese Orte teilen?</string> <!-- XTXT: Trace location check-ins consent screen header description --> - <string name="trace_location_attendee_consent_header_description">Teilen Sie Ihre Check-ins, um andere zu warnen, die in Ihrer Nähe waren. Ihre Identität bleibt geheim.</string> + <string name="trace_location_attendee_consent_header_description">Teilen Sie Ihre Check-ins, um andere zu warnen, die mit Ihnen eingecheckt waren. Ihre Identität bleibt geheim.</string> <!-- XBUT: Trace location check-ins consent screen header button --> <string name="trace_location_attendee_consent_header_button">Alle auswählen</string> <!-- XBUT: Trace location check-ins consent screen continue button --> @@ -2004,7 +2004,7 @@ <!-- XHED: Trace location check-ins consent screen dialog title --> <string name="trace_location_attendee_consent_dialog_title">Sind Sie sicher, dass Sie Ihre Check-ins nicht teilen wollen?</string> <!-- XTXT: Trace location check-ins consent screen dialog message --> - <string name="trace_location_attendee_consent_dialog_message">Dadurch werden andere, die in Ihrer Nähe waren, nicht gewarnt.</string> + <string name="trace_location_attendee_consent_dialog_message">Dadurch werden andere nicht gewarnt, die mit Ihnen eingecheckt waren.</string> <!-- XBUT: Trace location check-ins consent screen dialog positive button --> <string name="trace_location_attendee_consent_dialog_positive_button">Teilen</string> <!-- XBUT: Trace location check-ins consent screen dialog negative button --> diff --git a/Corona-Warn-App/src/main/res/values-en/event_registration_strings.xml b/Corona-Warn-App/src/main/res/values-en/event_registration_strings.xml index 5c5c18dfeed7053489d00d31ed5824149ff60271..d9f0dc83a800398cf87792021e69dde6d84cd552 100644 --- a/Corona-Warn-App/src/main/res/values-en/event_registration_strings.xml +++ b/Corona-Warn-App/src/main/res/values-en/event_registration_strings.xml @@ -4,7 +4,7 @@ ###################################### --> <!-- XHED: My check-ins: screen title --> - <string name="trace_location_checkins_title">"My Check-Ins"</string> + <string name="trace_location_checkins_title">"My Check-ins"</string> <!-- XHED: My check-ins: Title for list explanation when there are no check-ins --> <string name="trace_location_checkins_empty_label">"No entries yet"</string> <!-- XTXT: My check-ins: Description for list explanation when there are no check-ins --> diff --git a/Corona-Warn-App/src/main/res/values-en/strings.xml b/Corona-Warn-App/src/main/res/values-en/strings.xml index 4bbb1ce9fdbbb819cec2cc3d6a885618facb370d..0a6390eab222b00f94e6b5df38551cdf9b3793d4 100644 --- a/Corona-Warn-App/src/main/res/values-en/strings.xml +++ b/Corona-Warn-App/src/main/res/values-en/strings.xml @@ -1038,7 +1038,7 @@ <!-- YTXT: Body for consent main section second point --> <string name="submission_consent_main_second_point">"Your identity will remain secret. Other users will not find out who has shared a test result."</string> <!-- YTXT: Body for consent main section third point --> - <string name="submission_consent_main_third_point">"Under “My Check-Insâ€, you can see the events and places whose checked-in guests will be warned. You can remove individual check-ins from the list to exclude them from the warning process."</string> + <string name="submission_consent_main_third_point">"Under “My Check-insâ€, you can see the events and places whose checked-in guests will be warned. You can remove individual check-ins from the list to exclude them from the warning process."</string> <!-- YTXT: Body for consent main section fourth point --> <string name="submission_consent_main_fourth_point">"You must be at least 16 years old to grant your consent."</string> <!-- YTXT: Body for consent main section final id consent --> @@ -1053,7 +1053,7 @@ <!-- YTXT: Body for no consent section third point --> <string name="submission_no_consent_third_point">"Your identity will remain secret. Other users will not find out who has shared a test result."</string> <!-- YTXT: Body for no consent section fourth point --> - <string name="submission_no_consent_fourth_point">"Under “My Check-Insâ€, you can see the events and places whose checked-in guests will be warned. You can remove individual check-ins from the list to exclude them from the warning process."</string> + <string name="submission_no_consent_fourth_point">"Under “My Check-insâ€, you can see the events and places whose checked-in guests will be warned. You can remove individual check-ins from the list to exclude them from the warning process."</string> <!-- YTXT: Body for no consent section fifth point --> <string name="submission_no_consent_fifth_point">"You must be at least 16 years old to grant your consent."</string> @@ -1815,7 +1815,7 @@ <!-- XHED: Title for BottomNav diary screen title --> <string name="bottom_nav_diary_title">"Journal"</string> <!-- XHED: Title for BottomNav check-in screen title --> - <string name="bottom_nav_check_ins_title">"Check In"</string> + <string name="bottom_nav_check_ins_title">"Check-in"</string> <!-- #################################### Data Donation & Survey @@ -1954,7 +1954,7 @@ Trace Location ###################################### --> <!-- XHED: Title for the trace location onboarding --> - <string name="trace_location_onboarding_title">"Check In"</string> + <string name="trace_location_onboarding_title">"Check-in"</string> <!-- XTXT: subtitle for the trace location onboarding --> <string name="trace_location_onboarding_title2">"Interrupt chains of infection quickly and reliably"</string> <!-- YMSG: Onboarding trace location intro section --> @@ -1980,7 +1980,7 @@ <!-- XHED: Trace location poster title --> <string name="trace_location_organiser_poster_title">"Print Version"</string> <!-- XHED: Trace location check-ins consent screen title --> - <string name="trace_location_attendee_consent_title">"Share Location Check-Ins?"</string> + <string name="trace_location_attendee_consent_title">"Share location check-ins?"</string> <!-- XTXT: Trace location check-ins consent screen header description --> <string name="trace_location_attendee_consent_header_description">"Warn others who checked in near you. Your personal data will not be shared."</string> <!-- XBUT: Trace location check-ins consent screen header button --> diff --git a/Corona-Warn-App/src/main/res/values/event_registration_strings.xml b/Corona-Warn-App/src/main/res/values/event_registration_strings.xml index 5c5c18dfeed7053489d00d31ed5824149ff60271..d9f0dc83a800398cf87792021e69dde6d84cd552 100644 --- a/Corona-Warn-App/src/main/res/values/event_registration_strings.xml +++ b/Corona-Warn-App/src/main/res/values/event_registration_strings.xml @@ -4,7 +4,7 @@ ###################################### --> <!-- XHED: My check-ins: screen title --> - <string name="trace_location_checkins_title">"My Check-Ins"</string> + <string name="trace_location_checkins_title">"My Check-ins"</string> <!-- XHED: My check-ins: Title for list explanation when there are no check-ins --> <string name="trace_location_checkins_empty_label">"No entries yet"</string> <!-- XTXT: My check-ins: Description for list explanation when there are no check-ins --> diff --git a/Corona-Warn-App/src/main/res/values/strings.xml b/Corona-Warn-App/src/main/res/values/strings.xml index 8eddb23913eae2c0abceb2a68e612f23b1cea707..d6960f218530ae063b89c99eaabce5005c74b542 100644 --- a/Corona-Warn-App/src/main/res/values/strings.xml +++ b/Corona-Warn-App/src/main/res/values/strings.xml @@ -1039,7 +1039,7 @@ <!-- YTXT: Body for consent main section second point --> <string name="submission_consent_main_second_point">"Your identity will remain secret. Other users will not find out who has shared a test result."</string> <!-- YTXT: Body for consent main section third point --> - <string name="submission_consent_main_third_point">"Under “My Check-Insâ€, you can see the events and places whose checked-in guests will be warned. You can remove individual check-ins from the list to exclude them from the warning process."</string> + <string name="submission_consent_main_third_point">"Under “My Check-insâ€, you can see the events and places whose checked-in guests will be warned. You can remove individual check-ins from the list to exclude them from the warning process."</string> <!-- YTXT: Body for consent main section fourth point --> <string name="submission_consent_main_fourth_point">"You must be at least 16 years old to grant your consent."</string> <!-- YTXT: Body for consent main section final id consent --> @@ -1054,7 +1054,7 @@ <!-- YTXT: Body for no consent section third point --> <string name="submission_no_consent_third_point">"Your identity will remain secret. Other users will not find out who has shared a test result."</string> <!-- YTXT: Body for no consent section fourth point --> - <string name="submission_no_consent_fourth_point">"Under “My Check-Insâ€, you can see the events and places whose checked-in guests will be warned. You can remove individual check-ins from the list to exclude them from the warning process."</string> + <string name="submission_no_consent_fourth_point">"Under “My Check-insâ€, you can see the events and places whose checked-in guests will be warned. You can remove individual check-ins from the list to exclude them from the warning process."</string> <!-- YTXT: Body for no consent section fifth point --> <string name="submission_no_consent_fifth_point">"You must be at least 16 years old to grant your consent."</string> diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/environment/BuildConfigWrapTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/environment/BuildConfigWrapTest.kt index cded06c92cf5f0f3783bcc1bb2c3f4684d72e03e..9d9acada74110fd369e72517698533533862a493 100644 --- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/environment/BuildConfigWrapTest.kt +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/environment/BuildConfigWrapTest.kt @@ -1,13 +1,24 @@ package de.rki.coronawarnapp.environment -import io.kotest.matchers.collections.shouldBeIn +import de.rki.coronawarnapp.BuildConfig +import io.kotest.matchers.shouldBe import org.junit.jupiter.api.Test import testhelpers.BaseTest class BuildConfigWrapTest : BaseTest() { @Test - fun `default environment type should be DEV`() { - BuildConfigWrap.ENVIRONMENT_TYPE_DEFAULT shouldBeIn listOf("DEV", "INT", "WRU-XD", "PROD") + fun `default environment type `() { + if (BuildConfig.FLAVOR == "deviceForTesters" && BuildConfig.BUILD_TYPE == "debug") { + BuildConfigWrap.ENVIRONMENT_TYPE_DEFAULT shouldBe "INT" + } else if (BuildConfig.FLAVOR == "deviceForTesters" && BuildConfig.BUILD_TYPE == "release") { + BuildConfigWrap.ENVIRONMENT_TYPE_DEFAULT shouldBe "WRU" + } else if (BuildConfig.FLAVOR == "device" && BuildConfig.BUILD_TYPE == "debug") { + BuildConfigWrap.ENVIRONMENT_TYPE_DEFAULT shouldBe "INT" + } else if (BuildConfig.FLAVOR == "device" && BuildConfig.BUILD_TYPE == "release") { + BuildConfigWrap.ENVIRONMENT_TYPE_DEFAULT shouldBe "PROD" + } else { + throw IllegalStateException("Unknown flavor/build combination.") + } } } diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/nearby/modules/tracing/DefaultTracingStatusTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/nearby/modules/tracing/DefaultTracingStatusTest.kt index b8d6def71692b477eaceed3955e68d459d4a02e1..4c4b84d92987e7922f6f1a2cab308433012d5895 100644 --- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/nearby/modules/tracing/DefaultTracingStatusTest.kt +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/nearby/modules/tracing/DefaultTracingStatusTest.kt @@ -9,12 +9,15 @@ import io.mockk.Called import io.mockk.MockKAnnotations import io.mockk.every import io.mockk.impl.annotations.MockK +import io.mockk.mockk import io.mockk.verify import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.delay +import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.take import kotlinx.coroutines.flow.toList +import kotlinx.coroutines.runBlocking import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test import testhelpers.BaseTest @@ -129,4 +132,32 @@ class DefaultTracingStatusTest : BaseTest() { thrownError shouldBe ourError } + + @Test + fun `extension for disabling tracing if enabled`() { + val enabledFlow = MutableStateFlow(false) + val tracingStatus = mockk<TracingStatus>().apply { + every { isTracingEnabled } returns enabledFlow + every { setTracing(any(), any(), any(), any()) } answers { + val enabled = arg<Boolean>(0) + val onSuccess = arg<(Boolean) -> Unit>(1) + val onError = arg<(Throwable) -> Unit>(2) + val onPermissionRequired = arg<(Status) -> Unit>(3) + + onSuccess(false) + } + } + + runBlocking { + tracingStatus.disableTracingIfEnabled() + verify(exactly = 0) { tracingStatus.setTracing(any(), any(), any(), any()) } + } + + enabledFlow.value = true + + runBlocking { + tracingStatus.disableTracingIfEnabled() shouldBe true + verify(exactly = 1) { tracingStatus.setTracing(any(), any(), any(), any()) } + } + } } diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/ui/presencetracing/checkin/ConfirmCheckInViewModelTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/ui/presencetracing/checkin/ConfirmCheckInViewModelTest.kt deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/ui/submission/testresult/positive/SubmissionTestResultNoConsentViewModelTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/ui/submission/testresult/positive/SubmissionTestResultNoConsentViewModelTest.kt index e47dff84d152db22ddc2028f65cc75d6f2e8c8af..3df56fff1a258564a259477c29f40b23ca718cff 100644 --- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/ui/submission/testresult/positive/SubmissionTestResultNoConsentViewModelTest.kt +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/ui/submission/testresult/positive/SubmissionTestResultNoConsentViewModelTest.kt @@ -13,6 +13,7 @@ import io.mockk.verify import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test import testhelpers.BaseTest +import testhelpers.TestDispatcherProvider internal class SubmissionTestResultNoConsentViewModelTest : BaseTest() { @@ -26,6 +27,7 @@ internal class SubmissionTestResultNoConsentViewModelTest : BaseTest() { } private fun createInstance(testType: Type) = SubmissionTestResultNoConsentViewModel( + TestDispatcherProvider(), submissionRepository, testResultAvailableNotificationService, analyticsKeySubmissionCollector,